From 090f296d8ddefa6a6d8015ba85763918537c5d71 Mon Sep 17 00:00:00 2001 From: Travis CI User Date: Thu, 12 Mar 2020 21:26:57 +0000 Subject: [PATCH] v1.9.4 --- @interactjs/actions/.npmignore | 7 + @interactjs/actions/LICENSE | 23 + @interactjs/actions/actions.spec.d.ts | 1 + @interactjs/actions/drag.d.ts | 19 + @interactjs/actions/drag.js | 162 + @interactjs/actions/drag.js.map | 61 + @interactjs/actions/drag.min.js | 2 + @interactjs/actions/drag.min.js.map | 65 + @interactjs/actions/drag.spec.d.ts | 1 + @interactjs/actions/gesture.d.ts | 42 + @interactjs/actions/gesture.js | 147 + @interactjs/actions/gesture.js.map | 68 + @interactjs/actions/gesture.min.js | 2 + @interactjs/actions/gesture.min.js.map | 72 + @interactjs/actions/gesture.spec.d.ts | 1 + @interactjs/actions/index.d.ts | 11 + @interactjs/actions/index.js | 17 + @interactjs/actions/index.js.map | 20 + @interactjs/actions/index.min.js | 2 + @interactjs/actions/index.min.js.map | 20 + @interactjs/actions/resize.d.ts | 29 + @interactjs/actions/resize.js | 446 + @interactjs/actions/resize.js.map | 114 + @interactjs/actions/resize.min.js | 2 + @interactjs/actions/resize.min.js.map | 114 + @interactjs/actions/resize.spec.d.ts | 1 + @interactjs/auto-scroll/.npmignore | 7 + @interactjs/auto-scroll/LICENSE | 23 + @interactjs/auto-scroll/index.d.ts | 61 + @interactjs/auto-scroll/index.js | 246 + @interactjs/auto-scroll/index.js.map | 94 + @interactjs/auto-scroll/index.min.js | 2 + @interactjs/auto-scroll/index.min.js.map | 96 + @interactjs/auto-start/.npmignore | 7 + .../auto-start/InteractableMethods.d.ts | 29 + @interactjs/auto-start/InteractableMethods.js | 176 + .../auto-start/InteractableMethods.js.map | 43 + .../auto-start/InteractableMethods.min.js | 2 + .../auto-start/InteractableMethods.min.js.map | 48 + @interactjs/auto-start/LICENSE | 23 + @interactjs/auto-start/autoStart.spec.d.ts | 1 + @interactjs/auto-start/base.d.ts | 49 + @interactjs/auto-start/base.js | 315 + @interactjs/auto-start/base.js.map | 110 + @interactjs/auto-start/base.min.js | 2 + @interactjs/auto-start/base.min.js.map | 110 + @interactjs/auto-start/dragAxis.d.ts | 8 + @interactjs/auto-start/dragAxis.js | 77 + @interactjs/auto-start/dragAxis.js.map | 50 + @interactjs/auto-start/dragAxis.min.js | 2 + @interactjs/auto-start/dragAxis.min.js.map | 50 + @interactjs/auto-start/hold.d.ts | 34 + @interactjs/auto-start/hold.js | 64 + @interactjs/auto-start/hold.js.map | 36 + @interactjs/auto-start/hold.min.js | 2 + @interactjs/auto-start/hold.min.js.map | 37 + @interactjs/auto-start/hold.spec.d.ts | 1 + @interactjs/auto-start/index.d.ts | 9 + @interactjs/auto-start/index.js | 15 + @interactjs/auto-start/index.js.map | 19 + @interactjs/auto-start/index.min.js | 2 + @interactjs/auto-start/index.min.js.map | 19 + @interactjs/core/.npmignore | 7 + @interactjs/core/BaseEvent.d.ts | 22 + @interactjs/core/BaseEvent.js | 38 + @interactjs/core/BaseEvent.js.map | 27 + @interactjs/core/BaseEvent.min.js | 2 + @interactjs/core/BaseEvent.min.js.map | 28 + @interactjs/core/Eventable.d.ts | 16 + @interactjs/core/Eventable.js | 75 + @interactjs/core/Eventable.js.map | 39 + @interactjs/core/Eventable.min.js | 2 + @interactjs/core/Eventable.min.js.map | 39 + @interactjs/core/Eventable.spec.d.ts | 1 + @interactjs/core/InteractEvent.d.ts | 72 + @interactjs/core/InteractEvent.js | 220 + @interactjs/core/InteractEvent.js.map | 95 + @interactjs/core/InteractEvent.min.js | 2 + @interactjs/core/InteractEvent.min.js.map | 96 + @interactjs/core/Interactable.d.ts | 133 + @interactjs/core/Interactable.js | 381 + @interactjs/core/Interactable.js.map | 113 + @interactjs/core/Interactable.min.js | 2 + @interactjs/core/Interactable.min.js.map | 114 + @interactjs/core/Interactable.spec.d.ts | 1 + @interactjs/core/InteractableSet.d.ts | 26 + @interactjs/core/InteractableSet.js | 102 + @interactjs/core/InteractableSet.js.map | 61 + @interactjs/core/InteractableSet.min.js | 2 + @interactjs/core/InteractableSet.min.js.map | 63 + @interactjs/core/Interaction.d.ts | 220 + @interactjs/core/Interaction.js | 514 + @interactjs/core/Interaction.js.map | 144 + @interactjs/core/Interaction.min.js | 2 + @interactjs/core/Interaction.min.js.map | 144 + @interactjs/core/Interaction.spec.d.ts | 1 + @interactjs/core/LICENSE | 23 + @interactjs/core/PointerInfo.d.ts | 9 + @interactjs/core/PointerInfo.js | 13 + @interactjs/core/PointerInfo.js.map | 19 + @interactjs/core/PointerInfo.min.js | 2 + @interactjs/core/PointerInfo.min.js.map | 20 + @interactjs/core/defaultOptions.d.ts | 26 + @interactjs/core/defaultOptions.js | 19 + @interactjs/core/defaultOptions.js.map | 22 + @interactjs/core/defaultOptions.min.js | 2 + @interactjs/core/defaultOptions.min.js.map | 22 + .../core/interactablePreventDefault.d.ts | 16 + .../core/interactablePreventDefault.js | 112 + .../core/interactablePreventDefault.js.map | 51 + .../core/interactablePreventDefault.min.js | 2 + .../interactablePreventDefault.min.js.map | 52 + .../core/interactablePreventDefault.spec.d.ts | 1 + @interactjs/core/interactionFinder.d.ts | 18 + @interactjs/core/interactionFinder.js | 144 + @interactjs/core/interactionFinder.js.map | 47 + @interactjs/core/interactionFinder.min.js | 2 + @interactjs/core/interactionFinder.min.js.map | 47 + @interactjs/core/interactionFinder.spec.d.ts | 1 + @interactjs/core/interactions.d.ts | 30 + @interactjs/core/interactions.js | 276 + @interactjs/core/interactions.js.map | 104 + @interactjs/core/interactions.min.js | 2 + @interactjs/core/interactions.min.js.map | 104 + @interactjs/core/interactions.spec.d.ts | 1 + @interactjs/core/scope.d.ts | 144 + @interactjs/core/scope.js | 242 + @interactjs/core/scope.js.map | 97 + @interactjs/core/scope.min.js | 2 + @interactjs/core/scope.min.js.map | 99 + @interactjs/core/scope.spec.d.ts | 1 + @interactjs/dev-tools/.npmignore | 7 + @interactjs/dev-tools/LICENSE | 23 + @interactjs/dev-tools/devTools.spec.d.ts | 1 + @interactjs/dev-tools/index.d.ts | 38 + @interactjs/dev-tools/index.js | 140 + @interactjs/dev-tools/index.js.map | 64 + @interactjs/dev-tools/index.min.js | 2 + @interactjs/dev-tools/index.min.js.map | 33 + @interactjs/inertia/.npmignore | 7 + @interactjs/inertia/LICENSE | 23 + @interactjs/inertia/index.d.ts | 66 + @interactjs/inertia/index.js | 387 + @interactjs/inertia/index.js.map | 142 + @interactjs/inertia/index.min.js | 2 + @interactjs/inertia/index.min.js.map | 143 + @interactjs/inertia/inertia.spec.d.ts | 1 + @interactjs/interact/.npmignore | 7 + @interactjs/interact/LICENSE | 23 + @interactjs/interact/index.d.ts | 76 + @interactjs/interact/index.js | 272 + @interactjs/interact/index.js.map | 83 + @interactjs/interact/index.min.js | 2 + @interactjs/interact/index.min.js.map | 83 + @interactjs/interact/interact.spec.d.ts | 1 + @interactjs/interactjs/.npmignore | 7 + @interactjs/interactjs/LICENSE | 23 + @interactjs/interactjs/index.d.ts | 4 + @interactjs/interactjs/index.js | 42 + @interactjs/interactjs/index.js.map | 27 + @interactjs/interactjs/index.min.js | 2 + @interactjs/interactjs/index.min.js.map | 27 + @interactjs/modifiers/.npmignore | 7 + @interactjs/modifiers/LICENSE | 23 + @interactjs/modifiers/Modification.d.ts | 71 + @interactjs/modifiers/Modification.js | 396 + @interactjs/modifiers/Modification.js.map | 113 + @interactjs/modifiers/Modification.min.js | 2 + @interactjs/modifiers/Modification.min.js.map | 114 + @interactjs/modifiers/all.d.ts | 8 + @interactjs/modifiers/all.js | 9 + @interactjs/modifiers/all.js.map | 21 + @interactjs/modifiers/all.min.js | 2 + @interactjs/modifiers/all.min.js.map | 13 + @interactjs/modifiers/aspectRatio.d.ts | 76 + @interactjs/modifiers/aspectRatio.js | 152 + @interactjs/modifiers/aspectRatio.js.map | 70 + @interactjs/modifiers/aspectRatio.min.js | 2 + @interactjs/modifiers/aspectRatio.min.js.map | 69 + @interactjs/modifiers/aspectRatio.spec.d.ts | 1 + @interactjs/modifiers/base.d.ts | 79 + @interactjs/modifiers/base.js | 82 + @interactjs/modifiers/base.js.map | 51 + @interactjs/modifiers/base.min.js | 2 + @interactjs/modifiers/base.min.js.map | 54 + @interactjs/modifiers/base.spec.d.ts | 1 + @interactjs/modifiers/index.d.ts | 11 + @interactjs/modifiers/index.js | 29 + @interactjs/modifiers/index.js.map | 29 + @interactjs/modifiers/index.min.js | 2 + @interactjs/modifiers/index.min.js.map | 29 + @interactjs/offset/.npmignore | 7 + @interactjs/offset/LICENSE | 23 + @interactjs/offset/index.d.ts | 17 + @interactjs/offset/index.js | 120 + @interactjs/offset/index.js.map | 45 + @interactjs/offset/index.min.js | 2 + @interactjs/offset/index.min.js.map | 47 + @interactjs/offset/offset.spec.d.ts | 1 + @interactjs/pointer-events/.npmignore | 7 + @interactjs/pointer-events/LICENSE | 23 + @interactjs/pointer-events/PointerEvent.d.ts | 24 + @interactjs/pointer-events/PointerEvent.js | 74 + .../pointer-events/PointerEvent.js.map | 51 + .../pointer-events/PointerEvent.min.js | 2 + .../pointer-events/PointerEvent.min.js.map | 53 + .../pointer-events/PointerEvent.spec.d.ts | 1 + @interactjs/pointer-events/base.d.ts | 116 + @interactjs/pointer-events/base.js | 283 + @interactjs/pointer-events/base.js.map | 94 + @interactjs/pointer-events/base.min.js | 2 + @interactjs/pointer-events/base.min.js.map | 92 + @interactjs/pointer-events/base.spec.d.ts | 1 + @interactjs/pointer-events/holdRepeat.d.ts | 17 + @interactjs/pointer-events/holdRepeat.js | 76 + @interactjs/pointer-events/holdRepeat.js.map | 49 + @interactjs/pointer-events/holdRepeat.min.js | 2 + .../pointer-events/holdRepeat.min.js.map | 48 + .../pointer-events/holdRepeat.spec.d.ts | 1 + @interactjs/pointer-events/index.d.ts | 9 + @interactjs/pointer-events/index.js | 15 + @interactjs/pointer-events/index.js.map | 19 + @interactjs/pointer-events/index.min.js | 2 + @interactjs/pointer-events/index.min.js.map | 19 + .../pointer-events/interactableTargets.d.ts | 9 + .../pointer-events/interactableTargets.js | 68 + .../pointer-events/interactableTargets.js.map | 46 + .../pointer-events/interactableTargets.min.js | 2 + .../interactableTargets.min.js.map | 48 + @interactjs/reflow/.npmignore | 7 + @interactjs/reflow/LICENSE | 23 + @interactjs/reflow/index.d.ts | 23 + @interactjs/reflow/index.js | 139 + @interactjs/reflow/index.js.map | 86 + @interactjs/reflow/index.min.js | 2 + @interactjs/reflow/index.min.js.map | 88 + @interactjs/reflow/reflow.spec.d.ts | 1 + @interactjs/types/.npmignore | 7 + @interactjs/types/LICENSE | 23 + @interactjs/types/NativePointerEventType.d.ts | 2 + @interactjs/types/NativePointerEventType.js | 3 + .../types/NativePointerEventType.js.map | 13 + .../types/NativePointerEventType.min.js | 2 + .../types/NativePointerEventType.min.js.map | 11 + @interactjs/types/index.d.ts | 1 + @interactjs/types/index.js | 2 + @interactjs/types/index.js.map | 11 + @interactjs/types/index.min.js | 2 + @interactjs/types/index.min.js.map | 7 + @interactjs/types/interactjs-test.d.ts | 1 + @interactjs/types/interactjs-test.js | 244 + @interactjs/types/interactjs-test.js.map | 114 + @interactjs/types/interactjs-test.min.js | 2 + @interactjs/types/interactjs-test.min.js.map | 110 + @interactjs/types/types.spec.d.ts | 1 + @interactjs/utils/.npmignore | 7 + @interactjs/utils/LICENSE | 23 + @interactjs/utils/arr.d.ts | 8 + @interactjs/utils/arr.js | 21 + @interactjs/utils/arr.js.map | 28 + @interactjs/utils/arr.min.js | 2 + @interactjs/utils/arr.min.js.map | 28 + @interactjs/utils/browser.d.ts | 21 + @interactjs/utils/browser.js | 52 + @interactjs/utils/browser.js.map | 47 + @interactjs/utils/browser.min.js | 2 + @interactjs/utils/browser.min.js.map | 47 + @interactjs/utils/clone.d.ts | 1 + @interactjs/utils/clone.js | 21 + @interactjs/utils/clone.js.map | 22 + @interactjs/utils/clone.min.js | 2 + @interactjs/utils/clone.min.js.map | 22 + @interactjs/utils/domObjects.d.ts | 14 + @interactjs/utils/domObjects.js | 32 + @interactjs/utils/domObjects.js.map | 28 + @interactjs/utils/domObjects.min.js | 2 + @interactjs/utils/domObjects.min.js.map | 28 + @interactjs/utils/domUtils.d.ts | 29 + @interactjs/utils/domUtils.js | 222 + @interactjs/utils/domUtils.js.map | 94 + @interactjs/utils/domUtils.min.js | 2 + @interactjs/utils/domUtils.min.js.map | 93 + @interactjs/utils/domUtils.spec.d.ts | 1 + @interactjs/utils/events.d.ts | 42 + @interactjs/utils/events.js | 262 + @interactjs/utils/events.js.map | 84 + @interactjs/utils/events.min.js | 2 + @interactjs/utils/events.min.js.map | 84 + @interactjs/utils/extend.d.ts | 1 + @interactjs/utils/extend.js | 9 + @interactjs/utils/extend.js.map | 17 + @interactjs/utils/extend.min.js | 2 + @interactjs/utils/extend.min.js.map | 16 + @interactjs/utils/getOriginXY.d.ts | 6 + @interactjs/utils/getOriginXY.js | 12 + @interactjs/utils/getOriginXY.js.map | 24 + @interactjs/utils/getOriginXY.min.js | 2 + @interactjs/utils/getOriginXY.min.js.map | 23 + @interactjs/utils/hypot.d.ts | 2 + @interactjs/utils/hypot.js | 2 + @interactjs/utils/hypot.js.map | 16 + @interactjs/utils/hypot.min.js | 2 + @interactjs/utils/hypot.min.js.map | 16 + @interactjs/utils/index.d.ts | 17 + @interactjs/utils/index.js | 34 + @interactjs/utils/index.js.map | 42 + @interactjs/utils/index.min.js | 2 + @interactjs/utils/index.min.js.map | 35 + @interactjs/utils/is.d.ts | 12 + @interactjs/utils/is.js | 23 + @interactjs/utils/is.js.map | 35 + @interactjs/utils/is.min.js | 2 + @interactjs/utils/is.min.js.map | 35 + @interactjs/utils/isWindow.d.ts | 2 + @interactjs/utils/isWindow.js | 2 + @interactjs/utils/isWindow.js.map | 14 + @interactjs/utils/isWindow.min.js | 2 + @interactjs/utils/isWindow.min.js.map | 14 + @interactjs/utils/normalizeListeners.d.ts | 4 + @interactjs/utils/normalizeListeners.js | 40 + @interactjs/utils/normalizeListeners.js.map | 34 + @interactjs/utils/normalizeListeners.min.js | 2 + .../utils/normalizeListeners.min.js.map | 33 + .../utils/normalizeListeners.spec.d.ts | 1 + @interactjs/utils/pointerExtend.d.ts | 12 + @interactjs/utils/pointerExtend.js | 26 + @interactjs/utils/pointerExtend.js.map | 23 + @interactjs/utils/pointerExtend.min.js | 2 + @interactjs/utils/pointerExtend.min.js.map | 23 + @interactjs/utils/pointerUtils.d.ts | 422 + @interactjs/utils/pointerUtils.js | 255 + @interactjs/utils/pointerUtils.js.map | 110 + @interactjs/utils/pointerUtils.min.js | 2 + @interactjs/utils/pointerUtils.min.js.map | 110 + @interactjs/utils/raf.d.ts | 7 + @interactjs/utils/raf.js | 39 + @interactjs/utils/raf.js.map | 31 + @interactjs/utils/raf.min.js | 2 + @interactjs/utils/raf.min.js.map | 31 + @interactjs/utils/rect.d.ts | 9 + @interactjs/utils/rect.js | 78 + @interactjs/utils/rect.js.map | 42 + @interactjs/utils/rect.min.js | 2 + @interactjs/utils/rect.min.js.map | 42 + @interactjs/utils/window.d.ts | 11 + @interactjs/utils/window.js | 39 + @interactjs/utils/window.js.map | 27 + @interactjs/utils/window.min.js | 2 + @interactjs/utils/window.min.js.map | 26 + interactjs/.npmignore | 7 + interactjs/LICENSE | 23 + interactjs/README.md | 112 + .../dist/api/@interactjs_actions_drag.ts.html | 242 + ...@interactjs_actions_drop_DropEvent.ts.html | 148 + .../@interactjs_actions_drop_index.ts.html | 631 + .../api/@interactjs_actions_gesture.ts.html | 255 + .../api/@interactjs_actions_resize.ts.html | 522 + ...tjs_auto-start_InteractableMethods.ts.html | 277 + .../api/@interactjs_auto-start_base.ts.html | 439 + .../api/@interactjs_core_BaseEvent.ts.html | 92 + .../@interactjs_core_InteractEvent.ts.html | 261 + .../api/@interactjs_core_Interactable.ts.html | 451 + .../api/@interactjs_core_Interaction.ts.html | 667 + ...js_core_interactablePreventDefault.ts.html | 173 + .../api/@interactjs_interact_index.ts.html | 355 + .../@interactjs_modifiers_aspectRatio.ts.html | 211 + .../@interactjs_modifiers_snap_edges.ts.html | 119 + ...ractjs_pointer-events_PointerEvent.ts.html | 140 + .../dist/api/@interactjs_reflow_index.ts.html | 221 + interactjs/dist/api/DropEvent.html | 262 + .../dist/api/InteractEvent_InteractEvent.html | 167 + interactjs/dist/api/Interactable.html | 3477 +++++ .../dist/api/Interaction_Interaction.html | 167 + interactjs/dist/api/doclets.json | 1 + .../dist/api/fonts/OpenSans-Bold-webfont.eot | Bin 0 -> 19544 bytes .../dist/api/fonts/OpenSans-Bold-webfont.svg | 1830 +++ .../dist/api/fonts/OpenSans-Bold-webfont.woff | Bin 0 -> 22432 bytes .../api/fonts/OpenSans-BoldItalic-webfont.eot | Bin 0 -> 20133 bytes .../api/fonts/OpenSans-BoldItalic-webfont.svg | 1830 +++ .../fonts/OpenSans-BoldItalic-webfont.woff | Bin 0 -> 23048 bytes .../api/fonts/OpenSans-Italic-webfont.eot | Bin 0 -> 20265 bytes .../api/fonts/OpenSans-Italic-webfont.svg | 1830 +++ .../api/fonts/OpenSans-Italic-webfont.woff | Bin 0 -> 23188 bytes .../dist/api/fonts/OpenSans-Light-webfont.eot | Bin 0 -> 19514 bytes .../dist/api/fonts/OpenSans-Light-webfont.svg | 1831 +++ .../api/fonts/OpenSans-Light-webfont.woff | Bin 0 -> 22248 bytes .../fonts/OpenSans-LightItalic-webfont.eot | Bin 0 -> 20535 bytes .../fonts/OpenSans-LightItalic-webfont.svg | 1835 +++ .../fonts/OpenSans-LightItalic-webfont.woff | Bin 0 -> 23400 bytes .../api/fonts/OpenSans-Regular-webfont.eot | Bin 0 -> 19836 bytes .../api/fonts/OpenSans-Regular-webfont.svg | 1831 +++ .../api/fonts/OpenSans-Regular-webfont.woff | Bin 0 -> 22660 bytes .../api/fonts/OpenSans-Semibold-webfont.eot | Bin 0 -> 20028 bytes .../api/fonts/OpenSans-Semibold-webfont.svg | 1830 +++ .../api/fonts/OpenSans-Semibold-webfont.ttf | Bin 0 -> 39476 bytes .../api/fonts/OpenSans-Semibold-webfont.woff | Bin 0 -> 22908 bytes .../fonts/OpenSans-SemiboldItalic-webfont.eot | Bin 0 -> 20962 bytes .../fonts/OpenSans-SemiboldItalic-webfont.svg | 1830 +++ .../fonts/OpenSans-SemiboldItalic-webfont.ttf | Bin 0 -> 40252 bytes .../OpenSans-SemiboldItalic-webfont.woff | Bin 0 -> 23764 bytes interactjs/dist/api/global.html | 299 + interactjs/dist/api/img/ijs-32.png | Bin 0 -> 1337 bytes interactjs/dist/api/img/ijs-64.png | Bin 0 -> 2601 bytes interactjs/dist/api/img/ijs-anim-short.svg | 63 + interactjs/dist/api/img/ijs-anim.svg | 62 + interactjs/dist/api/img/ijs-icon.svg | 103 + interactjs/dist/api/img/ijs.svg | 23 + interactjs/dist/api/index.html | 53 + interactjs/dist/api/jsdoc_index.md.html | 62 + interactjs/dist/api/module-interact.html | 754 ++ .../api/module-modifiers_aspectRatio.html | 179 + .../dist/api/module-modifiers_snapEdges.html | 190 + .../api/module.exports_module.exports.html | 167 + interactjs/dist/api/scripts/linenumber.js | 25 + .../scripts/prettify/Apache-License-2.0.txt | 202 + .../dist/api/scripts/prettify/lang-css.js | 2 + .../dist/api/scripts/prettify/prettify.js | 28 + interactjs/dist/api/styles/jsdoc-default.css | 789 ++ interactjs/dist/api/styles/prettify-jsdoc.css | 111 + interactjs/dist/api/styles/prettify.css | 119 + interactjs/dist/interact.js | 10803 ++++++++++++++++ interactjs/dist/interact.js.map | 10803 ++++++++++++++++ interactjs/dist/interact.js.map.map | 1 + interactjs/dist/interact.min.js | 10803 ++++++++++++++++ interactjs/dist/interact.min.js.map | 10803 ++++++++++++++++ interactjs/dist/interact.min.js.map.map | 1 + 426 files changed, 87403 insertions(+) create mode 100644 @interactjs/actions/.npmignore create mode 100644 @interactjs/actions/LICENSE create mode 100644 @interactjs/actions/actions.spec.d.ts create mode 100644 @interactjs/actions/drag.d.ts create mode 100644 @interactjs/actions/drag.js create mode 100644 @interactjs/actions/drag.js.map create mode 100644 @interactjs/actions/drag.min.js create mode 100644 @interactjs/actions/drag.min.js.map create mode 100644 @interactjs/actions/drag.spec.d.ts create mode 100644 @interactjs/actions/gesture.d.ts create mode 100644 @interactjs/actions/gesture.js create mode 100644 @interactjs/actions/gesture.js.map create mode 100644 @interactjs/actions/gesture.min.js create mode 100644 @interactjs/actions/gesture.min.js.map create mode 100644 @interactjs/actions/gesture.spec.d.ts create mode 100644 @interactjs/actions/index.d.ts create mode 100644 @interactjs/actions/index.js create mode 100644 @interactjs/actions/index.js.map create mode 100644 @interactjs/actions/index.min.js create mode 100644 @interactjs/actions/index.min.js.map create mode 100644 @interactjs/actions/resize.d.ts create mode 100644 @interactjs/actions/resize.js create mode 100644 @interactjs/actions/resize.js.map create mode 100644 @interactjs/actions/resize.min.js create mode 100644 @interactjs/actions/resize.min.js.map create mode 100644 @interactjs/actions/resize.spec.d.ts create mode 100644 @interactjs/auto-scroll/.npmignore create mode 100644 @interactjs/auto-scroll/LICENSE create mode 100644 @interactjs/auto-scroll/index.d.ts create mode 100644 @interactjs/auto-scroll/index.js create mode 100644 @interactjs/auto-scroll/index.js.map create mode 100644 @interactjs/auto-scroll/index.min.js create mode 100644 @interactjs/auto-scroll/index.min.js.map create mode 100644 @interactjs/auto-start/.npmignore create mode 100644 @interactjs/auto-start/InteractableMethods.d.ts create mode 100644 @interactjs/auto-start/InteractableMethods.js create mode 100644 @interactjs/auto-start/InteractableMethods.js.map create mode 100644 @interactjs/auto-start/InteractableMethods.min.js create mode 100644 @interactjs/auto-start/InteractableMethods.min.js.map create mode 100644 @interactjs/auto-start/LICENSE create mode 100644 @interactjs/auto-start/autoStart.spec.d.ts create mode 100644 @interactjs/auto-start/base.d.ts create mode 100644 @interactjs/auto-start/base.js create mode 100644 @interactjs/auto-start/base.js.map create mode 100644 @interactjs/auto-start/base.min.js create mode 100644 @interactjs/auto-start/base.min.js.map create mode 100644 @interactjs/auto-start/dragAxis.d.ts create mode 100644 @interactjs/auto-start/dragAxis.js create mode 100644 @interactjs/auto-start/dragAxis.js.map create mode 100644 @interactjs/auto-start/dragAxis.min.js create mode 100644 @interactjs/auto-start/dragAxis.min.js.map create mode 100644 @interactjs/auto-start/hold.d.ts create mode 100644 @interactjs/auto-start/hold.js create mode 100644 @interactjs/auto-start/hold.js.map create mode 100644 @interactjs/auto-start/hold.min.js create mode 100644 @interactjs/auto-start/hold.min.js.map create mode 100644 @interactjs/auto-start/hold.spec.d.ts create mode 100644 @interactjs/auto-start/index.d.ts create mode 100644 @interactjs/auto-start/index.js create mode 100644 @interactjs/auto-start/index.js.map create mode 100644 @interactjs/auto-start/index.min.js create mode 100644 @interactjs/auto-start/index.min.js.map create mode 100644 @interactjs/core/.npmignore create mode 100644 @interactjs/core/BaseEvent.d.ts create mode 100644 @interactjs/core/BaseEvent.js create mode 100644 @interactjs/core/BaseEvent.js.map create mode 100644 @interactjs/core/BaseEvent.min.js create mode 100644 @interactjs/core/BaseEvent.min.js.map create mode 100644 @interactjs/core/Eventable.d.ts create mode 100644 @interactjs/core/Eventable.js create mode 100644 @interactjs/core/Eventable.js.map create mode 100644 @interactjs/core/Eventable.min.js create mode 100644 @interactjs/core/Eventable.min.js.map create mode 100644 @interactjs/core/Eventable.spec.d.ts create mode 100644 @interactjs/core/InteractEvent.d.ts create mode 100644 @interactjs/core/InteractEvent.js create mode 100644 @interactjs/core/InteractEvent.js.map create mode 100644 @interactjs/core/InteractEvent.min.js create mode 100644 @interactjs/core/InteractEvent.min.js.map create mode 100644 @interactjs/core/Interactable.d.ts create mode 100644 @interactjs/core/Interactable.js create mode 100644 @interactjs/core/Interactable.js.map create mode 100644 @interactjs/core/Interactable.min.js create mode 100644 @interactjs/core/Interactable.min.js.map create mode 100644 @interactjs/core/Interactable.spec.d.ts create mode 100644 @interactjs/core/InteractableSet.d.ts create mode 100644 @interactjs/core/InteractableSet.js create mode 100644 @interactjs/core/InteractableSet.js.map create mode 100644 @interactjs/core/InteractableSet.min.js create mode 100644 @interactjs/core/InteractableSet.min.js.map create mode 100644 @interactjs/core/Interaction.d.ts create mode 100644 @interactjs/core/Interaction.js create mode 100644 @interactjs/core/Interaction.js.map create mode 100644 @interactjs/core/Interaction.min.js create mode 100644 @interactjs/core/Interaction.min.js.map create mode 100644 @interactjs/core/Interaction.spec.d.ts create mode 100644 @interactjs/core/LICENSE create mode 100644 @interactjs/core/PointerInfo.d.ts create mode 100644 @interactjs/core/PointerInfo.js create mode 100644 @interactjs/core/PointerInfo.js.map create mode 100644 @interactjs/core/PointerInfo.min.js create mode 100644 @interactjs/core/PointerInfo.min.js.map create mode 100644 @interactjs/core/defaultOptions.d.ts create mode 100644 @interactjs/core/defaultOptions.js create mode 100644 @interactjs/core/defaultOptions.js.map create mode 100644 @interactjs/core/defaultOptions.min.js create mode 100644 @interactjs/core/defaultOptions.min.js.map create mode 100644 @interactjs/core/interactablePreventDefault.d.ts create mode 100644 @interactjs/core/interactablePreventDefault.js create mode 100644 @interactjs/core/interactablePreventDefault.js.map create mode 100644 @interactjs/core/interactablePreventDefault.min.js create mode 100644 @interactjs/core/interactablePreventDefault.min.js.map create mode 100644 @interactjs/core/interactablePreventDefault.spec.d.ts create mode 100644 @interactjs/core/interactionFinder.d.ts create mode 100644 @interactjs/core/interactionFinder.js create mode 100644 @interactjs/core/interactionFinder.js.map create mode 100644 @interactjs/core/interactionFinder.min.js create mode 100644 @interactjs/core/interactionFinder.min.js.map create mode 100644 @interactjs/core/interactionFinder.spec.d.ts create mode 100644 @interactjs/core/interactions.d.ts create mode 100644 @interactjs/core/interactions.js create mode 100644 @interactjs/core/interactions.js.map create mode 100644 @interactjs/core/interactions.min.js create mode 100644 @interactjs/core/interactions.min.js.map create mode 100644 @interactjs/core/interactions.spec.d.ts create mode 100644 @interactjs/core/scope.d.ts create mode 100644 @interactjs/core/scope.js create mode 100644 @interactjs/core/scope.js.map create mode 100644 @interactjs/core/scope.min.js create mode 100644 @interactjs/core/scope.min.js.map create mode 100644 @interactjs/core/scope.spec.d.ts create mode 100644 @interactjs/dev-tools/.npmignore create mode 100644 @interactjs/dev-tools/LICENSE create mode 100644 @interactjs/dev-tools/devTools.spec.d.ts create mode 100644 @interactjs/dev-tools/index.d.ts create mode 100644 @interactjs/dev-tools/index.js create mode 100644 @interactjs/dev-tools/index.js.map create mode 100644 @interactjs/dev-tools/index.min.js create mode 100644 @interactjs/dev-tools/index.min.js.map create mode 100644 @interactjs/inertia/.npmignore create mode 100644 @interactjs/inertia/LICENSE create mode 100644 @interactjs/inertia/index.d.ts create mode 100644 @interactjs/inertia/index.js create mode 100644 @interactjs/inertia/index.js.map create mode 100644 @interactjs/inertia/index.min.js create mode 100644 @interactjs/inertia/index.min.js.map create mode 100644 @interactjs/inertia/inertia.spec.d.ts create mode 100644 @interactjs/interact/.npmignore create mode 100644 @interactjs/interact/LICENSE create mode 100644 @interactjs/interact/index.d.ts create mode 100644 @interactjs/interact/index.js create mode 100644 @interactjs/interact/index.js.map create mode 100644 @interactjs/interact/index.min.js create mode 100644 @interactjs/interact/index.min.js.map create mode 100644 @interactjs/interact/interact.spec.d.ts create mode 100644 @interactjs/interactjs/.npmignore create mode 100644 @interactjs/interactjs/LICENSE create mode 100644 @interactjs/interactjs/index.d.ts create mode 100644 @interactjs/interactjs/index.js create mode 100644 @interactjs/interactjs/index.js.map create mode 100644 @interactjs/interactjs/index.min.js create mode 100644 @interactjs/interactjs/index.min.js.map create mode 100644 @interactjs/modifiers/.npmignore create mode 100644 @interactjs/modifiers/LICENSE create mode 100644 @interactjs/modifiers/Modification.d.ts create mode 100644 @interactjs/modifiers/Modification.js create mode 100644 @interactjs/modifiers/Modification.js.map create mode 100644 @interactjs/modifiers/Modification.min.js create mode 100644 @interactjs/modifiers/Modification.min.js.map create mode 100644 @interactjs/modifiers/all.d.ts create mode 100644 @interactjs/modifiers/all.js create mode 100644 @interactjs/modifiers/all.js.map create mode 100644 @interactjs/modifiers/all.min.js create mode 100644 @interactjs/modifiers/all.min.js.map create mode 100644 @interactjs/modifiers/aspectRatio.d.ts create mode 100644 @interactjs/modifiers/aspectRatio.js create mode 100644 @interactjs/modifiers/aspectRatio.js.map create mode 100644 @interactjs/modifiers/aspectRatio.min.js create mode 100644 @interactjs/modifiers/aspectRatio.min.js.map create mode 100644 @interactjs/modifiers/aspectRatio.spec.d.ts create mode 100644 @interactjs/modifiers/base.d.ts create mode 100644 @interactjs/modifiers/base.js create mode 100644 @interactjs/modifiers/base.js.map create mode 100644 @interactjs/modifiers/base.min.js create mode 100644 @interactjs/modifiers/base.min.js.map create mode 100644 @interactjs/modifiers/base.spec.d.ts create mode 100644 @interactjs/modifiers/index.d.ts create mode 100644 @interactjs/modifiers/index.js create mode 100644 @interactjs/modifiers/index.js.map create mode 100644 @interactjs/modifiers/index.min.js create mode 100644 @interactjs/modifiers/index.min.js.map create mode 100644 @interactjs/offset/.npmignore create mode 100644 @interactjs/offset/LICENSE create mode 100644 @interactjs/offset/index.d.ts create mode 100644 @interactjs/offset/index.js create mode 100644 @interactjs/offset/index.js.map create mode 100644 @interactjs/offset/index.min.js create mode 100644 @interactjs/offset/index.min.js.map create mode 100644 @interactjs/offset/offset.spec.d.ts create mode 100644 @interactjs/pointer-events/.npmignore create mode 100644 @interactjs/pointer-events/LICENSE create mode 100644 @interactjs/pointer-events/PointerEvent.d.ts create mode 100644 @interactjs/pointer-events/PointerEvent.js create mode 100644 @interactjs/pointer-events/PointerEvent.js.map create mode 100644 @interactjs/pointer-events/PointerEvent.min.js create mode 100644 @interactjs/pointer-events/PointerEvent.min.js.map create mode 100644 @interactjs/pointer-events/PointerEvent.spec.d.ts create mode 100644 @interactjs/pointer-events/base.d.ts create mode 100644 @interactjs/pointer-events/base.js create mode 100644 @interactjs/pointer-events/base.js.map create mode 100644 @interactjs/pointer-events/base.min.js create mode 100644 @interactjs/pointer-events/base.min.js.map create mode 100644 @interactjs/pointer-events/base.spec.d.ts create mode 100644 @interactjs/pointer-events/holdRepeat.d.ts create mode 100644 @interactjs/pointer-events/holdRepeat.js create mode 100644 @interactjs/pointer-events/holdRepeat.js.map create mode 100644 @interactjs/pointer-events/holdRepeat.min.js create mode 100644 @interactjs/pointer-events/holdRepeat.min.js.map create mode 100644 @interactjs/pointer-events/holdRepeat.spec.d.ts create mode 100644 @interactjs/pointer-events/index.d.ts create mode 100644 @interactjs/pointer-events/index.js create mode 100644 @interactjs/pointer-events/index.js.map create mode 100644 @interactjs/pointer-events/index.min.js create mode 100644 @interactjs/pointer-events/index.min.js.map create mode 100644 @interactjs/pointer-events/interactableTargets.d.ts create mode 100644 @interactjs/pointer-events/interactableTargets.js create mode 100644 @interactjs/pointer-events/interactableTargets.js.map create mode 100644 @interactjs/pointer-events/interactableTargets.min.js create mode 100644 @interactjs/pointer-events/interactableTargets.min.js.map create mode 100644 @interactjs/reflow/.npmignore create mode 100644 @interactjs/reflow/LICENSE create mode 100644 @interactjs/reflow/index.d.ts create mode 100644 @interactjs/reflow/index.js create mode 100644 @interactjs/reflow/index.js.map create mode 100644 @interactjs/reflow/index.min.js create mode 100644 @interactjs/reflow/index.min.js.map create mode 100644 @interactjs/reflow/reflow.spec.d.ts create mode 100644 @interactjs/types/.npmignore create mode 100644 @interactjs/types/LICENSE create mode 100644 @interactjs/types/NativePointerEventType.d.ts create mode 100644 @interactjs/types/NativePointerEventType.js create mode 100644 @interactjs/types/NativePointerEventType.js.map create mode 100644 @interactjs/types/NativePointerEventType.min.js create mode 100644 @interactjs/types/NativePointerEventType.min.js.map create mode 100644 @interactjs/types/index.d.ts create mode 100644 @interactjs/types/index.js create mode 100644 @interactjs/types/index.js.map create mode 100644 @interactjs/types/index.min.js create mode 100644 @interactjs/types/index.min.js.map create mode 100644 @interactjs/types/interactjs-test.d.ts create mode 100644 @interactjs/types/interactjs-test.js create mode 100644 @interactjs/types/interactjs-test.js.map create mode 100644 @interactjs/types/interactjs-test.min.js create mode 100644 @interactjs/types/interactjs-test.min.js.map create mode 100644 @interactjs/types/types.spec.d.ts create mode 100644 @interactjs/utils/.npmignore create mode 100644 @interactjs/utils/LICENSE create mode 100644 @interactjs/utils/arr.d.ts create mode 100644 @interactjs/utils/arr.js create mode 100644 @interactjs/utils/arr.js.map create mode 100644 @interactjs/utils/arr.min.js create mode 100644 @interactjs/utils/arr.min.js.map create mode 100644 @interactjs/utils/browser.d.ts create mode 100644 @interactjs/utils/browser.js create mode 100644 @interactjs/utils/browser.js.map create mode 100644 @interactjs/utils/browser.min.js create mode 100644 @interactjs/utils/browser.min.js.map create mode 100644 @interactjs/utils/clone.d.ts create mode 100644 @interactjs/utils/clone.js create mode 100644 @interactjs/utils/clone.js.map create mode 100644 @interactjs/utils/clone.min.js create mode 100644 @interactjs/utils/clone.min.js.map create mode 100644 @interactjs/utils/domObjects.d.ts create mode 100644 @interactjs/utils/domObjects.js create mode 100644 @interactjs/utils/domObjects.js.map create mode 100644 @interactjs/utils/domObjects.min.js create mode 100644 @interactjs/utils/domObjects.min.js.map create mode 100644 @interactjs/utils/domUtils.d.ts create mode 100644 @interactjs/utils/domUtils.js create mode 100644 @interactjs/utils/domUtils.js.map create mode 100644 @interactjs/utils/domUtils.min.js create mode 100644 @interactjs/utils/domUtils.min.js.map create mode 100644 @interactjs/utils/domUtils.spec.d.ts create mode 100644 @interactjs/utils/events.d.ts create mode 100644 @interactjs/utils/events.js create mode 100644 @interactjs/utils/events.js.map create mode 100644 @interactjs/utils/events.min.js create mode 100644 @interactjs/utils/events.min.js.map create mode 100644 @interactjs/utils/extend.d.ts create mode 100644 @interactjs/utils/extend.js create mode 100644 @interactjs/utils/extend.js.map create mode 100644 @interactjs/utils/extend.min.js create mode 100644 @interactjs/utils/extend.min.js.map create mode 100644 @interactjs/utils/getOriginXY.d.ts create mode 100644 @interactjs/utils/getOriginXY.js create mode 100644 @interactjs/utils/getOriginXY.js.map create mode 100644 @interactjs/utils/getOriginXY.min.js create mode 100644 @interactjs/utils/getOriginXY.min.js.map create mode 100644 @interactjs/utils/hypot.d.ts create mode 100644 @interactjs/utils/hypot.js create mode 100644 @interactjs/utils/hypot.js.map create mode 100644 @interactjs/utils/hypot.min.js create mode 100644 @interactjs/utils/hypot.min.js.map create mode 100644 @interactjs/utils/index.d.ts create mode 100644 @interactjs/utils/index.js create mode 100644 @interactjs/utils/index.js.map create mode 100644 @interactjs/utils/index.min.js create mode 100644 @interactjs/utils/index.min.js.map create mode 100644 @interactjs/utils/is.d.ts create mode 100644 @interactjs/utils/is.js create mode 100644 @interactjs/utils/is.js.map create mode 100644 @interactjs/utils/is.min.js create mode 100644 @interactjs/utils/is.min.js.map create mode 100644 @interactjs/utils/isWindow.d.ts create mode 100644 @interactjs/utils/isWindow.js create mode 100644 @interactjs/utils/isWindow.js.map create mode 100644 @interactjs/utils/isWindow.min.js create mode 100644 @interactjs/utils/isWindow.min.js.map create mode 100644 @interactjs/utils/normalizeListeners.d.ts create mode 100644 @interactjs/utils/normalizeListeners.js create mode 100644 @interactjs/utils/normalizeListeners.js.map create mode 100644 @interactjs/utils/normalizeListeners.min.js create mode 100644 @interactjs/utils/normalizeListeners.min.js.map create mode 100644 @interactjs/utils/normalizeListeners.spec.d.ts create mode 100644 @interactjs/utils/pointerExtend.d.ts create mode 100644 @interactjs/utils/pointerExtend.js create mode 100644 @interactjs/utils/pointerExtend.js.map create mode 100644 @interactjs/utils/pointerExtend.min.js create mode 100644 @interactjs/utils/pointerExtend.min.js.map create mode 100644 @interactjs/utils/pointerUtils.d.ts create mode 100644 @interactjs/utils/pointerUtils.js create mode 100644 @interactjs/utils/pointerUtils.js.map create mode 100644 @interactjs/utils/pointerUtils.min.js create mode 100644 @interactjs/utils/pointerUtils.min.js.map create mode 100644 @interactjs/utils/raf.d.ts create mode 100644 @interactjs/utils/raf.js create mode 100644 @interactjs/utils/raf.js.map create mode 100644 @interactjs/utils/raf.min.js create mode 100644 @interactjs/utils/raf.min.js.map create mode 100644 @interactjs/utils/rect.d.ts create mode 100644 @interactjs/utils/rect.js create mode 100644 @interactjs/utils/rect.js.map create mode 100644 @interactjs/utils/rect.min.js create mode 100644 @interactjs/utils/rect.min.js.map create mode 100644 @interactjs/utils/window.d.ts create mode 100644 @interactjs/utils/window.js create mode 100644 @interactjs/utils/window.js.map create mode 100644 @interactjs/utils/window.min.js create mode 100644 @interactjs/utils/window.min.js.map create mode 100644 interactjs/.npmignore create mode 100644 interactjs/LICENSE create mode 100644 interactjs/README.md create mode 100644 interactjs/dist/api/@interactjs_actions_drag.ts.html create mode 100644 interactjs/dist/api/@interactjs_actions_drop_DropEvent.ts.html create mode 100644 interactjs/dist/api/@interactjs_actions_drop_index.ts.html create mode 100644 interactjs/dist/api/@interactjs_actions_gesture.ts.html create mode 100644 interactjs/dist/api/@interactjs_actions_resize.ts.html create mode 100644 interactjs/dist/api/@interactjs_auto-start_InteractableMethods.ts.html create mode 100644 interactjs/dist/api/@interactjs_auto-start_base.ts.html create mode 100644 interactjs/dist/api/@interactjs_core_BaseEvent.ts.html create mode 100644 interactjs/dist/api/@interactjs_core_InteractEvent.ts.html create mode 100644 interactjs/dist/api/@interactjs_core_Interactable.ts.html create mode 100644 interactjs/dist/api/@interactjs_core_Interaction.ts.html create mode 100644 interactjs/dist/api/@interactjs_core_interactablePreventDefault.ts.html create mode 100644 interactjs/dist/api/@interactjs_interact_index.ts.html create mode 100644 interactjs/dist/api/@interactjs_modifiers_aspectRatio.ts.html create mode 100644 interactjs/dist/api/@interactjs_modifiers_snap_edges.ts.html create mode 100644 interactjs/dist/api/@interactjs_pointer-events_PointerEvent.ts.html create mode 100644 interactjs/dist/api/@interactjs_reflow_index.ts.html create mode 100644 interactjs/dist/api/DropEvent.html create mode 100644 interactjs/dist/api/InteractEvent_InteractEvent.html create mode 100644 interactjs/dist/api/Interactable.html create mode 100644 interactjs/dist/api/Interaction_Interaction.html create mode 100644 interactjs/dist/api/doclets.json create mode 100644 interactjs/dist/api/fonts/OpenSans-Bold-webfont.eot create mode 100644 interactjs/dist/api/fonts/OpenSans-Bold-webfont.svg create mode 100644 interactjs/dist/api/fonts/OpenSans-Bold-webfont.woff create mode 100644 interactjs/dist/api/fonts/OpenSans-BoldItalic-webfont.eot create mode 100644 interactjs/dist/api/fonts/OpenSans-BoldItalic-webfont.svg create mode 100644 interactjs/dist/api/fonts/OpenSans-BoldItalic-webfont.woff create mode 100644 interactjs/dist/api/fonts/OpenSans-Italic-webfont.eot create mode 100644 interactjs/dist/api/fonts/OpenSans-Italic-webfont.svg create mode 100644 interactjs/dist/api/fonts/OpenSans-Italic-webfont.woff create mode 100644 interactjs/dist/api/fonts/OpenSans-Light-webfont.eot create mode 100644 interactjs/dist/api/fonts/OpenSans-Light-webfont.svg create mode 100644 interactjs/dist/api/fonts/OpenSans-Light-webfont.woff create mode 100644 interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.eot create mode 100644 interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.svg create mode 100644 interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.woff create mode 100644 interactjs/dist/api/fonts/OpenSans-Regular-webfont.eot create mode 100644 interactjs/dist/api/fonts/OpenSans-Regular-webfont.svg create mode 100644 interactjs/dist/api/fonts/OpenSans-Regular-webfont.woff create mode 100755 interactjs/dist/api/fonts/OpenSans-Semibold-webfont.eot create mode 100755 interactjs/dist/api/fonts/OpenSans-Semibold-webfont.svg create mode 100755 interactjs/dist/api/fonts/OpenSans-Semibold-webfont.ttf create mode 100755 interactjs/dist/api/fonts/OpenSans-Semibold-webfont.woff create mode 100755 interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.eot create mode 100755 interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.svg create mode 100755 interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.ttf create mode 100755 interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.woff create mode 100644 interactjs/dist/api/global.html create mode 100644 interactjs/dist/api/img/ijs-32.png create mode 100644 interactjs/dist/api/img/ijs-64.png create mode 100644 interactjs/dist/api/img/ijs-anim-short.svg create mode 100644 interactjs/dist/api/img/ijs-anim.svg create mode 100644 interactjs/dist/api/img/ijs-icon.svg create mode 100644 interactjs/dist/api/img/ijs.svg create mode 100644 interactjs/dist/api/index.html create mode 100644 interactjs/dist/api/jsdoc_index.md.html create mode 100644 interactjs/dist/api/module-interact.html create mode 100644 interactjs/dist/api/module-modifiers_aspectRatio.html create mode 100644 interactjs/dist/api/module-modifiers_snapEdges.html create mode 100644 interactjs/dist/api/module.exports_module.exports.html create mode 100644 interactjs/dist/api/scripts/linenumber.js create mode 100644 interactjs/dist/api/scripts/prettify/Apache-License-2.0.txt create mode 100644 interactjs/dist/api/scripts/prettify/lang-css.js create mode 100644 interactjs/dist/api/scripts/prettify/prettify.js create mode 100644 interactjs/dist/api/styles/jsdoc-default.css create mode 100644 interactjs/dist/api/styles/prettify-jsdoc.css create mode 100644 interactjs/dist/api/styles/prettify.css create mode 100644 interactjs/dist/interact.js create mode 100644 interactjs/dist/interact.js.map create mode 100644 interactjs/dist/interact.js.map.map create mode 100644 interactjs/dist/interact.min.js create mode 100644 interactjs/dist/interact.min.js.map create mode 100644 interactjs/dist/interact.min.js.map.map diff --git a/@interactjs/actions/.npmignore b/@interactjs/actions/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/actions/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/actions/LICENSE b/@interactjs/actions/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/actions/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/actions/actions.spec.d.ts b/@interactjs/actions/actions.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/actions/actions.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/actions/drag.d.ts b/@interactjs/actions/drag.d.ts new file mode 100644 index 000000000..08d5a0c49 --- /dev/null +++ b/@interactjs/actions/drag.d.ts @@ -0,0 +1,19 @@ +declare module '@interactjs/core/Interactable' { + interface Interactable { + draggable: DraggableMethod; + } +} +declare module '@interactjs/core/defaultOptions' { + interface ActionDefaults { + drag: Interact.DraggableOptions; + } +} +declare module '@interactjs/core/scope' { + interface ActionMap { + drag?: typeof drag; + } +} +export declare type DragEvent = Interact.InteractEvent<'drag'>; +export declare type DraggableMethod = Interact.ActionMethod; +declare const drag: Interact.Plugin; +export default drag; diff --git a/@interactjs/actions/drag.js b/@interactjs/actions/drag.js new file mode 100644 index 000000000..411e9cc0c --- /dev/null +++ b/@interactjs/actions/drag.js @@ -0,0 +1,162 @@ +import * as is from "../utils/is.js"; + +function install(scope) { + const { + actions, + Interactable, + defaults + } = scope; + Interactable.prototype.draggable = drag.draggable; + actions.map.drag = drag; + actions.methodDict.drag = 'draggable'; + defaults.actions.drag = drag.defaults; +} + +function beforeMove({ + interaction +}) { + if (interaction.prepared.name !== 'drag') { + return; + } + + const axis = interaction.prepared.axis; + + if (axis === 'x') { + interaction.coords.cur.page.y = interaction.coords.start.page.y; + interaction.coords.cur.client.y = interaction.coords.start.client.y; + interaction.coords.velocity.client.y = 0; + interaction.coords.velocity.page.y = 0; + } else if (axis === 'y') { + interaction.coords.cur.page.x = interaction.coords.start.page.x; + interaction.coords.cur.client.x = interaction.coords.start.client.x; + interaction.coords.velocity.client.x = 0; + interaction.coords.velocity.page.x = 0; + } +} + +function move({ + iEvent, + interaction +}) { + if (interaction.prepared.name !== 'drag') { + return; + } + + const axis = interaction.prepared.axis; + + if (axis === 'x' || axis === 'y') { + const opposite = axis === 'x' ? 'y' : 'x'; + iEvent.page[opposite] = interaction.coords.start.page[opposite]; + iEvent.client[opposite] = interaction.coords.start.client[opposite]; + iEvent.delta[opposite] = 0; + } +} +/** + * ```js + * interact(element).draggable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // the axis in which the first movement must be + * // for the drag sequence to start + * // 'xy' by default - any direction + * startAxis: 'x' || 'y' || 'xy', + * + * // 'xy' by default - don't restrict to one axis (move in any direction) + * // 'x' or 'y' to restrict movement to either axis + * // 'start' to restrict movement to the axis the drag started in + * lockAxis: 'x' || 'y' || 'xy' || 'start', + * + * // max number of drags that can happen concurrently + * // with elements of this Interactable. Infinity by default + * max: Infinity, + * + * // max number of drags that can target the same element+Interactable + * // 1 by default + * maxPerElement: 2 + * }) + * + * var isDraggable = interact('element').draggable(); // true + * ``` + * + * Get or set whether drag actions can be performed on the target + * + * @alias Interactable.prototype.draggable + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on drag events (object makes the Interactable + * draggable) + * @return {boolean | Interactable} boolean indicating if this can be the + * target of drag events, or this Interctable + */ + + +const draggable = function draggable(options) { + if (is.object(options)) { + this.options.drag.enabled = options.enabled !== false; + this.setPerAction('drag', options); + this.setOnEvents('drag', options); + + if (/^(xy|x|y|start)$/.test(options.lockAxis)) { + this.options.drag.lockAxis = options.lockAxis; + } + + if (/^(xy|x|y)$/.test(options.startAxis)) { + this.options.drag.startAxis = options.startAxis; + } + + return this; + } + + if (is.bool(options)) { + this.options.drag.enabled = options; + return this; + } + + return this.options.drag; +}; + +const drag = { + id: 'actions/drag', + install, + listeners: { + 'interactions:before-action-move': beforeMove, + 'interactions:action-resume': beforeMove, + // dragmove + 'interactions:action-move': move, + 'auto-start:check': arg => { + const { + interaction, + interactable, + buttons + } = arg; + const dragOptions = interactable.options.drag; + + if (!(dragOptions && dragOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & interactable.options.drag.mouseButtons) === 0) { + return undefined; + } + + arg.action = { + name: 'drag', + axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis + }; + return false; + } + }, + draggable, + beforeMove, + move, + defaults: { + startAxis: 'xy', + lockAxis: 'xy' + }, + + getCursor() { + return 'move'; + } + +}; +export default drag; +//# sourceMappingURL=drag.js.map \ No newline at end of file diff --git a/@interactjs/actions/drag.js.map b/@interactjs/actions/drag.js.map new file mode 100644 index 000000000..bee29317a --- /dev/null +++ b/@interactjs/actions/drag.js.map @@ -0,0 +1,61 @@ +{ + "version": 3, + "sources": [ + "drag.ts" + ], + "names": [ + "is", + "install", + "scope", + "actions", + "Interactable", + "defaults", + "prototype", + "draggable", + "drag", + "map", + "methodDict", + "beforeMove", + "interaction", + "prepared", + "name", + "axis", + "coords", + "cur", + "page", + "y", + "start", + "client", + "velocity", + "x", + "move", + "iEvent", + "opposite", + "delta", + "options", + "object", + "enabled", + "setPerAction", + "setOnEvents", + "test", + "lockAxis", + "startAxis", + "bool", + "id", + "listeners", + "arg", + "interactable", + "buttons", + "dragOptions", + "pointerIsDown", + "pointerType", + "mouseButtons", + "undefined", + "action", + "getCursor" + ], + "mappings": "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", + "sourcesContent": [ + "import { Scope } from '@interactjs/core/scope'\nimport * as is from '@interactjs/utils/is'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n draggable: DraggableMethod\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface ActionDefaults {\n drag: Interact.DraggableOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n drag?: typeof drag\n }\n}\n\nexport type DragEvent = Interact.InteractEvent<'drag'>\n\nexport type DraggableMethod = Interact.ActionMethod\n\nfunction install (scope: Scope) {\n const {\n actions,\n Interactable,\n defaults,\n } = scope\n\n Interactable.prototype.draggable = drag.draggable\n\n actions.map.drag = drag\n actions.methodDict.drag = 'draggable'\n\n defaults.actions.drag = drag.defaults\n}\n\nfunction beforeMove ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return }\n\n const axis = interaction.prepared.axis\n\n if (axis === 'x') {\n interaction.coords.cur.page.y = interaction.coords.start.page.y\n interaction.coords.cur.client.y = interaction.coords.start.client.y\n\n interaction.coords.velocity.client.y = 0\n interaction.coords.velocity.page.y = 0\n }\n else if (axis === 'y') {\n interaction.coords.cur.page.x = interaction.coords.start.page.x\n interaction.coords.cur.client.x = interaction.coords.start.client.x\n\n interaction.coords.velocity.client.x = 0\n interaction.coords.velocity.page.x = 0\n }\n}\n\nfunction move ({ iEvent, interaction }) {\n if (interaction.prepared.name !== 'drag') { return }\n\n const axis = interaction.prepared.axis\n\n if (axis === 'x' || axis === 'y') {\n const opposite = axis === 'x' ? 'y' : 'x'\n\n iEvent.page[opposite] = interaction.coords.start.page[opposite]\n iEvent.client[opposite] = interaction.coords.start.client[opposite]\n iEvent.delta[opposite] = 0\n }\n}\n\n/**\n * ```js\n * interact(element).draggable({\n * onstart: function (event) {},\n * onmove : function (event) {},\n * onend : function (event) {},\n *\n * // the axis in which the first movement must be\n * // for the drag sequence to start\n * // 'xy' by default - any direction\n * startAxis: 'x' || 'y' || 'xy',\n *\n * // 'xy' by default - don't restrict to one axis (move in any direction)\n * // 'x' or 'y' to restrict movement to either axis\n * // 'start' to restrict movement to the axis the drag started in\n * lockAxis: 'x' || 'y' || 'xy' || 'start',\n *\n * // max number of drags that can happen concurrently\n * // with elements of this Interactable. Infinity by default\n * max: Infinity,\n *\n * // max number of drags that can target the same element+Interactable\n * // 1 by default\n * maxPerElement: 2\n * })\n *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @alias Interactable.prototype.draggable\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\n */\nconst draggable: DraggableMethod = function draggable (this: Interact.Interactable, options?: Interact.DraggableOptions | boolean): any {\n if (is.object(options)) {\n this.options.drag.enabled = options.enabled !== false\n this.setPerAction('drag', options)\n this.setOnEvents('drag', options)\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis\n }\n\n return this\n }\n\n if (is.bool(options)) {\n this.options.drag.enabled = options\n\n return this\n }\n\n return this.options.drag\n}\n\nconst drag: Interact.Plugin = {\n id: 'actions/drag',\n install,\n listeners: {\n 'interactions:before-action-move': beforeMove,\n 'interactions:action-resume': beforeMove,\n\n // dragmove\n 'interactions:action-move': move,\n 'auto-start:check': arg => {\n const { interaction, interactable, buttons } = arg\n const dragOptions = interactable.options.drag\n\n if (\n !(dragOptions && dragOptions.enabled) ||\n // check mouseButton setting if the pointer is down\n (interaction.pointerIsDown &&\n /mouse|pointer/.test(interaction.pointerType) &&\n (buttons & interactable.options.drag.mouseButtons) === 0)\n ) {\n return undefined\n }\n\n arg.action = {\n name: 'drag',\n axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis),\n }\n\n return false\n },\n },\n draggable,\n beforeMove,\n move,\n defaults: {\n startAxis : 'xy',\n lockAxis : 'xy',\n } as Interact.DropzoneOptions,\n\n getCursor () {\n return 'move'\n },\n}\n\nexport default drag\n" + ] +} \ No newline at end of file diff --git a/@interactjs/actions/drag.min.js b/@interactjs/actions/drag.min.js new file mode 100644 index 000000000..fe6bc5cc4 --- /dev/null +++ b/@interactjs/actions/drag.min.js @@ -0,0 +1,2 @@ +import*as t from"../utils/is.min.js";function o({interaction:t}){if("drag"!==t.prepared.name)return;const o=t.prepared.axis;"x"===o?(t.coords.cur.page.y=t.coords.start.page.y,t.coords.cur.client.y=t.coords.start.client.y,t.coords.velocity.client.y=0,t.coords.velocity.page.y=0):"y"===o&&(t.coords.cur.page.x=t.coords.start.page.x,t.coords.cur.client.x=t.coords.start.client.x,t.coords.velocity.client.x=0,t.coords.velocity.page.x=0)}function e({iEvent:t,interaction:o}){if("drag"!==o.prepared.name)return;const e=o.prepared.axis;if("x"===e||"y"===e){const s="x"===e?"y":"x";t.page[s]=o.coords.start.page[s],t.client[s]=o.coords.start.client[s],t.delta[s]=0}}const s={id:"actions/drag",install(t){const{actions:o,Interactable:e,defaults:r}=t;e.prototype.draggable=s.draggable,o.map.drag=s,o.methodDict.drag="draggable",r.actions.drag=s.defaults},listeners:{"interactions:before-action-move":o,"interactions:action-resume":o,"interactions:action-move":e,"auto-start:check"(t){const{interaction:o,interactable:e,buttons:s}=t,r=e.options.drag;if(r&&r.enabled&&(!o.pointerIsDown||!/mouse|pointer/.test(o.pointerType)||0!=(s&e.options.drag.mouseButtons)))return t.action={name:"drag",axis:"start"===r.lockAxis?r.startAxis:r.lockAxis},!1}},draggable(o){return t.object(o)?(this.options.drag.enabled=!1!==o.enabled,this.setPerAction("drag",o),this.setOnEvents("drag",o),/^(xy|x|y|start)$/.test(o.lockAxis)&&(this.options.drag.lockAxis=o.lockAxis),/^(xy|x|y)$/.test(o.startAxis)&&(this.options.drag.startAxis=o.startAxis),this):t.bool(o)?(this.options.drag.enabled=o,this):this.options.drag},beforeMove:o,move:e,defaults:{startAxis:"xy",lockAxis:"xy"},getCursor:()=>"move"};export default s; +//# sourceMappingURL=drag.min.js.map \ No newline at end of file diff --git a/@interactjs/actions/drag.min.js.map b/@interactjs/actions/drag.min.js.map new file mode 100644 index 000000000..5820791ea --- /dev/null +++ b/@interactjs/actions/drag.min.js.map @@ -0,0 +1,65 @@ +{ + "version": 3, + "sources": [ + "drag.ts" + ], + "names": [ + "is", + "beforeMove", + "interaction", + "prepared", + "name", + "axis", + "coords", + "cur", + "page", + "y", + "start", + "client", + "velocity", + "x", + "move", + "iEvent", + "opposite", + "delta", + "drag", + "id", + "install", + "scope", + "actions", + "Interactable", + "defaults", + "prototype", + "draggable", + "map", + "methodDict", + "listeners", + "interactions:before-action-move", + "interactions:action-resume", + "interactions:action-move", + "[object Object]", + "arg", + "interactable", + "buttons", + "dragOptions", + "options", + "enabled", + "pointerIsDown", + "test", + "pointerType", + "mouseButtons", + "action", + "lockAxis", + "startAxis", + "object", + "this", + "setPerAction", + "setOnEvents", + "bool", + "getCursor" + ], + "mappings": "UACYA,MAAQ,qBAuCpB,SAASC,GAAYC,YAAEA,IACrB,GAAkC,SAA9BA,EAAYC,SAASC,KAAmB,OAE5C,MAAMC,EAAOH,EAAYC,SAASE,KAErB,MAATA,GACFH,EAAYI,OAAOC,IAAIC,KAAKC,EAAMP,EAAYI,OAAOI,MAAMF,KAAKC,EAChEP,EAAYI,OAAOC,IAAII,OAAOF,EAAIP,EAAYI,OAAOI,MAAMC,OAAOF,EAElEP,EAAYI,OAAOM,SAASD,OAAOF,EAAI,EACvCP,EAAYI,OAAOM,SAASJ,KAAKC,EAAM,GAEvB,MAATJ,IACPH,EAAYI,OAAOC,IAAIC,KAAKK,EAAMX,EAAYI,OAAOI,MAAMF,KAAKK,EAChEX,EAAYI,OAAOC,IAAII,OAAOE,EAAIX,EAAYI,OAAOI,MAAMC,OAAOE,EAElEX,EAAYI,OAAOM,SAASD,OAAOE,EAAI,EACvCX,EAAYI,OAAOM,SAASJ,KAAKK,EAAM,GAI3C,SAASC,GAAMC,OAAEA,EAAFb,YAAUA,IACvB,GAAkC,SAA9BA,EAAYC,SAASC,KAAmB,OAE5C,MAAMC,EAAOH,EAAYC,SAASE,KAElC,GAAa,MAATA,GAAyB,MAATA,EAAc,CAChC,MAAMW,EAAoB,MAATX,EAAe,IAAM,IAEtCU,EAAOP,KAAKQ,GAAcd,EAAYI,OAAOI,MAAMF,KAAKQ,GACxDD,EAAOJ,OAAOK,GAAYd,EAAYI,OAAOI,MAAMC,OAAOK,GAC1DD,EAAOE,MAAMD,GAAY,GA2C7B,MAyBME,EAAwB,CAC5BC,GAAI,eACJC,QApHgBC,GAChB,MAAMC,QACJA,EADIC,aAEJA,EAFIC,SAGJA,GACEH,EAEJE,EAAaE,UAAUC,UAAYR,EAAKQ,UAExCJ,EAAQK,IAAIT,KAAOA,EACnBI,EAAQM,WAAWV,KAAO,YAE1BM,EAASF,QAAQJ,KAAOA,EAAKM,UAyG7BK,UAAW,CACTC,kCAAmC7B,EACnC8B,6BAA8B9B,EAG9B+B,2BAA4BlB,EAC5BmB,mBAAoBC,GAClB,MAAMhC,YAAEA,EAAFiC,aAAeA,EAAfC,QAA6BA,GAAYF,EACzCG,EAAcF,EAAaG,QAAQpB,KAEzC,GACImB,GAAeA,EAAYE,WAE5BrC,EAAYsC,gBACZ,gBAAgBC,KAAKvC,EAAYwC,cACoB,IAAtDN,EAAUD,EAAaG,QAAQpB,KAAKyB,eAYtC,OAPAT,EAAIU,OAAS,CACXxC,KAAM,OACNC,KAAgC,UAAzBgC,EAAYQ,SACfR,EAAYS,UACZT,EAAYQ,WAGX,IAGXnB,UA1DkFY,GAClF,OAAItC,EAAG+C,OAAOT,IACZU,KAAKV,QAAQpB,KAAKqB,SAA8B,IAApBD,EAAQC,QACpCS,KAAKC,aAAa,OAAQX,GAC1BU,KAAKE,YAAY,OAAQZ,GAErB,mBAAmBG,KAAKH,EAAQO,YAClCG,KAAKV,QAAQpB,KAAK2B,SAAWP,EAAQO,UAEnC,aAAaJ,KAAKH,EAAQQ,aAC5BE,KAAKV,QAAQpB,KAAK4B,UAAYR,EAAQQ,WAGjCE,MAGLhD,EAAGmD,KAAKb,IACVU,KAAKV,QAAQpB,KAAKqB,QAAUD,EAErBU,MAGFA,KAAKV,QAAQpB,MAqCpBjB,WAAAA,EACAa,KAAAA,EACAU,SAAU,CACRsB,UAAY,KACZD,SAAY,MAGdO,UAAS,IACA,uBAIIlC", + "sourcesContent": [ + "import { Scope } from '@interactjs/core/scope'\nimport * as is from '@interactjs/utils/is'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n draggable: DraggableMethod\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface ActionDefaults {\n drag: Interact.DraggableOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n drag?: typeof drag\n }\n}\n\nexport type DragEvent = Interact.InteractEvent<'drag'>\n\nexport type DraggableMethod = Interact.ActionMethod\n\nfunction install (scope: Scope) {\n const {\n actions,\n Interactable,\n defaults,\n } = scope\n\n Interactable.prototype.draggable = drag.draggable\n\n actions.map.drag = drag\n actions.methodDict.drag = 'draggable'\n\n defaults.actions.drag = drag.defaults\n}\n\nfunction beforeMove ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return }\n\n const axis = interaction.prepared.axis\n\n if (axis === 'x') {\n interaction.coords.cur.page.y = interaction.coords.start.page.y\n interaction.coords.cur.client.y = interaction.coords.start.client.y\n\n interaction.coords.velocity.client.y = 0\n interaction.coords.velocity.page.y = 0\n }\n else if (axis === 'y') {\n interaction.coords.cur.page.x = interaction.coords.start.page.x\n interaction.coords.cur.client.x = interaction.coords.start.client.x\n\n interaction.coords.velocity.client.x = 0\n interaction.coords.velocity.page.x = 0\n }\n}\n\nfunction move ({ iEvent, interaction }) {\n if (interaction.prepared.name !== 'drag') { return }\n\n const axis = interaction.prepared.axis\n\n if (axis === 'x' || axis === 'y') {\n const opposite = axis === 'x' ? 'y' : 'x'\n\n iEvent.page[opposite] = interaction.coords.start.page[opposite]\n iEvent.client[opposite] = interaction.coords.start.client[opposite]\n iEvent.delta[opposite] = 0\n }\n}\n\n/**\n * ```js\n * interact(element).draggable({\n * onstart: function (event) {},\n * onmove : function (event) {},\n * onend : function (event) {},\n *\n * // the axis in which the first movement must be\n * // for the drag sequence to start\n * // 'xy' by default - any direction\n * startAxis: 'x' || 'y' || 'xy',\n *\n * // 'xy' by default - don't restrict to one axis (move in any direction)\n * // 'x' or 'y' to restrict movement to either axis\n * // 'start' to restrict movement to the axis the drag started in\n * lockAxis: 'x' || 'y' || 'xy' || 'start',\n *\n * // max number of drags that can happen concurrently\n * // with elements of this Interactable. Infinity by default\n * max: Infinity,\n *\n * // max number of drags that can target the same element+Interactable\n * // 1 by default\n * maxPerElement: 2\n * })\n *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @alias Interactable.prototype.draggable\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\n */\nconst draggable: DraggableMethod = function draggable (this: Interact.Interactable, options?: Interact.DraggableOptions | boolean): any {\n if (is.object(options)) {\n this.options.drag.enabled = options.enabled !== false\n this.setPerAction('drag', options)\n this.setOnEvents('drag', options)\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis\n }\n\n return this\n }\n\n if (is.bool(options)) {\n this.options.drag.enabled = options\n\n return this\n }\n\n return this.options.drag\n}\n\nconst drag: Interact.Plugin = {\n id: 'actions/drag',\n install,\n listeners: {\n 'interactions:before-action-move': beforeMove,\n 'interactions:action-resume': beforeMove,\n\n // dragmove\n 'interactions:action-move': move,\n 'auto-start:check': arg => {\n const { interaction, interactable, buttons } = arg\n const dragOptions = interactable.options.drag\n\n if (\n !(dragOptions && dragOptions.enabled) ||\n // check mouseButton setting if the pointer is down\n (interaction.pointerIsDown &&\n /mouse|pointer/.test(interaction.pointerType) &&\n (buttons & interactable.options.drag.mouseButtons) === 0)\n ) {\n return undefined\n }\n\n arg.action = {\n name: 'drag',\n axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis),\n }\n\n return false\n },\n },\n draggable,\n beforeMove,\n move,\n defaults: {\n startAxis : 'xy',\n lockAxis : 'xy',\n } as Interact.DropzoneOptions,\n\n getCursor () {\n return 'move'\n },\n}\n\nexport default drag\n" + ] +} \ No newline at end of file diff --git a/@interactjs/actions/drag.spec.d.ts b/@interactjs/actions/drag.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/actions/drag.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/actions/gesture.d.ts b/@interactjs/actions/gesture.d.ts new file mode 100644 index 000000000..73f8cf31d --- /dev/null +++ b/@interactjs/actions/gesture.d.ts @@ -0,0 +1,42 @@ +export declare type GesturableMethod = Interact.ActionMethod; +declare module '@interactjs/core/Interaction' { + interface Interaction { + gesture?: { + angle: number; + distance: number; + scale: number; + startAngle: number; + startDistance: number; + }; + } +} +declare module '@interactjs/core/Interactable' { + interface Interactable { + gesturable: GesturableMethod; + } +} +declare module '@interactjs/core/defaultOptions' { + interface ActionDefaults { + gesture: Interact.GesturableOptions; + } +} +declare module '@interactjs/core/scope' { + interface ActionMap { + gesture?: typeof gesture; + } +} +export interface GestureEvent extends Interact.InteractEvent<'gesture'> { + distance: number; + angle: number; + da: number; + scale: number; + ds: number; + box: Interact.Rect; + touches: Interact.PointerType[]; +} +export interface GestureSignalArg extends Interact.DoPhaseArg<'gesture', Interact.EventPhase> { + iEvent: GestureEvent; + interaction: Interact.Interaction<'gesture'>; +} +declare const gesture: Interact.Plugin; +export default gesture; diff --git a/@interactjs/actions/gesture.js b/@interactjs/actions/gesture.js new file mode 100644 index 000000000..02ce8942b --- /dev/null +++ b/@interactjs/actions/gesture.js @@ -0,0 +1,147 @@ +import * as utils from "../utils/index.js"; + +function install(scope) { + const { + actions, + Interactable, + defaults + } = scope; + /** + * ```js + * interact(element).gesturable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // limit multiple gestures. + * // See the explanation in {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isGestureable = interact(element).gesturable() + * ``` + * + * Gets or sets whether multitouch gestures can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on gesture events (makes the Interactable gesturable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of gesture events, or this Interactable + */ + + Interactable.prototype.gesturable = function (options) { + if (utils.is.object(options)) { + this.options.gesture.enabled = options.enabled !== false; + this.setPerAction('gesture', options); + this.setOnEvents('gesture', options); + return this; + } + + if (utils.is.bool(options)) { + this.options.gesture.enabled = options; + return this; + } + + return this.options.gesture; + }; + + actions.map.gesture = gesture; + actions.methodDict.gesture = 'gesturable'; + defaults.actions.gesture = gesture.defaults; +} + +function updateGestureProps({ + interaction, + iEvent, + phase +}) { + if (interaction.prepared.name !== 'gesture') { + return; + } + + const pointers = interaction.pointers.map(p => p.pointer); + const starting = phase === 'start'; + const ending = phase === 'end'; + const deltaSource = interaction.interactable.options.deltaSource; + iEvent.touches = [pointers[0], pointers[1]]; + + if (starting) { + iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource); + iEvent.box = utils.pointer.touchBBox(pointers); + iEvent.scale = 1; + iEvent.ds = 0; + iEvent.angle = utils.pointer.touchAngle(pointers, deltaSource); + iEvent.da = 0; + interaction.gesture.startDistance = iEvent.distance; + interaction.gesture.startAngle = iEvent.angle; + } else if (ending) { + const prevEvent = interaction.prevEvent; + iEvent.distance = prevEvent.distance; + iEvent.box = prevEvent.box; + iEvent.scale = prevEvent.scale; + iEvent.ds = 0; + iEvent.angle = prevEvent.angle; + iEvent.da = 0; + } else { + iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource); + iEvent.box = utils.pointer.touchBBox(pointers); + iEvent.scale = iEvent.distance / interaction.gesture.startDistance; + iEvent.angle = utils.pointer.touchAngle(pointers, deltaSource); + iEvent.ds = iEvent.scale - interaction.gesture.scale; + iEvent.da = iEvent.angle - interaction.gesture.angle; + } + + interaction.gesture.distance = iEvent.distance; + interaction.gesture.angle = iEvent.angle; + + if (utils.is.number(iEvent.scale) && iEvent.scale !== Infinity && !isNaN(iEvent.scale)) { + interaction.gesture.scale = iEvent.scale; + } +} + +const gesture = { + id: 'actions/gesture', + before: ['actions/drag', 'actions/resize'], + install, + listeners: { + 'interactions:action-start': updateGestureProps, + 'interactions:action-move': updateGestureProps, + 'interactions:action-end': updateGestureProps, + 'interactions:new': ({ + interaction + }) => { + interaction.gesture = { + angle: 0, + distance: 0, + scale: 1, + startAngle: 0, + startDistance: 0 + }; + }, + 'auto-start:check': arg => { + if (arg.interaction.pointers.length < 2) { + return undefined; + } + + const gestureOptions = arg.interactable.options.gesture; + + if (!(gestureOptions && gestureOptions.enabled)) { + return undefined; + } + + arg.action = { + name: 'gesture' + }; + return false; + } + }, + defaults: {}, + + getCursor() { + return ''; + } + +}; +export default gesture; +//# sourceMappingURL=gesture.js.map \ No newline at end of file diff --git a/@interactjs/actions/gesture.js.map b/@interactjs/actions/gesture.js.map new file mode 100644 index 000000000..9c3b744b1 --- /dev/null +++ b/@interactjs/actions/gesture.js.map @@ -0,0 +1,68 @@ +{ + "version": 3, + "sources": [ + "gesture.ts" + ], + "names": [ + "utils", + "install", + "scope", + "actions", + "Interactable", + "defaults", + "prototype", + "gesturable", + "options", + "is", + "object", + "gesture", + "enabled", + "setPerAction", + "setOnEvents", + "bool", + "map", + "methodDict", + "updateGestureProps", + "interaction", + "iEvent", + "phase", + "prepared", + "name", + "pointers", + "p", + "pointer", + "starting", + "ending", + "deltaSource", + "interactable", + "touches", + "distance", + "touchDistance", + "box", + "touchBBox", + "scale", + "ds", + "angle", + "touchAngle", + "da", + "startDistance", + "startAngle", + "prevEvent", + "number", + "Infinity", + "isNaN", + "id", + "before", + "listeners", + "arg", + "length", + "undefined", + "gestureOptions", + "action", + "getCursor" + ], + "mappings": "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", + "sourcesContent": [ + "import * as utils from '@interactjs/utils/index'\n\nexport type GesturableMethod = Interact.ActionMethod\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n gesture?: {\n angle: number // angle from first to second touch\n distance: number\n scale: number // gesture.distance / gesture.startDistance\n startAngle: number // angle of line joining two touches\n startDistance: number // distance between two touches of touchStart\n }\n }\n}\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n gesturable: GesturableMethod\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface ActionDefaults {\n gesture: Interact.GesturableOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n gesture?: typeof gesture\n }\n}\n\nexport interface GestureEvent extends Interact.InteractEvent<'gesture'> {\n distance: number\n angle: number\n da: number // angle change\n scale: number // ratio of distance start to current event\n ds: number // scale change\n box: Interact.Rect // enclosing box of all points\n touches: Interact.PointerType[]\n}\n\nexport interface GestureSignalArg extends Interact.DoPhaseArg<'gesture', Interact.EventPhase> {\n iEvent: GestureEvent\n interaction: Interact.Interaction<'gesture'>\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n actions,\n Interactable,\n defaults,\n } = scope\n\n /**\n * ```js\n * interact(element).gesturable({\n * onstart: function (event) {},\n * onmove : function (event) {},\n * onend : function (event) {},\n *\n * // limit multiple gestures.\n * // See the explanation in {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * })\n *\n * var isGestureable = interact(element).gesturable()\n * ```\n *\n * Gets or sets whether multitouch gestures can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on gesture events (makes the Interactable gesturable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of gesture events, or this Interactable\n */\n Interactable.prototype.gesturable = function (this: Interact.Interactable, options: Interact.GesturableOptions | boolean) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled !== false\n this.setPerAction('gesture', options)\n this.setOnEvents('gesture', options)\n\n return this\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options\n\n return this\n }\n\n return this.options.gesture as Interact.Options\n } as GesturableMethod\n\n actions.map.gesture = gesture\n actions.methodDict.gesture = 'gesturable'\n\n defaults.actions.gesture = gesture.defaults\n}\n\nfunction updateGestureProps ({ interaction, iEvent, phase }: GestureSignalArg) {\n if (interaction.prepared.name !== 'gesture') { return }\n\n const pointers = interaction.pointers.map(p => p.pointer)\n const starting = phase === 'start'\n const ending = phase === 'end'\n const deltaSource = interaction.interactable.options.deltaSource\n\n iEvent.touches = [pointers[0], pointers[1]]\n\n if (starting) {\n iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource)\n iEvent.box = utils.pointer.touchBBox(pointers)\n iEvent.scale = 1\n iEvent.ds = 0\n iEvent.angle = utils.pointer.touchAngle(pointers, deltaSource)\n iEvent.da = 0\n\n interaction.gesture.startDistance = iEvent.distance\n interaction.gesture.startAngle = iEvent.angle\n }\n else if (ending) {\n const prevEvent = interaction.prevEvent as GestureEvent\n\n iEvent.distance = prevEvent.distance\n iEvent.box = prevEvent.box\n iEvent.scale = prevEvent.scale\n iEvent.ds = 0\n iEvent.angle = prevEvent.angle\n iEvent.da = 0\n }\n else {\n iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource)\n iEvent.box = utils.pointer.touchBBox(pointers)\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance\n iEvent.angle = utils.pointer.touchAngle(pointers, deltaSource)\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale\n iEvent.da = iEvent.angle - interaction.gesture.angle\n }\n\n interaction.gesture.distance = iEvent.distance\n interaction.gesture.angle = iEvent.angle\n\n if (utils.is.number(iEvent.scale) &&\n iEvent.scale !== Infinity &&\n !isNaN(iEvent.scale)) {\n interaction.gesture.scale = iEvent.scale\n }\n}\n\nconst gesture: Interact.Plugin = {\n id: 'actions/gesture',\n before: ['actions/drag', 'actions/resize'],\n install,\n listeners: {\n 'interactions:action-start': updateGestureProps,\n 'interactions:action-move': updateGestureProps,\n 'interactions:action-end': updateGestureProps,\n\n 'interactions:new': ({ interaction }) => {\n interaction.gesture = {\n angle: 0,\n distance: 0,\n scale: 1,\n startAngle: 0,\n startDistance: 0,\n }\n },\n\n 'auto-start:check': arg => {\n if (arg.interaction.pointers.length < 2) {\n return undefined\n }\n\n const gestureOptions = arg.interactable.options.gesture\n\n if (!(gestureOptions && gestureOptions.enabled)) {\n return undefined\n }\n\n arg.action = { name: 'gesture' }\n\n return false\n },\n },\n\n defaults: {\n },\n\n getCursor () {\n return ''\n },\n}\n\nexport default gesture\n" + ] +} \ No newline at end of file diff --git a/@interactjs/actions/gesture.min.js b/@interactjs/actions/gesture.min.js new file mode 100644 index 000000000..d00f9d4b0 --- /dev/null +++ b/@interactjs/actions/gesture.min.js @@ -0,0 +1,2 @@ +import*as e from"../utils/index.min.js";function t({interaction:t,iEvent:s,phase:n}){if("gesture"!==t.prepared.name)return;const a=t.pointers.map(e=>e.pointer),i="start"===n,r="end"===n,o=t.interactable.options.deltaSource;if(s.touches=[a[0],a[1]],i)s.distance=e.pointer.touchDistance(a,o),s.box=e.pointer.touchBBox(a),s.scale=1,s.ds=0,s.angle=e.pointer.touchAngle(a,o),s.da=0,t.gesture.startDistance=s.distance,t.gesture.startAngle=s.angle;else if(r){const e=t.prevEvent;s.distance=e.distance,s.box=e.box,s.scale=e.scale,s.ds=0,s.angle=e.angle,s.da=0}else s.distance=e.pointer.touchDistance(a,o),s.box=e.pointer.touchBBox(a),s.scale=s.distance/t.gesture.startDistance,s.angle=e.pointer.touchAngle(a,o),s.ds=s.scale-t.gesture.scale,s.da=s.angle-t.gesture.angle;t.gesture.distance=s.distance,t.gesture.angle=s.angle,e.is.number(s.scale)&&s.scale!==1/0&&!isNaN(s.scale)&&(t.gesture.scale=s.scale)}const s={id:"actions/gesture",before:["actions/drag","actions/resize"],install(t){const{actions:n,Interactable:a,defaults:i}=t;a.prototype.gesturable=function(t){return e.is.object(t)?(this.options.gesture.enabled=!1!==t.enabled,this.setPerAction("gesture",t),this.setOnEvents("gesture",t),this):e.is.bool(t)?(this.options.gesture.enabled=t,this):this.options.gesture},n.map.gesture=s,n.methodDict.gesture="gesturable",i.actions.gesture=s.defaults},listeners:{"interactions:action-start":t,"interactions:action-move":t,"interactions:action-end":t,"interactions:new"({interaction:e}){e.gesture={angle:0,distance:0,scale:1,startAngle:0,startDistance:0}},"auto-start:check"(e){if(e.interaction.pointers.length<2)return;const t=e.interactable.options.gesture;return t&&t.enabled?(e.action={name:"gesture"},!1):void 0}},defaults:{},getCursor:()=>""};export default s; +//# sourceMappingURL=gesture.min.js.map \ No newline at end of file diff --git a/@interactjs/actions/gesture.min.js.map b/@interactjs/actions/gesture.min.js.map new file mode 100644 index 000000000..1069fd75d --- /dev/null +++ b/@interactjs/actions/gesture.min.js.map @@ -0,0 +1,72 @@ +{ + "version": 3, + "sources": [ + "gesture.ts" + ], + "names": [ + "utils", + "updateGestureProps", + "interaction", + "iEvent", + "phase", + "prepared", + "name", + "pointers", + "map", + "p", + "pointer", + "starting", + "ending", + "deltaSource", + "interactable", + "options", + "touches", + "distance", + "touchDistance", + "box", + "touchBBox", + "scale", + "ds", + "angle", + "touchAngle", + "da", + "gesture", + "startDistance", + "startAngle", + "prevEvent", + "is", + "number", + "Infinity", + "isNaN", + "id", + "before", + "install", + "scope", + "actions", + "Interactable", + "defaults", + "prototype", + "gesturable", + "object", + "this", + "enabled", + "setPerAction", + "setOnEvents", + "bool", + "methodDict", + "listeners", + "interactions:action-start", + "interactions:action-move", + "interactions:action-end", + "[object Object]", + "arg", + "length", + "gestureOptions", + "action", + "getCursor" + ], + "mappings": "UAAYA,MAAW,wBAuGvB,SAASC,GAAoBC,YAAEA,EAAFC,OAAeA,EAAfC,MAAuBA,IAClD,GAAkC,YAA9BF,EAAYG,SAASC,KAAsB,OAE/C,MAAMC,EAAWL,EAAYK,SAASC,IAAIC,GAAKA,EAAEC,SAC3CC,EAAqB,UAAVP,EACXQ,EAAmB,QAAVR,EACTS,EAAcX,EAAYY,aAAaC,QAAQF,YAIrD,GAFAV,EAAOa,QAAU,CAACT,EAAS,GAAIA,EAAS,IAEpCI,EACFR,EAAOc,SAAWjB,EAAMU,QAAQQ,cAAcX,EAAUM,GACxDV,EAAOgB,IAAWnB,EAAMU,QAAQU,UAAUb,GAC1CJ,EAAOkB,MAAW,EAClBlB,EAAOmB,GAAW,EAClBnB,EAAOoB,MAAWvB,EAAMU,QAAQc,WAAWjB,EAAUM,GACrDV,EAAOsB,GAAW,EAElBvB,EAAYwB,QAAQC,cAAgBxB,EAAOc,SAC3Cf,EAAYwB,QAAQE,WAAazB,EAAOoB,WAErC,GAAIX,EAAQ,CACf,MAAMiB,EAAY3B,EAAY2B,UAE9B1B,EAAOc,SAAWY,EAAUZ,SAC5Bd,EAAOgB,IAAWU,EAAUV,IAC5BhB,EAAOkB,MAAWQ,EAAUR,MAC5BlB,EAAOmB,GAAW,EAClBnB,EAAOoB,MAAWM,EAAUN,MAC5BpB,EAAOsB,GAAW,OAGlBtB,EAAOc,SAAWjB,EAAMU,QAAQQ,cAAcX,EAAUM,GACxDV,EAAOgB,IAAWnB,EAAMU,QAAQU,UAAUb,GAC1CJ,EAAOkB,MAAWlB,EAAOc,SAAWf,EAAYwB,QAAQC,cACxDxB,EAAOoB,MAAWvB,EAAMU,QAAQc,WAAWjB,EAAUM,GAErDV,EAAOmB,GAAKnB,EAAOkB,MAAQnB,EAAYwB,QAAQL,MAC/ClB,EAAOsB,GAAKtB,EAAOoB,MAAQrB,EAAYwB,QAAQH,MAGjDrB,EAAYwB,QAAQT,SAAWd,EAAOc,SACtCf,EAAYwB,QAAQH,MAAQpB,EAAOoB,MAE/BvB,EAAM8B,GAAGC,OAAO5B,EAAOkB,QACvBlB,EAAOkB,QAAUW,EAAAA,IAChBC,MAAM9B,EAAOkB,SAChBnB,EAAYwB,QAAQL,MAAQlB,EAAOkB,OAIvC,MAAMK,EAA2B,CAC/BQ,GAAI,kBACJC,OAAQ,CAAC,eAAgB,kBACzBC,QA5GgBC,GAChB,MAAMC,QACJA,EADIC,aAEJA,EAFIC,SAGJA,GACEH,EAyBJE,EAAaE,UAAUC,WAAa,SAAuC3B,GACzE,OAAIf,EAAM8B,GAAGa,OAAO5B,IAClB6B,KAAK7B,QAAQW,QAAQmB,SAA8B,IAApB9B,EAAQ8B,QACvCD,KAAKE,aAAa,UAAW/B,GAC7B6B,KAAKG,YAAY,UAAWhC,GAErB6B,MAGL5C,EAAM8B,GAAGkB,KAAKjC,IAChB6B,KAAK7B,QAAQW,QAAQmB,QAAU9B,EAExB6B,MAGFA,KAAK7B,QAAQW,SAGtBY,EAAQ9B,IAAIkB,QAAUA,EACtBY,EAAQW,WAAWvB,QAAU,aAE7Bc,EAASF,QAAQZ,QAAUA,EAAQc,UA0DnCU,UAAW,CACTC,4BAA6BlD,EAC7BmD,2BAA4BnD,EAC5BoD,0BAA2BpD,EAE3BqD,oBAAuBpD,YAAAA,IACrBA,EAAYwB,QAAU,CACpBH,MAAO,EACPN,SAAU,EACVI,MAAO,EACPO,WAAY,EACZD,cAAe,IAInB2B,mBAAoBC,GAClB,GAAIA,EAAIrD,YAAYK,SAASiD,OAAS,EACpC,OAGF,MAAMC,EAAiBF,EAAIzC,aAAaC,QAAQW,QAEhD,OAAM+B,GAAkBA,EAAeZ,SAIvCU,EAAIG,OAAS,CAAEpD,KAAM,YAEd,QANP,IAUJkC,SAAU,GAGVmB,UAAS,IACA,mBAIIjC", + "sourcesContent": [ + "import * as utils from '@interactjs/utils/index'\n\nexport type GesturableMethod = Interact.ActionMethod\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n gesture?: {\n angle: number // angle from first to second touch\n distance: number\n scale: number // gesture.distance / gesture.startDistance\n startAngle: number // angle of line joining two touches\n startDistance: number // distance between two touches of touchStart\n }\n }\n}\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n gesturable: GesturableMethod\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface ActionDefaults {\n gesture: Interact.GesturableOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n gesture?: typeof gesture\n }\n}\n\nexport interface GestureEvent extends Interact.InteractEvent<'gesture'> {\n distance: number\n angle: number\n da: number // angle change\n scale: number // ratio of distance start to current event\n ds: number // scale change\n box: Interact.Rect // enclosing box of all points\n touches: Interact.PointerType[]\n}\n\nexport interface GestureSignalArg extends Interact.DoPhaseArg<'gesture', Interact.EventPhase> {\n iEvent: GestureEvent\n interaction: Interact.Interaction<'gesture'>\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n actions,\n Interactable,\n defaults,\n } = scope\n\n /**\n * ```js\n * interact(element).gesturable({\n * onstart: function (event) {},\n * onmove : function (event) {},\n * onend : function (event) {},\n *\n * // limit multiple gestures.\n * // See the explanation in {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * })\n *\n * var isGestureable = interact(element).gesturable()\n * ```\n *\n * Gets or sets whether multitouch gestures can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on gesture events (makes the Interactable gesturable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of gesture events, or this Interactable\n */\n Interactable.prototype.gesturable = function (this: Interact.Interactable, options: Interact.GesturableOptions | boolean) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled !== false\n this.setPerAction('gesture', options)\n this.setOnEvents('gesture', options)\n\n return this\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options\n\n return this\n }\n\n return this.options.gesture as Interact.Options\n } as GesturableMethod\n\n actions.map.gesture = gesture\n actions.methodDict.gesture = 'gesturable'\n\n defaults.actions.gesture = gesture.defaults\n}\n\nfunction updateGestureProps ({ interaction, iEvent, phase }: GestureSignalArg) {\n if (interaction.prepared.name !== 'gesture') { return }\n\n const pointers = interaction.pointers.map(p => p.pointer)\n const starting = phase === 'start'\n const ending = phase === 'end'\n const deltaSource = interaction.interactable.options.deltaSource\n\n iEvent.touches = [pointers[0], pointers[1]]\n\n if (starting) {\n iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource)\n iEvent.box = utils.pointer.touchBBox(pointers)\n iEvent.scale = 1\n iEvent.ds = 0\n iEvent.angle = utils.pointer.touchAngle(pointers, deltaSource)\n iEvent.da = 0\n\n interaction.gesture.startDistance = iEvent.distance\n interaction.gesture.startAngle = iEvent.angle\n }\n else if (ending) {\n const prevEvent = interaction.prevEvent as GestureEvent\n\n iEvent.distance = prevEvent.distance\n iEvent.box = prevEvent.box\n iEvent.scale = prevEvent.scale\n iEvent.ds = 0\n iEvent.angle = prevEvent.angle\n iEvent.da = 0\n }\n else {\n iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource)\n iEvent.box = utils.pointer.touchBBox(pointers)\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance\n iEvent.angle = utils.pointer.touchAngle(pointers, deltaSource)\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale\n iEvent.da = iEvent.angle - interaction.gesture.angle\n }\n\n interaction.gesture.distance = iEvent.distance\n interaction.gesture.angle = iEvent.angle\n\n if (utils.is.number(iEvent.scale) &&\n iEvent.scale !== Infinity &&\n !isNaN(iEvent.scale)) {\n interaction.gesture.scale = iEvent.scale\n }\n}\n\nconst gesture: Interact.Plugin = {\n id: 'actions/gesture',\n before: ['actions/drag', 'actions/resize'],\n install,\n listeners: {\n 'interactions:action-start': updateGestureProps,\n 'interactions:action-move': updateGestureProps,\n 'interactions:action-end': updateGestureProps,\n\n 'interactions:new': ({ interaction }) => {\n interaction.gesture = {\n angle: 0,\n distance: 0,\n scale: 1,\n startAngle: 0,\n startDistance: 0,\n }\n },\n\n 'auto-start:check': arg => {\n if (arg.interaction.pointers.length < 2) {\n return undefined\n }\n\n const gestureOptions = arg.interactable.options.gesture\n\n if (!(gestureOptions && gestureOptions.enabled)) {\n return undefined\n }\n\n arg.action = { name: 'gesture' }\n\n return false\n },\n },\n\n defaults: {\n },\n\n getCursor () {\n return ''\n },\n}\n\nexport default gesture\n" + ] +} \ No newline at end of file diff --git a/@interactjs/actions/gesture.spec.d.ts b/@interactjs/actions/gesture.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/actions/gesture.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/actions/index.d.ts b/@interactjs/actions/index.d.ts new file mode 100644 index 000000000..9c9ed42ae --- /dev/null +++ b/@interactjs/actions/index.d.ts @@ -0,0 +1,11 @@ +import { Scope } from '@interactjs/core/scope'; +import drag from './drag'; +import drop from './drop/index'; +import gesture from './gesture'; +import resize from './resize'; +declare const _default: { + id: string; + install(scope: Scope): void; +}; +export default _default; +export { gesture, resize, drag, drop, }; diff --git a/@interactjs/actions/index.js b/@interactjs/actions/index.js new file mode 100644 index 000000000..d23173f06 --- /dev/null +++ b/@interactjs/actions/index.js @@ -0,0 +1,17 @@ +import drag from "./drag.js"; +import drop from "./drop/index.js"; +import gesture from "./gesture.js"; +import resize from "./resize.js"; +export default { + id: 'actions', + + install(scope) { + scope.usePlugin(gesture); + scope.usePlugin(resize); + scope.usePlugin(drag); + scope.usePlugin(drop); + } + +}; +export { gesture, resize, drag, drop }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/actions/index.js.map b/@interactjs/actions/index.js.map new file mode 100644 index 000000000..f36e58b00 --- /dev/null +++ b/@interactjs/actions/index.js.map @@ -0,0 +1,20 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "drag", + "drop", + "gesture", + "resize", + "id", + "install", + "scope", + "usePlugin" + ], + "mappings": "AACA,OAAOA,IAAP,MAAiB,WAAjB;AACA,OAAOC,IAAP,MAAiB,iBAAjB;AACA,OAAOC,OAAP,MAAoB,cAApB;AACA,OAAOC,MAAP,MAAmB,aAAnB;AAEA,eAAe;AACbC,EAAAA,EAAE,EAAE,SADS;;AAEbC,EAAAA,OAAO,CAAEC,KAAF,EAAgB;AACrBA,IAAAA,KAAK,CAACC,SAAN,CAAgBL,OAAhB;AACAI,IAAAA,KAAK,CAACC,SAAN,CAAgBJ,MAAhB;AACAG,IAAAA,KAAK,CAACC,SAAN,CAAgBP,IAAhB;AACAM,IAAAA,KAAK,CAACC,SAAN,CAAgBN,IAAhB;AACD;;AAPY,CAAf;AAUA,SACEC,OADF,EAEEC,MAFF,EAGEH,IAHF,EAIEC,IAJF", + "sourcesContent": [ + "import { Scope } from '@interactjs/core/scope'\nimport drag from './drag'\nimport drop from './drop/index'\nimport gesture from './gesture'\nimport resize from './resize'\n\nexport default {\n id: 'actions',\n install (scope: Scope) {\n scope.usePlugin(gesture)\n scope.usePlugin(resize)\n scope.usePlugin(drag)\n scope.usePlugin(drop)\n },\n}\n\nexport {\n gesture,\n resize,\n drag,\n drop,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/actions/index.min.js b/@interactjs/actions/index.min.js new file mode 100644 index 000000000..1a740ed42 --- /dev/null +++ b/@interactjs/actions/index.min.js @@ -0,0 +1,2 @@ +import i from"./drag.min.js";import r from"./drop/index.min.js";import e from"./gesture.min.js";import m from"./resize.min.js";export default{id:"actions",install(o){o.usePlugin(e),o.usePlugin(m),o.usePlugin(i),o.usePlugin(r)}};export{e as gesture,m as resize,i as drag,r as drop}; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/actions/index.min.js.map b/@interactjs/actions/index.min.js.map new file mode 100644 index 000000000..d46d5f7ac --- /dev/null +++ b/@interactjs/actions/index.min.js.map @@ -0,0 +1,20 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "drag", + "drop", + "gesture", + "resize", + "id", + "install", + "scope", + "usePlugin" + ], + "mappings": "OACOA,MAAU,uBACVC,MAAU,6BACVC,MAAa,0BACbC,MAAY,gCAEJ,CACbC,GAAI,UACJC,QAASC,GACPA,EAAMC,UAAUL,GAChBI,EAAMC,UAAUJ,GAChBG,EAAMC,UAAUP,GAChBM,EAAMC,UAAUN,YAKlBC,aACAC,YACAH,UACAC", + "sourcesContent": [ + "import { Scope } from '@interactjs/core/scope'\nimport drag from './drag'\nimport drop from './drop/index'\nimport gesture from './gesture'\nimport resize from './resize'\n\nexport default {\n id: 'actions',\n install (scope: Scope) {\n scope.usePlugin(gesture)\n scope.usePlugin(resize)\n scope.usePlugin(drag)\n scope.usePlugin(drop)\n },\n}\n\nexport {\n gesture,\n resize,\n drag,\n drop,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/actions/resize.d.ts b/@interactjs/actions/resize.d.ts new file mode 100644 index 000000000..1d050a5f2 --- /dev/null +++ b/@interactjs/actions/resize.d.ts @@ -0,0 +1,29 @@ +export declare type EdgeName = 'top' | 'left' | 'bottom' | 'right'; +export declare type ResizableMethod = Interact.ActionMethod; +declare module '@interactjs/core/Interactable' { + interface Interactable { + resizable: ResizableMethod; + } +} +declare module '@interactjs/core/Interaction' { + interface Interaction { + resizeAxes: 'x' | 'y' | 'xy'; + resizeStartAspectRatio: number; + } +} +declare module '@interactjs/core/defaultOptions' { + interface ActionDefaults { + resize: Interact.ResizableOptions; + } +} +declare module '@interactjs/core/scope' { + interface ActionMap { + resize?: typeof resize; + } +} +export interface ResizeEvent

extends Interact.InteractEvent<'resize', P> { + deltaRect?: Interact.FullRect; + edges?: Interact.ActionProps['edges']; +} +declare const resize: Interact.Plugin; +export default resize; diff --git a/@interactjs/actions/resize.js b/@interactjs/actions/resize.js new file mode 100644 index 000000000..6c3078aa5 --- /dev/null +++ b/@interactjs/actions/resize.js @@ -0,0 +1,446 @@ +import { Interaction } from "../core/Interaction.js"; +import * as dom from "../utils/domUtils.js"; +import extend from "../utils/extend.js"; +import * as is from "../utils/is.js"; + +function install(scope) { + const { + actions, + browser, + + /** @lends Interactable */ + Interactable, + // tslint:disable-line no-shadowed-variable + defaults + } = scope; // Less Precision with touch input + + resize.cursors = initCursors(browser); + resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10; + /** + * ```js + * interact(element).resizable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * edges: { + * top : true, // Use pointer coords to check for resize. + * left : false, // Disable resizing from left edge. + * bottom: '.resize-s',// Resize if pointer target matches selector + * right : handleEl // Resize if pointer target is the given Element + * }, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height are adjusted at a 1:1 ratio. + * square: false, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height maintain the aspect ratio they had when resizing started. + * preserveAspectRatio: false, + * + * // a value of 'none' will limit the resize rect to a minimum of 0x0 + * // 'negate' will allow the rect to have negative width/height + * // 'reposition' will keep the width/height positive by swapping + * // the top and bottom edges and/or swapping the left and right edges + * invert: 'none' || 'negate' || 'reposition' + * + * // limit multiple resizes. + * // See the explanation in the {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isResizeable = interact(element).resizable() + * ``` + * + * Gets or sets whether resize actions can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on resize events (object makes the Interactable + * resizable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of resize elements, or this Interactable + */ + + Interactable.prototype.resizable = function (options) { + return resizable(this, options, scope); + }; + + actions.map.resize = resize; + actions.methodDict.resize = 'resizable'; + defaults.actions.resize = resize.defaults; +} + +function resizeChecker(arg) { + const { + interaction, + interactable, + element, + rect, + buttons + } = arg; + + if (!rect) { + return undefined; + } + + const page = extend({}, interaction.coords.cur.page); + const resizeOptions = interactable.options.resize; + + if (!(resizeOptions && resizeOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & resizeOptions.mouseButtons) === 0) { + return undefined; + } // if using resize.edges + + + if (is.object(resizeOptions.edges)) { + const resizeEdges = { + left: false, + right: false, + top: false, + bottom: false + }; + + for (const edge in resizeEdges) { + resizeEdges[edge] = checkResizeEdge(edge, resizeOptions.edges[edge], page, interaction._latestPointer.eventTarget, element, rect, resizeOptions.margin || resize.defaultMargin); + } + + resizeEdges.left = resizeEdges.left && !resizeEdges.right; + resizeEdges.top = resizeEdges.top && !resizeEdges.bottom; + + if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) { + arg.action = { + name: 'resize', + edges: resizeEdges + }; + } + } else { + const right = resizeOptions.axis !== 'y' && page.x > rect.right - resize.defaultMargin; + const bottom = resizeOptions.axis !== 'x' && page.y > rect.bottom - resize.defaultMargin; + + if (right || bottom) { + arg.action = { + name: 'resize', + axes: (right ? 'x' : '') + (bottom ? 'y' : '') + }; + } + } + + return arg.action ? false : undefined; +} + +function resizable(interactable, options, scope) { + if (is.object(options)) { + interactable.options.resize.enabled = options.enabled !== false; + interactable.setPerAction('resize', options); + interactable.setOnEvents('resize', options); + + if (is.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) { + interactable.options.resize.axis = options.axis; + } else if (options.axis === null) { + interactable.options.resize.axis = scope.defaults.actions.resize.axis; + } + + if (is.bool(options.preserveAspectRatio)) { + interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio; + } else if (is.bool(options.square)) { + interactable.options.resize.square = options.square; + } + + return interactable; + } + + if (is.bool(options)) { + interactable.options.resize.enabled = options; + return interactable; + } + + return interactable.options.resize; +} + +function checkResizeEdge(name, value, page, element, interactableElement, rect, margin) { + // false, '', undefined, null + if (!value) { + return false; + } // true value, use pointer coords and element rect + + + if (value === true) { + // if dimensions are negative, "switch" edges + const width = is.number(rect.width) ? rect.width : rect.right - rect.left; + const height = is.number(rect.height) ? rect.height : rect.bottom - rect.top; // don't use margin greater than half the relevent dimension + + margin = Math.min(margin, (name === 'left' || name === 'right' ? width : height) / 2); + + if (width < 0) { + if (name === 'left') { + name = 'right'; + } else if (name === 'right') { + name = 'left'; + } + } + + if (height < 0) { + if (name === 'top') { + name = 'bottom'; + } else if (name === 'bottom') { + name = 'top'; + } + } + + if (name === 'left') { + return page.x < (width >= 0 ? rect.left : rect.right) + margin; + } + + if (name === 'top') { + return page.y < (height >= 0 ? rect.top : rect.bottom) + margin; + } + + if (name === 'right') { + return page.x > (width >= 0 ? rect.right : rect.left) - margin; + } + + if (name === 'bottom') { + return page.y > (height >= 0 ? rect.bottom : rect.top) - margin; + } + } // the remaining checks require an element + + + if (!is.element(element)) { + return false; + } + + return is.element(value) // the value is an element to use as a resize handle + ? value === element // otherwise check if element matches value as selector + : dom.matchesUpTo(element, value, interactableElement); +} + +function initCursors(browser) { + return browser.isIe9 ? { + x: 'e-resize', + y: 's-resize', + xy: 'se-resize', + top: 'n-resize', + left: 'w-resize', + bottom: 's-resize', + right: 'e-resize', + topleft: 'se-resize', + bottomright: 'se-resize', + topright: 'ne-resize', + bottomleft: 'ne-resize' + } : { + x: 'ew-resize', + y: 'ns-resize', + xy: 'nwse-resize', + top: 'ns-resize', + left: 'ew-resize', + bottom: 'ns-resize', + right: 'ew-resize', + topleft: 'nwse-resize', + bottomright: 'nwse-resize', + topright: 'nesw-resize', + bottomleft: 'nesw-resize' + }; +} + +function start({ + iEvent, + interaction +}) { + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + const resizeEvent = iEvent; + const rect = interaction.rect; + interaction._rects = { + start: extend({}, rect), + corrected: extend({}, rect), + previous: extend({}, rect), + delta: { + left: 0, + right: 0, + width: 0, + top: 0, + bottom: 0, + height: 0 + } + }; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function move({ + iEvent, + interaction +}) { + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + const resizeEvent = iEvent; + const resizeOptions = interaction.interactable.options.resize; + const invert = resizeOptions.invert; + const invertible = invert === 'reposition' || invert === 'negate'; // eslint-disable-next-line no-shadow + + const current = interaction.rect; + const { + start: startRect, + corrected, + delta: deltaRect, + previous + } = interaction._rects; + extend(previous, corrected); + + if (invertible) { + // if invertible, copy the current rect + extend(corrected, current); + + if (invert === 'reposition') { + // swap edge values if necessary to keep width/height positive + if (corrected.top > corrected.bottom) { + const swap = corrected.top; + corrected.top = corrected.bottom; + corrected.bottom = swap; + } + + if (corrected.left > corrected.right) { + const swap = corrected.left; + corrected.left = corrected.right; + corrected.right = swap; + } + } + } else { + // if not invertible, restrict to minimum of 0x0 rect + corrected.top = Math.min(current.top, startRect.bottom); + corrected.bottom = Math.max(current.bottom, startRect.top); + corrected.left = Math.min(current.left, startRect.right); + corrected.right = Math.max(current.right, startRect.left); + } + + corrected.width = corrected.right - corrected.left; + corrected.height = corrected.bottom - corrected.top; + + for (const edge in corrected) { + deltaRect[edge] = corrected[edge] - previous[edge]; + } + + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = corrected; + resizeEvent.deltaRect = deltaRect; +} + +function end({ + iEvent, + interaction +}) { + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + const resizeEvent = iEvent; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function updateEventAxes({ + iEvent, + interaction +}) { + if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) { + return; + } + + const options = interaction.interactable.options; + const resizeEvent = iEvent; + + if (options.resize.square) { + if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = resizeEvent.delta.y; + } else { + resizeEvent.delta.y = resizeEvent.delta.x; + } + + resizeEvent.axes = 'xy'; + } else { + resizeEvent.axes = interaction.resizeAxes; + + if (interaction.resizeAxes === 'x') { + resizeEvent.delta.y = 0; + } else if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = 0; + } + } +} + +const resize = { + id: 'actions/resize', + before: ['actions/drag'], + install, + listeners: { + 'interactions:new': ({ + interaction + }) => { + interaction.resizeAxes = 'xy'; + }, + 'interactions:action-start': arg => { + start(arg); + updateEventAxes(arg); + }, + 'interactions:action-move': arg => { + move(arg); + updateEventAxes(arg); + }, + 'interactions:action-end': end, + 'auto-start:check': resizeChecker + }, + defaults: { + square: false, + preserveAspectRatio: false, + axis: 'xy', + // use default margin + margin: NaN, + // object with props left, right, top, bottom which are + // true/false values to resize when the pointer is over that edge, + // CSS selectors to match the handles for each direction + // or the Elements for each handle + edges: null, + // a value of 'none' will limit the resize rect to a minimum of 0x0 + // 'negate' will alow the rect to have negative width/height + // 'reposition' will keep the width/height positive by swapping + // the top and bottom edges and/or swapping the left and right edges + invert: 'none' + }, + cursors: null, + + getCursor({ + edges, + axis, + name + }) { + const cursors = resize.cursors; + let result = null; + + if (axis) { + result = cursors[name + axis]; + } else if (edges) { + let cursorKey = ''; + + for (const edge of ['top', 'bottom', 'left', 'right']) { + if (edges[edge]) { + cursorKey += edge; + } + } + + result = cursors[cursorKey]; + } + + return result; + }, + + defaultMargin: null +}; +export default resize; +//# sourceMappingURL=resize.js.map \ No newline at end of file diff --git a/@interactjs/actions/resize.js.map b/@interactjs/actions/resize.js.map new file mode 100644 index 000000000..dd1052798 --- /dev/null +++ b/@interactjs/actions/resize.js.map @@ -0,0 +1,114 @@ +{ + "version": 3, + "sources": [ + "resize.ts" + ], + "names": [ + "Interaction", + "dom", + "extend", + "is", + "install", + "scope", + "actions", + "browser", + "Interactable", + "defaults", + "resize", + "cursors", + "initCursors", + "defaultMargin", + "supportsTouch", + "supportsPointerEvent", + "prototype", + "resizable", + "options", + "map", + "methodDict", + "resizeChecker", + "arg", + "interaction", + "interactable", + "element", + "rect", + "buttons", + "undefined", + "page", + "coords", + "cur", + "resizeOptions", + "enabled", + "pointerIsDown", + "test", + "pointerType", + "mouseButtons", + "object", + "edges", + "resizeEdges", + "left", + "right", + "top", + "bottom", + "edge", + "checkResizeEdge", + "_latestPointer", + "eventTarget", + "margin", + "action", + "name", + "axis", + "x", + "y", + "axes", + "setPerAction", + "setOnEvents", + "string", + "bool", + "preserveAspectRatio", + "square", + "value", + "interactableElement", + "width", + "number", + "height", + "Math", + "min", + "matchesUpTo", + "isIe9", + "xy", + "topleft", + "bottomright", + "topright", + "bottomleft", + "start", + "iEvent", + "prepared", + "resizeEvent", + "_rects", + "corrected", + "previous", + "delta", + "deltaRect", + "move", + "invert", + "invertible", + "current", + "startRect", + "swap", + "max", + "end", + "updateEventAxes", + "resizeAxes", + "id", + "before", + "listeners", + "NaN", + "getCursor", + "result", + "cursorKey" + ], + "mappings": "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", + "sourcesContent": [ + "import { Interaction } from '@interactjs/core/Interaction'\nimport { Scope } from '@interactjs/core/scope'\nimport * as dom from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport * as is from '@interactjs/utils/is'\n\nexport type EdgeName = 'top' | 'left' | 'bottom' | 'right'\n\nexport type ResizableMethod = Interact.ActionMethod\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n resizable: ResizableMethod\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n resizeAxes: 'x' | 'y' | 'xy'\n resizeStartAspectRatio: number\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface ActionDefaults {\n resize: Interact.ResizableOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n resize?: typeof resize\n }\n}\n\nexport interface ResizeEvent

extends Interact.InteractEvent<'resize', P> {\n deltaRect?: Interact.FullRect\n edges?: Interact.ActionProps['edges']\n}\n\nfunction install (scope: Scope) {\n const {\n actions,\n browser,\n /** @lends Interactable */\n Interactable, // tslint:disable-line no-shadowed-variable\n defaults,\n } = scope\n\n // Less Precision with touch input\n\n resize.cursors = initCursors(browser)\n resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10\n\n /**\n * ```js\n * interact(element).resizable({\n * onstart: function (event) {},\n * onmove : function (event) {},\n * onend : function (event) {},\n *\n * edges: {\n * top : true, // Use pointer coords to check for resize.\n * left : false, // Disable resizing from left edge.\n * bottom: '.resize-s',// Resize if pointer target matches selector\n * right : handleEl // Resize if pointer target is the given Element\n * },\n *\n * // Width and height can be adjusted independently. When `true`, width and\n * // height are adjusted at a 1:1 ratio.\n * square: false,\n *\n * // Width and height can be adjusted independently. When `true`, width and\n * // height maintain the aspect ratio they had when resizing started.\n * preserveAspectRatio: false,\n *\n * // a value of 'none' will limit the resize rect to a minimum of 0x0\n * // 'negate' will allow the rect to have negative width/height\n * // 'reposition' will keep the width/height positive by swapping\n * // the top and bottom edges and/or swapping the left and right edges\n * invert: 'none' || 'negate' || 'reposition'\n *\n * // limit multiple resizes.\n * // See the explanation in the {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * })\n *\n * var isResizeable = interact(element).resizable()\n * ```\n *\n * Gets or sets whether resize actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on resize events (object makes the Interactable\n * resizable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of resize elements, or this Interactable\n */\n Interactable.prototype.resizable = function (this: Interact.Interactable, options: Interact.ResizableOptions | boolean) {\n return resizable(this, options, scope)\n } as ResizableMethod\n\n actions.map.resize = resize\n actions.methodDict.resize = 'resizable'\n\n defaults.actions.resize = resize.defaults\n}\n\nfunction resizeChecker (arg) {\n const { interaction, interactable, element, rect, buttons } = arg\n\n if (!rect) { return undefined }\n\n const page = extend({}, interaction.coords.cur.page)\n const resizeOptions = interactable.options.resize\n\n if (\n !(resizeOptions && resizeOptions.enabled) ||\n // check mouseButton setting if the pointer is down\n (interaction.pointerIsDown &&\n /mouse|pointer/.test(interaction.pointerType) &&\n (buttons & resizeOptions.mouseButtons) === 0)\n ) {\n return undefined\n }\n\n // if using resize.edges\n if (is.object(resizeOptions.edges)) {\n const resizeEdges = {\n left: false,\n right: false,\n top: false,\n bottom: false,\n }\n\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._latestPointer.eventTarget,\n element,\n rect,\n resizeOptions.margin || resize.defaultMargin)\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n arg.action = {\n name: 'resize',\n edges: resizeEdges,\n }\n }\n }\n else {\n const right = resizeOptions.axis !== 'y' && page.x > (rect.right - resize.defaultMargin)\n const bottom = resizeOptions.axis !== 'x' && page.y > (rect.bottom - resize.defaultMargin)\n\n if (right || bottom) {\n arg.action = {\n name: 'resize',\n axes: (right ? 'x' : '') + (bottom ? 'y' : ''),\n }\n }\n }\n\n return arg.action ? false : undefined\n}\n\nfunction resizable (interactable: Interact.Interactable, options: Interact.OrBoolean | boolean, scope: Scope) {\n if (is.object(options)) {\n interactable.options.resize.enabled = options.enabled !== false\n interactable.setPerAction('resize', options)\n interactable.setOnEvents('resize', options)\n\n if (is.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) {\n interactable.options.resize.axis = options.axis\n }\n else if (options.axis === null) {\n interactable.options.resize.axis = scope.defaults.actions.resize.axis\n }\n\n if (is.bool(options.preserveAspectRatio)) {\n interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio\n }\n else if (is.bool(options.square)) {\n interactable.options.resize.square = options.square\n }\n\n return interactable\n }\n if (is.bool(options)) {\n interactable.options.resize.enabled = options\n\n return interactable\n }\n return interactable.options.resize\n}\n\nfunction checkResizeEdge (\n name: string,\n value: any,\n page: Interact.Point,\n element: Node,\n interactableElement: Interact.Element,\n rect: Interact.Rect,\n margin: number,\n) {\n // false, '', undefined, null\n if (!value) { return false }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = is.number(rect.width) ? rect.width : rect.right - rect.left\n const height = is.number(rect.height) ? rect.height : rect.bottom - rect.top\n\n // don't use margin greater than half the relevent dimension\n margin = Math.min(margin, (name === 'left' || name === 'right' ? width : height) / 2)\n\n if (width < 0) {\n if (name === 'left') { name = 'right' }\n else if (name === 'right') { name = 'left' }\n }\n if (height < 0) {\n if (name === 'top') { name = 'bottom' }\n else if (name === 'bottom') { name = 'top' }\n }\n\n if (name === 'left') { return page.x < ((width >= 0 ? rect.left : rect.right) + margin) }\n if (name === 'top') { return page.y < ((height >= 0 ? rect.top : rect.bottom) + margin) }\n\n if (name === 'right') { return page.x > ((width >= 0 ? rect.right : rect.left) - margin) }\n if (name === 'bottom') { return page.y > ((height >= 0 ? rect.bottom : rect.top) - margin) }\n }\n\n // the remaining checks require an element\n if (!is.element(element)) { return false }\n\n return is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : dom.matchesUpTo(element, value, interactableElement)\n}\n\nfunction initCursors (browser: typeof import ('@interactjs/utils/browser').default) {\n return (browser.isIe9 ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n })\n}\n\nfunction start ({ iEvent, interaction }: { iEvent: Interact.InteractEvent, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {\n return\n }\n\n const resizeEvent = iEvent as ResizeEvent\n const rect = interaction.rect\n\n interaction._rects = {\n start: extend({}, rect),\n corrected: extend({}, rect),\n previous: extend({}, rect),\n delta: {\n left: 0,\n right : 0,\n width : 0,\n top : 0,\n bottom: 0,\n height: 0,\n },\n }\n\n resizeEvent.edges = interaction.prepared.edges\n resizeEvent.rect = interaction._rects.corrected\n resizeEvent.deltaRect = interaction._rects.delta\n}\n\nfunction move ({ iEvent, interaction }: { iEvent: Interact.InteractEvent, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { return }\n\n const resizeEvent = iEvent as ResizeEvent\n const resizeOptions = interaction.interactable.options.resize\n const invert = resizeOptions.invert\n const invertible = invert === 'reposition' || invert === 'negate'\n\n // eslint-disable-next-line no-shadow\n const current = interaction.rect\n const { start: startRect, corrected, delta: deltaRect, previous } = interaction._rects\n\n extend(previous, corrected)\n\n if (invertible) {\n // if invertible, copy the current rect\n extend(corrected, current)\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n if (corrected.top > corrected.bottom) {\n const swap = corrected.top\n\n corrected.top = corrected.bottom\n corrected.bottom = swap\n }\n if (corrected.left > corrected.right) {\n const swap = corrected.left\n\n corrected.left = corrected.right\n corrected.right = swap\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n corrected.top = Math.min(current.top, startRect.bottom)\n corrected.bottom = Math.max(current.bottom, startRect.top)\n corrected.left = Math.min(current.left, startRect.right)\n corrected.right = Math.max(current.right, startRect.left)\n }\n\n corrected.width = corrected.right - corrected.left\n corrected.height = corrected.bottom - corrected.top\n\n for (const edge in corrected) {\n deltaRect[edge] = corrected[edge] - previous[edge]\n }\n\n resizeEvent.edges = interaction.prepared.edges\n resizeEvent.rect = corrected\n resizeEvent.deltaRect = deltaRect\n}\n\nfunction end ({ iEvent, interaction }: { iEvent: Interact.InteractEvent, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { return }\n\n const resizeEvent = iEvent as ResizeEvent\n\n resizeEvent.edges = interaction.prepared.edges\n resizeEvent.rect = interaction._rects.corrected\n resizeEvent.deltaRect = interaction._rects.delta\n}\n\nfunction updateEventAxes ({ iEvent, interaction }: { iEvent: Interact.InteractEvent, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) { return }\n\n const options = interaction.interactable.options\n const resizeEvent = iEvent as ResizeEvent\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n resizeEvent.delta.x = resizeEvent.delta.y\n }\n else {\n resizeEvent.delta.y = resizeEvent.delta.x\n }\n resizeEvent.axes = 'xy'\n }\n else {\n resizeEvent.axes = interaction.resizeAxes\n\n if (interaction.resizeAxes === 'x') {\n resizeEvent.delta.y = 0\n }\n else if (interaction.resizeAxes === 'y') {\n resizeEvent.delta.x = 0\n }\n }\n}\n\nconst resize: Interact.Plugin = {\n id: 'actions/resize',\n before: ['actions/drag'],\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.resizeAxes = 'xy'\n },\n\n 'interactions:action-start': arg => {\n start(arg)\n updateEventAxes(arg)\n },\n 'interactions:action-move': arg => {\n move(arg)\n updateEventAxes(arg)\n },\n 'interactions:action-end': end,\n 'auto-start:check': resizeChecker,\n },\n\n defaults: {\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n } as Interact.ResizableOptions,\n\n cursors: null as ReturnType,\n\n getCursor ({ edges, axis, name }: Interact.ActionProps) {\n const cursors = resize.cursors\n let result: string = null\n\n if (axis) {\n result = cursors[name + axis]\n }\n else if (edges) {\n let cursorKey = ''\n\n for (const edge of ['top', 'bottom', 'left', 'right']) {\n if (edges[edge]) {\n cursorKey += edge\n }\n }\n\n result = cursors[cursorKey]\n }\n\n return result\n },\n\n defaultMargin: null as number,\n}\n\nexport default resize\n" + ] +} \ No newline at end of file diff --git a/@interactjs/actions/resize.min.js b/@interactjs/actions/resize.min.js new file mode 100644 index 000000000..7e6ab1409 --- /dev/null +++ b/@interactjs/actions/resize.min.js @@ -0,0 +1,2 @@ +import{Interaction as e}from"../core/Interaction.min.js";import*as t from"../utils/domUtils.min.js";import r from"../utils/extend.min.js";import*as i from"../utils/is.min.js";function s(e,r,s,o,n,a,c){if(!r)return!1;if(!0===r){const t=i.number(a.width)?a.width:a.right-a.left,r=i.number(a.height)?a.height:a.bottom-a.top;if(c=Math.min(c,("left"===e||"right"===e?t:r)/2),t<0&&("left"===e?e="right":"right"===e&&(e="left")),r<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return s.x<(t>=0?a.left:a.right)+c;if("top"===e)return s.y<(r>=0?a.top:a.bottom)+c;if("right"===e)return s.x>(t>=0?a.right:a.left)-c;if("bottom"===e)return s.y>(r>=0?a.bottom:a.top)-c}return!!i.element(o)&&(i.element(r)?r===o:t.matchesUpTo(o,r,n))}function o({iEvent:e,interaction:t}){if("resize"!==t.prepared.name||!t.resizeAxes)return;const r=e;t.interactable.options.resize.square?("y"===t.resizeAxes?r.delta.x=r.delta.y:r.delta.y=r.delta.x,r.axes="xy"):(r.axes=t.resizeAxes,"x"===t.resizeAxes?r.delta.y=0:"y"===t.resizeAxes&&(r.delta.x=0))}const n={id:"actions/resize",before:["actions/drag"],install(e){const{actions:t,browser:r,Interactable:s,defaults:o}=e;n.cursors=function(e){return e.isIe9?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"}}(r),n.defaultMargin=r.supportsTouch||r.supportsPointerEvent?20:10,s.prototype.resizable=function(t){return function(e,t,r){if(i.object(t))return e.options.resize.enabled=!1!==t.enabled,e.setPerAction("resize",t),e.setOnEvents("resize",t),i.string(t.axis)&&/^x$|^y$|^xy$/.test(t.axis)?e.options.resize.axis=t.axis:null===t.axis&&(e.options.resize.axis=r.defaults.actions.resize.axis),i.bool(t.preserveAspectRatio)?e.options.resize.preserveAspectRatio=t.preserveAspectRatio:i.bool(t.square)&&(e.options.resize.square=t.square),e;if(i.bool(t))return e.options.resize.enabled=t,e;return e.options.resize}(this,t,e)},t.map.resize=n,t.methodDict.resize="resizable",o.actions.resize=n.defaults},listeners:{"interactions:new"({interaction:e}){e.resizeAxes="xy"},"interactions:action-start"(e){!function({iEvent:e,interaction:t}){if("resize"!==t.prepared.name||!t.prepared.edges)return;const i=e,s=t.rect;t._rects={start:r({},s),corrected:r({},s),previous:r({},s),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},i.edges=t.prepared.edges,i.rect=t._rects.corrected,i.deltaRect=t._rects.delta}(e),o(e)},"interactions:action-move"(e){!function({iEvent:e,interaction:t}){if("resize"!==t.prepared.name||!t.prepared.edges)return;const i=e,s=t.interactable.options.resize.invert,o="reposition"===s||"negate"===s,n=t.rect,{start:a,corrected:c,delta:l,previous:p}=t._rects;if(r(p,c),o){if(r(c,n),"reposition"===s){if(c.top>c.bottom){const e=c.top;c.top=c.bottom,c.bottom=e}if(c.left>c.right){const e=c.left;c.left=c.right,c.right=e}}}else c.top=Math.min(n.top,a.bottom),c.bottom=Math.max(n.bottom,a.top),c.left=Math.min(n.left,a.right),c.right=Math.max(n.right,a.left);c.width=c.right-c.left,c.height=c.bottom-c.top;for(const e in c)l[e]=c[e]-p[e];i.edges=t.prepared.edges,i.rect=c,i.deltaRect=l}(e),o(e)},"interactions:action-end"({iEvent:e,interaction:t}){if("resize"!==t.prepared.name||!t.prepared.edges)return;const r=e;r.edges=t.prepared.edges,r.rect=t._rects.corrected,r.deltaRect=t._rects.delta},"auto-start:check"(e){const{interaction:t,interactable:o,element:a,rect:c,buttons:l}=e;if(!c)return;const p=r({},t.coords.cur.page),f=o.options.resize;if(f&&f.enabled&&(!t.pointerIsDown||!/mouse|pointer/.test(t.pointerType)||0!=(l&f.mouseButtons))){if(i.object(f.edges)){const r={left:!1,right:!1,top:!1,bottom:!1};for(const e in r)r[e]=s(e,f.edges[e],p,t._latestPointer.eventTarget,a,c,f.margin||n.defaultMargin);r.left=r.left&&!r.right,r.top=r.top&&!r.bottom,(r.left||r.right||r.top||r.bottom)&&(e.action={name:"resize",edges:r})}else{const t="y"!==f.axis&&p.x>c.right-n.defaultMargin,r="x"!==f.axis&&p.y>c.bottom-n.defaultMargin;(t||r)&&(e.action={name:"resize",axes:(t?"x":"")+(r?"y":"")})}return!e.action&&void 0}}},defaults:{square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},cursors:null,getCursor({edges:e,axis:t,name:r}){const i=n.cursors;let s=null;if(t)s=i[r+t];else if(e){let t="";for(const r of["top","bottom","left","right"])e[r]&&(t+=r);s=i[t]}return s},defaultMargin:null};export default n; +//# sourceMappingURL=resize.min.js.map \ No newline at end of file diff --git a/@interactjs/actions/resize.min.js.map b/@interactjs/actions/resize.min.js.map new file mode 100644 index 000000000..b2251e9aa --- /dev/null +++ b/@interactjs/actions/resize.min.js.map @@ -0,0 +1,114 @@ +{ + "version": 3, + "sources": [ + "resize.ts" + ], + "names": [ + "Interaction", + "dom", + "extend", + "is", + "checkResizeEdge", + "name", + "value", + "page", + "element", + "interactableElement", + "rect", + "margin", + "width", + "number", + "right", + "left", + "height", + "bottom", + "top", + "Math", + "min", + "x", + "y", + "matchesUpTo", + "updateEventAxes", + "iEvent", + "interaction", + "prepared", + "resizeAxes", + "resizeEvent", + "interactable", + "options", + "resize", + "square", + "delta", + "axes", + "id", + "before", + "install", + "scope", + "actions", + "browser", + "Interactable", + "defaults", + "cursors", + "isIe9", + "xy", + "topleft", + "bottomright", + "topright", + "bottomleft", + "initCursors", + "defaultMargin", + "supportsTouch", + "supportsPointerEvent", + "prototype", + "resizable", + "object", + "enabled", + "setPerAction", + "setOnEvents", + "string", + "axis", + "test", + "bool", + "preserveAspectRatio", + "this", + "map", + "methodDict", + "listeners", + "[object Object]", + "arg", + "edges", + "_rects", + "start", + "corrected", + "previous", + "deltaRect", + "invert", + "invertible", + "current", + "startRect", + "swap", + "max", + "edge", + "move", + "buttons", + "coords", + "cur", + "resizeOptions", + "pointerIsDown", + "pointerType", + "mouseButtons", + "resizeEdges", + "_latestPointer", + "eventTarget", + "action", + "undefined", + "NaN", + "getCursor", + "result", + "cursorKey" + ], + "mappings": "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", + "sourcesContent": [ + "import { Interaction } from '@interactjs/core/Interaction'\nimport { Scope } from '@interactjs/core/scope'\nimport * as dom from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport * as is from '@interactjs/utils/is'\n\nexport type EdgeName = 'top' | 'left' | 'bottom' | 'right'\n\nexport type ResizableMethod = Interact.ActionMethod\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n resizable: ResizableMethod\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n resizeAxes: 'x' | 'y' | 'xy'\n resizeStartAspectRatio: number\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface ActionDefaults {\n resize: Interact.ResizableOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n resize?: typeof resize\n }\n}\n\nexport interface ResizeEvent

extends Interact.InteractEvent<'resize', P> {\n deltaRect?: Interact.FullRect\n edges?: Interact.ActionProps['edges']\n}\n\nfunction install (scope: Scope) {\n const {\n actions,\n browser,\n /** @lends Interactable */\n Interactable, // tslint:disable-line no-shadowed-variable\n defaults,\n } = scope\n\n // Less Precision with touch input\n\n resize.cursors = initCursors(browser)\n resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10\n\n /**\n * ```js\n * interact(element).resizable({\n * onstart: function (event) {},\n * onmove : function (event) {},\n * onend : function (event) {},\n *\n * edges: {\n * top : true, // Use pointer coords to check for resize.\n * left : false, // Disable resizing from left edge.\n * bottom: '.resize-s',// Resize if pointer target matches selector\n * right : handleEl // Resize if pointer target is the given Element\n * },\n *\n * // Width and height can be adjusted independently. When `true`, width and\n * // height are adjusted at a 1:1 ratio.\n * square: false,\n *\n * // Width and height can be adjusted independently. When `true`, width and\n * // height maintain the aspect ratio they had when resizing started.\n * preserveAspectRatio: false,\n *\n * // a value of 'none' will limit the resize rect to a minimum of 0x0\n * // 'negate' will allow the rect to have negative width/height\n * // 'reposition' will keep the width/height positive by swapping\n * // the top and bottom edges and/or swapping the left and right edges\n * invert: 'none' || 'negate' || 'reposition'\n *\n * // limit multiple resizes.\n * // See the explanation in the {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * })\n *\n * var isResizeable = interact(element).resizable()\n * ```\n *\n * Gets or sets whether resize actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on resize events (object makes the Interactable\n * resizable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of resize elements, or this Interactable\n */\n Interactable.prototype.resizable = function (this: Interact.Interactable, options: Interact.ResizableOptions | boolean) {\n return resizable(this, options, scope)\n } as ResizableMethod\n\n actions.map.resize = resize\n actions.methodDict.resize = 'resizable'\n\n defaults.actions.resize = resize.defaults\n}\n\nfunction resizeChecker (arg) {\n const { interaction, interactable, element, rect, buttons } = arg\n\n if (!rect) { return undefined }\n\n const page = extend({}, interaction.coords.cur.page)\n const resizeOptions = interactable.options.resize\n\n if (\n !(resizeOptions && resizeOptions.enabled) ||\n // check mouseButton setting if the pointer is down\n (interaction.pointerIsDown &&\n /mouse|pointer/.test(interaction.pointerType) &&\n (buttons & resizeOptions.mouseButtons) === 0)\n ) {\n return undefined\n }\n\n // if using resize.edges\n if (is.object(resizeOptions.edges)) {\n const resizeEdges = {\n left: false,\n right: false,\n top: false,\n bottom: false,\n }\n\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._latestPointer.eventTarget,\n element,\n rect,\n resizeOptions.margin || resize.defaultMargin)\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n arg.action = {\n name: 'resize',\n edges: resizeEdges,\n }\n }\n }\n else {\n const right = resizeOptions.axis !== 'y' && page.x > (rect.right - resize.defaultMargin)\n const bottom = resizeOptions.axis !== 'x' && page.y > (rect.bottom - resize.defaultMargin)\n\n if (right || bottom) {\n arg.action = {\n name: 'resize',\n axes: (right ? 'x' : '') + (bottom ? 'y' : ''),\n }\n }\n }\n\n return arg.action ? false : undefined\n}\n\nfunction resizable (interactable: Interact.Interactable, options: Interact.OrBoolean | boolean, scope: Scope) {\n if (is.object(options)) {\n interactable.options.resize.enabled = options.enabled !== false\n interactable.setPerAction('resize', options)\n interactable.setOnEvents('resize', options)\n\n if (is.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) {\n interactable.options.resize.axis = options.axis\n }\n else if (options.axis === null) {\n interactable.options.resize.axis = scope.defaults.actions.resize.axis\n }\n\n if (is.bool(options.preserveAspectRatio)) {\n interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio\n }\n else if (is.bool(options.square)) {\n interactable.options.resize.square = options.square\n }\n\n return interactable\n }\n if (is.bool(options)) {\n interactable.options.resize.enabled = options\n\n return interactable\n }\n return interactable.options.resize\n}\n\nfunction checkResizeEdge (\n name: string,\n value: any,\n page: Interact.Point,\n element: Node,\n interactableElement: Interact.Element,\n rect: Interact.Rect,\n margin: number,\n) {\n // false, '', undefined, null\n if (!value) { return false }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = is.number(rect.width) ? rect.width : rect.right - rect.left\n const height = is.number(rect.height) ? rect.height : rect.bottom - rect.top\n\n // don't use margin greater than half the relevent dimension\n margin = Math.min(margin, (name === 'left' || name === 'right' ? width : height) / 2)\n\n if (width < 0) {\n if (name === 'left') { name = 'right' }\n else if (name === 'right') { name = 'left' }\n }\n if (height < 0) {\n if (name === 'top') { name = 'bottom' }\n else if (name === 'bottom') { name = 'top' }\n }\n\n if (name === 'left') { return page.x < ((width >= 0 ? rect.left : rect.right) + margin) }\n if (name === 'top') { return page.y < ((height >= 0 ? rect.top : rect.bottom) + margin) }\n\n if (name === 'right') { return page.x > ((width >= 0 ? rect.right : rect.left) - margin) }\n if (name === 'bottom') { return page.y > ((height >= 0 ? rect.bottom : rect.top) - margin) }\n }\n\n // the remaining checks require an element\n if (!is.element(element)) { return false }\n\n return is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : dom.matchesUpTo(element, value, interactableElement)\n}\n\nfunction initCursors (browser: typeof import ('@interactjs/utils/browser').default) {\n return (browser.isIe9 ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n })\n}\n\nfunction start ({ iEvent, interaction }: { iEvent: Interact.InteractEvent, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {\n return\n }\n\n const resizeEvent = iEvent as ResizeEvent\n const rect = interaction.rect\n\n interaction._rects = {\n start: extend({}, rect),\n corrected: extend({}, rect),\n previous: extend({}, rect),\n delta: {\n left: 0,\n right : 0,\n width : 0,\n top : 0,\n bottom: 0,\n height: 0,\n },\n }\n\n resizeEvent.edges = interaction.prepared.edges\n resizeEvent.rect = interaction._rects.corrected\n resizeEvent.deltaRect = interaction._rects.delta\n}\n\nfunction move ({ iEvent, interaction }: { iEvent: Interact.InteractEvent, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { return }\n\n const resizeEvent = iEvent as ResizeEvent\n const resizeOptions = interaction.interactable.options.resize\n const invert = resizeOptions.invert\n const invertible = invert === 'reposition' || invert === 'negate'\n\n // eslint-disable-next-line no-shadow\n const current = interaction.rect\n const { start: startRect, corrected, delta: deltaRect, previous } = interaction._rects\n\n extend(previous, corrected)\n\n if (invertible) {\n // if invertible, copy the current rect\n extend(corrected, current)\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n if (corrected.top > corrected.bottom) {\n const swap = corrected.top\n\n corrected.top = corrected.bottom\n corrected.bottom = swap\n }\n if (corrected.left > corrected.right) {\n const swap = corrected.left\n\n corrected.left = corrected.right\n corrected.right = swap\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n corrected.top = Math.min(current.top, startRect.bottom)\n corrected.bottom = Math.max(current.bottom, startRect.top)\n corrected.left = Math.min(current.left, startRect.right)\n corrected.right = Math.max(current.right, startRect.left)\n }\n\n corrected.width = corrected.right - corrected.left\n corrected.height = corrected.bottom - corrected.top\n\n for (const edge in corrected) {\n deltaRect[edge] = corrected[edge] - previous[edge]\n }\n\n resizeEvent.edges = interaction.prepared.edges\n resizeEvent.rect = corrected\n resizeEvent.deltaRect = deltaRect\n}\n\nfunction end ({ iEvent, interaction }: { iEvent: Interact.InteractEvent, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { return }\n\n const resizeEvent = iEvent as ResizeEvent\n\n resizeEvent.edges = interaction.prepared.edges\n resizeEvent.rect = interaction._rects.corrected\n resizeEvent.deltaRect = interaction._rects.delta\n}\n\nfunction updateEventAxes ({ iEvent, interaction }: { iEvent: Interact.InteractEvent, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) { return }\n\n const options = interaction.interactable.options\n const resizeEvent = iEvent as ResizeEvent\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n resizeEvent.delta.x = resizeEvent.delta.y\n }\n else {\n resizeEvent.delta.y = resizeEvent.delta.x\n }\n resizeEvent.axes = 'xy'\n }\n else {\n resizeEvent.axes = interaction.resizeAxes\n\n if (interaction.resizeAxes === 'x') {\n resizeEvent.delta.y = 0\n }\n else if (interaction.resizeAxes === 'y') {\n resizeEvent.delta.x = 0\n }\n }\n}\n\nconst resize: Interact.Plugin = {\n id: 'actions/resize',\n before: ['actions/drag'],\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.resizeAxes = 'xy'\n },\n\n 'interactions:action-start': arg => {\n start(arg)\n updateEventAxes(arg)\n },\n 'interactions:action-move': arg => {\n move(arg)\n updateEventAxes(arg)\n },\n 'interactions:action-end': end,\n 'auto-start:check': resizeChecker,\n },\n\n defaults: {\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n } as Interact.ResizableOptions,\n\n cursors: null as ReturnType,\n\n getCursor ({ edges, axis, name }: Interact.ActionProps) {\n const cursors = resize.cursors\n let result: string = null\n\n if (axis) {\n result = cursors[name + axis]\n }\n else if (edges) {\n let cursorKey = ''\n\n for (const edge of ['top', 'bottom', 'left', 'right']) {\n if (edges[edge]) {\n cursorKey += edge\n }\n }\n\n result = cursors[cursorKey]\n }\n\n return result\n },\n\n defaultMargin: null as number,\n}\n\nexport default resize\n" + ] +} \ No newline at end of file diff --git a/@interactjs/actions/resize.spec.d.ts b/@interactjs/actions/resize.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/actions/resize.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/auto-scroll/.npmignore b/@interactjs/auto-scroll/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/auto-scroll/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/auto-scroll/LICENSE b/@interactjs/auto-scroll/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/auto-scroll/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/auto-scroll/index.d.ts b/@interactjs/auto-scroll/index.d.ts new file mode 100644 index 000000000..b898a5dde --- /dev/null +++ b/@interactjs/auto-scroll/index.d.ts @@ -0,0 +1,61 @@ +declare module '@interactjs/core/scope' { + interface Scope { + autoScroll: typeof autoScroll; + } +} +declare module '@interactjs/core/Interaction' { + interface Interaction { + autoScroll?: typeof autoScroll; + } +} +declare module '@interactjs/core/defaultOptions' { + interface PerActionDefaults { + autoScroll?: AutoScrollOptions; + } +} +export interface AutoScrollOptions { + container?: Window | HTMLElement; + margin?: number; + distance?: number; + interval?: number; + speed?: number; + enabled?: boolean; +} +declare const autoScroll: { + defaults: AutoScrollOptions; + now: () => number; + interaction: import("@interactjs/core/Interaction").Interaction; + i: number; + x: number; + y: number; + isScrolling: boolean; + prevTime: number; + margin: number; + speed: number; + start(interaction: import("@interactjs/core/Interaction").Interaction): void; + stop(): void; + scroll(): void; + check(interactable: import("@interactjs/core/Interactable").Interactable, actionName: "resize" | "drag" | "drop" | "gesture"): boolean; + onInteractionMove({ interaction, pointer }: { + interaction: import("@interactjs/core/Interaction").Interaction; + pointer: import("@interactjs/types/types").PointerType; + }): void; +}; +export declare function getContainer(value: any, interactable: Interact.Interactable, element: Interact.Element): any; +export declare function getScroll(container: any): { + x: any; + y: any; +}; +export declare function getScrollSize(container: any): { + x: any; + y: any; +}; +export declare function getScrollSizeDelta({ interaction, element }: { + interaction: Partial>; + element: Interact.Element; +}, func: any): { + x: number; + y: number; +}; +declare const autoScrollPlugin: Interact.Plugin; +export default autoScrollPlugin; diff --git a/@interactjs/auto-scroll/index.js b/@interactjs/auto-scroll/index.js new file mode 100644 index 000000000..14df97ef8 --- /dev/null +++ b/@interactjs/auto-scroll/index.js @@ -0,0 +1,246 @@ +import * as domUtils from "../utils/domUtils.js"; +import * as is from "../utils/is.js"; +import raf from "../utils/raf.js"; +import { getStringOptionResult } from "../utils/rect.js"; +import { getWindow } from "../utils/window.js"; + +function install(scope) { + const { + defaults, + actions + } = scope; + scope.autoScroll = autoScroll; + + autoScroll.now = () => scope.now(); + + actions.phaselessTypes.autoscroll = true; + defaults.perAction.autoScroll = autoScroll.defaults; +} + +const autoScroll = { + defaults: { + enabled: false, + margin: 60, + // the item that is scrolled (Window or HTMLElement) + container: null, + // the scroll speed in pixels per second + speed: 300 + }, + now: Date.now, + interaction: null, + i: 0, + // the handle returned by window.setInterval + // Direction each pulse is to scroll in + x: 0, + y: 0, + isScrolling: false, + prevTime: 0, + margin: 0, + speed: 0, + + start(interaction) { + autoScroll.isScrolling = true; + raf.cancel(autoScroll.i); + interaction.autoScroll = autoScroll; + autoScroll.interaction = interaction; + autoScroll.prevTime = autoScroll.now(); + autoScroll.i = raf.request(autoScroll.scroll); + }, + + stop() { + autoScroll.isScrolling = false; + + if (autoScroll.interaction) { + autoScroll.interaction.autoScroll = null; + } + + raf.cancel(autoScroll.i); + }, + + // scroll the window by the values in scroll.x/y + scroll() { + const { + interaction + } = autoScroll; + const { + interactable, + element + } = interaction; + const actionName = interaction.prepared.name; + const options = interactable.options[actionName].autoScroll; + const container = getContainer(options.container, interactable, element); + const now = autoScroll.now(); // change in time in seconds + + const dt = (now - autoScroll.prevTime) / 1000; // displacement + + const s = options.speed * dt; + + if (s >= 1) { + const scrollBy = { + x: autoScroll.x * s, + y: autoScroll.y * s + }; + + if (scrollBy.x || scrollBy.y) { + const prevScroll = getScroll(container); + + if (is.window(container)) { + container.scrollBy(scrollBy.x, scrollBy.y); + } else if (container) { + container.scrollLeft += scrollBy.x; + container.scrollTop += scrollBy.y; + } + + const curScroll = getScroll(container); + const delta = { + x: curScroll.x - prevScroll.x, + y: curScroll.y - prevScroll.y + }; + + if (delta.x || delta.y) { + interactable.fire({ + type: 'autoscroll', + target: element, + interactable, + delta, + interaction, + container + }); + } + } + + autoScroll.prevTime = now; + } + + if (autoScroll.isScrolling) { + raf.cancel(autoScroll.i); + autoScroll.i = raf.request(autoScroll.scroll); + } + }, + + check(interactable, actionName) { + const options = interactable.options; + return options[actionName].autoScroll && options[actionName].autoScroll.enabled; + }, + + onInteractionMove({ + interaction, + pointer + }) { + if (!(interaction.interacting() && autoScroll.check(interaction.interactable, interaction.prepared.name))) { + return; + } + + if (interaction.simulation) { + autoScroll.x = autoScroll.y = 0; + return; + } + + let top; + let right; + let bottom; + let left; + const { + interactable, + element + } = interaction; + const actionName = interaction.prepared.name; + const options = interactable.options[actionName].autoScroll; + const container = getContainer(options.container, interactable, element); + + if (is.window(container)) { + left = pointer.clientX < autoScroll.margin; + top = pointer.clientY < autoScroll.margin; + right = pointer.clientX > container.innerWidth - autoScroll.margin; + bottom = pointer.clientY > container.innerHeight - autoScroll.margin; + } else { + const rect = domUtils.getElementClientRect(container); + left = pointer.clientX < rect.left + autoScroll.margin; + top = pointer.clientY < rect.top + autoScroll.margin; + right = pointer.clientX > rect.right - autoScroll.margin; + bottom = pointer.clientY > rect.bottom - autoScroll.margin; + } + + autoScroll.x = right ? 1 : left ? -1 : 0; + autoScroll.y = bottom ? 1 : top ? -1 : 0; + + if (!autoScroll.isScrolling) { + // set the autoScroll properties to those of the target + autoScroll.margin = options.margin; + autoScroll.speed = options.speed; + autoScroll.start(interaction); + } + } + +}; +export function getContainer(value, interactable, element) { + return (is.string(value) ? getStringOptionResult(value, interactable, element) : value) || getWindow(element); +} +export function getScroll(container) { + if (is.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollLeft, + y: container.scrollTop + }; +} +export function getScrollSize(container) { + if (is.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollWidth, + y: container.scrollHeight + }; +} +export function getScrollSizeDelta({ + interaction, + element +}, func) { + const scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll; + + if (!scrollOptions || !scrollOptions.enabled) { + func(); + return { + x: 0, + y: 0 + }; + } + + const scrollContainer = getContainer(scrollOptions.container, interaction.interactable, element); + const prevSize = getScroll(scrollContainer); + func(); + const curSize = getScroll(scrollContainer); + return { + x: curSize.x - prevSize.x, + y: curSize.y - prevSize.y + }; +} +const autoScrollPlugin = { + id: 'auto-scroll', + install, + listeners: { + 'interactions:new': ({ + interaction + }) => { + interaction.autoScroll = null; + }, + 'interactions:destroy': ({ + interaction + }) => { + interaction.autoScroll = null; + autoScroll.stop(); + + if (autoScroll.interaction) { + autoScroll.interaction = null; + } + }, + 'interactions:stop': autoScroll.stop, + 'interactions:action-move': arg => autoScroll.onInteractionMove(arg) + } +}; +export default autoScrollPlugin; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/auto-scroll/index.js.map b/@interactjs/auto-scroll/index.js.map new file mode 100644 index 000000000..f712d0db3 --- /dev/null +++ b/@interactjs/auto-scroll/index.js.map @@ -0,0 +1,94 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "domUtils", + "is", + "raf", + "getStringOptionResult", + "getWindow", + "install", + "scope", + "defaults", + "actions", + "autoScroll", + "now", + "phaselessTypes", + "autoscroll", + "perAction", + "enabled", + "margin", + "container", + "speed", + "Date", + "interaction", + "i", + "x", + "y", + "isScrolling", + "prevTime", + "start", + "cancel", + "request", + "scroll", + "stop", + "interactable", + "element", + "actionName", + "prepared", + "name", + "options", + "getContainer", + "dt", + "s", + "scrollBy", + "prevScroll", + "getScroll", + "window", + "scrollLeft", + "scrollTop", + "curScroll", + "delta", + "fire", + "type", + "target", + "check", + "onInteractionMove", + "pointer", + "interacting", + "simulation", + "top", + "right", + "bottom", + "left", + "clientX", + "clientY", + "innerWidth", + "innerHeight", + "rect", + "getElementClientRect", + "value", + "string", + "document", + "body", + "getScrollSize", + "scrollWidth", + "scrollHeight", + "getScrollSizeDelta", + "func", + "scrollOptions", + "scrollContainer", + "prevSize", + "curSize", + "autoScrollPlugin", + "id", + "listeners", + "arg" + ], + "mappings": "AAAA,OAAO,KAAKA,QAAZ,MAA0B,sBAA1B;AACA,OAAO,KAAKC,EAAZ,MAAoB,gBAApB;AACA,OAAOC,GAAP,MAAgB,iBAAhB;AACA,SAASC,qBAAT,QAAsC,kBAAtC;AACA,SAASC,SAAT,QAA0B,oBAA1B;;AA+BA,SAASC,OAAT,CAAkBC,KAAlB,EAAgC;AAC9B,QAAM;AACJC,IAAAA,QADI;AAEJC,IAAAA;AAFI,MAGFF,KAHJ;AAKAA,EAAAA,KAAK,CAACG,UAAN,GAAmBA,UAAnB;;AACAA,EAAAA,UAAU,CAACC,GAAX,GAAiB,MAAMJ,KAAK,CAACI,GAAN,EAAvB;;AAEAF,EAAAA,OAAO,CAACG,cAAR,CAAuBC,UAAvB,GAAoC,IAApC;AACAL,EAAAA,QAAQ,CAACM,SAAT,CAAmBJ,UAAnB,GAAgCA,UAAU,CAACF,QAA3C;AACD;;AAED,MAAME,UAAU,GAAG;AACjBF,EAAAA,QAAQ,EAAE;AACRO,IAAAA,OAAO,EAAI,KADH;AAERC,IAAAA,MAAM,EAAK,EAFH;AAIR;AACAC,IAAAA,SAAS,EAAE,IALH;AAOR;AACAC,IAAAA,KAAK,EAAM;AARH,GADO;AAYjBP,EAAAA,GAAG,EAAEQ,IAAI,CAACR,GAZO;AAcjBS,EAAAA,WAAW,EAAE,IAdI;AAejBC,EAAAA,CAAC,EAAE,CAfc;AAeX;AAEN;AACAC,EAAAA,CAAC,EAAE,CAlBc;AAmBjBC,EAAAA,CAAC,EAAE,CAnBc;AAqBjBC,EAAAA,WAAW,EAAE,KArBI;AAsBjBC,EAAAA,QAAQ,EAAE,CAtBO;AAuBjBT,EAAAA,MAAM,EAAE,CAvBS;AAwBjBE,EAAAA,KAAK,EAAE,CAxBU;;AA0BjBQ,EAAAA,KAAK,CAAEN,WAAF,EAAqC;AACxCV,IAAAA,UAAU,CAACc,WAAX,GAAyB,IAAzB;AACArB,IAAAA,GAAG,CAACwB,MAAJ,CAAWjB,UAAU,CAACW,CAAtB;AAEAD,IAAAA,WAAW,CAACV,UAAZ,GAAyBA,UAAzB;AACAA,IAAAA,UAAU,CAACU,WAAX,GAAyBA,WAAzB;AACAV,IAAAA,UAAU,CAACe,QAAX,GAAsBf,UAAU,CAACC,GAAX,EAAtB;AACAD,IAAAA,UAAU,CAACW,CAAX,GAAelB,GAAG,CAACyB,OAAJ,CAAYlB,UAAU,CAACmB,MAAvB,CAAf;AACD,GAlCgB;;AAoCjBC,EAAAA,IAAI,GAAI;AACNpB,IAAAA,UAAU,CAACc,WAAX,GAAyB,KAAzB;;AACA,QAAId,UAAU,CAACU,WAAf,EAA4B;AAC1BV,MAAAA,UAAU,CAACU,WAAX,CAAuBV,UAAvB,GAAoC,IAApC;AACD;;AACDP,IAAAA,GAAG,CAACwB,MAAJ,CAAWjB,UAAU,CAACW,CAAtB;AACD,GA1CgB;;AA4CjB;AACAQ,EAAAA,MAAM,GAAI;AACR,UAAM;AAAET,MAAAA;AAAF,QAAkBV,UAAxB;AACA,UAAM;AAAEqB,MAAAA,YAAF;AAAgBC,MAAAA;AAAhB,QAA4BZ,WAAlC;AACA,UAAMa,UAAU,GAAGb,WAAW,CAACc,QAAZ,CAAqBC,IAAxC;AACA,UAAMC,OAAO,GAAGL,YAAY,CAACK,OAAb,CAAqBH,UAArB,EAAiCvB,UAAjD;AACA,UAAMO,SAAS,GAAGoB,YAAY,CAACD,OAAO,CAACnB,SAAT,EAAoBc,YAApB,EAAkCC,OAAlC,CAA9B;AACA,UAAMrB,GAAG,GAAGD,UAAU,CAACC,GAAX,EAAZ,CANQ,CAOR;;AACA,UAAM2B,EAAE,GAAG,CAAC3B,GAAG,GAAGD,UAAU,CAACe,QAAlB,IAA8B,IAAzC,CARQ,CASR;;AACA,UAAMc,CAAC,GAAGH,OAAO,CAAClB,KAAR,GAAgBoB,EAA1B;;AAEA,QAAIC,CAAC,IAAI,CAAT,EAAY;AACV,YAAMC,QAAQ,GAAG;AACflB,QAAAA,CAAC,EAAEZ,UAAU,CAACY,CAAX,GAAeiB,CADH;AAEfhB,QAAAA,CAAC,EAAEb,UAAU,CAACa,CAAX,GAAegB;AAFH,OAAjB;;AAKA,UAAIC,QAAQ,CAAClB,CAAT,IAAckB,QAAQ,CAACjB,CAA3B,EAA8B;AAC5B,cAAMkB,UAAU,GAAGC,SAAS,CAACzB,SAAD,CAA5B;;AAEA,YAAIf,EAAE,CAACyC,MAAH,CAAU1B,SAAV,CAAJ,EAA0B;AACxBA,UAAAA,SAAS,CAACuB,QAAV,CAAmBA,QAAQ,CAAClB,CAA5B,EAA+BkB,QAAQ,CAACjB,CAAxC;AACD,SAFD,MAGK,IAAIN,SAAJ,EAAe;AAClBA,UAAAA,SAAS,CAAC2B,UAAV,IAAwBJ,QAAQ,CAAClB,CAAjC;AACAL,UAAAA,SAAS,CAAC4B,SAAV,IAAwBL,QAAQ,CAACjB,CAAjC;AACD;;AAED,cAAMuB,SAAS,GAAGJ,SAAS,CAACzB,SAAD,CAA3B;AACA,cAAM8B,KAAK,GAAG;AACZzB,UAAAA,CAAC,EAAEwB,SAAS,CAACxB,CAAV,GAAcmB,UAAU,CAACnB,CADhB;AAEZC,UAAAA,CAAC,EAAEuB,SAAS,CAACvB,CAAV,GAAckB,UAAU,CAAClB;AAFhB,SAAd;;AAKA,YAAIwB,KAAK,CAACzB,CAAN,IAAWyB,KAAK,CAACxB,CAArB,EAAwB;AACtBQ,UAAAA,YAAY,CAACiB,IAAb,CAAkB;AAChBC,YAAAA,IAAI,EAAE,YADU;AAEhBC,YAAAA,MAAM,EAAElB,OAFQ;AAGhBD,YAAAA,YAHgB;AAIhBgB,YAAAA,KAJgB;AAKhB3B,YAAAA,WALgB;AAMhBH,YAAAA;AANgB,WAAlB;AAQD;AACF;;AAEDP,MAAAA,UAAU,CAACe,QAAX,GAAsBd,GAAtB;AACD;;AAED,QAAID,UAAU,CAACc,WAAf,EAA4B;AAC1BrB,MAAAA,GAAG,CAACwB,MAAJ,CAAWjB,UAAU,CAACW,CAAtB;AACAX,MAAAA,UAAU,CAACW,CAAX,GAAelB,GAAG,CAACyB,OAAJ,CAAYlB,UAAU,CAACmB,MAAvB,CAAf;AACD;AACF,GAnGgB;;AAoGjBsB,EAAAA,KAAK,CAAEpB,YAAF,EAAuCE,UAAvC,EAAwE;AAC3E,UAAMG,OAAO,GAAGL,YAAY,CAACK,OAA7B;AAEA,WAAOA,OAAO,CAACH,UAAD,CAAP,CAAoBvB,UAApB,IAAkC0B,OAAO,CAACH,UAAD,CAAP,CAAoBvB,UAApB,CAA+BK,OAAxE;AACD,GAxGgB;;AAyGjBqC,EAAAA,iBAAiB,CAAiC;AAAEhC,IAAAA,WAAF;AAAeiC,IAAAA;AAAf,GAAjC,EAAoI;AACnJ,QAAI,EAAEjC,WAAW,CAACkC,WAAZ,MACA5C,UAAU,CAACyC,KAAX,CAAiB/B,WAAW,CAACW,YAA7B,EAA2CX,WAAW,CAACc,QAAZ,CAAqBC,IAAhE,CADF,CAAJ,EAC8E;AAC5E;AACD;;AAED,QAAIf,WAAW,CAACmC,UAAhB,EAA4B;AAC1B7C,MAAAA,UAAU,CAACY,CAAX,GAAeZ,UAAU,CAACa,CAAX,GAAe,CAA9B;AACA;AACD;;AAED,QAAIiC,GAAJ;AACA,QAAIC,KAAJ;AACA,QAAIC,MAAJ;AACA,QAAIC,IAAJ;AAEA,UAAM;AAAE5B,MAAAA,YAAF;AAAgBC,MAAAA;AAAhB,QAA4BZ,WAAlC;AACA,UAAMa,UAAU,GAAGb,WAAW,CAACc,QAAZ,CAAqBC,IAAxC;AACA,UAAMC,OAAO,GAAGL,YAAY,CAACK,OAAb,CAAqBH,UAArB,EAAiCvB,UAAjD;AACA,UAAMO,SAAS,GAAGoB,YAAY,CAACD,OAAO,CAACnB,SAAT,EAAoBc,YAApB,EAAkCC,OAAlC,CAA9B;;AAEA,QAAI9B,EAAE,CAACyC,MAAH,CAAU1B,SAAV,CAAJ,EAA0B;AACxB0C,MAAAA,IAAI,GAAKN,OAAO,CAACO,OAAR,GAAkBlD,UAAU,CAACM,MAAtC;AACAwC,MAAAA,GAAG,GAAMH,OAAO,CAACQ,OAAR,GAAkBnD,UAAU,CAACM,MAAtC;AACAyC,MAAAA,KAAK,GAAIJ,OAAO,CAACO,OAAR,GAAkB3C,SAAS,CAAC6C,UAAV,GAAwBpD,UAAU,CAACM,MAA9D;AACA0C,MAAAA,MAAM,GAAGL,OAAO,CAACQ,OAAR,GAAkB5C,SAAS,CAAC8C,WAAV,GAAwBrD,UAAU,CAACM,MAA9D;AACD,KALD,MAMK;AACH,YAAMgD,IAAI,GAAG/D,QAAQ,CAACgE,oBAAT,CAA8BhD,SAA9B,CAAb;AAEA0C,MAAAA,IAAI,GAAKN,OAAO,CAACO,OAAR,GAAkBI,IAAI,CAACL,IAAL,GAAcjD,UAAU,CAACM,MAApD;AACAwC,MAAAA,GAAG,GAAMH,OAAO,CAACQ,OAAR,GAAkBG,IAAI,CAACR,GAAL,GAAc9C,UAAU,CAACM,MAApD;AACAyC,MAAAA,KAAK,GAAIJ,OAAO,CAACO,OAAR,GAAkBI,IAAI,CAACP,KAAL,GAAc/C,UAAU,CAACM,MAApD;AACA0C,MAAAA,MAAM,GAAGL,OAAO,CAACQ,OAAR,GAAkBG,IAAI,CAACN,MAAL,GAAchD,UAAU,CAACM,MAApD;AACD;;AAEDN,IAAAA,UAAU,CAACY,CAAX,GAAgBmC,KAAK,GAAG,CAAH,GAAOE,IAAI,GAAG,CAAC,CAAJ,GAAQ,CAAxC;AACAjD,IAAAA,UAAU,CAACa,CAAX,GAAgBmC,MAAM,GAAG,CAAH,GAAQF,GAAG,GAAG,CAAC,CAAJ,GAAQ,CAAzC;;AAEA,QAAI,CAAC9C,UAAU,CAACc,WAAhB,EAA6B;AAC3B;AACAd,MAAAA,UAAU,CAACM,MAAX,GAAoBoB,OAAO,CAACpB,MAA5B;AACAN,MAAAA,UAAU,CAACQ,KAAX,GAAoBkB,OAAO,CAAClB,KAA5B;AAEAR,MAAAA,UAAU,CAACgB,KAAX,CAAiBN,WAAjB;AACD;AACF;;AAvJgB,CAAnB;AA0JA,OAAO,SAASiB,YAAT,CAAuB6B,KAAvB,EAAmCnC,YAAnC,EAAwEC,OAAxE,EAAmG;AACxG,SAAO,CAAC9B,EAAE,CAACiE,MAAH,CAAUD,KAAV,IAAmB9D,qBAAqB,CAAC8D,KAAD,EAAQnC,YAAR,EAAsBC,OAAtB,CAAxC,GAAyEkC,KAA1E,KAAoF7D,SAAS,CAAC2B,OAAD,CAApG;AACD;AAED,OAAO,SAASU,SAAT,CAAoBzB,SAApB,EAAoC;AACzC,MAAIf,EAAE,CAACyC,MAAH,CAAU1B,SAAV,CAAJ,EAA0B;AAAEA,IAAAA,SAAS,GAAG0B,MAAM,CAACyB,QAAP,CAAgBC,IAA5B;AAAkC;;AAE9D,SAAO;AAAE/C,IAAAA,CAAC,EAAEL,SAAS,CAAC2B,UAAf;AAA2BrB,IAAAA,CAAC,EAAEN,SAAS,CAAC4B;AAAxC,GAAP;AACD;AAED,OAAO,SAASyB,aAAT,CAAwBrD,SAAxB,EAAwC;AAC7C,MAAIf,EAAE,CAACyC,MAAH,CAAU1B,SAAV,CAAJ,EAA0B;AAAEA,IAAAA,SAAS,GAAG0B,MAAM,CAACyB,QAAP,CAAgBC,IAA5B;AAAkC;;AAE9D,SAAO;AAAE/C,IAAAA,CAAC,EAAEL,SAAS,CAACsD,WAAf;AAA4BhD,IAAAA,CAAC,EAAEN,SAAS,CAACuD;AAAzC,GAAP;AACD;AAED,OAAO,SAASC,kBAAT,CAA4D;AAAErD,EAAAA,WAAF;AAAeY,EAAAA;AAAf,CAA5D,EAGJ0C,IAHI,EAGO;AACZ,QAAMC,aAAa,GAAGvD,WAAW,IAAIA,WAAW,CAACW,YAAZ,CAAyBK,OAAzB,CAAiChB,WAAW,CAACc,QAAZ,CAAqBC,IAAtD,EAA4DzB,UAAjG;;AAEA,MAAI,CAACiE,aAAD,IAAkB,CAACA,aAAa,CAAC5D,OAArC,EAA8C;AAC5C2D,IAAAA,IAAI;AACJ,WAAO;AAAEpD,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAAP;AACD;;AAED,QAAMqD,eAAe,GAAGvC,YAAY,CAClCsC,aAAa,CAAC1D,SADoB,EAElCG,WAAW,CAACW,YAFsB,EAGlCC,OAHkC,CAApC;AAMA,QAAM6C,QAAQ,GAAGnC,SAAS,CAACkC,eAAD,CAA1B;AACAF,EAAAA,IAAI;AACJ,QAAMI,OAAO,GAAGpC,SAAS,CAACkC,eAAD,CAAzB;AAEA,SAAO;AACLtD,IAAAA,CAAC,EAAEwD,OAAO,CAACxD,CAAR,GAAYuD,QAAQ,CAACvD,CADnB;AAELC,IAAAA,CAAC,EAAEuD,OAAO,CAACvD,CAAR,GAAYsD,QAAQ,CAACtD;AAFnB,GAAP;AAID;AAED,MAAMwD,gBAAiC,GAAG;AACxCC,EAAAA,EAAE,EAAE,aADoC;AAExC1E,EAAAA,OAFwC;AAGxC2E,EAAAA,SAAS,EAAE;AACT,wBAAoB,CAAC;AAAE7D,MAAAA;AAAF,KAAD,KAAqB;AACvCA,MAAAA,WAAW,CAACV,UAAZ,GAAyB,IAAzB;AACD,KAHQ;AAKT,4BAAwB,CAAC;AAAEU,MAAAA;AAAF,KAAD,KAAqB;AAC3CA,MAAAA,WAAW,CAACV,UAAZ,GAAyB,IAAzB;AACAA,MAAAA,UAAU,CAACoB,IAAX;;AACA,UAAIpB,UAAU,CAACU,WAAf,EAA4B;AAC1BV,QAAAA,UAAU,CAACU,WAAX,GAAyB,IAAzB;AACD;AACF,KAXQ;AAaT,yBAAqBV,UAAU,CAACoB,IAbvB;AAeT,gCAA6BoD,GAAD,IAAcxE,UAAU,CAAC0C,iBAAX,CAA6B8B,GAA7B;AAfjC;AAH6B,CAA1C;AAsBA,eAAeH,gBAAf", + "sourcesContent": [ + "import * as domUtils from '@interactjs/utils/domUtils'\nimport * as is from '@interactjs/utils/is'\nimport raf from '@interactjs/utils/raf'\nimport { getStringOptionResult } from '@interactjs/utils/rect'\nimport { getWindow } from '@interactjs/utils/window'\n\ntype Scope = import ('@interactjs/core/scope').Scope\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n autoScroll: typeof autoScroll\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n autoScroll?: typeof autoScroll\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface PerActionDefaults {\n autoScroll?: AutoScrollOptions\n }\n}\n\nexport interface AutoScrollOptions {\n container?: Window | HTMLElement\n margin?: number\n distance?: number\n interval?: number\n speed?: number\n enabled?: boolean\n}\n\nfunction install (scope: Scope) {\n const {\n defaults,\n actions,\n } = scope\n\n scope.autoScroll = autoScroll\n autoScroll.now = () => scope.now()\n\n actions.phaselessTypes.autoscroll = true\n defaults.perAction.autoScroll = autoScroll.defaults\n}\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n margin : 60,\n\n // the item that is scrolled (Window or HTMLElement)\n container: null as AutoScrollOptions['container'],\n\n // the scroll speed in pixels per second\n speed : 300,\n } as AutoScrollOptions,\n\n now: Date.now,\n\n interaction: null as Interact.Interaction,\n i: 0, // the handle returned by window.setInterval\n\n // Direction each pulse is to scroll in\n x: 0,\n y: 0,\n\n isScrolling: false,\n prevTime: 0,\n margin: 0,\n speed: 0,\n\n start (interaction: Interact.Interaction) {\n autoScroll.isScrolling = true\n raf.cancel(autoScroll.i)\n\n interaction.autoScroll = autoScroll\n autoScroll.interaction = interaction\n autoScroll.prevTime = autoScroll.now()\n autoScroll.i = raf.request(autoScroll.scroll)\n },\n\n stop () {\n autoScroll.isScrolling = false\n if (autoScroll.interaction) {\n autoScroll.interaction.autoScroll = null\n }\n raf.cancel(autoScroll.i)\n },\n\n // scroll the window by the values in scroll.x/y\n scroll () {\n const { interaction } = autoScroll\n const { interactable, element } = interaction\n const actionName = interaction.prepared.name\n const options = interactable.options[actionName].autoScroll\n const container = getContainer(options.container, interactable, element)\n const now = autoScroll.now()\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000\n // displacement\n const s = options.speed * dt\n\n if (s >= 1) {\n const scrollBy = {\n x: autoScroll.x * s,\n y: autoScroll.y * s,\n }\n\n if (scrollBy.x || scrollBy.y) {\n const prevScroll = getScroll(container)\n\n if (is.window(container)) {\n container.scrollBy(scrollBy.x, scrollBy.y)\n }\n else if (container) {\n container.scrollLeft += scrollBy.x\n container.scrollTop += scrollBy.y\n }\n\n const curScroll = getScroll(container)\n const delta = {\n x: curScroll.x - prevScroll.x,\n y: curScroll.y - prevScroll.y,\n }\n\n if (delta.x || delta.y) {\n interactable.fire({\n type: 'autoscroll',\n target: element,\n interactable,\n delta,\n interaction,\n container,\n })\n }\n }\n\n autoScroll.prevTime = now\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i)\n autoScroll.i = raf.request(autoScroll.scroll)\n }\n },\n check (interactable: Interact.Interactable, actionName: Interact.ActionName) {\n const options = interactable.options\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled\n },\n onInteractionMove ({ interaction, pointer }: { interaction: Interact.Interaction, pointer: Interact.PointerType }) {\n if (!(interaction.interacting() &&\n autoScroll.check(interaction.interactable, interaction.prepared.name))) {\n return\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0\n return\n }\n\n let top\n let right\n let bottom\n let left\n\n const { interactable, element } = interaction\n const actionName = interaction.prepared.name\n const options = interactable.options[actionName].autoScroll\n const container = getContainer(options.container, interactable, element)\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin\n top = pointer.clientY < autoScroll.margin\n right = pointer.clientX > container.innerWidth - autoScroll.margin\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin\n }\n else {\n const rect = domUtils.getElementClientRect(container)\n\n left = pointer.clientX < rect.left + autoScroll.margin\n top = pointer.clientY < rect.top + autoScroll.margin\n right = pointer.clientX > rect.right - autoScroll.margin\n bottom = pointer.clientY > rect.bottom - autoScroll.margin\n }\n\n autoScroll.x = (right ? 1 : left ? -1 : 0)\n autoScroll.y = (bottom ? 1 : top ? -1 : 0)\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin\n autoScroll.speed = options.speed\n\n autoScroll.start(interaction)\n }\n },\n}\n\nexport function getContainer (value: any, interactable: Interact.Interactable, element: Interact.Element) {\n return (is.string(value) ? getStringOptionResult(value, interactable, element) : value) || getWindow(element)\n}\n\nexport function getScroll (container: any) {\n if (is.window(container)) { container = window.document.body }\n\n return { x: container.scrollLeft, y: container.scrollTop }\n}\n\nexport function getScrollSize (container: any) {\n if (is.window(container)) { container = window.document.body }\n\n return { x: container.scrollWidth, y: container.scrollHeight }\n}\n\nexport function getScrollSizeDelta ({ interaction, element }: {\n interaction: Partial>\n element: Interact.Element\n}, func: any) {\n const scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll\n\n if (!scrollOptions || !scrollOptions.enabled) {\n func()\n return { x: 0, y: 0 }\n }\n\n const scrollContainer = getContainer(\n scrollOptions.container,\n interaction.interactable,\n element,\n )\n\n const prevSize = getScroll(scrollContainer)\n func()\n const curSize = getScroll(scrollContainer)\n\n return {\n x: curSize.x - prevSize.x,\n y: curSize.y - prevSize.y,\n }\n}\n\nconst autoScrollPlugin: Interact.Plugin = {\n id: 'auto-scroll',\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.autoScroll = null\n },\n\n 'interactions:destroy': ({ interaction }) => {\n interaction.autoScroll = null\n autoScroll.stop()\n if (autoScroll.interaction) {\n autoScroll.interaction = null\n }\n },\n\n 'interactions:stop': autoScroll.stop,\n\n 'interactions:action-move': (arg: any) => autoScroll.onInteractionMove(arg),\n },\n}\n\nexport default autoScrollPlugin\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-scroll/index.min.js b/@interactjs/auto-scroll/index.min.js new file mode 100644 index 000000000..67a7ea4b0 --- /dev/null +++ b/@interactjs/auto-scroll/index.min.js @@ -0,0 +1,2 @@ +import*as t from"../utils/domUtils.min.js";import*as n from"../utils/is.min.js";import e from"../utils/raf.min.js";import{getStringOptionResult as o}from"../utils/rect.min.js";import{getWindow as i}from"../utils/window.min.js";const r={defaults:{enabled:!1,margin:60,container:null,speed:300},now:Date.now,interaction:null,i:0,x:0,y:0,isScrolling:!1,prevTime:0,margin:0,speed:0,start(t){r.isScrolling=!0,e.cancel(r.i),t.autoScroll=r,r.interaction=t,r.prevTime=r.now(),r.i=e.request(r.scroll)},stop(){r.isScrolling=!1,r.interaction&&(r.interaction.autoScroll=null),e.cancel(r.i)},scroll(){const{interaction:t}=r,{interactable:o,element:i}=t,l=t.prepared.name,c=o.options[l].autoScroll,a=getContainer(c.container,o,i),s=r.now(),u=(s-r.prevTime)/1e3,m=c.speed*u;if(m>=1){const e={x:r.x*m,y:r.y*m};if(e.x||e.y){const r=getScroll(a);n.window(a)?a.scrollBy(e.x,e.y):a&&(a.scrollLeft+=e.x,a.scrollTop+=e.y);const l=getScroll(a),c={x:l.x-r.x,y:l.y-r.y};(c.x||c.y)&&o.fire({type:"autoscroll",target:i,interactable:o,delta:c,interaction:t,container:a})}r.prevTime=s}r.isScrolling&&(e.cancel(r.i),r.i=e.request(r.scroll))},check(t,n){const e=t.options;return e[n].autoScroll&&e[n].autoScroll.enabled},onInteractionMove({interaction:e,pointer:o}){if(!e.interacting()||!r.check(e.interactable,e.prepared.name))return;if(e.simulation)return void(r.x=r.y=0);let i,l,c,a;const{interactable:s,element:u}=e,m=e.prepared.name,p=s.options[m].autoScroll,g=getContainer(p.container,s,u);if(n.window(g))a=o.clientXg.innerWidth-r.margin,c=o.clientY>g.innerHeight-r.margin;else{const n=t.getElementClientRect(g);a=o.clientXn.right-r.margin,c=o.clientY>n.bottom-r.margin}r.x=l?1:a?-1:0,r.y=c?1:i?-1:0,r.isScrolling||(r.margin=p.margin,r.speed=p.speed,r.start(e))}};export function getContainer(t,e,r){return(n.string(t)?o(t,e,r):t)||i(r)}export function getScroll(t){return n.window(t)&&(t=window.document.body),{x:t.scrollLeft,y:t.scrollTop}}export function getScrollSize(t){return n.window(t)&&(t=window.document.body),{x:t.scrollWidth,y:t.scrollHeight}}export function getScrollSizeDelta({interaction:t,element:n},e){const o=t&&t.interactable.options[t.prepared.name].autoScroll;if(!o||!o.enabled)return e(),{x:0,y:0};const i=getContainer(o.container,t.interactable,n),r=getScroll(i);e();const l=getScroll(i);return{x:l.x-r.x,y:l.y-r.y}}const l={id:"auto-scroll",install(t){const{defaults:n,actions:e}=t;t.autoScroll=r,r.now=()=>t.now(),e.phaselessTypes.autoscroll=!0,n.perAction.autoScroll=r.defaults},listeners:{"interactions:new"({interaction:t}){t.autoScroll=null},"interactions:destroy"({interaction:t}){t.autoScroll=null,r.stop(),r.interaction&&(r.interaction=null)},"interactions:stop":r.stop,"interactions:action-move"(t){return r.onInteractionMove(t)}}};export default l; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/auto-scroll/index.min.js.map b/@interactjs/auto-scroll/index.min.js.map new file mode 100644 index 000000000..72208255c --- /dev/null +++ b/@interactjs/auto-scroll/index.min.js.map @@ -0,0 +1,96 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "domUtils", + "is", + "raf", + "getStringOptionResult", + "getWindow", + "autoScroll", + "defaults", + "enabled", + "margin", + "container", + "speed", + "now", + "Date", + "interaction", + "i", + "x", + "y", + "isScrolling", + "prevTime", + "start", + "cancel", + "request", + "scroll", + "stop", + "interactable", + "element", + "actionName", + "prepared", + "name", + "options", + "getContainer", + "dt", + "s", + "scrollBy", + "prevScroll", + "getScroll", + "window", + "scrollLeft", + "scrollTop", + "curScroll", + "delta", + "fire", + "type", + "target", + "check", + "onInteractionMove", + "pointer", + "interacting", + "simulation", + "top", + "right", + "bottom", + "left", + "clientX", + "clientY", + "innerWidth", + "innerHeight", + "rect", + "getElementClientRect", + "value", + "string", + "document", + "body", + "getScrollSize", + "scrollWidth", + "scrollHeight", + "getScrollSizeDelta", + "func", + "scrollOptions", + "scrollContainer", + "prevSize", + "curSize", + "autoScrollPlugin", + "id", + "install", + "scope", + "actions", + "phaselessTypes", + "autoscroll", + "perAction", + "listeners", + "[object Object]", + "interactions:stop", + "arg" + ], + "mappings": "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", + "sourcesContent": [ + "import * as domUtils from '@interactjs/utils/domUtils'\nimport * as is from '@interactjs/utils/is'\nimport raf from '@interactjs/utils/raf'\nimport { getStringOptionResult } from '@interactjs/utils/rect'\nimport { getWindow } from '@interactjs/utils/window'\n\ntype Scope = import ('@interactjs/core/scope').Scope\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n autoScroll: typeof autoScroll\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n autoScroll?: typeof autoScroll\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface PerActionDefaults {\n autoScroll?: AutoScrollOptions\n }\n}\n\nexport interface AutoScrollOptions {\n container?: Window | HTMLElement\n margin?: number\n distance?: number\n interval?: number\n speed?: number\n enabled?: boolean\n}\n\nfunction install (scope: Scope) {\n const {\n defaults,\n actions,\n } = scope\n\n scope.autoScroll = autoScroll\n autoScroll.now = () => scope.now()\n\n actions.phaselessTypes.autoscroll = true\n defaults.perAction.autoScroll = autoScroll.defaults\n}\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n margin : 60,\n\n // the item that is scrolled (Window or HTMLElement)\n container: null as AutoScrollOptions['container'],\n\n // the scroll speed in pixels per second\n speed : 300,\n } as AutoScrollOptions,\n\n now: Date.now,\n\n interaction: null as Interact.Interaction,\n i: 0, // the handle returned by window.setInterval\n\n // Direction each pulse is to scroll in\n x: 0,\n y: 0,\n\n isScrolling: false,\n prevTime: 0,\n margin: 0,\n speed: 0,\n\n start (interaction: Interact.Interaction) {\n autoScroll.isScrolling = true\n raf.cancel(autoScroll.i)\n\n interaction.autoScroll = autoScroll\n autoScroll.interaction = interaction\n autoScroll.prevTime = autoScroll.now()\n autoScroll.i = raf.request(autoScroll.scroll)\n },\n\n stop () {\n autoScroll.isScrolling = false\n if (autoScroll.interaction) {\n autoScroll.interaction.autoScroll = null\n }\n raf.cancel(autoScroll.i)\n },\n\n // scroll the window by the values in scroll.x/y\n scroll () {\n const { interaction } = autoScroll\n const { interactable, element } = interaction\n const actionName = interaction.prepared.name\n const options = interactable.options[actionName].autoScroll\n const container = getContainer(options.container, interactable, element)\n const now = autoScroll.now()\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000\n // displacement\n const s = options.speed * dt\n\n if (s >= 1) {\n const scrollBy = {\n x: autoScroll.x * s,\n y: autoScroll.y * s,\n }\n\n if (scrollBy.x || scrollBy.y) {\n const prevScroll = getScroll(container)\n\n if (is.window(container)) {\n container.scrollBy(scrollBy.x, scrollBy.y)\n }\n else if (container) {\n container.scrollLeft += scrollBy.x\n container.scrollTop += scrollBy.y\n }\n\n const curScroll = getScroll(container)\n const delta = {\n x: curScroll.x - prevScroll.x,\n y: curScroll.y - prevScroll.y,\n }\n\n if (delta.x || delta.y) {\n interactable.fire({\n type: 'autoscroll',\n target: element,\n interactable,\n delta,\n interaction,\n container,\n })\n }\n }\n\n autoScroll.prevTime = now\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i)\n autoScroll.i = raf.request(autoScroll.scroll)\n }\n },\n check (interactable: Interact.Interactable, actionName: Interact.ActionName) {\n const options = interactable.options\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled\n },\n onInteractionMove ({ interaction, pointer }: { interaction: Interact.Interaction, pointer: Interact.PointerType }) {\n if (!(interaction.interacting() &&\n autoScroll.check(interaction.interactable, interaction.prepared.name))) {\n return\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0\n return\n }\n\n let top\n let right\n let bottom\n let left\n\n const { interactable, element } = interaction\n const actionName = interaction.prepared.name\n const options = interactable.options[actionName].autoScroll\n const container = getContainer(options.container, interactable, element)\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin\n top = pointer.clientY < autoScroll.margin\n right = pointer.clientX > container.innerWidth - autoScroll.margin\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin\n }\n else {\n const rect = domUtils.getElementClientRect(container)\n\n left = pointer.clientX < rect.left + autoScroll.margin\n top = pointer.clientY < rect.top + autoScroll.margin\n right = pointer.clientX > rect.right - autoScroll.margin\n bottom = pointer.clientY > rect.bottom - autoScroll.margin\n }\n\n autoScroll.x = (right ? 1 : left ? -1 : 0)\n autoScroll.y = (bottom ? 1 : top ? -1 : 0)\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin\n autoScroll.speed = options.speed\n\n autoScroll.start(interaction)\n }\n },\n}\n\nexport function getContainer (value: any, interactable: Interact.Interactable, element: Interact.Element) {\n return (is.string(value) ? getStringOptionResult(value, interactable, element) : value) || getWindow(element)\n}\n\nexport function getScroll (container: any) {\n if (is.window(container)) { container = window.document.body }\n\n return { x: container.scrollLeft, y: container.scrollTop }\n}\n\nexport function getScrollSize (container: any) {\n if (is.window(container)) { container = window.document.body }\n\n return { x: container.scrollWidth, y: container.scrollHeight }\n}\n\nexport function getScrollSizeDelta ({ interaction, element }: {\n interaction: Partial>\n element: Interact.Element\n}, func: any) {\n const scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll\n\n if (!scrollOptions || !scrollOptions.enabled) {\n func()\n return { x: 0, y: 0 }\n }\n\n const scrollContainer = getContainer(\n scrollOptions.container,\n interaction.interactable,\n element,\n )\n\n const prevSize = getScroll(scrollContainer)\n func()\n const curSize = getScroll(scrollContainer)\n\n return {\n x: curSize.x - prevSize.x,\n y: curSize.y - prevSize.y,\n }\n}\n\nconst autoScrollPlugin: Interact.Plugin = {\n id: 'auto-scroll',\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.autoScroll = null\n },\n\n 'interactions:destroy': ({ interaction }) => {\n interaction.autoScroll = null\n autoScroll.stop()\n if (autoScroll.interaction) {\n autoScroll.interaction = null\n }\n },\n\n 'interactions:stop': autoScroll.stop,\n\n 'interactions:action-move': (arg: any) => autoScroll.onInteractionMove(arg),\n },\n}\n\nexport default autoScrollPlugin\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/.npmignore b/@interactjs/auto-start/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/auto-start/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/auto-start/InteractableMethods.d.ts b/@interactjs/auto-start/InteractableMethods.d.ts new file mode 100644 index 000000000..1427b579d --- /dev/null +++ b/@interactjs/auto-start/InteractableMethods.d.ts @@ -0,0 +1,29 @@ +declare module '@interactjs/core/Interactable' { + interface Interactable { + getAction: (this: Interact.Interactable, pointer: Interact.PointerType, event: Interact.PointerEventType, interaction: Interact.Interaction, element: Interact.Element) => Interact.ActionProps | null; + styleCursor: typeof styleCursor; + actionChecker: typeof actionChecker; + ignoreFrom: { + (...args: any[]): Interactable; + (): boolean; + }; + allowFrom: { + (...args: any[]): Interactable; + (): boolean; + }; + } +} +declare module '@interactjs/core/Interaction' { + interface Interaction { + pointerIsDown: boolean; + } +} +declare function install(scope: Interact.Scope): void; +declare function styleCursor(this: Interact.Interactable): boolean; +declare function styleCursor(this: Interact.Interactable, newValue: boolean): typeof this; +declare function actionChecker(this: Interact.Interactable, checker: any): any; +declare const _default: { + id: string; + install: typeof install; +}; +export default _default; diff --git a/@interactjs/auto-start/InteractableMethods.js b/@interactjs/auto-start/InteractableMethods.js new file mode 100644 index 000000000..0d5d6c6b8 --- /dev/null +++ b/@interactjs/auto-start/InteractableMethods.js @@ -0,0 +1,176 @@ +import { warnOnce } from "../utils/index.js"; +import * as is from "../utils/is.js"; + +function install(scope) { + const { + /** @lends Interactable */ + Interactable // tslint:disable-line no-shadowed-variable + + } = scope; + + Interactable.prototype.getAction = function getAction(pointer, event, interaction, element) { + const action = defaultActionChecker(this, event, interaction, element, scope); + + if (this.options.actionChecker) { + return this.options.actionChecker(pointer, event, action, this, element, interaction); + } + + return action; + }; + /** + * ```js + * interact(element, { ignoreFrom: document.getElementById('no-action') }) + * // or + * interact(element).ignoreFrom('input, textarea, a') + * ``` + * @deprecated + * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any + * of it's parents match the given CSS selector or Element, no + * drag/resize/gesture is started. + * + * Don't use this method. Instead set the `ignoreFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .draggable({ + * ignoreFrom: 'input, textarea, a[href]'', + * }) + * .pointerEvents({ + * ignoreFrom: '[no-pointer]', + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to not ignore any elements + * @return {string | Element | object} The current ignoreFrom value or this + * Interactable + */ + + + Interactable.prototype.ignoreFrom = warnOnce(function (newValue) { + return this._backCompatOption('ignoreFrom', newValue); + }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).'); + /** + * @deprecated + * + * A drag/resize/gesture is started only If the target of the `mousedown`, + * `pointerdown` or `touchstart` event or any of it's parents match the given + * CSS selector or Element. + * + * Don't use this method. Instead set the `allowFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .resizable({ + * allowFrom: '.resize-handle', + * .pointerEvents({ + * allowFrom: '.handle',, + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to allow from any element + * @return {string | Element | object} The current allowFrom value or this + * Interactable + */ + + Interactable.prototype.allowFrom = warnOnce(function (newValue) { + return this._backCompatOption('allowFrom', newValue); + }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).'); + /** + * ```js + * interact('.resize-drag') + * .resizable(true) + * .draggable(true) + * .actionChecker(function (pointer, event, action, interactable, element, interaction) { + * + * if (interact.matchesSelector(event.target, '.drag-handle')) { + * // force drag with handle target + * action.name = drag + * } + * else { + * // resize from the top and right edges + * action.name = 'resize' + * action.edges = { top: true, right: true } + * } + * + * return action + * }) + * ``` + * + * Returns or sets the function used to check action to be performed on + * pointerDown + * + * @param {function | null} [checker] A function which takes a pointer event, + * defaultAction string, interactable, element and interaction as parameters + * and returns an object with name property 'drag' 'resize' or 'gesture' and + * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right + * props. + * @return {Function | Interactable} The checker function or this Interactable + */ + + Interactable.prototype.actionChecker = actionChecker; + /** + * Returns or sets whether the the cursor should be changed depending on the + * action that would be performed if the mouse were pressed and dragged. + * + * @param {boolean} [newValue] + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.styleCursor = styleCursor; +} + +function defaultActionChecker(interactable, event, interaction, element, scope) { + const rect = interactable.getRect(element); + const buttons = event.buttons || { + 0: 1, + 1: 4, + 3: 8, + 4: 16 + }[event.button]; + const arg = { + action: null, + interactable, + interaction, + element, + rect, + buttons + }; + scope.fire('auto-start:check', arg); + return arg.action; +} + +function styleCursor(newValue) { + if (is.bool(newValue)) { + this.options.styleCursor = newValue; + return this; + } + + if (newValue === null) { + delete this.options.styleCursor; + return this; + } + + return this.options.styleCursor; +} + +function actionChecker(checker) { + if (is.func(checker)) { + this.options.actionChecker = checker; + return this; + } + + if (checker === null) { + delete this.options.actionChecker; + return this; + } + + return this.options.actionChecker; +} + +export default { + id: 'auto-start/interactableMethods', + install +}; +//# sourceMappingURL=InteractableMethods.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/InteractableMethods.js.map b/@interactjs/auto-start/InteractableMethods.js.map new file mode 100644 index 000000000..a651382a1 --- /dev/null +++ b/@interactjs/auto-start/InteractableMethods.js.map @@ -0,0 +1,43 @@ +{ + "version": 3, + "sources": [ + "InteractableMethods.ts" + ], + "names": [ + "warnOnce", + "is", + "install", + "scope", + "Interactable", + "prototype", + "getAction", + "pointer", + "event", + "interaction", + "element", + "action", + "defaultActionChecker", + "options", + "actionChecker", + "ignoreFrom", + "newValue", + "_backCompatOption", + "allowFrom", + "styleCursor", + "interactable", + "rect", + "getRect", + "buttons", + "button", + "arg", + "fire", + "bool", + "checker", + "func", + "id" + ], + "mappings": "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", + "sourcesContent": [ + "import { warnOnce } from '@interactjs/utils/index'\nimport * as is from '@interactjs/utils/is'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n getAction: (\n this: Interact.Interactable,\n pointer: Interact.PointerType,\n event: Interact.PointerEventType,\n interaction: Interact.Interaction,\n element: Interact.Element,\n ) => Interact.ActionProps | null\n styleCursor: typeof styleCursor\n actionChecker: typeof actionChecker\n ignoreFrom: {\n (...args: any[]): Interactable\n (): boolean\n }\n allowFrom: {\n (...args: any[]): Interactable\n (): boolean\n }\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n pointerIsDown: boolean\n }\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n /** @lends Interactable */\n Interactable, // tslint:disable-line no-shadowed-variable\n } = scope\n\n Interactable.prototype.getAction = function getAction (\n this: Interact.Interactable,\n pointer: Interact.PointerType,\n event: Interact.PointerEventType,\n interaction: Interact.Interaction,\n element: Interact.Element,\n ): Interact.ActionProps {\n const action = defaultActionChecker(this, event, interaction, element, scope)\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction)\n }\n\n return action\n }\n\n /**\n * ```js\n * interact(element, { ignoreFrom: document.getElementById('no-action') })\n * // or\n * interact(element).ignoreFrom('input, textarea, a')\n * ```\n * @deprecated\n * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n * of it's parents match the given CSS selector or Element, no\n * drag/resize/gesture is started.\n *\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * })\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to not ignore any elements\n * @return {string | Element | object} The current ignoreFrom value or this\n * Interactable\n */\n Interactable.prototype.ignoreFrom = warnOnce(function (this: Interact.Interactable, newValue) {\n return this._backCompatOption('ignoreFrom', newValue)\n }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).')\n\n /**\n * @deprecated\n *\n * A drag/resize/gesture is started only If the target of the `mousedown`,\n * `pointerdown` or `touchstart` event or any of it's parents match the given\n * CSS selector or Element.\n *\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * })\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to allow from any element\n * @return {string | Element | object} The current allowFrom value or this\n * Interactable\n */\n Interactable.prototype.allowFrom = warnOnce(function (this: Interact.Interactable, newValue) {\n return this._backCompatOption('allowFrom', newValue)\n }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).')\n\n /**\n * ```js\n * interact('.resize-drag')\n * .resizable(true)\n * .draggable(true)\n * .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n *\n * if (interact.matchesSelector(event.target, '.drag-handle')) {\n * // force drag with handle target\n * action.name = drag\n * }\n * else {\n * // resize from the top and right edges\n * action.name = 'resize'\n * action.edges = { top: true, right: true }\n * }\n *\n * return action\n * })\n * ```\n *\n * Returns or sets the function used to check action to be performed on\n * pointerDown\n *\n * @param {function | null} [checker] A function which takes a pointer event,\n * defaultAction string, interactable, element and interaction as parameters\n * and returns an object with name property 'drag' 'resize' or 'gesture' and\n * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n * props.\n * @return {Function | Interactable} The checker function or this Interactable\n */\n Interactable.prototype.actionChecker = actionChecker\n\n /**\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n * @param {boolean} [newValue]\n * @return {boolean | Interactable} The current setting or this Interactable\n */\n Interactable.prototype.styleCursor = styleCursor\n}\n\nfunction defaultActionChecker (\n interactable: Interact.Interactable,\n event: Interact.PointerEventType,\n interaction: Interact.Interaction,\n element: Interact.Element,\n scope: Interact.Scope,\n) {\n const rect = interactable.getRect(element)\n const buttons = (event as MouseEvent).buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[(event as MouseEvent).button as 0 | 1 | 3 | 4]\n const arg = {\n action: null,\n interactable,\n interaction,\n element,\n rect,\n buttons,\n }\n\n scope.fire('auto-start:check', arg)\n\n return arg.action\n}\n\nfunction styleCursor (this: Interact.Interactable): boolean\nfunction styleCursor (this: Interact.Interactable, newValue: boolean): typeof this\nfunction styleCursor (this: Interact.Interactable, newValue?: boolean) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue\n\n return this\n }\n\n if (newValue === null) {\n delete this.options.styleCursor\n\n return this\n }\n\n return this.options.styleCursor\n}\n\nfunction actionChecker (this: Interact.Interactable, checker: any) {\n if (is.func(checker)) {\n this.options.actionChecker = checker\n\n return this\n }\n\n if (checker === null) {\n delete this.options.actionChecker\n\n return this\n }\n\n return this.options.actionChecker\n}\n\nexport default {\n id: 'auto-start/interactableMethods',\n install,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/InteractableMethods.min.js b/@interactjs/auto-start/InteractableMethods.min.js new file mode 100644 index 000000000..0c05ad249 --- /dev/null +++ b/@interactjs/auto-start/InteractableMethods.min.js @@ -0,0 +1,2 @@ +import{warnOnce as t}from"../utils/index.min.js";import*as e from"../utils/is.min.js";function o(t){return e.bool(t)?(this.options.styleCursor=t,this):null===t?(delete this.options.styleCursor,this):this.options.styleCursor}function n(t){return e.func(t)?(this.options.actionChecker=t,this):null===t?(delete this.options.actionChecker,this):this.options.actionChecker}export default{id:"auto-start/interactableMethods",install(e){const{Interactable:r}=e;r.prototype.getAction=function(t,o,n,r){const i=function(t,e,o,n,r){const i=t.getRect(n),s=e.buttons||{0:1,1:4,3:8,4:16}[e.button],a={action:null,interactable:t,interaction:o,element:n,rect:i,buttons:s};return r.fire("auto-start:check",a),a.action}(this,o,n,r,e);return this.options.actionChecker?this.options.actionChecker(t,o,i,this,r,n):i},r.prototype.ignoreFrom=t((function(t){return this._backCompatOption("ignoreFrom",t)}),"Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue})."),r.prototype.allowFrom=t((function(t){return this._backCompatOption("allowFrom",t)}),"Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue})."),r.prototype.actionChecker=n,r.prototype.styleCursor=o}}; +//# sourceMappingURL=InteractableMethods.min.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/InteractableMethods.min.js.map b/@interactjs/auto-start/InteractableMethods.min.js.map new file mode 100644 index 000000000..943a0073c --- /dev/null +++ b/@interactjs/auto-start/InteractableMethods.min.js.map @@ -0,0 +1,48 @@ +{ + "version": 3, + "sources": [ + "InteractableMethods.ts" + ], + "names": [ + "warnOnce", + "is", + "styleCursor", + "newValue", + "bool", + "this", + "options", + "actionChecker", + "checker", + "func", + "id", + "install", + "scope", + "Interactable", + "prototype", + "getAction", + "pointer", + "event", + "interaction", + "element", + "action", + "interactable", + "rect", + "getRect", + "buttons", + "0", + "1", + "3", + "4", + "button", + "arg", + "fire", + "defaultActionChecker", + "ignoreFrom", + "_backCompatOption", + "allowFrom" + ], + "mappings": "mBAASA,MAAgB,kCACbC,MAAQ,qBAwLpB,SAASC,EAA0CC,GACjD,OAAIF,EAAGG,KAAKD,IACVE,KAAKC,QAAQJ,YAAcC,EAEpBE,MAGQ,OAAbF,UACKE,KAAKC,QAAQJ,YAEbG,MAGFA,KAAKC,QAAQJ,YAGtB,SAASK,EAA4CC,GACnD,OAAIP,EAAGQ,KAAKD,IACVH,KAAKC,QAAQC,cAAgBC,EAEtBH,MAGO,OAAZG,UACKH,KAAKC,QAAQC,cAEbF,MAGFA,KAAKC,QAAQC,4BAGP,CACbG,GAAI,iCACJC,QA5LgBC,GAChB,MAAMC,aAEJA,GACED,EAEJC,EAAaC,UAAUC,UAAY,SAEjCC,EACAC,EACAC,EACAC,GAEA,MAAMC,EA+GV,SACEC,EACAJ,EACAC,EACAC,EACAP,GAEA,MAAMU,EAAOD,EAAaE,QAAQJ,GAC5BK,EAAWP,EAAqBO,SAAY,CAChDC,EAAG,EACHC,EAAG,EACHC,EAAG,EACHC,EAAG,IACDX,EAAqBY,QACnBC,EAAM,CACVV,OAAQ,KACRC,aAAAA,EACAH,YAAAA,EACAC,QAAAA,EACAG,KAAAA,EACAE,QAAAA,GAKF,OAFAZ,EAAMmB,KAAK,mBAAoBD,GAExBA,EAAIV,OAxIMY,CAAqB3B,KAAMY,EAAOC,EAAaC,EAASP,GAEvE,OAAIP,KAAKC,QAAQC,cACRF,KAAKC,QAAQC,cAAcS,EAASC,EAAOG,EAAQf,KAAMc,EAASD,GAGpEE,GA+BTP,EAAaC,UAAUmB,WAAajC,GAAS,SAAuCG,GAClF,OAAOE,KAAK6B,kBAAkB,aAAc/B,KAC3C,qGAyBHU,EAAaC,UAAUqB,UAAYnC,GAAS,SAAuCG,GACjF,OAAOE,KAAK6B,kBAAkB,YAAa/B,KAC1C,mGAiCHU,EAAaC,UAAUP,cAAgBA,EASvCM,EAAaC,UAAUZ,YAAcA", + "sourcesContent": [ + "import { warnOnce } from '@interactjs/utils/index'\nimport * as is from '@interactjs/utils/is'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n getAction: (\n this: Interact.Interactable,\n pointer: Interact.PointerType,\n event: Interact.PointerEventType,\n interaction: Interact.Interaction,\n element: Interact.Element,\n ) => Interact.ActionProps | null\n styleCursor: typeof styleCursor\n actionChecker: typeof actionChecker\n ignoreFrom: {\n (...args: any[]): Interactable\n (): boolean\n }\n allowFrom: {\n (...args: any[]): Interactable\n (): boolean\n }\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n pointerIsDown: boolean\n }\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n /** @lends Interactable */\n Interactable, // tslint:disable-line no-shadowed-variable\n } = scope\n\n Interactable.prototype.getAction = function getAction (\n this: Interact.Interactable,\n pointer: Interact.PointerType,\n event: Interact.PointerEventType,\n interaction: Interact.Interaction,\n element: Interact.Element,\n ): Interact.ActionProps {\n const action = defaultActionChecker(this, event, interaction, element, scope)\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction)\n }\n\n return action\n }\n\n /**\n * ```js\n * interact(element, { ignoreFrom: document.getElementById('no-action') })\n * // or\n * interact(element).ignoreFrom('input, textarea, a')\n * ```\n * @deprecated\n * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n * of it's parents match the given CSS selector or Element, no\n * drag/resize/gesture is started.\n *\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * })\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to not ignore any elements\n * @return {string | Element | object} The current ignoreFrom value or this\n * Interactable\n */\n Interactable.prototype.ignoreFrom = warnOnce(function (this: Interact.Interactable, newValue) {\n return this._backCompatOption('ignoreFrom', newValue)\n }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).')\n\n /**\n * @deprecated\n *\n * A drag/resize/gesture is started only If the target of the `mousedown`,\n * `pointerdown` or `touchstart` event or any of it's parents match the given\n * CSS selector or Element.\n *\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * })\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to allow from any element\n * @return {string | Element | object} The current allowFrom value or this\n * Interactable\n */\n Interactable.prototype.allowFrom = warnOnce(function (this: Interact.Interactable, newValue) {\n return this._backCompatOption('allowFrom', newValue)\n }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).')\n\n /**\n * ```js\n * interact('.resize-drag')\n * .resizable(true)\n * .draggable(true)\n * .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n *\n * if (interact.matchesSelector(event.target, '.drag-handle')) {\n * // force drag with handle target\n * action.name = drag\n * }\n * else {\n * // resize from the top and right edges\n * action.name = 'resize'\n * action.edges = { top: true, right: true }\n * }\n *\n * return action\n * })\n * ```\n *\n * Returns or sets the function used to check action to be performed on\n * pointerDown\n *\n * @param {function | null} [checker] A function which takes a pointer event,\n * defaultAction string, interactable, element and interaction as parameters\n * and returns an object with name property 'drag' 'resize' or 'gesture' and\n * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n * props.\n * @return {Function | Interactable} The checker function or this Interactable\n */\n Interactable.prototype.actionChecker = actionChecker\n\n /**\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n * @param {boolean} [newValue]\n * @return {boolean | Interactable} The current setting or this Interactable\n */\n Interactable.prototype.styleCursor = styleCursor\n}\n\nfunction defaultActionChecker (\n interactable: Interact.Interactable,\n event: Interact.PointerEventType,\n interaction: Interact.Interaction,\n element: Interact.Element,\n scope: Interact.Scope,\n) {\n const rect = interactable.getRect(element)\n const buttons = (event as MouseEvent).buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[(event as MouseEvent).button as 0 | 1 | 3 | 4]\n const arg = {\n action: null,\n interactable,\n interaction,\n element,\n rect,\n buttons,\n }\n\n scope.fire('auto-start:check', arg)\n\n return arg.action\n}\n\nfunction styleCursor (this: Interact.Interactable): boolean\nfunction styleCursor (this: Interact.Interactable, newValue: boolean): typeof this\nfunction styleCursor (this: Interact.Interactable, newValue?: boolean) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue\n\n return this\n }\n\n if (newValue === null) {\n delete this.options.styleCursor\n\n return this\n }\n\n return this.options.styleCursor\n}\n\nfunction actionChecker (this: Interact.Interactable, checker: any) {\n if (is.func(checker)) {\n this.options.actionChecker = checker\n\n return this\n }\n\n if (checker === null) {\n delete this.options.actionChecker\n\n return this\n }\n\n return this.options.actionChecker\n}\n\nexport default {\n id: 'auto-start/interactableMethods',\n install,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/LICENSE b/@interactjs/auto-start/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/auto-start/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/auto-start/autoStart.spec.d.ts b/@interactjs/auto-start/autoStart.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/auto-start/autoStart.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/auto-start/base.d.ts b/@interactjs/auto-start/base.d.ts new file mode 100644 index 000000000..901897f72 --- /dev/null +++ b/@interactjs/auto-start/base.d.ts @@ -0,0 +1,49 @@ +declare module '@interactjs/interact/index' { + interface InteractStatic { + maxInteractions: (newValue: any) => any; + } +} +declare module '@interactjs/core/scope' { + interface Scope { + autoStart: AutoStart; + maxInteractions: (...args: any[]) => any; + } + interface SignalArgs { + 'autoStart:before-start': Interact.SignalArgs['interactions:move']; + 'autoStart:prepared': { + interaction: Interact.Interaction; + }; + 'auto-start:check': CheckSignalArg; + } +} +declare module '@interactjs/core/defaultOptions' { + interface BaseDefaults { + actionChecker?: any; + cursorChecker?: any; + styleCursor?: any; + } + interface PerActionDefaults { + manualStart?: boolean; + max?: number; + maxPerElement?: number; + allowFrom?: string | Interact.Element; + ignoreFrom?: string | Interact.Element; + cursorChecker?: Interact.CursorChecker; + mouseButtons?: 0 | 1 | 2 | 4 | 16; + } +} +interface CheckSignalArg { + interactable: Interact.Interactable; + interaction: Interact.Interaction; + element: Interact.Element; + action: Interact.ActionProps; + buttons: number; +} +export interface AutoStart { + maxInteractions: number; + withinInteractionLimit: typeof withinInteractionLimit; + cursorElement: Interact.Element; +} +declare function withinInteractionLimit(interactable: Interact.Interactable, element: Interact.Element, action: Interact.ActionProps, scope: Interact.Scope): boolean; +declare const autoStart: Interact.Plugin; +export default autoStart; diff --git a/@interactjs/auto-start/base.js b/@interactjs/auto-start/base.js new file mode 100644 index 000000000..a09c1bbdf --- /dev/null +++ b/@interactjs/auto-start/base.js @@ -0,0 +1,315 @@ +import * as utils from "../utils/index.js"; +import InteractableMethods from "./InteractableMethods.js"; + +function install(scope) { + const { + interact, + defaults + } = scope; + scope.usePlugin(InteractableMethods); + defaults.base.actionChecker = null; + defaults.base.styleCursor = true; + utils.extend(defaults.perAction, { + manualStart: false, + max: Infinity, + maxPerElement: 1, + allowFrom: null, + ignoreFrom: null, + // only allow left button by default + // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value + mouseButtons: 1 + }); + /** + * Returns or sets the maximum number of concurrent interactions allowed. By + * default only 1 interaction is allowed at a time (for backwards + * compatibility). To allow multiple interactions on the same Interactables and + * elements, you need to enable it in the draggable, resizable and gesturable + * `'max'` and `'maxPerElement'` options. + * + * @alias module:interact.maxInteractions + * + * @param {number} [newValue] Any number. newValue <= 0 means no interactions. + */ + + interact.maxInteractions = newValue => maxInteractions(newValue, scope); + + scope.autoStart = { + // Allow this many interactions to happen simultaneously + maxInteractions: Infinity, + withinInteractionLimit, + cursorElement: null + }; +} + +function prepareOnDown({ + interaction, + pointer, + event, + eventTarget +}, scope) { + if (interaction.interacting()) { + return; + } + + const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function prepareOnMove({ + interaction, + pointer, + event, + eventTarget +}, scope) { + if (interaction.pointerType !== 'mouse' || interaction.pointerIsDown || interaction.interacting()) { + return; + } + + const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function startOnMove(arg, scope) { + const { + interaction + } = arg; + + if (!interaction.pointerIsDown || interaction.interacting() || !interaction.pointerWasMoved || !interaction.prepared.name) { + return; + } + + scope.fire('autoStart:before-start', arg); + const { + interactable + } = interaction; + const actionName = interaction.prepared.name; + + if (actionName && interactable) { + // check manualStart and interaction limit + if (interactable.options[actionName].manualStart || !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) { + interaction.stop(); + } else { + interaction.start(interaction.prepared, interactable, interaction.element); + setInteractionCursor(interaction, scope); + } + } +} + +function clearCursorOnStop({ + interaction +}, scope) { + const { + interactable + } = interaction; + + if (interactable && interactable.options.styleCursor) { + setCursor(interaction.element, '', scope); + } +} // Check if the current interactable supports the action. +// If so, return the validated action. Otherwise, return null + + +function validateAction(action, interactable, element, eventTarget, scope) { + if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) && interactable.options[action.name].enabled && withinInteractionLimit(interactable, element, action, scope)) { + return action; + } + + return null; +} + +function validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope) { + for (let i = 0, len = matches.length; i < len; i++) { + const match = matches[i]; + const matchElement = matchElements[i]; + const matchAction = match.getAction(pointer, event, interaction, matchElement); + + if (!matchAction) { + continue; + } + + const action = validateAction(matchAction, match, matchElement, eventTarget, scope); + + if (action) { + return { + action, + interactable: match, + element: matchElement + }; + } + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function getActionInfo(interaction, pointer, event, eventTarget, scope) { + let matches = []; + let matchElements = []; + let element = eventTarget; + + function pushMatches(interactable) { + matches.push(interactable); + matchElements.push(element); + } + + while (utils.is.element(element)) { + matches = []; + matchElements = []; + scope.interactables.forEachMatch(element, pushMatches); + const actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope); + + if (actionInfo.action && !actionInfo.interactable.options[actionInfo.action.name].manualStart) { + return actionInfo; + } + + element = utils.dom.parentNode(element); + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function prepare(interaction, { + action, + interactable, + element +}, scope) { + action = action || { + name: null + }; + interaction.interactable = interactable; + interaction.element = element; + utils.copyAction(interaction.prepared, action); + interaction.rect = interactable && action.name ? interactable.getRect(element) : null; + setInteractionCursor(interaction, scope); + scope.fire('autoStart:prepared', { + interaction + }); +} + +function withinInteractionLimit(interactable, element, action, scope) { + const options = interactable.options; + const maxActions = options[action.name].max; + const maxPerElement = options[action.name].maxPerElement; + const autoStartMax = scope.autoStart.maxInteractions; + let activeInteractions = 0; + let interactableCount = 0; + let elementCount = 0; // no actions if any of these values == 0 + + if (!(maxActions && maxPerElement && autoStartMax)) { + return false; + } + + for (const interaction of scope.interactions.list) { + const otherAction = interaction.prepared.name; + + if (!interaction.interacting()) { + continue; + } + + activeInteractions++; + + if (activeInteractions >= autoStartMax) { + return false; + } + + if (interaction.interactable !== interactable) { + continue; + } + + interactableCount += otherAction === action.name ? 1 : 0; + + if (interactableCount >= maxActions) { + return false; + } + + if (interaction.element === element) { + elementCount++; + + if (otherAction === action.name && elementCount >= maxPerElement) { + return false; + } + } + } + + return autoStartMax > 0; +} + +function maxInteractions(newValue, scope) { + if (utils.is.number(newValue)) { + scope.autoStart.maxInteractions = newValue; + return this; + } + + return scope.autoStart.maxInteractions; +} + +function setCursor(element, cursor, scope) { + const { + cursorElement: prevCursorElement + } = scope.autoStart; + + if (prevCursorElement && prevCursorElement !== element) { + prevCursorElement.style.cursor = ''; + } + + element.ownerDocument.documentElement.style.cursor = cursor; + element.style.cursor = cursor; + scope.autoStart.cursorElement = cursor ? element : null; +} + +function setInteractionCursor(interaction, scope) { + const { + interactable, + element, + prepared + } = interaction; + + if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) { + // clear previous target element cursor + if (scope.autoStart.cursorElement) { + setCursor(scope.autoStart.cursorElement, '', scope); + } + + return; + } + + let cursor = ''; + + if (prepared.name) { + const cursorChecker = interactable.options[prepared.name].cursorChecker; + + if (utils.is.func(cursorChecker)) { + cursor = cursorChecker(prepared, interactable, element, interaction._interacting); + } else { + cursor = scope.actions.map[prepared.name].getCursor(prepared); + } + } + + setCursor(interaction.element, cursor || '', scope); +} + +const autoStart = { + id: 'auto-start/base', + before: ['actions', 'actions/drag', 'actions/resize', 'actions/gesture'], + install, + listeners: { + 'interactions:down': prepareOnDown, + 'interactions:move': (arg, scope) => { + prepareOnMove(arg, scope); + startOnMove(arg, scope); + }, + 'interactions:stop': clearCursorOnStop + }, + maxInteractions, + withinInteractionLimit, + validateAction +}; +export default autoStart; +//# sourceMappingURL=base.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/base.js.map b/@interactjs/auto-start/base.js.map new file mode 100644 index 000000000..4ae929f99 --- /dev/null +++ b/@interactjs/auto-start/base.js.map @@ -0,0 +1,110 @@ +{ + "version": 3, + "sources": [ + "base.ts" + ], + "names": [ + "utils", + "InteractableMethods", + "install", + "scope", + "interact", + "defaults", + "usePlugin", + "base", + "actionChecker", + "styleCursor", + "extend", + "perAction", + "manualStart", + "max", + "Infinity", + "maxPerElement", + "allowFrom", + "ignoreFrom", + "mouseButtons", + "maxInteractions", + "newValue", + "autoStart", + "withinInteractionLimit", + "cursorElement", + "prepareOnDown", + "interaction", + "pointer", + "event", + "eventTarget", + "interacting", + "actionInfo", + "getActionInfo", + "prepare", + "prepareOnMove", + "pointerType", + "pointerIsDown", + "startOnMove", + "arg", + "pointerWasMoved", + "prepared", + "name", + "fire", + "interactable", + "actionName", + "options", + "element", + "stop", + "start", + "setInteractionCursor", + "clearCursorOnStop", + "setCursor", + "validateAction", + "action", + "testIgnoreAllow", + "enabled", + "validateMatches", + "matches", + "matchElements", + "i", + "len", + "length", + "match", + "matchElement", + "matchAction", + "getAction", + "pushMatches", + "push", + "is", + "interactables", + "forEachMatch", + "dom", + "parentNode", + "copyAction", + "rect", + "getRect", + "maxActions", + "autoStartMax", + "activeInteractions", + "interactableCount", + "elementCount", + "interactions", + "list", + "otherAction", + "number", + "cursor", + "prevCursorElement", + "style", + "ownerDocument", + "documentElement", + "cursorChecker", + "func", + "_interacting", + "actions", + "map", + "getCursor", + "id", + "before", + "listeners" + ], + "mappings": "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", + "sourcesContent": [ + "import * as utils from '@interactjs/utils/index'\nimport InteractableMethods from './InteractableMethods'\n\ndeclare module '@interactjs/interact/index' {\n interface InteractStatic {\n maxInteractions: (newValue: any) => any\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n autoStart: AutoStart\n maxInteractions: (...args: any[]) => any\n }\n\n interface SignalArgs {\n 'autoStart:before-start': Interact.SignalArgs['interactions:move']\n 'autoStart:prepared': { interaction: Interact.Interaction }\n 'auto-start:check': CheckSignalArg\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface BaseDefaults {\n actionChecker?: any\n cursorChecker?: any\n styleCursor?: any\n }\n\n interface PerActionDefaults {\n manualStart?: boolean\n max?: number\n maxPerElement?: number\n allowFrom?: string | Interact.Element\n ignoreFrom?: string | Interact.Element\n cursorChecker?: Interact.CursorChecker\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons?: 0 | 1 | 2 | 4 | 16\n }\n}\n\ninterface CheckSignalArg {\n interactable: Interact.Interactable\n interaction: Interact.Interaction\n element: Interact.Element\n action: Interact.ActionProps\n buttons: number\n}\n\nexport interface AutoStart {\n // Allow this many interactions to happen simultaneously\n maxInteractions: number\n withinInteractionLimit: typeof withinInteractionLimit\n cursorElement: Interact.Element\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n interact,\n defaults,\n } = scope\n\n scope.usePlugin(InteractableMethods)\n\n defaults.base.actionChecker = null\n defaults.base.styleCursor = true\n\n utils.extend(defaults.perAction, {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n })\n\n /**\n * Returns or sets the maximum number of concurrent interactions allowed. By\n * default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables and\n * elements, you need to enable it in the draggable, resizable and gesturable\n * `'max'` and `'maxPerElement'` options.\n *\n * @alias module:interact.maxInteractions\n *\n * @param {number} [newValue] Any number. newValue <= 0 means no interactions.\n */\n interact.maxInteractions = newValue => maxInteractions(newValue, scope)\n\n scope.autoStart = {\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n withinInteractionLimit,\n cursorElement: null,\n }\n}\n\nfunction prepareOnDown ({ interaction, pointer, event, eventTarget }: Interact.SignalArgs['interactions:down'], scope: Interact.Scope) {\n if (interaction.interacting()) { return }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope)\n prepare(interaction, actionInfo, scope)\n}\n\nfunction prepareOnMove ({ interaction, pointer, event, eventTarget }: Interact.SignalArgs['interactions:move'], scope: Interact.Scope) {\n if (interaction.pointerType !== 'mouse' ||\n interaction.pointerIsDown ||\n interaction.interacting()) { return }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget as Interact.Element, scope)\n prepare(interaction, actionInfo, scope)\n}\n\nfunction startOnMove (arg: Interact.SignalArgs['interactions:move'], scope: Interact.Scope) {\n const { interaction } = arg\n\n if (!interaction.pointerIsDown ||\n interaction.interacting() ||\n !interaction.pointerWasMoved ||\n !interaction.prepared.name) {\n return\n }\n\n scope.fire('autoStart:before-start', arg)\n\n const { interactable } = interaction\n const actionName = interaction.prepared.name\n\n if (actionName && interactable) {\n // check manualStart and interaction limit\n if (interactable.options[actionName].manualStart ||\n !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) {\n interaction.stop()\n }\n else {\n interaction.start(interaction.prepared, interactable, interaction.element)\n setInteractionCursor(interaction, scope)\n }\n }\n}\n\nfunction clearCursorOnStop ({ interaction }: { interaction: Interact.Interaction }, scope: Interact.Scope) {\n const { interactable } = interaction\n\n if (interactable && interactable.options.styleCursor) {\n setCursor(interaction.element, '', scope)\n }\n}\n\n// Check if the current interactable supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (\n action: Interact.ActionProps,\n interactable: Interact.Interactable,\n element: Interact.Element,\n eventTarget: Interact.EventTarget,\n scope: Interact.Scope,\n) {\n if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) &&\n interactable.options[action.name].enabled &&\n withinInteractionLimit(interactable, element, action, scope)) {\n return action\n }\n\n return null\n}\n\nfunction validateMatches (\n interaction: Interact.Interaction,\n pointer: Interact.PointerType,\n event: Interact.PointerEventType,\n matches: Interact.Interactable[],\n matchElements: Interact.Element[],\n eventTarget: Interact.EventTarget,\n scope: Interact.Scope,\n) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i]\n const matchElement = matchElements[i]\n const matchAction = match.getAction(pointer, event, interaction, matchElement)\n\n if (!matchAction) { continue }\n\n const action = validateAction(\n matchAction,\n match,\n matchElement,\n eventTarget,\n scope)\n\n if (action) {\n return {\n action,\n interactable: match,\n element: matchElement,\n }\n }\n }\n\n return { action: null, interactable: null, element: null }\n}\n\nfunction getActionInfo (\n interaction: Interact.Interaction,\n pointer: Interact.PointerType,\n event: Interact.PointerEventType,\n eventTarget: Interact.EventTarget,\n scope: Interact.Scope,\n) {\n let matches: Interact.Interactable[] = []\n let matchElements: Interact.Element[] = []\n\n let element = eventTarget as Interact.Element\n\n function pushMatches (interactable: Interact.Interactable) {\n matches.push(interactable)\n matchElements.push(element)\n }\n\n while (utils.is.element(element)) {\n matches = []\n matchElements = []\n\n scope.interactables.forEachMatch(element, pushMatches)\n\n const actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope)\n\n if (actionInfo.action &&\n !actionInfo.interactable.options[actionInfo.action.name].manualStart) {\n return actionInfo\n }\n\n element = utils.dom.parentNode(element) as Interact.Element\n }\n\n return { action: null, interactable: null, element: null }\n}\n\nfunction prepare (\n interaction: Interact.Interaction,\n { action, interactable, element }: {\n action: Interact.ActionProps\n interactable: Interact.Interactable\n element: Interact.Element\n },\n scope: Interact.Scope,\n) {\n action = action || { name: null }\n\n interaction.interactable = interactable\n interaction.element = element\n utils.copyAction(interaction.prepared, action)\n\n interaction.rect = interactable && action.name\n ? interactable.getRect(element)\n : null\n\n setInteractionCursor(interaction, scope)\n\n scope.fire('autoStart:prepared', { interaction })\n}\n\nfunction withinInteractionLimit (\n interactable: Interact.Interactable,\n element: Interact.Element,\n action: Interact.ActionProps,\n scope: Interact.Scope,\n) {\n const options = interactable.options\n const maxActions = options[action.name].max\n const maxPerElement = options[action.name].maxPerElement\n const autoStartMax = scope.autoStart.maxInteractions\n let activeInteractions = 0\n let interactableCount = 0\n let elementCount = 0\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStartMax)) { return false }\n\n for (const interaction of scope.interactions.list) {\n const otherAction = interaction.prepared.name\n\n if (!interaction.interacting()) { continue }\n\n activeInteractions++\n\n if (activeInteractions >= autoStartMax) {\n return false\n }\n\n if (interaction.interactable !== interactable) { continue }\n\n interactableCount += otherAction === action.name ? 1 : 0\n\n if (interactableCount >= maxActions) {\n return false\n }\n\n if (interaction.element === element) {\n elementCount++\n\n if (otherAction === action.name && elementCount >= maxPerElement) {\n return false\n }\n }\n }\n\n return autoStartMax > 0\n}\n\nfunction maxInteractions (newValue: any, scope: Interact.Scope) {\n if (utils.is.number(newValue)) {\n scope.autoStart.maxInteractions = newValue\n\n return this\n }\n\n return scope.autoStart.maxInteractions\n}\n\nfunction setCursor (element: Interact.Element, cursor: string, scope: Interact.Scope) {\n const { cursorElement: prevCursorElement } = scope.autoStart\n\n if (prevCursorElement && prevCursorElement !== element) {\n prevCursorElement.style.cursor = ''\n }\n\n element.ownerDocument.documentElement.style.cursor = cursor\n element.style.cursor = cursor\n scope.autoStart.cursorElement = cursor ? element : null\n}\n\nfunction setInteractionCursor (interaction: Interact.Interaction, scope: Interact.Scope) {\n const { interactable, element, prepared } = interaction\n\n if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) {\n // clear previous target element cursor\n if (scope.autoStart.cursorElement) {\n setCursor(scope.autoStart.cursorElement, '', scope)\n }\n\n return\n }\n\n let cursor = ''\n\n if (prepared.name) {\n const cursorChecker: Interact.CursorChecker = interactable.options[prepared.name].cursorChecker\n\n if (utils.is.func(cursorChecker)) {\n cursor = cursorChecker(prepared, interactable, element, interaction._interacting)\n }\n else {\n cursor = scope.actions.map[prepared.name].getCursor(prepared)\n }\n }\n\n setCursor(interaction.element, cursor || '', scope)\n}\n\nconst autoStart: Interact.Plugin = {\n id: 'auto-start/base',\n before: ['actions', 'actions/drag', 'actions/resize', 'actions/gesture'],\n install,\n listeners: {\n 'interactions:down': prepareOnDown,\n 'interactions:move': (arg, scope) => {\n prepareOnMove(arg, scope)\n startOnMove(arg, scope)\n },\n 'interactions:stop': clearCursorOnStop,\n },\n maxInteractions,\n withinInteractionLimit,\n validateAction,\n} as Interact.Plugin\n\nexport default autoStart\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/base.min.js b/@interactjs/auto-start/base.min.js new file mode 100644 index 000000000..4807680a2 --- /dev/null +++ b/@interactjs/auto-start/base.min.js @@ -0,0 +1,2 @@ +import*as t from"../utils/index.min.js";import e from"./InteractableMethods.min.js";function n(t,e,n,r,a){return e.testIgnoreAllow(e.options[t.name],n,r)&&e.options[t.name].enabled&&i(e,n,t,a)?t:null}function r(t,e,r,a,o,i,c){for(let s=0,l=a.length;s=c)return!1;if(a.interactable===t){if(l+=r===n.name?1:0,l>=o)return!1;if(a.element===e&&(u++,r===n.name&&u>=i))return!1}}}return c>0}function c(e,n){return t.is.number(e)?(n.autoStart.maxInteractions=e,this):n.autoStart.maxInteractions}function s(t,e,n){const{cursorElement:r}=n.autoStart;r&&r!==t&&(r.style.cursor=""),t.ownerDocument.documentElement.style.cursor=e,t.style.cursor=e,n.autoStart.cursorElement=e?t:null}function l(e,n){const{interactable:r,element:a,prepared:o}=e;if("mouse"!==e.pointerType||!r||!r.options.styleCursor)return void(n.autoStart.cursorElement&&s(n.autoStart.cursorElement,"",n));let i="";if(o.name){const c=r.options[o.name].cursorChecker;i=t.is.func(c)?c(o,r,a,e._interacting):n.actions.map[o.name].getCursor(o)}s(e.element,i||"",n)}const u={id:"auto-start/base",before:["actions","actions/drag","actions/resize","actions/gesture"],install(n){const{interact:r,defaults:a}=n;n.usePlugin(e),a.base.actionChecker=null,a.base.styleCursor=!0,t.extend(a.perAction,{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null,mouseButtons:1}),r.maxInteractions=t=>c(t,n),n.autoStart={maxInteractions:1/0,withinInteractionLimit:i,cursorElement:null}},listeners:{"interactions:down"({interaction:t,pointer:e,event:n,eventTarget:r},i){t.interacting()||o(t,a(t,e,n,r,i),i)},"interactions:move"(t,e){!function({interaction:t,pointer:e,event:n,eventTarget:r},i){if("mouse"!==t.pointerType||t.pointerIsDown||t.interacting())return;o(t,a(t,e,n,r,i),i)}(t,e),function(t,e){const{interaction:n}=t;if(!n.pointerIsDown||n.interacting()||!n.pointerWasMoved||!n.prepared.name)return;e.fire("autoStart:before-start",t);const{interactable:r}=n,a=n.prepared.name;a&&r&&(r.options[a].manualStart||!i(r,n.element,n.prepared,e)?n.stop():(n.start(n.prepared,r,n.element),l(n,e)))}(t,e)},"interactions:stop"({interaction:t},e){const{interactable:n}=t;n&&n.options.styleCursor&&s(t.element,"",e)}},maxInteractions:c,withinInteractionLimit:i,validateAction:n};export default u; +//# sourceMappingURL=base.min.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/base.min.js.map b/@interactjs/auto-start/base.min.js.map new file mode 100644 index 000000000..582f38555 --- /dev/null +++ b/@interactjs/auto-start/base.min.js.map @@ -0,0 +1,110 @@ +{ + "version": 3, + "sources": [ + "base.ts" + ], + "names": [ + "utils", + "InteractableMethods", + "validateAction", + "action", + "interactable", + "element", + "eventTarget", + "scope", + "testIgnoreAllow", + "options", + "name", + "enabled", + "withinInteractionLimit", + "validateMatches", + "interaction", + "pointer", + "event", + "matches", + "matchElements", + "i", + "len", + "length", + "match", + "matchElement", + "matchAction", + "getAction", + "getActionInfo", + "pushMatches", + "push", + "is", + "interactables", + "forEachMatch", + "actionInfo", + "manualStart", + "dom", + "parentNode", + "prepare", + "copyAction", + "prepared", + "rect", + "getRect", + "setInteractionCursor", + "fire", + "maxActions", + "max", + "maxPerElement", + "autoStartMax", + "autoStart", + "maxInteractions", + "activeInteractions", + "interactableCount", + "elementCount", + "interactions", + "list", + "otherAction", + "interacting", + "newValue", + "number", + "this", + "setCursor", + "cursor", + "cursorElement", + "prevCursorElement", + "style", + "ownerDocument", + "documentElement", + "pointerType", + "styleCursor", + "cursorChecker", + "func", + "_interacting", + "actions", + "map", + "getCursor", + "id", + "before", + "install", + "interact", + "defaults", + "usePlugin", + "base", + "actionChecker", + "extend", + "perAction", + "Infinity", + "allowFrom", + "ignoreFrom", + "mouseButtons", + "listeners", + "[object Object]", + "arg", + "pointerIsDown", + "prepareOnMove", + "pointerWasMoved", + "actionName", + "stop", + "start", + "startOnMove" + ], + "mappings": "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", + "sourcesContent": [ + "import * as utils from '@interactjs/utils/index'\nimport InteractableMethods from './InteractableMethods'\n\ndeclare module '@interactjs/interact/index' {\n interface InteractStatic {\n maxInteractions: (newValue: any) => any\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n autoStart: AutoStart\n maxInteractions: (...args: any[]) => any\n }\n\n interface SignalArgs {\n 'autoStart:before-start': Interact.SignalArgs['interactions:move']\n 'autoStart:prepared': { interaction: Interact.Interaction }\n 'auto-start:check': CheckSignalArg\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface BaseDefaults {\n actionChecker?: any\n cursorChecker?: any\n styleCursor?: any\n }\n\n interface PerActionDefaults {\n manualStart?: boolean\n max?: number\n maxPerElement?: number\n allowFrom?: string | Interact.Element\n ignoreFrom?: string | Interact.Element\n cursorChecker?: Interact.CursorChecker\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons?: 0 | 1 | 2 | 4 | 16\n }\n}\n\ninterface CheckSignalArg {\n interactable: Interact.Interactable\n interaction: Interact.Interaction\n element: Interact.Element\n action: Interact.ActionProps\n buttons: number\n}\n\nexport interface AutoStart {\n // Allow this many interactions to happen simultaneously\n maxInteractions: number\n withinInteractionLimit: typeof withinInteractionLimit\n cursorElement: Interact.Element\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n interact,\n defaults,\n } = scope\n\n scope.usePlugin(InteractableMethods)\n\n defaults.base.actionChecker = null\n defaults.base.styleCursor = true\n\n utils.extend(defaults.perAction, {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n })\n\n /**\n * Returns or sets the maximum number of concurrent interactions allowed. By\n * default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables and\n * elements, you need to enable it in the draggable, resizable and gesturable\n * `'max'` and `'maxPerElement'` options.\n *\n * @alias module:interact.maxInteractions\n *\n * @param {number} [newValue] Any number. newValue <= 0 means no interactions.\n */\n interact.maxInteractions = newValue => maxInteractions(newValue, scope)\n\n scope.autoStart = {\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n withinInteractionLimit,\n cursorElement: null,\n }\n}\n\nfunction prepareOnDown ({ interaction, pointer, event, eventTarget }: Interact.SignalArgs['interactions:down'], scope: Interact.Scope) {\n if (interaction.interacting()) { return }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope)\n prepare(interaction, actionInfo, scope)\n}\n\nfunction prepareOnMove ({ interaction, pointer, event, eventTarget }: Interact.SignalArgs['interactions:move'], scope: Interact.Scope) {\n if (interaction.pointerType !== 'mouse' ||\n interaction.pointerIsDown ||\n interaction.interacting()) { return }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget as Interact.Element, scope)\n prepare(interaction, actionInfo, scope)\n}\n\nfunction startOnMove (arg: Interact.SignalArgs['interactions:move'], scope: Interact.Scope) {\n const { interaction } = arg\n\n if (!interaction.pointerIsDown ||\n interaction.interacting() ||\n !interaction.pointerWasMoved ||\n !interaction.prepared.name) {\n return\n }\n\n scope.fire('autoStart:before-start', arg)\n\n const { interactable } = interaction\n const actionName = interaction.prepared.name\n\n if (actionName && interactable) {\n // check manualStart and interaction limit\n if (interactable.options[actionName].manualStart ||\n !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) {\n interaction.stop()\n }\n else {\n interaction.start(interaction.prepared, interactable, interaction.element)\n setInteractionCursor(interaction, scope)\n }\n }\n}\n\nfunction clearCursorOnStop ({ interaction }: { interaction: Interact.Interaction }, scope: Interact.Scope) {\n const { interactable } = interaction\n\n if (interactable && interactable.options.styleCursor) {\n setCursor(interaction.element, '', scope)\n }\n}\n\n// Check if the current interactable supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (\n action: Interact.ActionProps,\n interactable: Interact.Interactable,\n element: Interact.Element,\n eventTarget: Interact.EventTarget,\n scope: Interact.Scope,\n) {\n if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) &&\n interactable.options[action.name].enabled &&\n withinInteractionLimit(interactable, element, action, scope)) {\n return action\n }\n\n return null\n}\n\nfunction validateMatches (\n interaction: Interact.Interaction,\n pointer: Interact.PointerType,\n event: Interact.PointerEventType,\n matches: Interact.Interactable[],\n matchElements: Interact.Element[],\n eventTarget: Interact.EventTarget,\n scope: Interact.Scope,\n) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i]\n const matchElement = matchElements[i]\n const matchAction = match.getAction(pointer, event, interaction, matchElement)\n\n if (!matchAction) { continue }\n\n const action = validateAction(\n matchAction,\n match,\n matchElement,\n eventTarget,\n scope)\n\n if (action) {\n return {\n action,\n interactable: match,\n element: matchElement,\n }\n }\n }\n\n return { action: null, interactable: null, element: null }\n}\n\nfunction getActionInfo (\n interaction: Interact.Interaction,\n pointer: Interact.PointerType,\n event: Interact.PointerEventType,\n eventTarget: Interact.EventTarget,\n scope: Interact.Scope,\n) {\n let matches: Interact.Interactable[] = []\n let matchElements: Interact.Element[] = []\n\n let element = eventTarget as Interact.Element\n\n function pushMatches (interactable: Interact.Interactable) {\n matches.push(interactable)\n matchElements.push(element)\n }\n\n while (utils.is.element(element)) {\n matches = []\n matchElements = []\n\n scope.interactables.forEachMatch(element, pushMatches)\n\n const actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope)\n\n if (actionInfo.action &&\n !actionInfo.interactable.options[actionInfo.action.name].manualStart) {\n return actionInfo\n }\n\n element = utils.dom.parentNode(element) as Interact.Element\n }\n\n return { action: null, interactable: null, element: null }\n}\n\nfunction prepare (\n interaction: Interact.Interaction,\n { action, interactable, element }: {\n action: Interact.ActionProps\n interactable: Interact.Interactable\n element: Interact.Element\n },\n scope: Interact.Scope,\n) {\n action = action || { name: null }\n\n interaction.interactable = interactable\n interaction.element = element\n utils.copyAction(interaction.prepared, action)\n\n interaction.rect = interactable && action.name\n ? interactable.getRect(element)\n : null\n\n setInteractionCursor(interaction, scope)\n\n scope.fire('autoStart:prepared', { interaction })\n}\n\nfunction withinInteractionLimit (\n interactable: Interact.Interactable,\n element: Interact.Element,\n action: Interact.ActionProps,\n scope: Interact.Scope,\n) {\n const options = interactable.options\n const maxActions = options[action.name].max\n const maxPerElement = options[action.name].maxPerElement\n const autoStartMax = scope.autoStart.maxInteractions\n let activeInteractions = 0\n let interactableCount = 0\n let elementCount = 0\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStartMax)) { return false }\n\n for (const interaction of scope.interactions.list) {\n const otherAction = interaction.prepared.name\n\n if (!interaction.interacting()) { continue }\n\n activeInteractions++\n\n if (activeInteractions >= autoStartMax) {\n return false\n }\n\n if (interaction.interactable !== interactable) { continue }\n\n interactableCount += otherAction === action.name ? 1 : 0\n\n if (interactableCount >= maxActions) {\n return false\n }\n\n if (interaction.element === element) {\n elementCount++\n\n if (otherAction === action.name && elementCount >= maxPerElement) {\n return false\n }\n }\n }\n\n return autoStartMax > 0\n}\n\nfunction maxInteractions (newValue: any, scope: Interact.Scope) {\n if (utils.is.number(newValue)) {\n scope.autoStart.maxInteractions = newValue\n\n return this\n }\n\n return scope.autoStart.maxInteractions\n}\n\nfunction setCursor (element: Interact.Element, cursor: string, scope: Interact.Scope) {\n const { cursorElement: prevCursorElement } = scope.autoStart\n\n if (prevCursorElement && prevCursorElement !== element) {\n prevCursorElement.style.cursor = ''\n }\n\n element.ownerDocument.documentElement.style.cursor = cursor\n element.style.cursor = cursor\n scope.autoStart.cursorElement = cursor ? element : null\n}\n\nfunction setInteractionCursor (interaction: Interact.Interaction, scope: Interact.Scope) {\n const { interactable, element, prepared } = interaction\n\n if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) {\n // clear previous target element cursor\n if (scope.autoStart.cursorElement) {\n setCursor(scope.autoStart.cursorElement, '', scope)\n }\n\n return\n }\n\n let cursor = ''\n\n if (prepared.name) {\n const cursorChecker: Interact.CursorChecker = interactable.options[prepared.name].cursorChecker\n\n if (utils.is.func(cursorChecker)) {\n cursor = cursorChecker(prepared, interactable, element, interaction._interacting)\n }\n else {\n cursor = scope.actions.map[prepared.name].getCursor(prepared)\n }\n }\n\n setCursor(interaction.element, cursor || '', scope)\n}\n\nconst autoStart: Interact.Plugin = {\n id: 'auto-start/base',\n before: ['actions', 'actions/drag', 'actions/resize', 'actions/gesture'],\n install,\n listeners: {\n 'interactions:down': prepareOnDown,\n 'interactions:move': (arg, scope) => {\n prepareOnMove(arg, scope)\n startOnMove(arg, scope)\n },\n 'interactions:stop': clearCursorOnStop,\n },\n maxInteractions,\n withinInteractionLimit,\n validateAction,\n} as Interact.Plugin\n\nexport default autoStart\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/dragAxis.d.ts b/@interactjs/auto-start/dragAxis.d.ts new file mode 100644 index 000000000..c1e110d33 --- /dev/null +++ b/@interactjs/auto-start/dragAxis.d.ts @@ -0,0 +1,8 @@ +declare function beforeStart({ interaction, eventTarget, dx, dy }: Interact.SignalArgs['interactions:move'], scope: Interact.Scope): void; +declare const _default: { + id: string; + listeners: { + 'autoStart:before-start': typeof beforeStart; + }; +}; +export default _default; diff --git a/@interactjs/auto-start/dragAxis.js b/@interactjs/auto-start/dragAxis.js new file mode 100644 index 000000000..884dfb95f --- /dev/null +++ b/@interactjs/auto-start/dragAxis.js @@ -0,0 +1,77 @@ +import { parentNode } from "../utils/domUtils.js"; +import * as is from "../utils/is.js"; +import autoStart from "./base.js"; + +function beforeStart({ + interaction, + eventTarget, + dx, + dy +}, scope) { + if (interaction.prepared.name !== 'drag') { + return; + } // check if a drag is in the correct axis + + + const absX = Math.abs(dx); + const absY = Math.abs(dy); + const targetOptions = interaction.interactable.options.drag; + const startAxis = targetOptions.startAxis; + const currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy'; + interaction.prepared.axis = targetOptions.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy' + : targetOptions.lockAxis; // if the movement isn't in the startAxis of the interactable + + if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) { + // cancel the prepared action + interaction.prepared.name = null; // then try to get a drag from another ineractable + + let element = eventTarget; + + const getDraggable = function (interactable) { + if (interactable === interaction.interactable) { + return; + } + + const options = interaction.interactable.options.drag; + + if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) { + const action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element); + + if (action && action.name === 'drag' && checkStartAxis(currentAxis, interactable) && autoStart.validateAction(action, interactable, element, eventTarget, scope)) { + return interactable; + } + } + }; // check all interactables + + + while (is.element(element)) { + const interactable = scope.interactables.forEachMatch(element, getDraggable); + + if (interactable) { + interaction.prepared.name = 'drag'; + interaction.interactable = interactable; + interaction.element = element; + break; + } + + element = parentNode(element); + } + } +} + +function checkStartAxis(startAxis, interactable) { + if (!interactable) { + return false; + } + + const thisAxis = interactable.options.drag.startAxis; + return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis; +} + +export default { + id: 'auto-start/dragAxis', + listeners: { + 'autoStart:before-start': beforeStart + } +}; +//# sourceMappingURL=dragAxis.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/dragAxis.js.map b/@interactjs/auto-start/dragAxis.js.map new file mode 100644 index 000000000..22cd0abb9 --- /dev/null +++ b/@interactjs/auto-start/dragAxis.js.map @@ -0,0 +1,50 @@ +{ + "version": 3, + "sources": [ + "dragAxis.ts" + ], + "names": [ + "parentNode", + "is", + "autoStart", + "beforeStart", + "interaction", + "eventTarget", + "dx", + "dy", + "scope", + "prepared", + "name", + "absX", + "Math", + "abs", + "absY", + "targetOptions", + "interactable", + "options", + "drag", + "startAxis", + "currentAxis", + "axis", + "lockAxis", + "element", + "getDraggable", + "manualStart", + "testIgnoreAllow", + "action", + "getAction", + "downPointer", + "downEvent", + "checkStartAxis", + "validateAction", + "interactables", + "forEachMatch", + "thisAxis", + "id", + "listeners" + ], + "mappings": "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", + "sourcesContent": [ + "import { parentNode } from '@interactjs/utils/domUtils'\nimport * as is from '@interactjs/utils/is'\nimport autoStart from './base'\n\nfunction beforeStart ({ interaction, eventTarget, dx, dy }: Interact.SignalArgs['interactions:move'], scope: Interact.Scope) {\n if (interaction.prepared.name !== 'drag') { return }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx)\n const absY = Math.abs(dy)\n const targetOptions = interaction.interactable.options.drag\n const startAxis = targetOptions.startAxis\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy')\n\n interaction.prepared.axis = targetOptions.lockAxis === 'start'\n ? currentAxis[0] as 'x' | 'y' // always lock to one axis even if currentAxis === 'xy'\n : targetOptions.lockAxis\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null\n\n // then try to get a drag from another ineractable\n let element = eventTarget as Interact.Element\n\n const getDraggable = function (interactable: Interact.Interactable): Interact.Interactable | void {\n if (interactable === interaction.interactable) { return }\n\n const options = interaction.interactable.options.drag\n\n if (!options.manualStart &&\n interactable.testIgnoreAllow(options, element, eventTarget)) {\n const action = interactable.getAction(\n interaction.downPointer, interaction.downEvent, interaction, element)\n\n if (action &&\n action.name === 'drag' &&\n checkStartAxis(currentAxis, interactable) &&\n autoStart.validateAction(action, interactable, element, eventTarget, scope)) {\n return interactable\n }\n }\n }\n\n // check all interactables\n while (is.element(element)) {\n const interactable = scope.interactables.forEachMatch(element, getDraggable)\n\n if (interactable) {\n interaction.prepared.name = 'drag'\n interaction.interactable = interactable\n interaction.element = element\n break\n }\n\n element = parentNode(element) as Interact.Element\n }\n }\n}\n\nfunction checkStartAxis (startAxis: string, interactable: Interact.Interactable) {\n if (!interactable) { return false }\n\n const thisAxis = interactable.options.drag.startAxis\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis)\n}\n\nexport default {\n id: 'auto-start/dragAxis',\n listeners: { 'autoStart:before-start': beforeStart },\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/dragAxis.min.js b/@interactjs/auto-start/dragAxis.min.js new file mode 100644 index 000000000..b1174910e --- /dev/null +++ b/@interactjs/auto-start/dragAxis.min.js @@ -0,0 +1,2 @@ +import{parentNode as t}from"../utils/domUtils.min.js";import*as r from"../utils/is.min.js";import e from"./base.min.js";export default{id:"auto-start/dragAxis",listeners:{"autoStart:before-start"({interaction:a,eventTarget:n,dx:i,dy:o},s){if("drag"!==a.prepared.name)return;const l=Math.abs(i),c=Math.abs(o),d=a.interactable.options.drag,m=d.startAxis,f=l>c?"x":l{if(t===a.interactable)return;const r=a.interactable.options.drag;if(!r.manualStart&&t.testIgnoreAllow(r,i,n)){const r=t.getAction(a.downPointer,a.downEvent,a,i);if(r&&"drag"===r.name&&function(t,r){if(!r)return!1;const e=r.options.drag.startAxis;return"xy"===t||"xy"===e||e===t}(f,t)&&e.validateAction(r,t,i,n,s))return t}};for(;r.element(i);){const r=s.interactables.forEachMatch(i,o);if(r){a.prepared.name="drag",a.interactable=r,a.element=i;break}i=t(i)}}}}}; +//# sourceMappingURL=dragAxis.min.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/dragAxis.min.js.map b/@interactjs/auto-start/dragAxis.min.js.map new file mode 100644 index 000000000..27d1d0287 --- /dev/null +++ b/@interactjs/auto-start/dragAxis.min.js.map @@ -0,0 +1,50 @@ +{ + "version": 3, + "sources": [ + "dragAxis.ts" + ], + "names": [ + "parentNode", + "is", + "autoStart", + "id", + "listeners", + "[object Object]", + "interaction", + "eventTarget", + "dx", + "dy", + "scope", + "prepared", + "name", + "absX", + "Math", + "abs", + "absY", + "targetOptions", + "interactable", + "options", + "drag", + "startAxis", + "currentAxis", + "axis", + "lockAxis", + "element", + "getDraggable", + "manualStart", + "testIgnoreAllow", + "action", + "getAction", + "downPointer", + "downEvent", + "thisAxis", + "checkStartAxis", + "validateAction", + "interactables", + "forEachMatch" + ], + "mappings": "qBAASA,MAAkB,qCACfC,MAAQ,4BACbC,MAAe,8BAmEP,CACbC,GAAI,sBACJC,UAAW,CAAEC,0BAnEOC,YAAEA,EAAFC,YAAeA,EAAfC,GAA4BA,EAA5BC,GAAgCA,GAAgDC,GACpG,GAAkC,SAA9BJ,EAAYK,SAASC,KAAmB,OAG5C,MAAMC,EAAOC,KAAKC,IAAIP,GAChBQ,EAAOF,KAAKC,IAAIN,GAChBQ,EAAgBX,EAAYY,aAAaC,QAAQC,KACjDC,EAAYJ,EAAcI,UAC1BC,EAAeT,EAAOG,EAAO,IAAMH,EAAOG,EAAO,IAAM,KAO7D,GALAV,EAAYK,SAASY,KAAkC,UAA3BN,EAAcO,SACtCF,EAAY,GACZL,EAAcO,SAGE,OAAhBF,GAAsC,OAAdD,GAAsBA,IAAcC,EAAa,CAE3EhB,EAAYK,SAASC,KAAO,KAG5B,IAAIa,EAAUlB,EAEd,MAAMmB,EAAyBR,IAC7B,GAAIA,IAAiBZ,EAAYY,aAAgB,OAEjD,MAAMC,EAAUb,EAAYY,aAAaC,QAAQC,KAEjD,IAAKD,EAAQQ,aACTT,EAAaU,gBAAgBT,EAASM,EAASlB,GAAc,CAC/D,MAAMsB,EAASX,EAAaY,UAC1BxB,EAAYyB,YAAazB,EAAY0B,UAAW1B,EAAamB,GAE/D,GAAII,GACgB,SAAhBA,EAAOjB,MAwBnB,SAAyBS,EAAmBH,GAC1C,IAAKA,EAAgB,OAAO,EAE5B,MAAMe,EAAWf,EAAaC,QAAQC,KAAKC,UAE3C,MAAsB,OAAdA,GAAmC,OAAbY,GAAqBA,IAAaZ,EA5BtDa,CAAeZ,EAAaJ,IAC5BhB,EAAUiC,eAAeN,EAAQX,EAAcO,EAASlB,EAAaG,GACvE,OAAOQ,IAMb,KAAOjB,EAAGwB,QAAQA,IAAU,CAC1B,MAAMP,EAAeR,EAAM0B,cAAcC,aAAaZ,EAASC,GAE/D,GAAIR,EAAc,CAChBZ,EAAYK,SAASC,KAAO,OAC5BN,EAAYY,aAAeA,EAC3BZ,EAAYmB,QAAUA,EACtB,MAGFA,EAAUzB,EAAWyB", + "sourcesContent": [ + "import { parentNode } from '@interactjs/utils/domUtils'\nimport * as is from '@interactjs/utils/is'\nimport autoStart from './base'\n\nfunction beforeStart ({ interaction, eventTarget, dx, dy }: Interact.SignalArgs['interactions:move'], scope: Interact.Scope) {\n if (interaction.prepared.name !== 'drag') { return }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx)\n const absY = Math.abs(dy)\n const targetOptions = interaction.interactable.options.drag\n const startAxis = targetOptions.startAxis\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy')\n\n interaction.prepared.axis = targetOptions.lockAxis === 'start'\n ? currentAxis[0] as 'x' | 'y' // always lock to one axis even if currentAxis === 'xy'\n : targetOptions.lockAxis\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null\n\n // then try to get a drag from another ineractable\n let element = eventTarget as Interact.Element\n\n const getDraggable = function (interactable: Interact.Interactable): Interact.Interactable | void {\n if (interactable === interaction.interactable) { return }\n\n const options = interaction.interactable.options.drag\n\n if (!options.manualStart &&\n interactable.testIgnoreAllow(options, element, eventTarget)) {\n const action = interactable.getAction(\n interaction.downPointer, interaction.downEvent, interaction, element)\n\n if (action &&\n action.name === 'drag' &&\n checkStartAxis(currentAxis, interactable) &&\n autoStart.validateAction(action, interactable, element, eventTarget, scope)) {\n return interactable\n }\n }\n }\n\n // check all interactables\n while (is.element(element)) {\n const interactable = scope.interactables.forEachMatch(element, getDraggable)\n\n if (interactable) {\n interaction.prepared.name = 'drag'\n interaction.interactable = interactable\n interaction.element = element\n break\n }\n\n element = parentNode(element) as Interact.Element\n }\n }\n}\n\nfunction checkStartAxis (startAxis: string, interactable: Interact.Interactable) {\n if (!interactable) { return false }\n\n const thisAxis = interactable.options.drag.startAxis\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis)\n}\n\nexport default {\n id: 'auto-start/dragAxis',\n listeners: { 'autoStart:before-start': beforeStart },\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/hold.d.ts b/@interactjs/auto-start/hold.d.ts new file mode 100644 index 000000000..e26f11644 --- /dev/null +++ b/@interactjs/auto-start/hold.d.ts @@ -0,0 +1,34 @@ +declare module '@interactjs/core/defaultOptions' { + interface PerActionDefaults { + hold?: number; + delay?: number; + } +} +declare module '@interactjs/core/Interaction' { + interface Interaction { + autoStartHoldTimer?: any; + } +} +declare function install(scope: Interact.Scope): void; +declare function getHoldDuration(interaction: any): any; +declare const _default: { + id: string; + install: typeof install; + listeners: { + 'interactions:new': ({ interaction }: { + interaction: any; + }) => void; + 'autoStart:prepared': ({ interaction }: { + interaction: any; + }) => void; + 'interactions:move': ({ interaction, duplicate }: { + interaction: any; + duplicate: any; + }) => void; + 'autoStart:before-start': ({ interaction }: { + interaction: any; + }) => void; + }; + getHoldDuration: typeof getHoldDuration; +}; +export default _default; diff --git a/@interactjs/auto-start/hold.js b/@interactjs/auto-start/hold.js new file mode 100644 index 000000000..fad84d2c3 --- /dev/null +++ b/@interactjs/auto-start/hold.js @@ -0,0 +1,64 @@ +import basePlugin from "./base.js"; + +function install(scope) { + const { + defaults + } = scope; + scope.usePlugin(basePlugin); + defaults.perAction.hold = 0; + defaults.perAction.delay = 0; +} + +function getHoldDuration(interaction) { + const actionName = interaction.prepared && interaction.prepared.name; + + if (!actionName) { + return null; + } + + const options = interaction.interactable.options; + return options[actionName].hold || options[actionName].delay; +} + +export default { + id: 'auto-start/hold', + install, + listeners: { + 'interactions:new': ({ + interaction + }) => { + interaction.autoStartHoldTimer = null; + }, + 'autoStart:prepared': ({ + interaction + }) => { + const hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.autoStartHoldTimer = setTimeout(() => { + interaction.start(interaction.prepared, interaction.interactable, interaction.element); + }, hold); + } + }, + 'interactions:move': ({ + interaction, + duplicate + }) => { + if (interaction.pointerWasMoved && !duplicate) { + clearTimeout(interaction.autoStartHoldTimer); + } + }, + // prevent regular down->move autoStart + 'autoStart:before-start': ({ + interaction + }) => { + const hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.prepared.name = null; + } + } + }, + getHoldDuration +}; +//# sourceMappingURL=hold.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/hold.js.map b/@interactjs/auto-start/hold.js.map new file mode 100644 index 000000000..93345e7b2 --- /dev/null +++ b/@interactjs/auto-start/hold.js.map @@ -0,0 +1,36 @@ +{ + "version": 3, + "sources": [ + "hold.ts" + ], + "names": [ + "basePlugin", + "install", + "scope", + "defaults", + "usePlugin", + "perAction", + "hold", + "delay", + "getHoldDuration", + "interaction", + "actionName", + "prepared", + "name", + "options", + "interactable", + "id", + "listeners", + "autoStartHoldTimer", + "setTimeout", + "start", + "element", + "duplicate", + "pointerWasMoved", + "clearTimeout" + ], + "mappings": "AAAA,OAAOA,UAAP,MAAuB,WAAvB;;AAeA,SAASC,OAAT,CAAkBC,KAAlB,EAAyC;AACvC,QAAM;AACJC,IAAAA;AADI,MAEFD,KAFJ;AAIAA,EAAAA,KAAK,CAACE,SAAN,CAAgBJ,UAAhB;AAEAG,EAAAA,QAAQ,CAACE,SAAT,CAAmBC,IAAnB,GAA0B,CAA1B;AACAH,EAAAA,QAAQ,CAACE,SAAT,CAAmBE,KAAnB,GAA2B,CAA3B;AACD;;AAED,SAASC,eAAT,CAA0BC,WAA1B,EAAuC;AACrC,QAAMC,UAAU,GAAGD,WAAW,CAACE,QAAZ,IAAwBF,WAAW,CAACE,QAAZ,CAAqBC,IAAhE;;AAEA,MAAI,CAACF,UAAL,EAAiB;AAAE,WAAO,IAAP;AAAa;;AAEhC,QAAMG,OAAO,GAAGJ,WAAW,CAACK,YAAZ,CAAyBD,OAAzC;AAEA,SAAOA,OAAO,CAACH,UAAD,CAAP,CAAoBJ,IAApB,IAA4BO,OAAO,CAACH,UAAD,CAAP,CAAoBH,KAAvD;AACD;;AAED,eAAe;AACbQ,EAAAA,EAAE,EAAE,iBADS;AAEbd,EAAAA,OAFa;AAGbe,EAAAA,SAAS,EAAE;AACT,wBAAoB,CAAC;AAAEP,MAAAA;AAAF,KAAD,KAAqB;AACvCA,MAAAA,WAAW,CAACQ,kBAAZ,GAAiC,IAAjC;AACD,KAHQ;AAKT,0BAAsB,CAAC;AAAER,MAAAA;AAAF,KAAD,KAAqB;AACzC,YAAMH,IAAI,GAAGE,eAAe,CAACC,WAAD,CAA5B;;AAEA,UAAIH,IAAI,GAAG,CAAX,EAAc;AACZG,QAAAA,WAAW,CAACQ,kBAAZ,GAAiCC,UAAU,CAAC,MAAM;AAChDT,UAAAA,WAAW,CAACU,KAAZ,CAAkBV,WAAW,CAACE,QAA9B,EAAwCF,WAAW,CAACK,YAApD,EAAkEL,WAAW,CAACW,OAA9E;AACD,SAF0C,EAExCd,IAFwC,CAA3C;AAGD;AACF,KAbQ;AAeT,yBAAqB,CAAC;AAAEG,MAAAA,WAAF;AAAeY,MAAAA;AAAf,KAAD,KAAgC;AACnD,UAAIZ,WAAW,CAACa,eAAZ,IAA+B,CAACD,SAApC,EAA+C;AAC7CE,QAAAA,YAAY,CAACd,WAAW,CAACQ,kBAAb,CAAZ;AACD;AACF,KAnBQ;AAqBT;AACA,8BAA0B,CAAC;AAAER,MAAAA;AAAF,KAAD,KAAqB;AAC7C,YAAMH,IAAI,GAAGE,eAAe,CAACC,WAAD,CAA5B;;AAEA,UAAIH,IAAI,GAAG,CAAX,EAAc;AACZG,QAAAA,WAAW,CAACE,QAAZ,CAAqBC,IAArB,GAA4B,IAA5B;AACD;AACF;AA5BQ,GAHE;AAiCbJ,EAAAA;AAjCa,CAAf", + "sourcesContent": [ + "import basePlugin from './base'\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface PerActionDefaults {\n hold?: number\n delay?: number\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n autoStartHoldTimer?: any\n }\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n defaults,\n } = scope\n\n scope.usePlugin(basePlugin)\n\n defaults.perAction.hold = 0\n defaults.perAction.delay = 0\n}\n\nfunction getHoldDuration (interaction) {\n const actionName = interaction.prepared && interaction.prepared.name\n\n if (!actionName) { return null }\n\n const options = interaction.interactable.options\n\n return options[actionName].hold || options[actionName].delay\n}\n\nexport default {\n id: 'auto-start/hold',\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.autoStartHoldTimer = null\n },\n\n 'autoStart:prepared': ({ interaction }) => {\n const hold = getHoldDuration(interaction)\n\n if (hold > 0) {\n interaction.autoStartHoldTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.interactable, interaction.element)\n }, hold)\n }\n },\n\n 'interactions:move': ({ interaction, duplicate }) => {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.autoStartHoldTimer)\n }\n },\n\n // prevent regular down->move autoStart\n 'autoStart:before-start': ({ interaction }) => {\n const hold = getHoldDuration(interaction)\n\n if (hold > 0) {\n interaction.prepared.name = null\n }\n },\n },\n getHoldDuration,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/hold.min.js b/@interactjs/auto-start/hold.min.js new file mode 100644 index 000000000..0599b6a96 --- /dev/null +++ b/@interactjs/auto-start/hold.min.js @@ -0,0 +1,2 @@ +import t from"./base.min.js";function e(t){const e=t.prepared&&t.prepared.name;if(!e)return null;const r=t.interactable.options;return r[e].hold||r[e].delay}export default{id:"auto-start/hold",install(e){const{defaults:r}=e;e.usePlugin(t),r.perAction.hold=0,r.perAction.delay=0},listeners:{"interactions:new"({interaction:t}){t.autoStartHoldTimer=null},"autoStart:prepared"({interaction:t}){const r=e(t);r>0&&(t.autoStartHoldTimer=setTimeout(()=>{t.start(t.prepared,t.interactable,t.element)},r))},"interactions:move"({interaction:t,duplicate:e}){t.pointerWasMoved&&!e&&clearTimeout(t.autoStartHoldTimer)},"autoStart:before-start"({interaction:t}){e(t)>0&&(t.prepared.name=null)}},getHoldDuration:e}; +//# sourceMappingURL=hold.min.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/hold.min.js.map b/@interactjs/auto-start/hold.min.js.map new file mode 100644 index 000000000..754b7617c --- /dev/null +++ b/@interactjs/auto-start/hold.min.js.map @@ -0,0 +1,37 @@ +{ + "version": 3, + "sources": [ + "hold.ts" + ], + "names": [ + "basePlugin", + "getHoldDuration", + "interaction", + "actionName", + "prepared", + "name", + "options", + "interactable", + "hold", + "delay", + "id", + "install", + "scope", + "defaults", + "usePlugin", + "perAction", + "listeners", + "[object Object]", + "autoStartHoldTimer", + "setTimeout", + "start", + "element", + "duplicate", + "pointerWasMoved", + "clearTimeout" + ], + "mappings": "OAAOA,MAAgB,gBA0BvB,SAASC,EAAiBC,GACxB,MAAMC,EAAaD,EAAYE,UAAYF,EAAYE,SAASC,KAEhE,IAAKF,EAAc,OAAO,KAE1B,MAAMG,EAAUJ,EAAYK,aAAaD,QAEzC,OAAOA,EAAQH,GAAYK,MAAQF,EAAQH,GAAYM,oBAG1C,CACbC,GAAI,kBACJC,QAvBgBC,GAChB,MAAMC,SACJA,GACED,EAEJA,EAAME,UAAUd,GAEhBa,EAASE,UAAUP,KAAO,EAC1BK,EAASE,UAAUN,MAAQ,GAgB3BO,UAAW,CACTC,oBAAuBf,YAAAA,IACrBA,EAAYgB,mBAAqB,MAGnCD,sBAAyBf,YAAAA,IACvB,MAAMM,EAAOP,EAAgBC,GAEzBM,EAAO,IACTN,EAAYgB,mBAAqBC,WAAW,KAC1CjB,EAAYkB,MAAMlB,EAAYE,SAAUF,EAAYK,aAAcL,EAAYmB,UAC7Eb,KAIPS,qBAAwBf,YAAAA,EAAaoB,UAAAA,IAC/BpB,EAAYqB,kBAAoBD,GAClCE,aAAatB,EAAYgB,qBAK7BD,0BAA6Bf,YAAAA,IACdD,EAAgBC,GAElB,IACTA,EAAYE,SAASC,KAAO,QAIlCJ,gBAAAA", + "sourcesContent": [ + "import basePlugin from './base'\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface PerActionDefaults {\n hold?: number\n delay?: number\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n autoStartHoldTimer?: any\n }\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n defaults,\n } = scope\n\n scope.usePlugin(basePlugin)\n\n defaults.perAction.hold = 0\n defaults.perAction.delay = 0\n}\n\nfunction getHoldDuration (interaction) {\n const actionName = interaction.prepared && interaction.prepared.name\n\n if (!actionName) { return null }\n\n const options = interaction.interactable.options\n\n return options[actionName].hold || options[actionName].delay\n}\n\nexport default {\n id: 'auto-start/hold',\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.autoStartHoldTimer = null\n },\n\n 'autoStart:prepared': ({ interaction }) => {\n const hold = getHoldDuration(interaction)\n\n if (hold > 0) {\n interaction.autoStartHoldTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.interactable, interaction.element)\n }, hold)\n }\n },\n\n 'interactions:move': ({ interaction, duplicate }) => {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.autoStartHoldTimer)\n }\n },\n\n // prevent regular down->move autoStart\n 'autoStart:before-start': ({ interaction }) => {\n const hold = getHoldDuration(interaction)\n\n if (hold > 0) {\n interaction.prepared.name = null\n }\n },\n },\n getHoldDuration,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/hold.spec.d.ts b/@interactjs/auto-start/hold.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/auto-start/hold.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/auto-start/index.d.ts b/@interactjs/auto-start/index.d.ts new file mode 100644 index 000000000..fd69655cd --- /dev/null +++ b/@interactjs/auto-start/index.d.ts @@ -0,0 +1,9 @@ +import autoStart from './base'; +import dragAxis from './dragAxis'; +import hold from './hold'; +declare const _default: { + id: string; + install(scope: any): void; +}; +export default _default; +export { autoStart, hold, dragAxis, }; diff --git a/@interactjs/auto-start/index.js b/@interactjs/auto-start/index.js new file mode 100644 index 000000000..60884f24f --- /dev/null +++ b/@interactjs/auto-start/index.js @@ -0,0 +1,15 @@ +import autoStart from "./base.js"; +import dragAxis from "./dragAxis.js"; +import hold from "./hold.js"; +export default { + id: 'auto-start', + + install(scope) { + scope.usePlugin(autoStart); + scope.usePlugin(hold); + scope.usePlugin(dragAxis); + } + +}; +export { autoStart, hold, dragAxis }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/index.js.map b/@interactjs/auto-start/index.js.map new file mode 100644 index 000000000..af1b0ab58 --- /dev/null +++ b/@interactjs/auto-start/index.js.map @@ -0,0 +1,19 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "autoStart", + "dragAxis", + "hold", + "id", + "install", + "scope", + "usePlugin" + ], + "mappings": "AAAA,OAAOA,SAAP,MAAsB,WAAtB;AACA,OAAOC,QAAP,MAAqB,eAArB;AACA,OAAOC,IAAP,MAAiB,WAAjB;AAEA,eAAe;AACbC,EAAAA,EAAE,EAAE,YADS;;AAEbC,EAAAA,OAAO,CAAEC,KAAF,EAAS;AACdA,IAAAA,KAAK,CAACC,SAAN,CAAgBN,SAAhB;AACAK,IAAAA,KAAK,CAACC,SAAN,CAAgBJ,IAAhB;AACAG,IAAAA,KAAK,CAACC,SAAN,CAAgBL,QAAhB;AACD;;AANY,CAAf;AASA,SACED,SADF,EAEEE,IAFF,EAGED,QAHF", + "sourcesContent": [ + "import autoStart from './base'\nimport dragAxis from './dragAxis'\nimport hold from './hold'\n\nexport default {\n id: 'auto-start',\n install (scope) {\n scope.usePlugin(autoStart)\n scope.usePlugin(hold)\n scope.usePlugin(dragAxis)\n },\n}\n\nexport {\n autoStart,\n hold,\n dragAxis,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/auto-start/index.min.js b/@interactjs/auto-start/index.min.js new file mode 100644 index 000000000..326705bed --- /dev/null +++ b/@interactjs/auto-start/index.min.js @@ -0,0 +1,2 @@ +import i from"./base.min.js";import o from"./dragAxis.min.js";import r from"./hold.min.js";export default{id:"auto-start",install(s){s.usePlugin(i),s.usePlugin(r),s.usePlugin(o)}};export{i as autoStart,r as hold,o as dragAxis}; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/auto-start/index.min.js.map b/@interactjs/auto-start/index.min.js.map new file mode 100644 index 000000000..553c90c2b --- /dev/null +++ b/@interactjs/auto-start/index.min.js.map @@ -0,0 +1,19 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "autoStart", + "dragAxis", + "hold", + "id", + "install", + "scope", + "usePlugin" + ], + "mappings": "OAAOA,MAAe,uBACfC,MAAc,2BACdC,MAAU,8BAEF,CACbC,GAAI,aACJC,QAASC,GACPA,EAAMC,UAAUN,GAChBK,EAAMC,UAAUJ,GAChBG,EAAMC,UAAUL,YAKlBD,eACAE,UACAD", + "sourcesContent": [ + "import autoStart from './base'\nimport dragAxis from './dragAxis'\nimport hold from './hold'\n\nexport default {\n id: 'auto-start',\n install (scope) {\n scope.usePlugin(autoStart)\n scope.usePlugin(hold)\n scope.usePlugin(dragAxis)\n },\n}\n\nexport {\n autoStart,\n hold,\n dragAxis,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/.npmignore b/@interactjs/core/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/core/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/core/BaseEvent.d.ts b/@interactjs/core/BaseEvent.d.ts new file mode 100644 index 000000000..09db9d6e2 --- /dev/null +++ b/@interactjs/core/BaseEvent.d.ts @@ -0,0 +1,22 @@ +export declare class BaseEvent { + type: string; + target: EventTarget; + currentTarget: EventTarget; + interactable: Interact.Interactable; + _interaction: Interact.Interaction; + timeStamp: any; + immediatePropagationStopped: boolean; + propagationStopped: boolean; + readonly interaction: Interact.InteractionProxy; + constructor(interaction: Interact.Interaction); + preventDefault(): void; + /** + * Don't call any other listeners (even on the current target) + */ + stopPropagation(): void; + /** + * Don't call listeners on the remaining targets + */ + stopImmediatePropagation(): void; +} +export default BaseEvent; diff --git a/@interactjs/core/BaseEvent.js b/@interactjs/core/BaseEvent.js new file mode 100644 index 000000000..06885a0db --- /dev/null +++ b/@interactjs/core/BaseEvent.js @@ -0,0 +1,38 @@ +export class BaseEvent { + get interaction() { + return this._interaction._proxy; + } + + constructor(interaction) { + this.type = void 0; + this.target = void 0; + this.currentTarget = void 0; + this.interactable = void 0; + this._interaction = void 0; + this.timeStamp = void 0; + this.immediatePropagationStopped = false; + this.propagationStopped = false; + this._interaction = interaction; + } + + preventDefault() {} + /** + * Don't call any other listeners (even on the current target) + */ + + + stopPropagation() { + this.propagationStopped = true; + } + /** + * Don't call listeners on the remaining targets + */ + + + stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + +} +export default BaseEvent; +//# sourceMappingURL=BaseEvent.js.map \ No newline at end of file diff --git a/@interactjs/core/BaseEvent.js.map b/@interactjs/core/BaseEvent.js.map new file mode 100644 index 000000000..bd8e77ee4 --- /dev/null +++ b/@interactjs/core/BaseEvent.js.map @@ -0,0 +1,27 @@ +{ + "version": 3, + "sources": [ + "BaseEvent.ts" + ], + "names": [ + "BaseEvent", + "interaction", + "_interaction", + "_proxy", + "constructor", + "type", + "target", + "currentTarget", + "interactable", + "timeStamp", + "immediatePropagationStopped", + "propagationStopped", + "preventDefault", + "stopPropagation", + "stopImmediatePropagation" + ], + "mappings": "AAAA,OAAO,MAAMA,SAAN,CAAqD;AAU1D,MAAIC,WAAJ,GAAiD;AAC/C,WAAO,KAAKC,YAAL,CAAkBC,MAAzB;AACD;;AAEDC,EAAAA,WAAW,CAAEH,WAAF,EAAqC;AAAA,SAbhDI,IAagD;AAAA,SAZhDC,MAYgD;AAAA,SAXhDC,aAWgD;AAAA,SAVhDC,YAUgD;AAAA,SAThDN,YASgD;AAAA,SARhDO,SAQgD;AAAA,SAPhDC,2BAOgD,GAPlB,KAOkB;AAAA,SANhDC,kBAMgD,GAN3B,KAM2B;AAC9C,SAAKT,YAAL,GAAoBD,WAApB;AACD;;AAEDW,EAAAA,cAAc,GAAI,CAAE;AAEpB;;;;;AAGAC,EAAAA,eAAe,GAAI;AACjB,SAAKF,kBAAL,GAA0B,IAA1B;AACD;AAED;;;;;AAGAG,EAAAA,wBAAwB,GAAI;AAC1B,SAAKJ,2BAAL,GAAmC,KAAKC,kBAAL,GAA0B,IAA7D;AACD;;AAhCyD;AAmC5D,eAAeX,SAAf", + "sourcesContent": [ + "export class BaseEvent {\n type: string\n target: EventTarget\n currentTarget: EventTarget\n interactable: Interact.Interactable\n _interaction: Interact.Interaction\n timeStamp: any\n immediatePropagationStopped = false\n propagationStopped = false\n\n get interaction (): Interact.InteractionProxy {\n return this._interaction._proxy\n }\n\n constructor (interaction: Interact.Interaction) {\n this._interaction = interaction\n }\n\n preventDefault () {}\n\n /**\n * Don't call any other listeners (even on the current target)\n */\n stopPropagation () {\n this.propagationStopped = true\n }\n\n /**\n * Don't call listeners on the remaining targets\n */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true\n }\n}\n\nexport default BaseEvent\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/BaseEvent.min.js b/@interactjs/core/BaseEvent.min.js new file mode 100644 index 000000000..c8a174dec --- /dev/null +++ b/@interactjs/core/BaseEvent.min.js @@ -0,0 +1,2 @@ +export class BaseEvent{get interaction(){return this._interaction._proxy}constructor(t){this.type=void 0,this.target=void 0,this.currentTarget=void 0,this.interactable=void 0,this._interaction=void 0,this.timeStamp=void 0,this.immediatePropagationStopped=!1,this.propagationStopped=!1,this._interaction=t}preventDefault(){}stopPropagation(){this.propagationStopped=!0}stopImmediatePropagation(){this.immediatePropagationStopped=this.propagationStopped=!0}}export default BaseEvent; +//# sourceMappingURL=BaseEvent.min.js.map \ No newline at end of file diff --git a/@interactjs/core/BaseEvent.min.js.map b/@interactjs/core/BaseEvent.min.js.map new file mode 100644 index 000000000..180ef244f --- /dev/null +++ b/@interactjs/core/BaseEvent.min.js.map @@ -0,0 +1,28 @@ +{ + "version": 3, + "sources": [ + "BaseEvent.ts" + ], + "names": [ + "BaseEvent", + "interaction", + "this", + "_interaction", + "_proxy", + "constructor", + "type", + "target", + "currentTarget", + "interactable", + "timeStamp", + "immediatePropagationStopped", + "propagationStopped", + "preventDefault", + "stopPropagation", + "stopImmediatePropagation" + ], + "mappings": "OAAO,MAAMA,UAUXC,kBACE,OAAOC,KAAKC,aAAaC,OAG3BC,YAAaJ,GAAmCC,KAbhDI,UAagD,EAAAJ,KAZhDK,YAYgD,EAAAL,KAXhDM,mBAWgD,EAAAN,KAVhDO,kBAUgD,EAAAP,KAThDC,kBASgD,EAAAD,KARhDQ,eAQgD,EAAAR,KAPhDS,6BAA8B,EAOkBT,KANhDU,oBAAqB,EAOnBV,KAAKC,aAAeF,EAGtBY,kBAKAC,kBACEZ,KAAKU,oBAAqB,EAM5BG,2BACEb,KAAKS,4BAA8BT,KAAKU,oBAAqB,kBAIlDZ", + "sourcesContent": [ + "export class BaseEvent {\n type: string\n target: EventTarget\n currentTarget: EventTarget\n interactable: Interact.Interactable\n _interaction: Interact.Interaction\n timeStamp: any\n immediatePropagationStopped = false\n propagationStopped = false\n\n get interaction (): Interact.InteractionProxy {\n return this._interaction._proxy\n }\n\n constructor (interaction: Interact.Interaction) {\n this._interaction = interaction\n }\n\n preventDefault () {}\n\n /**\n * Don't call any other listeners (even on the current target)\n */\n stopPropagation () {\n this.propagationStopped = true\n }\n\n /**\n * Don't call listeners on the remaining targets\n */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true\n }\n}\n\nexport default BaseEvent\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/Eventable.d.ts b/@interactjs/core/Eventable.d.ts new file mode 100644 index 000000000..113265a1c --- /dev/null +++ b/@interactjs/core/Eventable.d.ts @@ -0,0 +1,16 @@ +import { NormalizedListeners } from '@interactjs/utils/normalizeListeners'; +declare class Eventable { + options: any; + types: NormalizedListeners; + propagationStopped: boolean; + immediatePropagationStopped: boolean; + global: any; + constructor(options?: { + [index: string]: any; + }); + fire(event: any): void; + on(type: string, listener: Interact.ListenersArg): void; + off(type: string, listener: Interact.ListenersArg): void; + getRect(_element: Interact.Element): Interact.Rect; +} +export default Eventable; diff --git a/@interactjs/core/Eventable.js b/@interactjs/core/Eventable.js new file mode 100644 index 000000000..4f5918bca --- /dev/null +++ b/@interactjs/core/Eventable.js @@ -0,0 +1,75 @@ +import * as arr from "../utils/arr.js"; +import extend from "../utils/extend.js"; +import normalize from "../utils/normalizeListeners.js"; + +function fireUntilImmediateStopped(event, listeners) { + for (const listener of listeners) { + if (event.immediatePropagationStopped) { + break; + } + + listener(event); + } +} + +class Eventable { + constructor(options) { + this.options = void 0; + this.types = {}; + this.propagationStopped = false; + this.immediatePropagationStopped = false; + this.global = void 0; + this.options = extend({}, options || {}); + } + + fire(event) { + let listeners; + const global = this.global; // Interactable#on() listeners + // tslint:disable no-conditional-assignment + + if (listeners = this.types[event.type]) { + fireUntilImmediateStopped(event, listeners); + } // interact.on() listeners + + + if (!event.propagationStopped && global && (listeners = global[event.type])) { + fireUntilImmediateStopped(event, listeners); + } + } + + on(type, listener) { + const listeners = normalize(type, listener); + + for (type in listeners) { + this.types[type] = arr.merge(this.types[type] || [], listeners[type]); + } + } + + off(type, listener) { + const listeners = normalize(type, listener); + + for (type in listeners) { + const eventList = this.types[type]; + + if (!eventList || !eventList.length) { + continue; + } + + for (const subListener of listeners[type]) { + const index = eventList.indexOf(subListener); + + if (index !== -1) { + eventList.splice(index, 1); + } + } + } + } + + getRect(_element) { + return null; + } + +} + +export default Eventable; +//# sourceMappingURL=Eventable.js.map \ No newline at end of file diff --git a/@interactjs/core/Eventable.js.map b/@interactjs/core/Eventable.js.map new file mode 100644 index 000000000..b2a3d3122 --- /dev/null +++ b/@interactjs/core/Eventable.js.map @@ -0,0 +1,39 @@ +{ + "version": 3, + "sources": [ + "Eventable.ts" + ], + "names": [ + "arr", + "extend", + "normalize", + "fireUntilImmediateStopped", + "event", + "listeners", + "listener", + "immediatePropagationStopped", + "Eventable", + "constructor", + "options", + "types", + "propagationStopped", + "global", + "fire", + "type", + "on", + "merge", + "off", + "eventList", + "length", + "subListener", + "index", + "indexOf", + "splice", + "getRect", + "_element" + ], + "mappings": "AAAA,OAAO,KAAKA,GAAZ,MAAqB,iBAArB;AACA,OAAOC,MAAP,MAAmB,oBAAnB;AACA,OAAOC,SAAP,MAA+C,gCAA/C;;AAEA,SAASC,yBAAT,CAGGC,KAHH,EAGwCC,SAHxC,EAGwE;AACtE,OAAK,MAAMC,QAAX,IAAuBD,SAAvB,EAAkC;AAChC,QAAID,KAAK,CAACG,2BAAV,EAAuC;AAAE;AAAO;;AAEhDD,IAAAA,QAAQ,CAACF,KAAD,CAAR;AACD;AACF;;AAED,MAAMI,SAAN,CAAgB;AAOdC,EAAAA,WAAW,CAAEC,OAAF,EAAsC;AAAA,SANjDA,OAMiD;AAAA,SALjDC,KAKiD,GALpB,EAKoB;AAAA,SAJjDC,kBAIiD,GAJ5B,KAI4B;AAAA,SAHjDL,2BAGiD,GAHnB,KAGmB;AAAA,SAFjDM,MAEiD;AAC/C,SAAKH,OAAL,GAAeT,MAAM,CAAC,EAAD,EAAKS,OAAO,IAAI,EAAhB,CAArB;AACD;;AAEDI,EAAAA,IAAI,CAAEV,KAAF,EAAc;AAChB,QAAIC,SAAJ;AACA,UAAMQ,MAAM,GAAG,KAAKA,MAApB,CAFgB,CAIhB;AACA;;AACA,QAAKR,SAAS,GAAG,KAAKM,KAAL,CAAWP,KAAK,CAACW,IAAjB,CAAjB,EAA0C;AACxCZ,MAAAA,yBAAyB,CAACC,KAAD,EAAQC,SAAR,CAAzB;AACD,KARe,CAUhB;;;AACA,QAAI,CAACD,KAAK,CAACQ,kBAAP,IAA6BC,MAA7B,KAAwCR,SAAS,GAAGQ,MAAM,CAACT,KAAK,CAACW,IAAP,CAA1D,CAAJ,EAA8E;AAC5EZ,MAAAA,yBAAyB,CAACC,KAAD,EAAQC,SAAR,CAAzB;AACD;AACF;;AAEDW,EAAAA,EAAE,CAAED,IAAF,EAAgBT,QAAhB,EAAiD;AACjD,UAAMD,SAAS,GAAGH,SAAS,CAACa,IAAD,EAAOT,QAAP,CAA3B;;AAEA,SAAKS,IAAL,IAAaV,SAAb,EAAwB;AACtB,WAAKM,KAAL,CAAWI,IAAX,IAAmBf,GAAG,CAACiB,KAAJ,CAAU,KAAKN,KAAL,CAAWI,IAAX,KAAoB,EAA9B,EAAkCV,SAAS,CAACU,IAAD,CAA3C,CAAnB;AACD;AACF;;AAEDG,EAAAA,GAAG,CAAEH,IAAF,EAAgBT,QAAhB,EAAiD;AAClD,UAAMD,SAAS,GAAGH,SAAS,CAACa,IAAD,EAAOT,QAAP,CAA3B;;AAEA,SAAKS,IAAL,IAAaV,SAAb,EAAwB;AACtB,YAAMc,SAAS,GAAG,KAAKR,KAAL,CAAWI,IAAX,CAAlB;;AAEA,UAAI,CAACI,SAAD,IAAc,CAACA,SAAS,CAACC,MAA7B,EAAqC;AAAE;AAAU;;AAEjD,WAAK,MAAMC,WAAX,IAA0BhB,SAAS,CAACU,IAAD,CAAnC,EAA2C;AACzC,cAAMO,KAAK,GAAGH,SAAS,CAACI,OAAV,CAAkBF,WAAlB,CAAd;;AAEA,YAAIC,KAAK,KAAK,CAAC,CAAf,EAAkB;AAChBH,UAAAA,SAAS,CAACK,MAAV,CAAiBF,KAAjB,EAAwB,CAAxB;AACD;AACF;AACF;AACF;;AAEDG,EAAAA,OAAO,CAAEC,QAAF,EAA6C;AAClD,WAAO,IAAP;AACD;;AAvDa;;AA0DhB,eAAelB,SAAf", + "sourcesContent": [ + "import * as arr from '@interactjs/utils/arr'\nimport extend from '@interactjs/utils/extend'\nimport normalize, { NormalizedListeners } from '@interactjs/utils/normalizeListeners'\n\nfunction fireUntilImmediateStopped<\n T extends Interact.ActionName,\n P extends Interact.EventPhase,\n> (event: Interact.InteractEvent, listeners: Interact.Listener[]) {\n for (const listener of listeners) {\n if (event.immediatePropagationStopped) { break }\n\n listener(event)\n }\n}\n\nclass Eventable {\n options: any\n types: NormalizedListeners = {}\n propagationStopped = false\n immediatePropagationStopped = false\n global: any\n\n constructor (options?: { [index: string]: any }) {\n this.options = extend({}, options || {})\n }\n\n fire (event: any) {\n let listeners\n const global = this.global\n\n // Interactable#on() listeners\n // tslint:disable no-conditional-assignment\n if ((listeners = this.types[event.type])) {\n fireUntilImmediateStopped(event, listeners)\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners)\n }\n }\n\n on (type: string, listener: Interact.ListenersArg) {\n const listeners = normalize(type, listener)\n\n for (type in listeners) {\n this.types[type] = arr.merge(this.types[type] || [], listeners[type])\n }\n }\n\n off (type: string, listener: Interact.ListenersArg) {\n const listeners = normalize(type, listener)\n\n for (type in listeners) {\n const eventList = this.types[type]\n\n if (!eventList || !eventList.length) { continue }\n\n for (const subListener of listeners[type]) {\n const index = eventList.indexOf(subListener)\n\n if (index !== -1) {\n eventList.splice(index, 1)\n }\n }\n }\n }\n\n getRect (_element: Interact.Element): Interact.Rect {\n return null\n }\n}\n\nexport default Eventable\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/Eventable.min.js b/@interactjs/core/Eventable.min.js new file mode 100644 index 000000000..c0e616751 --- /dev/null +++ b/@interactjs/core/Eventable.min.js @@ -0,0 +1,2 @@ +import*as t from"../utils/arr.min.js";import o from"../utils/extend.min.js";import i from"../utils/normalizeListeners.min.js";function s(t,o){for(const i of o){if(t.immediatePropagationStopped)break;i(t)}}export default class{constructor(t){this.options=void 0,this.types={},this.propagationStopped=!1,this.immediatePropagationStopped=!1,this.global=void 0,this.options=o({},t||{})}fire(t){let o;const i=this.global;(o=this.types[t.type])&&s(t,o),!t.propagationStopped&&i&&(o=i[t.type])&&s(t,o)}on(o,s){const e=i(o,s);for(o in e)this.types[o]=t.merge(this.types[o]||[],e[o])}off(t,o){const s=i(t,o);for(t in s){const o=this.types[t];if(o&&o.length)for(const i of s[t]){const t=o.indexOf(i);-1!==t&&o.splice(t,1)}}}getRect(t){return null}} +//# sourceMappingURL=Eventable.min.js.map \ No newline at end of file diff --git a/@interactjs/core/Eventable.min.js.map b/@interactjs/core/Eventable.min.js.map new file mode 100644 index 000000000..36c353464 --- /dev/null +++ b/@interactjs/core/Eventable.min.js.map @@ -0,0 +1,39 @@ +{ + "version": 3, + "sources": [ + "Eventable.ts" + ], + "names": [ + "arr", + "extend", + "normalize", + "fireUntilImmediateStopped", + "event", + "listeners", + "listener", + "immediatePropagationStopped", + "constructor", + "options", + "this", + "types", + "propagationStopped", + "global", + "fire", + "type", + "on", + "merge", + "off", + "eventList", + "length", + "subListener", + "index", + "indexOf", + "splice", + "getRect", + "_element" + ], + "mappings": "UAAYA,MAAS,6BACdC,MAAY,gCACZC,MAAwC,qCAE/C,SAASC,EAGNC,EAAqCC,GACtC,IAAK,MAAMC,KAAYD,EAAW,CAChC,GAAID,EAAMG,4BAA+B,MAEzCD,EAASF,mBAIb,MAOEI,YAAaC,GAAoCC,KANjDD,aAMiD,EAAAC,KALjDC,MAA6B,GAKoBD,KAJjDE,oBAAqB,EAI4BF,KAHjDH,6BAA8B,EAGmBG,KAFjDG,YAEiD,EAC/CH,KAAKD,QAAUR,EAAO,GAAIQ,GAAW,IAGvCK,KAAMV,GACJ,IAAIC,EACJ,MAAMQ,EAASH,KAAKG,QAIfR,EAAYK,KAAKC,MAAMP,EAAMW,QAChCZ,EAA0BC,EAAOC,IAI9BD,EAAMQ,oBAAsBC,IAAWR,EAAYQ,EAAOT,EAAMW,QACnEZ,EAA0BC,EAAOC,GAIrCW,GAAID,EAAcT,GAChB,MAAMD,EAAYH,EAAUa,EAAMT,GAElC,IAAKS,KAAQV,EACXK,KAAKC,MAAMI,GAAQf,EAAIiB,MAAMP,KAAKC,MAAMI,IAAS,GAAIV,EAAUU,IAInEG,IAAKH,EAAcT,GACjB,MAAMD,EAAYH,EAAUa,EAAMT,GAElC,IAAKS,KAAQV,EAAW,CACtB,MAAMc,EAAYT,KAAKC,MAAMI,GAE7B,GAAKI,GAAcA,EAAUC,OAE7B,IAAK,MAAMC,KAAehB,EAAUU,GAAO,CACzC,MAAMO,EAAQH,EAAUI,QAAQF,IAEjB,IAAXC,GACFH,EAAUK,OAAOF,EAAO,KAMhCG,QAASC,GACP,OAAO", + "sourcesContent": [ + "import * as arr from '@interactjs/utils/arr'\nimport extend from '@interactjs/utils/extend'\nimport normalize, { NormalizedListeners } from '@interactjs/utils/normalizeListeners'\n\nfunction fireUntilImmediateStopped<\n T extends Interact.ActionName,\n P extends Interact.EventPhase,\n> (event: Interact.InteractEvent, listeners: Interact.Listener[]) {\n for (const listener of listeners) {\n if (event.immediatePropagationStopped) { break }\n\n listener(event)\n }\n}\n\nclass Eventable {\n options: any\n types: NormalizedListeners = {}\n propagationStopped = false\n immediatePropagationStopped = false\n global: any\n\n constructor (options?: { [index: string]: any }) {\n this.options = extend({}, options || {})\n }\n\n fire (event: any) {\n let listeners\n const global = this.global\n\n // Interactable#on() listeners\n // tslint:disable no-conditional-assignment\n if ((listeners = this.types[event.type])) {\n fireUntilImmediateStopped(event, listeners)\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners)\n }\n }\n\n on (type: string, listener: Interact.ListenersArg) {\n const listeners = normalize(type, listener)\n\n for (type in listeners) {\n this.types[type] = arr.merge(this.types[type] || [], listeners[type])\n }\n }\n\n off (type: string, listener: Interact.ListenersArg) {\n const listeners = normalize(type, listener)\n\n for (type in listeners) {\n const eventList = this.types[type]\n\n if (!eventList || !eventList.length) { continue }\n\n for (const subListener of listeners[type]) {\n const index = eventList.indexOf(subListener)\n\n if (index !== -1) {\n eventList.splice(index, 1)\n }\n }\n }\n }\n\n getRect (_element: Interact.Element): Interact.Rect {\n return null\n }\n}\n\nexport default Eventable\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/Eventable.spec.d.ts b/@interactjs/core/Eventable.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/core/Eventable.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/core/InteractEvent.d.ts b/@interactjs/core/InteractEvent.d.ts new file mode 100644 index 000000000..f2774a548 --- /dev/null +++ b/@interactjs/core/InteractEvent.d.ts @@ -0,0 +1,72 @@ +import BaseEvent from './BaseEvent'; +import Interaction from './Interaction'; +export declare type EventPhase = keyof PhaseMap; +export interface PhaseMap { + start: true; + move: true; + end: true; +} +export declare class InteractEvent extends BaseEvent { + target: Interact.Element; + currentTarget: Interact.Element; + relatedTarget: null; + screenX?: number; + screenY?: number; + button: number; + buttons: number; + ctrlKey: boolean; + shiftKey: boolean; + altKey: boolean; + metaKey: boolean; + page: Interact.Point; + client: Interact.Point; + delta: Interact.Point; + rect: Interact.FullRect; + x0: number; + y0: number; + t0: number; + dt: number; + duration: number; + clientX0: number; + clientY0: number; + velocity: Interact.Point; + speed: number; + swipe: ReturnType['getSwipe']>; + timeStamp: any; + dragEnter?: Interact.Element; + dragLeave?: Interact.Element; + axes?: 'x' | 'y' | 'xy'; + preEnd?: boolean; + /** */ + constructor(interaction: Interaction, event: Interact.PointerEventType, actionName: T, phase: P, element: Interact.Element, preEnd?: boolean, type?: string); + pageX: number; + pageY: number; + clientX: number; + clientY: number; + dx: number; + dy: number; + velocityX: number; + velocityY: number; + getSwipe(): { + up: boolean; + down: boolean; + left: boolean; + right: boolean; + angle: number; + speed: number; + velocity: { + x: number; + y: number; + }; + }; + preventDefault(): void; + /** + * Don't call listeners on the remaining targets + */ + stopImmediatePropagation(): void; + /** + * Don't call any other listeners (even on the current target) + */ + stopPropagation(): void; +} +export default InteractEvent; diff --git a/@interactjs/core/InteractEvent.js b/@interactjs/core/InteractEvent.js new file mode 100644 index 000000000..b405728c4 --- /dev/null +++ b/@interactjs/core/InteractEvent.js @@ -0,0 +1,220 @@ +import extend from "../utils/extend.js"; +import getOriginXY from "../utils/getOriginXY.js"; +import hypot from "../utils/hypot.js"; +import BaseEvent from "./BaseEvent.js"; +import defaults from "./defaultOptions.js"; +export class InteractEvent extends BaseEvent { + // drag + // resize + + /** */ + constructor(interaction, event, actionName, phase, element, preEnd, type) { + super(interaction); + this.target = void 0; + this.currentTarget = void 0; + this.relatedTarget = null; + this.screenX = void 0; + this.screenY = void 0; + this.button = void 0; + this.buttons = void 0; + this.ctrlKey = void 0; + this.shiftKey = void 0; + this.altKey = void 0; + this.metaKey = void 0; + this.page = void 0; + this.client = void 0; + this.delta = void 0; + this.rect = void 0; + this.x0 = void 0; + this.y0 = void 0; + this.t0 = void 0; + this.dt = void 0; + this.duration = void 0; + this.clientX0 = void 0; + this.clientY0 = void 0; + this.velocity = void 0; + this.speed = void 0; + this.swipe = void 0; + this.timeStamp = void 0; + this.dragEnter = void 0; + this.dragLeave = void 0; + this.axes = void 0; + this.preEnd = void 0; + element = element || interaction.element; + const target = interaction.interactable; + const deltaSource = (target && target.options || defaults).deltaSource; + const origin = getOriginXY(target, element, actionName); + const starting = phase === 'start'; + const ending = phase === 'end'; + const prevEvent = starting ? this : interaction.prevEvent; + const coords = starting ? interaction.coords.start : ending ? { + page: prevEvent.page, + client: prevEvent.client, + timeStamp: interaction.coords.cur.timeStamp + } : interaction.coords.cur; + this.page = extend({}, coords.page); + this.client = extend({}, coords.client); + this.rect = extend({}, interaction.rect); + this.timeStamp = coords.timeStamp; + + if (!ending) { + this.page.x -= origin.x; + this.page.y -= origin.y; + this.client.x -= origin.x; + this.client.y -= origin.y; + } + + this.ctrlKey = event.ctrlKey; + this.altKey = event.altKey; + this.shiftKey = event.shiftKey; + this.metaKey = event.metaKey; + this.button = event.button; + this.buttons = event.buttons; + this.target = element; + this.currentTarget = element; + this.preEnd = preEnd; + this.type = type || actionName + (phase || ''); + this.interactable = target; + this.t0 = starting ? interaction.pointers[interaction.pointers.length - 1].downTime : prevEvent.t0; + this.x0 = interaction.coords.start.page.x - origin.x; + this.y0 = interaction.coords.start.page.y - origin.y; + this.clientX0 = interaction.coords.start.client.x - origin.x; + this.clientY0 = interaction.coords.start.client.y - origin.y; + + if (starting || ending) { + this.delta = { + x: 0, + y: 0 + }; + } else { + this.delta = { + x: this[deltaSource].x - prevEvent[deltaSource].x, + y: this[deltaSource].y - prevEvent[deltaSource].y + }; + } + + this.dt = interaction.coords.delta.timeStamp; + this.duration = this.timeStamp - this.t0; // velocity and speed in pixels per second + + this.velocity = extend({}, interaction.coords.velocity[deltaSource]); + this.speed = hypot(this.velocity.x, this.velocity.y); + this.swipe = ending || phase === 'inertiastart' ? this.getSwipe() : null; + } + + get pageX() { + return this.page.x; + } + + set pageX(value) { + this.page.x = value; + } + + get pageY() { + return this.page.y; + } + + set pageY(value) { + this.page.y = value; + } + + get clientX() { + return this.client.x; + } + + set clientX(value) { + this.client.x = value; + } + + get clientY() { + return this.client.y; + } + + set clientY(value) { + this.client.y = value; + } + + get dx() { + return this.delta.x; + } + + set dx(value) { + this.delta.x = value; + } + + get dy() { + return this.delta.y; + } + + set dy(value) { + this.delta.y = value; + } + + get velocityX() { + return this.velocity.x; + } + + set velocityX(value) { + this.velocity.x = value; + } + + get velocityY() { + return this.velocity.y; + } + + set velocityY(value) { + this.velocity.y = value; + } + + getSwipe() { + const interaction = this._interaction; + + if (interaction.prevEvent.speed < 600 || this.timeStamp - interaction.prevEvent.timeStamp > 150) { + return null; + } + + let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI; + const overlap = 22.5; + + if (angle < 0) { + angle += 360; + } + + const left = 135 - overlap <= angle && angle < 225 + overlap; + const up = 225 - overlap <= angle && angle < 315 + overlap; + const right = !left && (315 - overlap <= angle || angle < 45 + overlap); + const down = !up && 45 - overlap <= angle && angle < 135 + overlap; + return { + up, + down, + left, + right, + angle, + speed: interaction.prevEvent.speed, + velocity: { + x: interaction.prevEvent.velocityX, + y: interaction.prevEvent.velocityY + } + }; + } + + preventDefault() {} + /** + * Don't call listeners on the remaining targets + */ + + + stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + /** + * Don't call any other listeners (even on the current target) + */ + + + stopPropagation() { + this.propagationStopped = true; + } + +} +export default InteractEvent; +//# sourceMappingURL=InteractEvent.js.map \ No newline at end of file diff --git a/@interactjs/core/InteractEvent.js.map b/@interactjs/core/InteractEvent.js.map new file mode 100644 index 000000000..a44c541f6 --- /dev/null +++ b/@interactjs/core/InteractEvent.js.map @@ -0,0 +1,95 @@ +{ + "version": 3, + "sources": [ + "InteractEvent.ts" + ], + "names": [ + "extend", + "getOriginXY", + "hypot", + "BaseEvent", + "defaults", + "InteractEvent", + "constructor", + "interaction", + "event", + "actionName", + "phase", + "element", + "preEnd", + "type", + "target", + "currentTarget", + "relatedTarget", + "screenX", + "screenY", + "button", + "buttons", + "ctrlKey", + "shiftKey", + "altKey", + "metaKey", + "page", + "client", + "delta", + "rect", + "x0", + "y0", + "t0", + "dt", + "duration", + "clientX0", + "clientY0", + "velocity", + "speed", + "swipe", + "timeStamp", + "dragEnter", + "dragLeave", + "axes", + "interactable", + "deltaSource", + "options", + "origin", + "starting", + "ending", + "prevEvent", + "coords", + "start", + "cur", + "x", + "y", + "pointers", + "length", + "downTime", + "getSwipe", + "pageX", + "value", + "pageY", + "clientX", + "clientY", + "dx", + "dy", + "velocityX", + "velocityY", + "_interaction", + "angle", + "Math", + "atan2", + "PI", + "overlap", + "left", + "up", + "right", + "down", + "preventDefault", + "stopImmediatePropagation", + "immediatePropagationStopped", + "propagationStopped", + "stopPropagation" + ], + "mappings": "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", + "sourcesContent": [ + "import extend from '@interactjs/utils/extend'\nimport getOriginXY from '@interactjs/utils/getOriginXY'\nimport hypot from '@interactjs/utils/hypot'\nimport BaseEvent from './BaseEvent'\nimport defaults from './defaultOptions'\nimport Interaction from './Interaction'\n\nexport type EventPhase = keyof PhaseMap\n\nexport interface PhaseMap {\n start: true\n move: true\n end: true\n}\n\nexport class InteractEvent<\n T extends Interact.ActionName = never,\n P extends EventPhase = EventPhase,\n> extends BaseEvent {\n target: Interact.Element\n currentTarget: Interact.Element\n relatedTarget: null = null\n screenX?: number\n screenY?: number\n button: number\n buttons: number\n ctrlKey: boolean\n shiftKey: boolean\n altKey: boolean\n metaKey: boolean\n page: Interact.Point\n client: Interact.Point\n delta: Interact.Point\n rect: Interact.FullRect\n x0: number\n y0: number\n t0: number\n dt: number\n duration: number\n clientX0: number\n clientY0: number\n velocity: Interact.Point\n speed: number\n swipe: ReturnType['getSwipe']>\n timeStamp: any\n // drag\n dragEnter?: Interact.Element\n dragLeave?: Interact.Element\n // resize\n axes?: 'x' | 'y' | 'xy'\n preEnd?: boolean\n\n /** */\n constructor (\n interaction: Interaction,\n event: Interact.PointerEventType,\n actionName: T,\n phase: P,\n element: Interact.Element,\n preEnd?: boolean,\n type?: string,\n ) {\n super(interaction)\n\n element = element || interaction.element\n\n const target = interaction.interactable\n const deltaSource = (((target && target.options) || defaults) as any).deltaSource as 'page' | 'client'\n const origin = getOriginXY(target, element, actionName)\n const starting = phase === 'start'\n const ending = phase === 'end'\n const prevEvent = starting ? this : interaction.prevEvent\n const coords = starting\n ? interaction.coords.start\n : ending\n ? { page: prevEvent.page, client: prevEvent.client, timeStamp: interaction.coords.cur.timeStamp }\n : interaction.coords.cur\n\n this.page = extend({}, coords.page)\n this.client = extend({}, coords.client)\n this.rect = extend({}, interaction.rect)\n this.timeStamp = coords.timeStamp\n\n if (!ending) {\n this.page.x -= origin.x\n this.page.y -= origin.y\n\n this.client.x -= origin.x\n this.client.y -= origin.y\n }\n\n this.ctrlKey = event.ctrlKey\n this.altKey = event.altKey\n this.shiftKey = event.shiftKey\n this.metaKey = event.metaKey\n this.button = (event as MouseEvent).button\n this.buttons = (event as MouseEvent).buttons\n this.target = element\n this.currentTarget = element\n this.preEnd = preEnd\n this.type = type || (actionName + (phase || ''))\n this.interactable = target\n\n this.t0 = starting\n ? interaction.pointers[interaction.pointers.length - 1].downTime\n : prevEvent.t0\n\n this.x0 = interaction.coords.start.page.x - origin.x\n this.y0 = interaction.coords.start.page.y - origin.y\n this.clientX0 = interaction.coords.start.client.x - origin.x\n this.clientY0 = interaction.coords.start.client.y - origin.y\n\n if (starting || ending) {\n this.delta = { x: 0, y: 0 }\n }\n else {\n this.delta = {\n x: this[deltaSource].x - prevEvent[deltaSource].x,\n y: this[deltaSource].y - prevEvent[deltaSource].y,\n }\n }\n\n this.dt = interaction.coords.delta.timeStamp\n this.duration = this.timeStamp - this.t0\n\n // velocity and speed in pixels per second\n this.velocity = extend({}, interaction.coords.velocity[deltaSource])\n this.speed = hypot(this.velocity.x, this.velocity.y)\n\n this.swipe = (ending || phase === 'inertiastart') ? this.getSwipe() : null\n }\n\n get pageX () { return this.page.x }\n set pageX (value) { this.page.x = value }\n get pageY () { return this.page.y }\n set pageY (value) { this.page.y = value }\n\n get clientX () { return this.client.x }\n set clientX (value) { this.client.x = value }\n get clientY () { return this.client.y }\n set clientY (value) { this.client.y = value }\n\n get dx () { return this.delta.x }\n set dx (value) { this.delta.x = value }\n get dy () { return this.delta.y }\n set dy (value) { this.delta.y = value }\n\n get velocityX () { return this.velocity.x }\n set velocityX (value) { this.velocity.x = value }\n get velocityY () { return this.velocity.y }\n set velocityY (value) { this.velocity.y = value }\n\n getSwipe () {\n const interaction = this._interaction\n\n if (interaction.prevEvent.speed < 600 ||\n this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI\n const overlap = 22.5\n\n if (angle < 0) {\n angle += 360\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap\n const up = 225 - overlap <= angle && angle < 315 + overlap\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap)\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n }\n }\n\n preventDefault () {}\n\n /**\n * Don't call listeners on the remaining targets\n */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true\n }\n\n /**\n * Don't call any other listeners (even on the current target)\n */\n stopPropagation () {\n this.propagationStopped = true\n }\n}\n\nexport default InteractEvent\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/InteractEvent.min.js b/@interactjs/core/InteractEvent.min.js new file mode 100644 index 000000000..813d7a9be --- /dev/null +++ b/@interactjs/core/InteractEvent.min.js @@ -0,0 +1,2 @@ +import t from"../utils/extend.min.js";import e from"../utils/getOriginXY.min.js";import i from"../utils/hypot.min.js";import s from"./BaseEvent.min.js";import o from"./defaultOptions.min.js";export class InteractEvent extends s{constructor(s,r,h,n,a,d,p){super(s),this.target=void 0,this.currentTarget=void 0,this.relatedTarget=null,this.screenX=void 0,this.screenY=void 0,this.button=void 0,this.buttons=void 0,this.ctrlKey=void 0,this.shiftKey=void 0,this.altKey=void 0,this.metaKey=void 0,this.page=void 0,this.client=void 0,this.delta=void 0,this.rect=void 0,this.x0=void 0,this.y0=void 0,this.t0=void 0,this.dt=void 0,this.duration=void 0,this.clientX0=void 0,this.clientY0=void 0,this.velocity=void 0,this.speed=void 0,this.swipe=void 0,this.timeStamp=void 0,this.dragEnter=void 0,this.dragLeave=void 0,this.axes=void 0,this.preEnd=void 0,a=a||s.element;const l=s.interactable,c=(l&&l.options||o).deltaSource,v=e(l,a,h),y="start"===n,g="end"===n,m=y?this:s.prevEvent,u=y?s.coords.start:g?{page:m.page,client:m.client,timeStamp:s.coords.cur.timeStamp}:s.coords.cur;this.page=t({},u.page),this.client=t({},u.client),this.rect=t({},s.rect),this.timeStamp=u.timeStamp,g||(this.page.x-=v.x,this.page.y-=v.y,this.client.x-=v.x,this.client.y-=v.y),this.ctrlKey=r.ctrlKey,this.altKey=r.altKey,this.shiftKey=r.shiftKey,this.metaKey=r.metaKey,this.button=r.button,this.buttons=r.buttons,this.target=a,this.currentTarget=a,this.preEnd=d,this.type=p||h+(n||""),this.interactable=l,this.t0=y?s.pointers[s.pointers.length-1].downTime:m.t0,this.x0=s.coords.start.page.x-v.x,this.y0=s.coords.start.page.y-v.y,this.clientX0=s.coords.start.client.x-v.x,this.clientY0=s.coords.start.client.y-v.y,this.delta=y||g?{x:0,y:0}:{x:this[c].x-m[c].x,y:this[c].y-m[c].y},this.dt=s.coords.delta.timeStamp,this.duration=this.timeStamp-this.t0,this.velocity=t({},s.coords.velocity[c]),this.speed=i(this.velocity.x,this.velocity.y),this.swipe=g||"inertiastart"===n?this.getSwipe():null}get pageX(){return this.page.x}set pageX(t){this.page.x=t}get pageY(){return this.page.y}set pageY(t){this.page.y=t}get clientX(){return this.client.x}set clientX(t){this.client.x=t}get clientY(){return this.client.y}set clientY(t){this.client.y=t}get dx(){return this.delta.x}set dx(t){this.delta.x=t}get dy(){return this.delta.y}set dy(t){this.delta.y=t}get velocityX(){return this.velocity.x}set velocityX(t){this.velocity.x=t}get velocityY(){return this.velocity.y}set velocityY(t){this.velocity.y=t}getSwipe(){const t=this._interaction;if(t.prevEvent.speed<600||this.timeStamp-t.prevEvent.timeStamp>150)return null;let e=180*Math.atan2(t.prevEvent.velocityY,t.prevEvent.velocityX)/Math.PI;e<0&&(e+=360);const i=112.5<=e&&e<247.5,s=202.5<=e&&e<337.5;return{up:s,down:!s&&22.5<=e&&e<157.5,left:i,right:!i&&(292.5<=e||e<67.5),angle:e,speed:t.prevEvent.speed,velocity:{x:t.prevEvent.velocityX,y:t.prevEvent.velocityY}}}preventDefault(){}stopImmediatePropagation(){this.immediatePropagationStopped=this.propagationStopped=!0}stopPropagation(){this.propagationStopped=!0}}export default InteractEvent; +//# sourceMappingURL=InteractEvent.min.js.map \ No newline at end of file diff --git a/@interactjs/core/InteractEvent.min.js.map b/@interactjs/core/InteractEvent.min.js.map new file mode 100644 index 000000000..2cf41eed1 --- /dev/null +++ b/@interactjs/core/InteractEvent.min.js.map @@ -0,0 +1,96 @@ +{ + "version": 3, + "sources": [ + "InteractEvent.ts" + ], + "names": [ + "extend", + "getOriginXY", + "hypot", + "BaseEvent", + "defaults", + "InteractEvent", + "constructor", + "interaction", + "event", + "actionName", + "phase", + "element", + "preEnd", + "type", + "super", + "this", + "target", + "currentTarget", + "relatedTarget", + "screenX", + "screenY", + "button", + "buttons", + "ctrlKey", + "shiftKey", + "altKey", + "metaKey", + "page", + "client", + "delta", + "rect", + "x0", + "y0", + "t0", + "dt", + "duration", + "clientX0", + "clientY0", + "velocity", + "speed", + "swipe", + "timeStamp", + "dragEnter", + "dragLeave", + "axes", + "interactable", + "deltaSource", + "options", + "origin", + "starting", + "ending", + "prevEvent", + "coords", + "start", + "cur", + "x", + "y", + "pointers", + "length", + "downTime", + "getSwipe", + "pageX", + "value", + "pageY", + "clientX", + "clientY", + "dx", + "dy", + "velocityX", + "velocityY", + "_interaction", + "angle", + "Math", + "atan2", + "PI", + "left", + "up", + "down", + "right", + "preventDefault", + "stopImmediatePropagation", + "immediatePropagationStopped", + "propagationStopped", + "stopPropagation" + ], + "mappings": "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", + "sourcesContent": [ + "import extend from '@interactjs/utils/extend'\nimport getOriginXY from '@interactjs/utils/getOriginXY'\nimport hypot from '@interactjs/utils/hypot'\nimport BaseEvent from './BaseEvent'\nimport defaults from './defaultOptions'\nimport Interaction from './Interaction'\n\nexport type EventPhase = keyof PhaseMap\n\nexport interface PhaseMap {\n start: true\n move: true\n end: true\n}\n\nexport class InteractEvent<\n T extends Interact.ActionName = never,\n P extends EventPhase = EventPhase,\n> extends BaseEvent {\n target: Interact.Element\n currentTarget: Interact.Element\n relatedTarget: null = null\n screenX?: number\n screenY?: number\n button: number\n buttons: number\n ctrlKey: boolean\n shiftKey: boolean\n altKey: boolean\n metaKey: boolean\n page: Interact.Point\n client: Interact.Point\n delta: Interact.Point\n rect: Interact.FullRect\n x0: number\n y0: number\n t0: number\n dt: number\n duration: number\n clientX0: number\n clientY0: number\n velocity: Interact.Point\n speed: number\n swipe: ReturnType['getSwipe']>\n timeStamp: any\n // drag\n dragEnter?: Interact.Element\n dragLeave?: Interact.Element\n // resize\n axes?: 'x' | 'y' | 'xy'\n preEnd?: boolean\n\n /** */\n constructor (\n interaction: Interaction,\n event: Interact.PointerEventType,\n actionName: T,\n phase: P,\n element: Interact.Element,\n preEnd?: boolean,\n type?: string,\n ) {\n super(interaction)\n\n element = element || interaction.element\n\n const target = interaction.interactable\n const deltaSource = (((target && target.options) || defaults) as any).deltaSource as 'page' | 'client'\n const origin = getOriginXY(target, element, actionName)\n const starting = phase === 'start'\n const ending = phase === 'end'\n const prevEvent = starting ? this : interaction.prevEvent\n const coords = starting\n ? interaction.coords.start\n : ending\n ? { page: prevEvent.page, client: prevEvent.client, timeStamp: interaction.coords.cur.timeStamp }\n : interaction.coords.cur\n\n this.page = extend({}, coords.page)\n this.client = extend({}, coords.client)\n this.rect = extend({}, interaction.rect)\n this.timeStamp = coords.timeStamp\n\n if (!ending) {\n this.page.x -= origin.x\n this.page.y -= origin.y\n\n this.client.x -= origin.x\n this.client.y -= origin.y\n }\n\n this.ctrlKey = event.ctrlKey\n this.altKey = event.altKey\n this.shiftKey = event.shiftKey\n this.metaKey = event.metaKey\n this.button = (event as MouseEvent).button\n this.buttons = (event as MouseEvent).buttons\n this.target = element\n this.currentTarget = element\n this.preEnd = preEnd\n this.type = type || (actionName + (phase || ''))\n this.interactable = target\n\n this.t0 = starting\n ? interaction.pointers[interaction.pointers.length - 1].downTime\n : prevEvent.t0\n\n this.x0 = interaction.coords.start.page.x - origin.x\n this.y0 = interaction.coords.start.page.y - origin.y\n this.clientX0 = interaction.coords.start.client.x - origin.x\n this.clientY0 = interaction.coords.start.client.y - origin.y\n\n if (starting || ending) {\n this.delta = { x: 0, y: 0 }\n }\n else {\n this.delta = {\n x: this[deltaSource].x - prevEvent[deltaSource].x,\n y: this[deltaSource].y - prevEvent[deltaSource].y,\n }\n }\n\n this.dt = interaction.coords.delta.timeStamp\n this.duration = this.timeStamp - this.t0\n\n // velocity and speed in pixels per second\n this.velocity = extend({}, interaction.coords.velocity[deltaSource])\n this.speed = hypot(this.velocity.x, this.velocity.y)\n\n this.swipe = (ending || phase === 'inertiastart') ? this.getSwipe() : null\n }\n\n get pageX () { return this.page.x }\n set pageX (value) { this.page.x = value }\n get pageY () { return this.page.y }\n set pageY (value) { this.page.y = value }\n\n get clientX () { return this.client.x }\n set clientX (value) { this.client.x = value }\n get clientY () { return this.client.y }\n set clientY (value) { this.client.y = value }\n\n get dx () { return this.delta.x }\n set dx (value) { this.delta.x = value }\n get dy () { return this.delta.y }\n set dy (value) { this.delta.y = value }\n\n get velocityX () { return this.velocity.x }\n set velocityX (value) { this.velocity.x = value }\n get velocityY () { return this.velocity.y }\n set velocityY (value) { this.velocity.y = value }\n\n getSwipe () {\n const interaction = this._interaction\n\n if (interaction.prevEvent.speed < 600 ||\n this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI\n const overlap = 22.5\n\n if (angle < 0) {\n angle += 360\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap\n const up = 225 - overlap <= angle && angle < 315 + overlap\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap)\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n }\n }\n\n preventDefault () {}\n\n /**\n * Don't call listeners on the remaining targets\n */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true\n }\n\n /**\n * Don't call any other listeners (even on the current target)\n */\n stopPropagation () {\n this.propagationStopped = true\n }\n}\n\nexport default InteractEvent\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/Interactable.d.ts b/@interactjs/core/Interactable.d.ts new file mode 100644 index 000000000..4c9f49486 --- /dev/null +++ b/@interactjs/core/Interactable.d.ts @@ -0,0 +1,133 @@ +import { Defaults, Options } from './defaultOptions'; +import Eventable from './Eventable'; +import { Actions } from './scope'; +declare type IgnoreValue = string | Interact.Element | boolean; +/** */ +export declare class Interactable implements Partial { + protected readonly _defaults: Defaults; + readonly options: Required; + readonly _actions: Actions; + readonly target: Interact.Target; + readonly events: Eventable; + readonly _context: Document | Interact.Element; + readonly _win: Window; + readonly _doc: Document; + /** */ + constructor(target: Interact.Target, options: any, defaultContext: Document | Interact.Element); + setOnEvents(actionName: Interact.ActionName, phases: NonNullable): this; + updatePerActionListeners(actionName: Interact.ActionName, prev: Interact.Listeners, cur: Interact.Listeners): void; + setPerAction(actionName: Interact.ActionName, options: Interact.OrBoolean): void; + /** + * The default function to get an Interactables bounding rect. Can be + * overridden using {@link Interactable.rectChecker}. + * + * @param {Element} [element] The element to measure. + * @return {object} The object's bounding rectangle. + */ + getRect(element: Interact.Element): { + left: number; + right: number; + top: number; + bottom: number; + width: number; + height: number; + }; + /** + * Returns or sets the function used to calculate the interactable's + * element's rectangle + * + * @param {function} [checker] A function which returns this Interactable's + * bounding rectangle. See {@link Interactable.getRect} + * @return {function | object} The checker function or this Interactable + */ + rectChecker(checker: (element: Interact.Element) => any): this | ((element: import("@interactjs/types/types").Element) => { + left: number; + right: number; + top: number; + bottom: number; + width: number; + height: number; + }); + _backCompatOption(optionName: keyof Interact.Options, newValue: any): any; + /** + * Gets or sets the origin of the Interactable's element. The x and y + * of the origin will be subtracted from action event coordinates. + * + * @param {Element | object | string} [origin] An HTML or SVG Element whose + * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self' + * or any CSS selector + * + * @return {object} The current origin or this Interactable + */ + origin(newValue: any): any; + /** + * Returns or sets the mouse coordinate types used to calculate the + * movement of the pointer. + * + * @param {string} [newValue] Use 'client' if you will be scrolling while + * interacting; Use 'page' if you want autoScroll to work + * @return {string | object} The current deltaSource or this Interactable + */ + deltaSource(newValue?: string): "page" | "client" | this; + /** + * Gets the selector context Node of the Interactable. The default is + * `window.document`. + * + * @return {Node} The context Node of this Interactable + */ + context(): Document | HTMLElement | SVGElement; + inContext(element: Document | Node): boolean; + testIgnoreAllow(this: Interactable, options: { + ignoreFrom?: IgnoreValue; + allowFrom?: IgnoreValue; + }, targetNode: Node, eventTarget: Interact.EventTarget): any; + testAllow(this: Interactable, allowFrom: IgnoreValue, targetNode: Node, element: Interact.EventTarget): any; + testIgnore(this: Interactable, ignoreFrom: IgnoreValue, targetNode: Node, element: Interact.EventTarget): any; + /** + * Calls listeners for the given InteractEvent type bound globally + * and directly to this Interactable + * + * @param {InteractEvent} iEvent The InteractEvent object to be fired on this + * Interactable + * @return {Interactable} this Interactable + */ + fire(iEvent: object): this; + _onOff(method: 'on' | 'off', typeArg: Interact.EventTypes, listenerArg?: Interact.ListenersArg | null, options?: any): this; + /** + * Binds a listener for an InteractEvent, pointerEvent or DOM event. + * + * @param {string | array | object} types The types of events to listen + * for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * addEventListener + * @return {Interactable} This Interactable + */ + on(types: Interact.EventTypes, listener?: Interact.ListenersArg, options?: any): this; + /** + * Removes an InteractEvent, pointerEvent or DOM event listener. + * + * @param {string | array | object} types The types of events that were + * listened for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * removeEventListener + * @return {Interactable} This Interactable + */ + off(types: string | string[] | Interact.EventTypes, listener?: Interact.ListenersArg, options?: any): this; + /** + * Reset the options of this Interactable + * + * @param {object} options The new settings to apply + * @return {object} This Interactable + */ + set(options: Interact.OptionsArg): this; + /** + * Remove this interactable from the list of interactables and remove it's + * action capabilities and event listeners + * + * @return {interact} + */ + unset(): void; +} +export default Interactable; diff --git a/@interactjs/core/Interactable.js b/@interactjs/core/Interactable.js new file mode 100644 index 000000000..2d423beea --- /dev/null +++ b/@interactjs/core/Interactable.js @@ -0,0 +1,381 @@ +import * as arr from "../utils/arr.js"; +import browser from "../utils/browser.js"; +import clone from "../utils/clone.js"; +import { getElementRect, matchesUpTo, nodeContains, trySelector } from "../utils/domUtils.js"; +import events from "../utils/events.js"; +import extend from "../utils/extend.js"; +import * as is from "../utils/is.js"; +import normalizeListeners from "../utils/normalizeListeners.js"; +import { getWindow } from "../utils/window.js"; +import Eventable from "./Eventable.js"; +import { isNonNativeEvent } from "./scope.js"; + +/** */ +export class Interactable { + get _defaults() { + return { + base: {}, + perAction: {}, + actions: {} + }; + } + + /** */ + constructor(target, options, defaultContext) { + this.options = void 0; + this._actions = void 0; + this.target = void 0; + this.events = new Eventable(); + this._context = void 0; + this._win = void 0; + this._doc = void 0; + this._actions = options.actions; + this.target = target; + this._context = options.context || defaultContext; + this._win = getWindow(trySelector(target) ? this._context : target); + this._doc = this._win.document; + this.set(options); + } + + setOnEvents(actionName, phases) { + if (is.func(phases.onstart)) { + this.on(`${actionName}start`, phases.onstart); + } + + if (is.func(phases.onmove)) { + this.on(`${actionName}move`, phases.onmove); + } + + if (is.func(phases.onend)) { + this.on(`${actionName}end`, phases.onend); + } + + if (is.func(phases.oninertiastart)) { + this.on(`${actionName}inertiastart`, phases.oninertiastart); + } + + return this; + } + + updatePerActionListeners(actionName, prev, cur) { + if (is.array(prev) || is.object(prev)) { + this.off(actionName, prev); + } + + if (is.array(cur) || is.object(cur)) { + this.on(actionName, cur); + } + } + + setPerAction(actionName, options) { + const defaults = this._defaults; // for all the default per-action options + + for (const optionName_ in options) { + const optionName = optionName_; + const actionOptions = this.options[actionName]; + const optionValue = options[optionName]; // remove old event listeners and add new ones + + if (optionName === 'listeners') { + this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue); + } // if the option value is an array + + + if (is.array(optionValue)) { + actionOptions[optionName] = arr.from(optionValue); + } // if the option value is an object + else if (is.plainObject(optionValue)) { + // copy the object + actionOptions[optionName] = extend(actionOptions[optionName] || {}, clone(optionValue)); // set anabled field to true if it exists in the defaults + + if (is.object(defaults.perAction[optionName]) && 'enabled' in defaults.perAction[optionName]) { + actionOptions[optionName].enabled = optionValue.enabled !== false; + } + } // if the option value is a boolean and the default is an object + else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) { + actionOptions[optionName].enabled = optionValue; + } // if it's anything else, do a plain assignment + else { + actionOptions[optionName] = optionValue; + } + } + } + /** + * The default function to get an Interactables bounding rect. Can be + * overridden using {@link Interactable.rectChecker}. + * + * @param {Element} [element] The element to measure. + * @return {object} The object's bounding rectangle. + */ + + + getRect(element) { + element = element || (is.element(this.target) ? this.target : null); + + if (is.string(this.target)) { + element = element || this._context.querySelector(this.target); + } + + return getElementRect(element); + } + /** + * Returns or sets the function used to calculate the interactable's + * element's rectangle + * + * @param {function} [checker] A function which returns this Interactable's + * bounding rectangle. See {@link Interactable.getRect} + * @return {function | object} The checker function or this Interactable + */ + + + rectChecker(checker) { + if (is.func(checker)) { + this.getRect = checker; + return this; + } + + if (checker === null) { + delete this.getRect; + return this; + } + + return this.getRect; + } + + _backCompatOption(optionName, newValue) { + if (trySelector(newValue) || is.object(newValue)) { + this.options[optionName] = newValue; + + for (const action in this._actions.map) { + this.options[action][optionName] = newValue; + } + + return this; + } + + return this.options[optionName]; + } + /** + * Gets or sets the origin of the Interactable's element. The x and y + * of the origin will be subtracted from action event coordinates. + * + * @param {Element | object | string} [origin] An HTML or SVG Element whose + * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self' + * or any CSS selector + * + * @return {object} The current origin or this Interactable + */ + + + origin(newValue) { + return this._backCompatOption('origin', newValue); + } + /** + * Returns or sets the mouse coordinate types used to calculate the + * movement of the pointer. + * + * @param {string} [newValue] Use 'client' if you will be scrolling while + * interacting; Use 'page' if you want autoScroll to work + * @return {string | object} The current deltaSource or this Interactable + */ + + + deltaSource(newValue) { + if (newValue === 'page' || newValue === 'client') { + this.options.deltaSource = newValue; + return this; + } + + return this.options.deltaSource; + } + /** + * Gets the selector context Node of the Interactable. The default is + * `window.document`. + * + * @return {Node} The context Node of this Interactable + */ + + + context() { + return this._context; + } + + inContext(element) { + return this._context === element.ownerDocument || nodeContains(this._context, element); + } + + testIgnoreAllow(options, targetNode, eventTarget) { + return !this.testIgnore(options.ignoreFrom, targetNode, eventTarget) && this.testAllow(options.allowFrom, targetNode, eventTarget); + } + + testAllow(allowFrom, targetNode, element) { + if (!allowFrom) { + return true; + } + + if (!is.element(element)) { + return false; + } + + if (is.string(allowFrom)) { + return matchesUpTo(element, allowFrom, targetNode); + } else if (is.element(allowFrom)) { + return nodeContains(allowFrom, element); + } + + return false; + } + + testIgnore(ignoreFrom, targetNode, element) { + if (!ignoreFrom || !is.element(element)) { + return false; + } + + if (is.string(ignoreFrom)) { + return matchesUpTo(element, ignoreFrom, targetNode); + } else if (is.element(ignoreFrom)) { + return nodeContains(ignoreFrom, element); + } + + return false; + } + /** + * Calls listeners for the given InteractEvent type bound globally + * and directly to this Interactable + * + * @param {InteractEvent} iEvent The InteractEvent object to be fired on this + * Interactable + * @return {Interactable} this Interactable + */ + + + fire(iEvent) { + this.events.fire(iEvent); + return this; + } + + _onOff(method, typeArg, listenerArg, options) { + if (is.object(typeArg) && !is.array(typeArg)) { + options = listenerArg; + listenerArg = null; + } + + const addRemove = method === 'on' ? 'add' : 'remove'; + const listeners = normalizeListeners(typeArg, listenerArg); + + for (let type in listeners) { + if (type === 'wheel') { + type = browser.wheelEvent; + } + + for (const listener of listeners[type]) { + // if it is an action event type + if (isNonNativeEvent(type, this._actions)) { + this.events[method](type, listener); + } // delegated event + else if (is.string(this.target)) { + events[`${addRemove}Delegate`](this.target, this._context, type, listener, options); + } // remove listener from this Interactable's element + else { + events[addRemove](this.target, type, listener, options); + } + } + } + + return this; + } + /** + * Binds a listener for an InteractEvent, pointerEvent or DOM event. + * + * @param {string | array | object} types The types of events to listen + * for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * addEventListener + * @return {Interactable} This Interactable + */ + + + on(types, listener, options) { + return this._onOff('on', types, listener, options); + } + /** + * Removes an InteractEvent, pointerEvent or DOM event listener. + * + * @param {string | array | object} types The types of events that were + * listened for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * removeEventListener + * @return {Interactable} This Interactable + */ + + + off(types, listener, options) { + return this._onOff('off', types, listener, options); + } + /** + * Reset the options of this Interactable + * + * @param {object} options The new settings to apply + * @return {object} This Interactable + */ + + + set(options) { + const defaults = this._defaults; + + if (!is.object(options)) { + options = {}; + } + + this.options = clone(defaults.base); + + for (const actionName_ in this._actions.methodDict) { + const actionName = actionName_; + const methodName = this._actions.methodDict[actionName]; + this.options[actionName] = {}; + this.setPerAction(actionName, extend(extend({}, defaults.perAction), defaults.actions[actionName])); + this[methodName](options[actionName]); + } + + for (const setting in options) { + if (is.func(this[setting])) { + this[setting](options[setting]); + } + } + + return this; + } + /** + * Remove this interactable from the list of interactables and remove it's + * action capabilities and event listeners + * + * @return {interact} + */ + + + unset() { + events.remove(this.target, 'all'); + + if (is.string(this.target)) { + // remove delegated events + for (const type in events.delegatedEvents) { + const delegated = events.delegatedEvents[type]; + + if (delegated.selectors[0] === this.target && delegated.contexts[0] === this._context) { + delegated.selectors.splice(0, 1); + delegated.contexts.splice(0, 1); + delegated.listeners.splice(0, 1); + } + + events.remove(this._context, type, events.delegateListener); + events.remove(this._context, type, events.delegateUseCapture, true); + } + } else { + events.remove(this.target, 'all'); + } + } + +} +export default Interactable; +//# sourceMappingURL=Interactable.js.map \ No newline at end of file diff --git a/@interactjs/core/Interactable.js.map b/@interactjs/core/Interactable.js.map new file mode 100644 index 000000000..3be280b66 --- /dev/null +++ b/@interactjs/core/Interactable.js.map @@ -0,0 +1,113 @@ +{ + "version": 3, + "sources": [ + "Interactable.ts" + ], + "names": [ + "arr", + "browser", + "clone", + "getElementRect", + "matchesUpTo", + "nodeContains", + "trySelector", + "events", + "extend", + "is", + "normalizeListeners", + "getWindow", + "Eventable", + "isNonNativeEvent", + "Interactable", + "_defaults", + "base", + "perAction", + "actions", + "constructor", + "target", + "options", + "defaultContext", + "_actions", + "_context", + "_win", + "_doc", + "context", + "document", + "set", + "setOnEvents", + "actionName", + "phases", + "func", + "onstart", + "on", + "onmove", + "onend", + "oninertiastart", + "updatePerActionListeners", + "prev", + "cur", + "array", + "object", + "off", + "setPerAction", + "defaults", + "optionName_", + "optionName", + "actionOptions", + "optionValue", + "listeners", + "from", + "plainObject", + "enabled", + "bool", + "getRect", + "element", + "string", + "querySelector", + "rectChecker", + "checker", + "_backCompatOption", + "newValue", + "action", + "map", + "origin", + "deltaSource", + "inContext", + "ownerDocument", + "testIgnoreAllow", + "targetNode", + "eventTarget", + "testIgnore", + "ignoreFrom", + "testAllow", + "allowFrom", + "fire", + "iEvent", + "_onOff", + "method", + "typeArg", + "listenerArg", + "addRemove", + "type", + "wheelEvent", + "listener", + "types", + "actionName_", + "methodDict", + "methodName", + "setting", + "unset", + "remove", + "delegatedEvents", + "delegated", + "selectors", + "contexts", + "splice", + "delegateListener", + "delegateUseCapture" + ], + "mappings": "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", + "sourcesContent": [ + "import * as arr from '@interactjs/utils/arr'\nimport browser from '@interactjs/utils/browser'\nimport clone from '@interactjs/utils/clone'\nimport { getElementRect, matchesUpTo, nodeContains, trySelector } from '@interactjs/utils/domUtils'\nimport events from '@interactjs/utils/events'\nimport extend from '@interactjs/utils/extend'\nimport * as is from '@interactjs/utils/is'\nimport normalizeListeners from '@interactjs/utils/normalizeListeners'\nimport { getWindow } from '@interactjs/utils/window'\nimport { ActionDefaults, Defaults, Options } from './defaultOptions'\nimport Eventable from './Eventable'\nimport { Actions, isNonNativeEvent } from './scope'\n\ntype IgnoreValue = string | Interact.Element | boolean\n\n/** */\nexport class Interactable implements Partial {\n protected get _defaults (): Defaults {\n return {\n base: {},\n perAction: {},\n actions: {} as ActionDefaults,\n }\n }\n\n readonly options!: Required\n readonly _actions: Actions\n readonly target: Interact.Target\n readonly events = new Eventable()\n readonly _context: Document | Interact.Element\n readonly _win: Window\n readonly _doc: Document\n\n /** */\n constructor (target: Interact.Target, options: any, defaultContext: Document | Interact.Element) {\n this._actions = options.actions\n this.target = target\n this._context = options.context || defaultContext\n this._win = getWindow(trySelector(target) ? this._context : target)\n this._doc = this._win.document\n\n this.set(options)\n }\n\n setOnEvents (actionName: Interact.ActionName, phases: NonNullable) {\n if (is.func(phases.onstart)) { this.on(`${actionName}start`, phases.onstart) }\n if (is.func(phases.onmove)) { this.on(`${actionName}move`, phases.onmove) }\n if (is.func(phases.onend)) { this.on(`${actionName}end`, phases.onend) }\n if (is.func(phases.oninertiastart)) { this.on(`${actionName}inertiastart`, phases.oninertiastart) }\n\n return this\n }\n\n updatePerActionListeners (actionName: Interact.ActionName, prev: Interact.Listeners, cur: Interact.Listeners) {\n if (is.array(prev) || is.object(prev)) {\n this.off(actionName, prev)\n }\n\n if (is.array(cur) || is.object(cur)) {\n this.on(actionName, cur)\n }\n }\n\n setPerAction (actionName: Interact.ActionName, options: Interact.OrBoolean) {\n const defaults = this._defaults\n\n // for all the default per-action options\n for (const optionName_ in options) {\n const optionName = optionName_ as keyof Interact.PerActionDefaults\n const actionOptions = this.options[actionName]\n const optionValue: any = options[optionName]\n\n // remove old event listeners and add new ones\n if (optionName === 'listeners') {\n this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue as Interact.Listeners)\n }\n\n // if the option value is an array\n if (is.array(optionValue)) {\n (actionOptions[optionName] as any) = arr.from(optionValue)\n }\n // if the option value is an object\n else if (is.plainObject(optionValue)) {\n // copy the object\n (actionOptions[optionName] as any) = extend(\n actionOptions[optionName] || {} as any,\n clone(optionValue))\n\n // set anabled field to true if it exists in the defaults\n if (is.object(defaults.perAction[optionName]) && 'enabled' in (defaults.perAction[optionName] as any)) {\n (actionOptions[optionName] as any).enabled = optionValue.enabled !== false\n }\n }\n // if the option value is a boolean and the default is an object\n else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) {\n (actionOptions[optionName] as any).enabled = optionValue\n }\n // if it's anything else, do a plain assignment\n else {\n (actionOptions[optionName] as any) = optionValue\n }\n }\n }\n\n /**\n * The default function to get an Interactables bounding rect. Can be\n * overridden using {@link Interactable.rectChecker}.\n *\n * @param {Element} [element] The element to measure.\n * @return {object} The object's bounding rectangle.\n */\n getRect (element: Interact.Element) {\n element = element || (is.element(this.target)\n ? this.target\n : null)\n\n if (is.string(this.target)) {\n element = element || this._context.querySelector(this.target)\n }\n\n return getElementRect(element)\n }\n\n /**\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n * @param {function} [checker] A function which returns this Interactable's\n * bounding rectangle. See {@link Interactable.getRect}\n * @return {function | object} The checker function or this Interactable\n */\n rectChecker (checker: (element: Interact.Element) => any) {\n if (is.func(checker)) {\n this.getRect = checker\n\n return this\n }\n\n if (checker === null) {\n delete this.getRect\n\n return this\n }\n\n return this.getRect\n }\n\n _backCompatOption (optionName: keyof Interact.Options, newValue: any) {\n if (trySelector(newValue) || is.object(newValue)) {\n (this.options[optionName] as any) = newValue\n\n for (const action in this._actions.map) {\n (this.options[action][optionName] as any) = newValue\n }\n\n return this\n }\n\n return this.options[optionName]\n }\n\n /**\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n * @param {Element | object | string} [origin] An HTML or SVG Element whose\n * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n * or any CSS selector\n *\n * @return {object} The current origin or this Interactable\n */\n origin (newValue: any) {\n return this._backCompatOption('origin', newValue)\n }\n\n /**\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n * @param {string} [newValue] Use 'client' if you will be scrolling while\n * interacting; Use 'page' if you want autoScroll to work\n * @return {string | object} The current deltaSource or this Interactable\n */\n deltaSource (newValue?: string) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue\n\n return this\n }\n\n return this.options.deltaSource\n }\n\n /**\n * Gets the selector context Node of the Interactable. The default is\n * `window.document`.\n *\n * @return {Node} The context Node of this Interactable\n */\n context () {\n return this._context\n }\n\n inContext (element: Document | Node) {\n return (this._context === element.ownerDocument ||\n nodeContains(this._context, element))\n }\n\n testIgnoreAllow (\n this: Interactable,\n options: { ignoreFrom?: IgnoreValue, allowFrom?: IgnoreValue },\n targetNode: Node,\n eventTarget: Interact.EventTarget,\n ) {\n return (!this.testIgnore(options.ignoreFrom, targetNode, eventTarget) &&\n this.testAllow(options.allowFrom, targetNode, eventTarget))\n }\n\n testAllow (\n this: Interactable,\n allowFrom: IgnoreValue,\n targetNode: Node,\n element: Interact.EventTarget,\n ) {\n if (!allowFrom) { return true }\n\n if (!is.element(element)) { return false }\n\n if (is.string(allowFrom)) {\n return matchesUpTo(element, allowFrom, targetNode)\n }\n else if (is.element(allowFrom)) {\n return nodeContains(allowFrom, element)\n }\n\n return false\n }\n\n testIgnore (\n this: Interactable,\n ignoreFrom: IgnoreValue,\n targetNode: Node,\n element: Interact.EventTarget,\n ) {\n if (!ignoreFrom || !is.element(element)) { return false }\n\n if (is.string(ignoreFrom)) {\n return matchesUpTo(element, ignoreFrom, targetNode)\n }\n else if (is.element(ignoreFrom)) {\n return nodeContains(ignoreFrom, element)\n }\n\n return false\n }\n\n /**\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n * Interactable\n * @return {Interactable} this Interactable\n */\n fire (iEvent: object) {\n this.events.fire(iEvent)\n\n return this\n }\n\n _onOff (method: 'on' | 'off', typeArg: Interact.EventTypes, listenerArg?: Interact.ListenersArg | null, options?: any) {\n if (is.object(typeArg) && !is.array(typeArg)) {\n options = listenerArg\n listenerArg = null\n }\n\n const addRemove = method === 'on' ? 'add' : 'remove'\n const listeners = normalizeListeners(typeArg, listenerArg)\n\n for (let type in listeners) {\n if (type === 'wheel') { type = browser.wheelEvent }\n\n for (const listener of listeners[type]) {\n // if it is an action event type\n if (isNonNativeEvent(type, this._actions)) {\n this.events[method](type, listener)\n }\n // delegated event\n else if (is.string(this.target)) {\n events[`${addRemove}Delegate` as 'addDelegate' | 'removeDelegate'](this.target, this._context, type, listener, options)\n }\n // remove listener from this Interactable's element\n else {\n (events[addRemove] as typeof events.remove)(this.target, type, listener, options)\n }\n }\n }\n\n return this\n }\n\n /**\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} types The types of events to listen\n * for\n * @param {function | array | object} [listener] The event listener function(s)\n * @param {object | boolean} [options] options object or useCapture flag for\n * addEventListener\n * @return {Interactable} This Interactable\n */\n on (types: Interact.EventTypes, listener?: Interact.ListenersArg, options?: any) {\n return this._onOff('on', types, listener, options)\n }\n\n /**\n * Removes an InteractEvent, pointerEvent or DOM event listener.\n *\n * @param {string | array | object} types The types of events that were\n * listened for\n * @param {function | array | object} [listener] The event listener function(s)\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {Interactable} This Interactable\n */\n off (types: string | string[] | Interact.EventTypes, listener?: Interact.ListenersArg, options?: any) {\n return this._onOff('off', types, listener, options)\n }\n\n /**\n * Reset the options of this Interactable\n *\n * @param {object} options The new settings to apply\n * @return {object} This Interactable\n */\n set (options: Interact.OptionsArg) {\n const defaults = this._defaults\n\n if (!is.object(options)) {\n options = {}\n }\n\n (this.options as Required) = clone(defaults.base) as Required\n\n for (const actionName_ in this._actions.methodDict) {\n const actionName = actionName_ as Interact.ActionName\n const methodName = this._actions.methodDict[actionName]\n\n this.options[actionName] = {}\n this.setPerAction(actionName, extend(extend({}, defaults.perAction), defaults.actions[actionName]))\n\n this[methodName](options[actionName])\n }\n\n for (const setting in options) {\n if (is.func(this[setting])) {\n this[setting](options[setting])\n }\n }\n\n return this\n }\n\n /**\n * Remove this interactable from the list of interactables and remove it's\n * action capabilities and event listeners\n *\n * @return {interact}\n */\n unset () {\n events.remove(this.target as Node, 'all')\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type]\n\n if (delegated.selectors[0] === this.target &&\n delegated.contexts[0] === this._context) {\n delegated.selectors.splice(0, 1)\n delegated.contexts.splice(0, 1)\n delegated.listeners.splice(0, 1)\n }\n\n events.remove(this._context, type, events.delegateListener)\n events.remove(this._context, type, events.delegateUseCapture, true)\n }\n }\n else {\n events.remove(this.target as Node, 'all')\n }\n }\n}\n\nexport default Interactable\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/Interactable.min.js b/@interactjs/core/Interactable.min.js new file mode 100644 index 000000000..40e6ca054 --- /dev/null +++ b/@interactjs/core/Interactable.min.js @@ -0,0 +1,2 @@ +import*as t from"../utils/arr.min.js";import e from"../utils/browser.min.js";import s from"../utils/clone.min.js";import{getElementRect as i,matchesUpTo as n,nodeContains as o,trySelector as r}from"../utils/domUtils.min.js";import c from"../utils/events.min.js";import h from"../utils/extend.min.js";import*as a from"../utils/is.min.js";import l from"../utils/normalizeListeners.min.js";import{getWindow as m}from"../utils/window.min.js";import u from"./Eventable.min.js";import{isNonNativeEvent as f}from"./scope.min.js";export class Interactable{get _defaults(){return{base:{},perAction:{},actions:{}}}constructor(t,e,s){this.options=void 0,this._actions=void 0,this.target=void 0,this.events=new u,this._context=void 0,this._win=void 0,this._doc=void 0,this._actions=e.actions,this.target=t,this._context=e.context||s,this._win=m(r(t)?this._context:t),this._doc=this._win.document,this.set(e)}setOnEvents(t,e){return a.func(e.onstart)&&this.on(`${t}start`,e.onstart),a.func(e.onmove)&&this.on(`${t}move`,e.onmove),a.func(e.onend)&&this.on(`${t}end`,e.onend),a.func(e.oninertiastart)&&this.on(`${t}inertiastart`,e.oninertiastart),this}updatePerActionListeners(t,e,s){(a.array(e)||a.object(e))&&this.off(t,e),(a.array(s)||a.object(s))&&this.on(t,s)}setPerAction(e,i){const n=this._defaults;for(const o in i){const r=o,c=this.options[e],l=i[r];"listeners"===r&&this.updatePerActionListeners(e,c.listeners,l),a.array(l)?c[r]=t.from(l):a.plainObject(l)?(c[r]=h(c[r]||{},s(l)),a.object(n.perAction[r])&&"enabled"in n.perAction[r]&&(c[r].enabled=!1!==l.enabled)):a.bool(l)&&a.object(n.perAction[r])?c[r].enabled=l:c[r]=l}}getRect(t){return t=t||(a.element(this.target)?this.target:null),a.string(this.target)&&(t=t||this._context.querySelector(this.target)),i(t)}rectChecker(t){return a.func(t)?(this.getRect=t,this):null===t?(delete this.getRect,this):this.getRect}_backCompatOption(t,e){if(r(e)||a.object(e)){this.options[t]=e;for(const s in this._actions.map)this.options[s][t]=e;return this}return this.options[t]}origin(t){return this._backCompatOption("origin",t)}deltaSource(t){return"page"===t||"client"===t?(this.options.deltaSource=t,this):this.options.deltaSource}context(){return this._context}inContext(t){return this._context===t.ownerDocument||o(this._context,t)}testIgnoreAllow(t,e,s){return!this.testIgnore(t.ignoreFrom,e,s)&&this.testAllow(t.allowFrom,e,s)}testAllow(t,e,s){return!t||!!a.element(s)&&(a.string(t)?n(s,t,e):!!a.element(t)&&o(t,s))}testIgnore(t,e,s){return!(!t||!a.element(s))&&(a.string(t)?n(s,t,e):!!a.element(t)&&o(t,s))}fire(t){return this.events.fire(t),this}_onOff(t,s,i,n){a.object(s)&&!a.array(s)&&(n=i,i=null);const o="on"===t?"add":"remove",r=l(s,i);for(let s in r){"wheel"===s&&(s=e.wheelEvent);for(const e of r[s])f(s,this._actions)?this.events[t](s,e):a.string(this.target)?c[`${o}Delegate`](this.target,this._context,s,e,n):c[o](this.target,s,e,n)}return this}on(t,e,s){return this._onOff("on",t,e,s)}off(t,e,s){return this._onOff("off",t,e,s)}set(t){const e=this._defaults;a.object(t)||(t={}),this.options=s(e.base);for(const s in this._actions.methodDict){const i=s,n=this._actions.methodDict[i];this.options[i]={},this.setPerAction(i,h(h({},e.perAction),e.actions[i])),this[n](t[i])}for(const e in t)a.func(this[e])&&this[e](t[e]);return this}unset(){if(c.remove(this.target,"all"),a.string(this.target))for(const t in c.delegatedEvents){const e=c.delegatedEvents[t];e.selectors[0]===this.target&&e.contexts[0]===this._context&&(e.selectors.splice(0,1),e.contexts.splice(0,1),e.listeners.splice(0,1)),c.remove(this._context,t,c.delegateListener),c.remove(this._context,t,c.delegateUseCapture,!0)}else c.remove(this.target,"all")}}export default Interactable; +//# sourceMappingURL=Interactable.min.js.map \ No newline at end of file diff --git a/@interactjs/core/Interactable.min.js.map b/@interactjs/core/Interactable.min.js.map new file mode 100644 index 000000000..3213a5570 --- /dev/null +++ b/@interactjs/core/Interactable.min.js.map @@ -0,0 +1,114 @@ +{ + "version": 3, + "sources": [ + "Interactable.ts" + ], + "names": [ + "arr", + "browser", + "clone", + "getElementRect", + "matchesUpTo", + "nodeContains", + "trySelector", + "events", + "extend", + "is", + "normalizeListeners", + "getWindow", + "Eventable", + "isNonNativeEvent", + "Interactable", + "_defaults", + "base", + "perAction", + "actions", + "constructor", + "target", + "options", + "defaultContext", + "this", + "_actions", + "_context", + "_win", + "_doc", + "context", + "document", + "set", + "setOnEvents", + "actionName", + "phases", + "func", + "onstart", + "on", + "onmove", + "onend", + "oninertiastart", + "updatePerActionListeners", + "prev", + "cur", + "array", + "object", + "off", + "setPerAction", + "defaults", + "optionName_", + "optionName", + "actionOptions", + "optionValue", + "listeners", + "from", + "plainObject", + "enabled", + "bool", + "getRect", + "element", + "string", + "querySelector", + "rectChecker", + "checker", + "_backCompatOption", + "newValue", + "action", + "map", + "origin", + "deltaSource", + "inContext", + "ownerDocument", + "testIgnoreAllow", + "targetNode", + "eventTarget", + "testIgnore", + "ignoreFrom", + "testAllow", + "allowFrom", + "fire", + "iEvent", + "_onOff", + "method", + "typeArg", + "listenerArg", + "addRemove", + "type", + "wheelEvent", + "listener", + "types", + "actionName_", + "methodDict", + "methodName", + "setting", + "unset", + "remove", + "delegatedEvents", + "delegated", + "selectors", + "contexts", + "splice", + "delegateListener", + "delegateUseCapture" + ], + "mappings": "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", + "sourcesContent": [ + "import * as arr from '@interactjs/utils/arr'\nimport browser from '@interactjs/utils/browser'\nimport clone from '@interactjs/utils/clone'\nimport { getElementRect, matchesUpTo, nodeContains, trySelector } from '@interactjs/utils/domUtils'\nimport events from '@interactjs/utils/events'\nimport extend from '@interactjs/utils/extend'\nimport * as is from '@interactjs/utils/is'\nimport normalizeListeners from '@interactjs/utils/normalizeListeners'\nimport { getWindow } from '@interactjs/utils/window'\nimport { ActionDefaults, Defaults, Options } from './defaultOptions'\nimport Eventable from './Eventable'\nimport { Actions, isNonNativeEvent } from './scope'\n\ntype IgnoreValue = string | Interact.Element | boolean\n\n/** */\nexport class Interactable implements Partial {\n protected get _defaults (): Defaults {\n return {\n base: {},\n perAction: {},\n actions: {} as ActionDefaults,\n }\n }\n\n readonly options!: Required\n readonly _actions: Actions\n readonly target: Interact.Target\n readonly events = new Eventable()\n readonly _context: Document | Interact.Element\n readonly _win: Window\n readonly _doc: Document\n\n /** */\n constructor (target: Interact.Target, options: any, defaultContext: Document | Interact.Element) {\n this._actions = options.actions\n this.target = target\n this._context = options.context || defaultContext\n this._win = getWindow(trySelector(target) ? this._context : target)\n this._doc = this._win.document\n\n this.set(options)\n }\n\n setOnEvents (actionName: Interact.ActionName, phases: NonNullable) {\n if (is.func(phases.onstart)) { this.on(`${actionName}start`, phases.onstart) }\n if (is.func(phases.onmove)) { this.on(`${actionName}move`, phases.onmove) }\n if (is.func(phases.onend)) { this.on(`${actionName}end`, phases.onend) }\n if (is.func(phases.oninertiastart)) { this.on(`${actionName}inertiastart`, phases.oninertiastart) }\n\n return this\n }\n\n updatePerActionListeners (actionName: Interact.ActionName, prev: Interact.Listeners, cur: Interact.Listeners) {\n if (is.array(prev) || is.object(prev)) {\n this.off(actionName, prev)\n }\n\n if (is.array(cur) || is.object(cur)) {\n this.on(actionName, cur)\n }\n }\n\n setPerAction (actionName: Interact.ActionName, options: Interact.OrBoolean) {\n const defaults = this._defaults\n\n // for all the default per-action options\n for (const optionName_ in options) {\n const optionName = optionName_ as keyof Interact.PerActionDefaults\n const actionOptions = this.options[actionName]\n const optionValue: any = options[optionName]\n\n // remove old event listeners and add new ones\n if (optionName === 'listeners') {\n this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue as Interact.Listeners)\n }\n\n // if the option value is an array\n if (is.array(optionValue)) {\n (actionOptions[optionName] as any) = arr.from(optionValue)\n }\n // if the option value is an object\n else if (is.plainObject(optionValue)) {\n // copy the object\n (actionOptions[optionName] as any) = extend(\n actionOptions[optionName] || {} as any,\n clone(optionValue))\n\n // set anabled field to true if it exists in the defaults\n if (is.object(defaults.perAction[optionName]) && 'enabled' in (defaults.perAction[optionName] as any)) {\n (actionOptions[optionName] as any).enabled = optionValue.enabled !== false\n }\n }\n // if the option value is a boolean and the default is an object\n else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) {\n (actionOptions[optionName] as any).enabled = optionValue\n }\n // if it's anything else, do a plain assignment\n else {\n (actionOptions[optionName] as any) = optionValue\n }\n }\n }\n\n /**\n * The default function to get an Interactables bounding rect. Can be\n * overridden using {@link Interactable.rectChecker}.\n *\n * @param {Element} [element] The element to measure.\n * @return {object} The object's bounding rectangle.\n */\n getRect (element: Interact.Element) {\n element = element || (is.element(this.target)\n ? this.target\n : null)\n\n if (is.string(this.target)) {\n element = element || this._context.querySelector(this.target)\n }\n\n return getElementRect(element)\n }\n\n /**\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n * @param {function} [checker] A function which returns this Interactable's\n * bounding rectangle. See {@link Interactable.getRect}\n * @return {function | object} The checker function or this Interactable\n */\n rectChecker (checker: (element: Interact.Element) => any) {\n if (is.func(checker)) {\n this.getRect = checker\n\n return this\n }\n\n if (checker === null) {\n delete this.getRect\n\n return this\n }\n\n return this.getRect\n }\n\n _backCompatOption (optionName: keyof Interact.Options, newValue: any) {\n if (trySelector(newValue) || is.object(newValue)) {\n (this.options[optionName] as any) = newValue\n\n for (const action in this._actions.map) {\n (this.options[action][optionName] as any) = newValue\n }\n\n return this\n }\n\n return this.options[optionName]\n }\n\n /**\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n * @param {Element | object | string} [origin] An HTML or SVG Element whose\n * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n * or any CSS selector\n *\n * @return {object} The current origin or this Interactable\n */\n origin (newValue: any) {\n return this._backCompatOption('origin', newValue)\n }\n\n /**\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n * @param {string} [newValue] Use 'client' if you will be scrolling while\n * interacting; Use 'page' if you want autoScroll to work\n * @return {string | object} The current deltaSource or this Interactable\n */\n deltaSource (newValue?: string) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue\n\n return this\n }\n\n return this.options.deltaSource\n }\n\n /**\n * Gets the selector context Node of the Interactable. The default is\n * `window.document`.\n *\n * @return {Node} The context Node of this Interactable\n */\n context () {\n return this._context\n }\n\n inContext (element: Document | Node) {\n return (this._context === element.ownerDocument ||\n nodeContains(this._context, element))\n }\n\n testIgnoreAllow (\n this: Interactable,\n options: { ignoreFrom?: IgnoreValue, allowFrom?: IgnoreValue },\n targetNode: Node,\n eventTarget: Interact.EventTarget,\n ) {\n return (!this.testIgnore(options.ignoreFrom, targetNode, eventTarget) &&\n this.testAllow(options.allowFrom, targetNode, eventTarget))\n }\n\n testAllow (\n this: Interactable,\n allowFrom: IgnoreValue,\n targetNode: Node,\n element: Interact.EventTarget,\n ) {\n if (!allowFrom) { return true }\n\n if (!is.element(element)) { return false }\n\n if (is.string(allowFrom)) {\n return matchesUpTo(element, allowFrom, targetNode)\n }\n else if (is.element(allowFrom)) {\n return nodeContains(allowFrom, element)\n }\n\n return false\n }\n\n testIgnore (\n this: Interactable,\n ignoreFrom: IgnoreValue,\n targetNode: Node,\n element: Interact.EventTarget,\n ) {\n if (!ignoreFrom || !is.element(element)) { return false }\n\n if (is.string(ignoreFrom)) {\n return matchesUpTo(element, ignoreFrom, targetNode)\n }\n else if (is.element(ignoreFrom)) {\n return nodeContains(ignoreFrom, element)\n }\n\n return false\n }\n\n /**\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n * Interactable\n * @return {Interactable} this Interactable\n */\n fire (iEvent: object) {\n this.events.fire(iEvent)\n\n return this\n }\n\n _onOff (method: 'on' | 'off', typeArg: Interact.EventTypes, listenerArg?: Interact.ListenersArg | null, options?: any) {\n if (is.object(typeArg) && !is.array(typeArg)) {\n options = listenerArg\n listenerArg = null\n }\n\n const addRemove = method === 'on' ? 'add' : 'remove'\n const listeners = normalizeListeners(typeArg, listenerArg)\n\n for (let type in listeners) {\n if (type === 'wheel') { type = browser.wheelEvent }\n\n for (const listener of listeners[type]) {\n // if it is an action event type\n if (isNonNativeEvent(type, this._actions)) {\n this.events[method](type, listener)\n }\n // delegated event\n else if (is.string(this.target)) {\n events[`${addRemove}Delegate` as 'addDelegate' | 'removeDelegate'](this.target, this._context, type, listener, options)\n }\n // remove listener from this Interactable's element\n else {\n (events[addRemove] as typeof events.remove)(this.target, type, listener, options)\n }\n }\n }\n\n return this\n }\n\n /**\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} types The types of events to listen\n * for\n * @param {function | array | object} [listener] The event listener function(s)\n * @param {object | boolean} [options] options object or useCapture flag for\n * addEventListener\n * @return {Interactable} This Interactable\n */\n on (types: Interact.EventTypes, listener?: Interact.ListenersArg, options?: any) {\n return this._onOff('on', types, listener, options)\n }\n\n /**\n * Removes an InteractEvent, pointerEvent or DOM event listener.\n *\n * @param {string | array | object} types The types of events that were\n * listened for\n * @param {function | array | object} [listener] The event listener function(s)\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {Interactable} This Interactable\n */\n off (types: string | string[] | Interact.EventTypes, listener?: Interact.ListenersArg, options?: any) {\n return this._onOff('off', types, listener, options)\n }\n\n /**\n * Reset the options of this Interactable\n *\n * @param {object} options The new settings to apply\n * @return {object} This Interactable\n */\n set (options: Interact.OptionsArg) {\n const defaults = this._defaults\n\n if (!is.object(options)) {\n options = {}\n }\n\n (this.options as Required) = clone(defaults.base) as Required\n\n for (const actionName_ in this._actions.methodDict) {\n const actionName = actionName_ as Interact.ActionName\n const methodName = this._actions.methodDict[actionName]\n\n this.options[actionName] = {}\n this.setPerAction(actionName, extend(extend({}, defaults.perAction), defaults.actions[actionName]))\n\n this[methodName](options[actionName])\n }\n\n for (const setting in options) {\n if (is.func(this[setting])) {\n this[setting](options[setting])\n }\n }\n\n return this\n }\n\n /**\n * Remove this interactable from the list of interactables and remove it's\n * action capabilities and event listeners\n *\n * @return {interact}\n */\n unset () {\n events.remove(this.target as Node, 'all')\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type]\n\n if (delegated.selectors[0] === this.target &&\n delegated.contexts[0] === this._context) {\n delegated.selectors.splice(0, 1)\n delegated.contexts.splice(0, 1)\n delegated.listeners.splice(0, 1)\n }\n\n events.remove(this._context, type, events.delegateListener)\n events.remove(this._context, type, events.delegateUseCapture, true)\n }\n }\n else {\n events.remove(this.target as Node, 'all')\n }\n }\n}\n\nexport default Interactable\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/Interactable.spec.d.ts b/@interactjs/core/Interactable.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/core/Interactable.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/core/InteractableSet.d.ts b/@interactjs/core/InteractableSet.d.ts new file mode 100644 index 000000000..b677fffc8 --- /dev/null +++ b/@interactjs/core/InteractableSet.d.ts @@ -0,0 +1,26 @@ +declare module '@interactjs/core/scope' { + interface SignalArgs { + 'interactable:new': { + interactable: Interact.Interactable; + target: Interact.Target; + options: Interact.OptionsArg; + win: Window; + }; + } +} +interface InteractableScopeProp { + context: Document | Interact.Element; + interactable: Interact.Interactable; +} +export default class InteractableSet { + protected scope: Interact.Scope; + list: Interact.Interactable[]; + selectorMap: { + [selector: string]: InteractableScopeProp[]; + }; + constructor(scope: Interact.Scope); + new(target: Interact.Target, options?: any): Interact.Interactable; + get(target: Interact.Target, options?: Interact.Options): import("@interactjs/core/Interactable").Interactable; + forEachMatch(node: Node, callback: (interactable: Interact.Interactable) => T): T | void; +} +export {}; diff --git a/@interactjs/core/InteractableSet.js b/@interactjs/core/InteractableSet.js new file mode 100644 index 000000000..183070975 --- /dev/null +++ b/@interactjs/core/InteractableSet.js @@ -0,0 +1,102 @@ +import * as arr from "../utils/arr.js"; +import * as domUtils from "../utils/domUtils.js"; +import extend from "../utils/extend.js"; +import * as is from "../utils/is.js"; +export default class InteractableSet { + // all set interactables + constructor(scope) { + this.scope = scope; + this.list = []; + this.selectorMap = {}; + scope.addListeners({ + 'interactable:unset': ({ + interactable + }) => { + const { + target, + _context: context + } = interactable; + const targetMappings = is.string(target) ? this.selectorMap[target] : target[this.scope.id]; + const targetIndex = targetMappings.findIndex(m => m.context === context); + + if (targetMappings[targetIndex]) { + // Destroying mappingInfo's context and interactable + targetMappings[targetIndex].context = null; + targetMappings[targetIndex].interactable = null; + } + + targetMappings.splice(targetIndex, 1); + } + }); + } + + new(target, options) { + options = extend(options || {}, { + actions: this.scope.actions + }); + const interactable = new this.scope.Interactable(target, options, this.scope.document); + const mappingInfo = { + context: interactable._context, + interactable + }; + this.scope.addDocument(interactable._doc); + this.list.push(interactable); + + if (is.string(target)) { + if (!this.selectorMap[target]) { + this.selectorMap[target] = []; + } + + this.selectorMap[target].push(mappingInfo); + } else { + if (!interactable.target[this.scope.id]) { + Object.defineProperty(target, this.scope.id, { + value: [], + configurable: true + }); + } + + target[this.scope.id].push(mappingInfo); + } + + this.scope.fire('interactable:new', { + target, + options, + interactable, + win: this.scope._win + }); + return interactable; + } + + get(target, options) { + const context = options && options.context || this.scope.document; + const isSelector = is.string(target); + const targetMappings = isSelector ? this.selectorMap[target] : target[this.scope.id]; + + if (!targetMappings) { + return null; + } + + const found = arr.find(targetMappings, m => m.context === context && (isSelector || m.interactable.inContext(target))); + return found && found.interactable; + } + + forEachMatch(node, callback) { + for (const interactable of this.list) { + let ret; + + if ((is.string(interactable.target) // target is a selector and the element matches + ? is.element(node) && domUtils.matchesSelector(node, interactable.target) : // target is the element + node === interactable.target) && // the element is in context + interactable.inContext(node)) { + ret = callback(interactable); + } + + if (ret !== undefined) { + return ret; + } + } + } + +} +//# sourceMappingURL=InteractableSet.js.map \ No newline at end of file diff --git a/@interactjs/core/InteractableSet.js.map b/@interactjs/core/InteractableSet.js.map new file mode 100644 index 000000000..dd361794d --- /dev/null +++ b/@interactjs/core/InteractableSet.js.map @@ -0,0 +1,61 @@ +{ + "version": 3, + "sources": [ + "InteractableSet.ts" + ], + "names": [ + "arr", + "domUtils", + "extend", + "is", + "InteractableSet", + "constructor", + "scope", + "list", + "selectorMap", + "addListeners", + "interactable", + "target", + "_context", + "context", + "targetMappings", + "string", + "id", + "targetIndex", + "findIndex", + "m", + "splice", + "new", + "options", + "actions", + "Interactable", + "document", + "mappingInfo", + "addDocument", + "_doc", + "push", + "Object", + "defineProperty", + "value", + "configurable", + "fire", + "win", + "_win", + "get", + "isSelector", + "found", + "find", + "inContext", + "forEachMatch", + "node", + "callback", + "ret", + "element", + "matchesSelector", + "undefined" + ], + "mappings": "AAAA,OAAO,KAAKA,GAAZ,MAAqB,iBAArB;AACA,OAAO,KAAKC,QAAZ,MAA0B,sBAA1B;AACA,OAAOC,MAAP,MAAmB,oBAAnB;AACA,OAAO,KAAKC,EAAZ,MAAoB,gBAApB;AAkBA,eAAe,MAAMC,eAAN,CAAsB;AACnC;AAOAC,EAAAA,WAAW,CAAYC,KAAZ,EAAmC;AAAA,SAAvBA,KAAuB,GAAvBA,KAAuB;AAAA,SAN9CC,IAM8C,GANd,EAMc;AAAA,SAJ9CC,WAI8C,GAF1C,EAE0C;AAC5CF,IAAAA,KAAK,CAACG,YAAN,CAAmB;AACjB,4BAAsB,CAAC;AAAEC,QAAAA;AAAF,OAAD,KAAsB;AAC1C,cAAM;AAAEC,UAAAA,MAAF;AAAUC,UAAAA,QAAQ,EAAEC;AAApB,YAAgCH,YAAtC;AACA,cAAMI,cAAuC,GAAGX,EAAE,CAACY,MAAH,CAAUJ,MAAV,IAC5C,KAAKH,WAAL,CAAiBG,MAAjB,CAD4C,GAE3CA,MAAD,CAAgB,KAAKL,KAAL,CAAWU,EAA3B,CAFJ;AAIA,cAAMC,WAAW,GAAGH,cAAc,CAACI,SAAf,CAAyBC,CAAC,IAAIA,CAAC,CAACN,OAAF,KAAcA,OAA5C,CAApB;;AACA,YAAIC,cAAc,CAACG,WAAD,CAAlB,EAAiC;AACjC;AACEH,UAAAA,cAAc,CAACG,WAAD,CAAd,CAA4BJ,OAA5B,GAAsC,IAAtC;AACAC,UAAAA,cAAc,CAACG,WAAD,CAAd,CAA4BP,YAA5B,GAA2C,IAA3C;AACD;;AACDI,QAAAA,cAAc,CAACM,MAAf,CAAsBH,WAAtB,EAAmC,CAAnC;AACD;AAdgB,KAAnB;AAgBD;;AAEDI,EAAAA,GAAG,CAAEV,MAAF,EAA2BW,OAA3B,EAAiE;AAClEA,IAAAA,OAAO,GAAGpB,MAAM,CAACoB,OAAO,IAAI,EAAZ,EAAgB;AAC9BC,MAAAA,OAAO,EAAE,KAAKjB,KAAL,CAAWiB;AADU,KAAhB,CAAhB;AAGA,UAAMb,YAAY,GAAG,IAAI,KAAKJ,KAAL,CAAWkB,YAAf,CAA4Bb,MAA5B,EAAoCW,OAApC,EAA6C,KAAKhB,KAAL,CAAWmB,QAAxD,CAArB;AACA,UAAMC,WAAW,GAAG;AAAEb,MAAAA,OAAO,EAAEH,YAAY,CAACE,QAAxB;AAAkCF,MAAAA;AAAlC,KAApB;AAEA,SAAKJ,KAAL,CAAWqB,WAAX,CAAuBjB,YAAY,CAACkB,IAApC;AACA,SAAKrB,IAAL,CAAUsB,IAAV,CAAenB,YAAf;;AAEA,QAAIP,EAAE,CAACY,MAAH,CAAUJ,MAAV,CAAJ,EAAuB;AACrB,UAAI,CAAC,KAAKH,WAAL,CAAiBG,MAAjB,CAAL,EAA+B;AAAE,aAAKH,WAAL,CAAiBG,MAAjB,IAA2B,EAA3B;AAA+B;;AAChE,WAAKH,WAAL,CAAiBG,MAAjB,EAAyBkB,IAAzB,CAA8BH,WAA9B;AACD,KAHD,MAGO;AACL,UAAI,CAAGhB,YAAY,CAACC,MAAd,CAA6B,KAAKL,KAAL,CAAWU,EAAxC,CAAN,EAAoD;AAClDc,QAAAA,MAAM,CAACC,cAAP,CAAsBpB,MAAtB,EAA8B,KAAKL,KAAL,CAAWU,EAAzC,EAA6C;AAC3CgB,UAAAA,KAAK,EAAE,EADoC;AAE3CC,UAAAA,YAAY,EAAE;AAF6B,SAA7C;AAID;;AAEAtB,MAAAA,MAAD,CAAgB,KAAKL,KAAL,CAAWU,EAA3B,EAA+Ba,IAA/B,CAAoCH,WAApC;AACD;;AAED,SAAKpB,KAAL,CAAW4B,IAAX,CAAgB,kBAAhB,EAAoC;AAClCvB,MAAAA,MADkC;AAElCW,MAAAA,OAFkC;AAGlCZ,MAAAA,YAHkC;AAIlCyB,MAAAA,GAAG,EAAE,KAAK7B,KAAL,CAAW8B;AAJkB,KAApC;AAOA,WAAO1B,YAAP;AACD;;AAED2B,EAAAA,GAAG,CAAE1B,MAAF,EAA2BW,OAA3B,EAAuD;AACxD,UAAMT,OAAO,GAAIS,OAAO,IAAIA,OAAO,CAACT,OAApB,IAAgC,KAAKP,KAAL,CAAWmB,QAA3D;AACA,UAAMa,UAAU,GAAGnC,EAAE,CAACY,MAAH,CAAUJ,MAAV,CAAnB;AACA,UAAMG,cAAuC,GAAGwB,UAAU,GACtD,KAAK9B,WAAL,CAAiBG,MAAjB,CADsD,GAErDA,MAAD,CAAgB,KAAKL,KAAL,CAAWU,EAA3B,CAFJ;;AAIA,QAAI,CAACF,cAAL,EAAqB;AAAE,aAAO,IAAP;AAAa;;AAEpC,UAAMyB,KAAK,GAAGvC,GAAG,CAACwC,IAAJ,CACZ1B,cADY,EAEZK,CAAC,IAAIA,CAAC,CAACN,OAAF,KAAcA,OAAd,KACFyB,UAAU,IAAInB,CAAC,CAACT,YAAF,CAAe+B,SAAf,CAAyB9B,MAAzB,CADZ,CAFO,CAAd;AAKA,WAAO4B,KAAK,IAAIA,KAAK,CAAC7B,YAAtB;AACD;;AAEDgC,EAAAA,YAAY,CAAKC,IAAL,EAAiBC,QAAjB,EAAiF;AAC3F,SAAK,MAAMlC,YAAX,IAA2B,KAAKH,IAAhC,EAAsC;AACpC,UAAIsC,GAAJ;;AAEA,UAAI,CAAC1C,EAAE,CAACY,MAAH,CAAUL,YAAY,CAACC,MAAvB,EACL;AADK,QAEAR,EAAE,CAAC2C,OAAH,CAAWH,IAAX,KAAoB1C,QAAQ,CAAC8C,eAAT,CAAyBJ,IAAzB,EAA+BjC,YAAY,CAACC,MAA5C,CAFpB,GAGH;AACEgC,MAAAA,IAAI,KAAKjC,YAAY,CAACC,MAJtB,KAKF;AACCD,MAAAA,YAAY,CAAC+B,SAAb,CAAuBE,IAAvB,CANH,EAMkC;AAChCE,QAAAA,GAAG,GAAGD,QAAQ,CAAClC,YAAD,CAAd;AACD;;AAED,UAAImC,GAAG,KAAKG,SAAZ,EAAuB;AACrB,eAAOH,GAAP;AACD;AACF;AACF;;AAhGkC", + "sourcesContent": [ + "import * as arr from '@interactjs/utils/arr'\nimport * as domUtils from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport * as is from '@interactjs/utils/is'\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactable:new': {\n interactable: Interact.Interactable\n target: Interact.Target\n options: Interact.OptionsArg\n win: Window\n }\n }\n}\n\ninterface InteractableScopeProp {\n context: Document | Interact.Element\n interactable: Interact.Interactable\n}\n\nexport default class InteractableSet {\n // all set interactables\n list: Interact.Interactable[] = []\n\n selectorMap: {\n [selector: string]: InteractableScopeProp[]\n } = {}\n\n constructor (protected scope: Interact.Scope) {\n scope.addListeners({\n 'interactable:unset': ({ interactable }) => {\n const { target, _context: context } = interactable\n const targetMappings: InteractableScopeProp[] = is.string(target)\n ? this.selectorMap[target]\n : (target as any)[this.scope.id]\n\n const targetIndex = targetMappings.findIndex(m => m.context === context)\n if (targetMappings[targetIndex]) {\n // Destroying mappingInfo's context and interactable\n targetMappings[targetIndex].context = null\n targetMappings[targetIndex].interactable = null\n }\n targetMappings.splice(targetIndex, 1)\n },\n })\n }\n\n new (target: Interact.Target, options?: any): Interact.Interactable {\n options = extend(options || {}, {\n actions: this.scope.actions,\n })\n const interactable = new this.scope.Interactable(target, options, this.scope.document)\n const mappingInfo = { context: interactable._context, interactable }\n\n this.scope.addDocument(interactable._doc)\n this.list.push(interactable)\n\n if (is.string(target)) {\n if (!this.selectorMap[target]) { this.selectorMap[target] = [] }\n this.selectorMap[target].push(mappingInfo)\n } else {\n if (!((interactable.target as any)[this.scope.id])) {\n Object.defineProperty(target, this.scope.id, {\n value: [],\n configurable: true,\n })\n }\n\n (target as any)[this.scope.id].push(mappingInfo)\n }\n\n this.scope.fire('interactable:new', {\n target,\n options,\n interactable,\n win: this.scope._win,\n })\n\n return interactable\n }\n\n get (target: Interact.Target, options?: Interact.Options) {\n const context = (options && options.context) || this.scope.document\n const isSelector = is.string(target)\n const targetMappings: InteractableScopeProp[] = isSelector\n ? this.selectorMap[target as string]\n : (target as any)[this.scope.id]\n\n if (!targetMappings) { return null }\n\n const found = arr.find(\n targetMappings,\n m => m.context === context &&\n (isSelector || m.interactable.inContext(target as any)))\n\n return found && found.interactable\n }\n\n forEachMatch (node: Node, callback: (interactable: Interact.Interactable) => T): T | void {\n for (const interactable of this.list) {\n let ret\n\n if ((is.string(interactable.target)\n // target is a selector and the element matches\n ? (is.element(node) && domUtils.matchesSelector(node, interactable.target))\n // target is the element\n : node === interactable.target) &&\n // the element is in context\n (interactable.inContext(node))) {\n ret = callback(interactable)\n }\n\n if (ret !== undefined) {\n return ret\n }\n }\n }\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/InteractableSet.min.js b/@interactjs/core/InteractableSet.min.js new file mode 100644 index 000000000..fef6118f3 --- /dev/null +++ b/@interactjs/core/InteractableSet.min.js @@ -0,0 +1,2 @@ +import*as t from"../utils/arr.min.js";import*as e from"../utils/domUtils.min.js";import s from"../utils/extend.min.js";import*as i from"../utils/is.min.js";export default class n{constructor(t){this.scope=t,this.list=[],this.selectorMap={},t.addListeners({"interactable:unset":({interactable:t})=>{const{target:e,_context:s}=t,n=i.string(e)?this.selectorMap[e]:e[this.scope.id],o=n.findIndex(t=>t.context===s);n[o]&&(n[o].context=null,n[o].interactable=null),n.splice(o,1)}})}new(t,e){e=s(e||{},{actions:this.scope.actions});const n=new this.scope.Interactable(t,e,this.scope.document),o={context:n._context,interactable:n};return this.scope.addDocument(n._doc),this.list.push(n),i.string(t)?(this.selectorMap[t]||(this.selectorMap[t]=[]),this.selectorMap[t].push(o)):(n.target[this.scope.id]||Object.defineProperty(t,this.scope.id,{value:[],configurable:!0}),t[this.scope.id].push(o)),this.scope.fire("interactable:new",{target:t,options:e,interactable:n,win:this.scope._win}),n}get(e,s){const n=s&&s.context||this.scope.document,o=i.string(e),c=o?this.selectorMap[e]:e[this.scope.id];if(!c)return null;const r=t.find(c,t=>t.context===n&&(o||t.interactable.inContext(e)));return r&&r.interactable}forEachMatch(t,s){for(const n of this.list){let o;if((i.string(n.target)?i.element(t)&&e.matchesSelector(t,n.target):t===n.target)&&n.inContext(t)&&(o=s(n)),void 0!==o)return o}}} +//# sourceMappingURL=InteractableSet.min.js.map \ No newline at end of file diff --git a/@interactjs/core/InteractableSet.min.js.map b/@interactjs/core/InteractableSet.min.js.map new file mode 100644 index 000000000..86e0ea5af --- /dev/null +++ b/@interactjs/core/InteractableSet.min.js.map @@ -0,0 +1,63 @@ +{ + "version": 3, + "sources": [ + "InteractableSet.ts" + ], + "names": [ + "arr", + "domUtils", + "extend", + "is", + "InteractableSet", + "constructor", + "scope", + "this", + "list", + "selectorMap", + "addListeners", + "interactable:unset", + "interactable", + "target", + "_context", + "context", + "targetMappings", + "string", + "id", + "targetIndex", + "findIndex", + "m", + "splice", + "new", + "options", + "actions", + "Interactable", + "document", + "mappingInfo", + "addDocument", + "_doc", + "push", + "Object", + "defineProperty", + "value", + "configurable", + "fire", + "win", + "_win", + "get", + "isSelector", + "found", + "find", + "inContext", + "forEachMatch", + "node", + "callback", + "ret", + "element", + "matchesSelector", + "undefined" + ], + "mappings": "UAAYA,MAAS,gCACTC,MAAc,kCACnBC,MAAY,mCACPC,MAAQ,oCAkBL,MAAMC,EAQnBC,YAAuBC,GAAuBC,KAAvBD,MAAAA,EAAuBC,KAN9CC,KAAgC,GAMcD,KAJ9CE,YAEI,GAGFH,EAAMI,aAAa,CACjBC,qBAAsB,EAAGC,aAAAA,MACvB,MAAMC,OAAEA,EAAQC,SAAUC,GAAYH,EAChCI,EAA0Cb,EAAGc,OAAOJ,GACtDN,KAAKE,YAAYI,GAChBA,EAAeN,KAAKD,MAAMY,IAEzBC,EAAcH,EAAeI,UAAUC,GAAKA,EAAEN,UAAYA,GAC5DC,EAAeG,KAEjBH,EAAeG,GAAaJ,QAAU,KACtCC,EAAeG,GAAaP,aAAe,MAE7CI,EAAeM,OAAOH,EAAa,MAKzCI,IAAKV,EAAyBW,GAC5BA,EAAUtB,EAAOsB,GAAW,GAAI,CAC9BC,QAASlB,KAAKD,MAAMmB,UAEtB,MAAMb,EAAe,IAAIL,KAAKD,MAAMoB,aAAab,EAAQW,EAASjB,KAAKD,MAAMqB,UACvEC,EAAc,CAAEb,QAASH,EAAaE,SAAUF,aAAAA,GA0BtD,OAxBAL,KAAKD,MAAMuB,YAAYjB,EAAakB,MACpCvB,KAAKC,KAAKuB,KAAKnB,GAEXT,EAAGc,OAAOJ,IACPN,KAAKE,YAAYI,KAAWN,KAAKE,YAAYI,GAAU,IAC5DN,KAAKE,YAAYI,GAAQkB,KAAKH,KAEvBhB,EAAaC,OAAeN,KAAKD,MAAMY,KAC5Cc,OAAOC,eAAepB,EAAQN,KAAKD,MAAMY,GAAI,CAC3CgB,MAAO,GACPC,cAAc,IAIjBtB,EAAeN,KAAKD,MAAMY,IAAIa,KAAKH,IAGtCrB,KAAKD,MAAM8B,KAAK,mBAAoB,CAClCvB,OAAAA,EACAW,QAAAA,EACAZ,aAAAA,EACAyB,IAAK9B,KAAKD,MAAMgC,OAGX1B,EAGT2B,IAAK1B,EAAyBW,GAC5B,MAAMT,EAAWS,GAAWA,EAAQT,SAAYR,KAAKD,MAAMqB,SACrDa,EAAarC,EAAGc,OAAOJ,GACvBG,EAA0CwB,EAC5CjC,KAAKE,YAAYI,GAChBA,EAAeN,KAAKD,MAAMY,IAE/B,IAAKF,EAAkB,OAAO,KAE9B,MAAMyB,EAAQzC,EAAI0C,KAChB1B,EACAK,GAAKA,EAAEN,UAAYA,IAChByB,GAAcnB,EAAET,aAAa+B,UAAU9B,KAE5C,OAAO4B,GAASA,EAAM7B,aAGxBgC,aAAiBC,EAAYC,GAC3B,IAAK,MAAMlC,KAAgBL,KAAKC,KAAM,CACpC,IAAIuC,EAYJ,IAVK5C,EAAGc,OAAOL,EAAaC,QAEvBV,EAAG6C,QAAQH,IAAS5C,EAASgD,gBAAgBJ,EAAMjC,EAAaC,QAEjEgC,IAASjC,EAAaC,SAEvBD,EAAa+B,UAAUE,KACxBE,EAAMD,EAASlC,SAGLsC,IAARH,EACF,OAAOA", + "sourcesContent": [ + "import * as arr from '@interactjs/utils/arr'\nimport * as domUtils from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport * as is from '@interactjs/utils/is'\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactable:new': {\n interactable: Interact.Interactable\n target: Interact.Target\n options: Interact.OptionsArg\n win: Window\n }\n }\n}\n\ninterface InteractableScopeProp {\n context: Document | Interact.Element\n interactable: Interact.Interactable\n}\n\nexport default class InteractableSet {\n // all set interactables\n list: Interact.Interactable[] = []\n\n selectorMap: {\n [selector: string]: InteractableScopeProp[]\n } = {}\n\n constructor (protected scope: Interact.Scope) {\n scope.addListeners({\n 'interactable:unset': ({ interactable }) => {\n const { target, _context: context } = interactable\n const targetMappings: InteractableScopeProp[] = is.string(target)\n ? this.selectorMap[target]\n : (target as any)[this.scope.id]\n\n const targetIndex = targetMappings.findIndex(m => m.context === context)\n if (targetMappings[targetIndex]) {\n // Destroying mappingInfo's context and interactable\n targetMappings[targetIndex].context = null\n targetMappings[targetIndex].interactable = null\n }\n targetMappings.splice(targetIndex, 1)\n },\n })\n }\n\n new (target: Interact.Target, options?: any): Interact.Interactable {\n options = extend(options || {}, {\n actions: this.scope.actions,\n })\n const interactable = new this.scope.Interactable(target, options, this.scope.document)\n const mappingInfo = { context: interactable._context, interactable }\n\n this.scope.addDocument(interactable._doc)\n this.list.push(interactable)\n\n if (is.string(target)) {\n if (!this.selectorMap[target]) { this.selectorMap[target] = [] }\n this.selectorMap[target].push(mappingInfo)\n } else {\n if (!((interactable.target as any)[this.scope.id])) {\n Object.defineProperty(target, this.scope.id, {\n value: [],\n configurable: true,\n })\n }\n\n (target as any)[this.scope.id].push(mappingInfo)\n }\n\n this.scope.fire('interactable:new', {\n target,\n options,\n interactable,\n win: this.scope._win,\n })\n\n return interactable\n }\n\n get (target: Interact.Target, options?: Interact.Options) {\n const context = (options && options.context) || this.scope.document\n const isSelector = is.string(target)\n const targetMappings: InteractableScopeProp[] = isSelector\n ? this.selectorMap[target as string]\n : (target as any)[this.scope.id]\n\n if (!targetMappings) { return null }\n\n const found = arr.find(\n targetMappings,\n m => m.context === context &&\n (isSelector || m.interactable.inContext(target as any)))\n\n return found && found.interactable\n }\n\n forEachMatch (node: Node, callback: (interactable: Interact.Interactable) => T): T | void {\n for (const interactable of this.list) {\n let ret\n\n if ((is.string(interactable.target)\n // target is a selector and the element matches\n ? (is.element(node) && domUtils.matchesSelector(node, interactable.target))\n // target is the element\n : node === interactable.target) &&\n // the element is in context\n (interactable.inContext(node))) {\n ret = callback(interactable)\n }\n\n if (ret !== undefined) {\n return ret\n }\n }\n }\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/Interaction.d.ts b/@interactjs/core/Interaction.d.ts new file mode 100644 index 000000000..c77a61c99 --- /dev/null +++ b/@interactjs/core/Interaction.d.ts @@ -0,0 +1,220 @@ +import * as utils from '@interactjs/utils/index'; +import Interactable from './Interactable'; +import InteractEvent, { EventPhase } from './InteractEvent'; +import PointerInfo from './PointerInfo'; +import { ActionName } from './scope'; +export interface ActionProps { + name: T; + axis?: 'x' | 'y' | 'xy'; + edges?: Interact.EdgeOptions; +} +export interface StartAction extends ActionProps { + name: ActionName; +} +export declare enum _ProxyValues { + interactable = "", + element = "", + prepared = "", + pointerIsDown = "", + pointerWasMoved = "", + _proxy = "" +} +export declare enum _ProxyMethods { + start = "", + move = "", + end = "", + stop = "", + interacting = "" +} +export declare type PointerArgProps = { + pointer: Interact.PointerType; + event: Interact.PointerEventType; + eventTarget: Interact.EventTarget; + pointerIndex: number; + pointerInfo: PointerInfo; + interaction: Interaction; +} & T; +export interface DoPhaseArg { + event: Interact.PointerEventType; + phase: EventPhase; + interaction: Interaction; + iEvent: InteractEvent; + preEnd?: boolean; + type?: string; +} +export declare type DoAnyPhaseArg = DoPhaseArg; +declare module '@interactjs/core/scope' { + interface SignalArgs { + 'interactions:new': { + interaction: Interaction; + }; + 'interactions:down': PointerArgProps<{ + type: 'down'; + }>; + 'interactions:move': PointerArgProps<{ + type: 'move'; + dx: number; + dy: number; + duplicate: boolean; + }>; + 'interactions:up': PointerArgProps<{ + type: 'up'; + curEventTarget: EventTarget; + }>; + 'interactions:cancel': SignalArgs['interactions:up'] & { + type: 'cancel'; + curEventTarget: EventTarget; + }; + 'interactions:update-pointer': PointerArgProps<{ + down: boolean; + }>; + 'interactions:remove-pointer': PointerArgProps; + 'interactions:blur': any; + 'interactions:before-action-start': Omit; + 'interactions:action-start': DoAnyPhaseArg; + 'interactions:after-action-start': DoAnyPhaseArg; + 'interactions:before-action-move': Omit; + 'interactions:action-move': DoAnyPhaseArg; + 'interactions:after-action-move': DoAnyPhaseArg; + 'interactions:before-action-end': Omit; + 'interactions:action-end': DoAnyPhaseArg; + 'interactions:after-action-end': DoAnyPhaseArg; + 'interactions:stop': { + interaction: Interaction; + }; + } +} +export declare type InteractionProxy = Pick, keyof typeof _ProxyValues | keyof typeof _ProxyMethods>; +export declare class Interaction { + interactable: Interactable; + element: Interact.Element; + rect: Interact.FullRect; + _rects?: { + start: Interact.FullRect; + corrected: Interact.FullRect; + previous: Interact.FullRect; + delta: Interact.FullRect; + }; + edges: Interact.EdgeOptions; + _scopeFire: Interact.Scope['fire']; + prepared: ActionProps; + pointerType: string; + pointers: PointerInfo[]; + downEvent: Interact.PointerEventType; + downPointer: Interact.PointerType; + _latestPointer: { + pointer: Interact.PointerType; + event: Interact.PointerEventType; + eventTarget: Node; + }; + prevEvent: InteractEvent; + pointerIsDown: boolean; + pointerWasMoved: boolean; + _interacting: boolean; + _ending: boolean; + _stopped: boolean; + _proxy: InteractionProxy; + simulation: any; + readonly pointerMoveTolerance: number; + /** + * @alias Interaction.prototype.move + */ + doMove: (this: typeof utils) => any; + coords: Interact.CoordsSet; + readonly _id: number; + /** */ + constructor({ pointerType, scopeFire }: { + pointerType?: string; + scopeFire: Interact.Scope['fire']; + }); + pointerDown(pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget): void; + /** + * ```js + * interact(target) + * .draggable({ + * // disable the default drag start by down->move + * manualStart: true + * }) + * // start dragging after the user holds the pointer down + * .on('hold', function (event) { + * var interaction = event.interaction + * + * if (!interaction.interacting()) { + * interaction.start({ name: 'drag' }, + * event.interactable, + * event.currentTarget) + * } + * }) + * ``` + * + * Start an action with the given Interactable and Element as tartgets. The + * action must be enabled for the target Interactable and an appropriate + * number of pointers must be held down - 1 for drag/resize, 2 for gesture. + * + * Use it with `interactable.able({ manualStart: false })` to always + * [start actions manually](https://github.com/taye/interact.js/issues/114) + * + * @param {object} action The action to be performed - drag, resize, etc. + * @param {Interactable} target The Interactable to target + * @param {Element} element The DOM Element to target + * @return {object} interact + */ + start(action: StartAction, interactable: Interactable, element: Interact.Element): any; + pointerMove(pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget): void; + /** + * ```js + * interact(target) + * .draggable(true) + * .on('dragmove', function (event) { + * if (someCondition) { + * // change the snap settings + * event.interactable.draggable({ snap: { targets: [] }}) + * // fire another move event with re-calculated snap + * event.interaction.move() + * } + * }) + * ``` + * + * Force a move of the current action at the same coordinates. Useful if + * snap/restrict has been changed and you want a movement with the new + * settings. + */ + move(signalArg?: any): void; + pointerUp(pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget, curEventTarget: Interact.EventTarget): void; + documentBlur(event: any): void; + /** + * ```js + * interact(target) + * .draggable(true) + * .on('move', function (event) { + * if (event.pageX > 1000) { + * // end the current action + * event.interaction.end() + * // stop all further listeners from being called + * event.stopImmediatePropagation() + * } + * }) + * ``` + * + * @param {PointerEvent} [event] + */ + end(event?: Interact.PointerEventType): void; + currentAction(): T; + interacting(): boolean; + /** */ + stop(): void; + getPointerIndex(pointer: any): number; + getPointerInfo(pointer: any): PointerInfo; + updatePointer(pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget, down?: boolean): number; + removePointer(pointer: Interact.PointerType, event: Interact.PointerEventType): void; + _updateLatestPointer(pointer: any, event: any, eventTarget: any): void; + destroy(): void; + _createPreparedEvent

(event: Interact.PointerEventType, phase: P, preEnd?: boolean, type?: string): InteractEvent; + _fireEvent

(iEvent: InteractEvent): void; + _doPhase

(signalArg: Omit, 'iEvent'> & { + iEvent?: InteractEvent; + }): boolean; + _now(): number; +} +export default Interaction; +export { PointerInfo }; diff --git a/@interactjs/core/Interaction.js b/@interactjs/core/Interaction.js new file mode 100644 index 000000000..6067bf871 --- /dev/null +++ b/@interactjs/core/Interaction.js @@ -0,0 +1,514 @@ +import * as utils from "../utils/index.js"; +import InteractEvent from "./InteractEvent.js"; +import PointerInfo from "./PointerInfo.js"; +export let _ProxyValues; + +(function (_ProxyValues) { + _ProxyValues["interactable"] = ""; + _ProxyValues["element"] = ""; + _ProxyValues["prepared"] = ""; + _ProxyValues["pointerIsDown"] = ""; + _ProxyValues["pointerWasMoved"] = ""; + _ProxyValues["_proxy"] = ""; +})(_ProxyValues || (_ProxyValues = {})); + +export let _ProxyMethods; + +(function (_ProxyMethods) { + _ProxyMethods["start"] = ""; + _ProxyMethods["move"] = ""; + _ProxyMethods["end"] = ""; + _ProxyMethods["stop"] = ""; + _ProxyMethods["interacting"] = ""; +})(_ProxyMethods || (_ProxyMethods = {})); + +let idCounter = 0; +export class Interaction { + // current interactable being interacted with + // the target element of the interactable + // action that's ready to be fired on next move event + // keep track of added pointers + // pointerdown/mousedown/touchstart event + // previous action event + get pointerMoveTolerance() { + return 1; + } + /** + * @alias Interaction.prototype.move + */ + + + /** */ + constructor({ + pointerType, + scopeFire + }) { + this.interactable = null; + this.element = null; + this.rect = void 0; + this._rects = void 0; + this.edges = void 0; + this._scopeFire = void 0; + this.prepared = { + name: null, + axis: null, + edges: null + }; + this.pointerType = void 0; + this.pointers = []; + this.downEvent = null; + this.downPointer = {}; + this._latestPointer = { + pointer: null, + event: null, + eventTarget: null + }; + this.prevEvent = null; + this.pointerIsDown = false; + this.pointerWasMoved = false; + this._interacting = false; + this._ending = false; + this._stopped = true; + this._proxy = null; + this.simulation = null; + this.doMove = utils.warnOnce(function (signalArg) { + this.move(signalArg); + }, 'The interaction.doMove() method has been renamed to interaction.move()'); + this.coords = { + // Starting InteractEvent pointer coordinates + start: utils.pointer.newCoords(), + // Previous native pointer move event coordinates + prev: utils.pointer.newCoords(), + // current native pointer move event coordinates + cur: utils.pointer.newCoords(), + // Change in coordinates and time of the pointer + delta: utils.pointer.newCoords(), + // pointer velocity + velocity: utils.pointer.newCoords() + }; + this._id = idCounter++; + this._scopeFire = scopeFire; + this.pointerType = pointerType; + const that = this; + this._proxy = {}; + + for (const key in _ProxyValues) { + Object.defineProperty(this._proxy, key, { + get() { + return that[key]; + } + + }); + } + + for (const key in _ProxyMethods) { + Object.defineProperty(this._proxy, key, { + value: (...args) => that[key](...args) + }); + } + + this._scopeFire('interactions:new', { + interaction: this + }); + } + + pointerDown(pointer, event, eventTarget) { + const pointerIndex = this.updatePointer(pointer, event, eventTarget, true); + const pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:down', { + pointer, + event, + eventTarget, + pointerIndex, + pointerInfo, + type: 'down', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable({ + * // disable the default drag start by down->move + * manualStart: true + * }) + * // start dragging after the user holds the pointer down + * .on('hold', function (event) { + * var interaction = event.interaction + * + * if (!interaction.interacting()) { + * interaction.start({ name: 'drag' }, + * event.interactable, + * event.currentTarget) + * } + * }) + * ``` + * + * Start an action with the given Interactable and Element as tartgets. The + * action must be enabled for the target Interactable and an appropriate + * number of pointers must be held down - 1 for drag/resize, 2 for gesture. + * + * Use it with `interactable.able({ manualStart: false })` to always + * [start actions manually](https://github.com/taye/interact.js/issues/114) + * + * @param {object} action The action to be performed - drag, resize, etc. + * @param {Interactable} target The Interactable to target + * @param {Element} element The DOM Element to target + * @return {object} interact + */ + + + start(action, interactable, element) { + if (this.interacting() || !this.pointerIsDown || this.pointers.length < (action.name === 'gesture' ? 2 : 1) || !interactable.options[action.name].enabled) { + return false; + } + + utils.copyAction(this.prepared, action); + this.interactable = interactable; + this.element = element; + this.rect = interactable.getRect(element); + this.edges = this.prepared.edges ? utils.extend({}, this.prepared.edges) : { + left: true, + right: true, + top: true, + bottom: true + }; + this._stopped = false; + this._interacting = this._doPhase({ + interaction: this, + event: this.downEvent, + phase: 'start' + }) && !this._stopped; + return this._interacting; + } + + pointerMove(pointer, event, eventTarget) { + if (!this.simulation && !(this.modification && this.modification.endResult)) { + this.updatePointer(pointer, event, eventTarget, false); + } + + const duplicateMove = this.coords.cur.page.x === this.coords.prev.page.x && this.coords.cur.page.y === this.coords.prev.page.y && this.coords.cur.client.x === this.coords.prev.client.x && this.coords.cur.client.y === this.coords.prev.client.y; + let dx; + let dy; // register movement greater than pointerMoveTolerance + + if (this.pointerIsDown && !this.pointerWasMoved) { + dx = this.coords.cur.client.x - this.coords.start.client.x; + dy = this.coords.cur.client.y - this.coords.start.client.y; + this.pointerWasMoved = utils.hypot(dx, dy) > this.pointerMoveTolerance; + } + + const pointerIndex = this.getPointerIndex(pointer); + const signalArg = { + pointer, + pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event, + type: 'move', + eventTarget, + dx, + dy, + duplicate: duplicateMove, + interaction: this + }; + + if (!duplicateMove) { + // set pointer coordinate, time changes and velocity + utils.pointer.setCoordVelocity(this.coords.velocity, this.coords.delta); + } + + this._scopeFire('interactions:move', signalArg); + + if (!duplicateMove && !this.simulation) { + // if interacting, fire an 'action-move' signal etc + if (this.interacting()) { + signalArg.type = null; + this.move(signalArg); + } + + if (this.pointerWasMoved) { + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + } + } + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('dragmove', function (event) { + * if (someCondition) { + * // change the snap settings + * event.interactable.draggable({ snap: { targets: [] }}) + * // fire another move event with re-calculated snap + * event.interaction.move() + * } + * }) + * ``` + * + * Force a move of the current action at the same coordinates. Useful if + * snap/restrict has been changed and you want a movement with the new + * settings. + */ + + + move(signalArg) { + if (!signalArg || !signalArg.event) { + utils.pointer.setZeroCoords(this.coords.delta); + } + + signalArg = utils.extend({ + pointer: this._latestPointer.pointer, + event: this._latestPointer.event, + eventTarget: this._latestPointer.eventTarget, + interaction: this + }, signalArg || {}); + signalArg.phase = 'move'; + + this._doPhase(signalArg); + } // End interact move events and stop auto-scroll unless simulation is running + + + pointerUp(pointer, event, eventTarget, curEventTarget) { + let pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + pointerIndex = this.updatePointer(pointer, event, eventTarget, false); + } + + const type = /cancel$/i.test(event.type) ? 'cancel' : 'up'; + + this._scopeFire(`interactions:${type}`, { + pointer, + pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event, + eventTarget, + type: type, + curEventTarget, + interaction: this + }); + + if (!this.simulation) { + this.end(event); + } + + this.pointerIsDown = false; + this.removePointer(pointer, event); + } + + documentBlur(event) { + this.end(event); + + this._scopeFire('interactions:blur', { + event, + type: 'blur', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('move', function (event) { + * if (event.pageX > 1000) { + * // end the current action + * event.interaction.end() + * // stop all further listeners from being called + * event.stopImmediatePropagation() + * } + * }) + * ``` + * + * @param {PointerEvent} [event] + */ + + + end(event) { + this._ending = true; + event = event || this._latestPointer.event; + let endPhaseResult; + + if (this.interacting()) { + endPhaseResult = this._doPhase({ + event, + interaction: this, + phase: 'end' + }); + } + + this._ending = false; + + if (endPhaseResult === true) { + this.stop(); + } + } + + currentAction() { + return this._interacting ? this.prepared.name : null; + } + + interacting() { + return this._interacting; + } + /** */ + + + stop() { + this._scopeFire('interactions:stop', { + interaction: this + }); + + this.interactable = this.element = null; + this._interacting = false; + this._stopped = true; + this.prepared.name = this.prevEvent = null; + } + + getPointerIndex(pointer) { + const pointerId = utils.pointer.getPointerId(pointer); // mouse and pen interactions may have only one pointer + + return this.pointerType === 'mouse' || this.pointerType === 'pen' ? this.pointers.length - 1 : utils.arr.findIndex(this.pointers, curPointer => curPointer.id === pointerId); + } + + getPointerInfo(pointer) { + return this.pointers[this.getPointerIndex(pointer)]; + } + + updatePointer(pointer, event, eventTarget, down) { + const id = utils.pointer.getPointerId(pointer); + let pointerIndex = this.getPointerIndex(pointer); + let pointerInfo = this.pointers[pointerIndex]; + down = down === false ? false : down || /(down|start)$/i.test(event.type); + + if (!pointerInfo) { + pointerInfo = new PointerInfo(id, pointer, event, null, null); + pointerIndex = this.pointers.length; + this.pointers.push(pointerInfo); + } else { + pointerInfo.pointer = pointer; + } + + utils.pointer.setCoords(this.coords.cur, this.pointers.map(p => p.pointer), this._now()); + utils.pointer.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur); + + if (down) { + this.pointerIsDown = true; + pointerInfo.downTime = this.coords.cur.timeStamp; + pointerInfo.downTarget = eventTarget; + utils.pointer.pointerExtend(this.downPointer, pointer); + + if (!this.interacting()) { + utils.pointer.copyCoords(this.coords.start, this.coords.cur); + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + this.downEvent = event; + this.pointerWasMoved = false; + } + } + + this._updateLatestPointer(pointer, event, eventTarget); + + this._scopeFire('interactions:update-pointer', { + pointer, + event, + eventTarget, + down, + pointerInfo, + pointerIndex, + interaction: this + }); + + return pointerIndex; + } + + removePointer(pointer, event) { + const pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + return; + } + + const pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:remove-pointer', { + pointer, + event, + eventTarget: null, + pointerIndex, + pointerInfo, + interaction: this + }); + + this.pointers.splice(pointerIndex, 1); + } + + _updateLatestPointer(pointer, event, eventTarget) { + this._latestPointer.pointer = pointer; + this._latestPointer.event = event; + this._latestPointer.eventTarget = eventTarget; + } + + destroy() { + this._latestPointer.pointer = null; + this._latestPointer.event = null; + this._latestPointer.eventTarget = null; + } + + _createPreparedEvent(event, phase, preEnd, type) { + return new InteractEvent(this, event, this.prepared.name, phase, this.element, preEnd, type); + } + + _fireEvent(iEvent) { + this.interactable.fire(iEvent); + + if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) { + this.prevEvent = iEvent; + } + } + + _doPhase(signalArg) { + const { + event, + phase, + preEnd, + type + } = signalArg; + const { + rect + } = this; + + if (rect && phase === 'move') { + // update the rect changes due to pointer move + utils.rect.addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource]); + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + + const beforeResult = this._scopeFire(`interactions:before-action-${phase}`, signalArg); + + if (beforeResult === false) { + return false; + } + + const iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type); + + this._scopeFire(`interactions:action-${phase}`, signalArg); + + if (phase === 'start') { + this.prevEvent = iEvent; + } + + this._fireEvent(iEvent); + + this._scopeFire(`interactions:after-action-${phase}`, signalArg); + + return true; + } + + _now() { + return Date.now(); + } + +} +export default Interaction; +export { PointerInfo }; +//# sourceMappingURL=Interaction.js.map \ No newline at end of file diff --git a/@interactjs/core/Interaction.js.map b/@interactjs/core/Interaction.js.map new file mode 100644 index 000000000..9835414c1 --- /dev/null +++ b/@interactjs/core/Interaction.js.map @@ -0,0 +1,144 @@ +{ + "version": 3, + "sources": [ + "Interaction.ts" + ], + "names": [ + "utils", + "InteractEvent", + "PointerInfo", + "_ProxyValues", + "_ProxyMethods", + "idCounter", + "Interaction", + "pointerMoveTolerance", + "constructor", + "pointerType", + "scopeFire", + "interactable", + "element", + "rect", + "_rects", + "edges", + "_scopeFire", + "prepared", + "name", + "axis", + "pointers", + "downEvent", + "downPointer", + "_latestPointer", + "pointer", + "event", + "eventTarget", + "prevEvent", + "pointerIsDown", + "pointerWasMoved", + "_interacting", + "_ending", + "_stopped", + "_proxy", + "simulation", + "doMove", + "warnOnce", + "signalArg", + "move", + "coords", + "start", + "newCoords", + "prev", + "cur", + "delta", + "velocity", + "_id", + "that", + "key", + "Object", + "defineProperty", + "get", + "value", + "args", + "interaction", + "pointerDown", + "pointerIndex", + "updatePointer", + "pointerInfo", + "type", + "action", + "interacting", + "length", + "options", + "enabled", + "copyAction", + "getRect", + "extend", + "left", + "right", + "top", + "bottom", + "_doPhase", + "phase", + "pointerMove", + "modification", + "endResult", + "duplicateMove", + "page", + "x", + "y", + "client", + "dx", + "dy", + "hypot", + "getPointerIndex", + "duplicate", + "setCoordVelocity", + "copyCoords", + "setZeroCoords", + "pointerUp", + "curEventTarget", + "test", + "end", + "removePointer", + "documentBlur", + "endPhaseResult", + "stop", + "currentAction", + "pointerId", + "getPointerId", + "arr", + "findIndex", + "curPointer", + "id", + "getPointerInfo", + "down", + "push", + "setCoords", + "map", + "p", + "_now", + "setCoordDeltas", + "downTime", + "timeStamp", + "downTarget", + "pointerExtend", + "_updateLatestPointer", + "splice", + "destroy", + "_createPreparedEvent", + "preEnd", + "_fireEvent", + "iEvent", + "fire", + "addEdges", + "deltaSource", + "width", + "height", + "beforeResult", + "Date", + "now" + ], + "mappings": "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", + "sourcesContent": [ + "import * as utils from '@interactjs/utils/index'\nimport Interactable from './Interactable'\nimport InteractEvent, { EventPhase } from './InteractEvent'\nimport PointerInfo from './PointerInfo'\nimport { ActionName } from './scope'\n\nexport interface ActionProps {\n name: T\n axis?: 'x' | 'y' | 'xy'\n edges?: Interact.EdgeOptions\n}\n\nexport interface StartAction extends ActionProps {\n name: ActionName\n}\n\nexport enum _ProxyValues {\n interactable = '',\n element = '',\n prepared = '',\n pointerIsDown = '',\n pointerWasMoved = '',\n _proxy = ''\n}\n\nexport enum _ProxyMethods {\n start = '',\n move = '',\n end = '',\n stop = '',\n interacting = ''\n}\n\nexport type PointerArgProps = {\n pointer: Interact.PointerType\n event: Interact.PointerEventType\n eventTarget: Interact.EventTarget\n pointerIndex: number\n pointerInfo: PointerInfo\n interaction: Interaction\n} & T\n\nexport interface DoPhaseArg {\n event: Interact.PointerEventType\n phase: EventPhase\n interaction: Interaction\n iEvent: InteractEvent\n preEnd?: boolean\n type?: string\n}\n\nexport type DoAnyPhaseArg = DoPhaseArg\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:new': { interaction: Interaction }\n 'interactions:down': PointerArgProps<{\n type: 'down'\n }>\n 'interactions:move': PointerArgProps<{\n type: 'move'\n dx: number\n dy: number\n duplicate: boolean\n }>\n 'interactions:up': PointerArgProps<{\n type: 'up'\n curEventTarget: EventTarget\n }>\n 'interactions:cancel': SignalArgs['interactions:up'] & {\n type: 'cancel'\n curEventTarget: EventTarget\n }\n 'interactions:update-pointer': PointerArgProps<{\n down: boolean\n }>\n 'interactions:remove-pointer': PointerArgProps\n 'interactions:blur'\n 'interactions:before-action-start': Omit\n 'interactions:action-start': DoAnyPhaseArg\n 'interactions:after-action-start': DoAnyPhaseArg\n 'interactions:before-action-move': Omit\n 'interactions:action-move': DoAnyPhaseArg\n 'interactions:after-action-move': DoAnyPhaseArg\n 'interactions:before-action-end': Omit\n 'interactions:action-end': DoAnyPhaseArg\n 'interactions:after-action-end': DoAnyPhaseArg\n 'interactions:stop': { interaction: Interaction }\n }\n}\n\nexport type InteractionProxy = Pick<\nInteraction,\nkeyof typeof _ProxyValues | keyof typeof _ProxyMethods\n>\n\nlet idCounter = 0\n\nexport class Interaction {\n // current interactable being interacted with\n interactable: Interactable = null\n\n // the target element of the interactable\n element: Interact.Element = null\n rect: Interact.FullRect\n _rects?: {\n start: Interact.FullRect\n corrected: Interact.FullRect\n previous: Interact.FullRect\n delta: Interact.FullRect\n }\n edges: Interact.EdgeOptions\n\n _scopeFire: Interact.Scope['fire']\n\n // action that's ready to be fired on next move event\n prepared: ActionProps = {\n name : null,\n axis : null,\n edges: null,\n }\n\n pointerType: string\n\n // keep track of added pointers\n pointers: PointerInfo[] = []\n\n // pointerdown/mousedown/touchstart event\n downEvent: Interact.PointerEventType = null\n\n downPointer: Interact.PointerType = {} as Interact.PointerType\n\n _latestPointer: {\n pointer: Interact.PointerType\n event: Interact.PointerEventType\n eventTarget: Node\n } = {\n pointer: null,\n event: null,\n eventTarget: null,\n }\n\n // previous action event\n prevEvent: InteractEvent = null\n\n pointerIsDown = false\n pointerWasMoved = false\n _interacting = false\n _ending = false\n _stopped = true\n _proxy: InteractionProxy = null\n\n simulation = null\n\n get pointerMoveTolerance () {\n return 1\n }\n\n /**\n * @alias Interaction.prototype.move\n */\n doMove = utils.warnOnce(\n function (this: Interaction, signalArg: any) {\n this.move(signalArg)\n },\n 'The interaction.doMove() method has been renamed to interaction.move()')\n\n coords: Interact.CoordsSet = {\n // Starting InteractEvent pointer coordinates\n start: utils.pointer.newCoords(),\n // Previous native pointer move event coordinates\n prev: utils.pointer.newCoords(),\n // current native pointer move event coordinates\n cur: utils.pointer.newCoords(),\n // Change in coordinates and time of the pointer\n delta: utils.pointer.newCoords(),\n // pointer velocity\n velocity: utils.pointer.newCoords(),\n }\n\n readonly _id: number = idCounter++\n\n /** */\n constructor ({ pointerType, scopeFire }: {\n pointerType?: string\n scopeFire: Interact.Scope['fire']\n }) {\n this._scopeFire = scopeFire\n this.pointerType = pointerType\n\n const that = this\n\n this._proxy = {} as InteractionProxy\n\n for (const key in _ProxyValues) {\n Object.defineProperty(this._proxy, key, {\n get () { return that[key] },\n })\n }\n\n for (const key in _ProxyMethods) {\n Object.defineProperty(this._proxy, key, {\n value: (...args) => that[key](...args),\n })\n }\n\n this._scopeFire('interactions:new', { interaction: this })\n }\n\n pointerDown (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, eventTarget, true)\n const pointerInfo = this.pointers[pointerIndex]\n\n this._scopeFire('interactions:down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n pointerInfo,\n type: 'down',\n interaction: this,\n })\n }\n\n /**\n * ```js\n * interact(target)\n * .draggable({\n * // disable the default drag start by down->move\n * manualStart: true\n * })\n * // start dragging after the user holds the pointer down\n * .on('hold', function (event) {\n * var interaction = event.interaction\n *\n * if (!interaction.interacting()) {\n * interaction.start({ name: 'drag' },\n * event.interactable,\n * event.currentTarget)\n * }\n * })\n * ```\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate\n * number of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n * @param {object} action The action to be performed - drag, resize, etc.\n * @param {Interactable} target The Interactable to target\n * @param {Element} element The DOM Element to target\n * @return {object} interact\n */\n start (action: StartAction, interactable: Interactable, element: Interact.Element) {\n if (this.interacting() ||\n !this.pointerIsDown ||\n this.pointers.length < (action.name === 'gesture' ? 2 : 1) ||\n !interactable.options[action.name].enabled) {\n return false\n }\n\n utils.copyAction(this.prepared, action)\n\n this.interactable = interactable\n this.element = element\n this.rect = interactable.getRect(element)\n this.edges = this.prepared.edges\n ? utils.extend({}, this.prepared.edges)\n : { left: true, right: true, top: true, bottom: true }\n this._stopped = false\n this._interacting = this._doPhase({\n interaction: this,\n event: this.downEvent,\n phase: 'start',\n }) && !this._stopped\n\n return this._interacting\n }\n\n pointerMove (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget) {\n if (!this.simulation && !(this.modification && this.modification.endResult)) {\n this.updatePointer(pointer, event, eventTarget, false)\n }\n\n const duplicateMove = (this.coords.cur.page.x === this.coords.prev.page.x &&\n this.coords.cur.page.y === this.coords.prev.page.y &&\n this.coords.cur.client.x === this.coords.prev.client.x &&\n this.coords.cur.client.y === this.coords.prev.client.y)\n\n let dx\n let dy\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.coords.cur.client.x - this.coords.start.client.x\n dy = this.coords.cur.client.y - this.coords.start.client.y\n\n this.pointerWasMoved = utils.hypot(dx, dy) > this.pointerMoveTolerance\n }\n\n const pointerIndex = this.getPointerIndex(pointer)\n const signalArg = {\n pointer,\n pointerIndex,\n pointerInfo: this.pointers[pointerIndex],\n event,\n type: 'move' as const,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n }\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and velocity\n utils.pointer.setCoordVelocity(this.coords.velocity, this.coords.delta)\n }\n\n this._scopeFire('interactions:move', signalArg)\n\n if (!duplicateMove && !this.simulation) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n signalArg.type = null\n this.move(signalArg)\n }\n\n if (this.pointerWasMoved) {\n utils.pointer.copyCoords(this.coords.prev, this.coords.cur)\n }\n }\n }\n\n /**\n * ```js\n * interact(target)\n * .draggable(true)\n * .on('dragmove', function (event) {\n * if (someCondition) {\n * // change the snap settings\n * event.interactable.draggable({ snap: { targets: [] }})\n * // fire another move event with re-calculated snap\n * event.interaction.move()\n * }\n * })\n * ```\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n */\n move (signalArg?) {\n if (!signalArg || !signalArg.event) {\n utils.pointer.setZeroCoords(this.coords.delta)\n }\n\n signalArg = utils.extend({\n pointer: this._latestPointer.pointer,\n event: this._latestPointer.event,\n eventTarget: this._latestPointer.eventTarget,\n interaction: this,\n }, signalArg || {})\n\n signalArg.phase = 'move'\n\n this._doPhase(signalArg)\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget, curEventTarget: Interact.EventTarget) {\n let pointerIndex = this.getPointerIndex(pointer)\n\n if (pointerIndex === -1) {\n pointerIndex = this.updatePointer(pointer, event, eventTarget, false)\n }\n\n const type = /cancel$/i.test(event.type) ? 'cancel' : 'up'\n\n this._scopeFire(`interactions:${type}` as 'interactions:up' | 'interactions:cancel', {\n pointer,\n pointerIndex,\n pointerInfo: this.pointers[pointerIndex],\n event,\n eventTarget,\n type: type as any,\n curEventTarget,\n interaction: this,\n })\n\n if (!this.simulation) {\n this.end(event)\n }\n\n this.pointerIsDown = false\n this.removePointer(pointer, event)\n }\n\n documentBlur (event) {\n this.end(event)\n this._scopeFire('interactions:blur', { event, type: 'blur', interaction: this })\n }\n\n /**\n * ```js\n * interact(target)\n * .draggable(true)\n * .on('move', function (event) {\n * if (event.pageX > 1000) {\n * // end the current action\n * event.interaction.end()\n * // stop all further listeners from being called\n * event.stopImmediatePropagation()\n * }\n * })\n * ```\n *\n * @param {PointerEvent} [event]\n */\n end (event?: Interact.PointerEventType) {\n this._ending = true\n event = event || this._latestPointer.event\n let endPhaseResult\n\n if (this.interacting()) {\n endPhaseResult = this._doPhase({\n event,\n interaction: this,\n phase: 'end',\n })\n }\n\n this._ending = false\n\n if (endPhaseResult === true) {\n this.stop()\n }\n }\n\n currentAction () {\n return this._interacting ? this.prepared.name : null\n }\n\n interacting () {\n return this._interacting\n }\n\n /** */\n stop () {\n this._scopeFire('interactions:stop', { interaction: this })\n\n this.interactable = this.element = null\n\n this._interacting = false\n this._stopped = true\n this.prepared.name = this.prevEvent = null\n }\n\n getPointerIndex (pointer) {\n const pointerId = utils.pointer.getPointerId(pointer)\n\n // mouse and pen interactions may have only one pointer\n return (this.pointerType === 'mouse' || this.pointerType === 'pen')\n ? this.pointers.length - 1\n : utils.arr.findIndex(this.pointers, curPointer => curPointer.id === pointerId)\n }\n\n getPointerInfo (pointer) {\n return this.pointers[this.getPointerIndex(pointer)]\n }\n\n updatePointer (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget, down?: boolean) {\n const id = utils.pointer.getPointerId(pointer)\n let pointerIndex = this.getPointerIndex(pointer)\n let pointerInfo = this.pointers[pointerIndex]\n\n down = down === false\n ? false\n : down || /(down|start)$/i.test(event.type)\n\n if (!pointerInfo) {\n pointerInfo = new PointerInfo(\n id,\n pointer,\n event,\n null,\n null,\n )\n\n pointerIndex = this.pointers.length\n this.pointers.push(pointerInfo)\n }\n else {\n pointerInfo.pointer = pointer\n }\n\n utils.pointer.setCoords(this.coords.cur, this.pointers.map(p => p.pointer), this._now())\n utils.pointer.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur)\n\n if (down) {\n this.pointerIsDown = true\n\n pointerInfo.downTime = this.coords.cur.timeStamp\n pointerInfo.downTarget = eventTarget\n utils.pointer.pointerExtend(this.downPointer, pointer)\n\n if (!this.interacting()) {\n utils.pointer.copyCoords(this.coords.start, this.coords.cur)\n utils.pointer.copyCoords(this.coords.prev, this.coords.cur)\n\n this.downEvent = event\n this.pointerWasMoved = false\n }\n }\n\n this._updateLatestPointer(pointer, event, eventTarget)\n\n this._scopeFire('interactions:update-pointer', {\n pointer,\n event,\n eventTarget,\n down,\n pointerInfo,\n pointerIndex,\n interaction: this,\n })\n\n return pointerIndex\n }\n\n removePointer (pointer: Interact.PointerType, event: Interact.PointerEventType) {\n const pointerIndex = this.getPointerIndex(pointer)\n\n if (pointerIndex === -1) { return }\n\n const pointerInfo = this.pointers[pointerIndex]\n\n this._scopeFire('interactions:remove-pointer', {\n pointer,\n event,\n eventTarget: null,\n pointerIndex,\n pointerInfo,\n interaction: this,\n })\n\n this.pointers.splice(pointerIndex, 1)\n }\n\n _updateLatestPointer (pointer, event, eventTarget) {\n this._latestPointer.pointer = pointer\n this._latestPointer.event = event\n this._latestPointer.eventTarget = eventTarget\n }\n\n destroy () {\n this._latestPointer.pointer = null\n this._latestPointer.event = null\n this._latestPointer.eventTarget = null\n }\n\n _createPreparedEvent

(event: Interact.PointerEventType, phase: P, preEnd?: boolean, type?: string) {\n return new InteractEvent(this, event, this.prepared.name, phase, this.element, preEnd, type)\n }\n\n _fireEvent

(iEvent: InteractEvent) {\n this.interactable.fire(iEvent)\n\n if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) {\n this.prevEvent = iEvent\n }\n }\n\n _doPhase

(signalArg: Omit, 'iEvent'> & { iEvent?: InteractEvent }) {\n const { event, phase, preEnd, type } = signalArg\n const { rect } = this\n\n if (rect && phase === 'move') {\n // update the rect changes due to pointer move\n utils.rect.addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource])\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n }\n\n const beforeResult = this._scopeFire(`interactions:before-action-${phase}` as any, signalArg)\n\n if (beforeResult === false) {\n return false\n }\n\n const iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type)\n\n this._scopeFire(`interactions:action-${phase}` as any, signalArg)\n\n if (phase === 'start') { this.prevEvent = iEvent }\n\n this._fireEvent(iEvent)\n\n this._scopeFire(`interactions:after-action-${phase}` as any, signalArg)\n\n return true\n }\n\n _now () { return Date.now() }\n}\n\nexport default Interaction\nexport { PointerInfo }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/Interaction.min.js b/@interactjs/core/Interaction.min.js new file mode 100644 index 000000000..d01c956ef --- /dev/null +++ b/@interactjs/core/Interaction.min.js @@ -0,0 +1,2 @@ +import*as t from"../utils/index.min.js";import e from"./InteractEvent.min.js";import i from"./PointerInfo.min.js";export let _ProxyValues;(t=>{t.interactable="",t.element="",t.prepared="",t.pointerIsDown="",t.pointerWasMoved="",t._proxy=""})(_ProxyValues||(_ProxyValues={}));export let _ProxyMethods;(t=>{t.start="",t.move="",t.end="",t.stop="",t.interacting=""})(_ProxyMethods||(_ProxyMethods={}));let n=0;export class Interaction{get pointerMoveTolerance(){return 1}constructor({pointerType:e,scopeFire:i}){this.interactable=null,this.element=null,this.rect=void 0,this._rects=void 0,this.edges=void 0,this._scopeFire=void 0,this.prepared={name:null,axis:null,edges:null},this.pointerType=void 0,this.pointers=[],this.downEvent=null,this.downPointer={},this._latestPointer={pointer:null,event:null,eventTarget:null},this.prevEvent=null,this.pointerIsDown=!1,this.pointerWasMoved=!1,this._interacting=!1,this._ending=!1,this._stopped=!0,this._proxy=null,this.simulation=null,this.doMove=t.warnOnce((function(t){this.move(t)}),"The interaction.doMove() method has been renamed to interaction.move()"),this.coords={start:t.pointer.newCoords(),prev:t.pointer.newCoords(),cur:t.pointer.newCoords(),delta:t.pointer.newCoords(),velocity:t.pointer.newCoords()},this._id=n++,this._scopeFire=i,this.pointerType=e;const o=this;this._proxy={};for(const t in _ProxyValues)Object.defineProperty(this._proxy,t,{get:()=>o[t]});for(const t in _ProxyMethods)Object.defineProperty(this._proxy,t,{value(...e){return o[t](...e)}});this._scopeFire("interactions:new",{interaction:this})}pointerDown(t,e,i){const n=this.updatePointer(t,e,i,!0),o=this.pointers[n];this._scopeFire("interactions:down",{pointer:t,event:e,eventTarget:i,pointerIndex:n,pointerInfo:o,type:"down",interaction:this})}start(e,i,n){return!(this.interacting()||!this.pointerIsDown||this.pointers.length<("gesture"===e.name?2:1)||!i.options[e.name].enabled)&&(t.copyAction(this.prepared,e),this.interactable=i,this.element=n,this.rect=i.getRect(n),this.edges=this.prepared.edges?t.extend({},this.prepared.edges):{left:!0,right:!0,top:!0,bottom:!0},this._stopped=!1,this._interacting=this._doPhase({interaction:this,event:this.downEvent,phase:"start"})&&!this._stopped,this._interacting)}pointerMove(e,i,n){this.simulation||this.modification&&this.modification.endResult||this.updatePointer(e,i,n,!1);const o=this.coords.cur.page.x===this.coords.prev.page.x&&this.coords.cur.page.y===this.coords.prev.page.y&&this.coords.cur.client.x===this.coords.prev.client.x&&this.coords.cur.client.y===this.coords.prev.client.y;let r,s;this.pointerIsDown&&!this.pointerWasMoved&&(r=this.coords.cur.client.x-this.coords.start.client.x,s=this.coords.cur.client.y-this.coords.start.client.y,this.pointerWasMoved=t.hypot(r,s)>this.pointerMoveTolerance);const h=this.getPointerIndex(e),p={pointer:e,pointerIndex:h,pointerInfo:this.pointers[h],event:i,type:"move",eventTarget:n,dx:r,dy:s,duplicate:o,interaction:this};o||t.pointer.setCoordVelocity(this.coords.velocity,this.coords.delta),this._scopeFire("interactions:move",p),o||this.simulation||(this.interacting()&&(p.type=null,this.move(p)),this.pointerWasMoved&&t.pointer.copyCoords(this.coords.prev,this.coords.cur))}move(e){e&&e.event||t.pointer.setZeroCoords(this.coords.delta),(e=t.extend({pointer:this._latestPointer.pointer,event:this._latestPointer.event,eventTarget:this._latestPointer.eventTarget,interaction:this},e||{})).phase="move",this._doPhase(e)}pointerUp(t,e,i,n){let o=this.getPointerIndex(t);-1===o&&(o=this.updatePointer(t,e,i,!1));const r=/cancel$/i.test(e.type)?"cancel":"up";this._scopeFire(`interactions:${r}`,{pointer:t,pointerIndex:o,pointerInfo:this.pointers[o],event:e,eventTarget:i,type:r,curEventTarget:n,interaction:this}),this.simulation||this.end(e),this.pointerIsDown=!1,this.removePointer(t,e)}documentBlur(t){this.end(t),this._scopeFire("interactions:blur",{event:t,type:"blur",interaction:this})}end(t){let e;this._ending=!0,t=t||this._latestPointer.event,this.interacting()&&(e=this._doPhase({event:t,interaction:this,phase:"end"})),this._ending=!1,!0===e&&this.stop()}currentAction(){return this._interacting?this.prepared.name:null}interacting(){return this._interacting}stop(){this._scopeFire("interactions:stop",{interaction:this}),this.interactable=this.element=null,this._interacting=!1,this._stopped=!0,this.prepared.name=this.prevEvent=null}getPointerIndex(e){const i=t.pointer.getPointerId(e);return"mouse"===this.pointerType||"pen"===this.pointerType?this.pointers.length-1:t.arr.findIndex(this.pointers,t=>t.id===i)}getPointerInfo(t){return this.pointers[this.getPointerIndex(t)]}updatePointer(e,n,o,r){const s=t.pointer.getPointerId(e);let h=this.getPointerIndex(e),p=this.pointers[h];return r=!1!==r&&(r||/(down|start)$/i.test(n.type)),p?p.pointer=e:(p=new i(s,e,n,null,null),h=this.pointers.length,this.pointers.push(p)),t.pointer.setCoords(this.coords.cur,this.pointers.map(t=>t.pointer),this._now()),t.pointer.setCoordDeltas(this.coords.delta,this.coords.prev,this.coords.cur),r&&(this.pointerIsDown=!0,p.downTime=this.coords.cur.timeStamp,p.downTarget=o,t.pointer.pointerExtend(this.downPointer,e),this.interacting()||(t.pointer.copyCoords(this.coords.start,this.coords.cur),t.pointer.copyCoords(this.coords.prev,this.coords.cur),this.downEvent=n,this.pointerWasMoved=!1)),this._updateLatestPointer(e,n,o),this._scopeFire("interactions:update-pointer",{pointer:e,event:n,eventTarget:o,down:r,pointerInfo:p,pointerIndex:h,interaction:this}),h}removePointer(t,e){const i=this.getPointerIndex(t);if(-1===i)return;const n=this.pointers[i];this._scopeFire("interactions:remove-pointer",{pointer:t,event:e,eventTarget:null,pointerIndex:i,pointerInfo:n,interaction:this}),this.pointers.splice(i,1)}_updateLatestPointer(t,e,i){this._latestPointer.pointer=t,this._latestPointer.event=e,this._latestPointer.eventTarget=i}destroy(){this._latestPointer.pointer=null,this._latestPointer.event=null,this._latestPointer.eventTarget=null}_createPreparedEvent(t,i,n,o){return new e(this,t,this.prepared.name,i,this.element,n,o)}_fireEvent(t){this.interactable.fire(t),(!this.prevEvent||t.timeStamp>=this.prevEvent.timeStamp)&&(this.prevEvent=t)}_doPhase(e){const{event:i,phase:n,preEnd:o,type:r}=e,{rect:s}=this;if(s&&"move"===n&&(t.rect.addEdges(this.edges,s,this.coords.delta[this.interactable.options.deltaSource]),s.width=s.right-s.left,s.height=s.bottom-s.top),!1===this._scopeFire(`interactions:before-action-${n}`,e))return!1;const h=e.iEvent=this._createPreparedEvent(i,n,o,r);return this._scopeFire(`interactions:action-${n}`,e),"start"===n&&(this.prevEvent=h),this._fireEvent(h),this._scopeFire(`interactions:after-action-${n}`,e),!0}_now(){return Date.now()}}export default Interaction;export{i as PointerInfo}; +//# sourceMappingURL=Interaction.min.js.map \ No newline at end of file diff --git a/@interactjs/core/Interaction.min.js.map b/@interactjs/core/Interaction.min.js.map new file mode 100644 index 000000000..89f92e165 --- /dev/null +++ b/@interactjs/core/Interaction.min.js.map @@ -0,0 +1,144 @@ +{ + "version": 3, + "sources": [ + "Interaction.ts" + ], + "names": [ + "utils", + "InteractEvent", + "PointerInfo", + "_ProxyValues", + "_ProxyMethods", + "idCounter", + "Interaction", + "pointerMoveTolerance", + "constructor", + "pointerType", + "scopeFire", + "this", + "interactable", + "element", + "rect", + "_rects", + "edges", + "_scopeFire", + "prepared", + "name", + "axis", + "pointers", + "downEvent", + "downPointer", + "_latestPointer", + "pointer", + "event", + "eventTarget", + "prevEvent", + "pointerIsDown", + "pointerWasMoved", + "_interacting", + "_ending", + "_stopped", + "_proxy", + "simulation", + "doMove", + "warnOnce", + "signalArg", + "move", + "coords", + "start", + "newCoords", + "prev", + "cur", + "delta", + "velocity", + "_id", + "that", + "key", + "Object", + "defineProperty", + "get", + "value", + "args", + "interaction", + "pointerDown", + "pointerIndex", + "updatePointer", + "pointerInfo", + "type", + "action", + "interacting", + "length", + "options", + "enabled", + "copyAction", + "getRect", + "extend", + "left", + "right", + "top", + "bottom", + "_doPhase", + "phase", + "pointerMove", + "modification", + "endResult", + "duplicateMove", + "page", + "x", + "y", + "client", + "dx", + "dy", + "hypot", + "getPointerIndex", + "duplicate", + "setCoordVelocity", + "copyCoords", + "setZeroCoords", + "pointerUp", + "curEventTarget", + "test", + "end", + "removePointer", + "documentBlur", + "endPhaseResult", + "stop", + "currentAction", + "pointerId", + "getPointerId", + "arr", + "findIndex", + "curPointer", + "id", + "getPointerInfo", + "down", + "push", + "setCoords", + "map", + "p", + "_now", + "setCoordDeltas", + "downTime", + "timeStamp", + "downTarget", + "pointerExtend", + "_updateLatestPointer", + "splice", + "destroy", + "_createPreparedEvent", + "preEnd", + "_fireEvent", + "iEvent", + "fire", + "addEdges", + "deltaSource", + "width", + "height", + "Date", + "now" + ], + "mappings": "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", + "sourcesContent": [ + "import * as utils from '@interactjs/utils/index'\nimport Interactable from './Interactable'\nimport InteractEvent, { EventPhase } from './InteractEvent'\nimport PointerInfo from './PointerInfo'\nimport { ActionName } from './scope'\n\nexport interface ActionProps {\n name: T\n axis?: 'x' | 'y' | 'xy'\n edges?: Interact.EdgeOptions\n}\n\nexport interface StartAction extends ActionProps {\n name: ActionName\n}\n\nexport enum _ProxyValues {\n interactable = '',\n element = '',\n prepared = '',\n pointerIsDown = '',\n pointerWasMoved = '',\n _proxy = ''\n}\n\nexport enum _ProxyMethods {\n start = '',\n move = '',\n end = '',\n stop = '',\n interacting = ''\n}\n\nexport type PointerArgProps = {\n pointer: Interact.PointerType\n event: Interact.PointerEventType\n eventTarget: Interact.EventTarget\n pointerIndex: number\n pointerInfo: PointerInfo\n interaction: Interaction\n} & T\n\nexport interface DoPhaseArg {\n event: Interact.PointerEventType\n phase: EventPhase\n interaction: Interaction\n iEvent: InteractEvent\n preEnd?: boolean\n type?: string\n}\n\nexport type DoAnyPhaseArg = DoPhaseArg\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:new': { interaction: Interaction }\n 'interactions:down': PointerArgProps<{\n type: 'down'\n }>\n 'interactions:move': PointerArgProps<{\n type: 'move'\n dx: number\n dy: number\n duplicate: boolean\n }>\n 'interactions:up': PointerArgProps<{\n type: 'up'\n curEventTarget: EventTarget\n }>\n 'interactions:cancel': SignalArgs['interactions:up'] & {\n type: 'cancel'\n curEventTarget: EventTarget\n }\n 'interactions:update-pointer': PointerArgProps<{\n down: boolean\n }>\n 'interactions:remove-pointer': PointerArgProps\n 'interactions:blur'\n 'interactions:before-action-start': Omit\n 'interactions:action-start': DoAnyPhaseArg\n 'interactions:after-action-start': DoAnyPhaseArg\n 'interactions:before-action-move': Omit\n 'interactions:action-move': DoAnyPhaseArg\n 'interactions:after-action-move': DoAnyPhaseArg\n 'interactions:before-action-end': Omit\n 'interactions:action-end': DoAnyPhaseArg\n 'interactions:after-action-end': DoAnyPhaseArg\n 'interactions:stop': { interaction: Interaction }\n }\n}\n\nexport type InteractionProxy = Pick<\nInteraction,\nkeyof typeof _ProxyValues | keyof typeof _ProxyMethods\n>\n\nlet idCounter = 0\n\nexport class Interaction {\n // current interactable being interacted with\n interactable: Interactable = null\n\n // the target element of the interactable\n element: Interact.Element = null\n rect: Interact.FullRect\n _rects?: {\n start: Interact.FullRect\n corrected: Interact.FullRect\n previous: Interact.FullRect\n delta: Interact.FullRect\n }\n edges: Interact.EdgeOptions\n\n _scopeFire: Interact.Scope['fire']\n\n // action that's ready to be fired on next move event\n prepared: ActionProps = {\n name : null,\n axis : null,\n edges: null,\n }\n\n pointerType: string\n\n // keep track of added pointers\n pointers: PointerInfo[] = []\n\n // pointerdown/mousedown/touchstart event\n downEvent: Interact.PointerEventType = null\n\n downPointer: Interact.PointerType = {} as Interact.PointerType\n\n _latestPointer: {\n pointer: Interact.PointerType\n event: Interact.PointerEventType\n eventTarget: Node\n } = {\n pointer: null,\n event: null,\n eventTarget: null,\n }\n\n // previous action event\n prevEvent: InteractEvent = null\n\n pointerIsDown = false\n pointerWasMoved = false\n _interacting = false\n _ending = false\n _stopped = true\n _proxy: InteractionProxy = null\n\n simulation = null\n\n get pointerMoveTolerance () {\n return 1\n }\n\n /**\n * @alias Interaction.prototype.move\n */\n doMove = utils.warnOnce(\n function (this: Interaction, signalArg: any) {\n this.move(signalArg)\n },\n 'The interaction.doMove() method has been renamed to interaction.move()')\n\n coords: Interact.CoordsSet = {\n // Starting InteractEvent pointer coordinates\n start: utils.pointer.newCoords(),\n // Previous native pointer move event coordinates\n prev: utils.pointer.newCoords(),\n // current native pointer move event coordinates\n cur: utils.pointer.newCoords(),\n // Change in coordinates and time of the pointer\n delta: utils.pointer.newCoords(),\n // pointer velocity\n velocity: utils.pointer.newCoords(),\n }\n\n readonly _id: number = idCounter++\n\n /** */\n constructor ({ pointerType, scopeFire }: {\n pointerType?: string\n scopeFire: Interact.Scope['fire']\n }) {\n this._scopeFire = scopeFire\n this.pointerType = pointerType\n\n const that = this\n\n this._proxy = {} as InteractionProxy\n\n for (const key in _ProxyValues) {\n Object.defineProperty(this._proxy, key, {\n get () { return that[key] },\n })\n }\n\n for (const key in _ProxyMethods) {\n Object.defineProperty(this._proxy, key, {\n value: (...args) => that[key](...args),\n })\n }\n\n this._scopeFire('interactions:new', { interaction: this })\n }\n\n pointerDown (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, eventTarget, true)\n const pointerInfo = this.pointers[pointerIndex]\n\n this._scopeFire('interactions:down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n pointerInfo,\n type: 'down',\n interaction: this,\n })\n }\n\n /**\n * ```js\n * interact(target)\n * .draggable({\n * // disable the default drag start by down->move\n * manualStart: true\n * })\n * // start dragging after the user holds the pointer down\n * .on('hold', function (event) {\n * var interaction = event.interaction\n *\n * if (!interaction.interacting()) {\n * interaction.start({ name: 'drag' },\n * event.interactable,\n * event.currentTarget)\n * }\n * })\n * ```\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate\n * number of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n * @param {object} action The action to be performed - drag, resize, etc.\n * @param {Interactable} target The Interactable to target\n * @param {Element} element The DOM Element to target\n * @return {object} interact\n */\n start (action: StartAction, interactable: Interactable, element: Interact.Element) {\n if (this.interacting() ||\n !this.pointerIsDown ||\n this.pointers.length < (action.name === 'gesture' ? 2 : 1) ||\n !interactable.options[action.name].enabled) {\n return false\n }\n\n utils.copyAction(this.prepared, action)\n\n this.interactable = interactable\n this.element = element\n this.rect = interactable.getRect(element)\n this.edges = this.prepared.edges\n ? utils.extend({}, this.prepared.edges)\n : { left: true, right: true, top: true, bottom: true }\n this._stopped = false\n this._interacting = this._doPhase({\n interaction: this,\n event: this.downEvent,\n phase: 'start',\n }) && !this._stopped\n\n return this._interacting\n }\n\n pointerMove (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget) {\n if (!this.simulation && !(this.modification && this.modification.endResult)) {\n this.updatePointer(pointer, event, eventTarget, false)\n }\n\n const duplicateMove = (this.coords.cur.page.x === this.coords.prev.page.x &&\n this.coords.cur.page.y === this.coords.prev.page.y &&\n this.coords.cur.client.x === this.coords.prev.client.x &&\n this.coords.cur.client.y === this.coords.prev.client.y)\n\n let dx\n let dy\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.coords.cur.client.x - this.coords.start.client.x\n dy = this.coords.cur.client.y - this.coords.start.client.y\n\n this.pointerWasMoved = utils.hypot(dx, dy) > this.pointerMoveTolerance\n }\n\n const pointerIndex = this.getPointerIndex(pointer)\n const signalArg = {\n pointer,\n pointerIndex,\n pointerInfo: this.pointers[pointerIndex],\n event,\n type: 'move' as const,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n }\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and velocity\n utils.pointer.setCoordVelocity(this.coords.velocity, this.coords.delta)\n }\n\n this._scopeFire('interactions:move', signalArg)\n\n if (!duplicateMove && !this.simulation) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n signalArg.type = null\n this.move(signalArg)\n }\n\n if (this.pointerWasMoved) {\n utils.pointer.copyCoords(this.coords.prev, this.coords.cur)\n }\n }\n }\n\n /**\n * ```js\n * interact(target)\n * .draggable(true)\n * .on('dragmove', function (event) {\n * if (someCondition) {\n * // change the snap settings\n * event.interactable.draggable({ snap: { targets: [] }})\n * // fire another move event with re-calculated snap\n * event.interaction.move()\n * }\n * })\n * ```\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n */\n move (signalArg?) {\n if (!signalArg || !signalArg.event) {\n utils.pointer.setZeroCoords(this.coords.delta)\n }\n\n signalArg = utils.extend({\n pointer: this._latestPointer.pointer,\n event: this._latestPointer.event,\n eventTarget: this._latestPointer.eventTarget,\n interaction: this,\n }, signalArg || {})\n\n signalArg.phase = 'move'\n\n this._doPhase(signalArg)\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget, curEventTarget: Interact.EventTarget) {\n let pointerIndex = this.getPointerIndex(pointer)\n\n if (pointerIndex === -1) {\n pointerIndex = this.updatePointer(pointer, event, eventTarget, false)\n }\n\n const type = /cancel$/i.test(event.type) ? 'cancel' : 'up'\n\n this._scopeFire(`interactions:${type}` as 'interactions:up' | 'interactions:cancel', {\n pointer,\n pointerIndex,\n pointerInfo: this.pointers[pointerIndex],\n event,\n eventTarget,\n type: type as any,\n curEventTarget,\n interaction: this,\n })\n\n if (!this.simulation) {\n this.end(event)\n }\n\n this.pointerIsDown = false\n this.removePointer(pointer, event)\n }\n\n documentBlur (event) {\n this.end(event)\n this._scopeFire('interactions:blur', { event, type: 'blur', interaction: this })\n }\n\n /**\n * ```js\n * interact(target)\n * .draggable(true)\n * .on('move', function (event) {\n * if (event.pageX > 1000) {\n * // end the current action\n * event.interaction.end()\n * // stop all further listeners from being called\n * event.stopImmediatePropagation()\n * }\n * })\n * ```\n *\n * @param {PointerEvent} [event]\n */\n end (event?: Interact.PointerEventType) {\n this._ending = true\n event = event || this._latestPointer.event\n let endPhaseResult\n\n if (this.interacting()) {\n endPhaseResult = this._doPhase({\n event,\n interaction: this,\n phase: 'end',\n })\n }\n\n this._ending = false\n\n if (endPhaseResult === true) {\n this.stop()\n }\n }\n\n currentAction () {\n return this._interacting ? this.prepared.name : null\n }\n\n interacting () {\n return this._interacting\n }\n\n /** */\n stop () {\n this._scopeFire('interactions:stop', { interaction: this })\n\n this.interactable = this.element = null\n\n this._interacting = false\n this._stopped = true\n this.prepared.name = this.prevEvent = null\n }\n\n getPointerIndex (pointer) {\n const pointerId = utils.pointer.getPointerId(pointer)\n\n // mouse and pen interactions may have only one pointer\n return (this.pointerType === 'mouse' || this.pointerType === 'pen')\n ? this.pointers.length - 1\n : utils.arr.findIndex(this.pointers, curPointer => curPointer.id === pointerId)\n }\n\n getPointerInfo (pointer) {\n return this.pointers[this.getPointerIndex(pointer)]\n }\n\n updatePointer (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget, down?: boolean) {\n const id = utils.pointer.getPointerId(pointer)\n let pointerIndex = this.getPointerIndex(pointer)\n let pointerInfo = this.pointers[pointerIndex]\n\n down = down === false\n ? false\n : down || /(down|start)$/i.test(event.type)\n\n if (!pointerInfo) {\n pointerInfo = new PointerInfo(\n id,\n pointer,\n event,\n null,\n null,\n )\n\n pointerIndex = this.pointers.length\n this.pointers.push(pointerInfo)\n }\n else {\n pointerInfo.pointer = pointer\n }\n\n utils.pointer.setCoords(this.coords.cur, this.pointers.map(p => p.pointer), this._now())\n utils.pointer.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur)\n\n if (down) {\n this.pointerIsDown = true\n\n pointerInfo.downTime = this.coords.cur.timeStamp\n pointerInfo.downTarget = eventTarget\n utils.pointer.pointerExtend(this.downPointer, pointer)\n\n if (!this.interacting()) {\n utils.pointer.copyCoords(this.coords.start, this.coords.cur)\n utils.pointer.copyCoords(this.coords.prev, this.coords.cur)\n\n this.downEvent = event\n this.pointerWasMoved = false\n }\n }\n\n this._updateLatestPointer(pointer, event, eventTarget)\n\n this._scopeFire('interactions:update-pointer', {\n pointer,\n event,\n eventTarget,\n down,\n pointerInfo,\n pointerIndex,\n interaction: this,\n })\n\n return pointerIndex\n }\n\n removePointer (pointer: Interact.PointerType, event: Interact.PointerEventType) {\n const pointerIndex = this.getPointerIndex(pointer)\n\n if (pointerIndex === -1) { return }\n\n const pointerInfo = this.pointers[pointerIndex]\n\n this._scopeFire('interactions:remove-pointer', {\n pointer,\n event,\n eventTarget: null,\n pointerIndex,\n pointerInfo,\n interaction: this,\n })\n\n this.pointers.splice(pointerIndex, 1)\n }\n\n _updateLatestPointer (pointer, event, eventTarget) {\n this._latestPointer.pointer = pointer\n this._latestPointer.event = event\n this._latestPointer.eventTarget = eventTarget\n }\n\n destroy () {\n this._latestPointer.pointer = null\n this._latestPointer.event = null\n this._latestPointer.eventTarget = null\n }\n\n _createPreparedEvent

(event: Interact.PointerEventType, phase: P, preEnd?: boolean, type?: string) {\n return new InteractEvent(this, event, this.prepared.name, phase, this.element, preEnd, type)\n }\n\n _fireEvent

(iEvent: InteractEvent) {\n this.interactable.fire(iEvent)\n\n if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) {\n this.prevEvent = iEvent\n }\n }\n\n _doPhase

(signalArg: Omit, 'iEvent'> & { iEvent?: InteractEvent }) {\n const { event, phase, preEnd, type } = signalArg\n const { rect } = this\n\n if (rect && phase === 'move') {\n // update the rect changes due to pointer move\n utils.rect.addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource])\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n }\n\n const beforeResult = this._scopeFire(`interactions:before-action-${phase}` as any, signalArg)\n\n if (beforeResult === false) {\n return false\n }\n\n const iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type)\n\n this._scopeFire(`interactions:action-${phase}` as any, signalArg)\n\n if (phase === 'start') { this.prevEvent = iEvent }\n\n this._fireEvent(iEvent)\n\n this._scopeFire(`interactions:after-action-${phase}` as any, signalArg)\n\n return true\n }\n\n _now () { return Date.now() }\n}\n\nexport default Interaction\nexport { PointerInfo }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/Interaction.spec.d.ts b/@interactjs/core/Interaction.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/core/Interaction.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/core/LICENSE b/@interactjs/core/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/core/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/core/PointerInfo.d.ts b/@interactjs/core/PointerInfo.d.ts new file mode 100644 index 000000000..41971b49a --- /dev/null +++ b/@interactjs/core/PointerInfo.d.ts @@ -0,0 +1,9 @@ +export declare class PointerInfo { + id: number; + pointer: Interact.PointerType; + event: Interact.PointerEventType; + downTime: number; + downTarget: Interact.EventTarget; + constructor(id: number, pointer: Interact.PointerType, event: Interact.PointerEventType, downTime: number, downTarget: Interact.EventTarget); +} +export default PointerInfo; diff --git a/@interactjs/core/PointerInfo.js b/@interactjs/core/PointerInfo.js new file mode 100644 index 000000000..93f8a8528 --- /dev/null +++ b/@interactjs/core/PointerInfo.js @@ -0,0 +1,13 @@ +/* eslint-disable @typescript-eslint/no-parameter-properties */ +export class PointerInfo { + constructor(id, pointer, event, downTime, downTarget) { + this.id = id; + this.pointer = pointer; + this.event = event; + this.downTime = downTime; + this.downTarget = downTarget; + } + +} +export default PointerInfo; +//# sourceMappingURL=PointerInfo.js.map \ No newline at end of file diff --git a/@interactjs/core/PointerInfo.js.map b/@interactjs/core/PointerInfo.js.map new file mode 100644 index 000000000..88157f826 --- /dev/null +++ b/@interactjs/core/PointerInfo.js.map @@ -0,0 +1,19 @@ +{ + "version": 3, + "sources": [ + "PointerInfo.ts" + ], + "names": [ + "PointerInfo", + "constructor", + "id", + "pointer", + "event", + "downTime", + "downTarget" + ], + "mappings": "AAAA;AACA,OAAO,MAAMA,WAAN,CAAkB;AACvBC,EAAAA,WAAW,CACFC,EADE,EAEFC,OAFE,EAGFC,KAHE,EAIFC,QAJE,EAKFC,UALE,EAMT;AAAA,SALOJ,EAKP,GALOA,EAKP;AAAA,SAJOC,OAIP,GAJOA,OAIP;AAAA,SAHOC,KAGP,GAHOA,KAGP;AAAA,SAFOC,QAEP,GAFOA,QAEP;AAAA,SADOC,UACP,GADOA,UACP;AAAE;;AAPmB;AAUzB,eAAeN,WAAf", + "sourcesContent": [ + "/* eslint-disable @typescript-eslint/no-parameter-properties */\nexport class PointerInfo {\n constructor (\n public id: number,\n public pointer: Interact.PointerType,\n public event: Interact.PointerEventType,\n public downTime: number,\n public downTarget: Interact.EventTarget,\n ) {}\n}\n\nexport default PointerInfo\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/PointerInfo.min.js b/@interactjs/core/PointerInfo.min.js new file mode 100644 index 000000000..0249a41fa --- /dev/null +++ b/@interactjs/core/PointerInfo.min.js @@ -0,0 +1,2 @@ +export class PointerInfo{constructor(t,o,e,i,n){this.id=t,this.pointer=o,this.event=e,this.downTime=i,this.downTarget=n}}export default PointerInfo; +//# sourceMappingURL=PointerInfo.min.js.map \ No newline at end of file diff --git a/@interactjs/core/PointerInfo.min.js.map b/@interactjs/core/PointerInfo.min.js.map new file mode 100644 index 000000000..08d836921 --- /dev/null +++ b/@interactjs/core/PointerInfo.min.js.map @@ -0,0 +1,20 @@ +{ + "version": 3, + "sources": [ + "PointerInfo.ts" + ], + "names": [ + "PointerInfo", + "constructor", + "id", + "pointer", + "event", + "downTime", + "downTarget", + "this" + ], + "mappings": "OACO,MAAMA,YACXC,YACSC,EACAC,EACAC,EACAC,EACAC,GACPC,KALOL,GAAAA,EAKPK,KAJOJ,QAAAA,EAIPI,KAHOH,MAAAA,EAGPG,KAFOF,SAAAA,EAEPE,KADOD,WAAAA,kBAIIN", + "sourcesContent": [ + "/* eslint-disable @typescript-eslint/no-parameter-properties */\nexport class PointerInfo {\n constructor (\n public id: number,\n public pointer: Interact.PointerType,\n public event: Interact.PointerEventType,\n public downTime: number,\n public downTarget: Interact.EventTarget,\n ) {}\n}\n\nexport default PointerInfo\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/defaultOptions.d.ts b/@interactjs/core/defaultOptions.d.ts new file mode 100644 index 000000000..5b72d9909 --- /dev/null +++ b/@interactjs/core/defaultOptions.d.ts @@ -0,0 +1,26 @@ +export interface Defaults { + base: BaseDefaults; + perAction: PerActionDefaults; + actions: ActionDefaults; +} +export interface ActionDefaults { +} +export interface BaseDefaults { + preventDefault?: 'auto' | 'never' | string; + deltaSource?: 'page' | 'client'; + context?: Interact.EventTarget; +} +export interface PerActionDefaults { + enabled?: boolean; + origin?: Interact.Point | string | Interact.Element; + listeners?: Interact.Listeners; + allowFrom?: string | Interact.Element; + ignoreFrom?: string | Interact.Element; +} +export declare type Options = Partial & Partial & { + [P in keyof ActionDefaults]?: Partial; +}; +export interface OptionsArg extends BaseDefaults, Interact.OrBoolean> { +} +export declare const defaults: Defaults; +export default defaults; diff --git a/@interactjs/core/defaultOptions.js b/@interactjs/core/defaultOptions.js new file mode 100644 index 000000000..9f08a0553 --- /dev/null +++ b/@interactjs/core/defaultOptions.js @@ -0,0 +1,19 @@ +// tslint:disable no-empty-interface +// eslint-disable-next-line @typescript-eslint/no-empty-interface +// export interface Options extends BaseDefaults, PerActionDefaults {} +export const defaults = { + base: { + preventDefault: 'auto', + deltaSource: 'page' + }, + perAction: { + enabled: false, + origin: { + x: 0, + y: 0 + } + }, + actions: {} +}; +export default defaults; +//# sourceMappingURL=defaultOptions.js.map \ No newline at end of file diff --git a/@interactjs/core/defaultOptions.js.map b/@interactjs/core/defaultOptions.js.map new file mode 100644 index 000000000..f305e20f6 --- /dev/null +++ b/@interactjs/core/defaultOptions.js.map @@ -0,0 +1,22 @@ +{ + "version": 3, + "sources": [ + "defaultOptions.ts" + ], + "names": [ + "defaults", + "base", + "preventDefault", + "deltaSource", + "perAction", + "enabled", + "origin", + "x", + "y", + "actions" + ], + "mappings": "AAAA;AAQA;AAsBA;AAIA,OAAO,MAAMA,QAAkB,GAAG;AAChCC,EAAAA,IAAI,EAAE;AACJC,IAAAA,cAAc,EAAE,MADZ;AAEJC,IAAAA,WAAW,EAAE;AAFT,GAD0B;AAMhCC,EAAAA,SAAS,EAAE;AACTC,IAAAA,OAAO,EAAE,KADA;AAETC,IAAAA,MAAM,EAAE;AAAEC,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX;AAFC,GANqB;AAWhCC,EAAAA,OAAO,EAAE;AAXuB,CAA3B;AAcP,eAAeT,QAAf", + "sourcesContent": [ + "// tslint:disable no-empty-interface\n\nexport interface Defaults {\n base: BaseDefaults\n perAction: PerActionDefaults\n actions: ActionDefaults\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ActionDefaults {\n}\n\nexport interface BaseDefaults {\n preventDefault?: 'auto' | 'never' | string\n deltaSource?: 'page' | 'client'\n context?: Interact.EventTarget\n}\n\nexport interface PerActionDefaults {\n enabled?: boolean\n origin?: Interact.Point | string | Interact.Element\n listeners?: Interact.Listeners\n allowFrom?: string | Interact.Element\n ignoreFrom?: string | Interact.Element\n}\n\nexport type Options = Partial & Partial & {\n [P in keyof ActionDefaults]?: Partial\n}\n\n// export interface Options extends BaseDefaults, PerActionDefaults {}\n\nexport interface OptionsArg extends BaseDefaults, Interact.OrBoolean> {}\n\nexport const defaults: Defaults = {\n base: {\n preventDefault: 'auto',\n deltaSource: 'page',\n },\n\n perAction: {\n enabled: false,\n origin: { x: 0, y: 0 },\n },\n\n actions: {} as ActionDefaults,\n}\n\nexport default defaults\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/defaultOptions.min.js b/@interactjs/core/defaultOptions.min.js new file mode 100644 index 000000000..3db3d57b6 --- /dev/null +++ b/@interactjs/core/defaultOptions.min.js @@ -0,0 +1,2 @@ +export const defaults={base:{preventDefault:"auto",deltaSource:"page"},perAction:{enabled:!1,origin:{x:0,y:0}},actions:{}};export default defaults; +//# sourceMappingURL=defaultOptions.min.js.map \ No newline at end of file diff --git a/@interactjs/core/defaultOptions.min.js.map b/@interactjs/core/defaultOptions.min.js.map new file mode 100644 index 000000000..0713b3968 --- /dev/null +++ b/@interactjs/core/defaultOptions.min.js.map @@ -0,0 +1,22 @@ +{ + "version": 3, + "sources": [ + "defaultOptions.ts" + ], + "names": [ + "defaults", + "base", + "preventDefault", + "deltaSource", + "perAction", + "enabled", + "origin", + "x", + "y", + "actions" + ], + "mappings": "OAkCO,MAAMA,SAAqB,CAChCC,KAAM,CACJC,eAAgB,OAChBC,YAAa,QAGfC,UAAW,CACTC,SAAS,EACTC,OAAQ,CAAEC,EAAG,EAAGC,EAAG,IAGrBC,QAAS,mBAGIT", + "sourcesContent": [ + "// tslint:disable no-empty-interface\n\nexport interface Defaults {\n base: BaseDefaults\n perAction: PerActionDefaults\n actions: ActionDefaults\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ActionDefaults {\n}\n\nexport interface BaseDefaults {\n preventDefault?: 'auto' | 'never' | string\n deltaSource?: 'page' | 'client'\n context?: Interact.EventTarget\n}\n\nexport interface PerActionDefaults {\n enabled?: boolean\n origin?: Interact.Point | string | Interact.Element\n listeners?: Interact.Listeners\n allowFrom?: string | Interact.Element\n ignoreFrom?: string | Interact.Element\n}\n\nexport type Options = Partial & Partial & {\n [P in keyof ActionDefaults]?: Partial\n}\n\n// export interface Options extends BaseDefaults, PerActionDefaults {}\n\nexport interface OptionsArg extends BaseDefaults, Interact.OrBoolean> {}\n\nexport const defaults: Defaults = {\n base: {\n preventDefault: 'auto',\n deltaSource: 'page',\n },\n\n perAction: {\n enabled: false,\n origin: { x: 0, y: 0 },\n },\n\n actions: {} as ActionDefaults,\n}\n\nexport default defaults\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/interactablePreventDefault.d.ts b/@interactjs/core/interactablePreventDefault.d.ts new file mode 100644 index 000000000..b9866156a --- /dev/null +++ b/@interactjs/core/interactablePreventDefault.d.ts @@ -0,0 +1,16 @@ +declare module '@interactjs/core/Interactable' { + interface Interactable { + preventDefault: typeof preventDefault; + checkAndPreventDefault: (event: Event) => void; + } +} +declare type PreventDefaultValue = 'always' | 'never' | 'auto'; +declare function preventDefault(this: Interact.Interactable): PreventDefaultValue; +declare function preventDefault(this: Interact.Interactable, newValue: PreventDefaultValue): typeof this; +export declare function install(scope: Interact.Scope): void; +declare const _default: { + id: string; + install: typeof install; + listeners: any; +}; +export default _default; diff --git a/@interactjs/core/interactablePreventDefault.js b/@interactjs/core/interactablePreventDefault.js new file mode 100644 index 000000000..e69472ff8 --- /dev/null +++ b/@interactjs/core/interactablePreventDefault.js @@ -0,0 +1,112 @@ +import { matchesSelector, nodeContains } from "../utils/domUtils.js"; +import events from "../utils/events.js"; +import * as is from "../utils/is.js"; +import { getWindow } from "../utils/window.js"; + +function preventDefault(newValue) { + if (/^(always|never|auto)$/.test(newValue)) { + this.options.preventDefault = newValue; + return this; + } + + if (is.bool(newValue)) { + this.options.preventDefault = newValue ? 'always' : 'never'; + return this; + } + + return this.options.preventDefault; +} + +function checkAndPreventDefault(interactable, scope, event) { + const setting = interactable.options.preventDefault; + + if (setting === 'never') { + return; + } + + if (setting === 'always') { + event.preventDefault(); + return; + } // setting === 'auto' + // if the browser supports passive event listeners and isn't running on iOS, + // don't preventDefault of touch{start,move} events. CSS touch-action and + // user-select should be used instead of calling event.preventDefault(). + + + if (events.supportsPassive && /^touch(start|move)$/.test(event.type)) { + const doc = getWindow(event.target).document; + const docOptions = scope.getDocOptions(doc); + + if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) { + return; + } + } // don't preventDefault of pointerdown events + + + if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) { + return; + } // don't preventDefault on editable elements + + + if (is.element(event.target) && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) { + return; + } + + event.preventDefault(); +} + +function onInteractionEvent({ + interaction, + event +}) { + if (interaction.interactable) { + interaction.interactable.checkAndPreventDefault(event); + } +} + +export function install(scope) { + /** @lends Interactable */ + const { + Interactable + } = scope; + /** + * Returns or sets whether to prevent the browser's default behaviour in + * response to pointer events. Can be set to: + * - `'always'` to always prevent + * - `'never'` to never prevent + * - `'auto'` to let interact.js try to determine what would be best + * + * @param {string} [newValue] `'always'`, `'never'` or `'auto'` + * @return {string | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.preventDefault = preventDefault; + + Interactable.prototype.checkAndPreventDefault = function (event) { + return checkAndPreventDefault(this, scope, event); + }; // prevent native HTML5 drag on interact.js target elements + + + scope.interactions.docEvents.push({ + type: 'dragstart', + + listener(event) { + for (const interaction of scope.interactions.list) { + if (interaction.element && (interaction.element === event.target || nodeContains(interaction.element, event.target))) { + interaction.interactable.checkAndPreventDefault(event); + return; + } + } + } + + }); +} +export default { + id: 'core/interactablePreventDefault', + install, + listeners: ['down', 'move', 'up', 'cancel'].reduce((acc, eventType) => { + acc[`interactions:${eventType}`] = onInteractionEvent; + return acc; + }, {}) +}; +//# sourceMappingURL=interactablePreventDefault.js.map \ No newline at end of file diff --git a/@interactjs/core/interactablePreventDefault.js.map b/@interactjs/core/interactablePreventDefault.js.map new file mode 100644 index 000000000..c41313dca --- /dev/null +++ b/@interactjs/core/interactablePreventDefault.js.map @@ -0,0 +1,51 @@ +{ + "version": 3, + "sources": [ + "interactablePreventDefault.ts" + ], + "names": [ + "matchesSelector", + "nodeContains", + "events", + "is", + "getWindow", + "preventDefault", + "newValue", + "test", + "options", + "bool", + "checkAndPreventDefault", + "interactable", + "scope", + "event", + "setting", + "supportsPassive", + "type", + "doc", + "target", + "document", + "docOptions", + "getDocOptions", + "passive", + "element", + "onInteractionEvent", + "interaction", + "install", + "Interactable", + "prototype", + "interactions", + "docEvents", + "push", + "listener", + "list", + "id", + "listeners", + "reduce", + "acc", + "eventType" + ], + "mappings": "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", + "sourcesContent": [ + "import { matchesSelector, nodeContains } from '@interactjs/utils/domUtils'\nimport events from '@interactjs/utils/events'\nimport * as is from '@interactjs/utils/is'\nimport { getWindow } from '@interactjs/utils/window'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n preventDefault: typeof preventDefault\n checkAndPreventDefault: (event: Event) => void\n }\n}\n\ntype PreventDefaultValue = 'always' | 'never' | 'auto'\nfunction preventDefault (this: Interact.Interactable): PreventDefaultValue\nfunction preventDefault (this: Interact.Interactable, newValue: PreventDefaultValue): typeof this\nfunction preventDefault (this: Interact.Interactable, newValue?: PreventDefaultValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue\n return this\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue ? 'always' : 'never'\n return this\n }\n\n return this.options.preventDefault\n}\n\nfunction checkAndPreventDefault (interactable: Interact.Interactable, scope: Interact.Scope, event: Event) {\n const setting = interactable.options.preventDefault\n\n if (setting === 'never') { return }\n\n if (setting === 'always') {\n event.preventDefault()\n return\n }\n\n // setting === 'auto'\n\n // if the browser supports passive event listeners and isn't running on iOS,\n // don't preventDefault of touch{start,move} events. CSS touch-action and\n // user-select should be used instead of calling event.preventDefault().\n if (events.supportsPassive && /^touch(start|move)$/.test(event.type)) {\n const doc = getWindow(event.target).document\n const docOptions = scope.getDocOptions(doc)\n\n if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) {\n return\n }\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target) &&\n matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return\n }\n\n event.preventDefault()\n}\n\nfunction onInteractionEvent ({ interaction, event }: { interaction: Interact.Interaction, event: Interact.PointerEventType }) {\n if (interaction.interactable) {\n interaction.interactable.checkAndPreventDefault(event as Event)\n }\n}\n\nexport function install (scope: Interact.Scope) {\n /** @lends Interactable */\n const { Interactable } = scope\n\n /**\n * Returns or sets whether to prevent the browser's default behaviour in\n * response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n * @param {string} [newValue] `'always'`, `'never'` or `'auto'`\n * @return {string | Interactable} The current setting or this Interactable\n */\n Interactable.prototype.preventDefault = preventDefault\n\n Interactable.prototype.checkAndPreventDefault = function (event) {\n return checkAndPreventDefault(this, scope, event)\n }\n\n // prevent native HTML5 drag on interact.js target elements\n scope.interactions.docEvents.push({\n type: 'dragstart',\n listener (event) {\n for (const interaction of scope.interactions.list) {\n if (interaction.element &&\n (interaction.element === event.target ||\n nodeContains(interaction.element, event.target))) {\n interaction.interactable.checkAndPreventDefault(event)\n return\n }\n }\n },\n })\n}\n\nexport default {\n id: 'core/interactablePreventDefault',\n install,\n listeners: ['down', 'move', 'up', 'cancel'].reduce((acc, eventType) => {\n acc[`interactions:${eventType}`] = onInteractionEvent\n return acc\n }, {} as any),\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/interactablePreventDefault.min.js b/@interactjs/core/interactablePreventDefault.min.js new file mode 100644 index 000000000..55bff7cf9 --- /dev/null +++ b/@interactjs/core/interactablePreventDefault.min.js @@ -0,0 +1,2 @@ +import{matchesSelector as t,nodeContains as e}from"../utils/domUtils.min.js";import n from"../utils/events.min.js";import*as i from"../utils/is.min.js";import{getWindow as r}from"../utils/window.min.js";function o(t){return/^(always|never|auto)$/.test(t)?(this.options.preventDefault=t,this):i.bool(t)?(this.options.preventDefault=t?"always":"never",this):this.options.preventDefault}function s({interaction:t,event:e}){t.interactable&&t.interactable.checkAndPreventDefault(e)}export function install(s){const{Interactable:a}=s;a.prototype.preventDefault=o,a.prototype.checkAndPreventDefault=function(e){return function(e,o,s){const a=e.options.preventDefault;if("never"!==a)if("always"!==a){if(n.supportsPassive&&/^touch(start|move)$/.test(s.type)){const t=r(s.target).document,e=o.getDocOptions(t);if(!e||!e.events||!1!==e.events.passive)return}/^(mouse|pointer|touch)*(down|start)/i.test(s.type)||i.element(s.target)&&t(s.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||s.preventDefault()}else s.preventDefault()}(this,s,e)},s.interactions.docEvents.push({type:"dragstart",listener(t){for(const n of s.interactions.list)if(n.element&&(n.element===t.target||e(n.element,t.target)))return void n.interactable.checkAndPreventDefault(t)}})}export default{id:"core/interactablePreventDefault",install:install,listeners:["down","move","up","cancel"].reduce((t,e)=>(t[`interactions:${e}`]=s,t),{})}; +//# sourceMappingURL=interactablePreventDefault.min.js.map \ No newline at end of file diff --git a/@interactjs/core/interactablePreventDefault.min.js.map b/@interactjs/core/interactablePreventDefault.min.js.map new file mode 100644 index 000000000..7c3d7c771 --- /dev/null +++ b/@interactjs/core/interactablePreventDefault.min.js.map @@ -0,0 +1,52 @@ +{ + "version": 3, + "sources": [ + "interactablePreventDefault.ts" + ], + "names": [ + "matchesSelector", + "nodeContains", + "events", + "is", + "getWindow", + "preventDefault", + "newValue", + "test", + "this", + "options", + "bool", + "onInteractionEvent", + "interaction", + "event", + "interactable", + "checkAndPreventDefault", + "install", + "scope", + "Interactable", + "prototype", + "setting", + "supportsPassive", + "type", + "doc", + "target", + "document", + "docOptions", + "getDocOptions", + "passive", + "element", + "interactions", + "docEvents", + "push", + "listener", + "list", + "id", + "listeners", + "reduce", + "acc", + "eventType" + ], + "mappings": "0BAASA,kBAAiBC,MAAoB,kCACvCC,MAAY,mCACPC,MAAQ,yCACXC,MAAiB,yBAY1B,SAASC,EAA6CC,GACpD,MAAI,wBAAwBC,KAAKD,IAC/BE,KAAKC,QAAQJ,eAAiBC,EACvBE,MAGLL,EAAGO,KAAKJ,IACVE,KAAKC,QAAQJ,eAAiBC,EAAW,SAAW,QAC7CE,MAGFA,KAAKC,QAAQJ,eAyCtB,SAASM,GAAoBC,YAAEA,EAAFC,MAAeA,IACtCD,EAAYE,cACdF,EAAYE,aAAaC,uBAAuBF,UAI7C,SAASG,QAASC,GAEvB,MAAMC,aAAEA,GAAiBD,EAYzBC,EAAaC,UAAUd,eAAiBA,EAExCa,EAAaC,UAAUJ,uBAAyB,SAAUF,GACxD,OA7DJ,SAAiCC,EAAqCG,EAAuBJ,GAC3F,MAAMO,EAAUN,EAAaL,QAAQJ,eAErC,GAAgB,UAAZe,EAEJ,GAAgB,WAAZA,EAAJ,CAUA,GAAIlB,EAAOmB,iBAAmB,sBAAsBd,KAAKM,EAAMS,MAAO,CACpE,MAAMC,EAAMnB,EAAUS,EAAMW,QAAQC,SAC9BC,EAAaT,EAAMU,cAAcJ,GAEvC,IAAMG,IAAcA,EAAWxB,SAAyC,IAA9BwB,EAAWxB,OAAO0B,QAC1D,OAKA,uCAAuCrB,KAAKM,EAAMS,OAKlDnB,EAAG0B,QAAQhB,EAAMW,SACjBxB,EAAgBa,EAAMW,OAAQ,0EAIlCX,EAAMR,sBA7BJQ,EAAMR,iBAuDCU,CAAuBP,KAAMS,EAAOJ,IAI7CI,EAAMa,aAAaC,UAAUC,KAAK,CAChCV,KAAM,YACNW,SAAUpB,GACR,IAAK,MAAMD,KAAeK,EAAMa,aAAaI,KAC3C,GAAItB,EAAYiB,UACbjB,EAAYiB,UAAYhB,EAAMW,QAC9BvB,EAAaW,EAAYiB,QAAShB,EAAMW,SAEzC,YADAZ,EAAYE,aAAaC,uBAAuBF,oBAQ3C,CACbsB,GAAI,kCACJnB,QAAAA,QACAoB,UAAW,CAAC,OAAQ,OAAQ,KAAM,UAAUC,OAAO,CAACC,EAAKC,KACvDD,EAAK,gBAAeC,KAAe5B,EAC5B2B,GACN", + "sourcesContent": [ + "import { matchesSelector, nodeContains } from '@interactjs/utils/domUtils'\nimport events from '@interactjs/utils/events'\nimport * as is from '@interactjs/utils/is'\nimport { getWindow } from '@interactjs/utils/window'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n preventDefault: typeof preventDefault\n checkAndPreventDefault: (event: Event) => void\n }\n}\n\ntype PreventDefaultValue = 'always' | 'never' | 'auto'\nfunction preventDefault (this: Interact.Interactable): PreventDefaultValue\nfunction preventDefault (this: Interact.Interactable, newValue: PreventDefaultValue): typeof this\nfunction preventDefault (this: Interact.Interactable, newValue?: PreventDefaultValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue\n return this\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue ? 'always' : 'never'\n return this\n }\n\n return this.options.preventDefault\n}\n\nfunction checkAndPreventDefault (interactable: Interact.Interactable, scope: Interact.Scope, event: Event) {\n const setting = interactable.options.preventDefault\n\n if (setting === 'never') { return }\n\n if (setting === 'always') {\n event.preventDefault()\n return\n }\n\n // setting === 'auto'\n\n // if the browser supports passive event listeners and isn't running on iOS,\n // don't preventDefault of touch{start,move} events. CSS touch-action and\n // user-select should be used instead of calling event.preventDefault().\n if (events.supportsPassive && /^touch(start|move)$/.test(event.type)) {\n const doc = getWindow(event.target).document\n const docOptions = scope.getDocOptions(doc)\n\n if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) {\n return\n }\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target) &&\n matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return\n }\n\n event.preventDefault()\n}\n\nfunction onInteractionEvent ({ interaction, event }: { interaction: Interact.Interaction, event: Interact.PointerEventType }) {\n if (interaction.interactable) {\n interaction.interactable.checkAndPreventDefault(event as Event)\n }\n}\n\nexport function install (scope: Interact.Scope) {\n /** @lends Interactable */\n const { Interactable } = scope\n\n /**\n * Returns or sets whether to prevent the browser's default behaviour in\n * response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n * @param {string} [newValue] `'always'`, `'never'` or `'auto'`\n * @return {string | Interactable} The current setting or this Interactable\n */\n Interactable.prototype.preventDefault = preventDefault\n\n Interactable.prototype.checkAndPreventDefault = function (event) {\n return checkAndPreventDefault(this, scope, event)\n }\n\n // prevent native HTML5 drag on interact.js target elements\n scope.interactions.docEvents.push({\n type: 'dragstart',\n listener (event) {\n for (const interaction of scope.interactions.list) {\n if (interaction.element &&\n (interaction.element === event.target ||\n nodeContains(interaction.element, event.target))) {\n interaction.interactable.checkAndPreventDefault(event)\n return\n }\n }\n },\n })\n}\n\nexport default {\n id: 'core/interactablePreventDefault',\n install,\n listeners: ['down', 'move', 'up', 'cancel'].reduce((acc, eventType) => {\n acc[`interactions:${eventType}`] = onInteractionEvent\n return acc\n }, {} as any),\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/interactablePreventDefault.spec.d.ts b/@interactjs/core/interactablePreventDefault.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/core/interactablePreventDefault.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/core/interactionFinder.d.ts b/@interactjs/core/interactionFinder.d.ts new file mode 100644 index 000000000..2a6a8a821 --- /dev/null +++ b/@interactjs/core/interactionFinder.d.ts @@ -0,0 +1,18 @@ +export interface SearchDetails { + pointer: Interact.PointerType; + pointerId: number; + pointerType: string; + eventType: string; + eventTarget: Interact.EventTarget; + curEventTarget: Interact.EventTarget; + scope: Interact.Scope; +} +declare const finder: { + methodOrder: readonly ["simulationResume", "mouseOrPen", "hasPointer", "idle"]; + search(details: SearchDetails): any; + simulationResume({ pointerType, eventType, eventTarget, scope }: SearchDetails): import("@interactjs/core/Interaction").Interaction<"resize" | "drag" | "drop" | "gesture">; + mouseOrPen({ pointerId, pointerType, eventType, scope }: SearchDetails): any; + hasPointer({ pointerId, scope }: SearchDetails): import("@interactjs/core/Interaction").Interaction<"resize" | "drag" | "drop" | "gesture">; + idle({ pointerType, scope }: SearchDetails): import("@interactjs/core/Interaction").Interaction<"resize" | "drag" | "drop" | "gesture">; +}; +export default finder; diff --git a/@interactjs/core/interactionFinder.js b/@interactjs/core/interactionFinder.js new file mode 100644 index 000000000..cf0ad3142 --- /dev/null +++ b/@interactjs/core/interactionFinder.js @@ -0,0 +1,144 @@ +import * as dom from "../utils/domUtils.js"; +const finder = { + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], + + search(details) { + for (const method of finder.methodOrder) { + const interaction = finder[method](details); + + if (interaction) { + return interaction; + } + } + + return null; + }, + + // try to resume simulation with a new pointer + simulationResume({ + pointerType, + eventType, + eventTarget, + scope + }) { + if (!/down|start/i.test(eventType)) { + return null; + } + + for (const interaction of scope.interactions.list) { + let element = eventTarget; + + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { + while (element) { + // if the element is the interaction element + if (element === interaction.element) { + return interaction; + } + + element = dom.parentNode(element); + } + } + } + + return null; + }, + + // if it's a mouse or pen interaction + mouseOrPen({ + pointerId, + pointerType, + eventType, + scope + }) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { + return null; + } + + let firstNonActive; + + for (const interaction of scope.interactions.list) { + if (interaction.pointerType === pointerType) { + // if it's a down event, skip interactions with running simulations + if (interaction.simulation && !hasPointerId(interaction, pointerId)) { + continue; + } // if the interaction is active, return it immediately + + + if (interaction.interacting()) { + return interaction; + } // otherwise save it and look for another active interaction + else if (!firstNonActive) { + firstNonActive = interaction; + } + } + } // if no active mouse interaction was found use the first inactive mouse + // interaction + + + if (firstNonActive) { + return firstNonActive; + } // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation + // is active + + + for (const interaction of scope.interactions.list) { + if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) { + return interaction; + } + } + + return null; + }, + + // get interaction that has this pointer + hasPointer({ + pointerId, + scope + }) { + for (const interaction of scope.interactions.list) { + if (hasPointerId(interaction, pointerId)) { + return interaction; + } + } + + return null; + }, + + // get first idle interaction with a matching pointerType + idle({ + pointerType, + scope + }) { + for (const interaction of scope.interactions.list) { + // if there's already a pointer held down + if (interaction.pointers.length === 1) { + const target = interaction.interactable; // don't add this pointer if there is a target interactable and it + // isn't gesturable + + if (target && !(target.options.gesture && target.options.gesture.enabled)) { + continue; + } + } // maximum of 2 pointers per interaction + else if (interaction.pointers.length >= 2) { + continue; + } + + if (!interaction.interacting() && pointerType === interaction.pointerType) { + return interaction; + } + } + + return null; + } + +}; + +function hasPointerId(interaction, pointerId) { + return interaction.pointers.some(({ + id + }) => id === pointerId); +} + +export default finder; +//# sourceMappingURL=interactionFinder.js.map \ No newline at end of file diff --git a/@interactjs/core/interactionFinder.js.map b/@interactjs/core/interactionFinder.js.map new file mode 100644 index 000000000..d058527cf --- /dev/null +++ b/@interactjs/core/interactionFinder.js.map @@ -0,0 +1,47 @@ +{ + "version": 3, + "sources": [ + "interactionFinder.ts" + ], + "names": [ + "dom", + "finder", + "methodOrder", + "search", + "details", + "method", + "interaction", + "simulationResume", + "pointerType", + "eventType", + "eventTarget", + "scope", + "test", + "interactions", + "list", + "element", + "simulation", + "allowResume", + "parentNode", + "mouseOrPen", + "pointerId", + "firstNonActive", + "hasPointerId", + "interacting", + "hasPointer", + "idle", + "pointers", + "length", + "target", + "interactable", + "options", + "gesture", + "enabled", + "some", + "id" + ], + "mappings": "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", + "sourcesContent": [ + "import * as dom from '@interactjs/utils/domUtils'\n\nexport interface SearchDetails {\n pointer: Interact.PointerType\n pointerId: number\n pointerType: string\n eventType: string\n eventTarget: Interact.EventTarget\n curEventTarget: Interact.EventTarget\n scope: Interact.Scope\n}\n\nconst finder = {\n methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'] as const,\n\n search (details: SearchDetails) {\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details)\n\n if (interaction) {\n return interaction\n }\n }\n\n return null\n },\n\n // try to resume simulation with a new pointer\n simulationResume ({ pointerType, eventType, eventTarget, scope }: SearchDetails) {\n if (!/down|start/i.test(eventType)) {\n return null\n }\n\n for (const interaction of scope.interactions.list) {\n let element = eventTarget as Node\n\n if (interaction.simulation && interaction.simulation.allowResume &&\n (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction\n }\n element = dom.parentNode(element)\n }\n }\n }\n\n return null\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen ({ pointerId, pointerType, eventType, scope }: SearchDetails) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null\n }\n\n let firstNonActive\n\n for (const interaction of scope.interactions.list) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !hasPointerId(interaction, pointerId)) { continue }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions.list) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction\n }\n }\n\n return null\n },\n\n // get interaction that has this pointer\n hasPointer ({ pointerId, scope }: SearchDetails) {\n for (const interaction of scope.interactions.list) {\n if (hasPointerId(interaction, pointerId)) {\n return interaction\n }\n }\n\n return null\n },\n\n // get first idle interaction with a matching pointerType\n idle ({ pointerType, scope }: SearchDetails) {\n for (const interaction of scope.interactions.list) {\n // if there's already a pointer held down\n if (interaction.pointers.length === 1) {\n const target = interaction.interactable\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !(target.options.gesture && target.options.gesture.enabled)) {\n continue\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointers.length >= 2) {\n continue\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction\n }\n }\n\n return null\n },\n}\n\nfunction hasPointerId (interaction: Interact.Interaction, pointerId: number) {\n return interaction.pointers.some(({ id }) => id === pointerId)\n}\n\nexport default finder\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/interactionFinder.min.js b/@interactjs/core/interactionFinder.min.js new file mode 100644 index 000000000..6c086e102 --- /dev/null +++ b/@interactjs/core/interactionFinder.min.js @@ -0,0 +1,2 @@ +import*as e from"../utils/domUtils.min.js";const t={methodOrder:["simulationResume","mouseOrPen","hasPointer","idle"],search(e){for(const n of t.methodOrder){const i=t[n](e);if(i)return i}return null},simulationResume({pointerType:t,eventType:n,eventTarget:i,scope:r}){if(!/down|start/i.test(n))return null;for(const n of r.interactions.list){let r=i;if(n.simulation&&n.simulation.allowResume&&n.pointerType===t)for(;r;){if(r===n.element)return n;r=e.parentNode(r)}}return null},mouseOrPen({pointerId:e,pointerType:t,eventType:i,scope:r}){if("mouse"!==t&&"pen"!==t)return null;let o;for(const i of r.interactions.list)if(i.pointerType===t){if(i.simulation&&!n(i,e))continue;if(i.interacting())return i;o||(o=i)}if(o)return o;for(const e of r.interactions.list)if(!(e.pointerType!==t||/down/i.test(i)&&e.simulation))return e;return null},hasPointer({pointerId:e,scope:t}){for(const i of t.interactions.list)if(n(i,e))return i;return null},idle({pointerType:e,scope:t}){for(const n of t.interactions.list){if(1===n.pointers.length){const e=n.interactable;if(e&&(!e.options.gesture||!e.options.gesture.enabled))continue}else if(n.pointers.length>=2)continue;if(!n.interacting()&&e===n.pointerType)return n}return null}};function n(e,t){return e.pointers.some(({id:e})=>e===t)}export default t; +//# sourceMappingURL=interactionFinder.min.js.map \ No newline at end of file diff --git a/@interactjs/core/interactionFinder.min.js.map b/@interactjs/core/interactionFinder.min.js.map new file mode 100644 index 000000000..be323707b --- /dev/null +++ b/@interactjs/core/interactionFinder.min.js.map @@ -0,0 +1,47 @@ +{ + "version": 3, + "sources": [ + "interactionFinder.ts" + ], + "names": [ + "dom", + "finder", + "methodOrder", + "search", + "details", + "method", + "interaction", + "simulationResume", + "pointerType", + "eventType", + "eventTarget", + "scope", + "test", + "interactions", + "list", + "element", + "simulation", + "allowResume", + "parentNode", + "mouseOrPen", + "pointerId", + "firstNonActive", + "hasPointerId", + "interacting", + "hasPointer", + "idle", + "pointers", + "length", + "target", + "interactable", + "options", + "gesture", + "enabled", + "some", + "id" + ], + "mappings": "UAAYA,MAAS,2BAYrB,MAAMC,EAAS,CACbC,YAAa,CAAC,mBAAoB,aAAc,aAAc,QAE9DC,OAAQC,GACN,IAAK,MAAMC,KAAUJ,EAAOC,YAAa,CACvC,MAAMI,EAAcL,EAAOI,GAAQD,GAEnC,GAAIE,EACF,OAAOA,EAIX,OAAO,MAITC,kBAAkBC,YAAEA,EAAFC,UAAeA,EAAfC,YAA0BA,EAA1BC,MAAuCA,IACvD,IAAK,cAAcC,KAAKH,GACtB,OAAO,KAGT,IAAK,MAAMH,KAAeK,EAAME,aAAaC,KAAM,CACjD,IAAIC,EAAUL,EAEd,GAAIJ,EAAYU,YAAcV,EAAYU,WAAWC,aAChDX,EAAYE,cAAgBA,EAC/B,KAAOO,GAAS,CAEd,GAAIA,IAAYT,EAAYS,QAC1B,OAAOT,EAETS,EAAUf,EAAIkB,WAAWH,IAK/B,OAAO,MAITI,YAAYC,UAAEA,EAAFZ,YAAaA,EAAbC,UAA0BA,EAA1BE,MAAqCA,IAC/C,GAAoB,UAAhBH,GAA2C,QAAhBA,EAC7B,OAAO,KAGT,IAAIa,EAEJ,IAAK,MAAMf,KAAeK,EAAME,aAAaC,KAC3C,GAAIR,EAAYE,cAAgBA,EAAa,CAE3C,GAAIF,EAAYU,aAAeM,EAAahB,EAAac,GAAc,SAGvE,GAAId,EAAYiB,cACd,OAAOjB,EAGCe,IACRA,EAAiBf,GAOvB,GAAIe,EACF,OAAOA,EAMT,IAAK,MAAMf,KAAeK,EAAME,aAAaC,KAC3C,KAAIR,EAAYE,cAAgBA,GAAiB,QAAQI,KAAKH,IAAcH,EAAYU,YACtF,OAAOV,EAIX,OAAO,MAITkB,YAAYJ,UAAEA,EAAFT,MAAaA,IACvB,IAAK,MAAML,KAAeK,EAAME,aAAaC,KAC3C,GAAIQ,EAAahB,EAAac,GAC5B,OAAOd,EAIX,OAAO,MAITmB,MAAMjB,YAAEA,EAAFG,MAAeA,IACnB,IAAK,MAAML,KAAeK,EAAME,aAAaC,KAAM,CAEjD,GAAoC,IAAhCR,EAAYoB,SAASC,OAAc,CACrC,MAAMC,EAAStB,EAAYuB,aAG3B,GAAID,KAAYA,EAAOE,QAAQC,UAAWH,EAAOE,QAAQC,QAAQC,SAC/D,cAIC,GAAI1B,EAAYoB,SAASC,QAAU,EACtC,SAGF,IAAKrB,EAAYiB,eAAkBf,IAAgBF,EAAYE,YAC7D,OAAOF,EAIX,OAAO,OAIX,SAASgB,EAAchB,EAAmCc,GACxD,OAAOd,EAAYoB,SAASO,KAAK,EAAGC,GAAAA,KAASA,IAAOd,kBAGvCnB", + "sourcesContent": [ + "import * as dom from '@interactjs/utils/domUtils'\n\nexport interface SearchDetails {\n pointer: Interact.PointerType\n pointerId: number\n pointerType: string\n eventType: string\n eventTarget: Interact.EventTarget\n curEventTarget: Interact.EventTarget\n scope: Interact.Scope\n}\n\nconst finder = {\n methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'] as const,\n\n search (details: SearchDetails) {\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details)\n\n if (interaction) {\n return interaction\n }\n }\n\n return null\n },\n\n // try to resume simulation with a new pointer\n simulationResume ({ pointerType, eventType, eventTarget, scope }: SearchDetails) {\n if (!/down|start/i.test(eventType)) {\n return null\n }\n\n for (const interaction of scope.interactions.list) {\n let element = eventTarget as Node\n\n if (interaction.simulation && interaction.simulation.allowResume &&\n (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction\n }\n element = dom.parentNode(element)\n }\n }\n }\n\n return null\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen ({ pointerId, pointerType, eventType, scope }: SearchDetails) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null\n }\n\n let firstNonActive\n\n for (const interaction of scope.interactions.list) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !hasPointerId(interaction, pointerId)) { continue }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions.list) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction\n }\n }\n\n return null\n },\n\n // get interaction that has this pointer\n hasPointer ({ pointerId, scope }: SearchDetails) {\n for (const interaction of scope.interactions.list) {\n if (hasPointerId(interaction, pointerId)) {\n return interaction\n }\n }\n\n return null\n },\n\n // get first idle interaction with a matching pointerType\n idle ({ pointerType, scope }: SearchDetails) {\n for (const interaction of scope.interactions.list) {\n // if there's already a pointer held down\n if (interaction.pointers.length === 1) {\n const target = interaction.interactable\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !(target.options.gesture && target.options.gesture.enabled)) {\n continue\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointers.length >= 2) {\n continue\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction\n }\n }\n\n return null\n },\n}\n\nfunction hasPointerId (interaction: Interact.Interaction, pointerId: number) {\n return interaction.pointers.some(({ id }) => id === pointerId)\n}\n\nexport default finder\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/interactionFinder.spec.d.ts b/@interactjs/core/interactionFinder.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/core/interactionFinder.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/core/interactions.d.ts b/@interactjs/core/interactions.d.ts new file mode 100644 index 000000000..9ab6aed4d --- /dev/null +++ b/@interactjs/core/interactions.d.ts @@ -0,0 +1,30 @@ +import InteractionBase from './Interaction'; +import { SearchDetails } from './interactionFinder'; +declare module '@interactjs/core/scope' { + interface Scope { + Interaction: typeof InteractionBase; + interactions: { + new: (options: any) => InteractionBase; + list: InteractionBase[]; + listeners: { + [type: string]: Interact.Listener; + }; + docEvents: Array<{ + type: string; + listener: Interact.Listener; + }>; + pointerMoveTolerance: number; + }; + prevTouchTime: number; + } +} +declare module '@interactjs/core/scope' { + interface SignalArgs { + 'interactions:find': { + interaction: InteractionBase; + searchDetails: SearchDetails; + }; + } +} +declare const interactions: Interact.Plugin; +export default interactions; diff --git a/@interactjs/core/interactions.js b/@interactjs/core/interactions.js new file mode 100644 index 000000000..7b1299968 --- /dev/null +++ b/@interactjs/core/interactions.js @@ -0,0 +1,276 @@ +import browser from "../utils/browser.js"; +import domObjects from "../utils/domObjects.js"; +import { nodeContains } from "../utils/domUtils.js"; +import events from "../utils/events.js"; +import * as pointerUtils from "../utils/pointerUtils.js"; +import InteractionBase from "./Interaction.js"; +import finder from "./interactionFinder.js"; +import { Scope } from "./scope.js"; +import interactablePreventDefault from "./interactablePreventDefault.js"; +const methodNames = ['pointerDown', 'pointerMove', 'pointerUp', 'updatePointer', 'removePointer', 'windowBlur']; + +function install(scope) { + const listeners = {}; + + for (const method of methodNames) { + listeners[method] = doOnInteractions(method, scope); + } + + const pEventTypes = browser.pEventTypes; + let docEvents; + + if (domObjects.PointerEvent) { + docEvents = [{ + type: pEventTypes.down, + listener: releasePointersOnRemovedEls + }, { + type: pEventTypes.down, + listener: listeners.pointerDown + }, { + type: pEventTypes.move, + listener: listeners.pointerMove + }, { + type: pEventTypes.up, + listener: listeners.pointerUp + }, { + type: pEventTypes.cancel, + listener: listeners.pointerUp + }]; + } else { + docEvents = [{ + type: 'mousedown', + listener: listeners.pointerDown + }, { + type: 'mousemove', + listener: listeners.pointerMove + }, { + type: 'mouseup', + listener: listeners.pointerUp + }, { + type: 'touchstart', + listener: releasePointersOnRemovedEls + }, { + type: 'touchstart', + listener: listeners.pointerDown + }, { + type: 'touchmove', + listener: listeners.pointerMove + }, { + type: 'touchend', + listener: listeners.pointerUp + }, { + type: 'touchcancel', + listener: listeners.pointerUp + }]; + } + + docEvents.push({ + type: 'blur', + + listener(event) { + for (const interaction of scope.interactions.list) { + interaction.documentBlur(event); + } + } + + }); // for ignoring browser's simulated mouse events + + scope.prevTouchTime = 0; + scope.Interaction = class extends InteractionBase { + get pointerMoveTolerance() { + return scope.interactions.pointerMoveTolerance; + } + + set pointerMoveTolerance(value) { + scope.interactions.pointerMoveTolerance = value; + } + + _now() { + return scope.now(); + } + + }; + scope.interactions = { + // all active and idle interactions + list: [], + + new(options) { + options.scopeFire = (name, arg) => scope.fire(name, arg); + + const interaction = new scope.Interaction(options); + scope.interactions.list.push(interaction); + return interaction; + }, + + listeners, + docEvents, + pointerMoveTolerance: 1 + }; + + function releasePointersOnRemovedEls() { + // for all inactive touch interactions with pointers down + for (const interaction of scope.interactions.list) { + if (!interaction.pointerIsDown || interaction.pointerType !== 'touch' || interaction._interacting) { + continue; + } // if a pointer is down on an element that is no longer in the DOM tree + + + for (const pointer of interaction.pointers) { + if (!scope.documents.some(({ + doc + }) => nodeContains(doc, pointer.downTarget))) { + // remove the pointer from the interaction + interaction.removePointer(pointer.pointer, pointer.event); + } + } + } + } + + scope.usePlugin(interactablePreventDefault); +} + +function doOnInteractions(method, scope) { + return function (event) { + const interactions = scope.interactions.list; + const pointerType = pointerUtils.getPointerType(event); + const [eventTarget, curEventTarget] = pointerUtils.getEventTargets(event); + const matches = []; // [ [pointer, interaction], ...] + + if (/^touch/.test(event.type)) { + scope.prevTouchTime = scope.now(); + + for (const changedTouch of event.changedTouches) { + const pointer = changedTouch; + const pointerId = pointerUtils.getPointerId(pointer); + const searchDetails = { + pointer, + pointerId, + pointerType, + eventType: event.type, + eventTarget, + curEventTarget, + scope + }; + const interaction = getInteraction(searchDetails); + matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]); + } + } else { + let invalidPointer = false; + + if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { + // ignore mouse events while touch interactions are active + for (let i = 0; i < interactions.length && !invalidPointer; i++) { + invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown; + } // try to ignore mouse events that are simulated by the browser + // after a touch event + + + invalidPointer = invalidPointer || scope.now() - scope.prevTouchTime < 500 || // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated + event.timeStamp === 0; + } + + if (!invalidPointer) { + const searchDetails = { + pointer: event, + pointerId: pointerUtils.getPointerId(event), + pointerType, + eventType: event.type, + curEventTarget, + eventTarget, + scope + }; + const interaction = getInteraction(searchDetails); + matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]); + } + } // eslint-disable-next-line no-shadow + + + for (const [pointer, eventTarget, curEventTarget, interaction] of matches) { + interaction[method](pointer, event, eventTarget, curEventTarget); + } + }; +} + +function getInteraction(searchDetails) { + const { + pointerType, + scope + } = searchDetails; + const foundInteraction = finder.search(searchDetails); + const signalArg = { + interaction: foundInteraction, + searchDetails + }; + scope.fire('interactions:find', signalArg); + return signalArg.interaction || scope.interactions.new({ + pointerType + }); +} + +function onDocSignal({ + doc, + scope, + options +}, eventMethodName) { + const { + docEvents + } = scope.interactions; + const eventMethod = events[eventMethodName]; + + if (scope.browser.isIOS && !options.events) { + options.events = { + passive: false + }; + } // delegate event listener + + + for (const eventType in events.delegatedEvents) { + eventMethod(doc, eventType, events.delegateListener); + eventMethod(doc, eventType, events.delegateUseCapture, true); + } + + const eventOptions = options && options.events; + + for (const { + type, + listener + } of docEvents) { + eventMethod(doc, type, listener, eventOptions); + } +} + +const interactions = { + id: 'core/interactions', + install, + listeners: { + 'scope:add-document': arg => onDocSignal(arg, 'add'), + 'scope:remove-document': arg => onDocSignal(arg, 'remove'), + 'interactable:unset': ({ + interactable + }, scope) => { + // Stop and destroy related interactions when an Interactable is unset + for (let i = scope.interactions.list.length - 1; i >= 0; i--) { + const interaction = scope.interactions.list[i]; + + if (interaction.interactable !== interactable) { + continue; + } + + interaction.stop(); + scope.fire('interactions:destroy', { + interaction + }); + interaction.destroy(); + + if (scope.interactions.list.length > 2) { + scope.interactions.list.splice(i, 1); + } + } + } + }, + onDocSignal, + doOnInteractions, + methodNames +}; +export default interactions; +//# sourceMappingURL=interactions.js.map \ No newline at end of file diff --git a/@interactjs/core/interactions.js.map b/@interactjs/core/interactions.js.map new file mode 100644 index 000000000..72820549f --- /dev/null +++ b/@interactjs/core/interactions.js.map @@ -0,0 +1,104 @@ +{ + "version": 3, + "sources": [ + "interactions.ts" + ], + "names": [ + "browser", + "domObjects", + "nodeContains", + "events", + "pointerUtils", + "InteractionBase", + "finder", + "Scope", + "interactablePreventDefault", + "methodNames", + "install", + "scope", + "listeners", + "method", + "doOnInteractions", + "pEventTypes", + "docEvents", + "PointerEvent", + "type", + "down", + "listener", + "releasePointersOnRemovedEls", + "pointerDown", + "move", + "pointerMove", + "up", + "pointerUp", + "cancel", + "push", + "event", + "interaction", + "interactions", + "list", + "documentBlur", + "prevTouchTime", + "Interaction", + "pointerMoveTolerance", + "value", + "_now", + "now", + "new", + "options", + "scopeFire", + "name", + "arg", + "fire", + "pointerIsDown", + "pointerType", + "_interacting", + "pointer", + "pointers", + "documents", + "some", + "doc", + "downTarget", + "removePointer", + "usePlugin", + "getPointerType", + "eventTarget", + "curEventTarget", + "getEventTargets", + "matches", + "test", + "changedTouch", + "changedTouches", + "pointerId", + "getPointerId", + "searchDetails", + "eventType", + "getInteraction", + "invalidPointer", + "supportsPointerEvent", + "i", + "length", + "timeStamp", + "foundInteraction", + "search", + "signalArg", + "onDocSignal", + "eventMethodName", + "eventMethod", + "isIOS", + "passive", + "delegatedEvents", + "delegateListener", + "delegateUseCapture", + "eventOptions", + "id", + "interactable", + "stop", + "destroy", + "splice" + ], + "mappings": "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", + "sourcesContent": [ + "import browser from '@interactjs/utils/browser'\nimport domObjects from '@interactjs/utils/domObjects'\nimport { nodeContains } from '@interactjs/utils/domUtils'\nimport events from '@interactjs/utils/events'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\nimport InteractionBase from './Interaction'\nimport finder, { SearchDetails } from './interactionFinder'\nimport { Scope } from './scope'\nimport interactablePreventDefault from './interactablePreventDefault'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n Interaction: typeof InteractionBase\n interactions: {\n new: (options: any) => InteractionBase\n list: InteractionBase[]\n listeners: { [type: string]: Interact.Listener }\n docEvents: Array<{ type: string, listener: Interact.Listener }>\n pointerMoveTolerance: number\n }\n prevTouchTime: number\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:find': {\n interaction: InteractionBase\n searchDetails: SearchDetails\n }\n }\n}\n\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer', 'windowBlur',\n]\n\nfunction install (scope: Scope) {\n const listeners = {} as any\n\n for (const method of methodNames) {\n listeners[method] = doOnInteractions(method, scope)\n }\n\n const pEventTypes = browser.pEventTypes\n let docEvents: typeof scope.interactions.docEvents\n\n if (domObjects.PointerEvent) {\n docEvents = [\n { type: pEventTypes.down, listener: releasePointersOnRemovedEls },\n { type: pEventTypes.down, listener: listeners.pointerDown },\n { type: pEventTypes.move, listener: listeners.pointerMove },\n { type: pEventTypes.up, listener: listeners.pointerUp },\n { type: pEventTypes.cancel, listener: listeners.pointerUp },\n ]\n }\n else {\n docEvents = [\n { type: 'mousedown', listener: listeners.pointerDown },\n { type: 'mousemove', listener: listeners.pointerMove },\n { type: 'mouseup', listener: listeners.pointerUp },\n\n { type: 'touchstart', listener: releasePointersOnRemovedEls },\n { type: 'touchstart', listener: listeners.pointerDown },\n { type: 'touchmove', listener: listeners.pointerMove },\n { type: 'touchend', listener: listeners.pointerUp },\n { type: 'touchcancel', listener: listeners.pointerUp },\n ]\n }\n\n docEvents.push({\n type: 'blur',\n listener (event) {\n for (const interaction of scope.interactions.list) {\n interaction.documentBlur(event)\n }\n },\n })\n\n // for ignoring browser's simulated mouse events\n scope.prevTouchTime = 0\n\n scope.Interaction = class extends InteractionBase {\n get pointerMoveTolerance () {\n return scope.interactions.pointerMoveTolerance\n }\n\n set pointerMoveTolerance (value) {\n scope.interactions.pointerMoveTolerance = value\n }\n\n _now () { return scope.now() }\n }\n\n scope.interactions = {\n // all active and idle interactions\n list: [],\n new (options: { pointerType?: string, scopeFire?: Scope['fire'] }) {\n options.scopeFire = (name, arg) => scope.fire(name, arg)\n\n const interaction = new scope.Interaction(options as Required)\n\n scope.interactions.list.push(interaction)\n return interaction\n },\n listeners,\n docEvents,\n pointerMoveTolerance: 1,\n }\n\n function releasePointersOnRemovedEls () {\n // for all inactive touch interactions with pointers down\n for (const interaction of scope.interactions.list) {\n if (!interaction.pointerIsDown ||\n interaction.pointerType !== 'touch' ||\n interaction._interacting) {\n continue\n }\n\n // if a pointer is down on an element that is no longer in the DOM tree\n for (const pointer of interaction.pointers) {\n if (!scope.documents.some(({ doc }) => nodeContains(doc, pointer.downTarget))) {\n // remove the pointer from the interaction\n interaction.removePointer(pointer.pointer, pointer.event)\n }\n }\n }\n }\n\n scope.usePlugin(interactablePreventDefault)\n}\n\nfunction doOnInteractions (method, scope) {\n return function (event) {\n const interactions = scope.interactions.list\n\n const pointerType = pointerUtils.getPointerType(event)\n const [eventTarget, curEventTarget] = pointerUtils.getEventTargets(event)\n const matches = [] // [ [pointer, interaction], ...]\n\n if (/^touch/.test(event.type)) {\n scope.prevTouchTime = scope.now()\n\n for (const changedTouch of event.changedTouches) {\n const pointer = changedTouch\n const pointerId = pointerUtils.getPointerId(pointer)\n const searchDetails: SearchDetails = {\n pointer,\n pointerId,\n pointerType,\n eventType: event.type,\n eventTarget,\n curEventTarget,\n scope,\n }\n const interaction = getInteraction(searchDetails)\n\n matches.push([\n searchDetails.pointer,\n searchDetails.eventTarget,\n searchDetails.curEventTarget,\n interaction,\n ])\n }\n }\n else {\n let invalidPointer = false\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < interactions.length && !invalidPointer; i++) {\n invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer ||\n (scope.now() - scope.prevTouchTime < 500) ||\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n event.timeStamp === 0\n }\n\n if (!invalidPointer) {\n const searchDetails = {\n pointer: event,\n pointerId: pointerUtils.getPointerId(event),\n pointerType,\n eventType: event.type,\n curEventTarget,\n eventTarget,\n scope,\n }\n\n const interaction = getInteraction(searchDetails)\n\n matches.push([\n searchDetails.pointer,\n searchDetails.eventTarget,\n searchDetails.curEventTarget,\n interaction,\n ])\n }\n }\n\n // eslint-disable-next-line no-shadow\n for (const [pointer, eventTarget, curEventTarget, interaction] of matches) {\n interaction[method](pointer, event, eventTarget, curEventTarget)\n }\n }\n}\n\nfunction getInteraction (searchDetails: SearchDetails) {\n const { pointerType, scope } = searchDetails\n\n const foundInteraction = finder.search(searchDetails)\n const signalArg = { interaction: foundInteraction, searchDetails }\n\n scope.fire('interactions:find', signalArg)\n\n return signalArg.interaction || scope.interactions.new({ pointerType })\n}\n\nfunction onDocSignal ({ doc, scope, options }: Interact.SignalArgs[T], eventMethodName: 'add' | 'remove') {\n const { docEvents } = scope.interactions\n const eventMethod = events[eventMethodName]\n\n if (scope.browser.isIOS && !options.events) {\n options.events = { passive: false }\n }\n\n // delegate event listener\n for (const eventType in events.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener)\n eventMethod(doc, eventType, events.delegateUseCapture, true)\n }\n\n const eventOptions = options && options.events\n\n for (const { type, listener } of docEvents) {\n eventMethod(doc, type, listener, eventOptions)\n }\n}\n\nconst interactions: Interact.Plugin = {\n id: 'core/interactions',\n install,\n listeners: {\n 'scope:add-document': arg => onDocSignal(arg, 'add'),\n 'scope:remove-document': arg => onDocSignal(arg, 'remove'),\n 'interactable:unset': ({ interactable }, scope) => {\n // Stop and destroy related interactions when an Interactable is unset\n for (let i = scope.interactions.list.length - 1; i >= 0; i--) {\n const interaction = scope.interactions.list[i]\n\n if (interaction.interactable !== interactable) { continue }\n\n interaction.stop()\n scope.fire('interactions:destroy', { interaction })\n interaction.destroy()\n\n if (scope.interactions.list.length > 2) {\n scope.interactions.list.splice(i, 1)\n }\n }\n },\n },\n onDocSignal,\n doOnInteractions,\n methodNames,\n}\n\nexport default interactions\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/interactions.min.js b/@interactjs/core/interactions.min.js new file mode 100644 index 000000000..c37f0f49a --- /dev/null +++ b/@interactjs/core/interactions.min.js @@ -0,0 +1,2 @@ +import e from"../utils/browser.min.js";import t from"../utils/domObjects.min.js";import{nodeContains as n}from"../utils/domUtils.min.js";import o from"../utils/events.min.js";import*as r from"../utils/pointerUtils.min.js";import i from"./Interaction.min.js";import s from"./interactionFinder.min.js";import{Scope as p}from"./scope.min.js";import c from"./interactablePreventDefault.min.js";const a=["pointerDown","pointerMove","pointerUp","updatePointer","removePointer","windowBlur"];function l(t,n){return o=>{const i=n.interactions.list,s=r.getPointerType(o),[p,c]=r.getEventTargets(o),a=[];if(/^touch/.test(o.type)){n.prevTouchTime=n.now();for(const e of o.changedTouches){const t=e,i={pointer:t,pointerId:r.getPointerId(t),pointerType:s,eventType:o.type,eventTarget:p,curEventTarget:c,scope:n},l=u(i);a.push([i.pointer,i.eventTarget,i.curEventTarget,l])}}else{let t=!1;if(!e.supportsPointerEvent&&/mouse/.test(o.type)){for(let e=0;en(e,t.downTarget))||e.removePointer(t.pointer,t.event)}p=t.PointerEvent?[{type:s.down,listener:u},{type:s.down,listener:r.pointerDown},{type:s.move,listener:r.pointerMove},{type:s.up,listener:r.pointerUp},{type:s.cancel,listener:r.pointerUp}]:[{type:"mousedown",listener:r.pointerDown},{type:"mousemove",listener:r.pointerMove},{type:"mouseup",listener:r.pointerUp},{type:"touchstart",listener:u},{type:"touchstart",listener:r.pointerDown},{type:"touchmove",listener:r.pointerMove},{type:"touchend",listener:r.pointerUp},{type:"touchcancel",listener:r.pointerUp}],p.push({type:"blur",listener(e){for(const t of o.interactions.list)t.documentBlur(e)}}),o.prevTouchTime=0,o.Interaction=class extends i{get pointerMoveTolerance(){return o.interactions.pointerMoveTolerance}set pointerMoveTolerance(e){o.interactions.pointerMoveTolerance=e}_now(){return o.now()}},o.interactions={list:[],new(e){e.scopeFire=(e,t)=>o.fire(e,t);const t=new o.Interaction(e);return o.interactions.list.push(t),t},listeners:r,docEvents:p,pointerMoveTolerance:1},o.usePlugin(c)},listeners:{"scope:add-document"(e){return m(e,"add")},"scope:remove-document"(e){return m(e,"remove")},"interactable:unset"({interactable:e},t){for(let n=t.interactions.list.length-1;n>=0;n--){const o=t.interactions.list[n];o.interactable===e&&(o.stop(),t.fire("interactions:destroy",{interaction:o}),o.destroy(),t.interactions.list.length>2&&t.interactions.list.splice(n,1))}}},onDocSignal:m,doOnInteractions:l,methodNames:a};export default v; +//# sourceMappingURL=interactions.min.js.map \ No newline at end of file diff --git a/@interactjs/core/interactions.min.js.map b/@interactjs/core/interactions.min.js.map new file mode 100644 index 000000000..e7e1d3ee3 --- /dev/null +++ b/@interactjs/core/interactions.min.js.map @@ -0,0 +1,104 @@ +{ + "version": 3, + "sources": [ + "interactions.ts" + ], + "names": [ + "browser", + "domObjects", + "nodeContains", + "events", + "pointerUtils", + "InteractionBase", + "finder", + "Scope", + "interactablePreventDefault", + "methodNames", + "doOnInteractions", + "method", + "scope", + "event", + "interactions", + "list", + "pointerType", + "getPointerType", + "eventTarget", + "curEventTarget", + "getEventTargets", + "matches", + "test", + "type", + "prevTouchTime", + "now", + "changedTouch", + "changedTouches", + "pointer", + "searchDetails", + "pointerId", + "getPointerId", + "eventType", + "interaction", + "getInteraction", + "push", + "invalidPointer", + "supportsPointerEvent", + "i", + "length", + "pointerIsDown", + "timeStamp", + "signalArg", + "search", + "fire", + "new", + "onDocSignal", + "doc", + "options", + "eventMethodName", + "docEvents", + "eventMethod", + "isIOS", + "passive", + "delegatedEvents", + "delegateListener", + "delegateUseCapture", + "eventOptions", + "listener", + "id", + "install", + "listeners", + "pEventTypes", + "releasePointersOnRemovedEls", + "_interacting", + "pointers", + "documents", + "some", + "downTarget", + "removePointer", + "PointerEvent", + "down", + "pointerDown", + "move", + "pointerMove", + "up", + "pointerUp", + "cancel", + "documentBlur", + "Interaction", + "pointerMoveTolerance", + "value", + "_now", + "scopeFire", + "name", + "arg", + "usePlugin", + "[object Object]", + "interactable", + "stop", + "destroy", + "splice" + ], + "mappings": "OAAOA,MAAa,iCACbC,MAAgB,oDACdC,MAAoB,kCACtBC,MAAY,mCACPC,MAAkB,sCACvBC,MAAqB,8BACrBC,MAA+B,6CAC7BC,MAAa,wBACfC,MAAgC,sCAyBvC,MAAMC,EAAc,CAClB,cAAe,cAAe,YAC9B,gBAAiB,gBAAiB,cAkGpC,SAASC,EAAkBC,EAAQC,GACjC,OAAiBC,IACf,MAAMC,EAAeF,EAAME,aAAaC,KAElCC,EAAcZ,EAAaa,eAAeJ,IACzCK,EAAaC,GAAkBf,EAAagB,gBAAgBP,GAC7DQ,EAAU,GAEhB,GAAI,SAASC,KAAKT,EAAMU,MAAO,CAC7BX,EAAMY,cAAgBZ,EAAMa,MAE5B,IAAK,MAAMC,KAAgBb,EAAMc,eAAgB,CAC/C,MAAMC,EAAUF,EAEVG,EAA+B,CACnCD,QAAAA,EACAE,UAHgB1B,EAAa2B,aAAaH,GAI1CZ,YAAAA,EACAgB,UAAWnB,EAAMU,KACjBL,YAAAA,EACAC,eAAAA,EACAP,MAAAA,GAEIqB,EAAcC,EAAeL,GAEnCR,EAAQc,KAAK,CACXN,EAAcD,QACdC,EAAcX,YACdW,EAAcV,eACdc,SAID,CACH,IAAIG,GAAiB,EAErB,IAAKpC,EAAQqC,sBAAwB,QAAQf,KAAKT,EAAMU,MAAO,CAE7D,IAAK,IAAIe,EAAI,EAAGA,EAAIxB,EAAayB,SAAWH,EAAgBE,IAC1DF,EAAiD,UAAhCtB,EAAawB,GAAGtB,aAA2BF,EAAawB,GAAGE,cAK9EJ,EAAiBA,GACdxB,EAAMa,MAAQb,EAAMY,cAAgB,KAEjB,IAApBX,EAAM4B,UAGV,IAAKL,EAAgB,CACnB,MAAMP,EAAgB,CACpBD,QAASf,EACTiB,UAAW1B,EAAa2B,aAAalB,GACrCG,YAAAA,EACAgB,UAAWnB,EAAMU,KACjBJ,eAAAA,EACAD,YAAAA,EACAN,MAAAA,GAGIqB,EAAcC,EAAeL,GAEnCR,EAAQc,KAAK,CACXN,EAAcD,QACdC,EAAcX,YACdW,EAAcV,eACdc,KAMN,IAAK,MAAOL,EAASV,EAAaC,EAAgBc,KAAgBZ,EAChEY,EAAYtB,GAAQiB,EAASf,EAAOK,EAAaC,IAKvD,SAASe,EAAgBL,GACvB,MAAMb,YAAEA,EAAFJ,MAAeA,GAAUiB,EAGzBa,EAAY,CAAET,YADK3B,EAAOqC,OAAOd,GACYA,cAAAA,GAInD,OAFAjB,EAAMgC,KAAK,oBAAqBF,GAEzBA,EAAUT,aAAerB,EAAME,aAAa+B,IAAI,CAAE7B,YAAAA,IAG3D,SAAS8B,GAAuEC,IAAEA,EAAFnC,MAAOA,EAAPoC,QAAcA,GAAmCC,GAC/H,MAAMC,UAAEA,GAActC,EAAME,aACtBqC,EAAchD,EAAO8C,GAEvBrC,EAAMZ,QAAQoD,QAAUJ,EAAQ7C,SAClC6C,EAAQ7C,OAAS,CAAEkD,SAAS,IAI9B,IAAK,MAAMrB,KAAa7B,EAAOmD,gBAC7BH,EAAYJ,EAAKf,EAAW7B,EAAOoD,kBACnCJ,EAAYJ,EAAKf,EAAW7B,EAAOqD,oBAAoB,GAGzD,MAAMC,EAAeT,GAAWA,EAAQ7C,OAExC,IAAK,MAAMoB,KAAEA,EAAFmC,SAAQA,KAAcR,EAC/BC,EAAYJ,EAAKxB,EAAMmC,EAAUD,GAIrC,MAAM3C,EAAgC,CACpC6C,GAAI,oBACJC,QAhNgBhD,GAChB,MAAMiD,EAAY,GAElB,IAAK,MAAMlD,KAAUF,EACnBoD,EAAUlD,GAAUD,EAAiBC,EAAQC,GAG/C,MAAMkD,EAAc9D,EAAQ8D,YAC5B,IAAIZ,EAiEJ,SAASa,IAEP,IAAK,MAAM9B,KAAerB,EAAME,aAAaC,KAC3C,GAAKkB,EAAYO,eACa,UAA5BP,EAAYjB,cACZiB,EAAY+B,aAKd,IAAK,MAAMpC,KAAWK,EAAYgC,SAC3BrD,EAAMsD,UAAUC,KAAK,EAAGpB,IAAAA,KAAU7C,EAAa6C,EAAKnB,EAAQwC,cAE/DnC,EAAYoC,cAAczC,EAAQA,QAASA,EAAQf,OA3EzDqC,EADEjD,EAAWqE,aACD,CACV,CAAE/C,KAAMuC,EAAYS,KAAQb,SAAUK,GACtC,CAAExC,KAAMuC,EAAYS,KAAQb,SAAUG,EAAUW,aAChD,CAAEjD,KAAMuC,EAAYW,KAAQf,SAAUG,EAAUa,aAChD,CAAEnD,KAAMuC,EAAYa,GAAQjB,SAAUG,EAAUe,WAChD,CAAErD,KAAMuC,EAAYe,OAAQnB,SAAUG,EAAUe,YAItC,CACV,CAAErD,KAAM,YAAamC,SAAUG,EAAUW,aACzC,CAAEjD,KAAM,YAAamC,SAAUG,EAAUa,aACzC,CAAEnD,KAAM,UAAWmC,SAAUG,EAAUe,WAEvC,CAAErD,KAAM,aAAcmC,SAAUK,GAChC,CAAExC,KAAM,aAAcmC,SAAUG,EAAUW,aAC1C,CAAEjD,KAAM,YAAamC,SAAUG,EAAUa,aACzC,CAAEnD,KAAM,WAAYmC,SAAUG,EAAUe,WACxC,CAAErD,KAAM,cAAemC,SAAUG,EAAUe,YAI/C1B,EAAUf,KAAK,CACbZ,KAAM,OACNmC,SAAU7C,GACR,IAAK,MAAMoB,KAAerB,EAAME,aAAaC,KAC3CkB,EAAY6C,aAAajE,MAM/BD,EAAMY,cAAgB,EAEtBZ,EAAMmE,YAAc,cAA8C1E,EAChE2E,2BACE,OAAOpE,EAAME,aAAakE,qBAG5BA,yBAA0BC,GACxBrE,EAAME,aAAakE,qBAAuBC,EAG5CC,OAAU,OAAOtE,EAAMa,QAGzBb,EAAME,aAAe,CAEnBC,KAAM,GACN8B,IAAoCG,GAClCA,EAAQmC,UAAY,CAACC,EAAMC,IAAQzE,EAAMgC,KAAKwC,EAAMC,GAEpD,MAAMpD,EAAc,IAAIrB,EAAMmE,YAAe/B,GAG7C,OADApC,EAAME,aAAaC,KAAKoB,KAAKF,GACtBA,GAET4B,UAAAA,EACAX,UAAAA,EACA8B,qBAAsB,GAsBxBpE,EAAM0E,UAAU9E,IAqHhBqD,UAAW,CACT0B,qBAAsBF,GAAOvC,OAAAA,EAAYuC,EAAK,QAC9CE,wBAAyBF,GAAOvC,OAAAA,EAAYuC,EAAK,WACjDE,sBAAyBC,aAAAA,GAAgB5E,GAEvC,IAAK,IAAI0B,EAAI1B,EAAME,aAAaC,KAAKwB,OAAS,EAAGD,GAAK,EAAGA,IAAK,CAC5D,MAAML,EAAcrB,EAAME,aAAaC,KAAKuB,GAExCL,EAAYuD,eAAiBA,IAEjCvD,EAAYwD,OACZ7E,EAAMgC,KAAK,uBAAwB,CAAEX,YAAAA,IACrCA,EAAYyD,UAER9E,EAAME,aAAaC,KAAKwB,OAAS,GACnC3B,EAAME,aAAaC,KAAK4E,OAAOrD,EAAG,OAK1CQ,YAAAA,EACApC,iBAAAA,EACAD,YAAAA,kBAGaK", + "sourcesContent": [ + "import browser from '@interactjs/utils/browser'\nimport domObjects from '@interactjs/utils/domObjects'\nimport { nodeContains } from '@interactjs/utils/domUtils'\nimport events from '@interactjs/utils/events'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\nimport InteractionBase from './Interaction'\nimport finder, { SearchDetails } from './interactionFinder'\nimport { Scope } from './scope'\nimport interactablePreventDefault from './interactablePreventDefault'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n Interaction: typeof InteractionBase\n interactions: {\n new: (options: any) => InteractionBase\n list: InteractionBase[]\n listeners: { [type: string]: Interact.Listener }\n docEvents: Array<{ type: string, listener: Interact.Listener }>\n pointerMoveTolerance: number\n }\n prevTouchTime: number\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:find': {\n interaction: InteractionBase\n searchDetails: SearchDetails\n }\n }\n}\n\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer', 'windowBlur',\n]\n\nfunction install (scope: Scope) {\n const listeners = {} as any\n\n for (const method of methodNames) {\n listeners[method] = doOnInteractions(method, scope)\n }\n\n const pEventTypes = browser.pEventTypes\n let docEvents: typeof scope.interactions.docEvents\n\n if (domObjects.PointerEvent) {\n docEvents = [\n { type: pEventTypes.down, listener: releasePointersOnRemovedEls },\n { type: pEventTypes.down, listener: listeners.pointerDown },\n { type: pEventTypes.move, listener: listeners.pointerMove },\n { type: pEventTypes.up, listener: listeners.pointerUp },\n { type: pEventTypes.cancel, listener: listeners.pointerUp },\n ]\n }\n else {\n docEvents = [\n { type: 'mousedown', listener: listeners.pointerDown },\n { type: 'mousemove', listener: listeners.pointerMove },\n { type: 'mouseup', listener: listeners.pointerUp },\n\n { type: 'touchstart', listener: releasePointersOnRemovedEls },\n { type: 'touchstart', listener: listeners.pointerDown },\n { type: 'touchmove', listener: listeners.pointerMove },\n { type: 'touchend', listener: listeners.pointerUp },\n { type: 'touchcancel', listener: listeners.pointerUp },\n ]\n }\n\n docEvents.push({\n type: 'blur',\n listener (event) {\n for (const interaction of scope.interactions.list) {\n interaction.documentBlur(event)\n }\n },\n })\n\n // for ignoring browser's simulated mouse events\n scope.prevTouchTime = 0\n\n scope.Interaction = class extends InteractionBase {\n get pointerMoveTolerance () {\n return scope.interactions.pointerMoveTolerance\n }\n\n set pointerMoveTolerance (value) {\n scope.interactions.pointerMoveTolerance = value\n }\n\n _now () { return scope.now() }\n }\n\n scope.interactions = {\n // all active and idle interactions\n list: [],\n new (options: { pointerType?: string, scopeFire?: Scope['fire'] }) {\n options.scopeFire = (name, arg) => scope.fire(name, arg)\n\n const interaction = new scope.Interaction(options as Required)\n\n scope.interactions.list.push(interaction)\n return interaction\n },\n listeners,\n docEvents,\n pointerMoveTolerance: 1,\n }\n\n function releasePointersOnRemovedEls () {\n // for all inactive touch interactions with pointers down\n for (const interaction of scope.interactions.list) {\n if (!interaction.pointerIsDown ||\n interaction.pointerType !== 'touch' ||\n interaction._interacting) {\n continue\n }\n\n // if a pointer is down on an element that is no longer in the DOM tree\n for (const pointer of interaction.pointers) {\n if (!scope.documents.some(({ doc }) => nodeContains(doc, pointer.downTarget))) {\n // remove the pointer from the interaction\n interaction.removePointer(pointer.pointer, pointer.event)\n }\n }\n }\n }\n\n scope.usePlugin(interactablePreventDefault)\n}\n\nfunction doOnInteractions (method, scope) {\n return function (event) {\n const interactions = scope.interactions.list\n\n const pointerType = pointerUtils.getPointerType(event)\n const [eventTarget, curEventTarget] = pointerUtils.getEventTargets(event)\n const matches = [] // [ [pointer, interaction], ...]\n\n if (/^touch/.test(event.type)) {\n scope.prevTouchTime = scope.now()\n\n for (const changedTouch of event.changedTouches) {\n const pointer = changedTouch\n const pointerId = pointerUtils.getPointerId(pointer)\n const searchDetails: SearchDetails = {\n pointer,\n pointerId,\n pointerType,\n eventType: event.type,\n eventTarget,\n curEventTarget,\n scope,\n }\n const interaction = getInteraction(searchDetails)\n\n matches.push([\n searchDetails.pointer,\n searchDetails.eventTarget,\n searchDetails.curEventTarget,\n interaction,\n ])\n }\n }\n else {\n let invalidPointer = false\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < interactions.length && !invalidPointer; i++) {\n invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer ||\n (scope.now() - scope.prevTouchTime < 500) ||\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n event.timeStamp === 0\n }\n\n if (!invalidPointer) {\n const searchDetails = {\n pointer: event,\n pointerId: pointerUtils.getPointerId(event),\n pointerType,\n eventType: event.type,\n curEventTarget,\n eventTarget,\n scope,\n }\n\n const interaction = getInteraction(searchDetails)\n\n matches.push([\n searchDetails.pointer,\n searchDetails.eventTarget,\n searchDetails.curEventTarget,\n interaction,\n ])\n }\n }\n\n // eslint-disable-next-line no-shadow\n for (const [pointer, eventTarget, curEventTarget, interaction] of matches) {\n interaction[method](pointer, event, eventTarget, curEventTarget)\n }\n }\n}\n\nfunction getInteraction (searchDetails: SearchDetails) {\n const { pointerType, scope } = searchDetails\n\n const foundInteraction = finder.search(searchDetails)\n const signalArg = { interaction: foundInteraction, searchDetails }\n\n scope.fire('interactions:find', signalArg)\n\n return signalArg.interaction || scope.interactions.new({ pointerType })\n}\n\nfunction onDocSignal ({ doc, scope, options }: Interact.SignalArgs[T], eventMethodName: 'add' | 'remove') {\n const { docEvents } = scope.interactions\n const eventMethod = events[eventMethodName]\n\n if (scope.browser.isIOS && !options.events) {\n options.events = { passive: false }\n }\n\n // delegate event listener\n for (const eventType in events.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener)\n eventMethod(doc, eventType, events.delegateUseCapture, true)\n }\n\n const eventOptions = options && options.events\n\n for (const { type, listener } of docEvents) {\n eventMethod(doc, type, listener, eventOptions)\n }\n}\n\nconst interactions: Interact.Plugin = {\n id: 'core/interactions',\n install,\n listeners: {\n 'scope:add-document': arg => onDocSignal(arg, 'add'),\n 'scope:remove-document': arg => onDocSignal(arg, 'remove'),\n 'interactable:unset': ({ interactable }, scope) => {\n // Stop and destroy related interactions when an Interactable is unset\n for (let i = scope.interactions.list.length - 1; i >= 0; i--) {\n const interaction = scope.interactions.list[i]\n\n if (interaction.interactable !== interactable) { continue }\n\n interaction.stop()\n scope.fire('interactions:destroy', { interaction })\n interaction.destroy()\n\n if (scope.interactions.list.length > 2) {\n scope.interactions.list.splice(i, 1)\n }\n }\n },\n },\n onDocSignal,\n doOnInteractions,\n methodNames,\n}\n\nexport default interactions\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/interactions.spec.d.ts b/@interactjs/core/interactions.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/core/interactions.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/core/scope.d.ts b/@interactjs/core/scope.d.ts new file mode 100644 index 000000000..bb1e2a022 --- /dev/null +++ b/@interactjs/core/scope.d.ts @@ -0,0 +1,144 @@ +import * as utils from '@interactjs/utils/index'; +import defaults from './defaultOptions'; +import Eventable from './Eventable'; +import InteractableBase from './Interactable'; +import InteractableSet from './InteractableSet'; +import InteractEvent, { PhaseMap } from './InteractEvent'; +export interface SignalArgs { + 'scope:add-document': DocSignalArg; + 'scope:remove-document': DocSignalArg; + 'interactable:unset': { + interactable: InteractableBase; + }; + 'interactable:set': { + interactable: InteractableBase; + options: Interact.Options; + }; + 'interactions:destroy': { + interaction: Interact.Interaction; + }; +} +export declare type ListenerName = keyof SignalArgs; +export declare type ListenerMap = { + [P in ListenerName]?: (arg: SignalArgs[P], scope: Scope, signalName: P) => void | boolean; +}; +interface DocSignalArg { + doc: Document; + window: Window; + scope: Scope; + options?: { + [index: string]: any; + }; +} +export interface ActionMap { +} +export declare type ActionName = keyof ActionMap; +export interface Actions { + map: ActionMap; + phases: PhaseMap; + methodDict: { + [P in ActionName]?: string; + }; + phaselessTypes: { + [type: string]: true; + }; +} +export declare function createScope(): Scope; +export declare type Defaults = typeof defaults; +export interface Plugin { + [key: string]: any; + id?: string; + listeners?: ListenerMap; + before?: string[]; + install?(scope: Scope, options?: any): void; +} +export declare class Scope { + id: string; + isInitialized: boolean; + listenerMaps: Array<{ + map: ListenerMap; + id: string; + }>; + browser: { + init: (window: any) => void; + supportsTouch: boolean; + supportsPointerEvent: boolean; + isIOS7: boolean; + isIOS: boolean; + isIe9: boolean; + isOperaMobile: boolean; + prefixedMatchesSelector: string; + pEventTypes: { + up: string; + down: string; + over: string; + out: string; + move: string; + cancel: string; + }; + wheelEvent: string; + }; + events: { + add: (element: EventTarget, type: string, listener: (event: Event | import("@interactjs/utils/events").FakeEvent) => any, optionalArg?: any) => void; + remove: (element: EventTarget, type: string, listener?: ((event: Event | import("@interactjs/utils/events").FakeEvent) => any) | "all", optionalArg?: any) => void; + addDelegate: (selector: string, context: Node, type: string, listener: (event: Event | import("@interactjs/utils/events").FakeEvent) => any, optionalArg?: any) => void; + removeDelegate: (selector: string, context: Document | HTMLElement | SVGElement, type: string, listener?: (event: Event | import("@interactjs/utils/events").FakeEvent) => any, optionalArg?: any) => void; + delegateListener: (event: Event, optionalArg?: any) => void; + delegateUseCapture: (event: Event) => any; + delegatedEvents: { + [type: string]: { + selectors: string[]; + contexts: Node[]; + listeners: [(event: Event | import("@interactjs/utils/events").FakeEvent) => any, boolean, boolean][][]; + }; + }; + documents: Document[]; + supportsOptions: boolean; + supportsPassive: boolean; + _elements: EventTarget[]; + _targets: { + events: { + [type: string]: ((event: Event | import("@interactjs/utils/events").FakeEvent) => any)[]; + }; + typeCount: number; + }[]; + init(window: Window): void; + }; + utils: typeof utils; + defaults: Defaults; + Eventable: typeof Eventable; + actions: Actions; + InteractEvent: typeof InteractEvent; + Interactable: typeof InteractableBase; + interactables: InteractableSet; + _win: Window; + document: Document; + window: Window; + documents: Array<{ + doc: Document; + options: any; + }>; + _plugins: { + list: Plugin[]; + map: { + [id: string]: Plugin; + }; + }; + constructor(); + addListeners(map: ListenerMap, id?: string): void; + fire(name: T, arg: SignalArgs[T]): void | false; + onWindowUnload: (event: BeforeUnloadEvent) => void; + init(window: Window): Scope; + pluginIsInstalled(plugin: Plugin): boolean | Plugin; + usePlugin(plugin: Plugin, options?: { + [key: string]: any; + }): this; + addDocument(doc: Document, options?: any): void | false; + removeDocument(doc: Document): void; + getDocIndex(doc: Document): number; + getDocOptions(doc: Document): any; + now(): number; +} +export declare function isNonNativeEvent(type: string, actions: Actions): boolean; +export declare function initScope(scope: Scope, window: Window): Scope; +export {}; diff --git a/@interactjs/core/scope.js b/@interactjs/core/scope.js new file mode 100644 index 000000000..78b448470 --- /dev/null +++ b/@interactjs/core/scope.js @@ -0,0 +1,242 @@ +import domObjects from "../utils/domObjects.js"; +import * as utils from "../utils/index.js"; +import defaults from "./defaultOptions.js"; +import Eventable from "./Eventable.js"; +import InteractableBase from "./Interactable.js"; +import InteractableSet from "./InteractableSet.js"; +import InteractEvent from "./InteractEvent.js"; +import interactions from "./interactions.js"; +const { + win, + browser, + raf, + events +} = utils; // eslint-disable-next-line @typescript-eslint/no-empty-interface + +export function createScope() { + return new Scope(); +} +export class Scope { + // main window + // main document + // main window + // all documents being listened to + constructor() { + this.id = `__interact_scope_${Math.floor(Math.random() * 100)}`; + this.isInitialized = false; + this.listenerMaps = []; + this.browser = browser; + this.events = events; + this.utils = utils; + this.defaults = utils.clone(defaults); + this.Eventable = Eventable; + this.actions = { + map: {}, + phases: { + start: true, + move: true, + end: true + }, + methodDict: {}, + phaselessTypes: {} + }; + this.InteractEvent = InteractEvent; + this.Interactable = void 0; + this.interactables = new InteractableSet(this); + this._win = void 0; + this.document = void 0; + this.window = void 0; + this.documents = []; + this._plugins = { + list: [], + map: {} + }; + + this.onWindowUnload = event => this.removeDocument(event.target); + + const scope = this; + this.Interactable = class extends InteractableBase { + get _defaults() { + return scope.defaults; + } + + set(options) { + super.set(options); + scope.fire('interactable:set', { + options, + interactable: this + }); + return this; + } + + unset() { + super.unset(); + scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1); + scope.fire('interactable:unset', { + interactable: this + }); + } + + }; + } + + addListeners(map, id) { + this.listenerMaps.push({ + id, + map + }); + } + + fire(name, arg) { + for (const { + map: { + [name]: listener + } + } of this.listenerMaps) { + if (!!listener && listener(arg, this, name) === false) { + return false; + } + } + } + + init(window) { + return this.isInitialized ? this : initScope(this, window); + } + + pluginIsInstalled(plugin) { + return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1; + } + + usePlugin(plugin, options) { + if (this.pluginIsInstalled(plugin)) { + return this; + } + + if (plugin.id) { + this._plugins.map[plugin.id] = plugin; + } + + this._plugins.list.push(plugin); + + if (plugin.install) { + plugin.install(this, options); + } + + if (plugin.listeners && plugin.before) { + let index = 0; + const len = this.listenerMaps.length; + const before = plugin.before.reduce((acc, id) => { + acc[id] = true; + return acc; + }, {}); + + for (; index < len; index++) { + const otherId = this.listenerMaps[index].id; + + if (before[otherId]) { + break; + } + } + + this.listenerMaps.splice(index, 0, { + id: plugin.id, + map: plugin.listeners + }); + } else if (plugin.listeners) { + this.listenerMaps.push({ + id: plugin.id, + map: plugin.listeners + }); + } + + return this; + } + + addDocument(doc, options) { + // do nothing if document is already known + if (this.getDocIndex(doc) !== -1) { + return false; + } + + const window = win.getWindow(doc); + options = options ? utils.extend({}, options) : {}; + this.documents.push({ + doc, + options + }); + events.documents.push(doc); // don't add an unload event for the main document + // so that the page may be cached in browser history + + if (doc !== this.document) { + events.add(window, 'unload', this.onWindowUnload); + } + + this.fire('scope:add-document', { + doc, + window, + scope: this, + options + }); + } + + removeDocument(doc) { + const index = this.getDocIndex(doc); + const window = win.getWindow(doc); + const options = this.documents[index].options; + events.remove(window, 'unload', this.onWindowUnload); + this.documents.splice(index, 1); + events.documents.splice(index, 1); + this.fire('scope:remove-document', { + doc, + window, + scope: this, + options + }); + } + + getDocIndex(doc) { + for (let i = 0; i < this.documents.length; i++) { + if (this.documents[i].doc === doc) { + return i; + } + } + + return -1; + } + + getDocOptions(doc) { + const docIndex = this.getDocIndex(doc); + return docIndex === -1 ? null : this.documents[docIndex].options; + } + + now() { + return (this.window.Date || Date).now(); + } + +} +export function isNonNativeEvent(type, actions) { + if (actions.phaselessTypes[type]) { + return true; + } + + for (const name in actions.map) { + if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) { + return true; + } + } + + return false; +} +export function initScope(scope, window) { + scope.isInitialized = true; + win.init(window); + domObjects.init(window); + browser.init(window); + raf.init(window); + events.init(window); + scope.usePlugin(interactions); + scope.document = window.document; + scope.window = window; + return scope; +} +//# sourceMappingURL=scope.js.map \ No newline at end of file diff --git a/@interactjs/core/scope.js.map b/@interactjs/core/scope.js.map new file mode 100644 index 000000000..d3d73f83d --- /dev/null +++ b/@interactjs/core/scope.js.map @@ -0,0 +1,97 @@ +{ + "version": 3, + "sources": [ + "scope.ts" + ], + "names": [ + "domObjects", + "utils", + "defaults", + "Eventable", + "InteractableBase", + "InteractableSet", + "InteractEvent", + "interactions", + "win", + "browser", + "raf", + "events", + "createScope", + "Scope", + "constructor", + "id", + "Math", + "floor", + "random", + "isInitialized", + "listenerMaps", + "clone", + "actions", + "map", + "phases", + "start", + "move", + "end", + "methodDict", + "phaselessTypes", + "Interactable", + "interactables", + "_win", + "document", + "window", + "documents", + "_plugins", + "list", + "onWindowUnload", + "event", + "removeDocument", + "target", + "scope", + "_defaults", + "set", + "options", + "fire", + "interactable", + "unset", + "splice", + "indexOf", + "addListeners", + "push", + "name", + "arg", + "listener", + "init", + "initScope", + "pluginIsInstalled", + "plugin", + "usePlugin", + "install", + "listeners", + "before", + "index", + "len", + "length", + "reduce", + "acc", + "otherId", + "addDocument", + "doc", + "getDocIndex", + "getWindow", + "extend", + "add", + "remove", + "i", + "getDocOptions", + "docIndex", + "now", + "Date", + "isNonNativeEvent", + "type", + "substr" + ], + "mappings": "AAAA,OAAOA,UAAP,MAAuB,wBAAvB;AACA,OAAO,KAAKC,KAAZ,MAAuB,mBAAvB;AACA,OAAOC,QAAP,MAAqB,qBAArB;AACA,OAAOC,SAAP,MAAsB,gBAAtB;AACA,OAAOC,gBAAP,MAA6B,mBAA7B;AACA,OAAOC,eAAP,MAA4B,sBAA5B;AACA,OAAOC,aAAP,MAAwC,oBAAxC;AACA,OAAOC,YAAP,MAAyB,mBAAzB;AAuBA,MAAM;AACJC,EAAAA,GADI;AAEJC,EAAAA,OAFI;AAGJC,EAAAA,GAHI;AAIJC,EAAAA;AAJI,IAKFV,KALJ,C,CAOA;;AAaA,OAAO,SAASW,WAAT,GAAwB;AAC7B,SAAO,IAAIC,KAAJ,EAAP;AACD;AAYD,OAAO,MAAMA,KAAN,CAAY;AA4BjB;AAGA;AAGA;AAGA;AAWAC,EAAAA,WAAW,GAAI;AAAA,SA/CfC,EA+Ce,GA/CT,oBAAmBC,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,KAAgB,GAA3B,CAAgC,EA+C1C;AAAA,SA9CfC,aA8Ce,GA9CC,KA8CD;AAAA,SA7CfC,YA6Ce,GA1CV,EA0CU;AAAA,SAxCfX,OAwCe,GAxCLA,OAwCK;AAAA,SAvCfE,MAuCe,GAvCNA,MAuCM;AAAA,SAtCfV,KAsCe,GAtCPA,KAsCO;AAAA,SArCfC,QAqCe,GArCMD,KAAK,CAACoB,KAAN,CAAYnB,QAAZ,CAqCN;AAAA,SApCfC,SAoCe,GApCHA,SAoCG;AAAA,SAnCfmB,OAmCe,GAnCI;AACjBC,MAAAA,GAAG,EAAE,EADY;AAEjBC,MAAAA,MAAM,EAAE;AACNC,QAAAA,KAAK,EAAE,IADD;AAENC,QAAAA,IAAI,EAAE,IAFA;AAGNC,QAAAA,GAAG,EAAE;AAHC,OAFS;AAOjBC,MAAAA,UAAU,EAAE,EAPK;AAQjBC,MAAAA,cAAc,EAAE;AARC,KAmCJ;AAAA,SAxBfvB,aAwBe,GAxBCA,aAwBD;AAAA,SAvBfwB,YAuBe;AAAA,SAtBfC,aAsBe,GAtBC,IAAI1B,eAAJ,CAAoB,IAApB,CAsBD;AAAA,SAnBf2B,IAmBe;AAAA,SAhBfC,QAgBe;AAAA,SAbfC,MAae;AAAA,SAVfC,SAUe,GAVqC,EAUrC;AAAA,SARfC,QAQe,GALX;AACFC,MAAAA,IAAI,EAAE,EADJ;AAEFd,MAAAA,GAAG,EAAE;AAFH,KAKW;;AAAA,SAsCfe,cAtCe,GAsCGC,KAAD,IAA8B,KAAKC,cAAL,CAAoBD,KAAK,CAACE,MAA1B,CAtChC;;AACb,UAAMC,KAAK,GAAG,IAAd;AAEA,SAAKZ,YAAL,GAAoB,cAAc1B,gBAAd,CAA+B;AACjD,UAAIuC,SAAJ,GAAiB;AAAE,eAAOD,KAAK,CAACxC,QAAb;AAAuB;;AAE1C0C,MAAAA,GAAG,CAAEC,OAAF,EAA6B;AAC9B,cAAMD,GAAN,CAAUC,OAAV;AAEAH,QAAAA,KAAK,CAACI,IAAN,CAAW,kBAAX,EAA+B;AAC7BD,UAAAA,OAD6B;AAE7BE,UAAAA,YAAY,EAAE;AAFe,SAA/B;AAKA,eAAO,IAAP;AACD;;AAEDC,MAAAA,KAAK,GAAI;AACP,cAAMA,KAAN;AACAN,QAAAA,KAAK,CAACX,aAAN,CAAoBM,IAApB,CAAyBY,MAAzB,CAAgCP,KAAK,CAACX,aAAN,CAAoBM,IAApB,CAAyBa,OAAzB,CAAiC,IAAjC,CAAhC,EAAwE,CAAxE;AAEAR,QAAAA,KAAK,CAACI,IAAN,CAAW,oBAAX,EAAiC;AAAEC,UAAAA,YAAY,EAAE;AAAhB,SAAjC;AACD;;AAnBgD,KAAnD;AAqBD;;AAEDI,EAAAA,YAAY,CAAE5B,GAAF,EAAoBR,EAApB,EAAiC;AAC3C,SAAKK,YAAL,CAAkBgC,IAAlB,CAAuB;AAAErC,MAAAA,EAAF;AAAMQ,MAAAA;AAAN,KAAvB;AACD;;AAEDuB,EAAAA,IAAI,CAA0BO,IAA1B,EAAmCC,GAAnC,EAAqE;AACvE,SAAK,MAAM;AAAE/B,MAAAA,GAAG,EAAE;AAAE,SAAC8B,IAAD,GAAQE;AAAV;AAAP,KAAX,IAA4C,KAAKnC,YAAjD,EAA+D;AAC7D,UAAI,CAAC,CAACmC,QAAF,IAAcA,QAAQ,CAACD,GAAD,EAAa,IAAb,EAAmBD,IAAnB,CAAR,KAA8C,KAAhE,EAAuE;AACrE,eAAO,KAAP;AACD;AACF;AACF;;AAIDG,EAAAA,IAAI,CAAEtB,MAAF,EAAkB;AACpB,WAAO,KAAKf,aAAL,GACH,IADG,GAEHsC,SAAS,CAAC,IAAD,EAAOvB,MAAP,CAFb;AAGD;;AAEDwB,EAAAA,iBAAiB,CAAEC,MAAF,EAAkB;AACjC,WAAO,KAAKvB,QAAL,CAAcb,GAAd,CAAkBoC,MAAM,CAAC5C,EAAzB,KAAgC,KAAKqB,QAAL,CAAcC,IAAd,CAAmBa,OAAnB,CAA2BS,MAA3B,MAAuC,CAAC,CAA/E;AACD;;AAEDC,EAAAA,SAAS,CAAED,MAAF,EAAkBd,OAAlB,EAAoD;AAC3D,QAAI,KAAKa,iBAAL,CAAuBC,MAAvB,CAAJ,EAAoC;AAClC,aAAO,IAAP;AACD;;AAED,QAAIA,MAAM,CAAC5C,EAAX,EAAe;AAAE,WAAKqB,QAAL,CAAcb,GAAd,CAAkBoC,MAAM,CAAC5C,EAAzB,IAA+B4C,MAA/B;AAAuC;;AACxD,SAAKvB,QAAL,CAAcC,IAAd,CAAmBe,IAAnB,CAAwBO,MAAxB;;AAEA,QAAIA,MAAM,CAACE,OAAX,EAAoB;AAClBF,MAAAA,MAAM,CAACE,OAAP,CAAe,IAAf,EAAqBhB,OAArB;AACD;;AAED,QAAIc,MAAM,CAACG,SAAP,IAAoBH,MAAM,CAACI,MAA/B,EAAuC;AACrC,UAAIC,KAAK,GAAG,CAAZ;AACA,YAAMC,GAAG,GAAG,KAAK7C,YAAL,CAAkB8C,MAA9B;AACA,YAAMH,MAAM,GAAGJ,MAAM,CAACI,MAAP,CAAcI,MAAd,CAAqB,CAACC,GAAD,EAAMrD,EAAN,KAAa;AAC/CqD,QAAAA,GAAG,CAACrD,EAAD,CAAH,GAAU,IAAV;AACA,eAAOqD,GAAP;AACD,OAHc,EAGZ,EAHY,CAAf;;AAKA,aAAOJ,KAAK,GAAGC,GAAf,EAAoBD,KAAK,EAAzB,EAA6B;AAC3B,cAAMK,OAAO,GAAG,KAAKjD,YAAL,CAAkB4C,KAAlB,EAAyBjD,EAAzC;;AAEA,YAAIgD,MAAM,CAACM,OAAD,CAAV,EAAqB;AAAE;AAAO;AAC/B;;AAED,WAAKjD,YAAL,CAAkB6B,MAAlB,CAAyBe,KAAzB,EAAgC,CAAhC,EAAmC;AAAEjD,QAAAA,EAAE,EAAE4C,MAAM,CAAC5C,EAAb;AAAiBQ,QAAAA,GAAG,EAAEoC,MAAM,CAACG;AAA7B,OAAnC;AACD,KAfD,MAgBK,IAAIH,MAAM,CAACG,SAAX,EAAsB;AACzB,WAAK1C,YAAL,CAAkBgC,IAAlB,CAAuB;AAAErC,QAAAA,EAAE,EAAE4C,MAAM,CAAC5C,EAAb;AAAiBQ,QAAAA,GAAG,EAAEoC,MAAM,CAACG;AAA7B,OAAvB;AACD;;AAED,WAAO,IAAP;AACD;;AAEDQ,EAAAA,WAAW,CAAEC,GAAF,EAAiB1B,OAAjB,EAA8C;AACvD;AACA,QAAI,KAAK2B,WAAL,CAAiBD,GAAjB,MAA0B,CAAC,CAA/B,EAAkC;AAAE,aAAO,KAAP;AAAc;;AAElD,UAAMrC,MAAM,GAAG1B,GAAG,CAACiE,SAAJ,CAAcF,GAAd,CAAf;AAEA1B,IAAAA,OAAO,GAAGA,OAAO,GAAG5C,KAAK,CAACyE,MAAN,CAAa,EAAb,EAAiB7B,OAAjB,CAAH,GAA+B,EAAhD;AAEA,SAAKV,SAAL,CAAeiB,IAAf,CAAoB;AAAEmB,MAAAA,GAAF;AAAO1B,MAAAA;AAAP,KAApB;AACAlC,IAAAA,MAAM,CAACwB,SAAP,CAAiBiB,IAAjB,CAAsBmB,GAAtB,EATuD,CAWvD;AACA;;AACA,QAAIA,GAAG,KAAK,KAAKtC,QAAjB,EAA2B;AACzBtB,MAAAA,MAAM,CAACgE,GAAP,CAAWzC,MAAX,EAAmB,QAAnB,EAA6B,KAAKI,cAAlC;AACD;;AAED,SAAKQ,IAAL,CAAU,oBAAV,EAAgC;AAAEyB,MAAAA,GAAF;AAAOrC,MAAAA,MAAP;AAAeQ,MAAAA,KAAK,EAAE,IAAtB;AAA4BG,MAAAA;AAA5B,KAAhC;AACD;;AAEDL,EAAAA,cAAc,CAAE+B,GAAF,EAAiB;AAC7B,UAAMP,KAAK,GAAG,KAAKQ,WAAL,CAAiBD,GAAjB,CAAd;AAEA,UAAMrC,MAAM,GAAG1B,GAAG,CAACiE,SAAJ,CAAcF,GAAd,CAAf;AACA,UAAM1B,OAAO,GAAG,KAAKV,SAAL,CAAe6B,KAAf,EAAsBnB,OAAtC;AAEAlC,IAAAA,MAAM,CAACiE,MAAP,CAAc1C,MAAd,EAAsB,QAAtB,EAAgC,KAAKI,cAArC;AAEA,SAAKH,SAAL,CAAec,MAAf,CAAsBe,KAAtB,EAA6B,CAA7B;AACArD,IAAAA,MAAM,CAACwB,SAAP,CAAiBc,MAAjB,CAAwBe,KAAxB,EAA+B,CAA/B;AAEA,SAAKlB,IAAL,CAAU,uBAAV,EAAmC;AAAEyB,MAAAA,GAAF;AAAOrC,MAAAA,MAAP;AAAeQ,MAAAA,KAAK,EAAE,IAAtB;AAA4BG,MAAAA;AAA5B,KAAnC;AACD;;AAED2B,EAAAA,WAAW,CAAED,GAAF,EAAiB;AAC1B,SAAK,IAAIM,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAK1C,SAAL,CAAe+B,MAAnC,EAA2CW,CAAC,EAA5C,EAAgD;AAC9C,UAAI,KAAK1C,SAAL,CAAe0C,CAAf,EAAkBN,GAAlB,KAA0BA,GAA9B,EAAmC;AACjC,eAAOM,CAAP;AACD;AACF;;AAED,WAAO,CAAC,CAAR;AACD;;AAEDC,EAAAA,aAAa,CAAEP,GAAF,EAAiB;AAC5B,UAAMQ,QAAQ,GAAG,KAAKP,WAAL,CAAiBD,GAAjB,CAAjB;AAEA,WAAOQ,QAAQ,KAAK,CAAC,CAAd,GAAkB,IAAlB,GAAyB,KAAK5C,SAAL,CAAe4C,QAAf,EAAyBlC,OAAzD;AACD;;AAEDmC,EAAAA,GAAG,GAAI;AACL,WAAO,CAAE,KAAK9C,MAAN,CAAqB+C,IAArB,IAA4CA,IAA7C,EAAmDD,GAAnD,EAAP;AACD;;AAzLgB;AA4LnB,OAAO,SAASE,gBAAT,CAA2BC,IAA3B,EAAyC7D,OAAzC,EAA2D;AAChE,MAAIA,OAAO,CAACO,cAAR,CAAuBsD,IAAvB,CAAJ,EAAkC;AAAE,WAAO,IAAP;AAAa;;AAEjD,OAAK,MAAM9B,IAAX,IAAmB/B,OAAO,CAACC,GAA3B,EAAgC;AAC9B,QAAI4D,IAAI,CAACjC,OAAL,CAAaG,IAAb,MAAuB,CAAvB,IAA4B8B,IAAI,CAACC,MAAL,CAAY/B,IAAI,CAACa,MAAjB,KAA4B5C,OAAO,CAACE,MAApE,EAA4E;AAC1E,aAAO,IAAP;AACD;AACF;;AAED,SAAO,KAAP;AACD;AAED,OAAO,SAASiC,SAAT,CAAoBf,KAApB,EAAkCR,MAAlC,EAAkD;AACvDQ,EAAAA,KAAK,CAACvB,aAAN,GAAsB,IAAtB;AACAX,EAAAA,GAAG,CAACgD,IAAJ,CAAStB,MAAT;AACAlC,EAAAA,UAAU,CAACwD,IAAX,CAAgBtB,MAAhB;AACAzB,EAAAA,OAAO,CAAC+C,IAAR,CAAatB,MAAb;AACAxB,EAAAA,GAAG,CAAC8C,IAAJ,CAAStB,MAAT;AACAvB,EAAAA,MAAM,CAAC6C,IAAP,CAAYtB,MAAZ;AAEAQ,EAAAA,KAAK,CAACkB,SAAN,CAAgBrD,YAAhB;AACAmC,EAAAA,KAAK,CAACT,QAAN,GAAiBC,MAAM,CAACD,QAAxB;AACAS,EAAAA,KAAK,CAACR,MAAN,GAAeA,MAAf;AAEA,SAAOQ,KAAP;AACD", + "sourcesContent": [ + "import domObjects from '@interactjs/utils/domObjects'\nimport * as utils from '@interactjs/utils/index'\nimport defaults from './defaultOptions'\nimport Eventable from './Eventable'\nimport InteractableBase from './Interactable'\nimport InteractableSet from './InteractableSet'\nimport InteractEvent, { PhaseMap } from './InteractEvent'\nimport interactions from './interactions'\n\nexport interface SignalArgs {\n 'scope:add-document': DocSignalArg\n 'scope:remove-document': DocSignalArg\n 'interactable:unset': { interactable: InteractableBase }\n 'interactable:set': { interactable: InteractableBase, options: Interact.Options }\n 'interactions:destroy': { interaction: Interact.Interaction }\n}\n\nexport type ListenerName = keyof SignalArgs\n\nexport type ListenerMap = {\n [P in ListenerName]?: (arg: SignalArgs[P], scope: Scope, signalName: P) => void | boolean\n}\n\ninterface DocSignalArg {\n doc: Document\n window: Window\n scope: Scope\n options?: { [index: string]: any }\n}\n\nconst {\n win,\n browser,\n raf,\n events,\n} = utils\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ActionMap { // tslint:disable-line no-empty-interface\n}\n\nexport type ActionName = keyof ActionMap\n\nexport interface Actions {\n map: ActionMap\n phases: PhaseMap\n methodDict: { [P in ActionName]?: string }\n phaselessTypes: { [type: string]: true }\n}\n\nexport function createScope () {\n return new Scope()\n}\n\nexport type Defaults = typeof defaults\n\nexport interface Plugin {\n [key: string]: any\n id?: string\n listeners?: ListenerMap\n before?: string[]\n install? (scope: Scope, options?: any): void\n}\n\nexport class Scope {\n id = `__interact_scope_${Math.floor(Math.random() * 100)}`\n isInitialized = false\n listenerMaps: Array<{\n map: ListenerMap\n id: string\n }> = []\n\n browser = browser\n events = events\n utils = utils\n defaults: Defaults = utils.clone(defaults) as Defaults\n Eventable = Eventable\n actions: Actions = {\n map: {},\n phases: {\n start: true,\n move: true,\n end: true,\n },\n methodDict: {},\n phaselessTypes: {},\n }\n\n InteractEvent = InteractEvent\n Interactable!: typeof InteractableBase\n interactables = new InteractableSet(this)\n\n // main window\n _win!: Window\n\n // main document\n document!: Document\n\n // main window\n window!: Window\n\n // all documents being listened to\n documents: Array<{ doc: Document, options: any }> = []\n\n _plugins: {\n list: Plugin[]\n map: { [id: string]: Plugin }\n } = {\n list: [],\n map: {},\n }\n\n constructor () {\n const scope = this\n\n this.Interactable = class extends InteractableBase {\n get _defaults () { return scope.defaults }\n\n set (options: Interact.Options) {\n super.set(options)\n\n scope.fire('interactable:set', {\n options,\n interactable: this,\n })\n\n return this\n }\n\n unset () {\n super.unset()\n scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1)\n\n scope.fire('interactable:unset', { interactable: this })\n }\n }\n }\n\n addListeners (map: ListenerMap, id?: string) {\n this.listenerMaps.push({ id, map })\n }\n\n fire (name: T, arg: SignalArgs[T]): void | false {\n for (const { map: { [name]: listener } } of this.listenerMaps) {\n if (!!listener && listener(arg as any, this, name as never) === false) {\n return false\n }\n }\n }\n\n onWindowUnload = (event: BeforeUnloadEvent) => this.removeDocument(event.target as Document)\n\n init (window: Window) {\n return this.isInitialized\n ? this\n : initScope(this, window)\n }\n\n pluginIsInstalled (plugin: Plugin) {\n return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1\n }\n\n usePlugin (plugin: Plugin, options?: { [key: string]: any }) {\n if (this.pluginIsInstalled(plugin)) {\n return this\n }\n\n if (plugin.id) { this._plugins.map[plugin.id] = plugin }\n this._plugins.list.push(plugin)\n\n if (plugin.install) {\n plugin.install(this, options)\n }\n\n if (plugin.listeners && plugin.before) {\n let index = 0\n const len = this.listenerMaps.length\n const before = plugin.before.reduce((acc, id) => {\n acc[id] = true\n return acc\n }, {})\n\n for (; index < len; index++) {\n const otherId = this.listenerMaps[index].id\n\n if (before[otherId]) { break }\n }\n\n this.listenerMaps.splice(index, 0, { id: plugin.id, map: plugin.listeners })\n }\n else if (plugin.listeners) {\n this.listenerMaps.push({ id: plugin.id, map: plugin.listeners })\n }\n\n return this\n }\n\n addDocument (doc: Document, options?: any): void | false {\n // do nothing if document is already known\n if (this.getDocIndex(doc) !== -1) { return false }\n\n const window = win.getWindow(doc)\n\n options = options ? utils.extend({}, options) : {}\n\n this.documents.push({ doc, options })\n events.documents.push(doc)\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== this.document) {\n events.add(window, 'unload', this.onWindowUnload)\n }\n\n this.fire('scope:add-document', { doc, window, scope: this, options })\n }\n\n removeDocument (doc: Document) {\n const index = this.getDocIndex(doc)\n\n const window = win.getWindow(doc)\n const options = this.documents[index].options\n\n events.remove(window, 'unload', this.onWindowUnload)\n\n this.documents.splice(index, 1)\n events.documents.splice(index, 1)\n\n this.fire('scope:remove-document', { doc, window, scope: this, options })\n }\n\n getDocIndex (doc: Document) {\n for (let i = 0; i < this.documents.length; i++) {\n if (this.documents[i].doc === doc) {\n return i\n }\n }\n\n return -1\n }\n\n getDocOptions (doc: Document) {\n const docIndex = this.getDocIndex(doc)\n\n return docIndex === -1 ? null : this.documents[docIndex].options\n }\n\n now () {\n return ((this.window as any).Date as typeof Date || Date).now()\n }\n}\n\nexport function isNonNativeEvent (type: string, actions: Actions) {\n if (actions.phaselessTypes[type]) { return true }\n\n for (const name in actions.map) {\n if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) {\n return true\n }\n }\n\n return false\n}\n\nexport function initScope (scope: Scope, window: Window) {\n scope.isInitialized = true\n win.init(window)\n domObjects.init(window)\n browser.init(window)\n raf.init(window)\n events.init(window)\n\n scope.usePlugin(interactions)\n scope.document = window.document\n scope.window = window\n\n return scope\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/scope.min.js b/@interactjs/core/scope.min.js new file mode 100644 index 000000000..f95442dff --- /dev/null +++ b/@interactjs/core/scope.min.js @@ -0,0 +1,2 @@ +import t from"../utils/domObjects.min.js";import*as i from"../utils/index.min.js";import e from"./defaultOptions.min.js";import s from"./Eventable.min.js";import n from"./Interactable.min.js";import o from"./InteractableSet.min.js";import r from"./InteractEvent.min.js";import a from"./interactions.min.js";const{win:d,browser:l,raf:c,events:h}=i;export function createScope(){return new Scope}export class Scope{constructor(){this.id=`__interact_scope_${Math.floor(100*Math.random())}`,this.isInitialized=!1,this.listenerMaps=[],this.browser=l,this.events=h,this.utils=i,this.defaults=i.clone(e),this.Eventable=s,this.actions={map:{},phases:{start:!0,move:!0,end:!0},methodDict:{},phaselessTypes:{}},this.InteractEvent=r,this.Interactable=void 0,this.interactables=new o(this),this._win=void 0,this.document=void 0,this.window=void 0,this.documents=[],this._plugins={list:[],map:{}},this.onWindowUnload=t=>this.removeDocument(t.target);const t=this;this.Interactable=class extends n{get _defaults(){return t.defaults}set(i){return super.set(i),t.fire("interactable:set",{options:i,interactable:this}),this}unset(){super.unset(),t.interactables.list.splice(t.interactables.list.indexOf(this),1),t.fire("interactable:unset",{interactable:this})}}}addListeners(t,i){this.listenerMaps.push({id:i,map:t})}fire(t,i){for(const{map:{[t]:e}}of this.listenerMaps)if(e&&!1===e(i,this,t))return!1}init(t){return this.isInitialized?this:initScope(this,t)}pluginIsInstalled(t){return this._plugins.map[t.id]||-1!==this._plugins.list.indexOf(t)}usePlugin(t,i){if(this.pluginIsInstalled(t))return this;if(t.id&&(this._plugins.map[t.id]=t),this._plugins.list.push(t),t.install&&t.install(this,i),t.listeners&&t.before){let i=0;const e=this.listenerMaps.length,s=t.before.reduce((t,i)=>(t[i]=!0,t),{});for(;i void | boolean\n}\n\ninterface DocSignalArg {\n doc: Document\n window: Window\n scope: Scope\n options?: { [index: string]: any }\n}\n\nconst {\n win,\n browser,\n raf,\n events,\n} = utils\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ActionMap { // tslint:disable-line no-empty-interface\n}\n\nexport type ActionName = keyof ActionMap\n\nexport interface Actions {\n map: ActionMap\n phases: PhaseMap\n methodDict: { [P in ActionName]?: string }\n phaselessTypes: { [type: string]: true }\n}\n\nexport function createScope () {\n return new Scope()\n}\n\nexport type Defaults = typeof defaults\n\nexport interface Plugin {\n [key: string]: any\n id?: string\n listeners?: ListenerMap\n before?: string[]\n install? (scope: Scope, options?: any): void\n}\n\nexport class Scope {\n id = `__interact_scope_${Math.floor(Math.random() * 100)}`\n isInitialized = false\n listenerMaps: Array<{\n map: ListenerMap\n id: string\n }> = []\n\n browser = browser\n events = events\n utils = utils\n defaults: Defaults = utils.clone(defaults) as Defaults\n Eventable = Eventable\n actions: Actions = {\n map: {},\n phases: {\n start: true,\n move: true,\n end: true,\n },\n methodDict: {},\n phaselessTypes: {},\n }\n\n InteractEvent = InteractEvent\n Interactable!: typeof InteractableBase\n interactables = new InteractableSet(this)\n\n // main window\n _win!: Window\n\n // main document\n document!: Document\n\n // main window\n window!: Window\n\n // all documents being listened to\n documents: Array<{ doc: Document, options: any }> = []\n\n _plugins: {\n list: Plugin[]\n map: { [id: string]: Plugin }\n } = {\n list: [],\n map: {},\n }\n\n constructor () {\n const scope = this\n\n this.Interactable = class extends InteractableBase {\n get _defaults () { return scope.defaults }\n\n set (options: Interact.Options) {\n super.set(options)\n\n scope.fire('interactable:set', {\n options,\n interactable: this,\n })\n\n return this\n }\n\n unset () {\n super.unset()\n scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1)\n\n scope.fire('interactable:unset', { interactable: this })\n }\n }\n }\n\n addListeners (map: ListenerMap, id?: string) {\n this.listenerMaps.push({ id, map })\n }\n\n fire (name: T, arg: SignalArgs[T]): void | false {\n for (const { map: { [name]: listener } } of this.listenerMaps) {\n if (!!listener && listener(arg as any, this, name as never) === false) {\n return false\n }\n }\n }\n\n onWindowUnload = (event: BeforeUnloadEvent) => this.removeDocument(event.target as Document)\n\n init (window: Window) {\n return this.isInitialized\n ? this\n : initScope(this, window)\n }\n\n pluginIsInstalled (plugin: Plugin) {\n return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1\n }\n\n usePlugin (plugin: Plugin, options?: { [key: string]: any }) {\n if (this.pluginIsInstalled(plugin)) {\n return this\n }\n\n if (plugin.id) { this._plugins.map[plugin.id] = plugin }\n this._plugins.list.push(plugin)\n\n if (plugin.install) {\n plugin.install(this, options)\n }\n\n if (plugin.listeners && plugin.before) {\n let index = 0\n const len = this.listenerMaps.length\n const before = plugin.before.reduce((acc, id) => {\n acc[id] = true\n return acc\n }, {})\n\n for (; index < len; index++) {\n const otherId = this.listenerMaps[index].id\n\n if (before[otherId]) { break }\n }\n\n this.listenerMaps.splice(index, 0, { id: plugin.id, map: plugin.listeners })\n }\n else if (plugin.listeners) {\n this.listenerMaps.push({ id: plugin.id, map: plugin.listeners })\n }\n\n return this\n }\n\n addDocument (doc: Document, options?: any): void | false {\n // do nothing if document is already known\n if (this.getDocIndex(doc) !== -1) { return false }\n\n const window = win.getWindow(doc)\n\n options = options ? utils.extend({}, options) : {}\n\n this.documents.push({ doc, options })\n events.documents.push(doc)\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== this.document) {\n events.add(window, 'unload', this.onWindowUnload)\n }\n\n this.fire('scope:add-document', { doc, window, scope: this, options })\n }\n\n removeDocument (doc: Document) {\n const index = this.getDocIndex(doc)\n\n const window = win.getWindow(doc)\n const options = this.documents[index].options\n\n events.remove(window, 'unload', this.onWindowUnload)\n\n this.documents.splice(index, 1)\n events.documents.splice(index, 1)\n\n this.fire('scope:remove-document', { doc, window, scope: this, options })\n }\n\n getDocIndex (doc: Document) {\n for (let i = 0; i < this.documents.length; i++) {\n if (this.documents[i].doc === doc) {\n return i\n }\n }\n\n return -1\n }\n\n getDocOptions (doc: Document) {\n const docIndex = this.getDocIndex(doc)\n\n return docIndex === -1 ? null : this.documents[docIndex].options\n }\n\n now () {\n return ((this.window as any).Date as typeof Date || Date).now()\n }\n}\n\nexport function isNonNativeEvent (type: string, actions: Actions) {\n if (actions.phaselessTypes[type]) { return true }\n\n for (const name in actions.map) {\n if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) {\n return true\n }\n }\n\n return false\n}\n\nexport function initScope (scope: Scope, window: Window) {\n scope.isInitialized = true\n win.init(window)\n domObjects.init(window)\n browser.init(window)\n raf.init(window)\n events.init(window)\n\n scope.usePlugin(interactions)\n scope.document = window.document\n scope.window = window\n\n return scope\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/core/scope.spec.d.ts b/@interactjs/core/scope.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/core/scope.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/dev-tools/.npmignore b/@interactjs/dev-tools/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/dev-tools/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/dev-tools/LICENSE b/@interactjs/dev-tools/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/dev-tools/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/dev-tools/devTools.spec.d.ts b/@interactjs/dev-tools/devTools.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/dev-tools/devTools.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/dev-tools/index.d.ts b/@interactjs/dev-tools/index.d.ts new file mode 100644 index 000000000..7e7facca7 --- /dev/null +++ b/@interactjs/dev-tools/index.d.ts @@ -0,0 +1,38 @@ +declare module '@interactjs/core/scope' { + interface Scope { + logger: Logger; + } +} +declare module '@interactjs/core/defaultOptions' { + interface BaseDefaults { + devTools?: DevToolsOptions; + } +} +declare module '@interactjs/core/Interactable' { + interface Interactable { + devTools?: Interact.OptionMethod; + } +} +export interface DevToolsOptions { + ignore: { + [P in keyof typeof CheckName]?: boolean; + }; +} +export interface Logger { + warn: (...args: any[]) => void; + error: (...args: any[]) => void; + log: (...args: any[]) => void; +} +export interface Check { + name: CheckName; + text: string; + perform: (interaction: Interact.Interaction) => boolean; + getInfo: (interaction: Interact.Interaction) => any[]; +} +declare enum CheckName { + touchAction = "touchAction", + boxSizing = "boxSizing", + noListeners = "noListeners" +} +declare const defaultExport: Interact.Plugin; +export default defaultExport; diff --git a/@interactjs/dev-tools/index.js b/@interactjs/dev-tools/index.js new file mode 100644 index 000000000..9371a07e9 --- /dev/null +++ b/@interactjs/dev-tools/index.js @@ -0,0 +1,140 @@ +/* eslint-disable no-console */ + +/* global process */ +import domObjects from "../utils/domObjects.js"; +import { parentNode } from "../utils/domUtils.js"; +import extend from "../utils/extend.js"; +import * as is from "../utils/is.js"; +import win from "../utils/window.js"; +var CheckName; + +(function (CheckName) { + CheckName["touchAction"] = "touchAction"; + CheckName["boxSizing"] = "boxSizing"; + CheckName["noListeners"] = "noListeners"; +})(CheckName || (CheckName = {})); + +const prefix = '[interact.js] '; +const links = { + touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action', + boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing' +}; +const isProduction = "development" === 'production'; // eslint-disable-next-line no-restricted-syntax + +function install(scope, { + logger +} = {}) { + const { + Interactable, + defaults + } = scope; + scope.logger = logger || console; + defaults.base.devTools = { + ignore: {} + }; + + Interactable.prototype.devTools = function (options) { + if (options) { + extend(this.options.devTools, options); + return this; + } + + return this.options.devTools; + }; +} + +const checks = [{ + name: CheckName.touchAction, + + perform({ + element + }) { + return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/); + }, + + getInfo({ + element + }) { + return [element, links.touchAction]; + }, + + text: 'Consider adding CSS "touch-action: none" to this element\n' +}, { + name: CheckName.boxSizing, + + perform(interaction) { + const { + element + } = interaction; + return interaction.prepared.name === 'resize' && element instanceof domObjects.HTMLElement && !hasStyle(element, 'boxSizing', /border-box/); + }, + + text: 'Consider adding CSS "box-sizing: border-box" to this resizable element', + + getInfo({ + element + }) { + return [element, links.boxSizing]; + } + +}, { + name: CheckName.noListeners, + + perform(interaction) { + const actionName = interaction.prepared.name; + const moveListeners = interaction.interactable.events.types[`${actionName}move`] || []; + return !moveListeners.length; + }, + + getInfo(interaction) { + return [interaction.prepared.name, interaction.interactable]; + }, + + text: 'There are no listeners set for this action' +}]; + +function hasStyle(element, prop, styleRe) { + return styleRe.test(element.style[prop] || win.window.getComputedStyle(element)[prop]); +} + +function parentHasStyle(element, prop, styleRe) { + let parent = element; + + while (is.element(parent)) { + if (hasStyle(parent, prop, styleRe)) { + return true; + } + + parent = parentNode(parent); + } + + return false; +} + +const id = 'dev-tools'; +const defaultExport = isProduction ? { + id, + install: () => {} +} : { + id, + install, + listeners: { + 'interactions:action-start': ({ + interaction + }, scope) => { + for (const check of checks) { + const options = interaction.interactable && interaction.interactable.options; + + if (!(options && options.devTools && options.devTools.ignore[check.name]) && check.perform(interaction)) { + scope.logger.warn(prefix + check.text, ...check.getInfo(interaction)); + } + } + } + }, + checks, + CheckName, + links, + prefix +}; +export default defaultExport; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/dev-tools/index.js.map b/@interactjs/dev-tools/index.js.map new file mode 100644 index 000000000..444977f91 --- /dev/null +++ b/@interactjs/dev-tools/index.js.map @@ -0,0 +1,64 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "domObjects", + "parentNode", + "extend", + "is", + "win", + "CheckName", + "prefix", + "links", + "touchAction", + "boxSizing", + "isProduction", + "install", + "scope", + "logger", + "Interactable", + "defaults", + "console", + "base", + "devTools", + "ignore", + "prototype", + "options", + "checks", + "name", + "perform", + "element", + "parentHasStyle", + "getInfo", + "text", + "interaction", + "prepared", + "HTMLElement", + "hasStyle", + "noListeners", + "actionName", + "moveListeners", + "interactable", + "events", + "types", + "length", + "prop", + "styleRe", + "test", + "style", + "window", + "getComputedStyle", + "parent", + "id", + "defaultExport", + "listeners", + "check", + "warn" + ], + "mappings": "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", + "sourcesContent": [ + "/* eslint-disable no-console */\n/* global process */\nimport domObjects from '@interactjs/utils/domObjects'\nimport { parentNode } from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport * as is from '@interactjs/utils/is'\nimport win from '@interactjs/utils/window'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n logger: Logger\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface BaseDefaults {\n devTools?: DevToolsOptions\n }\n}\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n devTools?: Interact.OptionMethod\n }\n}\n\nexport interface DevToolsOptions {\n ignore: { [P in keyof typeof CheckName]?: boolean }\n}\n\nexport interface Logger {\n warn: (...args: any[]) => void\n error: (...args: any[]) => void\n log: (...args: any[]) => void\n}\n\nexport interface Check {\n name: CheckName\n text: string\n perform: (interaction: Interact.Interaction) => boolean\n getInfo: (interaction: Interact.Interaction) => any[]\n}\n\nenum CheckName {\n touchAction = 'touchAction',\n boxSizing = 'boxSizing',\n noListeners = 'noListeners',\n}\n\nconst prefix = '[interact.js] '\nconst links = {\n touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action',\n boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing',\n}\n\nconst isProduction = process.env.NODE_ENV === 'production'\n\n// eslint-disable-next-line no-restricted-syntax\nfunction install (scope: Interact.Scope, { logger }: { logger?: Logger } = {}) {\n const {\n Interactable,\n defaults,\n } = scope\n\n scope.logger = logger || console\n\n defaults.base.devTools = {\n ignore: {},\n }\n\n Interactable.prototype.devTools = function (options?: object) {\n if (options) {\n extend(this.options.devTools, options)\n return this\n }\n\n return this.options.devTools\n }\n}\n\nconst checks: Check[] = [\n {\n name: CheckName.touchAction,\n perform ({ element }) {\n return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/)\n },\n getInfo ({ element }) {\n return [\n element,\n links.touchAction,\n ]\n },\n text: 'Consider adding CSS \"touch-action: none\" to this element\\n',\n },\n\n {\n name: CheckName.boxSizing,\n perform (interaction) {\n const { element } = interaction\n\n return interaction.prepared.name === 'resize' &&\n element instanceof domObjects.HTMLElement &&\n !hasStyle(element, 'boxSizing', /border-box/)\n },\n text: 'Consider adding CSS \"box-sizing: border-box\" to this resizable element',\n getInfo ({ element }) {\n return [\n element,\n links.boxSizing,\n ]\n },\n },\n\n {\n name: CheckName.noListeners,\n perform (interaction) {\n const actionName = interaction.prepared.name\n const moveListeners = interaction.interactable.events.types[`${actionName}move`] || []\n\n return !moveListeners.length\n },\n getInfo (interaction) {\n return [\n interaction.prepared.name,\n interaction.interactable,\n ]\n },\n text: 'There are no listeners set for this action',\n },\n]\n\nfunction hasStyle (element: HTMLElement, prop: keyof CSSStyleDeclaration, styleRe: RegExp) {\n return styleRe.test(element.style[prop] || win.window.getComputedStyle(element)[prop])\n}\n\nfunction parentHasStyle (element: Interact.Element, prop: keyof CSSStyleDeclaration, styleRe: RegExp) {\n let parent = element as HTMLElement\n\n while (is.element(parent)) {\n if (hasStyle(parent, prop, styleRe)) {\n return true\n }\n\n parent = parentNode(parent) as HTMLElement\n }\n\n return false\n}\n\nconst id = 'dev-tools'\nconst defaultExport: Interact.Plugin = isProduction\n ? { id, install: () => {} }\n : {\n id,\n install,\n listeners: {\n 'interactions:action-start': ({ interaction }, scope) => {\n for (const check of checks) {\n const options = interaction.interactable && interaction.interactable.options\n\n if (\n !(options && options.devTools && options.devTools.ignore[check.name]) &&\n check.perform(interaction)\n ) {\n scope.logger.warn(prefix + check.text, ...check.getInfo(interaction))\n }\n }\n },\n },\n checks,\n CheckName,\n links,\n prefix,\n }\n\nexport default defaultExport\n" + ] +} \ No newline at end of file diff --git a/@interactjs/dev-tools/index.min.js b/@interactjs/dev-tools/index.min.js new file mode 100644 index 000000000..873eef798 --- /dev/null +++ b/@interactjs/dev-tools/index.min.js @@ -0,0 +1,2 @@ +import o from"../utils/domObjects.min.js";import{parentNode as t}from"../utils/domUtils.min.js";import i from"../utils/extend.min.js";import*as n from"../utils/is.min.js";import s from"../utils/window.min.js";var e;(o=>{o.touchAction="touchAction",o.boxSizing="boxSizing",o.noListeners="noListeners"})(e||(e={}));const r={touchAction:"https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action",boxSizing:"https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing"};e.touchAction,e.boxSizing,e.noListeners;function m(o,t,i){return i.test(o.style[t]||s.window.getComputedStyle(o)[t])}const l="dev-tools",c={id:l,install(){}};export default c; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/dev-tools/index.min.js.map b/@interactjs/dev-tools/index.min.js.map new file mode 100644 index 000000000..15d0427ec --- /dev/null +++ b/@interactjs/dev-tools/index.min.js.map @@ -0,0 +1,33 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "domObjects", + "parentNode", + "extend", + "is", + "win", + "CheckName", + "links", + "touchAction", + "boxSizing", + "noListeners", + "hasStyle", + "element", + "prop", + "styleRe", + "test", + "style", + "window", + "getComputedStyle", + "id", + "defaultExport", + "install" + ], + "mappings": "OAEOA,MAAgB,kDACdC,MAAkB,kCACpBC,MAAY,mCACPC,MAAQ,4BACbC,MAAS,6BAqCXC,GAAAA,IAAAA,4BAAAA,wBAAAA,8BAAAA,IAAAA,OAML,MACMC,EAAQ,CACZC,YAAa,gEACbC,UAAW,+DA8BHH,EAAUE,YAcVF,EAAUG,UAkBVH,EAAUI,YAiBpB,SAASC,EAAUC,EAAsBC,EAAiCC,GACxE,OAAOA,EAAQC,KAAKH,EAAQI,MAAMH,IAASR,EAAIY,OAAOC,iBAAiBN,GAASC,IAiBlF,MAAMM,EAAK,YACLC,EACF,CAAED,GAAAA,EAAIE,4BAwBKD", + "sourcesContent": [ + "/* eslint-disable no-console */\n/* global process */\nimport domObjects from '@interactjs/utils/domObjects'\nimport { parentNode } from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport * as is from '@interactjs/utils/is'\nimport win from '@interactjs/utils/window'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n logger: Logger\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface BaseDefaults {\n devTools?: DevToolsOptions\n }\n}\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n devTools?: Interact.OptionMethod\n }\n}\n\nexport interface DevToolsOptions {\n ignore: { [P in keyof typeof CheckName]?: boolean }\n}\n\nexport interface Logger {\n warn: (...args: any[]) => void\n error: (...args: any[]) => void\n log: (...args: any[]) => void\n}\n\nexport interface Check {\n name: CheckName\n text: string\n perform: (interaction: Interact.Interaction) => boolean\n getInfo: (interaction: Interact.Interaction) => any[]\n}\n\nenum CheckName {\n touchAction = 'touchAction',\n boxSizing = 'boxSizing',\n noListeners = 'noListeners',\n}\n\nconst prefix = '[interact.js] '\nconst links = {\n touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action',\n boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing',\n}\n\nconst isProduction = process.env.NODE_ENV === 'production'\n\n// eslint-disable-next-line no-restricted-syntax\nfunction install (scope: Interact.Scope, { logger }: { logger?: Logger } = {}) {\n const {\n Interactable,\n defaults,\n } = scope\n\n scope.logger = logger || console\n\n defaults.base.devTools = {\n ignore: {},\n }\n\n Interactable.prototype.devTools = function (options?: object) {\n if (options) {\n extend(this.options.devTools, options)\n return this\n }\n\n return this.options.devTools\n }\n}\n\nconst checks: Check[] = [\n {\n name: CheckName.touchAction,\n perform ({ element }) {\n return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/)\n },\n getInfo ({ element }) {\n return [\n element,\n links.touchAction,\n ]\n },\n text: 'Consider adding CSS \"touch-action: none\" to this element\\n',\n },\n\n {\n name: CheckName.boxSizing,\n perform (interaction) {\n const { element } = interaction\n\n return interaction.prepared.name === 'resize' &&\n element instanceof domObjects.HTMLElement &&\n !hasStyle(element, 'boxSizing', /border-box/)\n },\n text: 'Consider adding CSS \"box-sizing: border-box\" to this resizable element',\n getInfo ({ element }) {\n return [\n element,\n links.boxSizing,\n ]\n },\n },\n\n {\n name: CheckName.noListeners,\n perform (interaction) {\n const actionName = interaction.prepared.name\n const moveListeners = interaction.interactable.events.types[`${actionName}move`] || []\n\n return !moveListeners.length\n },\n getInfo (interaction) {\n return [\n interaction.prepared.name,\n interaction.interactable,\n ]\n },\n text: 'There are no listeners set for this action',\n },\n]\n\nfunction hasStyle (element: HTMLElement, prop: keyof CSSStyleDeclaration, styleRe: RegExp) {\n return styleRe.test(element.style[prop] || win.window.getComputedStyle(element)[prop])\n}\n\nfunction parentHasStyle (element: Interact.Element, prop: keyof CSSStyleDeclaration, styleRe: RegExp) {\n let parent = element as HTMLElement\n\n while (is.element(parent)) {\n if (hasStyle(parent, prop, styleRe)) {\n return true\n }\n\n parent = parentNode(parent) as HTMLElement\n }\n\n return false\n}\n\nconst id = 'dev-tools'\nconst defaultExport: Interact.Plugin = isProduction\n ? { id, install: () => {} }\n : {\n id,\n install,\n listeners: {\n 'interactions:action-start': ({ interaction }, scope) => {\n for (const check of checks) {\n const options = interaction.interactable && interaction.interactable.options\n\n if (\n !(options && options.devTools && options.devTools.ignore[check.name]) &&\n check.perform(interaction)\n ) {\n scope.logger.warn(prefix + check.text, ...check.getInfo(interaction))\n }\n }\n },\n },\n checks,\n CheckName,\n links,\n prefix,\n }\n\nexport default defaultExport\n" + ] +} \ No newline at end of file diff --git a/@interactjs/inertia/.npmignore b/@interactjs/inertia/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/inertia/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/inertia/LICENSE b/@interactjs/inertia/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/inertia/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/inertia/index.d.ts b/@interactjs/inertia/index.d.ts new file mode 100644 index 000000000..038fe983e --- /dev/null +++ b/@interactjs/inertia/index.d.ts @@ -0,0 +1,66 @@ +import * as modifiers from '@interactjs/modifiers/base'; +import Modification from '@interactjs/modifiers/Modification'; +declare module '@interactjs/core/InteractEvent' { + interface PhaseMap { + resume?: true; + inertiastart?: true; + } +} +declare module '@interactjs/core/Interaction' { + interface Interaction { + inertia?: InertiaState; + } +} +declare module '@interactjs/core/defaultOptions' { + interface PerActionDefaults { + inertia?: { + enabled?: boolean; + resistance?: number; + minSpeed?: number; + endSpeed?: number; + allowResume?: true; + smoothEndDuration?: number; + }; + } +} +declare module '@interactjs/core/scope' { + interface SignalArgs { + 'interactions:before-action-inertiastart': Omit, 'iEvent'>; + 'interactions:action-inertiastart': Interact.DoPhaseArg; + 'interactions:after-action-inertiastart': Interact.DoPhaseArg; + 'interactions:before-action-resume': Omit, 'iEvent'>; + 'interactions:action-resume': Interact.DoPhaseArg; + 'interactions:after-action-resume': Interact.DoPhaseArg; + } +} +export declare class InertiaState { + private readonly interaction; + active: boolean; + isModified: boolean; + smoothEnd: boolean; + allowResume: boolean; + modification: Modification; + modifierCount: number; + modifierArg: modifiers.ModifierArg; + startCoords: Interact.Point; + t0: number; + v0: number; + te: number; + targetOffset: Interact.Point; + modifiedOffset: Interact.Point; + currentOffset: Interact.Point; + lambda_v0?: number; + one_ve_v0?: number; + timeout: number; + constructor(interaction: Interact.Interaction); + start(event: Interact.PointerEventType): boolean; + startInertia(): void; + startSmoothEnd(): void; + inertiaTick(): void; + smoothEndTick(): void; + resume({ pointer, event, eventTarget }: Interact.SignalArgs['interactions:down']): void; + end(): void; + stop(): void; +} +declare const inertia: Interact.Plugin; +export default inertia; diff --git a/@interactjs/inertia/index.js b/@interactjs/inertia/index.js new file mode 100644 index 000000000..0e777f86e --- /dev/null +++ b/@interactjs/inertia/index.js @@ -0,0 +1,387 @@ +import * as modifiers from "../modifiers/base.js"; +import Modification from "../modifiers/Modification.js"; +import offset from "../offset/index.js"; +import * as dom from "../utils/domUtils.js"; +import hypot from "../utils/hypot.js"; +import * as is from "../utils/is.js"; +import { copyCoords } from "../utils/pointerUtils.js"; +import raf from "../utils/raf.js"; + +function install(scope) { + const { + defaults + } = scope; + scope.usePlugin(offset); + scope.usePlugin(modifiers.default); + scope.actions.phases.inertiastart = true; + scope.actions.phases.resume = true; + defaults.perAction.inertia = { + enabled: false, + resistance: 10, + // the lambda in exponential decay + minSpeed: 100, + // target speed must be above this for inertia to start + endSpeed: 10, + // the speed at which inertia is slow enough to stop + allowResume: true, + // allow resuming an action in inertia phase + smoothEndDuration: 300 // animate to snap/restrict endOnly if there's no inertia + + }; +} + +export class InertiaState { + // eslint-disable-line camelcase + // eslint-disable-line camelcase + constructor(interaction) { + this.interaction = interaction; + this.active = false; + this.isModified = false; + this.smoothEnd = false; + this.allowResume = false; + this.modification = null; + this.modifierCount = 0; + this.modifierArg = null; + this.startCoords = null; + this.t0 = 0; + this.v0 = 0; + this.te = 0; + this.targetOffset = null; + this.modifiedOffset = null; + this.currentOffset = null; + this.lambda_v0 = 0; + this.one_ve_v0 = 0; + this.timeout = null; + } + + start(event) { + const { + interaction + } = this; + const options = getOptions(interaction); + + if (!options || !options.enabled) { + return false; + } + + const { + client: velocityClient + } = interaction.coords.velocity; + const pointerSpeed = hypot(velocityClient.x, velocityClient.y); + const modification = this.modification || (this.modification = new Modification(interaction)); + modification.copyFrom(interaction.modification); + this.t0 = interaction._now(); + this.allowResume = options.allowResume; + this.v0 = pointerSpeed; + this.currentOffset = { + x: 0, + y: 0 + }; + this.startCoords = interaction.coords.cur.page; + this.modifierArg = { + interaction, + interactable: interaction.interactable, + element: interaction.element, + rect: interaction.rect, + edges: interaction.edges, + pageCoords: this.startCoords, + preEnd: true, + phase: 'inertiastart' + }; + const thrown = this.t0 - interaction.coords.cur.timeStamp < 50 && pointerSpeed > options.minSpeed && pointerSpeed > options.endSpeed; + + if (thrown) { + this.startInertia(); + } else { + modification.result = modification.setAll(this.modifierArg); + + if (!modification.result.changed) { + return false; + } + + this.startSmoothEnd(); + } // force modification change + + + interaction.modification.result.rect = null; // bring inertiastart event to the target coords + + interaction.offsetBy(this.targetOffset); + + interaction._doPhase({ + interaction, + event, + phase: 'inertiastart' + }); + + interaction.offsetBy({ + x: -this.targetOffset.x, + y: -this.targetOffset.y + }); // force modification change + + interaction.modification.result.rect = null; + this.active = true; + interaction.simulation = this; + return true; + } + + startInertia() { + const startVelocity = this.interaction.coords.velocity.client; + const options = getOptions(this.interaction); + const lambda = options.resistance; + const inertiaDur = -Math.log(options.endSpeed / this.v0) / lambda; + this.targetOffset = { + x: (startVelocity.x - inertiaDur) / lambda, + y: (startVelocity.y - inertiaDur) / lambda + }; + this.te = inertiaDur; + this.lambda_v0 = lambda / this.v0; + this.one_ve_v0 = 1 - options.endSpeed / this.v0; + const { + modification, + modifierArg + } = this; + modifierArg.pageCoords = { + x: this.startCoords.x + this.targetOffset.x, + y: this.startCoords.y + this.targetOffset.y + }; + modification.result = modification.setAll(modifierArg); + + if (modification.result.changed) { + this.isModified = true; + this.modifiedOffset = { + x: this.targetOffset.x + modification.result.delta.x, + y: this.targetOffset.y + modification.result.delta.y + }; + } + + this.timeout = raf.request(() => this.inertiaTick()); + } + + startSmoothEnd() { + this.smoothEnd = true; + this.isModified = true; + this.targetOffset = { + x: this.modification.result.delta.x, + y: this.modification.result.delta.y + }; + this.timeout = raf.request(() => this.smoothEndTick()); + } + + inertiaTick() { + const { + interaction + } = this; + const options = getOptions(interaction); + const lambda = options.resistance; + const t = (interaction._now() - this.t0) / 1000; + + if (t < this.te) { + const progress = 1 - (Math.exp(-lambda * t) - this.lambda_v0) / this.one_ve_v0; + let newOffset; + + if (this.isModified) { + newOffset = getQuadraticCurvePoint(0, 0, this.targetOffset.x, this.targetOffset.y, this.modifiedOffset.x, this.modifiedOffset.y, progress); + } else { + newOffset = { + x: this.targetOffset.x * progress, + y: this.targetOffset.y * progress + }; + } + + const delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move(); + this.timeout = raf.request(() => this.inertiaTick()); + } else { + interaction.offsetBy({ + x: this.modifiedOffset.x - this.currentOffset.x, + y: this.modifiedOffset.y - this.currentOffset.y + }); + this.end(); + } + } + + smoothEndTick() { + const { + interaction + } = this; + const t = interaction._now() - this.t0; + const { + smoothEndDuration: duration + } = getOptions(interaction); + + if (t < duration) { + const newOffset = { + x: easeOutQuad(t, 0, this.targetOffset.x, duration), + y: easeOutQuad(t, 0, this.targetOffset.y, duration) + }; + const delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move({ + skipModifiers: this.modifierCount + }); + this.timeout = raf.request(() => this.smoothEndTick()); + } else { + interaction.offsetBy({ + x: this.targetOffset.x - this.currentOffset.x, + y: this.targetOffset.y - this.currentOffset.y + }); + this.end(); + } + } + + resume({ + pointer, + event, + eventTarget + }) { + const { + interaction + } = this; // undo inertia changes to interaction coords + + interaction.offsetBy({ + x: -this.currentOffset.x, + y: -this.currentOffset.y + }); // update pointer at pointer down position + + interaction.updatePointer(pointer, event, eventTarget, true); // fire resume signals and event + + interaction._doPhase({ + interaction, + event, + phase: 'resume' + }); + + copyCoords(interaction.coords.prev, interaction.coords.cur); + this.stop(); + } + + end() { + this.interaction.move(); + this.interaction.end(); + this.stop(); + } + + stop() { + this.active = this.smoothEnd = false; + this.interaction.simulation = null; + raf.cancel(this.timeout); + } + +} + +function start({ + interaction, + event +}) { + if (!interaction._interacting || interaction.simulation) { + return null; + } + + const started = interaction.inertia.start(event); // prevent action end if inertia or smoothEnd + + return started ? false : null; +} // Check if the down event hits the current inertia target +// control should be return to the user + + +function resume(arg) { + const { + interaction, + eventTarget + } = arg; + const state = interaction.inertia; + + if (!state.active) { + return; + } + + let element = eventTarget; // climb up the DOM tree from the event target + + while (is.element(element)) { + // if interaction element is the current inertia target element + if (element === interaction.element) { + state.resume(arg); + break; + } + + element = dom.parentNode(element); + } +} + +function stop({ + interaction +}) { + const state = interaction.inertia; + + if (state.active) { + state.stop(); + } +} + +function getOptions({ + interactable, + prepared +}) { + return interactable && interactable.options && prepared.name && interactable.options[prepared.name].inertia; +} + +const inertia = { + id: 'inertia', + before: ['modifiers/base'], + install, + listeners: { + 'interactions:new': ({ + interaction + }) => { + interaction.inertia = new InertiaState(interaction); + }, + 'interactions:before-action-end': start, + 'interactions:down': resume, + 'interactions:stop': stop, + 'interactions:before-action-resume': arg => { + const { + modification + } = arg.interaction; + modification.stop(arg); + modification.start(arg, arg.interaction.coords.cur.page); + modification.applyToInteraction(arg); + }, + 'interactions:before-action-inertiastart': arg => arg.interaction.modification.setAndApply(arg), + 'interactions:action-resume': modifiers.addEventModifiers, + 'interactions:action-inertiastart': modifiers.addEventModifiers, + 'interactions:after-action-inertiastart': arg => arg.interaction.modification.restoreInteractionCoords(arg), + 'interactions:after-action-resume': arg => arg.interaction.modification.restoreInteractionCoords(arg) + } +}; // http://stackoverflow.com/a/5634528/2280888 + +function _getQBezierValue(t, p1, p2, p3) { + const iT = 1 - t; + return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3; +} + +function getQuadraticCurvePoint(startX, startY, cpX, cpY, endX, endY, position) { + return { + x: _getQBezierValue(position, startX, cpX, endX), + y: _getQBezierValue(position, startY, cpY, endY) + }; +} // http://gizma.com/easing/ + + +function easeOutQuad(t, b, c, d) { + t /= d; + return -c * t * (t - 2) + b; +} + +export default inertia; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/inertia/index.js.map b/@interactjs/inertia/index.js.map new file mode 100644 index 000000000..dc254955d --- /dev/null +++ b/@interactjs/inertia/index.js.map @@ -0,0 +1,142 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "modifiers", + "Modification", + "offset", + "dom", + "hypot", + "is", + "copyCoords", + "raf", + "install", + "scope", + "defaults", + "usePlugin", + "default", + "actions", + "phases", + "inertiastart", + "resume", + "perAction", + "inertia", + "enabled", + "resistance", + "minSpeed", + "endSpeed", + "allowResume", + "smoothEndDuration", + "InertiaState", + "constructor", + "interaction", + "active", + "isModified", + "smoothEnd", + "modification", + "modifierCount", + "modifierArg", + "startCoords", + "t0", + "v0", + "te", + "targetOffset", + "modifiedOffset", + "currentOffset", + "lambda_v0", + "one_ve_v0", + "timeout", + "start", + "event", + "options", + "getOptions", + "client", + "velocityClient", + "coords", + "velocity", + "pointerSpeed", + "x", + "y", + "copyFrom", + "_now", + "cur", + "page", + "interactable", + "element", + "rect", + "edges", + "pageCoords", + "preEnd", + "phase", + "thrown", + "timeStamp", + "startInertia", + "result", + "setAll", + "changed", + "startSmoothEnd", + "offsetBy", + "_doPhase", + "simulation", + "startVelocity", + "lambda", + "inertiaDur", + "Math", + "log", + "delta", + "request", + "inertiaTick", + "smoothEndTick", + "t", + "progress", + "exp", + "newOffset", + "getQuadraticCurvePoint", + "move", + "end", + "duration", + "easeOutQuad", + "skipModifiers", + "pointer", + "eventTarget", + "updatePointer", + "prev", + "stop", + "cancel", + "_interacting", + "started", + "arg", + "state", + "parentNode", + "prepared", + "name", + "id", + "before", + "listeners", + "applyToInteraction", + "setAndApply", + "addEventModifiers", + "restoreInteractionCoords", + "_getQBezierValue", + "p1", + "p2", + "p3", + "iT", + "startX", + "startY", + "cpX", + "cpY", + "endX", + "endY", + "position", + "b", + "c", + "d" + ], + "mappings": "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", + "sourcesContent": [ + "import * as modifiers from '@interactjs/modifiers/base'\nimport Modification from '@interactjs/modifiers/Modification'\nimport offset from '@interactjs/offset/index'\nimport * as dom from '@interactjs/utils/domUtils'\nimport hypot from '@interactjs/utils/hypot'\nimport * as is from '@interactjs/utils/is'\nimport { copyCoords } from '@interactjs/utils/pointerUtils'\nimport raf from '@interactjs/utils/raf'\n\ndeclare module '@interactjs/core/InteractEvent' {\n // eslint-disable-next-line no-shadow\n interface PhaseMap {\n resume?: true\n inertiastart?: true\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n inertia?: InertiaState\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface PerActionDefaults {\n inertia?: {\n enabled?: boolean\n resistance?: number // the lambda in exponential decay\n minSpeed?: number // target speed must be above this for inertia to start\n endSpeed?: number // the speed at which inertia is slow enough to stop\n allowResume?: true // allow resuming an action in inertia phase\n smoothEndDuration?: number // animate to snap/restrict endOnly if there's no inertia\n }\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:before-action-inertiastart': Omit, 'iEvent'>\n 'interactions:action-inertiastart': Interact.DoPhaseArg\n 'interactions:after-action-inertiastart': Interact.DoPhaseArg\n 'interactions:before-action-resume': Omit, 'iEvent'>\n 'interactions:action-resume': Interact.DoPhaseArg\n 'interactions:after-action-resume': Interact.DoPhaseArg\n }\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n defaults,\n } = scope\n\n scope.usePlugin(offset)\n scope.usePlugin(modifiers.default)\n scope.actions.phases.inertiastart = true\n scope.actions.phases.resume = true\n\n defaults.perAction.inertia = {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n }\n}\n\nexport class InertiaState {\n active = false\n isModified = false\n smoothEnd = false\n allowResume = false\n\n modification: Modification = null\n modifierCount = 0\n modifierArg: modifiers.ModifierArg = null\n\n startCoords: Interact.Point = null\n t0 = 0\n v0 = 0\n\n te = 0\n targetOffset: Interact.Point = null\n modifiedOffset: Interact.Point = null\n currentOffset: Interact.Point = null\n\n lambda_v0? = 0 // eslint-disable-line camelcase\n one_ve_v0? = 0 // eslint-disable-line camelcase\n timeout: number = null\n\n constructor (\n private readonly interaction: Interact.Interaction,\n ) {}\n\n start (event: Interact.PointerEventType) {\n const { interaction } = this\n const options = getOptions(interaction)\n\n if (!options || !options.enabled) {\n return false\n }\n\n const { client: velocityClient } = interaction.coords.velocity\n const pointerSpeed = hypot(velocityClient.x, velocityClient.y)\n const modification = this.modification || (this.modification = new Modification(interaction))\n\n modification.copyFrom(interaction.modification)\n\n this.t0 = interaction._now()\n this.allowResume = options.allowResume\n this.v0 = pointerSpeed\n this.currentOffset = { x: 0, y: 0 }\n this.startCoords = interaction.coords.cur.page\n\n this.modifierArg = {\n interaction,\n interactable: interaction.interactable,\n element: interaction.element,\n rect: interaction.rect,\n edges: interaction.edges,\n pageCoords: this.startCoords,\n preEnd: true,\n phase: 'inertiastart',\n }\n\n const thrown = (\n (this.t0 - interaction.coords.cur.timeStamp) < 50 &&\n pointerSpeed > options.minSpeed &&\n pointerSpeed > options.endSpeed\n )\n\n if (thrown) {\n this.startInertia()\n } else {\n modification.result = modification.setAll(this.modifierArg)\n\n if (!modification.result.changed) {\n return false\n }\n\n this.startSmoothEnd()\n }\n\n // force modification change\n interaction.modification.result.rect = null\n\n // bring inertiastart event to the target coords\n interaction.offsetBy(this.targetOffset)\n interaction._doPhase({\n interaction,\n event,\n phase: 'inertiastart',\n })\n interaction.offsetBy({ x: -this.targetOffset.x, y: -this.targetOffset.y })\n // force modification change\n interaction.modification.result.rect = null\n\n this.active = true\n interaction.simulation = this\n\n return true\n }\n\n startInertia () {\n const startVelocity = this.interaction.coords.velocity.client\n const options = getOptions(this.interaction)\n const lambda = options.resistance\n const inertiaDur = -Math.log(options.endSpeed / this.v0) / lambda\n\n this.targetOffset = {\n x: (startVelocity.x - inertiaDur) / lambda,\n y: (startVelocity.y - inertiaDur) / lambda,\n }\n\n this.te = inertiaDur\n this.lambda_v0 = lambda / this.v0\n this.one_ve_v0 = 1 - options.endSpeed / this.v0\n\n const { modification, modifierArg } = this\n\n modifierArg.pageCoords = {\n x: this.startCoords.x + this.targetOffset.x,\n y: this.startCoords.y + this.targetOffset.y,\n }\n\n modification.result = modification.setAll(modifierArg)\n\n if (modification.result.changed) {\n this.isModified = true\n this.modifiedOffset = {\n x: this.targetOffset.x + modification.result.delta.x,\n y: this.targetOffset.y + modification.result.delta.y,\n }\n }\n\n this.timeout = raf.request(() => this.inertiaTick())\n }\n\n startSmoothEnd () {\n this.smoothEnd = true\n this.isModified = true\n this.targetOffset = {\n x: this.modification.result.delta.x,\n y: this.modification.result.delta.y,\n }\n\n this.timeout = raf.request(() => this.smoothEndTick())\n }\n\n inertiaTick () {\n const { interaction } = this\n const options = getOptions(interaction)\n const lambda = options.resistance\n const t = (interaction._now() - this.t0) / 1000\n\n if (t < this.te) {\n const progress = 1 - (Math.exp(-lambda * t) - this.lambda_v0) / this.one_ve_v0\n let newOffset: Interact.Point\n\n if (this.isModified) {\n newOffset = getQuadraticCurvePoint(\n 0, 0,\n this.targetOffset.x, this.targetOffset.y,\n this.modifiedOffset.x, this.modifiedOffset.y,\n progress,\n )\n }\n else {\n newOffset = {\n x: this.targetOffset.x * progress,\n y: this.targetOffset.y * progress,\n }\n }\n\n const delta = { x: newOffset.x - this.currentOffset.x, y: newOffset.y - this.currentOffset.y }\n\n this.currentOffset.x += delta.x\n this.currentOffset.y += delta.y\n\n interaction.offsetBy(delta)\n interaction.move()\n\n this.timeout = raf.request(() => this.inertiaTick())\n }\n else {\n interaction.offsetBy({\n x: this.modifiedOffset.x - this.currentOffset.x,\n y: this.modifiedOffset.y - this.currentOffset.y,\n })\n\n this.end()\n }\n }\n\n smoothEndTick () {\n const { interaction } = this\n const t = interaction._now() - this.t0\n const { smoothEndDuration: duration } = getOptions(interaction)\n\n if (t < duration) {\n const newOffset = {\n x: easeOutQuad(t, 0, this.targetOffset.x, duration),\n y: easeOutQuad(t, 0, this.targetOffset.y, duration),\n }\n const delta = {\n x: newOffset.x - this.currentOffset.x,\n y: newOffset.y - this.currentOffset.y,\n }\n\n this.currentOffset.x += delta.x\n this.currentOffset.y += delta.y\n\n interaction.offsetBy(delta)\n interaction.move({ skipModifiers: this.modifierCount })\n\n this.timeout = raf.request(() => this.smoothEndTick())\n }\n else {\n interaction.offsetBy({\n x: this.targetOffset.x - this.currentOffset.x,\n y: this.targetOffset.y - this.currentOffset.y,\n })\n\n this.end()\n }\n }\n\n resume ({ pointer, event, eventTarget }: Interact.SignalArgs['interactions:down']) {\n const { interaction } = this\n\n // undo inertia changes to interaction coords\n interaction.offsetBy({\n x: -this.currentOffset.x,\n y: -this.currentOffset.y,\n })\n\n // update pointer at pointer down position\n interaction.updatePointer(pointer, event, eventTarget, true)\n\n // fire resume signals and event\n interaction._doPhase({\n interaction,\n event,\n phase: 'resume',\n })\n copyCoords(interaction.coords.prev, interaction.coords.cur)\n\n this.stop()\n }\n\n end () {\n this.interaction.move()\n this.interaction.end()\n this.stop()\n }\n\n stop () {\n this.active = this.smoothEnd = false\n this.interaction.simulation = null\n raf.cancel(this.timeout)\n }\n}\n\nfunction start ({ interaction, event }: Interact.DoPhaseArg) {\n if (!interaction._interacting || interaction.simulation) {\n return null\n }\n\n const started = interaction.inertia.start(event)\n\n // prevent action end if inertia or smoothEnd\n return started ? false : null\n}\n\n// Check if the down event hits the current inertia target\n// control should be return to the user\nfunction resume (arg: Interact.SignalArgs['interactions:down']) {\n const { interaction, eventTarget } = arg\n const state = interaction.inertia\n\n if (!state.active) { return }\n\n let element = eventTarget as Node\n\n // climb up the DOM tree from the event target\n while (is.element(element)) {\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n state.resume(arg)\n break\n }\n\n element = dom.parentNode(element)\n }\n}\n\nfunction stop ({ interaction }: { interaction: Interact.Interaction }) {\n const state = interaction.inertia\n\n if (state.active) {\n state.stop()\n }\n}\n\nfunction getOptions ({ interactable, prepared }: Interact.Interaction) {\n return interactable &&\n interactable.options &&\n prepared.name &&\n interactable.options[prepared.name].inertia\n}\n\nconst inertia: Interact.Plugin = {\n id: 'inertia',\n before: ['modifiers/base'],\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.inertia = new InertiaState(interaction)\n },\n\n 'interactions:before-action-end': start,\n 'interactions:down': resume,\n 'interactions:stop': stop,\n\n 'interactions:before-action-resume': arg => {\n const { modification } = arg.interaction\n\n modification.stop(arg)\n modification.start(arg, arg.interaction.coords.cur.page)\n modification.applyToInteraction(arg)\n },\n\n 'interactions:before-action-inertiastart': arg => arg.interaction.modification.setAndApply(arg),\n 'interactions:action-resume': modifiers.addEventModifiers,\n 'interactions:action-inertiastart': modifiers.addEventModifiers,\n 'interactions:after-action-inertiastart': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n 'interactions:after-action-resume': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n },\n}\n\n// http://stackoverflow.com/a/5634528/2280888\nfunction _getQBezierValue (t: number, p1: number, p2: number, p3: number) {\n const iT = 1 - t\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3\n}\n\nfunction getQuadraticCurvePoint (\n startX: number, startY: number, cpX: number, cpY: number, endX: number, endY: number, position: number) {\n return {\n x: _getQBezierValue(position, startX, cpX, endX),\n y: _getQBezierValue(position, startY, cpY, endY),\n }\n}\n\n// http://gizma.com/easing/\nfunction easeOutQuad (t: number, b: number, c: number, d: number) {\n t /= d\n return -c * t * (t - 2) + b\n}\n\nexport default inertia\n" + ] +} \ No newline at end of file diff --git a/@interactjs/inertia/index.min.js b/@interactjs/inertia/index.min.js new file mode 100644 index 000000000..57fc1de0e --- /dev/null +++ b/@interactjs/inertia/index.min.js @@ -0,0 +1,2 @@ +import*as t from"../modifiers/base.min.js";import i from"../modifiers/Modification.min.js";import e from"../offset/index.min.js";import*as s from"../utils/domUtils.min.js";import n from"../utils/hypot.min.js";import*as r from"../utils/is.min.js";import{copyCoords as o}from"../utils/pointerUtils.min.js";import a from"../utils/raf.min.js";export class InertiaState{constructor(t){this.interaction=t,this.active=!1,this.isModified=!1,this.smoothEnd=!1,this.allowResume=!1,this.modification=null,this.modifierCount=0,this.modifierArg=null,this.startCoords=null,this.t0=0,this.v0=0,this.te=0,this.targetOffset=null,this.modifiedOffset=null,this.currentOffset=null,this.lambda_v0=0,this.one_ve_v0=0,this.timeout=null}start(t){const{interaction:e}=this,s=f(e);if(!s||!s.enabled)return!1;const{client:r}=e.coords.velocity,o=n(r.x,r.y),a=this.modification||(this.modification=new i(e));if(a.copyFrom(e.modification),this.t0=e._now(),this.allowResume=s.allowResume,this.v0=o,this.currentOffset={x:0,y:0},this.startCoords=e.coords.cur.page,this.modifierArg={interaction:e,interactable:e.interactable,element:e.element,rect:e.rect,edges:e.edges,pageCoords:this.startCoords,preEnd:!0,phase:"inertiastart"},this.t0-e.coords.cur.timeStamp<50&&o>s.minSpeed&&o>s.endSpeed)this.startInertia();else{if(a.result=a.setAll(this.modifierArg),!a.result.changed)return!1;this.startSmoothEnd()}return e.modification.result.rect=null,e.offsetBy(this.targetOffset),e._doPhase({interaction:e,event:t,phase:"inertiastart"}),e.offsetBy({x:-this.targetOffset.x,y:-this.targetOffset.y}),e.modification.result.rect=null,this.active=!0,e.simulation=this,!0}startInertia(){const t=this.interaction.coords.velocity.client,i=f(this.interaction),e=i.resistance,s=-Math.log(i.endSpeed/this.v0)/e;this.targetOffset={x:(t.x-s)/e,y:(t.y-s)/e},this.te=s,this.lambda_v0=e/this.v0,this.one_ve_v0=1-i.endSpeed/this.v0;const{modification:n,modifierArg:r}=this;r.pageCoords={x:this.startCoords.x+this.targetOffset.x,y:this.startCoords.y+this.targetOffset.y},n.result=n.setAll(r),n.result.changed&&(this.isModified=!0,this.modifiedOffset={x:this.targetOffset.x+n.result.delta.x,y:this.targetOffset.y+n.result.delta.y}),this.timeout=a.request(()=>this.inertiaTick())}startSmoothEnd(){this.smoothEnd=!0,this.isModified=!0,this.targetOffset={x:this.modification.result.delta.x,y:this.modification.result.delta.y},this.timeout=a.request(()=>this.smoothEndTick())}inertiaTick(){const{interaction:t}=this,i=f(t).resistance,e=(t._now()-this.t0)/1e3;if(ethis.inertiaTick())}else t.offsetBy({x:this.modifiedOffset.x-this.currentOffset.x,y:this.modifiedOffset.y-this.currentOffset.y}),this.end();var s,n,r,o,c,d,m}smoothEndTick(){const{interaction:t}=this,i=t._now()-this.t0,{smoothEndDuration:e}=f(t);if(ithis.smoothEndTick())}else t.offsetBy({x:this.targetOffset.x-this.currentOffset.x,y:this.targetOffset.y-this.currentOffset.y}),this.end()}resume({pointer:t,event:i,eventTarget:e}){const{interaction:s}=this;s.offsetBy({x:-this.currentOffset.x,y:-this.currentOffset.y}),s.updatePointer(t,i,e,!0),s._doPhase({interaction:s,event:i,phase:"resume"}),o(s.coords.prev,s.coords.cur),this.stop()}end(){this.interaction.move(),this.interaction.end(),this.stop()}stop(){this.active=this.smoothEnd=!1,this.interaction.simulation=null,a.cancel(this.timeout)}}function f({interactable:t,prepared:i}){return t&&t.options&&i.name&&t.options[i.name].inertia}const c={id:"inertia",before:["modifiers/base"],install(i){const{defaults:s}=i;i.usePlugin(e),i.usePlugin(t.default),i.actions.phases.inertiastart=!0,i.actions.phases.resume=!0,s.perAction.inertia={enabled:!1,resistance:10,minSpeed:100,endSpeed:10,allowResume:!0,smoothEndDuration:300}},listeners:{"interactions:new"({interaction:t}){t.inertia=new InertiaState(t)},"interactions:before-action-end"({interaction:t,event:i}){return(!t._interacting||t.simulation||!t.inertia.start(i))&&null},"interactions:down"(t){const{interaction:i,eventTarget:e}=t,n=i.inertia;if(!n.active)return;let o=e;for(;r.element(o);){if(o===i.element){n.resume(t);break}o=s.parentNode(o)}},"interactions:stop"({interaction:t}){const i=t.inertia;i.active&&i.stop()},"interactions:before-action-resume"(t){const{modification:i}=t.interaction;i.stop(t),i.start(t,t.interaction.coords.cur.page),i.applyToInteraction(t)},"interactions:before-action-inertiastart"(t){return t.interaction.modification.setAndApply(t)},"interactions:action-resume":t.addEventModifiers,"interactions:action-inertiastart":t.addEventModifiers,"interactions:after-action-inertiastart"(t){return t.interaction.modification.restoreInteractionCoords(t)},"interactions:after-action-resume"(t){return t.interaction.modification.restoreInteractionCoords(t)}}};function h(t,i,e,s){const n=1-t;return n*n*i+2*n*t*e+t*t*s}function d(t,i,e,s){return-e*(t/=s)*(t-2)+i}export default c; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/inertia/index.min.js.map b/@interactjs/inertia/index.min.js.map new file mode 100644 index 000000000..33697dd0f --- /dev/null +++ b/@interactjs/inertia/index.min.js.map @@ -0,0 +1,143 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "modifiers", + "Modification", + "offset", + "dom", + "hypot", + "is", + "copyCoords", + "raf", + "InertiaState", + "constructor", + "interaction", + "this", + "active", + "isModified", + "smoothEnd", + "allowResume", + "modification", + "modifierCount", + "modifierArg", + "startCoords", + "t0", + "v0", + "te", + "targetOffset", + "modifiedOffset", + "currentOffset", + "lambda_v0", + "one_ve_v0", + "timeout", + "start", + "event", + "options", + "getOptions", + "enabled", + "client", + "velocityClient", + "coords", + "velocity", + "pointerSpeed", + "x", + "y", + "copyFrom", + "_now", + "cur", + "page", + "interactable", + "element", + "rect", + "edges", + "pageCoords", + "preEnd", + "phase", + "timeStamp", + "minSpeed", + "endSpeed", + "startInertia", + "result", + "setAll", + "changed", + "startSmoothEnd", + "offsetBy", + "_doPhase", + "simulation", + "startVelocity", + "lambda", + "resistance", + "inertiaDur", + "Math", + "log", + "delta", + "request", + "inertiaTick", + "smoothEndTick", + "t", + "progress", + "exp", + "newOffset", + "startX", + "startY", + "cpX", + "cpY", + "endX", + "endY", + "_getQBezierValue", + "position", + "move", + "end", + "smoothEndDuration", + "duration", + "easeOutQuad", + "skipModifiers", + "resume", + "pointer", + "eventTarget", + "updatePointer", + "prev", + "stop", + "cancel", + "prepared", + "name", + "inertia", + "id", + "before", + "install", + "scope", + "defaults", + "usePlugin", + "default", + "actions", + "phases", + "inertiastart", + "perAction", + "listeners", + "[object Object]", + "_interacting", + "arg", + "state", + "parentNode", + "applyToInteraction", + "setAndApply", + "interactions:action-resume", + "addEventModifiers", + "interactions:action-inertiastart", + "restoreInteractionCoords", + "p1", + "p2", + "p3", + "iT", + "b", + "c", + "d" + ], + "mappings": "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", + "sourcesContent": [ + "import * as modifiers from '@interactjs/modifiers/base'\nimport Modification from '@interactjs/modifiers/Modification'\nimport offset from '@interactjs/offset/index'\nimport * as dom from '@interactjs/utils/domUtils'\nimport hypot from '@interactjs/utils/hypot'\nimport * as is from '@interactjs/utils/is'\nimport { copyCoords } from '@interactjs/utils/pointerUtils'\nimport raf from '@interactjs/utils/raf'\n\ndeclare module '@interactjs/core/InteractEvent' {\n // eslint-disable-next-line no-shadow\n interface PhaseMap {\n resume?: true\n inertiastart?: true\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n inertia?: InertiaState\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface PerActionDefaults {\n inertia?: {\n enabled?: boolean\n resistance?: number // the lambda in exponential decay\n minSpeed?: number // target speed must be above this for inertia to start\n endSpeed?: number // the speed at which inertia is slow enough to stop\n allowResume?: true // allow resuming an action in inertia phase\n smoothEndDuration?: number // animate to snap/restrict endOnly if there's no inertia\n }\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:before-action-inertiastart': Omit, 'iEvent'>\n 'interactions:action-inertiastart': Interact.DoPhaseArg\n 'interactions:after-action-inertiastart': Interact.DoPhaseArg\n 'interactions:before-action-resume': Omit, 'iEvent'>\n 'interactions:action-resume': Interact.DoPhaseArg\n 'interactions:after-action-resume': Interact.DoPhaseArg\n }\n}\n\nfunction install (scope: Interact.Scope) {\n const {\n defaults,\n } = scope\n\n scope.usePlugin(offset)\n scope.usePlugin(modifiers.default)\n scope.actions.phases.inertiastart = true\n scope.actions.phases.resume = true\n\n defaults.perAction.inertia = {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n }\n}\n\nexport class InertiaState {\n active = false\n isModified = false\n smoothEnd = false\n allowResume = false\n\n modification: Modification = null\n modifierCount = 0\n modifierArg: modifiers.ModifierArg = null\n\n startCoords: Interact.Point = null\n t0 = 0\n v0 = 0\n\n te = 0\n targetOffset: Interact.Point = null\n modifiedOffset: Interact.Point = null\n currentOffset: Interact.Point = null\n\n lambda_v0? = 0 // eslint-disable-line camelcase\n one_ve_v0? = 0 // eslint-disable-line camelcase\n timeout: number = null\n\n constructor (\n private readonly interaction: Interact.Interaction,\n ) {}\n\n start (event: Interact.PointerEventType) {\n const { interaction } = this\n const options = getOptions(interaction)\n\n if (!options || !options.enabled) {\n return false\n }\n\n const { client: velocityClient } = interaction.coords.velocity\n const pointerSpeed = hypot(velocityClient.x, velocityClient.y)\n const modification = this.modification || (this.modification = new Modification(interaction))\n\n modification.copyFrom(interaction.modification)\n\n this.t0 = interaction._now()\n this.allowResume = options.allowResume\n this.v0 = pointerSpeed\n this.currentOffset = { x: 0, y: 0 }\n this.startCoords = interaction.coords.cur.page\n\n this.modifierArg = {\n interaction,\n interactable: interaction.interactable,\n element: interaction.element,\n rect: interaction.rect,\n edges: interaction.edges,\n pageCoords: this.startCoords,\n preEnd: true,\n phase: 'inertiastart',\n }\n\n const thrown = (\n (this.t0 - interaction.coords.cur.timeStamp) < 50 &&\n pointerSpeed > options.minSpeed &&\n pointerSpeed > options.endSpeed\n )\n\n if (thrown) {\n this.startInertia()\n } else {\n modification.result = modification.setAll(this.modifierArg)\n\n if (!modification.result.changed) {\n return false\n }\n\n this.startSmoothEnd()\n }\n\n // force modification change\n interaction.modification.result.rect = null\n\n // bring inertiastart event to the target coords\n interaction.offsetBy(this.targetOffset)\n interaction._doPhase({\n interaction,\n event,\n phase: 'inertiastart',\n })\n interaction.offsetBy({ x: -this.targetOffset.x, y: -this.targetOffset.y })\n // force modification change\n interaction.modification.result.rect = null\n\n this.active = true\n interaction.simulation = this\n\n return true\n }\n\n startInertia () {\n const startVelocity = this.interaction.coords.velocity.client\n const options = getOptions(this.interaction)\n const lambda = options.resistance\n const inertiaDur = -Math.log(options.endSpeed / this.v0) / lambda\n\n this.targetOffset = {\n x: (startVelocity.x - inertiaDur) / lambda,\n y: (startVelocity.y - inertiaDur) / lambda,\n }\n\n this.te = inertiaDur\n this.lambda_v0 = lambda / this.v0\n this.one_ve_v0 = 1 - options.endSpeed / this.v0\n\n const { modification, modifierArg } = this\n\n modifierArg.pageCoords = {\n x: this.startCoords.x + this.targetOffset.x,\n y: this.startCoords.y + this.targetOffset.y,\n }\n\n modification.result = modification.setAll(modifierArg)\n\n if (modification.result.changed) {\n this.isModified = true\n this.modifiedOffset = {\n x: this.targetOffset.x + modification.result.delta.x,\n y: this.targetOffset.y + modification.result.delta.y,\n }\n }\n\n this.timeout = raf.request(() => this.inertiaTick())\n }\n\n startSmoothEnd () {\n this.smoothEnd = true\n this.isModified = true\n this.targetOffset = {\n x: this.modification.result.delta.x,\n y: this.modification.result.delta.y,\n }\n\n this.timeout = raf.request(() => this.smoothEndTick())\n }\n\n inertiaTick () {\n const { interaction } = this\n const options = getOptions(interaction)\n const lambda = options.resistance\n const t = (interaction._now() - this.t0) / 1000\n\n if (t < this.te) {\n const progress = 1 - (Math.exp(-lambda * t) - this.lambda_v0) / this.one_ve_v0\n let newOffset: Interact.Point\n\n if (this.isModified) {\n newOffset = getQuadraticCurvePoint(\n 0, 0,\n this.targetOffset.x, this.targetOffset.y,\n this.modifiedOffset.x, this.modifiedOffset.y,\n progress,\n )\n }\n else {\n newOffset = {\n x: this.targetOffset.x * progress,\n y: this.targetOffset.y * progress,\n }\n }\n\n const delta = { x: newOffset.x - this.currentOffset.x, y: newOffset.y - this.currentOffset.y }\n\n this.currentOffset.x += delta.x\n this.currentOffset.y += delta.y\n\n interaction.offsetBy(delta)\n interaction.move()\n\n this.timeout = raf.request(() => this.inertiaTick())\n }\n else {\n interaction.offsetBy({\n x: this.modifiedOffset.x - this.currentOffset.x,\n y: this.modifiedOffset.y - this.currentOffset.y,\n })\n\n this.end()\n }\n }\n\n smoothEndTick () {\n const { interaction } = this\n const t = interaction._now() - this.t0\n const { smoothEndDuration: duration } = getOptions(interaction)\n\n if (t < duration) {\n const newOffset = {\n x: easeOutQuad(t, 0, this.targetOffset.x, duration),\n y: easeOutQuad(t, 0, this.targetOffset.y, duration),\n }\n const delta = {\n x: newOffset.x - this.currentOffset.x,\n y: newOffset.y - this.currentOffset.y,\n }\n\n this.currentOffset.x += delta.x\n this.currentOffset.y += delta.y\n\n interaction.offsetBy(delta)\n interaction.move({ skipModifiers: this.modifierCount })\n\n this.timeout = raf.request(() => this.smoothEndTick())\n }\n else {\n interaction.offsetBy({\n x: this.targetOffset.x - this.currentOffset.x,\n y: this.targetOffset.y - this.currentOffset.y,\n })\n\n this.end()\n }\n }\n\n resume ({ pointer, event, eventTarget }: Interact.SignalArgs['interactions:down']) {\n const { interaction } = this\n\n // undo inertia changes to interaction coords\n interaction.offsetBy({\n x: -this.currentOffset.x,\n y: -this.currentOffset.y,\n })\n\n // update pointer at pointer down position\n interaction.updatePointer(pointer, event, eventTarget, true)\n\n // fire resume signals and event\n interaction._doPhase({\n interaction,\n event,\n phase: 'resume',\n })\n copyCoords(interaction.coords.prev, interaction.coords.cur)\n\n this.stop()\n }\n\n end () {\n this.interaction.move()\n this.interaction.end()\n this.stop()\n }\n\n stop () {\n this.active = this.smoothEnd = false\n this.interaction.simulation = null\n raf.cancel(this.timeout)\n }\n}\n\nfunction start ({ interaction, event }: Interact.DoPhaseArg) {\n if (!interaction._interacting || interaction.simulation) {\n return null\n }\n\n const started = interaction.inertia.start(event)\n\n // prevent action end if inertia or smoothEnd\n return started ? false : null\n}\n\n// Check if the down event hits the current inertia target\n// control should be return to the user\nfunction resume (arg: Interact.SignalArgs['interactions:down']) {\n const { interaction, eventTarget } = arg\n const state = interaction.inertia\n\n if (!state.active) { return }\n\n let element = eventTarget as Node\n\n // climb up the DOM tree from the event target\n while (is.element(element)) {\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n state.resume(arg)\n break\n }\n\n element = dom.parentNode(element)\n }\n}\n\nfunction stop ({ interaction }: { interaction: Interact.Interaction }) {\n const state = interaction.inertia\n\n if (state.active) {\n state.stop()\n }\n}\n\nfunction getOptions ({ interactable, prepared }: Interact.Interaction) {\n return interactable &&\n interactable.options &&\n prepared.name &&\n interactable.options[prepared.name].inertia\n}\n\nconst inertia: Interact.Plugin = {\n id: 'inertia',\n before: ['modifiers/base'],\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.inertia = new InertiaState(interaction)\n },\n\n 'interactions:before-action-end': start,\n 'interactions:down': resume,\n 'interactions:stop': stop,\n\n 'interactions:before-action-resume': arg => {\n const { modification } = arg.interaction\n\n modification.stop(arg)\n modification.start(arg, arg.interaction.coords.cur.page)\n modification.applyToInteraction(arg)\n },\n\n 'interactions:before-action-inertiastart': arg => arg.interaction.modification.setAndApply(arg),\n 'interactions:action-resume': modifiers.addEventModifiers,\n 'interactions:action-inertiastart': modifiers.addEventModifiers,\n 'interactions:after-action-inertiastart': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n 'interactions:after-action-resume': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n },\n}\n\n// http://stackoverflow.com/a/5634528/2280888\nfunction _getQBezierValue (t: number, p1: number, p2: number, p3: number) {\n const iT = 1 - t\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3\n}\n\nfunction getQuadraticCurvePoint (\n startX: number, startY: number, cpX: number, cpY: number, endX: number, endY: number, position: number) {\n return {\n x: _getQBezierValue(position, startX, cpX, endX),\n y: _getQBezierValue(position, startY, cpY, endY),\n }\n}\n\n// http://gizma.com/easing/\nfunction easeOutQuad (t: number, b: number, c: number, d: number) {\n t /= d\n return -c * t * (t - 2) + b\n}\n\nexport default inertia\n" + ] +} \ No newline at end of file diff --git a/@interactjs/inertia/inertia.spec.d.ts b/@interactjs/inertia/inertia.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/inertia/inertia.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/interact/.npmignore b/@interactjs/interact/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/interact/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/interact/LICENSE b/@interactjs/interact/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/interact/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/interact/index.d.ts b/@interactjs/interact/index.d.ts new file mode 100644 index 000000000..480034ebf --- /dev/null +++ b/@interactjs/interact/index.d.ts @@ -0,0 +1,76 @@ +/** @module interact */ +import '@interactjs/types/index'; +import { Options } from '@interactjs/core/defaultOptions'; +import Interactable from '@interactjs/core/Interactable'; +import { Scope } from '@interactjs/core/scope'; +import * as utils from '@interactjs/utils/index'; +declare module '@interactjs/core/scope' { + interface Scope { + interact?: InteractStatic; + } +} +export interface InteractStatic { + (target: Interact.Target, options?: Options): Interactable; + on: typeof on; + pointerMoveTolerance: typeof pointerMoveTolerance; + stop: typeof stop; + supportsPointerEvent: typeof supportsPointerEvent; + supportsTouch: typeof supportsTouch; + debug: typeof debug; + off: typeof off; + isSet: typeof isSet; + use: typeof use; + getPointerAverage: typeof utils.pointer.pointerAverage; + getTouchBBox: typeof utils.pointer.touchBBox; + getTouchDistance: typeof utils.pointer.touchDistance; + getTouchAngle: typeof utils.pointer.touchAngle; + getElementRect: typeof utils.dom.getElementRect; + getElementClientRect: typeof utils.dom.getElementClientRect; + matchesSelector: typeof utils.dom.matchesSelector; + closest: typeof utils.dom.closest; + addDocument: typeof scope.addDocument; + removeDocument: typeof scope.removeDocument; + dynamicDrop: (newValue?: boolean) => boolean | Interact.interact; + version: string; +} +declare const scope: Scope; +export declare function init(win: Window): InteractStatic; +/** + * ```js + * interact('#draggable').draggable(true) + * + * var rectables = interact('rect') + * rectables + * .gesturable(true) + * .on('gesturemove', function (event) { + * // ... + * }) + * ``` + * + * The methods of this variable can be used to set elements as interactables + * and also to change various default settings. + * + * Calling it as a function and passing an element or a valid CSS selector + * string returns an Interactable object which has various methods to configure + * it. + * + * @global + * + * @param {Element | string} target The HTML or SVG Element to interact with + * or CSS selector + * @return {Interactable} + */ +export declare const interact: InteractStatic; +declare function use(plugin: Interact.Plugin, options?: { + [key: string]: any; +}): InteractStatic; +declare function isSet(target: Interact.Element, options?: any): boolean; +declare function on(type: string | Interact.EventTypes, listener: Interact.ListenersArg, options?: object): InteractStatic; +declare function off(type: Interact.EventTypes, listener: any, options?: object): InteractStatic; +declare function debug(): Scope; +declare function supportsTouch(): boolean; +declare function supportsPointerEvent(): boolean; +declare function stop(): InteractStatic; +declare function pointerMoveTolerance(newValue?: number): number | InteractStatic; +export { scope }; +export default interact; diff --git a/@interactjs/interact/index.js b/@interactjs/interact/index.js new file mode 100644 index 000000000..6f441d16a --- /dev/null +++ b/@interactjs/interact/index.js @@ -0,0 +1,272 @@ +/** @module interact */ +import "../types/index.js"; +import { isNonNativeEvent, Scope } from "../core/scope.js"; +import browser from "../utils/browser.js"; +import events from "../utils/events.js"; +import * as utils from "../utils/index.js"; +const globalEvents = {}; +const scope = new Scope(); +export function init(win) { + scope.init(win); + return interact; +} +/** + * ```js + * interact('#draggable').draggable(true) + * + * var rectables = interact('rect') + * rectables + * .gesturable(true) + * .on('gesturemove', function (event) { + * // ... + * }) + * ``` + * + * The methods of this variable can be used to set elements as interactables + * and also to change various default settings. + * + * Calling it as a function and passing an element or a valid CSS selector + * string returns an Interactable object which has various methods to configure + * it. + * + * @global + * + * @param {Element | string} target The HTML or SVG Element to interact with + * or CSS selector + * @return {Interactable} + */ + +export const interact = function interact(target, options) { + let interactable = scope.interactables.get(target, options); + + if (!interactable) { + interactable = scope.interactables.new(target, options); + interactable.events.global = globalEvents; + } + + return interactable; +}; +/** + * Use a plugin + * + * @alias module:interact.use + * + * @param {Object} plugin + * @param {function} plugin.install + * @return {interact} + */ + +interact.use = use; + +function use(plugin, options) { + scope.usePlugin(plugin, options); + return interact; +} +/** + * Check if an element or selector has been set with the {@link interact} + * function + * + * @alias module:interact.isSet + * + * @param {Element} element The Element being searched for + * @return {boolean} Indicates if the element or CSS selector was previously + * passed to interact + */ + + +interact.isSet = isSet; + +function isSet(target, options) { + return !!scope.interactables.get(target, options && options.context); +} +/** + * Add a global listener for an InteractEvent or adds a DOM event to `document` + * + * @alias module:interact.on + * + * @param {string | array | object} type The types of events to listen for + * @param {function} listener The function event (s) + * @param {object | boolean} [options] object or useCapture flag for + * addEventListener + * @return {object} interact + */ + + +interact.on = on; + +function on(type, listener, options) { + if (utils.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (utils.is.array(type)) { + for (const eventType of type) { + interact.on(eventType, listener, options); + } + + return interact; + } + + if (utils.is.object(type)) { + for (const prop in type) { + interact.on(prop, type[prop], listener); + } + + return interact; + } // if it is an InteractEvent type, add listener to globalEvents + + + if (isNonNativeEvent(type, scope.actions)) { + // if this type of event was never bound + if (!globalEvents[type]) { + globalEvents[type] = [listener]; + } else { + globalEvents[type].push(listener); + } + } // If non InteractEvent type, addEventListener to document + else { + events.add(scope.document, type, listener, { + options + }); + } + + return interact; +} +/** + * Removes a global InteractEvent listener or DOM event from `document` + * + * @alias module:interact.off + * + * @param {string | array | object} type The types of events that were listened + * for + * @param {function} listener The listener function to be removed + * @param {object | boolean} options [options] object or useCapture flag for + * removeEventListener + * @return {object} interact + */ + + +interact.off = off; + +function off(type, listener, options) { + if (utils.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (utils.is.array(type)) { + for (const eventType of type) { + interact.off(eventType, listener, options); + } + + return interact; + } + + if (utils.is.object(type)) { + for (const prop in type) { + interact.off(prop, type[prop], listener); + } + + return interact; + } + + if (isNonNativeEvent(type, scope.actions)) { + let index; + + if (type in globalEvents && (index = globalEvents[type].indexOf(listener)) !== -1) { + globalEvents[type].splice(index, 1); + } + } else { + events.remove(scope.document, type, listener, options); + } + + return interact; +} + +interact.debug = debug; + +function debug() { + return scope; +} // expose the functions used to calculate multi-touch properties + + +interact.getPointerAverage = utils.pointer.pointerAverage; +interact.getTouchBBox = utils.pointer.touchBBox; +interact.getTouchDistance = utils.pointer.touchDistance; +interact.getTouchAngle = utils.pointer.touchAngle; +interact.getElementRect = utils.dom.getElementRect; +interact.getElementClientRect = utils.dom.getElementClientRect; +interact.matchesSelector = utils.dom.matchesSelector; +interact.closest = utils.dom.closest; +/** + * @alias module:interact.supportsTouch + * + * @return {boolean} Whether or not the browser supports touch input + */ + +interact.supportsTouch = supportsTouch; + +function supportsTouch() { + return browser.supportsTouch; +} +/** + * @alias module:interact.supportsPointerEvent + * + * @return {boolean} Whether or not the browser supports PointerEvents + */ + + +interact.supportsPointerEvent = supportsPointerEvent; + +function supportsPointerEvent() { + return browser.supportsPointerEvent; +} +/** + * Cancels all interactions (end events are not fired) + * + * @alias module:interact.stop + * + * @return {object} interact + */ + + +interact.stop = stop; + +function stop() { + for (const interaction of scope.interactions.list) { + interaction.stop(); + } + + return interact; +} +/** + * Returns or sets the distance the pointer must be moved before an action + * sequence occurs. This also affects tolerance for tap events. + * + * @alias module:interact.pointerMoveTolerance + * + * @param {number} [newValue] The movement from the start position must be greater than this value + * @return {interact | number} + */ + + +interact.pointerMoveTolerance = pointerMoveTolerance; + +function pointerMoveTolerance(newValue) { + if (utils.is.number(newValue)) { + scope.interactions.pointerMoveTolerance = newValue; + return interact; + } + + return scope.interactions.pointerMoveTolerance; +} + +interact.addDocument = (doc, options) => scope.addDocument(doc, options); + +interact.removeDocument = doc => scope.removeDocument(doc); // eslint-disable-next-line no-undef + + +interact.version = "1.9.4"; +scope.interact = interact; +export { scope }; +export default interact; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/interact/index.js.map b/@interactjs/interact/index.js.map new file mode 100644 index 000000000..d63057c1a --- /dev/null +++ b/@interactjs/interact/index.js.map @@ -0,0 +1,83 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "isNonNativeEvent", + "Scope", + "browser", + "events", + "utils", + "globalEvents", + "scope", + "init", + "win", + "interact", + "target", + "options", + "interactable", + "interactables", + "get", + "new", + "global", + "use", + "plugin", + "usePlugin", + "isSet", + "context", + "on", + "type", + "listener", + "is", + "string", + "search", + "trim", + "split", + "array", + "eventType", + "object", + "prop", + "actions", + "push", + "add", + "document", + "off", + "index", + "indexOf", + "splice", + "remove", + "debug", + "getPointerAverage", + "pointer", + "pointerAverage", + "getTouchBBox", + "touchBBox", + "getTouchDistance", + "touchDistance", + "getTouchAngle", + "touchAngle", + "getElementRect", + "dom", + "getElementClientRect", + "matchesSelector", + "closest", + "supportsTouch", + "supportsPointerEvent", + "stop", + "interaction", + "interactions", + "list", + "pointerMoveTolerance", + "newValue", + "number", + "addDocument", + "doc", + "removeDocument", + "version" + ], + "mappings": "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", + "sourcesContent": [ + "/** @module interact */\n\nimport '@interactjs/types/index'\nimport { Options } from '@interactjs/core/defaultOptions'\nimport Interactable from '@interactjs/core/Interactable'\nimport { isNonNativeEvent, Scope } from '@interactjs/core/scope'\nimport browser from '@interactjs/utils/browser'\nimport events from '@interactjs/utils/events'\nimport * as utils from '@interactjs/utils/index'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n interact?: InteractStatic\n }\n}\n\nexport interface InteractStatic {\n (target: Interact.Target, options?: Options): Interactable\n on: typeof on\n pointerMoveTolerance: typeof pointerMoveTolerance\n stop: typeof stop\n supportsPointerEvent: typeof supportsPointerEvent\n supportsTouch: typeof supportsTouch\n debug: typeof debug\n off: typeof off\n isSet: typeof isSet\n use: typeof use\n getPointerAverage: typeof utils.pointer.pointerAverage\n getTouchBBox: typeof utils.pointer.touchBBox\n getTouchDistance: typeof utils.pointer.touchDistance\n getTouchAngle: typeof utils.pointer.touchAngle\n getElementRect: typeof utils.dom.getElementRect\n getElementClientRect: typeof utils.dom.getElementClientRect\n matchesSelector: typeof utils.dom.matchesSelector\n closest: typeof utils.dom.closest\n addDocument: typeof scope.addDocument\n removeDocument: typeof scope.removeDocument\n dynamicDrop: (newValue?: boolean) => boolean | Interact.interact\n version: string\n}\n\nconst globalEvents: any = {}\nconst scope = new Scope()\n\nexport function init (win: Window) {\n scope.init(win)\n\n return interact\n}\n\n/**\n * ```js\n * interact('#draggable').draggable(true)\n *\n * var rectables = interact('rect')\n * rectables\n * .gesturable(true)\n * .on('gesturemove', function (event) {\n * // ...\n * })\n * ```\n *\n * The methods of this variable can be used to set elements as interactables\n * and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to configure\n * it.\n *\n * @global\n *\n * @param {Element | string} target The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\n */\nexport const interact: InteractStatic = function interact (target: Interact.Target, options?: any) {\n let interactable = scope.interactables.get(target, options)\n\n if (!interactable) {\n interactable = scope.interactables.new(target, options)\n interactable.events.global = globalEvents\n }\n\n return interactable\n} as InteractStatic\n\n/**\n * Use a plugin\n *\n * @alias module:interact.use\n *\n * @param {Object} plugin\n * @param {function} plugin.install\n * @return {interact}\n */\ninteract.use = use\nfunction use (plugin: Interact.Plugin, options?: { [key: string]: any }) {\n scope.usePlugin(plugin, options)\n\n return interact\n}\n\n/**\n * Check if an element or selector has been set with the {@link interact}\n * function\n *\n * @alias module:interact.isSet\n *\n * @param {Element} element The Element being searched for\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n */\ninteract.isSet = isSet\nfunction isSet (target: Interact.Element, options?: any) {\n return !!scope.interactables.get(target, options && options.context)\n}\n\n/**\n * Add a global listener for an InteractEvent or adds a DOM event to `document`\n *\n * @alias module:interact.on\n *\n * @param {string | array | object} type The types of events to listen for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] object or useCapture flag for\n * addEventListener\n * @return {object} interact\n */\ninteract.on = on\nfunction on (type: string | Interact.EventTypes, listener: Interact.ListenersArg, options?: object) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/)\n }\n\n if (utils.is.array(type)) {\n for (const eventType of (type as any[])) {\n interact.on(eventType, listener, options)\n }\n\n return interact\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, (type as any)[prop], listener)\n }\n\n return interact\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (isNonNativeEvent(type, scope.actions)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener]\n }\n else {\n globalEvents[type].push(listener)\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener as Interact.Listener, { options })\n }\n\n return interact\n}\n\n/**\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n * @alias module:interact.off\n *\n * @param {string | array | object} type The types of events that were listened\n * for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} options [options] object or useCapture flag for\n * removeEventListener\n * @return {object} interact\n */\ninteract.off = off\nfunction off (type: Interact.EventTypes, listener: any, options?: object) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/)\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options)\n }\n\n return interact\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener)\n }\n\n return interact\n }\n\n if (isNonNativeEvent(type, scope.actions)) {\n let index\n\n if (type in globalEvents &&\n (index = globalEvents[type].indexOf(listener)) !== -1) {\n globalEvents[type].splice(index, 1)\n }\n }\n else {\n events.remove(scope.document, type, listener, options)\n }\n\n return interact\n}\n\ninteract.debug = debug\nfunction debug () {\n return scope\n}\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointer.pointerAverage\ninteract.getTouchBBox = utils.pointer.touchBBox\ninteract.getTouchDistance = utils.pointer.touchDistance\ninteract.getTouchAngle = utils.pointer.touchAngle\n\ninteract.getElementRect = utils.dom.getElementRect\ninteract.getElementClientRect = utils.dom.getElementClientRect\ninteract.matchesSelector = utils.dom.matchesSelector\ninteract.closest = utils.dom.closest\n\n/**\n * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */\ninteract.supportsTouch = supportsTouch\nfunction supportsTouch () {\n return browser.supportsTouch\n}\n\n/**\n * @alias module:interact.supportsPointerEvent\n *\n * @return {boolean} Whether or not the browser supports PointerEvents\n */\ninteract.supportsPointerEvent = supportsPointerEvent\nfunction supportsPointerEvent () {\n return browser.supportsPointerEvent\n}\n\n/**\n * Cancels all interactions (end events are not fired)\n *\n * @alias module:interact.stop\n *\n * @return {object} interact\n */\ninteract.stop = stop\nfunction stop () {\n for (const interaction of scope.interactions.list) {\n interaction.stop()\n }\n\n return interact\n}\n\n/**\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n * @alias module:interact.pointerMoveTolerance\n *\n * @param {number} [newValue] The movement from the start position must be greater than this value\n * @return {interact | number}\n */\ninteract.pointerMoveTolerance = pointerMoveTolerance\nfunction pointerMoveTolerance (newValue?: number) {\n if (utils.is.number(newValue)) {\n scope.interactions.pointerMoveTolerance = newValue\n\n return interact\n }\n\n return scope.interactions.pointerMoveTolerance\n}\n\ninteract.addDocument = (doc, options) => scope.addDocument(doc, options)\ninteract.removeDocument = doc => scope.removeDocument(doc)\n\n// eslint-disable-next-line no-undef\ninteract.version = process.env.npm_package_version\n\nscope.interact = interact\n\nexport { scope }\nexport default interact\n" + ] +} \ No newline at end of file diff --git a/@interactjs/interact/index.min.js b/@interactjs/interact/index.min.js new file mode 100644 index 000000000..b5169a142 --- /dev/null +++ b/@interactjs/interact/index.min.js @@ -0,0 +1,2 @@ +import"../types/index.min.js";import{isNonNativeEvent as t,Scope as e}from"../core/scope.min.js";import n from"../utils/browser.min.js";import r from"../utils/events.min.js";import*as i from"../utils/index.min.js";const o={},c=new e;export function init(t){return c.init(t),interact}export const interact=function(t,e){let n=c.interactables.get(t,e);return n||(n=c.interactables.new(t,e),n.events.global=o),n};interact.use=function(t,e){return c.usePlugin(t,e),interact},interact.isSet=function(t,e){return!!c.interactables.get(t,e&&e.context)},interact.on=function(e,n,a){i.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/));if(i.is.array(e)){for(const t of e)interact.on(t,n,a);return interact}if(i.is.object(e)){for(const t in e)interact.on(t,e[t],n);return interact}t(e,c.actions)?o[e]?o[e].push(n):o[e]=[n]:r.add(c.document,e,n,{options:a});return interact},interact.off=function(e,n,a){i.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/));if(i.is.array(e)){for(const t of e)interact.off(t,n,a);return interact}if(i.is.object(e)){for(const t in e)interact.off(t,e[t],n);return interact}if(t(e,c.actions)){let t;e in o&&-1!==(t=o[e].indexOf(n))&&o[e].splice(t,1)}else r.remove(c.document,e,n,a);return interact},interact.debug=function(){return c},interact.getPointerAverage=i.pointer.pointerAverage,interact.getTouchBBox=i.pointer.touchBBox,interact.getTouchDistance=i.pointer.touchDistance,interact.getTouchAngle=i.pointer.touchAngle,interact.getElementRect=i.dom.getElementRect,interact.getElementClientRect=i.dom.getElementClientRect,interact.matchesSelector=i.dom.matchesSelector,interact.closest=i.dom.closest,interact.supportsTouch=function(){return n.supportsTouch},interact.supportsPointerEvent=function(){return n.supportsPointerEvent},interact.stop=function(){for(const t of c.interactions.list)t.stop();return interact},interact.pointerMoveTolerance=function(t){if(i.is.number(t))return c.interactions.pointerMoveTolerance=t,interact;return c.interactions.pointerMoveTolerance},interact.addDocument=(t,e)=>c.addDocument(t,e),interact.removeDocument=t=>c.removeDocument(t),interact.version="1.9.4",c.interact=interact;export{c as scope};export default interact; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/interact/index.min.js.map b/@interactjs/interact/index.min.js.map new file mode 100644 index 000000000..a4e6738e0 --- /dev/null +++ b/@interactjs/interact/index.min.js.map @@ -0,0 +1,83 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "isNonNativeEvent", + "Scope", + "browser", + "events", + "utils", + "globalEvents", + "scope", + "init", + "win", + "interact", + "target", + "options", + "interactable", + "interactables", + "get", + "new", + "global", + "use", + "plugin", + "usePlugin", + "isSet", + "context", + "on", + "type", + "listener", + "is", + "string", + "search", + "trim", + "split", + "array", + "eventType", + "object", + "prop", + "actions", + "push", + "add", + "document", + "off", + "index", + "indexOf", + "splice", + "remove", + "debug", + "getPointerAverage", + "pointer", + "pointerAverage", + "getTouchBBox", + "touchBBox", + "getTouchDistance", + "touchDistance", + "getTouchAngle", + "touchAngle", + "getElementRect", + "dom", + "getElementClientRect", + "matchesSelector", + "closest", + "supportsTouch", + "supportsPointerEvent", + "stop", + "interaction", + "interactions", + "list", + "pointerMoveTolerance", + "newValue", + "number", + "addDocument", + "doc", + "removeDocument", + "version" + ], + "mappings": "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", + "sourcesContent": [ + "/** @module interact */\n\nimport '@interactjs/types/index'\nimport { Options } from '@interactjs/core/defaultOptions'\nimport Interactable from '@interactjs/core/Interactable'\nimport { isNonNativeEvent, Scope } from '@interactjs/core/scope'\nimport browser from '@interactjs/utils/browser'\nimport events from '@interactjs/utils/events'\nimport * as utils from '@interactjs/utils/index'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n interact?: InteractStatic\n }\n}\n\nexport interface InteractStatic {\n (target: Interact.Target, options?: Options): Interactable\n on: typeof on\n pointerMoveTolerance: typeof pointerMoveTolerance\n stop: typeof stop\n supportsPointerEvent: typeof supportsPointerEvent\n supportsTouch: typeof supportsTouch\n debug: typeof debug\n off: typeof off\n isSet: typeof isSet\n use: typeof use\n getPointerAverage: typeof utils.pointer.pointerAverage\n getTouchBBox: typeof utils.pointer.touchBBox\n getTouchDistance: typeof utils.pointer.touchDistance\n getTouchAngle: typeof utils.pointer.touchAngle\n getElementRect: typeof utils.dom.getElementRect\n getElementClientRect: typeof utils.dom.getElementClientRect\n matchesSelector: typeof utils.dom.matchesSelector\n closest: typeof utils.dom.closest\n addDocument: typeof scope.addDocument\n removeDocument: typeof scope.removeDocument\n dynamicDrop: (newValue?: boolean) => boolean | Interact.interact\n version: string\n}\n\nconst globalEvents: any = {}\nconst scope = new Scope()\n\nexport function init (win: Window) {\n scope.init(win)\n\n return interact\n}\n\n/**\n * ```js\n * interact('#draggable').draggable(true)\n *\n * var rectables = interact('rect')\n * rectables\n * .gesturable(true)\n * .on('gesturemove', function (event) {\n * // ...\n * })\n * ```\n *\n * The methods of this variable can be used to set elements as interactables\n * and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to configure\n * it.\n *\n * @global\n *\n * @param {Element | string} target The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\n */\nexport const interact: InteractStatic = function interact (target: Interact.Target, options?: any) {\n let interactable = scope.interactables.get(target, options)\n\n if (!interactable) {\n interactable = scope.interactables.new(target, options)\n interactable.events.global = globalEvents\n }\n\n return interactable\n} as InteractStatic\n\n/**\n * Use a plugin\n *\n * @alias module:interact.use\n *\n * @param {Object} plugin\n * @param {function} plugin.install\n * @return {interact}\n */\ninteract.use = use\nfunction use (plugin: Interact.Plugin, options?: { [key: string]: any }) {\n scope.usePlugin(plugin, options)\n\n return interact\n}\n\n/**\n * Check if an element or selector has been set with the {@link interact}\n * function\n *\n * @alias module:interact.isSet\n *\n * @param {Element} element The Element being searched for\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n */\ninteract.isSet = isSet\nfunction isSet (target: Interact.Element, options?: any) {\n return !!scope.interactables.get(target, options && options.context)\n}\n\n/**\n * Add a global listener for an InteractEvent or adds a DOM event to `document`\n *\n * @alias module:interact.on\n *\n * @param {string | array | object} type The types of events to listen for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] object or useCapture flag for\n * addEventListener\n * @return {object} interact\n */\ninteract.on = on\nfunction on (type: string | Interact.EventTypes, listener: Interact.ListenersArg, options?: object) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/)\n }\n\n if (utils.is.array(type)) {\n for (const eventType of (type as any[])) {\n interact.on(eventType, listener, options)\n }\n\n return interact\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, (type as any)[prop], listener)\n }\n\n return interact\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (isNonNativeEvent(type, scope.actions)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener]\n }\n else {\n globalEvents[type].push(listener)\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener as Interact.Listener, { options })\n }\n\n return interact\n}\n\n/**\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n * @alias module:interact.off\n *\n * @param {string | array | object} type The types of events that were listened\n * for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} options [options] object or useCapture flag for\n * removeEventListener\n * @return {object} interact\n */\ninteract.off = off\nfunction off (type: Interact.EventTypes, listener: any, options?: object) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/)\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options)\n }\n\n return interact\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener)\n }\n\n return interact\n }\n\n if (isNonNativeEvent(type, scope.actions)) {\n let index\n\n if (type in globalEvents &&\n (index = globalEvents[type].indexOf(listener)) !== -1) {\n globalEvents[type].splice(index, 1)\n }\n }\n else {\n events.remove(scope.document, type, listener, options)\n }\n\n return interact\n}\n\ninteract.debug = debug\nfunction debug () {\n return scope\n}\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointer.pointerAverage\ninteract.getTouchBBox = utils.pointer.touchBBox\ninteract.getTouchDistance = utils.pointer.touchDistance\ninteract.getTouchAngle = utils.pointer.touchAngle\n\ninteract.getElementRect = utils.dom.getElementRect\ninteract.getElementClientRect = utils.dom.getElementClientRect\ninteract.matchesSelector = utils.dom.matchesSelector\ninteract.closest = utils.dom.closest\n\n/**\n * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */\ninteract.supportsTouch = supportsTouch\nfunction supportsTouch () {\n return browser.supportsTouch\n}\n\n/**\n * @alias module:interact.supportsPointerEvent\n *\n * @return {boolean} Whether or not the browser supports PointerEvents\n */\ninteract.supportsPointerEvent = supportsPointerEvent\nfunction supportsPointerEvent () {\n return browser.supportsPointerEvent\n}\n\n/**\n * Cancels all interactions (end events are not fired)\n *\n * @alias module:interact.stop\n *\n * @return {object} interact\n */\ninteract.stop = stop\nfunction stop () {\n for (const interaction of scope.interactions.list) {\n interaction.stop()\n }\n\n return interact\n}\n\n/**\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n * @alias module:interact.pointerMoveTolerance\n *\n * @param {number} [newValue] The movement from the start position must be greater than this value\n * @return {interact | number}\n */\ninteract.pointerMoveTolerance = pointerMoveTolerance\nfunction pointerMoveTolerance (newValue?: number) {\n if (utils.is.number(newValue)) {\n scope.interactions.pointerMoveTolerance = newValue\n\n return interact\n }\n\n return scope.interactions.pointerMoveTolerance\n}\n\ninteract.addDocument = (doc, options) => scope.addDocument(doc, options)\ninteract.removeDocument = doc => scope.removeDocument(doc)\n\n// eslint-disable-next-line no-undef\ninteract.version = process.env.npm_package_version\n\nscope.interact = interact\n\nexport { scope }\nexport default interact\n" + ] +} \ No newline at end of file diff --git a/@interactjs/interact/interact.spec.d.ts b/@interactjs/interact/interact.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/interact/interact.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/interactjs/.npmignore b/@interactjs/interactjs/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/interactjs/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/interactjs/LICENSE b/@interactjs/interactjs/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/interactjs/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/interactjs/index.d.ts b/@interactjs/interactjs/index.d.ts new file mode 100644 index 000000000..0242a42a4 --- /dev/null +++ b/@interactjs/interactjs/index.d.ts @@ -0,0 +1,4 @@ +import '@interactjs/types/index'; +import interact from '@interactjs/interact/index'; +export default interact; +export declare function init(win: Window): import("@interactjs/interact/index").InteractStatic; diff --git a/@interactjs/interactjs/index.js b/@interactjs/interactjs/index.js new file mode 100644 index 000000000..34f78d8ce --- /dev/null +++ b/@interactjs/interactjs/index.js @@ -0,0 +1,42 @@ +import "../types/index.js"; +import actions from "../actions/index.js"; +import autoScroll from "../auto-scroll/index.js"; +import autoStart from "../auto-start/index.js"; +import devTools from "../dev-tools/index.js"; +import inertia from "../inertia/index.js"; +import modifiers from "../modifiers/index.js"; +import offset from "../offset/index.js"; +import pointerEvents from "../pointer-events/index.js"; +import reflow from "../reflow/index.js"; +import interact, { init as initInteract } from "../interact/index.js"; + +if (typeof window === 'object' && !!window) { + init(window); +} + +export default interact; +export function init(win) { + initInteract(win); + interact.use(offset); // pointerEvents + + interact.use(pointerEvents); // inertia + + interact.use(inertia); // snap, resize, etc. + + interact.use(modifiers); // autoStart, hold + + interact.use(autoStart); // drag and drop, resize, gesture + + interact.use(actions); // autoScroll + + interact.use(autoScroll); // reflow + + interact.use(reflow); // eslint-disable-next-line no-undef + + if ("development" !== 'production') { + interact.use(devTools); + } + + return interact; +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/interactjs/index.js.map b/@interactjs/interactjs/index.js.map new file mode 100644 index 000000000..a6190f6a0 --- /dev/null +++ b/@interactjs/interactjs/index.js.map @@ -0,0 +1,27 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "actions", + "autoScroll", + "autoStart", + "devTools", + "inertia", + "modifiers", + "offset", + "pointerEvents", + "reflow", + "interact", + "init", + "initInteract", + "window", + "win", + "use" + ], + "mappings": "AAAA,OAAO,mBAAP;AACA,OAAOA,OAAP,MAAoB,qBAApB;AACA,OAAOC,UAAP,MAAuB,yBAAvB;AACA,OAAOC,SAAP,MAAsB,wBAAtB;AACA,OAAOC,QAAP,MAAqB,uBAArB;AACA,OAAOC,OAAP,MAAoB,qBAApB;AACA,OAAOC,SAAP,MAAsB,uBAAtB;AACA,OAAOC,MAAP,MAAmB,oBAAnB;AACA,OAAOC,aAAP,MAA0B,4BAA1B;AACA,OAAOC,MAAP,MAAmB,oBAAnB;AACA,OAAOC,QAAP,IAAmBC,IAAI,IAAIC,YAA3B,QAA+C,sBAA/C;;AAEA,IAAI,OAAOC,MAAP,KAAkB,QAAlB,IAA8B,CAAC,CAACA,MAApC,EAA4C;AAC1CF,EAAAA,IAAI,CAACE,MAAD,CAAJ;AACD;;AAED,eAAeH,QAAf;AAEA,OAAO,SAASC,IAAT,CAAeG,GAAf,EAA4B;AACjCF,EAAAA,YAAY,CAACE,GAAD,CAAZ;AAEAJ,EAAAA,QAAQ,CAACK,GAAT,CAAaR,MAAb,EAHiC,CAKjC;;AACAG,EAAAA,QAAQ,CAACK,GAAT,CAAaP,aAAb,EANiC,CAQjC;;AACAE,EAAAA,QAAQ,CAACK,GAAT,CAAaV,OAAb,EATiC,CAWjC;;AACAK,EAAAA,QAAQ,CAACK,GAAT,CAAaT,SAAb,EAZiC,CAcjC;;AACAI,EAAAA,QAAQ,CAACK,GAAT,CAAaZ,SAAb,EAfiC,CAiBjC;;AACAO,EAAAA,QAAQ,CAACK,GAAT,CAAad,OAAb,EAlBiC,CAoBjC;;AACAS,EAAAA,QAAQ,CAACK,GAAT,CAAab,UAAb,EArBiC,CAuBjC;;AACAQ,EAAAA,QAAQ,CAACK,GAAT,CAAaN,MAAb,EAxBiC,CA0BjC;;AACA,MAAI,kBAAyB,YAA7B,EAA2C;AACzCC,IAAAA,QAAQ,CAACK,GAAT,CAAaX,QAAb;AACD;;AAED,SAAOM,QAAP;AACD", + "sourcesContent": [ + "import '@interactjs/types/index'\nimport actions from '@interactjs/actions/index'\nimport autoScroll from '@interactjs/auto-scroll/index'\nimport autoStart from '@interactjs/auto-start/index'\nimport devTools from '@interactjs/dev-tools/index'\nimport inertia from '@interactjs/inertia/index'\nimport modifiers from '@interactjs/modifiers/index'\nimport offset from '@interactjs/offset'\nimport pointerEvents from '@interactjs/pointer-events/index'\nimport reflow from '@interactjs/reflow/index'\nimport interact, { init as initInteract } from '@interactjs/interact/index'\n\nif (typeof window === 'object' && !!window) {\n init(window)\n}\n\nexport default interact\n\nexport function init (win: Window) {\n initInteract(win)\n\n interact.use(offset)\n\n // pointerEvents\n interact.use(pointerEvents)\n\n // inertia\n interact.use(inertia)\n\n // snap, resize, etc.\n interact.use(modifiers)\n\n // autoStart, hold\n interact.use(autoStart)\n\n // drag and drop, resize, gesture\n interact.use(actions)\n\n // autoScroll\n interact.use(autoScroll)\n\n // reflow\n interact.use(reflow)\n\n // eslint-disable-next-line no-undef\n if (process.env.NODE_ENV !== 'production') {\n interact.use(devTools)\n }\n\n return interact\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/interactjs/index.min.js b/@interactjs/interactjs/index.min.js new file mode 100644 index 000000000..3fd636479 --- /dev/null +++ b/@interactjs/interactjs/index.min.js @@ -0,0 +1,2 @@ +import"../types/index.min.js";import i from"../actions/index.min.js";import o from"../auto-scroll/index.min.js";import n from"../auto-start/index.min.js";import e from"../dev-tools/index.min.js";import t from"../inertia/index.min.js";import m from"../modifiers/index.min.js";import r from"../offset/index.min.js";import s from"../pointer-events/index.min.js";import d from"../reflow/index.min.js";import f,{init as p}from"../interact/index.min.js";"object"==typeof window&&window&&init(window);export default f;export function init(e){return p(e),f.use(r),f.use(s),f.use(t),f.use(m),f.use(n),f.use(i),f.use(o),f.use(d),f} +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/interactjs/index.min.js.map b/@interactjs/interactjs/index.min.js.map new file mode 100644 index 000000000..a48dc4dbf --- /dev/null +++ b/@interactjs/interactjs/index.min.js.map @@ -0,0 +1,27 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "actions", + "autoScroll", + "autoStart", + "devTools", + "inertia", + "modifiers", + "offset", + "pointerEvents", + "reflow", + "interact", + "initInteract", + "window", + "init", + "win", + "use" + ], + "mappings": "MAAO,+BACAA,MAAa,iCACbC,MAAgB,qCAChBC,MAAe,oCACfC,MAAc,mCACdC,MAAa,iCACbC,MAAe,mCACfC,MAAY,gCACZC,MAAmB,wCACnBC,MAAY,gCACZC,WAAoBC,MAAoB,2BAEzB,iBAAXC,QAAyBA,QAClCC,KAAKD,uBAGQF,SAER,SAASG,KAAMC,GA+BpB,OA9BAH,EAAaG,GAEbJ,EAASK,IAAIR,GAGbG,EAASK,IAAIP,GAGbE,EAASK,IAAIV,GAGbK,EAASK,IAAIT,GAGbI,EAASK,IAAIZ,GAGbO,EAASK,IAAId,GAGbS,EAASK,IAAIb,GAGbQ,EAASK,IAAIN,GAONC", + "sourcesContent": [ + "import '@interactjs/types/index'\nimport actions from '@interactjs/actions/index'\nimport autoScroll from '@interactjs/auto-scroll/index'\nimport autoStart from '@interactjs/auto-start/index'\nimport devTools from '@interactjs/dev-tools/index'\nimport inertia from '@interactjs/inertia/index'\nimport modifiers from '@interactjs/modifiers/index'\nimport offset from '@interactjs/offset'\nimport pointerEvents from '@interactjs/pointer-events/index'\nimport reflow from '@interactjs/reflow/index'\nimport interact, { init as initInteract } from '@interactjs/interact/index'\n\nif (typeof window === 'object' && !!window) {\n init(window)\n}\n\nexport default interact\n\nexport function init (win: Window) {\n initInteract(win)\n\n interact.use(offset)\n\n // pointerEvents\n interact.use(pointerEvents)\n\n // inertia\n interact.use(inertia)\n\n // snap, resize, etc.\n interact.use(modifiers)\n\n // autoStart, hold\n interact.use(autoStart)\n\n // drag and drop, resize, gesture\n interact.use(actions)\n\n // autoScroll\n interact.use(autoScroll)\n\n // reflow\n interact.use(reflow)\n\n // eslint-disable-next-line no-undef\n if (process.env.NODE_ENV !== 'production') {\n interact.use(devTools)\n }\n\n return interact\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/.npmignore b/@interactjs/modifiers/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/modifiers/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/modifiers/LICENSE b/@interactjs/modifiers/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/modifiers/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/modifiers/Modification.d.ts b/@interactjs/modifiers/Modification.d.ts new file mode 100644 index 000000000..42315ceaa --- /dev/null +++ b/@interactjs/modifiers/Modification.d.ts @@ -0,0 +1,71 @@ +import { Modifier, ModifierArg, ModifierState } from './base'; +export interface ModificationResult { + delta: Interact.Point; + rectDelta: Interact.Rect; + coords: Interact.Point; + rect: Interact.FullRect; + eventProps: any[]; + changed: boolean; +} +interface MethodArg { + phase: Interact.EventPhase; + pageCoords?: Interact.Point; + rect?: Interact.FullRect; + coords?: Interact.Point; + preEnd?: boolean; + skipModifiers?: number; +} +export default class Modification { + readonly interaction: Readonly; + states: ModifierState[]; + startOffset: Interact.Rect; + startDelta: Interact.Point; + result?: ModificationResult; + endResult?: Interact.Point; + edges: Interact.EdgeOptions; + constructor(interaction: Readonly); + start({ phase }: MethodArg, pageCoords: Interact.Point): ModificationResult; + fillArg(arg: Partial): void; + startAll(arg: MethodArg & Partial): void; + setAll(arg: MethodArg & Partial): ModificationResult; + applyToInteraction(arg: { + phase: Interact.EventPhase; + rect?: Interact.Rect; + }): void; + setAndApply(arg: Partial & { + phase: Interact.EventPhase; + preEnd?: boolean; + skipModifiers?: number; + modifiedCoords?: Interact.Point; + }): void | false; + beforeEnd(arg: Omit & { + state?: ModifierState; + }): void | false; + stop(arg: { + interaction: Interact.Interaction; + }): void; + prepareStates(modifierList: Modifier[]): { + options: {}; + methods?: { + start?: (arg: ModifierArg) => void; + set: (arg: ModifierArg) => void; + beforeEnd?: (arg: ModifierArg) => void | import("@interactjs/types/types").Point; + stop?: (arg: ModifierArg) => void; + }; + index?: number; + name?: any; + }[]; + restoreInteractionCoords({ interaction: { coords, rect, modification } }: { + interaction: Interact.Interaction; + }): void; + shouldDo(options: any, preEnd?: boolean, phase?: string, requireEndOnly?: boolean): boolean; + copyFrom(other: Modification): void; + destroy(): void; +} +export declare function getRectOffset(rect: any, coords: any): { + left: number; + top: number; + right: number; + bottom: number; +}; +export {}; diff --git a/@interactjs/modifiers/Modification.js b/@interactjs/modifiers/Modification.js new file mode 100644 index 000000000..1b25382ac --- /dev/null +++ b/@interactjs/modifiers/Modification.js @@ -0,0 +1,396 @@ +import clone from "../utils/clone.js"; +import extend from "../utils/extend.js"; +import * as rectUtils from "../utils/rect.js"; +export default class Modification { + constructor(interaction) { + this.interaction = interaction; + this.states = []; + this.startOffset = { + left: 0, + right: 0, + top: 0, + bottom: 0 + }; + this.startDelta = null; + this.result = null; + this.endResult = null; + this.edges = void 0; + this.result = createResult(); + } + + start({ + phase + }, pageCoords) { + const { + interaction + } = this; + const modifierList = getModifierList(interaction); + this.prepareStates(modifierList); + this.edges = extend({}, interaction.edges); + this.startOffset = getRectOffset(interaction.rect, pageCoords); + this.startDelta = { + x: 0, + y: 0 + }; + const arg = { + phase, + pageCoords, + preEnd: false + }; + this.result = createResult(); + this.startAll(arg); + const result = this.result = this.setAll(arg); + return result; + } + + fillArg(arg) { + const { + interaction + } = this; + arg.interaction = interaction; + arg.interactable = interaction.interactable; + arg.element = interaction.element; + arg.rect = arg.rect || interaction.rect; + arg.edges = this.edges; + arg.startOffset = this.startOffset; + } + + startAll(arg) { + this.fillArg(arg); + + for (const state of this.states) { + if (state.methods.start) { + arg.state = state; + state.methods.start(arg); + } + } + } + + setAll(arg) { + this.fillArg(arg); + const { + phase, + preEnd, + skipModifiers, + rect: unmodifiedRect + } = arg; + arg.coords = extend({}, arg.pageCoords); + arg.rect = extend({}, unmodifiedRect); + const states = skipModifiers ? this.states.slice(skipModifiers) : this.states; + const newResult = createResult(arg.coords, arg.rect); + + for (const state of states) { + const { + options + } = state; + const lastModifierCoords = extend({}, arg.coords); + let returnValue = null; + + if (state.methods.set && this.shouldDo(options, preEnd, phase)) { + arg.state = state; + returnValue = state.methods.set(arg); + rectUtils.addEdges(this.interaction.edges, arg.rect, { + x: arg.coords.x - lastModifierCoords.x, + y: arg.coords.y - lastModifierCoords.y + }); + } + + newResult.eventProps.push(returnValue); + } + + newResult.delta.x = arg.coords.x - arg.pageCoords.x; + newResult.delta.y = arg.coords.y - arg.pageCoords.y; + newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left; + newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right; + newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top; + newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom; + const prevCoords = this.result.coords; + const prevRect = this.result.rect; + + if (prevCoords && prevRect) { + const rectChanged = newResult.rect.left !== prevRect.left || newResult.rect.right !== prevRect.right || newResult.rect.top !== prevRect.top || newResult.rect.bottom !== prevRect.bottom; + newResult.changed = rectChanged || prevCoords.x !== newResult.coords.x || prevCoords.y !== newResult.coords.y; + } + + return newResult; + } + + applyToInteraction(arg) { + const { + interaction + } = this; + const { + phase + } = arg; + const curCoords = interaction.coords.cur; + const startCoords = interaction.coords.start; + const { + result, + startDelta + } = this; + const curDelta = result.delta; + + if (phase === 'start') { + extend(this.startDelta, result.delta); + } + + for (const [coordsSet, delta] of [[startCoords, startDelta], [curCoords, curDelta]]) { + coordsSet.page.x += delta.x; + coordsSet.page.y += delta.y; + coordsSet.client.x += delta.x; + coordsSet.client.y += delta.y; + } + + const { + rectDelta + } = this.result; + const rect = arg.rect || interaction.rect; + rect.left += rectDelta.left; + rect.right += rectDelta.right; + rect.top += rectDelta.top; + rect.bottom += rectDelta.bottom; + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + + setAndApply(arg) { + const { + interaction + } = this; + const { + phase, + preEnd, + skipModifiers + } = arg; + const result = this.setAll({ + preEnd, + phase, + pageCoords: arg.modifiedCoords || interaction.coords.cur.page + }); + this.result = result; // don't fire an action move if a modifier would keep the event in the same + // cordinates as before + + if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) { + return false; + } + + if (arg.modifiedCoords) { + const { + page + } = interaction.coords.cur; + const adjustment = { + x: arg.modifiedCoords.x - page.x, + y: arg.modifiedCoords.y - page.y + }; + result.coords.x += adjustment.x; + result.coords.y += adjustment.y; + result.delta.x += adjustment.x; + result.delta.y += adjustment.y; + } + + this.applyToInteraction(arg); + } + + beforeEnd(arg) { + const { + interaction, + event + } = arg; + const states = this.states; + + if (!states || !states.length) { + return; + } + + let doPreend = false; + + for (const state of states) { + arg.state = state; + const { + options, + methods + } = state; + const endPosition = methods.beforeEnd && methods.beforeEnd(arg); + + if (endPosition) { + this.endResult = endPosition; + return false; + } + + doPreend = doPreend || !doPreend && this.shouldDo(options, true, arg.phase, true); + } + + if (doPreend) { + // trigger a final modified move before ending + interaction.move({ + event, + preEnd: true + }); + } + } + + stop(arg) { + const { + interaction + } = arg; + + if (!this.states || !this.states.length) { + return; + } + + const modifierArg = extend({ + states: this.states, + interactable: interaction.interactable, + element: interaction.element, + rect: null + }, arg); + this.fillArg(modifierArg); + + for (const state of this.states) { + modifierArg.state = state; + + if (state.methods.stop) { + state.methods.stop(modifierArg); + } + } + + this.states = null; + this.endResult = null; + } + + prepareStates(modifierList) { + this.states = []; + + for (let index = 0; index < modifierList.length; index++) { + const { + options, + methods, + name + } = modifierList[index]; + + if (options && options.enabled === false) { + continue; + } + + this.states.push({ + options, + methods, + index, + name + }); + } + + return this.states; + } + + restoreInteractionCoords({ + interaction: { + coords, + rect, + modification + } + }) { + if (!modification.result) { + return; + } + + const { + startDelta + } = modification; + const { + delta: curDelta, + rectDelta + } = modification.result; + const coordsAndDeltas = [[coords.start, startDelta], [coords.cur, curDelta]]; + + for (const [coordsSet, delta] of coordsAndDeltas) { + coordsSet.page.x -= delta.x; + coordsSet.page.y -= delta.y; + coordsSet.client.x -= delta.x; + coordsSet.client.y -= delta.y; + } + + rect.left -= rectDelta.left; + rect.right -= rectDelta.right; + rect.top -= rectDelta.top; + rect.bottom -= rectDelta.bottom; + } + + shouldDo(options, preEnd, phase, requireEndOnly) { + if ( // ignore disabled modifiers + !options || options.enabled === false || // check if we require endOnly option to fire move before end + requireEndOnly && !options.endOnly || // don't apply endOnly modifiers when not ending + options.endOnly && !preEnd || // check if modifier should run be applied on start + phase === 'start' && !options.setStart) { + return false; + } + + return true; + } + + copyFrom(other) { + this.startOffset = other.startOffset; + this.startDelta = other.startDelta; + this.edges = other.edges; + this.states = other.states.map(s => clone(s)); + this.result = createResult(extend({}, other.result.coords), extend({}, other.result.rect)); + } + + destroy() { + for (const prop in this) { + this[prop] = null; + } + } + +} + +function createResult(coords, rect) { + return { + rect, + coords, + delta: { + x: 0, + y: 0 + }, + rectDelta: { + left: 0, + right: 0, + top: 0, + bottom: 0 + }, + eventProps: [], + changed: true + }; +} + +function getModifierList(interaction) { + const actionOptions = interaction.interactable.options[interaction.prepared.name]; + const actionModifiers = actionOptions.modifiers; + + if (actionModifiers && actionModifiers.length) { + return actionModifiers.filter(modifier => !modifier.options || modifier.options.enabled !== false); + } + + return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize'].map(type => { + const options = actionOptions[type]; + return options && options.enabled && { + options, + methods: options._methods + }; + }).filter(m => !!m); +} + +export function getRectOffset(rect, coords) { + return rect ? { + left: coords.x - rect.left, + top: coords.y - rect.top, + right: rect.right - coords.x, + bottom: rect.bottom - coords.y + } : { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; +} +//# sourceMappingURL=Modification.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/Modification.js.map b/@interactjs/modifiers/Modification.js.map new file mode 100644 index 000000000..d69646899 --- /dev/null +++ b/@interactjs/modifiers/Modification.js.map @@ -0,0 +1,113 @@ +{ + "version": 3, + "sources": [ + "Modification.ts" + ], + "names": [ + "clone", + "extend", + "rectUtils", + "Modification", + "constructor", + "interaction", + "states", + "startOffset", + "left", + "right", + "top", + "bottom", + "startDelta", + "result", + "endResult", + "edges", + "createResult", + "start", + "phase", + "pageCoords", + "modifierList", + "getModifierList", + "prepareStates", + "getRectOffset", + "rect", + "x", + "y", + "arg", + "preEnd", + "startAll", + "setAll", + "fillArg", + "interactable", + "element", + "state", + "methods", + "skipModifiers", + "unmodifiedRect", + "coords", + "slice", + "newResult", + "options", + "lastModifierCoords", + "returnValue", + "set", + "shouldDo", + "addEdges", + "eventProps", + "push", + "delta", + "rectDelta", + "prevCoords", + "prevRect", + "rectChanged", + "changed", + "applyToInteraction", + "curCoords", + "cur", + "startCoords", + "curDelta", + "coordsSet", + "page", + "client", + "width", + "height", + "setAndApply", + "modifiedCoords", + "length", + "interacting", + "adjustment", + "beforeEnd", + "event", + "doPreend", + "endPosition", + "move", + "stop", + "modifierArg", + "index", + "name", + "enabled", + "restoreInteractionCoords", + "modification", + "coordsAndDeltas", + "requireEndOnly", + "endOnly", + "setStart", + "copyFrom", + "other", + "map", + "s", + "destroy", + "prop", + "actionOptions", + "prepared", + "actionModifiers", + "modifiers", + "filter", + "modifier", + "type", + "_methods", + "m" + ], + "mappings": "AAAA,OAAOA,KAAP,MAAkB,mBAAlB;AACA,OAAOC,MAAP,MAAmB,oBAAnB;AACA,OAAO,KAAKC,SAAZ,MAA2B,kBAA3B;AAqBA,eAAe,MAAMC,YAAN,CAAmB;AAQhCC,EAAAA,WAAW,CAAWC,WAAX,EAAwD;AAAA,SAA7CA,WAA6C,GAA7CA,WAA6C;AAAA,SAPnEC,MAOmE,GAPzC,EAOyC;AAAA,SANnEC,WAMmE,GANtC;AAAEC,MAAAA,IAAI,EAAE,CAAR;AAAWC,MAAAA,KAAK,EAAE,CAAlB;AAAqBC,MAAAA,GAAG,EAAE,CAA1B;AAA6BC,MAAAA,MAAM,EAAE;AAArC,KAMsC;AAAA,SALnEC,UAKmE,GALtC,IAKsC;AAAA,SAJnEC,MAImE,GAJrC,IAIqC;AAAA,SAHnEC,SAGmE,GAHtC,IAGsC;AAAA,SAFnEC,KAEmE;AACjE,SAAKF,MAAL,GAAcG,YAAY,EAA1B;AACD;;AAEDC,EAAAA,KAAK,CACH;AAAEC,IAAAA;AAAF,GADG,EAEHC,UAFG,EAGH;AACA,UAAM;AAAEd,MAAAA;AAAF,QAAkB,IAAxB;AACA,UAAMe,YAAY,GAAGC,eAAe,CAAChB,WAAD,CAApC;AACA,SAAKiB,aAAL,CAAmBF,YAAnB;AAEA,SAAKL,KAAL,GAAad,MAAM,CAAC,EAAD,EAAKI,WAAW,CAACU,KAAjB,CAAnB;AACA,SAAKR,WAAL,GAAmBgB,aAAa,CAAClB,WAAW,CAACmB,IAAb,EAAmBL,UAAnB,CAAhC;AACA,SAAKP,UAAL,GAAkB;AAAEa,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAAlB;AAEA,UAAMC,GAAc,GAAG;AACrBT,MAAAA,KADqB;AAErBC,MAAAA,UAFqB;AAGrBS,MAAAA,MAAM,EAAE;AAHa,KAAvB;AAMA,SAAKf,MAAL,GAAcG,YAAY,EAA1B;AACA,SAAKa,QAAL,CAAcF,GAAd;AAEA,UAAMd,MAAM,GAAG,KAAKA,MAAL,GAAc,KAAKiB,MAAL,CAAYH,GAAZ,CAA7B;AAEA,WAAOd,MAAP;AACD;;AAEDkB,EAAAA,OAAO,CAAEJ,GAAF,EAA6B;AAClC,UAAM;AAAEtB,MAAAA;AAAF,QAAkB,IAAxB;AAEAsB,IAAAA,GAAG,CAACtB,WAAJ,GAAkBA,WAAlB;AACAsB,IAAAA,GAAG,CAACK,YAAJ,GAAmB3B,WAAW,CAAC2B,YAA/B;AACAL,IAAAA,GAAG,CAACM,OAAJ,GAAc5B,WAAW,CAAC4B,OAA1B;AACAN,IAAAA,GAAG,CAACH,IAAJ,GAAWG,GAAG,CAACH,IAAJ,IAAYnB,WAAW,CAACmB,IAAnC;AACAG,IAAAA,GAAG,CAACZ,KAAJ,GAAY,KAAKA,KAAjB;AACAY,IAAAA,GAAG,CAACpB,WAAJ,GAAkB,KAAKA,WAAvB;AACD;;AAEDsB,EAAAA,QAAQ,CAAEF,GAAF,EAAyC;AAC/C,SAAKI,OAAL,CAAaJ,GAAb;;AAEA,SAAK,MAAMO,KAAX,IAAoB,KAAK5B,MAAzB,EAAiC;AAC/B,UAAI4B,KAAK,CAACC,OAAN,CAAclB,KAAlB,EAAyB;AACvBU,QAAAA,GAAG,CAACO,KAAJ,GAAYA,KAAZ;AACAA,QAAAA,KAAK,CAACC,OAAN,CAAclB,KAAd,CAAoBU,GAApB;AACD;AACF;AACF;;AAEDG,EAAAA,MAAM,CAAEH,GAAF,EAA6D;AACjE,SAAKI,OAAL,CAAaJ,GAAb;AAEA,UAAM;AACJT,MAAAA,KADI;AAEJU,MAAAA,MAFI;AAGJQ,MAAAA,aAHI;AAIJZ,MAAAA,IAAI,EAAEa;AAJF,QAKFV,GALJ;AAOAA,IAAAA,GAAG,CAACW,MAAJ,GAAarC,MAAM,CAAC,EAAD,EAAK0B,GAAG,CAACR,UAAT,CAAnB;AACAQ,IAAAA,GAAG,CAACH,IAAJ,GAAWvB,MAAM,CAAC,EAAD,EAAKoC,cAAL,CAAjB;AAEA,UAAM/B,MAAM,GAAG8B,aAAa,GACxB,KAAK9B,MAAL,CAAYiC,KAAZ,CAAkBH,aAAlB,CADwB,GAExB,KAAK9B,MAFT;AAIA,UAAMkC,SAAS,GAAGxB,YAAY,CAACW,GAAG,CAACW,MAAL,EAAaX,GAAG,CAACH,IAAjB,CAA9B;;AAEA,SAAK,MAAMU,KAAX,IAAoB5B,MAApB,EAA4B;AAC1B,YAAM;AAAEmC,QAAAA;AAAF,UAAcP,KAApB;AACA,YAAMQ,kBAAkB,GAAGzC,MAAM,CAAC,EAAD,EAAK0B,GAAG,CAACW,MAAT,CAAjC;AACA,UAAIK,WAAW,GAAG,IAAlB;;AAEA,UAAIT,KAAK,CAACC,OAAN,CAAcS,GAAd,IAAqB,KAAKC,QAAL,CAAcJ,OAAd,EAAuBb,MAAvB,EAA+BV,KAA/B,CAAzB,EAAgE;AAC9DS,QAAAA,GAAG,CAACO,KAAJ,GAAYA,KAAZ;AACAS,QAAAA,WAAW,GAAGT,KAAK,CAACC,OAAN,CAAcS,GAAd,CAAkBjB,GAAlB,CAAd;AAEAzB,QAAAA,SAAS,CAAC4C,QAAV,CAAmB,KAAKzC,WAAL,CAAiBU,KAApC,EAA2CY,GAAG,CAACH,IAA/C,EAAqD;AAAEC,UAAAA,CAAC,EAAEE,GAAG,CAACW,MAAJ,CAAWb,CAAX,GAAeiB,kBAAkB,CAACjB,CAAvC;AAA0CC,UAAAA,CAAC,EAAEC,GAAG,CAACW,MAAJ,CAAWZ,CAAX,GAAegB,kBAAkB,CAAChB;AAA/E,SAArD;AACD;;AAEDc,MAAAA,SAAS,CAACO,UAAV,CAAqBC,IAArB,CAA0BL,WAA1B;AACD;;AAEDH,IAAAA,SAAS,CAACS,KAAV,CAAgBxB,CAAhB,GAAoBE,GAAG,CAACW,MAAJ,CAAWb,CAAX,GAAeE,GAAG,CAACR,UAAJ,CAAeM,CAAlD;AACAe,IAAAA,SAAS,CAACS,KAAV,CAAgBvB,CAAhB,GAAoBC,GAAG,CAACW,MAAJ,CAAWZ,CAAX,GAAeC,GAAG,CAACR,UAAJ,CAAeO,CAAlD;AAEAc,IAAAA,SAAS,CAACU,SAAV,CAAoB1C,IAApB,GAA6BmB,GAAG,CAACH,IAAJ,CAAShB,IAAT,GAAgB6B,cAAc,CAAC7B,IAA5D;AACAgC,IAAAA,SAAS,CAACU,SAAV,CAAoBzC,KAApB,GAA6BkB,GAAG,CAACH,IAAJ,CAASf,KAAT,GAAiB4B,cAAc,CAAC5B,KAA7D;AACA+B,IAAAA,SAAS,CAACU,SAAV,CAAoBxC,GAApB,GAA6BiB,GAAG,CAACH,IAAJ,CAASd,GAAT,GAAe2B,cAAc,CAAC3B,GAA3D;AACA8B,IAAAA,SAAS,CAACU,SAAV,CAAoBvC,MAApB,GAA6BgB,GAAG,CAACH,IAAJ,CAASb,MAAT,GAAkB0B,cAAc,CAAC1B,MAA9D;AAEA,UAAMwC,UAAU,GAAG,KAAKtC,MAAL,CAAYyB,MAA/B;AACA,UAAMc,QAAQ,GAAG,KAAKvC,MAAL,CAAYW,IAA7B;;AAEA,QAAI2B,UAAU,IAAIC,QAAlB,EAA4B;AAC1B,YAAMC,WAAW,GAAGb,SAAS,CAAChB,IAAV,CAAehB,IAAf,KAAwB4C,QAAQ,CAAC5C,IAAjC,IAClBgC,SAAS,CAAChB,IAAV,CAAef,KAAf,KAAyB2C,QAAQ,CAAC3C,KADhB,IAElB+B,SAAS,CAAChB,IAAV,CAAed,GAAf,KAAuB0C,QAAQ,CAAC1C,GAFd,IAGlB8B,SAAS,CAAChB,IAAV,CAAeb,MAAf,KAA0ByC,QAAQ,CAACzC,MAHrC;AAKA6B,MAAAA,SAAS,CAACc,OAAV,GAAoBD,WAAW,IAC7BF,UAAU,CAAC1B,CAAX,KAAiBe,SAAS,CAACF,MAAV,CAAiBb,CADhB,IAElB0B,UAAU,CAACzB,CAAX,KAAiBc,SAAS,CAACF,MAAV,CAAiBZ,CAFpC;AAGD;;AAED,WAAOc,SAAP;AACD;;AAEDe,EAAAA,kBAAkB,CAAE5B,GAAF,EAA6D;AAC7E,UAAM;AAAEtB,MAAAA;AAAF,QAAkB,IAAxB;AACA,UAAM;AAAEa,MAAAA;AAAF,QAAYS,GAAlB;AACA,UAAM6B,SAAS,GAAGnD,WAAW,CAACiC,MAAZ,CAAmBmB,GAArC;AACA,UAAMC,WAAW,GAAGrD,WAAW,CAACiC,MAAZ,CAAmBrB,KAAvC;AACA,UAAM;AAAEJ,MAAAA,MAAF;AAAUD,MAAAA;AAAV,QAAyB,IAA/B;AACA,UAAM+C,QAAQ,GAAG9C,MAAM,CAACoC,KAAxB;;AAEA,QAAI/B,KAAK,KAAK,OAAd,EAAuB;AACrBjB,MAAAA,MAAM,CAAC,KAAKW,UAAN,EAAkBC,MAAM,CAACoC,KAAzB,CAAN;AACD;;AAED,SAAK,MAAM,CAACW,SAAD,EAAYX,KAAZ,CAAX,IAAiC,CAAC,CAACS,WAAD,EAAc9C,UAAd,CAAD,EAA4B,CAAC4C,SAAD,EAAYG,QAAZ,CAA5B,CAAjC,EAA8F;AAC5FC,MAAAA,SAAS,CAACC,IAAV,CAAepC,CAAf,IAAsBwB,KAAK,CAACxB,CAA5B;AACAmC,MAAAA,SAAS,CAACC,IAAV,CAAenC,CAAf,IAAsBuB,KAAK,CAACvB,CAA5B;AACAkC,MAAAA,SAAS,CAACE,MAAV,CAAiBrC,CAAjB,IAAsBwB,KAAK,CAACxB,CAA5B;AACAmC,MAAAA,SAAS,CAACE,MAAV,CAAiBpC,CAAjB,IAAsBuB,KAAK,CAACvB,CAA5B;AACD;;AAED,UAAM;AAAEwB,MAAAA;AAAF,QAAgB,KAAKrC,MAA3B;AACA,UAAMW,IAAI,GAAGG,GAAG,CAACH,IAAJ,IAAYnB,WAAW,CAACmB,IAArC;AAEAA,IAAAA,IAAI,CAAChB,IAAL,IAAe0C,SAAS,CAAC1C,IAAzB;AACAgB,IAAAA,IAAI,CAACf,KAAL,IAAeyC,SAAS,CAACzC,KAAzB;AACAe,IAAAA,IAAI,CAACd,GAAL,IAAewC,SAAS,CAACxC,GAAzB;AACAc,IAAAA,IAAI,CAACb,MAAL,IAAeuC,SAAS,CAACvC,MAAzB;AAEAa,IAAAA,IAAI,CAACuC,KAAL,GAAavC,IAAI,CAACf,KAAL,GAAae,IAAI,CAAChB,IAA/B;AACAgB,IAAAA,IAAI,CAACwC,MAAL,GAAcxC,IAAI,CAACb,MAAL,GAAca,IAAI,CAACd,GAAjC;AACD;;AAEDuD,EAAAA,WAAW,CAAEtC,GAAF,EAKM;AACf,UAAM;AAAEtB,MAAAA;AAAF,QAAkB,IAAxB;AACA,UAAM;AAAEa,MAAAA,KAAF;AAASU,MAAAA,MAAT;AAAiBQ,MAAAA;AAAjB,QAAmCT,GAAzC;AAEA,UAAMd,MAAM,GAAG,KAAKiB,MAAL,CAAY;AACzBF,MAAAA,MADyB;AAEzBV,MAAAA,KAFyB;AAGzBC,MAAAA,UAAU,EAAEQ,GAAG,CAACuC,cAAJ,IAAsB7D,WAAW,CAACiC,MAAZ,CAAmBmB,GAAnB,CAAuBI;AAHhC,KAAZ,CAAf;AAMA,SAAKhD,MAAL,GAAcA,MAAd,CAVe,CAYf;AACA;;AACA,QAAI,CAACA,MAAM,CAACyC,OAAR,KAAoB,CAAClB,aAAD,IAAkBA,aAAa,GAAG,KAAK9B,MAAL,CAAY6D,MAAlE,KAA6E9D,WAAW,CAAC+D,WAAZ,EAAjF,EAA4G;AAC1G,aAAO,KAAP;AACD;;AAED,QAAIzC,GAAG,CAACuC,cAAR,EAAwB;AACtB,YAAM;AAAEL,QAAAA;AAAF,UAAWxD,WAAW,CAACiC,MAAZ,CAAmBmB,GAApC;AACA,YAAMY,UAAU,GAAG;AACjB5C,QAAAA,CAAC,EAAEE,GAAG,CAACuC,cAAJ,CAAmBzC,CAAnB,GAAuBoC,IAAI,CAACpC,CADd;AAEjBC,QAAAA,CAAC,EAAEC,GAAG,CAACuC,cAAJ,CAAmBxC,CAAnB,GAAuBmC,IAAI,CAACnC;AAFd,OAAnB;AAKAb,MAAAA,MAAM,CAACyB,MAAP,CAAcb,CAAd,IAAmB4C,UAAU,CAAC5C,CAA9B;AACAZ,MAAAA,MAAM,CAACyB,MAAP,CAAcZ,CAAd,IAAmB2C,UAAU,CAAC3C,CAA9B;AACAb,MAAAA,MAAM,CAACoC,KAAP,CAAaxB,CAAb,IAAkB4C,UAAU,CAAC5C,CAA7B;AACAZ,MAAAA,MAAM,CAACoC,KAAP,CAAavB,CAAb,IAAkB2C,UAAU,CAAC3C,CAA7B;AACD;;AAED,SAAK6B,kBAAL,CAAwB5B,GAAxB;AACD;;AAED2C,EAAAA,SAAS,CAAE3C,GAAF,EAAyF;AAChG,UAAM;AAAEtB,MAAAA,WAAF;AAAekE,MAAAA;AAAf,QAAyB5C,GAA/B;AACA,UAAMrB,MAAM,GAAG,KAAKA,MAApB;;AAEA,QAAI,CAACA,MAAD,IAAW,CAACA,MAAM,CAAC6D,MAAvB,EAA+B;AAC7B;AACD;;AAED,QAAIK,QAAQ,GAAG,KAAf;;AAEA,SAAK,MAAMtC,KAAX,IAAoB5B,MAApB,EAA4B;AAC1BqB,MAAAA,GAAG,CAACO,KAAJ,GAAYA,KAAZ;AACA,YAAM;AAAEO,QAAAA,OAAF;AAAWN,QAAAA;AAAX,UAAuBD,KAA7B;AAEA,YAAMuC,WAAW,GAAGtC,OAAO,CAACmC,SAAR,IAAqBnC,OAAO,CAACmC,SAAR,CAAkB3C,GAAlB,CAAzC;;AAEA,UAAI8C,WAAJ,EAAiB;AACf,aAAK3D,SAAL,GAAiB2D,WAAjB;AACA,eAAO,KAAP;AACD;;AAEDD,MAAAA,QAAQ,GAAGA,QAAQ,IAAK,CAACA,QAAD,IAAa,KAAK3B,QAAL,CAAcJ,OAAd,EAAuB,IAAvB,EAA6Bd,GAAG,CAACT,KAAjC,EAAwC,IAAxC,CAArC;AACD;;AAED,QAAIsD,QAAJ,EAAc;AACZ;AACAnE,MAAAA,WAAW,CAACqE,IAAZ,CAAiB;AAAEH,QAAAA,KAAF;AAAS3C,QAAAA,MAAM,EAAE;AAAjB,OAAjB;AACD;AACF;;AAED+C,EAAAA,IAAI,CAAEhD,GAAF,EAA8C;AAChD,UAAM;AAAEtB,MAAAA;AAAF,QAAkBsB,GAAxB;;AAEA,QAAI,CAAC,KAAKrB,MAAN,IAAgB,CAAC,KAAKA,MAAL,CAAY6D,MAAjC,EAAyC;AACvC;AACD;;AAED,UAAMS,WAAiC,GAAG3E,MAAM,CAAC;AAC/CK,MAAAA,MAAM,EAAE,KAAKA,MADkC;AAE/C0B,MAAAA,YAAY,EAAE3B,WAAW,CAAC2B,YAFqB;AAG/CC,MAAAA,OAAO,EAAE5B,WAAW,CAAC4B,OAH0B;AAI/CT,MAAAA,IAAI,EAAE;AAJyC,KAAD,EAK7CG,GAL6C,CAAhD;AAOA,SAAKI,OAAL,CAAa6C,WAAb;;AAEA,SAAK,MAAM1C,KAAX,IAAoB,KAAK5B,MAAzB,EAAiC;AAC/BsE,MAAAA,WAAW,CAAC1C,KAAZ,GAAoBA,KAApB;;AAEA,UAAIA,KAAK,CAACC,OAAN,CAAcwC,IAAlB,EAAwB;AAAEzC,QAAAA,KAAK,CAACC,OAAN,CAAcwC,IAAd,CAAmBC,WAAnB;AAAgD;AAC3E;;AAED,SAAKtE,MAAL,GAAc,IAAd;AACA,SAAKQ,SAAL,GAAiB,IAAjB;AACD;;AAEDQ,EAAAA,aAAa,CAAEF,YAAF,EAA4B;AACvC,SAAKd,MAAL,GAAc,EAAd;;AAEA,SAAK,IAAIuE,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAGzD,YAAY,CAAC+C,MAAzC,EAAiDU,KAAK,EAAtD,EAA0D;AACxD,YAAM;AAAEpC,QAAAA,OAAF;AAAWN,QAAAA,OAAX;AAAoB2C,QAAAA;AAApB,UAA6B1D,YAAY,CAACyD,KAAD,CAA/C;;AAEA,UAAIpC,OAAO,IAAIA,OAAO,CAACsC,OAAR,KAAoB,KAAnC,EAA0C;AAAE;AAAU;;AAEtD,WAAKzE,MAAL,CAAY0C,IAAZ,CAAiB;AACfP,QAAAA,OADe;AAEfN,QAAAA,OAFe;AAGf0C,QAAAA,KAHe;AAIfC,QAAAA;AAJe,OAAjB;AAMD;;AAED,WAAO,KAAKxE,MAAZ;AACD;;AAED0E,EAAAA,wBAAwB,CAAE;AAAE3E,IAAAA,WAAW,EAAE;AAAEiC,MAAAA,MAAF;AAAUd,MAAAA,IAAV;AAAgByD,MAAAA;AAAhB;AAAf,GAAF,EAA0F;AAChH,QAAI,CAACA,YAAY,CAACpE,MAAlB,EAA0B;AAAE;AAAQ;;AAEpC,UAAM;AAAED,MAAAA;AAAF,QAAiBqE,YAAvB;AACA,UAAM;AAAEhC,MAAAA,KAAK,EAAEU,QAAT;AAAmBT,MAAAA;AAAnB,QAAiC+B,YAAY,CAACpE,MAApD;AAEA,UAAMqE,eAAe,GAAG,CACtB,CAAC5C,MAAM,CAACrB,KAAR,EAAeL,UAAf,CADsB,EAEtB,CAAC0B,MAAM,CAACmB,GAAR,EAAaE,QAAb,CAFsB,CAAxB;;AAKA,SAAK,MAAM,CAACC,SAAD,EAAYX,KAAZ,CAAX,IAAiCiC,eAAjC,EAAyD;AACvDtB,MAAAA,SAAS,CAACC,IAAV,CAAepC,CAAf,IAAoBwB,KAAK,CAACxB,CAA1B;AACAmC,MAAAA,SAAS,CAACC,IAAV,CAAenC,CAAf,IAAoBuB,KAAK,CAACvB,CAA1B;AACAkC,MAAAA,SAAS,CAACE,MAAV,CAAiBrC,CAAjB,IAAsBwB,KAAK,CAACxB,CAA5B;AACAmC,MAAAA,SAAS,CAACE,MAAV,CAAiBpC,CAAjB,IAAsBuB,KAAK,CAACvB,CAA5B;AACD;;AAEDF,IAAAA,IAAI,CAAChB,IAAL,IAAa0C,SAAS,CAAC1C,IAAvB;AACAgB,IAAAA,IAAI,CAACf,KAAL,IAAcyC,SAAS,CAACzC,KAAxB;AACAe,IAAAA,IAAI,CAACd,GAAL,IAAYwC,SAAS,CAACxC,GAAtB;AACAc,IAAAA,IAAI,CAACb,MAAL,IAAeuC,SAAS,CAACvC,MAAzB;AACD;;AAEDkC,EAAAA,QAAQ,CAAEJ,OAAF,EAAWb,MAAX,EAA6BV,KAA7B,EAA6CiE,cAA7C,EAAuE;AAC7E,SACE;AACC,KAAC1C,OAAD,IAAYA,OAAO,CAACsC,OAAR,KAAoB,KAAjC,IACA;AACCI,IAAAA,cAAc,IAAI,CAAC1C,OAAO,CAAC2C,OAF5B,IAGA;AACC3C,IAAAA,OAAO,CAAC2C,OAAR,IAAmB,CAACxD,MAJrB,IAKA;AACCV,IAAAA,KAAK,KAAK,OAAV,IAAqB,CAACuB,OAAO,CAAC4C,QARjC,EASE;AACA,aAAO,KAAP;AACD;;AAED,WAAO,IAAP;AACD;;AAEDC,EAAAA,QAAQ,CAAEC,KAAF,EAAuB;AAC7B,SAAKhF,WAAL,GAAmBgF,KAAK,CAAChF,WAAzB;AACA,SAAKK,UAAL,GAAkB2E,KAAK,CAAC3E,UAAxB;AACA,SAAKG,KAAL,GAAawE,KAAK,CAACxE,KAAnB;AACA,SAAKT,MAAL,GAAciF,KAAK,CAACjF,MAAN,CAAakF,GAAb,CAAiBC,CAAC,IAAIzF,KAAK,CAACyF,CAAD,CAA3B,CAAd;AACA,SAAK5E,MAAL,GAAcG,YAAY,CAACf,MAAM,CAAC,EAAD,EAAKsF,KAAK,CAAC1E,MAAN,CAAayB,MAAlB,CAAP,EAAkCrC,MAAM,CAAC,EAAD,EAAKsF,KAAK,CAAC1E,MAAN,CAAaW,IAAlB,CAAxC,CAA1B;AACD;;AAEDkE,EAAAA,OAAO,GAAI;AACT,SAAK,MAAMC,IAAX,IAAmB,IAAnB,EAAyB;AACvB,WAAKA,IAAL,IAAa,IAAb;AACD;AACF;;AA7T+B;;AAgUlC,SAAS3E,YAAT,CAAuBsB,MAAvB,EAAgDd,IAAhD,EAA8F;AAC5F,SAAO;AACLA,IAAAA,IADK;AAELc,IAAAA,MAFK;AAGLW,IAAAA,KAAK,EAAE;AAAExB,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAHF;AAILwB,IAAAA,SAAS,EAAE;AACT1C,MAAAA,IAAI,EAAI,CADC;AAETC,MAAAA,KAAK,EAAG,CAFC;AAGTC,MAAAA,GAAG,EAAK,CAHC;AAITC,MAAAA,MAAM,EAAE;AAJC,KAJN;AAULoC,IAAAA,UAAU,EAAE,EAVP;AAWLO,IAAAA,OAAO,EAAE;AAXJ,GAAP;AAaD;;AAED,SAASjC,eAAT,CAA0BhB,WAA1B,EAAuC;AACrC,QAAMuF,aAAa,GAAGvF,WAAW,CAAC2B,YAAZ,CAAyBS,OAAzB,CAAiCpC,WAAW,CAACwF,QAAZ,CAAqBf,IAAtD,CAAtB;AACA,QAAMgB,eAAe,GAAGF,aAAa,CAACG,SAAtC;;AAEA,MAAID,eAAe,IAAIA,eAAe,CAAC3B,MAAvC,EAA+C;AAC7C,WAAO2B,eAAe,CAACE,MAAhB,CACLC,QAAQ,IAAI,CAACA,QAAQ,CAACxD,OAAV,IAAqBwD,QAAQ,CAACxD,OAAT,CAAiBsC,OAAjB,KAA6B,KADzD,CAAP;AAGD;;AAED,SAAO,CAAC,MAAD,EAAS,UAAT,EAAqB,WAArB,EAAkC,UAAlC,EAA8C,eAA9C,EAA+D,cAA/D,EACJS,GADI,CACAU,IAAI,IAAI;AACX,UAAMzD,OAAO,GAAGmD,aAAa,CAACM,IAAD,CAA7B;AAEA,WAAOzD,OAAO,IAAIA,OAAO,CAACsC,OAAnB,IAA8B;AACnCtC,MAAAA,OADmC;AAEnCN,MAAAA,OAAO,EAAEM,OAAO,CAAC0D;AAFkB,KAArC;AAID,GARI,EASJH,MATI,CASGI,CAAC,IAAI,CAAC,CAACA,CATV,CAAP;AAUD;;AAED,OAAO,SAAS7E,aAAT,CAAwBC,IAAxB,EAA8Bc,MAA9B,EAAsC;AAC3C,SAAOd,IAAI,GACP;AACAhB,IAAAA,IAAI,EAAI8B,MAAM,CAACb,CAAP,GAAWD,IAAI,CAAChB,IADxB;AAEAE,IAAAA,GAAG,EAAK4B,MAAM,CAACZ,CAAP,GAAWF,IAAI,CAACd,GAFxB;AAGAD,IAAAA,KAAK,EAAGe,IAAI,CAACf,KAAL,GAAc6B,MAAM,CAACb,CAH7B;AAIAd,IAAAA,MAAM,EAAEa,IAAI,CAACb,MAAL,GAAc2B,MAAM,CAACZ;AAJ7B,GADO,GAOP;AACAlB,IAAAA,IAAI,EAAI,CADR;AAEAE,IAAAA,GAAG,EAAK,CAFR;AAGAD,IAAAA,KAAK,EAAG,CAHR;AAIAE,IAAAA,MAAM,EAAE;AAJR,GAPJ;AAaD", + "sourcesContent": [ + "import clone from '@interactjs/utils/clone'\nimport extend from '@interactjs/utils/extend'\nimport * as rectUtils from '@interactjs/utils/rect'\nimport { Modifier, ModifierArg, ModifierState } from './base'\n\nexport interface ModificationResult {\n delta: Interact.Point\n rectDelta: Interact.Rect\n coords: Interact.Point\n rect: Interact.FullRect\n eventProps: any[]\n changed: boolean\n}\n\ninterface MethodArg {\n phase: Interact.EventPhase\n pageCoords?: Interact.Point\n rect?: Interact.FullRect\n coords?: Interact.Point\n preEnd?: boolean\n skipModifiers?: number\n}\n\nexport default class Modification {\n states: ModifierState[] = []\n startOffset: Interact.Rect = { left: 0, right: 0, top: 0, bottom: 0 }\n startDelta: Interact.Point = null\n result?: ModificationResult = null\n endResult?: Interact.Point = null\n edges: Interact.EdgeOptions\n\n constructor (readonly interaction: Readonly) {\n this.result = createResult()\n }\n\n start (\n { phase }: MethodArg,\n pageCoords: Interact.Point,\n ) {\n const { interaction } = this\n const modifierList = getModifierList(interaction)\n this.prepareStates(modifierList)\n\n this.edges = extend({}, interaction.edges)\n this.startOffset = getRectOffset(interaction.rect, pageCoords)\n this.startDelta = { x: 0, y: 0 }\n\n const arg: MethodArg = {\n phase,\n pageCoords,\n preEnd: false,\n }\n\n this.result = createResult()\n this.startAll(arg)\n\n const result = this.result = this.setAll(arg)\n\n return result\n }\n\n fillArg (arg: Partial) {\n const { interaction } = this\n\n arg.interaction = interaction\n arg.interactable = interaction.interactable\n arg.element = interaction.element\n arg.rect = arg.rect || interaction.rect\n arg.edges = this.edges\n arg.startOffset = this.startOffset\n }\n\n startAll (arg: MethodArg & Partial) {\n this.fillArg(arg)\n\n for (const state of this.states) {\n if (state.methods.start) {\n arg.state = state\n state.methods.start(arg as ModifierArg)\n }\n }\n }\n\n setAll (arg: MethodArg & Partial): ModificationResult {\n this.fillArg(arg)\n\n const {\n phase,\n preEnd,\n skipModifiers,\n rect: unmodifiedRect,\n } = arg\n\n arg.coords = extend({}, arg.pageCoords)\n arg.rect = extend({}, unmodifiedRect)\n\n const states = skipModifiers\n ? this.states.slice(skipModifiers)\n : this.states\n\n const newResult = createResult(arg.coords, arg.rect)\n\n for (const state of states) {\n const { options } = state\n const lastModifierCoords = extend({}, arg.coords)\n let returnValue = null\n\n if (state.methods.set && this.shouldDo(options, preEnd, phase)) {\n arg.state = state\n returnValue = state.methods.set(arg as ModifierArg)\n\n rectUtils.addEdges(this.interaction.edges, arg.rect, { x: arg.coords.x - lastModifierCoords.x, y: arg.coords.y - lastModifierCoords.y })\n }\n\n newResult.eventProps.push(returnValue)\n }\n\n newResult.delta.x = arg.coords.x - arg.pageCoords.x\n newResult.delta.y = arg.coords.y - arg.pageCoords.y\n\n newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left\n newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right\n newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top\n newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom\n\n const prevCoords = this.result.coords\n const prevRect = this.result.rect\n\n if (prevCoords && prevRect) {\n const rectChanged = newResult.rect.left !== prevRect.left ||\n newResult.rect.right !== prevRect.right ||\n newResult.rect.top !== prevRect.top ||\n newResult.rect.bottom !== prevRect.bottom\n\n newResult.changed = rectChanged ||\n prevCoords.x !== newResult.coords.x ||\n prevCoords.y !== newResult.coords.y\n }\n\n return newResult\n }\n\n applyToInteraction (arg: { phase: Interact.EventPhase, rect?: Interact.Rect }) {\n const { interaction } = this\n const { phase } = arg\n const curCoords = interaction.coords.cur\n const startCoords = interaction.coords.start\n const { result, startDelta } = this\n const curDelta = result.delta\n\n if (phase === 'start') {\n extend(this.startDelta, result.delta)\n }\n\n for (const [coordsSet, delta] of [[startCoords, startDelta], [curCoords, curDelta]] as const) {\n coordsSet.page.x += delta.x\n coordsSet.page.y += delta.y\n coordsSet.client.x += delta.x\n coordsSet.client.y += delta.y\n }\n\n const { rectDelta } = this.result\n const rect = arg.rect || interaction.rect\n\n rect.left += rectDelta.left\n rect.right += rectDelta.right\n rect.top += rectDelta.top\n rect.bottom += rectDelta.bottom\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n }\n\n setAndApply (arg: Partial & {\n phase: Interact.EventPhase\n preEnd?: boolean\n skipModifiers?: number\n modifiedCoords?: Interact.Point\n }): void | false {\n const { interaction } = this\n const { phase, preEnd, skipModifiers } = arg\n\n const result = this.setAll({\n preEnd,\n phase,\n pageCoords: arg.modifiedCoords || interaction.coords.cur.page,\n })\n\n this.result = result\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) {\n return false\n }\n\n if (arg.modifiedCoords) {\n const { page } = interaction.coords.cur\n const adjustment = {\n x: arg.modifiedCoords.x - page.x,\n y: arg.modifiedCoords.y - page.y,\n }\n\n result.coords.x += adjustment.x\n result.coords.y += adjustment.y\n result.delta.x += adjustment.x\n result.delta.y += adjustment.y\n }\n\n this.applyToInteraction(arg)\n }\n\n beforeEnd (arg: Omit & { state?: ModifierState }): void | false {\n const { interaction, event } = arg\n const states = this.states\n\n if (!states || !states.length) {\n return\n }\n\n let doPreend = false\n\n for (const state of states) {\n arg.state = state\n const { options, methods } = state\n\n const endPosition = methods.beforeEnd && methods.beforeEnd(arg as unknown as ModifierArg)\n\n if (endPosition) {\n this.endResult = endPosition\n return false\n }\n\n doPreend = doPreend || (!doPreend && this.shouldDo(options, true, arg.phase, true))\n }\n\n if (doPreend) {\n // trigger a final modified move before ending\n interaction.move({ event, preEnd: true })\n }\n }\n\n stop (arg: { interaction: Interact.Interaction }) {\n const { interaction } = arg\n\n if (!this.states || !this.states.length) {\n return\n }\n\n const modifierArg: Partial = extend({\n states: this.states,\n interactable: interaction.interactable,\n element: interaction.element,\n rect: null,\n }, arg)\n\n this.fillArg(modifierArg)\n\n for (const state of this.states) {\n modifierArg.state = state\n\n if (state.methods.stop) { state.methods.stop(modifierArg as ModifierArg) }\n }\n\n this.states = null\n this.endResult = null\n }\n\n prepareStates (modifierList: Modifier[]) {\n this.states = []\n\n for (let index = 0; index < modifierList.length; index++) {\n const { options, methods, name } = modifierList[index]\n\n if (options && options.enabled === false) { continue }\n\n this.states.push({\n options,\n methods,\n index,\n name,\n })\n }\n\n return this.states\n }\n\n restoreInteractionCoords ({ interaction: { coords, rect, modification } }: { interaction: Interact.Interaction }) {\n if (!modification.result) { return }\n\n const { startDelta } = modification\n const { delta: curDelta, rectDelta } = modification.result\n\n const coordsAndDeltas = [\n [coords.start, startDelta],\n [coords.cur, curDelta],\n ]\n\n for (const [coordsSet, delta] of coordsAndDeltas as any) {\n coordsSet.page.x -= delta.x\n coordsSet.page.y -= delta.y\n coordsSet.client.x -= delta.x\n coordsSet.client.y -= delta.y\n }\n\n rect.left -= rectDelta.left\n rect.right -= rectDelta.right\n rect.top -= rectDelta.top\n rect.bottom -= rectDelta.bottom\n }\n\n shouldDo (options, preEnd?: boolean, phase?: string, requireEndOnly?: boolean) {\n if (\n // ignore disabled modifiers\n (!options || options.enabled === false) ||\n // check if we require endOnly option to fire move before end\n (requireEndOnly && !options.endOnly) ||\n // don't apply endOnly modifiers when not ending\n (options.endOnly && !preEnd) ||\n // check if modifier should run be applied on start\n (phase === 'start' && !options.setStart)\n ) {\n return false\n }\n\n return true\n }\n\n copyFrom (other: Modification) {\n this.startOffset = other.startOffset\n this.startDelta = other.startDelta\n this.edges = other.edges\n this.states = other.states.map(s => clone(s) as ModifierState)\n this.result = createResult(extend({}, other.result.coords), extend({}, other.result.rect))\n }\n\n destroy () {\n for (const prop in this) {\n this[prop] = null\n }\n }\n}\n\nfunction createResult (coords?: Interact.Point, rect?: Interact.FullRect): ModificationResult {\n return {\n rect,\n coords,\n delta: { x: 0, y: 0 },\n rectDelta: {\n left : 0,\n right : 0,\n top : 0,\n bottom: 0,\n },\n eventProps: [],\n changed: true,\n }\n}\n\nfunction getModifierList (interaction) {\n const actionOptions = interaction.interactable.options[interaction.prepared.name]\n const actionModifiers = actionOptions.modifiers\n\n if (actionModifiers && actionModifiers.length) {\n return actionModifiers.filter(\n modifier => !modifier.options || modifier.options.enabled !== false,\n )\n }\n\n return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize']\n .map(type => {\n const options = actionOptions[type]\n\n return options && options.enabled && {\n options,\n methods: options._methods,\n }\n })\n .filter(m => !!m)\n}\n\nexport function getRectOffset (rect, coords) {\n return rect\n ? {\n left : coords.x - rect.left,\n top : coords.y - rect.top,\n right : rect.right - coords.x,\n bottom: rect.bottom - coords.y,\n }\n : {\n left : 0,\n top : 0,\n right : 0,\n bottom: 0,\n }\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/Modification.min.js b/@interactjs/modifiers/Modification.min.js new file mode 100644 index 000000000..61d1ae7a4 --- /dev/null +++ b/@interactjs/modifiers/Modification.min.js @@ -0,0 +1,2 @@ +import t from"../utils/clone.min.js";import e from"../utils/extend.min.js";import*as s from"../utils/rect.min.js";export default class o{constructor(t){this.interaction=t,this.states=[],this.startOffset={left:0,right:0,top:0,bottom:0},this.startDelta=null,this.result=null,this.endResult=null,this.edges=void 0,this.result=r()}start({phase:t},s){const{interaction:o}=this,i=function(t){const e=t.interactable.options[t.prepared.name],s=e.modifiers;if(s&&s.length)return s.filter(t=>!t.options||!1!==t.options.enabled);return["snap","snapSize","snapEdges","restrict","restrictEdges","restrictSize"].map(t=>{const s=e[t];return s&&s.enabled&&{options:s,methods:s._methods}}).filter(t=>!!t)}(o);this.prepareStates(i),this.edges=e({},o.edges),this.startOffset=getRectOffset(o.rect,s),this.startDelta={x:0,y:0};const n={phase:t,pageCoords:s,preEnd:!1};return this.result=r(),this.startAll(n),this.result=this.setAll(n)}fillArg(t){const{interaction:e}=this;t.interaction=e,t.interactable=e.interactable,t.element=e.element,t.rect=t.rect||e.rect,t.edges=this.edges,t.startOffset=this.startOffset}startAll(t){this.fillArg(t);for(const e of this.states)e.methods.start&&(t.state=e,e.methods.start(t))}setAll(t){this.fillArg(t);const{phase:o,preEnd:i,skipModifiers:n,rect:a}=t;t.coords=e({},t.pageCoords),t.rect=e({},a);const l=n?this.states.slice(n):this.states,c=r(t.coords,t.rect);for(const r of l){const{options:n}=r,a=e({},t.coords);let l=null;r.methods.set&&this.shouldDo(n,i,o)&&(t.state=r,l=r.methods.set(t),s.addEdges(this.interaction.edges,t.rect,{x:t.coords.x-a.x,y:t.coords.y-a.y})),c.eventProps.push(l)}c.delta.x=t.coords.x-t.pageCoords.x,c.delta.y=t.coords.y-t.pageCoords.y,c.rectDelta.left=t.rect.left-a.left,c.rectDelta.right=t.rect.right-a.right,c.rectDelta.top=t.rect.top-a.top,c.rectDelta.bottom=t.rect.bottom-a.bottom;const h=this.result.coords,d=this.result.rect;if(h&&d){const t=c.rect.left!==d.left||c.rect.right!==d.right||c.rect.top!==d.top||c.rect.bottom!==d.bottom;c.changed=t||h.x!==c.coords.x||h.y!==c.coords.y}return c}applyToInteraction(t){const{interaction:s}=this,{phase:o}=t,r=s.coords.cur,i=s.coords.start,{result:n,startDelta:a}=this,l=n.delta;"start"===o&&e(this.startDelta,n.delta);for(const[t,e]of[[i,a],[r,l]])t.page.x+=e.x,t.page.y+=e.y,t.client.x+=e.x,t.client.y+=e.y;const{rectDelta:c}=this.result,h=t.rect||s.rect;h.left+=c.left,h.right+=c.right,h.top+=c.top,h.bottom+=c.bottom,h.width=h.right-h.left,h.height=h.bottom-h.top}setAndApply(t){const{interaction:e}=this,{phase:s,preEnd:o,skipModifiers:r}=t,i=this.setAll({preEnd:o,phase:s,pageCoords:t.modifiedCoords||e.coords.cur.page});if(this.result=i,!i.changed&&(!r||rt(e)),this.result=r(e({},s.result.coords),e({},s.result.rect))}destroy(){for(const t in this)this[t]=null}}function r(t,e){return{rect:e,coords:t,delta:{x:0,y:0},rectDelta:{left:0,right:0,top:0,bottom:0},eventProps:[],changed:!0}}export function getRectOffset(t,e){return t?{left:e.x-t.left,top:e.y-t.top,right:t.right-e.x,bottom:t.bottom-e.y}:{left:0,top:0,right:0,bottom:0}} +//# sourceMappingURL=Modification.min.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/Modification.min.js.map b/@interactjs/modifiers/Modification.min.js.map new file mode 100644 index 000000000..836b0caf5 --- /dev/null +++ b/@interactjs/modifiers/Modification.min.js.map @@ -0,0 +1,114 @@ +{ + "version": 3, + "sources": [ + "Modification.ts" + ], + "names": [ + "clone", + "extend", + "rectUtils", + "Modification", + "constructor", + "interaction", + "this", + "states", + "startOffset", + "left", + "right", + "top", + "bottom", + "startDelta", + "result", + "endResult", + "edges", + "createResult", + "start", + "phase", + "pageCoords", + "modifierList", + "actionOptions", + "interactable", + "options", + "prepared", + "name", + "actionModifiers", + "modifiers", + "length", + "filter", + "modifier", + "enabled", + "map", + "type", + "methods", + "_methods", + "m", + "getModifierList", + "prepareStates", + "getRectOffset", + "rect", + "x", + "y", + "arg", + "preEnd", + "startAll", + "setAll", + "fillArg", + "element", + "state", + "skipModifiers", + "unmodifiedRect", + "coords", + "slice", + "newResult", + "lastModifierCoords", + "returnValue", + "set", + "shouldDo", + "addEdges", + "eventProps", + "push", + "delta", + "rectDelta", + "prevCoords", + "prevRect", + "rectChanged", + "changed", + "applyToInteraction", + "curCoords", + "cur", + "startCoords", + "curDelta", + "coordsSet", + "page", + "client", + "width", + "height", + "setAndApply", + "modifiedCoords", + "interacting", + "adjustment", + "beforeEnd", + "event", + "doPreend", + "endPosition", + "move", + "stop", + "modifierArg", + "index", + "restoreInteractionCoords", + "modification", + "coordsAndDeltas", + "requireEndOnly", + "endOnly", + "setStart", + "copyFrom", + "other", + "s", + "destroy", + "prop" + ], + "mappings": "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", + "sourcesContent": [ + "import clone from '@interactjs/utils/clone'\nimport extend from '@interactjs/utils/extend'\nimport * as rectUtils from '@interactjs/utils/rect'\nimport { Modifier, ModifierArg, ModifierState } from './base'\n\nexport interface ModificationResult {\n delta: Interact.Point\n rectDelta: Interact.Rect\n coords: Interact.Point\n rect: Interact.FullRect\n eventProps: any[]\n changed: boolean\n}\n\ninterface MethodArg {\n phase: Interact.EventPhase\n pageCoords?: Interact.Point\n rect?: Interact.FullRect\n coords?: Interact.Point\n preEnd?: boolean\n skipModifiers?: number\n}\n\nexport default class Modification {\n states: ModifierState[] = []\n startOffset: Interact.Rect = { left: 0, right: 0, top: 0, bottom: 0 }\n startDelta: Interact.Point = null\n result?: ModificationResult = null\n endResult?: Interact.Point = null\n edges: Interact.EdgeOptions\n\n constructor (readonly interaction: Readonly) {\n this.result = createResult()\n }\n\n start (\n { phase }: MethodArg,\n pageCoords: Interact.Point,\n ) {\n const { interaction } = this\n const modifierList = getModifierList(interaction)\n this.prepareStates(modifierList)\n\n this.edges = extend({}, interaction.edges)\n this.startOffset = getRectOffset(interaction.rect, pageCoords)\n this.startDelta = { x: 0, y: 0 }\n\n const arg: MethodArg = {\n phase,\n pageCoords,\n preEnd: false,\n }\n\n this.result = createResult()\n this.startAll(arg)\n\n const result = this.result = this.setAll(arg)\n\n return result\n }\n\n fillArg (arg: Partial) {\n const { interaction } = this\n\n arg.interaction = interaction\n arg.interactable = interaction.interactable\n arg.element = interaction.element\n arg.rect = arg.rect || interaction.rect\n arg.edges = this.edges\n arg.startOffset = this.startOffset\n }\n\n startAll (arg: MethodArg & Partial) {\n this.fillArg(arg)\n\n for (const state of this.states) {\n if (state.methods.start) {\n arg.state = state\n state.methods.start(arg as ModifierArg)\n }\n }\n }\n\n setAll (arg: MethodArg & Partial): ModificationResult {\n this.fillArg(arg)\n\n const {\n phase,\n preEnd,\n skipModifiers,\n rect: unmodifiedRect,\n } = arg\n\n arg.coords = extend({}, arg.pageCoords)\n arg.rect = extend({}, unmodifiedRect)\n\n const states = skipModifiers\n ? this.states.slice(skipModifiers)\n : this.states\n\n const newResult = createResult(arg.coords, arg.rect)\n\n for (const state of states) {\n const { options } = state\n const lastModifierCoords = extend({}, arg.coords)\n let returnValue = null\n\n if (state.methods.set && this.shouldDo(options, preEnd, phase)) {\n arg.state = state\n returnValue = state.methods.set(arg as ModifierArg)\n\n rectUtils.addEdges(this.interaction.edges, arg.rect, { x: arg.coords.x - lastModifierCoords.x, y: arg.coords.y - lastModifierCoords.y })\n }\n\n newResult.eventProps.push(returnValue)\n }\n\n newResult.delta.x = arg.coords.x - arg.pageCoords.x\n newResult.delta.y = arg.coords.y - arg.pageCoords.y\n\n newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left\n newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right\n newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top\n newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom\n\n const prevCoords = this.result.coords\n const prevRect = this.result.rect\n\n if (prevCoords && prevRect) {\n const rectChanged = newResult.rect.left !== prevRect.left ||\n newResult.rect.right !== prevRect.right ||\n newResult.rect.top !== prevRect.top ||\n newResult.rect.bottom !== prevRect.bottom\n\n newResult.changed = rectChanged ||\n prevCoords.x !== newResult.coords.x ||\n prevCoords.y !== newResult.coords.y\n }\n\n return newResult\n }\n\n applyToInteraction (arg: { phase: Interact.EventPhase, rect?: Interact.Rect }) {\n const { interaction } = this\n const { phase } = arg\n const curCoords = interaction.coords.cur\n const startCoords = interaction.coords.start\n const { result, startDelta } = this\n const curDelta = result.delta\n\n if (phase === 'start') {\n extend(this.startDelta, result.delta)\n }\n\n for (const [coordsSet, delta] of [[startCoords, startDelta], [curCoords, curDelta]] as const) {\n coordsSet.page.x += delta.x\n coordsSet.page.y += delta.y\n coordsSet.client.x += delta.x\n coordsSet.client.y += delta.y\n }\n\n const { rectDelta } = this.result\n const rect = arg.rect || interaction.rect\n\n rect.left += rectDelta.left\n rect.right += rectDelta.right\n rect.top += rectDelta.top\n rect.bottom += rectDelta.bottom\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n }\n\n setAndApply (arg: Partial & {\n phase: Interact.EventPhase\n preEnd?: boolean\n skipModifiers?: number\n modifiedCoords?: Interact.Point\n }): void | false {\n const { interaction } = this\n const { phase, preEnd, skipModifiers } = arg\n\n const result = this.setAll({\n preEnd,\n phase,\n pageCoords: arg.modifiedCoords || interaction.coords.cur.page,\n })\n\n this.result = result\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) {\n return false\n }\n\n if (arg.modifiedCoords) {\n const { page } = interaction.coords.cur\n const adjustment = {\n x: arg.modifiedCoords.x - page.x,\n y: arg.modifiedCoords.y - page.y,\n }\n\n result.coords.x += adjustment.x\n result.coords.y += adjustment.y\n result.delta.x += adjustment.x\n result.delta.y += adjustment.y\n }\n\n this.applyToInteraction(arg)\n }\n\n beforeEnd (arg: Omit & { state?: ModifierState }): void | false {\n const { interaction, event } = arg\n const states = this.states\n\n if (!states || !states.length) {\n return\n }\n\n let doPreend = false\n\n for (const state of states) {\n arg.state = state\n const { options, methods } = state\n\n const endPosition = methods.beforeEnd && methods.beforeEnd(arg as unknown as ModifierArg)\n\n if (endPosition) {\n this.endResult = endPosition\n return false\n }\n\n doPreend = doPreend || (!doPreend && this.shouldDo(options, true, arg.phase, true))\n }\n\n if (doPreend) {\n // trigger a final modified move before ending\n interaction.move({ event, preEnd: true })\n }\n }\n\n stop (arg: { interaction: Interact.Interaction }) {\n const { interaction } = arg\n\n if (!this.states || !this.states.length) {\n return\n }\n\n const modifierArg: Partial = extend({\n states: this.states,\n interactable: interaction.interactable,\n element: interaction.element,\n rect: null,\n }, arg)\n\n this.fillArg(modifierArg)\n\n for (const state of this.states) {\n modifierArg.state = state\n\n if (state.methods.stop) { state.methods.stop(modifierArg as ModifierArg) }\n }\n\n this.states = null\n this.endResult = null\n }\n\n prepareStates (modifierList: Modifier[]) {\n this.states = []\n\n for (let index = 0; index < modifierList.length; index++) {\n const { options, methods, name } = modifierList[index]\n\n if (options && options.enabled === false) { continue }\n\n this.states.push({\n options,\n methods,\n index,\n name,\n })\n }\n\n return this.states\n }\n\n restoreInteractionCoords ({ interaction: { coords, rect, modification } }: { interaction: Interact.Interaction }) {\n if (!modification.result) { return }\n\n const { startDelta } = modification\n const { delta: curDelta, rectDelta } = modification.result\n\n const coordsAndDeltas = [\n [coords.start, startDelta],\n [coords.cur, curDelta],\n ]\n\n for (const [coordsSet, delta] of coordsAndDeltas as any) {\n coordsSet.page.x -= delta.x\n coordsSet.page.y -= delta.y\n coordsSet.client.x -= delta.x\n coordsSet.client.y -= delta.y\n }\n\n rect.left -= rectDelta.left\n rect.right -= rectDelta.right\n rect.top -= rectDelta.top\n rect.bottom -= rectDelta.bottom\n }\n\n shouldDo (options, preEnd?: boolean, phase?: string, requireEndOnly?: boolean) {\n if (\n // ignore disabled modifiers\n (!options || options.enabled === false) ||\n // check if we require endOnly option to fire move before end\n (requireEndOnly && !options.endOnly) ||\n // don't apply endOnly modifiers when not ending\n (options.endOnly && !preEnd) ||\n // check if modifier should run be applied on start\n (phase === 'start' && !options.setStart)\n ) {\n return false\n }\n\n return true\n }\n\n copyFrom (other: Modification) {\n this.startOffset = other.startOffset\n this.startDelta = other.startDelta\n this.edges = other.edges\n this.states = other.states.map(s => clone(s) as ModifierState)\n this.result = createResult(extend({}, other.result.coords), extend({}, other.result.rect))\n }\n\n destroy () {\n for (const prop in this) {\n this[prop] = null\n }\n }\n}\n\nfunction createResult (coords?: Interact.Point, rect?: Interact.FullRect): ModificationResult {\n return {\n rect,\n coords,\n delta: { x: 0, y: 0 },\n rectDelta: {\n left : 0,\n right : 0,\n top : 0,\n bottom: 0,\n },\n eventProps: [],\n changed: true,\n }\n}\n\nfunction getModifierList (interaction) {\n const actionOptions = interaction.interactable.options[interaction.prepared.name]\n const actionModifiers = actionOptions.modifiers\n\n if (actionModifiers && actionModifiers.length) {\n return actionModifiers.filter(\n modifier => !modifier.options || modifier.options.enabled !== false,\n )\n }\n\n return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize']\n .map(type => {\n const options = actionOptions[type]\n\n return options && options.enabled && {\n options,\n methods: options._methods,\n }\n })\n .filter(m => !!m)\n}\n\nexport function getRectOffset (rect, coords) {\n return rect\n ? {\n left : coords.x - rect.left,\n top : coords.y - rect.top,\n right : rect.right - coords.x,\n bottom: rect.bottom - coords.y,\n }\n : {\n left : 0,\n top : 0,\n right : 0,\n bottom: 0,\n }\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/all.d.ts b/@interactjs/modifiers/all.d.ts new file mode 100644 index 000000000..c7450d6df --- /dev/null +++ b/@interactjs/modifiers/all.d.ts @@ -0,0 +1,8 @@ +export { default as aspectRatio } from './aspectRatio'; +export { default as restrictEdges } from './restrict/edges'; +export { default as restrict } from './restrict/pointer'; +export { default as restrictRect } from './restrict/rect'; +export { default as restrictSize } from './restrict/size'; +export { default as snapEdges } from './snap/edges'; +export { default as snap } from './snap/pointer'; +export { default as snapSize } from './snap/size'; diff --git a/@interactjs/modifiers/all.js b/@interactjs/modifiers/all.js new file mode 100644 index 000000000..154a50dc9 --- /dev/null +++ b/@interactjs/modifiers/all.js @@ -0,0 +1,9 @@ +export { default as aspectRatio } from "./aspectRatio.js"; +export { default as restrictEdges } from "./restrict/edges.js"; +export { default as restrict } from "./restrict/pointer.js"; +export { default as restrictRect } from "./restrict/rect.js"; +export { default as restrictSize } from "./restrict/size.js"; +export { default as snapEdges } from "./snap/edges.js"; +export { default as snap } from "./snap/pointer.js"; +export { default as snapSize } from "./snap/size.js"; +//# sourceMappingURL=all.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/all.js.map b/@interactjs/modifiers/all.js.map new file mode 100644 index 000000000..43008facd --- /dev/null +++ b/@interactjs/modifiers/all.js.map @@ -0,0 +1,21 @@ +{ + "version": 3, + "sources": [ + "all.ts" + ], + "names": [ + "default", + "aspectRatio", + "restrictEdges", + "restrict", + "restrictRect", + "restrictSize", + "snapEdges", + "snap", + "snapSize" + ], + "mappings": "AAAA,SAASA,OAAO,IAAIC,WAApB,QAAuC,kBAAvC;AACA,SAASD,OAAO,IAAIE,aAApB,QAAyC,qBAAzC;AACA,SAASF,OAAO,IAAIG,QAApB,QAAoC,uBAApC;AACA,SAASH,OAAO,IAAII,YAApB,QAAwC,oBAAxC;AACA,SAASJ,OAAO,IAAIK,YAApB,QAAwC,oBAAxC;AACA,SAASL,OAAO,IAAIM,SAApB,QAAqC,iBAArC;AACA,SAASN,OAAO,IAAIO,IAApB,QAAgC,mBAAhC;AACA,SAASP,OAAO,IAAIQ,QAApB,QAAoC,gBAApC", + "sourcesContent": [ + "export { default as aspectRatio } from './aspectRatio'\nexport { default as restrictEdges } from './restrict/edges'\nexport { default as restrict } from './restrict/pointer'\nexport { default as restrictRect } from './restrict/rect'\nexport { default as restrictSize } from './restrict/size'\nexport { default as snapEdges } from './snap/edges'\nexport { default as snap } from './snap/pointer'\nexport { default as snapSize } from './snap/size'\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/all.min.js b/@interactjs/modifiers/all.min.js new file mode 100644 index 000000000..08167cd18 --- /dev/null +++ b/@interactjs/modifiers/all.min.js @@ -0,0 +1,2 @@ +export{default as aspectRatio}from"./aspectRatio.min.js";export{default as restrictEdges}from"./restrict/edges.min.js";export{default as restrict}from"./restrict/pointer.min.js";export{default as restrictRect}from"./restrict/rect.min.js";export{default as restrictSize}from"./restrict/size.min.js";export{default as snapEdges}from"./snap/edges.min.js";export{default as snap}from"./snap/pointer.min.js";export{default as snapSize}from"./snap/size.min.js"; +//# sourceMappingURL=all.min.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/all.min.js.map b/@interactjs/modifiers/all.min.js.map new file mode 100644 index 000000000..15aa3beaa --- /dev/null +++ b/@interactjs/modifiers/all.min.js.map @@ -0,0 +1,13 @@ +{ + "version": 3, + "sources": [ + "all.ts" + ], + "names": [ + "default" + ], + "mappings": "OAASA,2BAA8B,8BAC9BA,6BAAgC,iCAChCA,wBAA2B,mCAC3BA,4BAA+B,gCAC/BA,4BAA+B,gCAC/BA,yBAA4B,6BAC5BA,oBAAuB,+BACvBA,wBAA2B", + "sourcesContent": [ + "export { default as aspectRatio } from './aspectRatio'\nexport { default as restrictEdges } from './restrict/edges'\nexport { default as restrict } from './restrict/pointer'\nexport { default as restrictRect } from './restrict/rect'\nexport { default as restrictSize } from './restrict/size'\nexport { default as snapEdges } from './snap/edges'\nexport { default as snap } from './snap/pointer'\nexport { default as snapSize } from './snap/size'\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/aspectRatio.d.ts b/@interactjs/modifiers/aspectRatio.d.ts new file mode 100644 index 000000000..413aae7ba --- /dev/null +++ b/@interactjs/modifiers/aspectRatio.d.ts @@ -0,0 +1,76 @@ +import { Modifier, ModifierModule, ModifierState } from './base'; +import Modification from './Modification'; +export interface AspectRatioOptions { + ratio?: number | 'preserve'; + equalDelta?: boolean; + modifiers?: Modifier[]; + enabled?: boolean; +} +export declare type AspectRatioState = ModifierState; +declare const aspectRatio: ModifierModule; +declare const _default: { + (_options?: Partial): Modifier, "aspectRatio">; + _defaults: AspectRatioOptions; + _methods: { + start: (arg: import("./base").ModifierArg>) => void; + set: (arg: import("./base").ModifierArg>) => any; + beforeEnd: (arg: import("./base").ModifierArg>) => void | import("@interactjs/types/types").Point; + stop: (arg: import("./base").ModifierArg>) => void; + }; +}; +export default _default; +export { aspectRatio }; diff --git a/@interactjs/modifiers/aspectRatio.js b/@interactjs/modifiers/aspectRatio.js new file mode 100644 index 000000000..f0e0a26f1 --- /dev/null +++ b/@interactjs/modifiers/aspectRatio.js @@ -0,0 +1,152 @@ +/* eslint-disable */ + +/** + * @module modifiers/aspectRatio + * + * @description + * This module forces elements to be resized with a specified dx/dy ratio. + * + * @example + * interact(target).resizable({ + * modifiers: [ + * interact.modifiers.snapSize({ + * targets: [ interact.createSnapGrid({ x: 20, y: 20 }) ], + * }), + * interact.aspectRatio({ ratio: 'preserve' }), + * ], + * }); + */ +import extend from "../utils/extend.js"; +import { addEdges } from "../utils/rect.js"; +import Modification from "./Modification.js"; +import { makeModifier } from "./base.js"; +const aspectRatio = { + start(arg) { + const { + state, + rect, + edges: originalEdges, + pageCoords: coords + } = arg; + let { + ratio + } = state.options; + const { + equalDelta, + modifiers + } = state.options; + + if (ratio === 'preserve') { + ratio = rect.width / rect.height; + } + + state.startCoords = extend({}, coords); + state.startRect = extend({}, rect); + state.ratio = ratio; + state.equalDelta = equalDelta; + const linkedEdges = state.linkedEdges = { + top: originalEdges.top || originalEdges.left && !originalEdges.bottom, + left: originalEdges.left || originalEdges.top && !originalEdges.right, + bottom: originalEdges.bottom || originalEdges.right && !originalEdges.top, + right: originalEdges.right || originalEdges.bottom && !originalEdges.left + }; + state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right); + + if (state.equalDelta) { + state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1); + } else { + const negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left; + state.edgeSign = negativeSecondaryEdge ? -1 : 1; + } + + extend(arg.edges, linkedEdges); + + if (!modifiers || !modifiers.length) { + return; + } + + const subModification = new Modification(arg.interaction); + subModification.copyFrom(arg.interaction.modification); + subModification.prepareStates(modifiers); + state.subModification = subModification; + subModification.startAll({ ...arg + }); + }, + + set(arg) { + const { + state, + rect, + coords + } = arg; + const initialCoords = extend({}, coords); + const aspectMethod = state.equalDelta ? setEqualDelta : setRatio; + aspectMethod(state, state.xIsPrimaryAxis, coords, rect); + + if (!state.subModification) { + return null; + } + + const correctedRect = extend({}, rect); + addEdges(state.linkedEdges, correctedRect, { + x: coords.x - initialCoords.x, + y: coords.y - initialCoords.y + }); + const result = state.subModification.setAll({ ...arg, + rect: correctedRect, + edges: state.linkedEdges, + pageCoords: coords, + prevCoords: coords, + prevRect: correctedRect + }); + const { + delta + } = result; + + if (result.changed) { + const xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y); // do aspect modification again with critical edge axis as primary + + aspectMethod(state, xIsCriticalAxis, result.coords, result.rect); + extend(coords, result.coords); + } + + return result.eventProps; + }, + + defaults: { + ratio: 'preserve', + equalDelta: false, + modifiers: [], + enabled: false + } +}; + +function setEqualDelta({ + startCoords, + edgeSign +}, xIsPrimaryAxis, coords) { + if (xIsPrimaryAxis) { + coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign; + } else { + coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign; + } +} + +function setRatio({ + startRect, + startCoords, + ratio, + edgeSign +}, xIsPrimaryAxis, coords, rect) { + if (xIsPrimaryAxis) { + const newHeight = rect.width / ratio; + coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign; + } else { + const newWidth = rect.height * ratio; + coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign; + } +} + +export default makeModifier(aspectRatio, 'aspectRatio'); +export { aspectRatio }; +//# sourceMappingURL=aspectRatio.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/aspectRatio.js.map b/@interactjs/modifiers/aspectRatio.js.map new file mode 100644 index 000000000..bf07bb4f9 --- /dev/null +++ b/@interactjs/modifiers/aspectRatio.js.map @@ -0,0 +1,70 @@ +{ + "version": 3, + "sources": [ + "aspectRatio.ts" + ], + "names": [ + "extend", + "addEdges", + "Modification", + "makeModifier", + "aspectRatio", + "start", + "arg", + "state", + "rect", + "edges", + "originalEdges", + "pageCoords", + "coords", + "ratio", + "options", + "equalDelta", + "modifiers", + "width", + "height", + "startCoords", + "startRect", + "linkedEdges", + "top", + "left", + "bottom", + "right", + "xIsPrimaryAxis", + "edgeSign", + "negativeSecondaryEdge", + "length", + "subModification", + "interaction", + "copyFrom", + "modification", + "prepareStates", + "startAll", + "set", + "initialCoords", + "aspectMethod", + "setEqualDelta", + "setRatio", + "correctedRect", + "x", + "y", + "result", + "setAll", + "prevCoords", + "prevRect", + "delta", + "changed", + "xIsCriticalAxis", + "Math", + "abs", + "eventProps", + "defaults", + "enabled", + "newHeight", + "newWidth" + ], + "mappings": "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", + "sourcesContent": [ + "/* eslint-disable */\n\n/**\n * @module modifiers/aspectRatio\n *\n * @description\n * This module forces elements to be resized with a specified dx/dy ratio.\n *\n * @example\n * interact(target).resizable({\n * modifiers: [\n * interact.modifiers.snapSize({\n * targets: [ interact.createSnapGrid({ x: 20, y: 20 }) ],\n * }),\n * interact.aspectRatio({ ratio: 'preserve' }),\n * ],\n * });\n */\n\nimport extend from '@interactjs/utils/extend'\nimport { addEdges } from '@interactjs/utils/rect'\nimport { Modifier, ModifierModule, ModifierState } from './base'\nimport Modification from './Modification'\nimport { makeModifier } from './base'\n\nexport interface AspectRatioOptions {\n ratio?: number | 'preserve'\n equalDelta?: boolean\n modifiers?: Modifier[]\n enabled?: boolean\n}\n\nexport type AspectRatioState = ModifierState\n\nconst aspectRatio: ModifierModule = {\n start (arg) {\n const { state, rect, edges: originalEdges, pageCoords: coords } = arg\n let { ratio } = state.options\n const { equalDelta, modifiers } = state.options\n\n if (ratio === 'preserve') {\n ratio = rect.width / rect.height\n }\n\n state.startCoords = extend({}, coords)\n state.startRect = extend({}, rect)\n state.ratio = ratio\n state.equalDelta = equalDelta\n\n const linkedEdges = state.linkedEdges = {\n top : originalEdges.top || (originalEdges.left && !originalEdges.bottom),\n left : originalEdges.left || (originalEdges.top && !originalEdges.right),\n bottom: originalEdges.bottom || (originalEdges.right && !originalEdges.top),\n right : originalEdges.right || (originalEdges.bottom && !originalEdges.left),\n }\n\n state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right)\n\n if (state.equalDelta) {\n state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1) as 1 | -1\n }\n else {\n const negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left\n state.edgeSign = negativeSecondaryEdge ? -1 : 1\n }\n\n extend(arg.edges, linkedEdges)\n\n if (!modifiers || !modifiers.length) { return }\n\n const subModification = new Modification(arg.interaction)\n\n subModification.copyFrom(arg.interaction.modification)\n subModification.prepareStates(modifiers)\n\n state.subModification = subModification\n subModification.startAll({ ...arg })\n },\n\n set (arg) {\n const { state, rect, coords } = arg\n const initialCoords = extend({}, coords)\n const aspectMethod = state.equalDelta ? setEqualDelta : setRatio\n\n aspectMethod(state, state.xIsPrimaryAxis, coords, rect)\n\n if (!state.subModification) { return null }\n\n const correctedRect = extend({}, rect)\n\n addEdges(state.linkedEdges, correctedRect, { x: coords.x - initialCoords.x, y: coords.y - initialCoords.y })\n\n const result = state.subModification.setAll({\n ...arg,\n rect: correctedRect,\n edges: state.linkedEdges,\n pageCoords: coords,\n prevCoords: coords,\n prevRect: correctedRect,\n })\n\n const { delta } = result\n\n if (result.changed) {\n const xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y)\n\n // do aspect modification again with critical edge axis as primary\n aspectMethod(state, xIsCriticalAxis, result.coords, result.rect)\n extend(coords, result.coords)\n }\n\n return result.eventProps\n },\n\n defaults: {\n ratio: 'preserve',\n equalDelta: false,\n modifiers: [],\n enabled: false,\n },\n}\n\nfunction setEqualDelta ({ startCoords, edgeSign }: AspectRatioState, xIsPrimaryAxis: boolean, coords: Interact.Point) {\n if (xIsPrimaryAxis) {\n coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign\n }\n else {\n coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign\n }\n}\n\nfunction setRatio ({ startRect, startCoords, ratio, edgeSign }: AspectRatioState, xIsPrimaryAxis: boolean, coords: Interact.Point, rect: Interact.Rect) {\n if (xIsPrimaryAxis) {\n const newHeight = rect.width / ratio\n\n coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign\n }\n else {\n const newWidth = rect.height * ratio\n\n coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign\n }\n}\n\nexport default makeModifier(aspectRatio, 'aspectRatio')\nexport { aspectRatio }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/aspectRatio.min.js b/@interactjs/modifiers/aspectRatio.min.js new file mode 100644 index 000000000..d6b0c284b --- /dev/null +++ b/@interactjs/modifiers/aspectRatio.min.js @@ -0,0 +1,2 @@ +import t from"../utils/extend.min.js";import{addEdges as e}from"../utils/rect.min.js";import o from"./Modification.min.js";import{makeModifier as i}from"./base.min.js";const s={start(e){const{state:i,rect:s,edges:r,pageCoords:a}=e;let{ratio:n}=i.options;const{equalDelta:d,modifiers:l}=i.options;"preserve"===n&&(n=s.width/s.height),i.startCoords=t({},a),i.startRect=t({},s),i.ratio=n,i.equalDelta=d;const c=i.linkedEdges={top:r.top||r.left&&!r.bottom,left:r.left||r.top&&!r.right,bottom:r.bottom||r.right&&!r.top,right:r.right||r.bottom&&!r.left};if(i.xIsPrimaryAxis=!(!r.left&&!r.right),i.equalDelta)i.edgeSign=(c.left?1:-1)*(c.top?1:-1);else{const t=i.xIsPrimaryAxis?c.top:c.left;i.edgeSign=t?-1:1}if(t(e.edges,c),!l||!l.length)return;const f=new o(e.interaction);f.copyFrom(e.interaction.modification),f.prepareStates(l),i.subModification=f,f.startAll({...e})},set(o){const{state:i,rect:s,coords:n}=o,d=t({},n),l=i.equalDelta?r:a;if(l(i,i.xIsPrimaryAxis,n,s),!i.subModification)return null;const c=t({},s);e(i.linkedEdges,c,{x:n.x-d.x,y:n.y-d.y});const f=i.subModification.setAll({...o,rect:c,edges:i.linkedEdges,pageCoords:n,prevCoords:n,prevRect:c}),{delta:g}=f;if(f.changed){l(i,Math.abs(g.x)>Math.abs(g.y),f.coords,f.rect),t(n,f.coords)}return f.eventProps},defaults:{ratio:"preserve",equalDelta:!1,modifiers:[],enabled:!1}};function r({startCoords:t,edgeSign:e},o,i){o?i.y=t.y+(i.x-t.x)*e:i.x=t.x+(i.y-t.y)*e}function a({startRect:t,startCoords:e,ratio:o,edgeSign:i},s,r,a){if(s){const s=a.width/o;r.y=e.y+(s-t.height)*i}else{const s=a.height*o;r.x=e.x+(s-t.width)*i}}export default i(s,"aspectRatio");export{s as aspectRatio}; +//# sourceMappingURL=aspectRatio.min.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/aspectRatio.min.js.map b/@interactjs/modifiers/aspectRatio.min.js.map new file mode 100644 index 000000000..aa4ac0f14 --- /dev/null +++ b/@interactjs/modifiers/aspectRatio.min.js.map @@ -0,0 +1,69 @@ +{ + "version": 3, + "sources": [ + "aspectRatio.ts" + ], + "names": [ + "extend", + "addEdges", + "Modification", + "makeModifier", + "aspectRatio", + "start", + "arg", + "state", + "rect", + "edges", + "originalEdges", + "pageCoords", + "coords", + "ratio", + "options", + "equalDelta", + "modifiers", + "width", + "height", + "startCoords", + "startRect", + "linkedEdges", + "top", + "left", + "bottom", + "right", + "xIsPrimaryAxis", + "edgeSign", + "negativeSecondaryEdge", + "length", + "subModification", + "interaction", + "copyFrom", + "modification", + "prepareStates", + "startAll", + "set", + "initialCoords", + "aspectMethod", + "setEqualDelta", + "setRatio", + "correctedRect", + "x", + "y", + "result", + "setAll", + "prevCoords", + "prevRect", + "delta", + "changed", + "Math", + "abs", + "eventProps", + "defaults", + "enabled", + "newHeight", + "newWidth" + ], + "mappings": "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", + "sourcesContent": [ + "/* eslint-disable */\n\n/**\n * @module modifiers/aspectRatio\n *\n * @description\n * This module forces elements to be resized with a specified dx/dy ratio.\n *\n * @example\n * interact(target).resizable({\n * modifiers: [\n * interact.modifiers.snapSize({\n * targets: [ interact.createSnapGrid({ x: 20, y: 20 }) ],\n * }),\n * interact.aspectRatio({ ratio: 'preserve' }),\n * ],\n * });\n */\n\nimport extend from '@interactjs/utils/extend'\nimport { addEdges } from '@interactjs/utils/rect'\nimport { Modifier, ModifierModule, ModifierState } from './base'\nimport Modification from './Modification'\nimport { makeModifier } from './base'\n\nexport interface AspectRatioOptions {\n ratio?: number | 'preserve'\n equalDelta?: boolean\n modifiers?: Modifier[]\n enabled?: boolean\n}\n\nexport type AspectRatioState = ModifierState\n\nconst aspectRatio: ModifierModule = {\n start (arg) {\n const { state, rect, edges: originalEdges, pageCoords: coords } = arg\n let { ratio } = state.options\n const { equalDelta, modifiers } = state.options\n\n if (ratio === 'preserve') {\n ratio = rect.width / rect.height\n }\n\n state.startCoords = extend({}, coords)\n state.startRect = extend({}, rect)\n state.ratio = ratio\n state.equalDelta = equalDelta\n\n const linkedEdges = state.linkedEdges = {\n top : originalEdges.top || (originalEdges.left && !originalEdges.bottom),\n left : originalEdges.left || (originalEdges.top && !originalEdges.right),\n bottom: originalEdges.bottom || (originalEdges.right && !originalEdges.top),\n right : originalEdges.right || (originalEdges.bottom && !originalEdges.left),\n }\n\n state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right)\n\n if (state.equalDelta) {\n state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1) as 1 | -1\n }\n else {\n const negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left\n state.edgeSign = negativeSecondaryEdge ? -1 : 1\n }\n\n extend(arg.edges, linkedEdges)\n\n if (!modifiers || !modifiers.length) { return }\n\n const subModification = new Modification(arg.interaction)\n\n subModification.copyFrom(arg.interaction.modification)\n subModification.prepareStates(modifiers)\n\n state.subModification = subModification\n subModification.startAll({ ...arg })\n },\n\n set (arg) {\n const { state, rect, coords } = arg\n const initialCoords = extend({}, coords)\n const aspectMethod = state.equalDelta ? setEqualDelta : setRatio\n\n aspectMethod(state, state.xIsPrimaryAxis, coords, rect)\n\n if (!state.subModification) { return null }\n\n const correctedRect = extend({}, rect)\n\n addEdges(state.linkedEdges, correctedRect, { x: coords.x - initialCoords.x, y: coords.y - initialCoords.y })\n\n const result = state.subModification.setAll({\n ...arg,\n rect: correctedRect,\n edges: state.linkedEdges,\n pageCoords: coords,\n prevCoords: coords,\n prevRect: correctedRect,\n })\n\n const { delta } = result\n\n if (result.changed) {\n const xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y)\n\n // do aspect modification again with critical edge axis as primary\n aspectMethod(state, xIsCriticalAxis, result.coords, result.rect)\n extend(coords, result.coords)\n }\n\n return result.eventProps\n },\n\n defaults: {\n ratio: 'preserve',\n equalDelta: false,\n modifiers: [],\n enabled: false,\n },\n}\n\nfunction setEqualDelta ({ startCoords, edgeSign }: AspectRatioState, xIsPrimaryAxis: boolean, coords: Interact.Point) {\n if (xIsPrimaryAxis) {\n coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign\n }\n else {\n coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign\n }\n}\n\nfunction setRatio ({ startRect, startCoords, ratio, edgeSign }: AspectRatioState, xIsPrimaryAxis: boolean, coords: Interact.Point, rect: Interact.Rect) {\n if (xIsPrimaryAxis) {\n const newHeight = rect.width / ratio\n\n coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign\n }\n else {\n const newWidth = rect.height * ratio\n\n coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign\n }\n}\n\nexport default makeModifier(aspectRatio, 'aspectRatio')\nexport { aspectRatio }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/aspectRatio.spec.d.ts b/@interactjs/modifiers/aspectRatio.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/modifiers/aspectRatio.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/modifiers/base.d.ts b/@interactjs/modifiers/base.d.ts new file mode 100644 index 000000000..167716040 --- /dev/null +++ b/@interactjs/modifiers/base.d.ts @@ -0,0 +1,79 @@ +import Modification from './Modification'; +declare module '@interactjs/core/Interaction' { + interface Interaction { + modification?: Modification; + } +} +declare module '@interactjs/core/InteractEvent' { + interface InteractEvent { + modifiers?: Array<{ + name: string; + [key: string]: any; + }>; + } +} +declare module '@interactjs/core/defaultOptions' { + interface PerActionDefaults { + modifiers?: Modifier[]; + } +} +export interface Modifier { + options?: Defaults; + methods: { + start?: (arg: ModifierArg) => void; + set: (arg: ModifierArg) => void; + beforeEnd?: (arg: ModifierArg) => Interact.Point | void; + stop?: (arg: ModifierArg) => void; + }; + name?: Name; +} +export declare type ModifierState = { + options: Defaults; + methods?: Modifier['methods']; + index?: number; + name?: Name; +} & StateProps; +export interface ModifierArg { + interaction: Interact.Interaction; + interactable: Interact.Interactable; + phase: Interact.EventPhase; + rect: Interact.FullRect; + edges: Interact.EdgeOptions; + state?: State; + element: Interact.Element; + pageCoords?: Interact.Point; + prevCoords?: Interact.Point; + prevRect?: Interact.FullRect; + coords?: Interact.Point; + startOffset?: Interact.Rect; + preEnd?: boolean; +} +export interface ModifierModule { + defaults?: Defaults; + start?(arg: ModifierArg): void; + set?(arg: ModifierArg): any; + beforeEnd?(arg: ModifierArg): Interact.Point | void; + stop?(arg: ModifierArg): void; +} +export declare function makeModifier(module: ModifierModule, name?: Name): { + (_options?: Partial): Modifier; + _defaults: Defaults; + _methods: { + start: (arg: ModifierArg) => void; + set: (arg: ModifierArg) => any; + beforeEnd: (arg: ModifierArg) => void | import("@interactjs/types/types").Point; + stop: (arg: ModifierArg) => void; + }; +}; +export declare function addEventModifiers({ iEvent, interaction: { modification: { result } } }: { + iEvent: Interact.InteractEvent; + interaction: Interact.Interaction; +}): void; +declare const modifiersBase: Interact.Plugin; +export default modifiersBase; diff --git a/@interactjs/modifiers/base.js b/@interactjs/modifiers/base.js new file mode 100644 index 000000000..f40e69ca5 --- /dev/null +++ b/@interactjs/modifiers/base.js @@ -0,0 +1,82 @@ +import Modification from "./Modification.js"; +export function makeModifier(module, name) { + const { + defaults + } = module; + const methods = { + start: module.start, + set: module.set, + beforeEnd: module.beforeEnd, + stop: module.stop + }; + + const modifier = _options => { + const options = _options || {}; + options.enabled = options.enabled !== false; // add missing defaults to options + + for (const prop in defaults) { + if (!(prop in options)) { + options[prop] = defaults[prop]; + } + } + + const m = { + options, + methods, + name + }; + return m; + }; + + if (name && typeof name === 'string') { + // for backwrads compatibility + modifier._defaults = defaults; + modifier._methods = methods; + } + + return modifier; +} +export function addEventModifiers({ + iEvent, + interaction: { + modification: { + result + } + } +}) { + if (result) { + iEvent.modifiers = result.eventProps; + } +} +const modifiersBase = { + id: 'modifiers/base', + install: scope => { + scope.defaults.perAction.modifiers = []; + }, + listeners: { + 'interactions:new': ({ + interaction + }) => { + interaction.modification = new Modification(interaction); + }, + 'interactions:before-action-start': arg => { + const { + modification + } = arg.interaction; + modification.start(arg, arg.interaction.coords.start.page); + arg.interaction.edges = modification.edges; + modification.applyToInteraction(arg); + }, + 'interactions:before-action-move': arg => arg.interaction.modification.setAndApply(arg), + 'interactions:before-action-end': arg => arg.interaction.modification.beforeEnd(arg), + 'interactions:action-start': addEventModifiers, + 'interactions:action-move': addEventModifiers, + 'interactions:action-end': addEventModifiers, + 'interactions:after-action-start': arg => arg.interaction.modification.restoreInteractionCoords(arg), + 'interactions:after-action-move': arg => arg.interaction.modification.restoreInteractionCoords(arg), + 'interactions:stop': arg => arg.interaction.modification.stop(arg) + }, + before: ['actions', 'action/drag', 'actions/resize', 'actions/gesture'] +}; +export default modifiersBase; +//# sourceMappingURL=base.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/base.js.map b/@interactjs/modifiers/base.js.map new file mode 100644 index 000000000..117eb8756 --- /dev/null +++ b/@interactjs/modifiers/base.js.map @@ -0,0 +1,51 @@ +{ + "version": 3, + "sources": [ + "base.ts" + ], + "names": [ + "Modification", + "makeModifier", + "module", + "name", + "defaults", + "methods", + "start", + "set", + "beforeEnd", + "stop", + "modifier", + "_options", + "options", + "enabled", + "prop", + "m", + "_defaults", + "_methods", + "addEventModifiers", + "iEvent", + "interaction", + "modification", + "result", + "modifiers", + "eventProps", + "modifiersBase", + "id", + "install", + "scope", + "perAction", + "listeners", + "arg", + "coords", + "page", + "edges", + "applyToInteraction", + "setAndApply", + "restoreInteractionCoords", + "before" + ], + "mappings": "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", + "sourcesContent": [ + "import Modification from './Modification'\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n modification?: Modification\n }\n}\n\ndeclare module '@interactjs/core/InteractEvent' {\n interface InteractEvent {\n modifiers?: Array<{\n name: string\n [key: string]: any\n }>\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface PerActionDefaults {\n modifiers?: Modifier[]\n }\n}\n\nexport interface Modifier<\n Defaults = any,\n State extends ModifierState = any,\n Name extends string = any\n> {\n options?: Defaults\n methods: {\n start?: (arg: ModifierArg) => void\n set: (arg: ModifierArg) => void\n beforeEnd?: (arg: ModifierArg) => Interact.Point | void\n stop?: (arg: ModifierArg) => void\n }\n name?: Name\n}\n\nexport type ModifierState<\n Defaults = {},\n StateProps extends { [prop: string]: any } = {},\n Name extends string = any\n> = {\n options: Defaults\n methods?: Modifier['methods']\n index?: number\n name?: Name\n} & StateProps\n\nexport interface ModifierArg {\n interaction: Interact.Interaction\n interactable: Interact.Interactable\n phase: Interact.EventPhase\n rect: Interact.FullRect\n edges: Interact.EdgeOptions\n state?: State\n element: Interact.Element\n pageCoords?: Interact.Point\n prevCoords?: Interact.Point\n prevRect?: Interact.FullRect\n coords?: Interact.Point\n startOffset?: Interact.Rect\n preEnd?: boolean\n}\n\nexport interface ModifierModule<\n Defaults extends { enabled?: boolean },\n State extends ModifierState,\n> {\n defaults?: Defaults\n start? (arg: ModifierArg): void\n set? (arg: ModifierArg): any\n beforeEnd? (arg: ModifierArg): Interact.Point | void\n stop? (arg: ModifierArg): void\n}\n\nexport function makeModifier<\n Defaults extends { enabled?: boolean },\n State extends ModifierState,\n Name extends string\n> (\n module: ModifierModule,\n name?: Name,\n) {\n const { defaults } = module\n const methods = {\n start: module.start,\n set: module.set,\n beforeEnd: module.beforeEnd,\n stop: module.stop,\n }\n\n const modifier = (_options?: Partial) => {\n const options: Defaults = (_options || {}) as Defaults\n\n options.enabled = options.enabled !== false\n\n // add missing defaults to options\n for (const prop in defaults) {\n if (!(prop in options)) {\n options[prop] = defaults[prop]\n }\n }\n\n const m: Modifier = { options, methods, name }\n\n return m\n }\n\n if (name && typeof name === 'string') {\n // for backwrads compatibility\n modifier._defaults = defaults\n modifier._methods = methods\n }\n\n return modifier\n}\n\nexport function addEventModifiers ({ iEvent, interaction: { modification: { result } } }: {\n iEvent: Interact.InteractEvent\n interaction: Interact.Interaction\n}) {\n if (result) {\n iEvent.modifiers = result.eventProps\n }\n}\n\nconst modifiersBase: Interact.Plugin = {\n id: 'modifiers/base',\n install: scope => {\n scope.defaults.perAction.modifiers = []\n },\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.modification = new Modification(interaction)\n },\n\n 'interactions:before-action-start': arg => {\n const { modification } = arg.interaction\n\n modification.start(arg, arg.interaction.coords.start.page)\n arg.interaction.edges = modification.edges\n modification.applyToInteraction(arg)\n },\n\n 'interactions:before-action-move': arg => arg.interaction.modification.setAndApply(arg),\n\n 'interactions:before-action-end': arg => arg.interaction.modification.beforeEnd(arg),\n\n 'interactions:action-start': addEventModifiers,\n 'interactions:action-move': addEventModifiers,\n 'interactions:action-end': addEventModifiers,\n\n 'interactions:after-action-start': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n 'interactions:after-action-move': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n\n 'interactions:stop': arg => arg.interaction.modification.stop(arg),\n },\n before: ['actions', 'action/drag', 'actions/resize', 'actions/gesture'],\n}\n\nexport default modifiersBase\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/base.min.js b/@interactjs/modifiers/base.min.js new file mode 100644 index 000000000..2a27d6aca --- /dev/null +++ b/@interactjs/modifiers/base.min.js @@ -0,0 +1,2 @@ +import t from"./Modification.min.js";export function makeModifier(t,i){const{defaults:n}=t,e={start:t.start,set:t.set,beforeEnd:t.beforeEnd,stop:t.stop},o=t=>{const o=t||{};o.enabled=!1!==o.enabled;for(const t in n)t in o||(o[t]=n[t]);return{options:o,methods:e,name:i}};return i&&"string"==typeof i&&(o._defaults=n,o._methods=e),o}export function addEventModifiers({iEvent:t,interaction:{modification:{result:i}}}){i&&(t.modifiers=i.eventProps)}const i={id:"modifiers/base",install(t){t.defaults.perAction.modifiers=[]},listeners:{"interactions:new"({interaction:i}){i.modification=new t(i)},"interactions:before-action-start"(t){const{modification:i}=t.interaction;i.start(t,t.interaction.coords.start.page),t.interaction.edges=i.edges,i.applyToInteraction(t)},"interactions:before-action-move"(t){return t.interaction.modification.setAndApply(t)},"interactions:before-action-end"(t){return t.interaction.modification.beforeEnd(t)},"interactions:action-start":addEventModifiers,"interactions:action-move":addEventModifiers,"interactions:action-end":addEventModifiers,"interactions:after-action-start"(t){return t.interaction.modification.restoreInteractionCoords(t)},"interactions:after-action-move"(t){return t.interaction.modification.restoreInteractionCoords(t)},"interactions:stop"(t){return t.interaction.modification.stop(t)}},before:["actions","action/drag","actions/resize","actions/gesture"]};export default i; +//# sourceMappingURL=base.min.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/base.min.js.map b/@interactjs/modifiers/base.min.js.map new file mode 100644 index 000000000..a4ef2c63e --- /dev/null +++ b/@interactjs/modifiers/base.min.js.map @@ -0,0 +1,54 @@ +{ + "version": 3, + "sources": [ + "base.ts" + ], + "names": [ + "Modification", + "makeModifier", + "module", + "name", + "defaults", + "methods", + "start", + "set", + "beforeEnd", + "stop", + "modifier", + "_options", + "options", + "enabled", + "prop", + "_defaults", + "_methods", + "addEventModifiers", + "iEvent", + "interaction", + "modification", + "result", + "modifiers", + "eventProps", + "modifiersBase", + "id", + "install", + "scope", + "perAction", + "listeners", + "[object Object]", + "arg", + "coords", + "page", + "edges", + "applyToInteraction", + "setAndApply", + "interactions:action-start", + "interactions:action-move", + "interactions:action-end", + "restoreInteractionCoords", + "before" + ], + "mappings": "OAAOA,MAAkB,+BA4ElB,SAASC,aAKdC,EACAC,GAEA,MAAMC,SAAEA,GAAaF,EACfG,EAAU,CACdC,MAAOJ,EAAOI,MACdC,IAAKL,EAAOK,IACZC,UAAWN,EAAOM,UAClBC,KAAMP,EAAOO,MAGTC,EAAYC,IAChB,MAAMC,EAAqBD,GAAY,GAEvCC,EAAQC,SAA8B,IAApBD,EAAQC,QAG1B,IAAK,MAAMC,KAAQV,EACXU,KAAQF,IACZA,EAAQE,GAAQV,EAASU,IAM7B,MAF2C,CAAEF,QAAAA,EAASP,QAAAA,EAASF,KAAAA,IAWjE,OANIA,GAAwB,iBAATA,IAEjBO,EAASK,UAAYX,EACrBM,EAASM,SAAWX,GAGfK,SAGF,SAASO,mBAAmBC,OAAEA,EAAQC,aAAeC,cAAcC,OAAEA,MAItEA,IACFH,EAAOI,UAAYD,EAAOE,YAI9B,MAAMC,EAAiC,CACrCC,GAAI,iBACJC,QAASC,GACPA,EAAMvB,SAASwB,UAAUN,UAAY,IAEvCO,UAAW,CACTC,oBAAuBX,YAAAA,IACrBA,EAAYC,aAAe,IAAIpB,EAAamB,IAG9CW,mCAAoCC,GAClC,MAAMX,aAAEA,GAAiBW,EAAIZ,YAE7BC,EAAad,MAAMyB,EAAKA,EAAIZ,YAAYa,OAAO1B,MAAM2B,MACrDF,EAAIZ,YAAYe,MAAQd,EAAac,MACrCd,EAAae,mBAAmBJ,IAGlCD,kCAAmCC,GAAOA,OAAAA,EAAIZ,YAAYC,aAAagB,YAAYL,IAEnFD,iCAAkCC,GAAOA,OAAAA,EAAIZ,YAAYC,aAAaZ,UAAUuB,IAEhFM,4BAA6BpB,kBAC7BqB,2BAA4BrB,kBAC5BsB,0BAA2BtB,kBAE3Ba,kCAAmCC,GAAOA,OAAAA,EAAIZ,YAAYC,aAAaoB,yBAAyBT,IAChGD,iCAAkCC,GAAOA,OAAAA,EAAIZ,YAAYC,aAAaoB,yBAAyBT,IAE/FD,oBAAqBC,GAAOA,OAAAA,EAAIZ,YAAYC,aAAaX,KAAKsB,KAEhEU,OAAQ,CAAC,UAAW,cAAe,iBAAkB,mCAGxCjB", + "sourcesContent": [ + "import Modification from './Modification'\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n modification?: Modification\n }\n}\n\ndeclare module '@interactjs/core/InteractEvent' {\n interface InteractEvent {\n modifiers?: Array<{\n name: string\n [key: string]: any\n }>\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface PerActionDefaults {\n modifiers?: Modifier[]\n }\n}\n\nexport interface Modifier<\n Defaults = any,\n State extends ModifierState = any,\n Name extends string = any\n> {\n options?: Defaults\n methods: {\n start?: (arg: ModifierArg) => void\n set: (arg: ModifierArg) => void\n beforeEnd?: (arg: ModifierArg) => Interact.Point | void\n stop?: (arg: ModifierArg) => void\n }\n name?: Name\n}\n\nexport type ModifierState<\n Defaults = {},\n StateProps extends { [prop: string]: any } = {},\n Name extends string = any\n> = {\n options: Defaults\n methods?: Modifier['methods']\n index?: number\n name?: Name\n} & StateProps\n\nexport interface ModifierArg {\n interaction: Interact.Interaction\n interactable: Interact.Interactable\n phase: Interact.EventPhase\n rect: Interact.FullRect\n edges: Interact.EdgeOptions\n state?: State\n element: Interact.Element\n pageCoords?: Interact.Point\n prevCoords?: Interact.Point\n prevRect?: Interact.FullRect\n coords?: Interact.Point\n startOffset?: Interact.Rect\n preEnd?: boolean\n}\n\nexport interface ModifierModule<\n Defaults extends { enabled?: boolean },\n State extends ModifierState,\n> {\n defaults?: Defaults\n start? (arg: ModifierArg): void\n set? (arg: ModifierArg): any\n beforeEnd? (arg: ModifierArg): Interact.Point | void\n stop? (arg: ModifierArg): void\n}\n\nexport function makeModifier<\n Defaults extends { enabled?: boolean },\n State extends ModifierState,\n Name extends string\n> (\n module: ModifierModule,\n name?: Name,\n) {\n const { defaults } = module\n const methods = {\n start: module.start,\n set: module.set,\n beforeEnd: module.beforeEnd,\n stop: module.stop,\n }\n\n const modifier = (_options?: Partial) => {\n const options: Defaults = (_options || {}) as Defaults\n\n options.enabled = options.enabled !== false\n\n // add missing defaults to options\n for (const prop in defaults) {\n if (!(prop in options)) {\n options[prop] = defaults[prop]\n }\n }\n\n const m: Modifier = { options, methods, name }\n\n return m\n }\n\n if (name && typeof name === 'string') {\n // for backwrads compatibility\n modifier._defaults = defaults\n modifier._methods = methods\n }\n\n return modifier\n}\n\nexport function addEventModifiers ({ iEvent, interaction: { modification: { result } } }: {\n iEvent: Interact.InteractEvent\n interaction: Interact.Interaction\n}) {\n if (result) {\n iEvent.modifiers = result.eventProps\n }\n}\n\nconst modifiersBase: Interact.Plugin = {\n id: 'modifiers/base',\n install: scope => {\n scope.defaults.perAction.modifiers = []\n },\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.modification = new Modification(interaction)\n },\n\n 'interactions:before-action-start': arg => {\n const { modification } = arg.interaction\n\n modification.start(arg, arg.interaction.coords.start.page)\n arg.interaction.edges = modification.edges\n modification.applyToInteraction(arg)\n },\n\n 'interactions:before-action-move': arg => arg.interaction.modification.setAndApply(arg),\n\n 'interactions:before-action-end': arg => arg.interaction.modification.beforeEnd(arg),\n\n 'interactions:action-start': addEventModifiers,\n 'interactions:action-move': addEventModifiers,\n 'interactions:action-end': addEventModifiers,\n\n 'interactions:after-action-start': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n 'interactions:after-action-move': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n\n 'interactions:stop': arg => arg.interaction.modification.stop(arg),\n },\n before: ['actions', 'action/drag', 'actions/resize', 'actions/gesture'],\n}\n\nexport default modifiersBase\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/base.spec.d.ts b/@interactjs/modifiers/base.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/modifiers/base.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/modifiers/index.d.ts b/@interactjs/modifiers/index.d.ts new file mode 100644 index 000000000..59be93a84 --- /dev/null +++ b/@interactjs/modifiers/index.d.ts @@ -0,0 +1,11 @@ +import * as all from './all'; +import * as snappers from '@interactjs/utils/snappers/index'; +declare module '@interactjs/interact/index' { + interface InteractStatic { + modifiers: typeof all; + snappers: typeof snappers; + createSnapGrid: typeof snappers.grid; + } +} +declare const modifiers: Interact.Plugin; +export default modifiers; diff --git a/@interactjs/modifiers/index.js b/@interactjs/modifiers/index.js new file mode 100644 index 000000000..c9cacd510 --- /dev/null +++ b/@interactjs/modifiers/index.js @@ -0,0 +1,29 @@ +import base from "./base.js"; +import * as all from "./all.js"; +import extend from "../utils/extend.js"; +import * as snappers from "../utils/snappers/index.js"; +const modifiers = { + id: 'modifiers', + + install(scope) { + const { + interact + } = scope; + scope.usePlugin(base); + interact.modifiers = extend(interact.modifiers || {}, all); + interact.snappers = extend(interact.snappers || {}, snappers); + interact.createSnapGrid = interact.snappers.grid; // for backwrads compatibility + + for (const type in all) { + const { + _defaults, + _methods + } = all[type]; + _defaults._methods = _methods; + scope.defaults.perAction[type] = _defaults; + } + } + +}; +export default modifiers; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/index.js.map b/@interactjs/modifiers/index.js.map new file mode 100644 index 000000000..3ace160b1 --- /dev/null +++ b/@interactjs/modifiers/index.js.map @@ -0,0 +1,29 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "base", + "all", + "extend", + "snappers", + "modifiers", + "id", + "install", + "scope", + "interact", + "usePlugin", + "createSnapGrid", + "grid", + "type", + "_defaults", + "_methods", + "defaults", + "perAction" + ], + "mappings": "AAAA,OAAOA,IAAP,MAAiB,WAAjB;AAEA,OAAO,KAAKC,GAAZ,MAAqB,UAArB;AACA,OAAOC,MAAP,MAAmB,oBAAnB;AACA,OAAO,KAAKC,QAAZ,MAA0B,4BAA1B;AAUA,MAAMC,SAA0B,GAAG;AACjCC,EAAAA,EAAE,EAAE,WAD6B;;AAEjCC,EAAAA,OAAO,CAAEC,KAAF,EAAS;AACd,UAAM;AAAEC,MAAAA;AAAF,QAAeD,KAArB;AAEAA,IAAAA,KAAK,CAACE,SAAN,CAAgBT,IAAhB;AAEAQ,IAAAA,QAAQ,CAACJ,SAAT,GAAqBF,MAAM,CAACM,QAAQ,CAACJ,SAAT,IAAsB,EAAvB,EAA2BH,GAA3B,CAA3B;AACAO,IAAAA,QAAQ,CAACL,QAAT,GAAoBD,MAAM,CAACM,QAAQ,CAACL,QAAT,IAAqB,EAAtB,EAA0BA,QAA1B,CAA1B;AACAK,IAAAA,QAAQ,CAACE,cAAT,GAA0BF,QAAQ,CAACL,QAAT,CAAkBQ,IAA5C,CAPc,CASd;;AACA,SAAK,MAAMC,IAAX,IAAmBX,GAAnB,EAAwB;AACtB,YAAM;AAAEY,QAAAA,SAAF;AAAaC,QAAAA;AAAb,UAA0Bb,GAAG,CAACW,IAAD,CAAnC;AAEEC,MAAAA,SAAD,CAAmBC,QAAnB,GAA8BA,QAA9B;AACCP,MAAAA,KAAK,CAACQ,QAAN,CAAeC,SAAhB,CAAkCJ,IAAlC,IAA0CC,SAA1C;AACF;AACF;;AAlBgC,CAAnC;AAqBA,eAAeT,SAAf", + "sourcesContent": [ + "import base from './base'\n\nimport * as all from './all'\nimport extend from '@interactjs/utils/extend'\nimport * as snappers from '@interactjs/utils/snappers/index'\n\ndeclare module '@interactjs/interact/index' {\n interface InteractStatic {\n modifiers: typeof all\n snappers: typeof snappers\n createSnapGrid: typeof snappers.grid\n }\n}\n\nconst modifiers: Interact.Plugin = {\n id: 'modifiers',\n install (scope) {\n const { interact } = scope\n\n scope.usePlugin(base)\n\n interact.modifiers = extend(interact.modifiers || {}, all)\n interact.snappers = extend(interact.snappers || {}, snappers)\n interact.createSnapGrid = interact.snappers.grid\n\n // for backwrads compatibility\n for (const type in all) {\n const { _defaults, _methods } = all[type as keyof typeof all]\n\n ;(_defaults as any)._methods = _methods\n ;(scope.defaults.perAction as any)[type] = _defaults\n }\n },\n}\n\nexport default modifiers\n" + ] +} \ No newline at end of file diff --git a/@interactjs/modifiers/index.min.js b/@interactjs/modifiers/index.min.js new file mode 100644 index 000000000..a2d231347 --- /dev/null +++ b/@interactjs/modifiers/index.min.js @@ -0,0 +1,2 @@ +import s from"./base.min.js";import*as i from"./all.min.js";import e from"../utils/extend.min.js";import*as r from"../utils/snappers/index.min.js";const t={id:"modifiers",install(t){const{interact:n}=t;t.usePlugin(s),n.modifiers=e(n.modifiers||{},i),n.snappers=e(n.snappers||{},r),n.createSnapGrid=n.snappers.grid;for(const s in i){const{_defaults:e,_methods:r}=i[s];e._methods=r,t.defaults.perAction[s]=e}}};export default t; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/modifiers/index.min.js.map b/@interactjs/modifiers/index.min.js.map new file mode 100644 index 000000000..d001d25b7 --- /dev/null +++ b/@interactjs/modifiers/index.min.js.map @@ -0,0 +1,29 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "base", + "all", + "extend", + "snappers", + "modifiers", + "id", + "install", + "scope", + "interact", + "usePlugin", + "createSnapGrid", + "grid", + "type", + "_defaults", + "_methods", + "defaults", + "perAction" + ], + "mappings": "OAAOA,MAAU,0BAELC,MAAS,sBACdC,MAAY,mCACPC,MAAc,iCAU1B,MAAMC,EAA6B,CACjCC,GAAI,YACJC,QAASC,GACP,MAAMC,SAAEA,GAAaD,EAErBA,EAAME,UAAUT,GAEhBQ,EAASJ,UAAYF,EAAOM,EAASJ,WAAa,GAAIH,GACtDO,EAASL,SAAWD,EAAOM,EAASL,UAAY,GAAIA,GACpDK,EAASE,eAAiBF,EAASL,SAASQ,KAG5C,IAAK,MAAMC,KAAQX,EAAK,CACtB,MAAMY,UAAEA,EAAFC,SAAaA,GAAab,EAAIW,GAElCC,EAAkBC,SAAWA,EAC7BP,EAAMQ,SAASC,UAAkBJ,GAAQC,oBAKlCT", + "sourcesContent": [ + "import base from './base'\n\nimport * as all from './all'\nimport extend from '@interactjs/utils/extend'\nimport * as snappers from '@interactjs/utils/snappers/index'\n\ndeclare module '@interactjs/interact/index' {\n interface InteractStatic {\n modifiers: typeof all\n snappers: typeof snappers\n createSnapGrid: typeof snappers.grid\n }\n}\n\nconst modifiers: Interact.Plugin = {\n id: 'modifiers',\n install (scope) {\n const { interact } = scope\n\n scope.usePlugin(base)\n\n interact.modifiers = extend(interact.modifiers || {}, all)\n interact.snappers = extend(interact.snappers || {}, snappers)\n interact.createSnapGrid = interact.snappers.grid\n\n // for backwrads compatibility\n for (const type in all) {\n const { _defaults, _methods } = all[type as keyof typeof all]\n\n ;(_defaults as any)._methods = _methods\n ;(scope.defaults.perAction as any)[type] = _defaults\n }\n },\n}\n\nexport default modifiers\n" + ] +} \ No newline at end of file diff --git a/@interactjs/offset/.npmignore b/@interactjs/offset/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/offset/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/offset/LICENSE b/@interactjs/offset/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/offset/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/offset/index.d.ts b/@interactjs/offset/index.d.ts new file mode 100644 index 000000000..63231e31e --- /dev/null +++ b/@interactjs/offset/index.d.ts @@ -0,0 +1,17 @@ +declare module '@interactjs/core/Interaction' { + interface Interaction { + offsetBy?: typeof offsetBy; + offset: { + total: Interact.Point; + pending: Interact.Point; + }; + } + enum _ProxyMethods { + offsetBy = "" + } +} +export declare function addTotal(interaction: Interact.Interaction): void; +export declare function applyPending(interaction: Interact.Interaction): boolean; +declare function offsetBy(this: Interact.Interaction, { x, y }: Interact.Point): void; +declare const offset: Interact.Plugin; +export default offset; diff --git a/@interactjs/offset/index.js b/@interactjs/offset/index.js new file mode 100644 index 000000000..b318304bd --- /dev/null +++ b/@interactjs/offset/index.js @@ -0,0 +1,120 @@ +import { _ProxyMethods } from "../core/Interaction.js"; +import * as rectUtils from "../utils/rect.js"; +_ProxyMethods.offsetBy = ''; +export function addTotal(interaction) { + if (!interaction.pointerIsDown) { + return; + } + + addToCoords(interaction.coords.cur, interaction.offset.total); + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +function beforeAction({ + interaction +}) { + applyPending(interaction); +} + +function beforeEnd({ + interaction +}) { + const hadPending = applyPending(interaction); + + if (!hadPending) { + return; + } + + interaction.move({ + offset: true + }); + interaction.end(); + return false; +} + +function end({ + interaction +}) { + interaction.offset.total.x = 0; + interaction.offset.total.y = 0; + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +export function applyPending(interaction) { + if (!hasPending(interaction)) { + return false; + } + + const { + pending + } = interaction.offset; + addToCoords(interaction.coords.cur, pending); + addToCoords(interaction.coords.delta, pending); + rectUtils.addEdges(interaction.edges, interaction.rect, pending); + pending.x = 0; + pending.y = 0; + return true; +} + +function offsetBy({ + x, + y +}) { + this.offset.pending.x += x; + this.offset.pending.y += y; + this.offset.total.x += x; + this.offset.total.y += y; +} + +function addToCoords({ + page, + client +}, { + x, + y +}) { + page.x += x; + page.y += y; + client.x += x; + client.y += y; +} + +function hasPending(interaction) { + return !!(interaction.offset.pending.x || interaction.offset.pending.y); +} + +const offset = { + id: 'offset', + + install(scope) { + scope.Interaction.prototype.offsetBy = offsetBy; + }, + + listeners: { + 'interactions:new': ({ + interaction + }) => { + interaction.offset = { + total: { + x: 0, + y: 0 + }, + pending: { + x: 0, + y: 0 + } + }; + }, + 'interactions:update-pointer': ({ + interaction + }) => addTotal(interaction), + 'interactions:before-action-start': beforeAction, + 'interactions:before-action-move': beforeAction, + 'interactions:before-action-end': beforeEnd, + 'interactions:stop': end + } +}; +export default offset; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/offset/index.js.map b/@interactjs/offset/index.js.map new file mode 100644 index 000000000..0d67373d5 --- /dev/null +++ b/@interactjs/offset/index.js.map @@ -0,0 +1,45 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "_ProxyMethods", + "rectUtils", + "offsetBy", + "addTotal", + "interaction", + "pointerIsDown", + "addToCoords", + "coords", + "cur", + "offset", + "total", + "pending", + "x", + "y", + "beforeAction", + "applyPending", + "beforeEnd", + "hadPending", + "move", + "end", + "hasPending", + "delta", + "addEdges", + "edges", + "rect", + "page", + "client", + "id", + "install", + "scope", + "Interaction", + "prototype", + "listeners" + ], + "mappings": "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", + "sourcesContent": [ + "import { _ProxyMethods } from '@interactjs/core/Interaction'\nimport * as rectUtils from '@interactjs/utils/rect'\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n offsetBy?: typeof offsetBy\n offset: {\n total: Interact.Point\n pending: Interact.Point\n }\n }\n\n // eslint-disable-next-line no-shadow\n enum _ProxyMethods {\n // eslint-disable-next-line no-shadow\n offsetBy = ''\n }\n}\n\n(_ProxyMethods as any).offsetBy = ''\n\nexport function addTotal (interaction: Interact.Interaction) {\n if (!interaction.pointerIsDown) { return }\n\n addToCoords(interaction.coords.cur, interaction.offset.total)\n\n interaction.offset.pending.x = 0\n interaction.offset.pending.y = 0\n}\n\nfunction beforeAction ({ interaction }: { interaction: Interact.Interaction }) {\n applyPending(interaction)\n}\n\nfunction beforeEnd ({ interaction }: { interaction: Interact.Interaction }): boolean | void {\n const hadPending = applyPending(interaction)\n\n if (!hadPending) { return }\n\n interaction.move({ offset: true })\n interaction.end()\n\n return false\n}\n\nfunction end ({ interaction }: { interaction: Interact.Interaction }) {\n interaction.offset.total.x = 0\n interaction.offset.total.y = 0\n interaction.offset.pending.x = 0\n interaction.offset.pending.y = 0\n}\n\nexport function applyPending (interaction: Interact.Interaction) {\n if (!hasPending(interaction)) {\n return false\n }\n\n const { pending } = interaction.offset\n\n addToCoords(interaction.coords.cur, pending)\n addToCoords(interaction.coords.delta, pending)\n rectUtils.addEdges(interaction.edges, interaction.rect, pending)\n\n pending.x = 0\n pending.y = 0\n\n return true\n}\n\nfunction offsetBy (this: Interact.Interaction, { x, y }: Interact.Point) {\n this.offset.pending.x += x\n this.offset.pending.y += y\n\n this.offset.total.x += x\n this.offset.total.y += y\n}\n\nfunction addToCoords ({ page, client }, { x, y }: Interact.Point) {\n page.x += x\n page.y += y\n client.x += x\n client.y += y\n}\n\nfunction hasPending (interaction) {\n return !!(interaction.offset.pending.x || interaction.offset.pending.y)\n}\n\nconst offset: Interact.Plugin = {\n id: 'offset',\n install (scope) {\n scope.Interaction.prototype.offsetBy = offsetBy\n },\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.offset = {\n total: { x: 0, y: 0 },\n pending: { x: 0, y: 0 },\n }\n },\n 'interactions:update-pointer': ({ interaction }) => addTotal(interaction),\n 'interactions:before-action-start': beforeAction,\n 'interactions:before-action-move': beforeAction,\n 'interactions:before-action-end': beforeEnd,\n 'interactions:stop': end,\n },\n}\n\nexport default offset\n" + ] +} \ No newline at end of file diff --git a/@interactjs/offset/index.min.js b/@interactjs/offset/index.min.js new file mode 100644 index 000000000..155203430 --- /dev/null +++ b/@interactjs/offset/index.min.js @@ -0,0 +1,2 @@ +import{_ProxyMethods as t}from"../core/Interaction.min.js";import*as n from"../utils/rect.min.js";t.offsetBy="";export function addTotal(t){t.pointerIsDown&&(i(t.coords.cur,t.offset.total),t.offset.pending.x=0,t.offset.pending.y=0)}function e({interaction:t}){applyPending(t)}export function applyPending(t){if(!function(t){return!(!t.offset.pending.x&&!t.offset.pending.y)}(t))return!1;const{pending:e}=t.offset;return i(t.coords.cur,e),i(t.coords.delta,e),n.addEdges(t.edges,t.rect,e),e.x=0,e.y=0,!0}function o({x:t,y:n}){this.offset.pending.x+=t,this.offset.pending.y+=n,this.offset.total.x+=t,this.offset.total.y+=n}function i({page:t,client:n},{x:e,y:o}){t.x+=e,t.y+=o,n.x+=e,n.y+=o}const f={id:"offset",install(t){t.Interaction.prototype.offsetBy=o},listeners:{"interactions:new"({interaction:t}){t.offset={total:{x:0,y:0},pending:{x:0,y:0}}},"interactions:update-pointer"({interaction:t}){return addTotal(t)},"interactions:before-action-start":e,"interactions:before-action-move":e,"interactions:before-action-end"({interaction:t}){if(applyPending(t))return t.move({offset:!0}),t.end(),!1},"interactions:stop"({interaction:t}){t.offset.total.x=0,t.offset.total.y=0,t.offset.pending.x=0,t.offset.pending.y=0}}};export default f; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/offset/index.min.js.map b/@interactjs/offset/index.min.js.map new file mode 100644 index 000000000..65c61eb0c --- /dev/null +++ b/@interactjs/offset/index.min.js.map @@ -0,0 +1,47 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "_ProxyMethods", + "rectUtils", + "offsetBy", + "addTotal", + "interaction", + "pointerIsDown", + "addToCoords", + "coords", + "cur", + "offset", + "total", + "pending", + "x", + "y", + "beforeAction", + "applyPending", + "hasPending", + "delta", + "addEdges", + "edges", + "rect", + "this", + "page", + "client", + "id", + "install", + "scope", + "Interaction", + "prototype", + "listeners", + "[object Object]", + "interactions:before-action-start", + "interactions:before-action-move", + "move", + "end" + ], + "mappings": "wBAASA,MAAqB,uCAClBC,MAAe,uBAkB1BD,EAAsBE,SAAW,UAE3B,SAASC,SAAUC,GACnBA,EAAYC,gBAEjBC,EAAYF,EAAYG,OAAOC,IAAKJ,EAAYK,OAAOC,OAEvDN,EAAYK,OAAOE,QAAQC,EAAI,EAC/BR,EAAYK,OAAOE,QAAQE,EAAI,GAGjC,SAASC,GAAcV,YAAEA,IACvBW,aAAaX,UAqBR,SAASW,aAAcX,GAC5B,IA+BF,SAAqBA,GACnB,SAAUA,EAAYK,OAAOE,QAAQC,IAAKR,EAAYK,OAAOE,QAAQE,GAhChEG,CAAWZ,GACd,OAAO,EAGT,MAAMO,QAAEA,GAAYP,EAAYK,OAShC,OAPAH,EAAYF,EAAYG,OAAOC,IAAKG,GACpCL,EAAYF,EAAYG,OAAOU,MAAON,GACtCV,EAAUiB,SAASd,EAAYe,MAAOf,EAAYgB,KAAMT,GAExDA,EAAQC,EAAI,EACZD,EAAQE,EAAI,GAEL,EAGT,SAASX,GAAsCU,EAAEA,EAAFC,EAAKA,IAClDQ,KAAKZ,OAAOE,QAAQC,GAAKA,EACzBS,KAAKZ,OAAOE,QAAQE,GAAKA,EAEzBQ,KAAKZ,OAAOC,MAAME,GAAKA,EACvBS,KAAKZ,OAAOC,MAAMG,GAAKA,EAGzB,SAASP,GAAagB,KAAEA,EAAFC,OAAQA,IAAUX,EAAEA,EAAFC,EAAKA,IAC3CS,EAAKV,GAAKA,EACVU,EAAKT,GAAKA,EACVU,EAAOX,GAAKA,EACZW,EAAOV,GAAKA,EAOd,MAAMJ,EAA0B,CAC9Be,GAAI,SACJC,QAASC,GACPA,EAAMC,YAAYC,UAAU1B,SAAWA,GAEzC2B,UAAW,CACTC,oBAAuB1B,YAAAA,IACrBA,EAAYK,OAAS,CACnBC,MAAO,CAAEE,EAAG,EAAGC,EAAG,GAClBF,QAAS,CAAEC,EAAG,EAAGC,EAAG,KAGxBiB,+BAAkC1B,YAAAA,IAAkBD,OAAAA,SAASC,IAC7D2B,mCAAoCjB,EACpCkB,kCAAmClB,EACnCgB,kCArEgB1B,YAAEA,IAGpB,GAFmBW,aAAaX,GAOhC,OAHAA,EAAY6B,KAAK,CAAExB,QAAQ,IAC3BL,EAAY8B,OAEL,GA8DLJ,qBA3DU1B,YAAEA,IACdA,EAAYK,OAAOC,MAAME,EAAI,EAC7BR,EAAYK,OAAOC,MAAMG,EAAI,EAC7BT,EAAYK,OAAOE,QAAQC,EAAI,EAC/BR,EAAYK,OAAOE,QAAQE,EAAI,oBA2DlBJ", + "sourcesContent": [ + "import { _ProxyMethods } from '@interactjs/core/Interaction'\nimport * as rectUtils from '@interactjs/utils/rect'\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n offsetBy?: typeof offsetBy\n offset: {\n total: Interact.Point\n pending: Interact.Point\n }\n }\n\n // eslint-disable-next-line no-shadow\n enum _ProxyMethods {\n // eslint-disable-next-line no-shadow\n offsetBy = ''\n }\n}\n\n(_ProxyMethods as any).offsetBy = ''\n\nexport function addTotal (interaction: Interact.Interaction) {\n if (!interaction.pointerIsDown) { return }\n\n addToCoords(interaction.coords.cur, interaction.offset.total)\n\n interaction.offset.pending.x = 0\n interaction.offset.pending.y = 0\n}\n\nfunction beforeAction ({ interaction }: { interaction: Interact.Interaction }) {\n applyPending(interaction)\n}\n\nfunction beforeEnd ({ interaction }: { interaction: Interact.Interaction }): boolean | void {\n const hadPending = applyPending(interaction)\n\n if (!hadPending) { return }\n\n interaction.move({ offset: true })\n interaction.end()\n\n return false\n}\n\nfunction end ({ interaction }: { interaction: Interact.Interaction }) {\n interaction.offset.total.x = 0\n interaction.offset.total.y = 0\n interaction.offset.pending.x = 0\n interaction.offset.pending.y = 0\n}\n\nexport function applyPending (interaction: Interact.Interaction) {\n if (!hasPending(interaction)) {\n return false\n }\n\n const { pending } = interaction.offset\n\n addToCoords(interaction.coords.cur, pending)\n addToCoords(interaction.coords.delta, pending)\n rectUtils.addEdges(interaction.edges, interaction.rect, pending)\n\n pending.x = 0\n pending.y = 0\n\n return true\n}\n\nfunction offsetBy (this: Interact.Interaction, { x, y }: Interact.Point) {\n this.offset.pending.x += x\n this.offset.pending.y += y\n\n this.offset.total.x += x\n this.offset.total.y += y\n}\n\nfunction addToCoords ({ page, client }, { x, y }: Interact.Point) {\n page.x += x\n page.y += y\n client.x += x\n client.y += y\n}\n\nfunction hasPending (interaction) {\n return !!(interaction.offset.pending.x || interaction.offset.pending.y)\n}\n\nconst offset: Interact.Plugin = {\n id: 'offset',\n install (scope) {\n scope.Interaction.prototype.offsetBy = offsetBy\n },\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.offset = {\n total: { x: 0, y: 0 },\n pending: { x: 0, y: 0 },\n }\n },\n 'interactions:update-pointer': ({ interaction }) => addTotal(interaction),\n 'interactions:before-action-start': beforeAction,\n 'interactions:before-action-move': beforeAction,\n 'interactions:before-action-end': beforeEnd,\n 'interactions:stop': end,\n },\n}\n\nexport default offset\n" + ] +} \ No newline at end of file diff --git a/@interactjs/offset/offset.spec.d.ts b/@interactjs/offset/offset.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/offset/offset.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/pointer-events/.npmignore b/@interactjs/pointer-events/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/pointer-events/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/pointer-events/LICENSE b/@interactjs/pointer-events/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/pointer-events/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/pointer-events/PointerEvent.d.ts b/@interactjs/pointer-events/PointerEvent.d.ts new file mode 100644 index 000000000..7ea650d3b --- /dev/null +++ b/@interactjs/pointer-events/PointerEvent.d.ts @@ -0,0 +1,24 @@ +import BaseEvent from '../core/BaseEvent'; +export default class PointerEvent extends BaseEvent { + type: T; + originalEvent: Interact.PointerEventType; + pointerId: number; + pointerType: string; + double: boolean; + pageX: number; + pageY: number; + clientX: number; + clientY: number; + dt: number; + eventable: any; + [key: string]: any; + /** */ + constructor(type: T, pointer: Interact.PointerType | PointerEvent, event: Interact.PointerEventType, eventTarget: Interact.EventTarget, interaction: Interact.Interaction, timeStamp: number); + _subtractOrigin({ x: originX, y: originY }: Interact.Point): this; + _addOrigin({ x: originX, y: originY }: Interact.Point): this; + /** + * Prevent the default behaviour of the original Event + */ + preventDefault(): void; +} +export { PointerEvent }; diff --git a/@interactjs/pointer-events/PointerEvent.js b/@interactjs/pointer-events/PointerEvent.js new file mode 100644 index 000000000..beb06d1bd --- /dev/null +++ b/@interactjs/pointer-events/PointerEvent.js @@ -0,0 +1,74 @@ +import BaseEvent from "../core/BaseEvent.js"; +import * as pointerUtils from "../utils/pointerUtils.js"; +export default class PointerEvent extends BaseEvent { + /** */ + constructor(type, pointer, event, eventTarget, interaction, timeStamp) { + super(interaction); + this.type = void 0; + this.originalEvent = void 0; + this.pointerId = void 0; + this.pointerType = void 0; + this.double = void 0; + this.pageX = void 0; + this.pageY = void 0; + this.clientX = void 0; + this.clientY = void 0; + this.dt = void 0; + this.eventable = void 0; + pointerUtils.pointerExtend(this, event); + + if (event !== pointer) { + pointerUtils.pointerExtend(this, pointer); + } + + this.timeStamp = timeStamp; + this.originalEvent = event; + this.type = type; + this.pointerId = pointerUtils.getPointerId(pointer); + this.pointerType = pointerUtils.getPointerType(pointer); + this.target = eventTarget; + this.currentTarget = null; + + if (type === 'tap') { + const pointerIndex = interaction.getPointerIndex(pointer); + this.dt = this.timeStamp - interaction.pointers[pointerIndex].downTime; + const interval = this.timeStamp - interaction.tapTime; + this.double = !!(interaction.prevTap && interaction.prevTap.type !== 'doubletap' && interaction.prevTap.target === this.target && interval < 500); + } else if (type === 'doubletap') { + this.dt = pointer.timeStamp - interaction.tapTime; + } + } + + _subtractOrigin({ + x: originX, + y: originY + }) { + this.pageX -= originX; + this.pageY -= originY; + this.clientX -= originX; + this.clientY -= originY; + return this; + } + + _addOrigin({ + x: originX, + y: originY + }) { + this.pageX += originX; + this.pageY += originY; + this.clientX += originX; + this.clientY += originY; + return this; + } + /** + * Prevent the default behaviour of the original Event + */ + + + preventDefault() { + this.originalEvent.preventDefault(); + } + +} +export { PointerEvent }; +//# sourceMappingURL=PointerEvent.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/PointerEvent.js.map b/@interactjs/pointer-events/PointerEvent.js.map new file mode 100644 index 000000000..4a5f1291a --- /dev/null +++ b/@interactjs/pointer-events/PointerEvent.js.map @@ -0,0 +1,51 @@ +{ + "version": 3, + "sources": [ + "PointerEvent.ts" + ], + "names": [ + "BaseEvent", + "pointerUtils", + "PointerEvent", + "constructor", + "type", + "pointer", + "event", + "eventTarget", + "interaction", + "timeStamp", + "originalEvent", + "pointerId", + "pointerType", + "double", + "pageX", + "pageY", + "clientX", + "clientY", + "dt", + "eventable", + "pointerExtend", + "getPointerId", + "getPointerType", + "target", + "currentTarget", + "pointerIndex", + "getPointerIndex", + "pointers", + "downTime", + "interval", + "tapTime", + "prevTap", + "_subtractOrigin", + "x", + "originX", + "y", + "originY", + "_addOrigin", + "preventDefault" + ], + "mappings": "AAAA,OAAOA,SAAP,MAAsB,sBAAtB;AACA,OAAO,KAAKC,YAAZ,MAA8B,0BAA9B;AAEA,eAAe,MAAMC,YAAN,SAAmDF,SAAnD,CAA6D;AAc1E;AACAG,EAAAA,WAAW,CACTC,IADS,EAETC,OAFS,EAGTC,KAHS,EAITC,WAJS,EAKTC,WALS,EAMTC,SANS,EAOT;AACA,UAAMD,WAAN;AADA,SArBFJ,IAqBE;AAAA,SApBFM,aAoBE;AAAA,SAnBFC,SAmBE;AAAA,SAlBFC,WAkBE;AAAA,SAjBFC,MAiBE;AAAA,SAhBFC,KAgBE;AAAA,SAfFC,KAeE;AAAA,SAdFC,OAcE;AAAA,SAbFC,OAaE;AAAA,SAZFC,EAYE;AAAA,SAXFC,SAWE;AAEAlB,IAAAA,YAAY,CAACmB,aAAb,CAA2B,IAA3B,EAAiCd,KAAjC;;AAEA,QAAIA,KAAK,KAAKD,OAAd,EAAuB;AACrBJ,MAAAA,YAAY,CAACmB,aAAb,CAA2B,IAA3B,EAAiCf,OAAjC;AACD;;AAED,SAAKI,SAAL,GAAqBA,SAArB;AACA,SAAKC,aAAL,GAAqBJ,KAArB;AACA,SAAKF,IAAL,GAAqBA,IAArB;AACA,SAAKO,SAAL,GAAqBV,YAAY,CAACoB,YAAb,CAA0BhB,OAA1B,CAArB;AACA,SAAKO,WAAL,GAAqBX,YAAY,CAACqB,cAAb,CAA4BjB,OAA5B,CAArB;AACA,SAAKkB,MAAL,GAAqBhB,WAArB;AACA,SAAKiB,aAAL,GAAqB,IAArB;;AAEA,QAAIpB,IAAI,KAAK,KAAb,EAAoB;AAClB,YAAMqB,YAAY,GAAGjB,WAAW,CAACkB,eAAZ,CAA4BrB,OAA5B,CAArB;AACA,WAAKa,EAAL,GAAU,KAAKT,SAAL,GAAiBD,WAAW,CAACmB,QAAZ,CAAqBF,YAArB,EAAmCG,QAA9D;AAEA,YAAMC,QAAQ,GAAG,KAAKpB,SAAL,GAAiBD,WAAW,CAACsB,OAA9C;AAEA,WAAKjB,MAAL,GAAc,CAAC,EAAEL,WAAW,CAACuB,OAAZ,IACfvB,WAAW,CAACuB,OAAZ,CAAoB3B,IAApB,KAA6B,WADd,IAEfI,WAAW,CAACuB,OAAZ,CAAoBR,MAApB,KAA+B,KAAKA,MAFrB,IAGfM,QAAQ,GAAG,GAHE,CAAf;AAID,KAVD,MAWK,IAAIzB,IAAI,KAAK,WAAb,EAA0B;AAC7B,WAAKc,EAAL,GAAWb,OAAD,CAAiCI,SAAjC,GAA6CD,WAAW,CAACsB,OAAnE;AACD;AACF;;AAEDE,EAAAA,eAAe,CAAE;AAAEC,IAAAA,CAAC,EAAEC,OAAL;AAAcC,IAAAA,CAAC,EAAEC;AAAjB,GAAF,EAA8C;AAC3D,SAAKtB,KAAL,IAAgBoB,OAAhB;AACA,SAAKnB,KAAL,IAAgBqB,OAAhB;AACA,SAAKpB,OAAL,IAAgBkB,OAAhB;AACA,SAAKjB,OAAL,IAAgBmB,OAAhB;AAEA,WAAO,IAAP;AACD;;AAEDC,EAAAA,UAAU,CAAE;AAAEJ,IAAAA,CAAC,EAAEC,OAAL;AAAcC,IAAAA,CAAC,EAAEC;AAAjB,GAAF,EAA8C;AACtD,SAAKtB,KAAL,IAAgBoB,OAAhB;AACA,SAAKnB,KAAL,IAAgBqB,OAAhB;AACA,SAAKpB,OAAL,IAAgBkB,OAAhB;AACA,SAAKjB,OAAL,IAAgBmB,OAAhB;AAEA,WAAO,IAAP;AACD;AAED;;;;;AAGAE,EAAAA,cAAc,GAAI;AAChB,SAAK5B,aAAL,CAAmB4B,cAAnB;AACD;;AA7EyE;AAgF5E,SAASpC,YAAT", + "sourcesContent": [ + "import BaseEvent from '../core/BaseEvent'\nimport * as pointerUtils from '../utils/pointerUtils'\n\nexport default class PointerEvent extends BaseEvent {\n type: T\n originalEvent: Interact.PointerEventType\n pointerId: number\n pointerType: string\n double: boolean\n pageX: number\n pageY: number\n clientX: number\n clientY: number\n dt: number\n eventable: any\n [key: string]: any\n\n /** */\n constructor (\n type: T,\n pointer: Interact.PointerType | PointerEvent,\n event: Interact.PointerEventType,\n eventTarget: Interact.EventTarget,\n interaction: Interact.Interaction,\n timeStamp: number,\n ) {\n super(interaction)\n pointerUtils.pointerExtend(this, event)\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer)\n }\n\n this.timeStamp = timeStamp\n this.originalEvent = event\n this.type = type\n this.pointerId = pointerUtils.getPointerId(pointer)\n this.pointerType = pointerUtils.getPointerType(pointer)\n this.target = eventTarget\n this.currentTarget = null\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer)\n this.dt = this.timeStamp - interaction.pointers[pointerIndex].downTime\n\n const interval = this.timeStamp - interaction.tapTime\n\n this.double = !!(interaction.prevTap &&\n interaction.prevTap.type !== 'doubletap' &&\n interaction.prevTap.target === this.target &&\n interval < 500)\n }\n else if (type === 'doubletap') {\n this.dt = (pointer as PointerEvent<'tap'>).timeStamp - interaction.tapTime\n }\n }\n\n _subtractOrigin ({ x: originX, y: originY }: Interact.Point) {\n this.pageX -= originX\n this.pageY -= originY\n this.clientX -= originX\n this.clientY -= originY\n\n return this\n }\n\n _addOrigin ({ x: originX, y: originY }: Interact.Point) {\n this.pageX += originX\n this.pageY += originY\n this.clientX += originX\n this.clientY += originY\n\n return this\n }\n\n /**\n * Prevent the default behaviour of the original Event\n */\n preventDefault () {\n this.originalEvent.preventDefault()\n }\n}\n\nexport { PointerEvent }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/pointer-events/PointerEvent.min.js b/@interactjs/pointer-events/PointerEvent.min.js new file mode 100644 index 000000000..c342eb97e --- /dev/null +++ b/@interactjs/pointer-events/PointerEvent.min.js @@ -0,0 +1,2 @@ +import t from"../core/BaseEvent.min.js";import*as i from"../utils/pointerUtils.min.js";export default class e extends t{constructor(t,e,s,n,p,r){if(super(p),this.type=void 0,this.originalEvent=void 0,this.pointerId=void 0,this.pointerType=void 0,this.double=void 0,this.pageX=void 0,this.pageY=void 0,this.clientX=void 0,this.clientY=void 0,this.dt=void 0,this.eventable=void 0,i.pointerExtend(this,s),s!==e&&i.pointerExtend(this,e),this.timeStamp=r,this.originalEvent=s,this.type=t,this.pointerId=i.getPointerId(e),this.pointerType=i.getPointerType(e),this.target=n,this.currentTarget=null,"tap"===t){const t=p.getPointerIndex(e);this.dt=this.timeStamp-p.pointers[t].downTime;const i=this.timeStamp-p.tapTime;this.double=!!(p.prevTap&&"doubletap"!==p.prevTap.type&&p.prevTap.target===this.target&&i<500)}else"doubletap"===t&&(this.dt=e.timeStamp-p.tapTime)}_subtractOrigin({x:t,y:i}){return this.pageX-=t,this.pageY-=i,this.clientX-=t,this.clientY-=i,this}_addOrigin({x:t,y:i}){return this.pageX+=t,this.pageY+=i,this.clientX+=t,this.clientY+=i,this}preventDefault(){this.originalEvent.preventDefault()}}export{e as PointerEvent}; +//# sourceMappingURL=PointerEvent.min.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/PointerEvent.min.js.map b/@interactjs/pointer-events/PointerEvent.min.js.map new file mode 100644 index 000000000..174aa7e8e --- /dev/null +++ b/@interactjs/pointer-events/PointerEvent.min.js.map @@ -0,0 +1,53 @@ +{ + "version": 3, + "sources": [ + "PointerEvent.ts" + ], + "names": [ + "BaseEvent", + "pointerUtils", + "PointerEvent", + "constructor", + "type", + "pointer", + "event", + "eventTarget", + "interaction", + "timeStamp", + "super", + "this", + "originalEvent", + "pointerId", + "pointerType", + "double", + "pageX", + "pageY", + "clientX", + "clientY", + "dt", + "eventable", + "pointerExtend", + "getPointerId", + "getPointerType", + "target", + "currentTarget", + "pointerIndex", + "getPointerIndex", + "pointers", + "downTime", + "interval", + "tapTime", + "prevTap", + "_subtractOrigin", + "x", + "originX", + "y", + "originY", + "_addOrigin", + "preventDefault" + ], + "mappings": "OAAOA,MAAe,qCACVC,MAAkB,8CAEf,MAAMC,UAA6CF,EAehEG,YACEC,EACAC,EACAC,EACAC,EACAC,EACAC,GAiBA,GAfAC,MAAMF,GADNG,KArBFP,UAqBE,EAAAO,KApBFC,mBAoBE,EAAAD,KAnBFE,eAmBE,EAAAF,KAlBFG,iBAkBE,EAAAH,KAjBFI,YAiBE,EAAAJ,KAhBFK,WAgBE,EAAAL,KAfFM,WAeE,EAAAN,KAdFO,aAcE,EAAAP,KAbFQ,aAaE,EAAAR,KAZFS,QAYE,EAAAT,KAXFU,eAWE,EAEApB,EAAaqB,cAAcX,KAAML,GAE7BA,IAAUD,GACZJ,EAAaqB,cAAcX,KAAMN,GAGnCM,KAAKF,UAAgBA,EACrBE,KAAKC,cAAgBN,EACrBK,KAAKP,KAAgBA,EACrBO,KAAKE,UAAgBZ,EAAasB,aAAalB,GAC/CM,KAAKG,YAAgBb,EAAauB,eAAenB,GACjDM,KAAKc,OAAgBlB,EACrBI,KAAKe,cAAgB,KAER,QAATtB,EAAgB,CAClB,MAAMuB,EAAenB,EAAYoB,gBAAgBvB,GACjDM,KAAKS,GAAKT,KAAKF,UAAYD,EAAYqB,SAASF,GAAcG,SAE9D,MAAMC,EAAWpB,KAAKF,UAAYD,EAAYwB,QAE9CrB,KAAKI,UAAYP,EAAYyB,SACE,cAA7BzB,EAAYyB,QAAQ7B,MACpBI,EAAYyB,QAAQR,SAAWd,KAAKc,QACpCM,EAAW,SAEG,cAAT3B,IACPO,KAAKS,GAAMf,EAAgCI,UAAYD,EAAYwB,SAIvEE,iBAAmBC,EAAGC,EAASC,EAAGC,IAMhC,OALA3B,KAAKK,OAAWoB,EAChBzB,KAAKM,OAAWqB,EAChB3B,KAAKO,SAAWkB,EAChBzB,KAAKQ,SAAWmB,EAET3B,KAGT4B,YAAcJ,EAAGC,EAASC,EAAGC,IAM3B,OALA3B,KAAKK,OAAWoB,EAChBzB,KAAKM,OAAWqB,EAChB3B,KAAKO,SAAWkB,EAChBzB,KAAKQ,SAAWmB,EAET3B,KAMT6B,iBACE7B,KAAKC,cAAc4B,yBAIdtC", + "sourcesContent": [ + "import BaseEvent from '../core/BaseEvent'\nimport * as pointerUtils from '../utils/pointerUtils'\n\nexport default class PointerEvent extends BaseEvent {\n type: T\n originalEvent: Interact.PointerEventType\n pointerId: number\n pointerType: string\n double: boolean\n pageX: number\n pageY: number\n clientX: number\n clientY: number\n dt: number\n eventable: any\n [key: string]: any\n\n /** */\n constructor (\n type: T,\n pointer: Interact.PointerType | PointerEvent,\n event: Interact.PointerEventType,\n eventTarget: Interact.EventTarget,\n interaction: Interact.Interaction,\n timeStamp: number,\n ) {\n super(interaction)\n pointerUtils.pointerExtend(this, event)\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer)\n }\n\n this.timeStamp = timeStamp\n this.originalEvent = event\n this.type = type\n this.pointerId = pointerUtils.getPointerId(pointer)\n this.pointerType = pointerUtils.getPointerType(pointer)\n this.target = eventTarget\n this.currentTarget = null\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer)\n this.dt = this.timeStamp - interaction.pointers[pointerIndex].downTime\n\n const interval = this.timeStamp - interaction.tapTime\n\n this.double = !!(interaction.prevTap &&\n interaction.prevTap.type !== 'doubletap' &&\n interaction.prevTap.target === this.target &&\n interval < 500)\n }\n else if (type === 'doubletap') {\n this.dt = (pointer as PointerEvent<'tap'>).timeStamp - interaction.tapTime\n }\n }\n\n _subtractOrigin ({ x: originX, y: originY }: Interact.Point) {\n this.pageX -= originX\n this.pageY -= originY\n this.clientX -= originX\n this.clientY -= originY\n\n return this\n }\n\n _addOrigin ({ x: originX, y: originY }: Interact.Point) {\n this.pageX += originX\n this.pageY += originY\n this.clientX += originX\n this.clientY += originY\n\n return this\n }\n\n /**\n * Prevent the default behaviour of the original Event\n */\n preventDefault () {\n this.originalEvent.preventDefault()\n }\n}\n\nexport { PointerEvent }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/pointer-events/PointerEvent.spec.d.ts b/@interactjs/pointer-events/PointerEvent.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/pointer-events/PointerEvent.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/pointer-events/base.d.ts b/@interactjs/pointer-events/base.d.ts new file mode 100644 index 000000000..f22fa5b38 --- /dev/null +++ b/@interactjs/pointer-events/base.d.ts @@ -0,0 +1,116 @@ +import { PerActionDefaults } from '@interactjs/core/defaultOptions'; +import Eventable from '@interactjs/core/Eventable'; +import Interaction from '@interactjs/core/Interaction'; +import { Scope } from '@interactjs/core/scope'; +import PointerEvent from './PointerEvent'; +export declare type EventTargetList = Array<{ + node: Node; + eventable: Eventable; + props: { + [key: string]: any; + }; +}>; +export interface PointerEventOptions extends PerActionDefaults { + enabled?: undefined; + holdDuration?: number; + ignoreFrom?: any; + allowFrom?: any; + origin?: Interact.Point | string | Interact.Element; +} +declare module '@interactjs/core/scope' { + interface Scope { + pointerEvents: typeof pointerEvents; + } +} +declare module '@interactjs/core/Interaction' { + interface Interaction { + prevTap?: PointerEvent; + tapTime?: number; + } +} +declare module '@interactjs/core/PointerInfo' { + interface PointerInfo { + hold?: { + duration: number; + timeout: any; + }; + } +} +declare module '@interactjs/core/defaultOptions' { + interface ActionDefaults { + pointerEvents: Interact.Options; + } +} +declare module '@interactjs/core/scope' { + interface SignalArgs { + 'pointerEvents:new': { + pointerEvent: PointerEvent; + }; + 'pointerEvents:fired': { + interaction: Interaction; + pointer: Interact.PointerType | PointerEvent; + event: Interact.PointerEventType | PointerEvent; + eventTarget: Interact.EventTarget; + pointerEvent: PointerEvent; + targets?: EventTargetList; + type: string; + }; + 'pointerEvents:collect-targets': { + interaction: Interaction; + pointer: Interact.PointerType | PointerEvent; + event: Interact.PointerEventType | PointerEvent; + eventTarget: Interact.EventTarget; + targets?: EventTargetList; + type: string; + path: Node[]; + node: null; + }; + } +} +declare const pointerEvents: { + id: string; + install: typeof install; + listeners: { + 'interactions:new': typeof addInteractionProps; + 'interactions:update-pointer': typeof addHoldInfo; + 'interactions:move': typeof moveAndClearHold; + 'interactions:down': (arg: any, scope: any) => void; + 'interactions:up': (arg: any, scope: any) => void; + 'interactions:cancel': (arg: any, scope: any) => void; + }; + PointerEvent: typeof PointerEvent; + fire: typeof fire; + collectEventTargets: typeof collectEventTargets; + defaults: PointerEventOptions; + types: { + [type: string]: true; + }; +}; +declare function fire(arg: { + pointer: Interact.PointerType | PointerEvent; + event: Interact.PointerEventType | PointerEvent; + eventTarget: Interact.EventTarget; + interaction: Interaction; + type: T; + targets?: EventTargetList; +}, scope: Interact.Scope): import("@interactjs/pointer-events/PointerEvent").default; +declare function collectEventTargets({ interaction, pointer, event, eventTarget, type }: { + interaction: Interaction; + pointer: Interact.PointerType | PointerEvent; + event: Interact.PointerEventType | PointerEvent; + eventTarget: Interact.EventTarget; + type: T; +}, scope: Interact.Scope): { + node: Node; + eventable: Eventable; + props: { + [key: string]: any; + }; +}[]; +declare function addInteractionProps({ interaction }: { + interaction: any; +}): void; +declare function addHoldInfo({ down, pointerInfo }: Interact.SignalArgs['interactions:update-pointer']): void; +declare function moveAndClearHold({ interaction, pointer, event, eventTarget, duplicate }: Interact.SignalArgs['interactions:move'], scope: Interact.Scope): void; +declare function install(scope: Scope): void; +export default pointerEvents; diff --git a/@interactjs/pointer-events/base.js b/@interactjs/pointer-events/base.js new file mode 100644 index 000000000..63a5c2069 --- /dev/null +++ b/@interactjs/pointer-events/base.js @@ -0,0 +1,283 @@ +import Interaction from "../core/Interaction.js"; +import { Scope } from "../core/scope.js"; +import * as utils from "../utils/index.js"; +import PointerEvent from "./PointerEvent.js"; +const defaults = { + holdDuration: 600, + ignoreFrom: null, + allowFrom: null, + origin: { + x: 0, + y: 0 + } +}; +const pointerEvents = { + id: 'pointer-events/base', + install, + listeners: { + 'interactions:new': addInteractionProps, + 'interactions:update-pointer': addHoldInfo, + 'interactions:move': moveAndClearHold, + 'interactions:down': (arg, scope) => { + downAndStartHold(arg, scope); + fire(arg, scope); + }, + 'interactions:up': (arg, scope) => { + clearHold(arg); + fire(arg, scope); + tapAfterUp(arg, scope); + }, + 'interactions:cancel': (arg, scope) => { + clearHold(arg); + fire(arg, scope); + } + }, + PointerEvent, + fire, + collectEventTargets, + defaults, + types: { + down: true, + move: true, + up: true, + cancel: true, + tap: true, + doubletap: true, + hold: true + } +}; + +function fire(arg, scope) { + const { + interaction, + pointer, + event, + eventTarget, + type, + targets = collectEventTargets(arg, scope) + } = arg; + const pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction, scope.now()); + scope.fire('pointerEvents:new', { + pointerEvent + }); + const signalArg = { + interaction, + pointer, + event, + eventTarget, + targets, + type, + pointerEvent + }; + + for (let i = 0; i < targets.length; i++) { + const target = targets[i]; + + for (const prop in target.props || {}) { + pointerEvent[prop] = target.props[prop]; + } + + const origin = utils.getOriginXY(target.eventable, target.node); + + pointerEvent._subtractOrigin(origin); + + pointerEvent.eventable = target.eventable; + pointerEvent.currentTarget = target.node; + target.eventable.fire(pointerEvent); + + pointerEvent._addOrigin(origin); + + if (pointerEvent.immediatePropagationStopped || pointerEvent.propagationStopped && i + 1 < targets.length && targets[i + 1].node !== pointerEvent.currentTarget) { + break; + } + } + + scope.fire('pointerEvents:fired', signalArg); + + if (type === 'tap') { + // if pointerEvent should make a double tap, create and fire a doubletap + // PointerEvent and use that as the prevTap + const prevTap = pointerEvent.double ? fire({ + interaction, + pointer, + event, + eventTarget, + type: 'doubletap' + }, scope) : pointerEvent; + interaction.prevTap = prevTap; + interaction.tapTime = prevTap.timeStamp; + } + + return pointerEvent; +} + +function collectEventTargets({ + interaction, + pointer, + event, + eventTarget, + type +}, scope) { + const pointerIndex = interaction.getPointerIndex(pointer); + const pointerInfo = interaction.pointers[pointerIndex]; // do not fire a tap event if the pointer was moved before being lifted + + if (type === 'tap' && (interaction.pointerWasMoved || // or if the pointerup target is different to the pointerdown target + !(pointerInfo && pointerInfo.downTarget === eventTarget))) { + return []; + } + + const path = utils.dom.getPath(eventTarget); + const signalArg = { + interaction, + pointer, + event, + eventTarget, + type, + path, + targets: [], + node: null + }; + + for (const node of path) { + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (type === 'hold') { + signalArg.targets = signalArg.targets.filter(target => target.eventable.options.holdDuration === interaction.pointers[pointerIndex].hold.duration); + } + + return signalArg.targets; +} + +function addInteractionProps({ + interaction +}) { + interaction.prevTap = null; // the most recent tap event on this interaction + + interaction.tapTime = 0; // time of the most recent tap event +} + +function addHoldInfo({ + down, + pointerInfo +}) { + if (!down && pointerInfo.hold) { + return; + } + + pointerInfo.hold = { + duration: Infinity, + timeout: null + }; +} + +function clearHold({ + interaction, + pointerIndex +}) { + if (interaction.pointers[pointerIndex].hold) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } +} + +function moveAndClearHold({ + interaction, + pointer, + event, + eventTarget, + duplicate +}, scope) { + const pointerIndex = interaction.getPointerIndex(pointer); + + if (!duplicate && (!interaction.pointerIsDown || interaction.pointerWasMoved)) { + if (interaction.pointerIsDown) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } + + fire({ + interaction, + pointer, + event, + eventTarget: eventTarget, + type: 'move' + }, scope); + } +} + +function downAndStartHold({ + interaction, + pointer, + event, + eventTarget, + pointerIndex +}, scope) { + const timer = interaction.pointers[pointerIndex].hold; + const path = utils.dom.getPath(eventTarget); + const signalArg = { + interaction, + pointer, + event, + eventTarget, + type: 'hold', + targets: [], + path, + node: null + }; + + for (const node of path) { + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (!signalArg.targets.length) { + return; + } + + let minDuration = Infinity; + + for (const target of signalArg.targets) { + const holdDuration = target.eventable.options.holdDuration; + + if (holdDuration < minDuration) { + minDuration = holdDuration; + } + } + + timer.duration = minDuration; + timer.timeout = setTimeout(() => { + fire({ + interaction, + eventTarget, + pointer, + event, + type: 'hold' + }, scope); + }, minDuration); +} + +function tapAfterUp({ + interaction, + pointer, + event, + eventTarget +}, scope) { + if (!interaction.pointerWasMoved) { + fire({ + interaction, + eventTarget, + pointer, + event, + type: 'tap' + }, scope); + } +} + +function install(scope) { + scope.pointerEvents = pointerEvents; + scope.defaults.actions.pointerEvents = pointerEvents.defaults; + utils.extend(scope.actions.phaselessTypes, pointerEvents.types); +} + +export default pointerEvents; +//# sourceMappingURL=base.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/base.js.map b/@interactjs/pointer-events/base.js.map new file mode 100644 index 000000000..7e528ee83 --- /dev/null +++ b/@interactjs/pointer-events/base.js.map @@ -0,0 +1,94 @@ +{ + "version": 3, + "sources": [ + "base.ts" + ], + "names": [ + "Interaction", + "Scope", + "utils", + "PointerEvent", + "defaults", + "holdDuration", + "ignoreFrom", + "allowFrom", + "origin", + "x", + "y", + "pointerEvents", + "id", + "install", + "listeners", + "addInteractionProps", + "addHoldInfo", + "moveAndClearHold", + "arg", + "scope", + "downAndStartHold", + "fire", + "clearHold", + "tapAfterUp", + "collectEventTargets", + "types", + "down", + "move", + "up", + "cancel", + "tap", + "doubletap", + "hold", + "interaction", + "pointer", + "event", + "eventTarget", + "type", + "targets", + "pointerEvent", + "now", + "signalArg", + "i", + "length", + "target", + "prop", + "props", + "getOriginXY", + "eventable", + "node", + "_subtractOrigin", + "currentTarget", + "_addOrigin", + "immediatePropagationStopped", + "propagationStopped", + "prevTap", + "double", + "tapTime", + "timeStamp", + "pointerIndex", + "getPointerIndex", + "pointerInfo", + "pointers", + "pointerWasMoved", + "downTarget", + "path", + "dom", + "getPath", + "filter", + "options", + "duration", + "Infinity", + "timeout", + "clearTimeout", + "duplicate", + "pointerIsDown", + "timer", + "minDuration", + "setTimeout", + "actions", + "extend", + "phaselessTypes" + ], + "mappings": "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", + "sourcesContent": [ + "import { PerActionDefaults } from '@interactjs/core/defaultOptions'\nimport Eventable from '@interactjs/core/Eventable'\nimport Interaction from '@interactjs/core/Interaction'\nimport { Scope } from '@interactjs/core/scope'\nimport * as utils from '@interactjs/utils/index'\nimport PointerEvent from './PointerEvent'\n\nexport type EventTargetList = Array<{\n node: Node\n eventable: Eventable\n props: { [key: string]: any }\n}>\n\nexport interface PointerEventOptions extends PerActionDefaults {\n enabled?: undefined // not used\n holdDuration?: number\n ignoreFrom?: any\n allowFrom?: any\n origin?: Interact.Point | string | Interact.Element\n}\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n pointerEvents: typeof pointerEvents\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n prevTap?: PointerEvent\n tapTime?: number\n }\n}\n\ndeclare module '@interactjs/core/PointerInfo' {\n interface PointerInfo {\n hold?: {\n duration: number\n timeout: any\n }\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface ActionDefaults {\n pointerEvents: Interact.Options\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'pointerEvents:new': { pointerEvent: PointerEvent }\n 'pointerEvents:fired': {\n interaction: Interaction\n pointer: Interact.PointerType | PointerEvent\n event: Interact.PointerEventType | PointerEvent\n eventTarget: Interact.EventTarget\n pointerEvent: PointerEvent\n targets?: EventTargetList\n type: string\n }\n 'pointerEvents:collect-targets': {\n interaction: Interaction\n pointer: Interact.PointerType | PointerEvent\n event: Interact.PointerEventType | PointerEvent\n eventTarget: Interact.EventTarget\n targets?: EventTargetList\n type: string\n path: Node[]\n node: null\n }\n }\n}\n\nconst defaults: PointerEventOptions = {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n}\n\nconst pointerEvents = {\n id: 'pointer-events/base',\n install,\n listeners: {\n 'interactions:new': addInteractionProps,\n 'interactions:update-pointer': addHoldInfo,\n 'interactions:move': moveAndClearHold,\n 'interactions:down': (arg, scope) => {\n downAndStartHold(arg, scope)\n fire(arg, scope)\n },\n 'interactions:up': (arg, scope) => {\n clearHold(arg)\n fire(arg, scope)\n tapAfterUp(arg, scope)\n },\n 'interactions:cancel': (arg, scope) => {\n clearHold(arg)\n fire(arg, scope)\n },\n },\n PointerEvent,\n fire,\n collectEventTargets,\n defaults,\n types: {\n down: true,\n move: true,\n up: true,\n cancel: true,\n tap: true,\n doubletap: true,\n hold: true,\n } as { [type: string]: true },\n}\n\nfunction fire (\n arg: {\n pointer: Interact.PointerType | PointerEvent\n event: Interact.PointerEventType | PointerEvent\n eventTarget: Interact.EventTarget\n interaction: Interaction\n type: T\n targets?: EventTargetList\n },\n scope: Interact.Scope,\n) {\n const {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n targets = collectEventTargets(arg, scope),\n } = arg\n\n const pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction, scope.now())\n\n scope.fire('pointerEvents:new', { pointerEvent })\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n }\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i]\n\n for (const prop in target.props || {}) {\n (pointerEvent as any)[prop] = target.props[prop]\n }\n\n const origin = utils.getOriginXY(target.eventable, target.node)\n\n pointerEvent._subtractOrigin(origin)\n pointerEvent.eventable = target.eventable\n pointerEvent.currentTarget = target.node\n\n target.eventable.fire(pointerEvent)\n\n pointerEvent._addOrigin(origin)\n\n if (pointerEvent.immediatePropagationStopped ||\n (pointerEvent.propagationStopped &&\n (i + 1) < targets.length && targets[i + 1].node !== pointerEvent.currentTarget)) {\n break\n }\n }\n\n scope.fire('pointerEvents:fired', signalArg)\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'doubletap',\n }, scope)\n : pointerEvent\n\n interaction.prevTap = prevTap\n interaction.tapTime = prevTap.timeStamp\n }\n\n return pointerEvent\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }: {\n interaction: Interaction\n pointer: Interact.PointerType | PointerEvent\n event: Interact.PointerEventType | PointerEvent\n eventTarget: Interact.EventTarget\n type: T\n}, scope: Interact.Scope) {\n const pointerIndex = interaction.getPointerIndex(pointer)\n const pointerInfo = interaction.pointers[pointerIndex]\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved ||\n // or if the pointerup target is different to the pointerdown target\n !(pointerInfo && pointerInfo.downTarget === eventTarget))) {\n return []\n }\n\n const path = utils.dom.getPath(eventTarget as Interact.Element | Document)\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [] as EventTargetList,\n node: null,\n }\n\n for (const node of path) {\n signalArg.node = node\n\n scope.fire('pointerEvents:collect-targets', signalArg)\n }\n\n if (type === 'hold') {\n signalArg.targets = signalArg.targets.filter(target =>\n target.eventable.options.holdDuration === interaction.pointers[pointerIndex].hold.duration)\n }\n\n return signalArg.targets\n}\n\nfunction addInteractionProps ({ interaction }) {\n interaction.prevTap = null // the most recent tap event on this interaction\n interaction.tapTime = 0 // time of the most recent tap event\n}\n\nfunction addHoldInfo ({ down, pointerInfo }: Interact.SignalArgs['interactions:update-pointer']) {\n if (!down && pointerInfo.hold) {\n return\n }\n\n pointerInfo.hold = { duration: Infinity, timeout: null }\n}\n\nfunction clearHold ({ interaction, pointerIndex }) {\n if (interaction.pointers[pointerIndex].hold) {\n clearTimeout(interaction.pointers[pointerIndex].hold.timeout)\n }\n}\n\nfunction moveAndClearHold (\n { interaction, pointer, event, eventTarget, duplicate }: Interact.SignalArgs['interactions:move'],\n scope: Interact.Scope,\n) {\n const pointerIndex = interaction.getPointerIndex(pointer)\n\n if (!duplicate && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.pointers[pointerIndex].hold.timeout)\n }\n\n fire({\n interaction,\n pointer,\n event,\n eventTarget: eventTarget as Interact.Element,\n type: 'move',\n }, scope)\n }\n}\n\nfunction downAndStartHold ({ interaction, pointer, event, eventTarget, pointerIndex }: Interact.SignalArgs['interactions:down'], scope: Interact.Scope) {\n const timer = interaction.pointers[pointerIndex].hold\n const path = utils.dom.getPath(eventTarget as Interact.Element | Document)\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [] as EventTargetList,\n path,\n node: null,\n }\n\n for (const node of path) {\n signalArg.node = node\n\n scope.fire('pointerEvents:collect-targets', signalArg)\n }\n\n if (!signalArg.targets.length) { return }\n\n let minDuration = Infinity\n\n for (const target of signalArg.targets) {\n const holdDuration = target.eventable.options.holdDuration\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration\n }\n }\n\n timer.duration = minDuration\n timer.timeout = setTimeout(() => {\n fire({\n interaction,\n eventTarget,\n pointer,\n event,\n type: 'hold',\n }, scope)\n }, minDuration)\n}\n\nfunction tapAfterUp ({ interaction, pointer, event, eventTarget }: Interact.SignalArgs['interactions:up'], scope: Interact.Scope) {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' }, scope)\n }\n}\n\nfunction install (scope: Scope) {\n scope.pointerEvents = pointerEvents\n scope.defaults.actions.pointerEvents = pointerEvents.defaults\n utils.extend(scope.actions.phaselessTypes, pointerEvents.types)\n}\n\nexport default pointerEvents\n" + ] +} \ No newline at end of file diff --git a/@interactjs/pointer-events/base.min.js b/@interactjs/pointer-events/base.min.js new file mode 100644 index 000000000..62bfd2d23 --- /dev/null +++ b/@interactjs/pointer-events/base.min.js @@ -0,0 +1,2 @@ +import t from"../core/Interaction.min.js";import{Scope as e}from"../core/scope.min.js";import*as n from"../utils/index.min.js";import o from"./PointerEvent.min.js";const r={id:"pointer-events/base",install(t){t.pointerEvents=r,t.defaults.actions.pointerEvents=r.defaults,n.extend(t.actions.phaselessTypes,r.types)},listeners:{"interactions:new"({interaction:t}){t.prevTap=null,t.tapTime=0},"interactions:update-pointer"({down:t,pointerInfo:e}){!t&&e.hold||(e.hold={duration:1/0,timeout:null})},"interactions:move"({interaction:t,pointer:e,event:n,eventTarget:o,duplicate:r},a){const p=t.getPointerIndex(e);r||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.pointers[p].hold.timeout),i({interaction:t,pointer:e,event:n,eventTarget:o,type:"move"},a))},"interactions:down"(t,e){!function({interaction:t,pointer:e,event:o,eventTarget:r,pointerIndex:a},p){const s=t.pointers[a].hold,l=n.dom.getPath(r),c={interaction:t,pointer:e,event:o,eventTarget:r,type:"hold",targets:[],path:l,node:null};for(const t of l)c.node=t,p.fire("pointerEvents:collect-targets",c);if(!c.targets.length)return;let d=1/0;for(const t of c.targets){const e=t.eventable.options.holdDuration;e{i({interaction:t,eventTarget:r,pointer:e,event:o,type:"hold"},p)},d)}(t,e),i(t,e)},"interactions:up"(t,e){p(t),i(t,e),function({interaction:t,pointer:e,event:n,eventTarget:o},r){t.pointerWasMoved||i({interaction:t,eventTarget:o,pointer:e,event:n,type:"tap"},r)}(t,e)},"interactions:cancel"(t,e){p(t),i(t,e)}},PointerEvent:o,fire:i,collectEventTargets:a,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:{down:!0,move:!0,up:!0,cancel:!0,tap:!0,doubletap:!0,hold:!0}};function i(t,e){const{interaction:r,pointer:p,event:s,eventTarget:l,type:c,targets:d=a(t,e)}=t,v=new o(c,p,s,l,r,e.now());e.fire("pointerEvents:new",{pointerEvent:v});const u={interaction:r,pointer:p,event:s,eventTarget:l,targets:d,type:c,pointerEvent:v};for(let t=0;te.eventable.options.holdDuration===t.pointers[p].hold.duration)),c.targets}function p({interaction:t,pointerIndex:e}){t.pointers[e].hold&&clearTimeout(t.pointers[e].hold.timeout)}export default r; +//# sourceMappingURL=base.min.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/base.min.js.map b/@interactjs/pointer-events/base.min.js.map new file mode 100644 index 000000000..be70b3a20 --- /dev/null +++ b/@interactjs/pointer-events/base.min.js.map @@ -0,0 +1,92 @@ +{ + "version": 3, + "sources": [ + "base.ts" + ], + "names": [ + "Interaction", + "Scope", + "utils", + "PointerEvent", + "pointerEvents", + "id", + "install", + "scope", + "defaults", + "actions", + "extend", + "phaselessTypes", + "types", + "listeners", + "[object Object]", + "interaction", + "prevTap", + "tapTime", + "down", + "pointerInfo", + "hold", + "duration", + "Infinity", + "timeout", + "pointer", + "event", + "eventTarget", + "duplicate", + "pointerIndex", + "getPointerIndex", + "pointerIsDown", + "pointerWasMoved", + "clearTimeout", + "pointers", + "fire", + "type", + "arg", + "timer", + "path", + "dom", + "getPath", + "signalArg", + "targets", + "node", + "length", + "minDuration", + "target", + "holdDuration", + "eventable", + "options", + "setTimeout", + "downAndStartHold", + "clearHold", + "tapAfterUp", + "collectEventTargets", + "ignoreFrom", + "allowFrom", + "origin", + "x", + "y", + "move", + "up", + "cancel", + "tap", + "doubletap", + "pointerEvent", + "now", + "i", + "prop", + "props", + "getOriginXY", + "_subtractOrigin", + "currentTarget", + "_addOrigin", + "immediatePropagationStopped", + "propagationStopped", + "double", + "timeStamp", + "downTarget", + "filter" + ], + "mappings": "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", + "sourcesContent": [ + "import { PerActionDefaults } from '@interactjs/core/defaultOptions'\nimport Eventable from '@interactjs/core/Eventable'\nimport Interaction from '@interactjs/core/Interaction'\nimport { Scope } from '@interactjs/core/scope'\nimport * as utils from '@interactjs/utils/index'\nimport PointerEvent from './PointerEvent'\n\nexport type EventTargetList = Array<{\n node: Node\n eventable: Eventable\n props: { [key: string]: any }\n}>\n\nexport interface PointerEventOptions extends PerActionDefaults {\n enabled?: undefined // not used\n holdDuration?: number\n ignoreFrom?: any\n allowFrom?: any\n origin?: Interact.Point | string | Interact.Element\n}\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n pointerEvents: typeof pointerEvents\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n prevTap?: PointerEvent\n tapTime?: number\n }\n}\n\ndeclare module '@interactjs/core/PointerInfo' {\n interface PointerInfo {\n hold?: {\n duration: number\n timeout: any\n }\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\n interface ActionDefaults {\n pointerEvents: Interact.Options\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'pointerEvents:new': { pointerEvent: PointerEvent }\n 'pointerEvents:fired': {\n interaction: Interaction\n pointer: Interact.PointerType | PointerEvent\n event: Interact.PointerEventType | PointerEvent\n eventTarget: Interact.EventTarget\n pointerEvent: PointerEvent\n targets?: EventTargetList\n type: string\n }\n 'pointerEvents:collect-targets': {\n interaction: Interaction\n pointer: Interact.PointerType | PointerEvent\n event: Interact.PointerEventType | PointerEvent\n eventTarget: Interact.EventTarget\n targets?: EventTargetList\n type: string\n path: Node[]\n node: null\n }\n }\n}\n\nconst defaults: PointerEventOptions = {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n}\n\nconst pointerEvents = {\n id: 'pointer-events/base',\n install,\n listeners: {\n 'interactions:new': addInteractionProps,\n 'interactions:update-pointer': addHoldInfo,\n 'interactions:move': moveAndClearHold,\n 'interactions:down': (arg, scope) => {\n downAndStartHold(arg, scope)\n fire(arg, scope)\n },\n 'interactions:up': (arg, scope) => {\n clearHold(arg)\n fire(arg, scope)\n tapAfterUp(arg, scope)\n },\n 'interactions:cancel': (arg, scope) => {\n clearHold(arg)\n fire(arg, scope)\n },\n },\n PointerEvent,\n fire,\n collectEventTargets,\n defaults,\n types: {\n down: true,\n move: true,\n up: true,\n cancel: true,\n tap: true,\n doubletap: true,\n hold: true,\n } as { [type: string]: true },\n}\n\nfunction fire (\n arg: {\n pointer: Interact.PointerType | PointerEvent\n event: Interact.PointerEventType | PointerEvent\n eventTarget: Interact.EventTarget\n interaction: Interaction\n type: T\n targets?: EventTargetList\n },\n scope: Interact.Scope,\n) {\n const {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n targets = collectEventTargets(arg, scope),\n } = arg\n\n const pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction, scope.now())\n\n scope.fire('pointerEvents:new', { pointerEvent })\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n }\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i]\n\n for (const prop in target.props || {}) {\n (pointerEvent as any)[prop] = target.props[prop]\n }\n\n const origin = utils.getOriginXY(target.eventable, target.node)\n\n pointerEvent._subtractOrigin(origin)\n pointerEvent.eventable = target.eventable\n pointerEvent.currentTarget = target.node\n\n target.eventable.fire(pointerEvent)\n\n pointerEvent._addOrigin(origin)\n\n if (pointerEvent.immediatePropagationStopped ||\n (pointerEvent.propagationStopped &&\n (i + 1) < targets.length && targets[i + 1].node !== pointerEvent.currentTarget)) {\n break\n }\n }\n\n scope.fire('pointerEvents:fired', signalArg)\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'doubletap',\n }, scope)\n : pointerEvent\n\n interaction.prevTap = prevTap\n interaction.tapTime = prevTap.timeStamp\n }\n\n return pointerEvent\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }: {\n interaction: Interaction\n pointer: Interact.PointerType | PointerEvent\n event: Interact.PointerEventType | PointerEvent\n eventTarget: Interact.EventTarget\n type: T\n}, scope: Interact.Scope) {\n const pointerIndex = interaction.getPointerIndex(pointer)\n const pointerInfo = interaction.pointers[pointerIndex]\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved ||\n // or if the pointerup target is different to the pointerdown target\n !(pointerInfo && pointerInfo.downTarget === eventTarget))) {\n return []\n }\n\n const path = utils.dom.getPath(eventTarget as Interact.Element | Document)\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [] as EventTargetList,\n node: null,\n }\n\n for (const node of path) {\n signalArg.node = node\n\n scope.fire('pointerEvents:collect-targets', signalArg)\n }\n\n if (type === 'hold') {\n signalArg.targets = signalArg.targets.filter(target =>\n target.eventable.options.holdDuration === interaction.pointers[pointerIndex].hold.duration)\n }\n\n return signalArg.targets\n}\n\nfunction addInteractionProps ({ interaction }) {\n interaction.prevTap = null // the most recent tap event on this interaction\n interaction.tapTime = 0 // time of the most recent tap event\n}\n\nfunction addHoldInfo ({ down, pointerInfo }: Interact.SignalArgs['interactions:update-pointer']) {\n if (!down && pointerInfo.hold) {\n return\n }\n\n pointerInfo.hold = { duration: Infinity, timeout: null }\n}\n\nfunction clearHold ({ interaction, pointerIndex }) {\n if (interaction.pointers[pointerIndex].hold) {\n clearTimeout(interaction.pointers[pointerIndex].hold.timeout)\n }\n}\n\nfunction moveAndClearHold (\n { interaction, pointer, event, eventTarget, duplicate }: Interact.SignalArgs['interactions:move'],\n scope: Interact.Scope,\n) {\n const pointerIndex = interaction.getPointerIndex(pointer)\n\n if (!duplicate && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.pointers[pointerIndex].hold.timeout)\n }\n\n fire({\n interaction,\n pointer,\n event,\n eventTarget: eventTarget as Interact.Element,\n type: 'move',\n }, scope)\n }\n}\n\nfunction downAndStartHold ({ interaction, pointer, event, eventTarget, pointerIndex }: Interact.SignalArgs['interactions:down'], scope: Interact.Scope) {\n const timer = interaction.pointers[pointerIndex].hold\n const path = utils.dom.getPath(eventTarget as Interact.Element | Document)\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [] as EventTargetList,\n path,\n node: null,\n }\n\n for (const node of path) {\n signalArg.node = node\n\n scope.fire('pointerEvents:collect-targets', signalArg)\n }\n\n if (!signalArg.targets.length) { return }\n\n let minDuration = Infinity\n\n for (const target of signalArg.targets) {\n const holdDuration = target.eventable.options.holdDuration\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration\n }\n }\n\n timer.duration = minDuration\n timer.timeout = setTimeout(() => {\n fire({\n interaction,\n eventTarget,\n pointer,\n event,\n type: 'hold',\n }, scope)\n }, minDuration)\n}\n\nfunction tapAfterUp ({ interaction, pointer, event, eventTarget }: Interact.SignalArgs['interactions:up'], scope: Interact.Scope) {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' }, scope)\n }\n}\n\nfunction install (scope: Scope) {\n scope.pointerEvents = pointerEvents\n scope.defaults.actions.pointerEvents = pointerEvents.defaults\n utils.extend(scope.actions.phaselessTypes, pointerEvents.types)\n}\n\nexport default pointerEvents\n" + ] +} \ No newline at end of file diff --git a/@interactjs/pointer-events/base.spec.d.ts b/@interactjs/pointer-events/base.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/pointer-events/base.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/pointer-events/holdRepeat.d.ts b/@interactjs/pointer-events/holdRepeat.d.ts new file mode 100644 index 000000000..ad23fb83e --- /dev/null +++ b/@interactjs/pointer-events/holdRepeat.d.ts @@ -0,0 +1,17 @@ +declare module '@interactjs/core/Interaction' { + interface Interaction { + holdIntervalHandle?: any; + } +} +declare module '@interactjs/pointer-events/PointerEvent' { + interface PointerEvent { + count?: number; + } +} +declare module '@interactjs/pointer-events/base' { + interface PointerEventOptions { + holdRepeatInterval?: number; + } +} +declare const holdRepeat: Interact.Plugin; +export default holdRepeat; diff --git a/@interactjs/pointer-events/holdRepeat.js b/@interactjs/pointer-events/holdRepeat.js new file mode 100644 index 000000000..8483ed105 --- /dev/null +++ b/@interactjs/pointer-events/holdRepeat.js @@ -0,0 +1,76 @@ +import basePlugin from "./base.js"; +import PointerEvent from "./PointerEvent.js"; + +function install(scope) { + scope.usePlugin(basePlugin); + const { + pointerEvents + } = scope; // don't repeat by default + + pointerEvents.defaults.holdRepeatInterval = 0; + pointerEvents.types.holdrepeat = scope.actions.phaselessTypes.holdrepeat = true; +} + +function onNew({ + pointerEvent +}) { + if (pointerEvent.type !== 'hold') { + return; + } + + pointerEvent.count = (pointerEvent.count || 0) + 1; +} + +function onFired({ + interaction, + pointerEvent, + eventTarget, + targets +}, scope) { + if (pointerEvent.type !== 'hold' || !targets.length) { + return; + } // get the repeat interval from the first eventable + + + const interval = targets[0].eventable.options.holdRepeatInterval; // don't repeat if the interval is 0 or less + + if (interval <= 0) { + return; + } // set a timeout to fire the holdrepeat event + + + interaction.holdIntervalHandle = setTimeout(() => { + scope.pointerEvents.fire({ + interaction, + eventTarget, + type: 'hold', + pointer: pointerEvent, + event: pointerEvent + }, scope); + }, interval); +} + +function endHoldRepeat({ + interaction +}) { + // set the interaction's holdStopTime property + // to stop further holdRepeat events + if (interaction.holdIntervalHandle) { + clearInterval(interaction.holdIntervalHandle); + interaction.holdIntervalHandle = null; + } +} + +const holdRepeat = { + id: 'pointer-events/holdRepeat', + install, + listeners: ['move', 'up', 'cancel', 'endall'].reduce((acc, enderTypes) => { + acc[`pointerEvents:${enderTypes}`] = endHoldRepeat; + return acc; + }, { + 'pointerEvents:new': onNew, + 'pointerEvents:fired': onFired + }) +}; +export default holdRepeat; +//# sourceMappingURL=holdRepeat.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/holdRepeat.js.map b/@interactjs/pointer-events/holdRepeat.js.map new file mode 100644 index 000000000..f67e05d4b --- /dev/null +++ b/@interactjs/pointer-events/holdRepeat.js.map @@ -0,0 +1,49 @@ +{ + "version": 3, + "sources": [ + "holdRepeat.ts" + ], + "names": [ + "basePlugin", + "PointerEvent", + "install", + "scope", + "usePlugin", + "pointerEvents", + "defaults", + "holdRepeatInterval", + "types", + "holdrepeat", + "actions", + "phaselessTypes", + "onNew", + "pointerEvent", + "type", + "count", + "onFired", + "interaction", + "eventTarget", + "targets", + "length", + "interval", + "eventable", + "options", + "holdIntervalHandle", + "setTimeout", + "fire", + "pointer", + "event", + "endHoldRepeat", + "clearInterval", + "holdRepeat", + "id", + "listeners", + "reduce", + "acc", + "enderTypes" + ], + "mappings": "AACA,OAAOA,UAAP,MAAuB,WAAvB;AACA,OAAOC,YAAP,MAAyB,mBAAzB;;AAoBA,SAASC,OAAT,CAAkBC,KAAlB,EAAyC;AACvCA,EAAAA,KAAK,CAACC,SAAN,CAAgBJ,UAAhB;AAEA,QAAM;AACJK,IAAAA;AADI,MAEFF,KAFJ,CAHuC,CAOvC;;AACAE,EAAAA,aAAa,CAACC,QAAd,CAAuBC,kBAAvB,GAA4C,CAA5C;AACAF,EAAAA,aAAa,CAACG,KAAd,CAAoBC,UAApB,GAAiCN,KAAK,CAACO,OAAN,CAAcC,cAAd,CAA6BF,UAA7B,GAA0C,IAA3E;AACD;;AAED,SAASG,KAAT,CAAgB;AAAEC,EAAAA;AAAF,CAAhB,EAAuE;AACrE,MAAIA,YAAY,CAACC,IAAb,KAAsB,MAA1B,EAAkC;AAAE;AAAQ;;AAE5CD,EAAAA,YAAY,CAACE,KAAb,GAAqB,CAACF,YAAY,CAACE,KAAb,IAAsB,CAAvB,IAA4B,CAAjD;AACD;;AAED,SAASC,OAAT,CACE;AAAEC,EAAAA,WAAF;AAAeJ,EAAAA,YAAf;AAA6BK,EAAAA,WAA7B;AAA0CC,EAAAA;AAA1C,CADF,EAEEhB,KAFF,EAGE;AACA,MAAIU,YAAY,CAACC,IAAb,KAAsB,MAAtB,IAAgC,CAACK,OAAO,CAACC,MAA7C,EAAqD;AAAE;AAAQ,GAD/D,CAGA;;;AACA,QAAMC,QAAQ,GAAGF,OAAO,CAAC,CAAD,CAAP,CAAWG,SAAX,CAAqBC,OAArB,CAA6BhB,kBAA9C,CAJA,CAMA;;AACA,MAAIc,QAAQ,IAAI,CAAhB,EAAmB;AAAE;AAAQ,GAP7B,CASA;;;AACAJ,EAAAA,WAAW,CAACO,kBAAZ,GAAiCC,UAAU,CAAC,MAAM;AAChDtB,IAAAA,KAAK,CAACE,aAAN,CAAoBqB,IAApB,CAAyB;AACvBT,MAAAA,WADuB;AAEvBC,MAAAA,WAFuB;AAGvBJ,MAAAA,IAAI,EAAE,MAHiB;AAIvBa,MAAAA,OAAO,EAAEd,YAJc;AAKvBe,MAAAA,KAAK,EAAEf;AALgB,KAAzB,EAMGV,KANH;AAOD,GAR0C,EAQxCkB,QARwC,CAA3C;AASD;;AAED,SAASQ,aAAT,CAAwB;AAAEZ,EAAAA;AAAF,CAAxB,EAAgF;AAC9E;AACA;AACA,MAAIA,WAAW,CAACO,kBAAhB,EAAoC;AAClCM,IAAAA,aAAa,CAACb,WAAW,CAACO,kBAAb,CAAb;AACAP,IAAAA,WAAW,CAACO,kBAAZ,GAAiC,IAAjC;AACD;AACF;;AAED,MAAMO,UAA2B,GAAG;AAClCC,EAAAA,EAAE,EAAE,2BAD8B;AAElC9B,EAAAA,OAFkC;AAGlC+B,EAAAA,SAAS,EAAE,CAAC,MAAD,EAAS,IAAT,EAAe,QAAf,EAAyB,QAAzB,EAAmCC,MAAnC,CACT,CAACC,GAAD,EAAMC,UAAN,KAAqB;AAClBD,IAAAA,GAAD,CAAc,iBAAgBC,UAAW,EAAzC,IAA8CP,aAA9C;AACA,WAAOM,GAAP;AACD,GAJQ,EAKT;AACE,yBAAqBvB,KADvB;AAEE,2BAAuBI;AAFzB,GALS;AAHuB,CAApC;AAeA,eAAee,UAAf", + "sourcesContent": [ + "import { ListenerMap } from '@interactjs/core/scope'\nimport basePlugin from './base'\nimport PointerEvent from './PointerEvent'\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n holdIntervalHandle?: any\n }\n}\n\ndeclare module '@interactjs/pointer-events/PointerEvent' {\n interface PointerEvent {\n count?: number\n }\n}\n\ndeclare module '@interactjs/pointer-events/base' {\n interface PointerEventOptions {\n holdRepeatInterval?: number\n }\n}\n\nfunction install (scope: Interact.Scope) {\n scope.usePlugin(basePlugin)\n\n const {\n pointerEvents,\n } = scope\n\n // don't repeat by default\n pointerEvents.defaults.holdRepeatInterval = 0\n pointerEvents.types.holdrepeat = scope.actions.phaselessTypes.holdrepeat = true\n}\n\nfunction onNew ({ pointerEvent }: { pointerEvent: PointerEvent }) {\n if (pointerEvent.type !== 'hold') { return }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1\n}\n\nfunction onFired (\n { interaction, pointerEvent, eventTarget, targets }: Interact.SignalArgs['pointerEvents:fired'],\n scope: Interact.Scope,\n) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(() => {\n scope.pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n }, scope)\n }, interval)\n}\n\nfunction endHoldRepeat ({ interaction }: { interaction: Interact.Interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle)\n interaction.holdIntervalHandle = null\n }\n}\n\nconst holdRepeat: Interact.Plugin = {\n id: 'pointer-events/holdRepeat',\n install,\n listeners: ['move', 'up', 'cancel', 'endall'].reduce(\n (acc, enderTypes) => {\n (acc as any)[`pointerEvents:${enderTypes}`] = endHoldRepeat\n return acc\n },\n {\n 'pointerEvents:new': onNew,\n 'pointerEvents:fired': onFired,\n } as ListenerMap,\n ),\n}\n\nexport default holdRepeat\n" + ] +} \ No newline at end of file diff --git a/@interactjs/pointer-events/holdRepeat.min.js b/@interactjs/pointer-events/holdRepeat.min.js new file mode 100644 index 000000000..a67cce51a --- /dev/null +++ b/@interactjs/pointer-events/holdRepeat.min.js @@ -0,0 +1,2 @@ +import e from"./base.min.js";import t from"./PointerEvent.min.js";function n({interaction:e}){e.holdIntervalHandle&&(clearInterval(e.holdIntervalHandle),e.holdIntervalHandle=null)}const o={id:"pointer-events/holdRepeat",install(t){t.usePlugin(e);const{pointerEvents:n}=t;n.defaults.holdRepeatInterval=0,n.types.holdrepeat=t.actions.phaselessTypes.holdrepeat=!0},listeners:["move","up","cancel","endall"].reduce((e,t)=>(e[`pointerEvents:${t}`]=n,e),{"pointerEvents:new"({pointerEvent:e}){"hold"===e.type&&(e.count=(e.count||0)+1)},"pointerEvents:fired"({interaction:e,pointerEvent:t,eventTarget:n,targets:o},l){if("hold"!==t.type||!o.length)return;const r=o[0].eventable.options.holdRepeatInterval;r<=0||(e.holdIntervalHandle=setTimeout(()=>{l.pointerEvents.fire({interaction:e,eventTarget:n,type:"hold",pointer:t,event:t},l)},r))}})};export default o; +//# sourceMappingURL=holdRepeat.min.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/holdRepeat.min.js.map b/@interactjs/pointer-events/holdRepeat.min.js.map new file mode 100644 index 000000000..9ab2d02b8 --- /dev/null +++ b/@interactjs/pointer-events/holdRepeat.min.js.map @@ -0,0 +1,48 @@ +{ + "version": 3, + "sources": [ + "holdRepeat.ts" + ], + "names": [ + "basePlugin", + "PointerEvent", + "endHoldRepeat", + "interaction", + "holdIntervalHandle", + "clearInterval", + "holdRepeat", + "id", + "install", + "scope", + "usePlugin", + "pointerEvents", + "defaults", + "holdRepeatInterval", + "types", + "holdrepeat", + "actions", + "phaselessTypes", + "listeners", + "reduce", + "acc", + "enderTypes", + "[object Object]", + "pointerEvent", + "type", + "count", + "eventTarget", + "targets", + "length", + "interval", + "eventable", + "options", + "setTimeout", + "fire", + "pointer", + "event" + ], + "mappings": "OACOA,MAAgB,uBAChBC,MAAkB,wBA8DzB,SAASC,GAAeC,YAAEA,IAGpBA,EAAYC,qBACdC,cAAcF,EAAYC,oBAC1BD,EAAYC,mBAAqB,MAIrC,MAAME,EAA8B,CAClCC,GAAI,4BACJC,QArDgBC,GAChBA,EAAMC,UAAUV,GAEhB,MAAMW,cACJA,GACEF,EAGJE,EAAcC,SAASC,mBAAqB,EAC5CF,EAAcG,MAAMC,WAAaN,EAAMO,QAAQC,eAAeF,YAAa,GA6C3EG,UAAW,CAAC,OAAQ,KAAM,SAAU,UAAUC,OAC5C,CAACC,EAAKC,KACHD,EAAa,iBAAgBC,KAAgBnB,EACvCkB,GAET,CACEE,qBAhDUC,aAAEA,IACU,SAAtBA,EAAaC,OAEjBD,EAAaE,OAASF,EAAaE,OAAS,GAAK,IA8C7CH,uBA1CJnB,YAAEA,EAAFoB,aAAeA,EAAfG,YAA6BA,EAA7BC,QAA0CA,GAC1ClB,GAEA,GAA0B,SAAtBc,EAAaC,OAAoBG,EAAQC,OAAU,OAGvD,MAAMC,EAAWF,EAAQ,GAAGG,UAAUC,QAAQlB,mBAG1CgB,GAAY,IAGhB1B,EAAYC,mBAAqB4B,WAAW,KAC1CvB,EAAME,cAAcsB,KAAK,CACvB9B,YAAAA,EACAuB,YAAAA,EACAF,KAAM,OACNU,QAASX,EACTY,MAAOZ,GACNd,IACFoB,uBA2BUvB", + "sourcesContent": [ + "import { ListenerMap } from '@interactjs/core/scope'\nimport basePlugin from './base'\nimport PointerEvent from './PointerEvent'\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n holdIntervalHandle?: any\n }\n}\n\ndeclare module '@interactjs/pointer-events/PointerEvent' {\n interface PointerEvent {\n count?: number\n }\n}\n\ndeclare module '@interactjs/pointer-events/base' {\n interface PointerEventOptions {\n holdRepeatInterval?: number\n }\n}\n\nfunction install (scope: Interact.Scope) {\n scope.usePlugin(basePlugin)\n\n const {\n pointerEvents,\n } = scope\n\n // don't repeat by default\n pointerEvents.defaults.holdRepeatInterval = 0\n pointerEvents.types.holdrepeat = scope.actions.phaselessTypes.holdrepeat = true\n}\n\nfunction onNew ({ pointerEvent }: { pointerEvent: PointerEvent }) {\n if (pointerEvent.type !== 'hold') { return }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1\n}\n\nfunction onFired (\n { interaction, pointerEvent, eventTarget, targets }: Interact.SignalArgs['pointerEvents:fired'],\n scope: Interact.Scope,\n) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(() => {\n scope.pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n }, scope)\n }, interval)\n}\n\nfunction endHoldRepeat ({ interaction }: { interaction: Interact.Interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle)\n interaction.holdIntervalHandle = null\n }\n}\n\nconst holdRepeat: Interact.Plugin = {\n id: 'pointer-events/holdRepeat',\n install,\n listeners: ['move', 'up', 'cancel', 'endall'].reduce(\n (acc, enderTypes) => {\n (acc as any)[`pointerEvents:${enderTypes}`] = endHoldRepeat\n return acc\n },\n {\n 'pointerEvents:new': onNew,\n 'pointerEvents:fired': onFired,\n } as ListenerMap,\n ),\n}\n\nexport default holdRepeat\n" + ] +} \ No newline at end of file diff --git a/@interactjs/pointer-events/holdRepeat.spec.d.ts b/@interactjs/pointer-events/holdRepeat.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/pointer-events/holdRepeat.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/pointer-events/index.d.ts b/@interactjs/pointer-events/index.d.ts new file mode 100644 index 000000000..dafe85213 --- /dev/null +++ b/@interactjs/pointer-events/index.d.ts @@ -0,0 +1,9 @@ +import * as pointerEvents from './base'; +import holdRepeat from './holdRepeat'; +import interactableTargets from './interactableTargets'; +declare const _default: { + id: string; + install(scope: import("@interactjs/core/scope").Scope): void; +}; +export default _default; +export { pointerEvents, holdRepeat, interactableTargets, }; diff --git a/@interactjs/pointer-events/index.js b/@interactjs/pointer-events/index.js new file mode 100644 index 000000000..756a7a41a --- /dev/null +++ b/@interactjs/pointer-events/index.js @@ -0,0 +1,15 @@ +import * as pointerEvents from "./base.js"; +import holdRepeat from "./holdRepeat.js"; +import interactableTargets from "./interactableTargets.js"; +export default { + id: 'pointer-events', + + install(scope) { + scope.usePlugin(pointerEvents); + scope.usePlugin(holdRepeat); + scope.usePlugin(interactableTargets); + } + +}; +export { pointerEvents, holdRepeat, interactableTargets }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/index.js.map b/@interactjs/pointer-events/index.js.map new file mode 100644 index 000000000..5839197fb --- /dev/null +++ b/@interactjs/pointer-events/index.js.map @@ -0,0 +1,19 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "pointerEvents", + "holdRepeat", + "interactableTargets", + "id", + "install", + "scope", + "usePlugin" + ], + "mappings": "AAAA,OAAO,KAAKA,aAAZ,MAA+B,WAA/B;AACA,OAAOC,UAAP,MAAuB,iBAAvB;AACA,OAAOC,mBAAP,MAAgC,0BAAhC;AAEA,eAAe;AACbC,EAAAA,EAAE,EAAE,gBADS;;AAEbC,EAAAA,OAAO,CAAEC,KAAF,EAAyB;AAC9BA,IAAAA,KAAK,CAACC,SAAN,CAAgBN,aAAhB;AACAK,IAAAA,KAAK,CAACC,SAAN,CAAgBL,UAAhB;AACAI,IAAAA,KAAK,CAACC,SAAN,CAAgBJ,mBAAhB;AACD;;AANY,CAAf;AASA,SACEF,aADF,EAEEC,UAFF,EAGEC,mBAHF", + "sourcesContent": [ + "import * as pointerEvents from './base'\nimport holdRepeat from './holdRepeat'\nimport interactableTargets from './interactableTargets'\n\nexport default {\n id: 'pointer-events',\n install (scope: Interact.Scope) {\n scope.usePlugin(pointerEvents)\n scope.usePlugin(holdRepeat)\n scope.usePlugin(interactableTargets)\n },\n}\n\nexport {\n pointerEvents,\n holdRepeat,\n interactableTargets,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/pointer-events/index.min.js b/@interactjs/pointer-events/index.min.js new file mode 100644 index 000000000..a03fbb2e4 --- /dev/null +++ b/@interactjs/pointer-events/index.min.js @@ -0,0 +1,2 @@ +import*as e from"./base.min.js";import i from"./holdRepeat.min.js";import t from"./interactableTargets.min.js";export default{id:"pointer-events",install(r){r.usePlugin(e),r.usePlugin(i),r.usePlugin(t)}};export{e as pointerEvents,i as holdRepeat,t as interactableTargets}; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/index.min.js.map b/@interactjs/pointer-events/index.min.js.map new file mode 100644 index 000000000..6eb82ffbb --- /dev/null +++ b/@interactjs/pointer-events/index.min.js.map @@ -0,0 +1,19 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "pointerEvents", + "holdRepeat", + "interactableTargets", + "id", + "install", + "scope", + "usePlugin" + ], + "mappings": "UAAYA,MAAmB,uBACxBC,MAAgB,6BAChBC,MAAyB,6CAEjB,CACbC,GAAI,iBACJC,QAASC,GACPA,EAAMC,UAAUN,GAChBK,EAAMC,UAAUL,GAChBI,EAAMC,UAAUJ,YAKlBF,mBACAC,gBACAC", + "sourcesContent": [ + "import * as pointerEvents from './base'\nimport holdRepeat from './holdRepeat'\nimport interactableTargets from './interactableTargets'\n\nexport default {\n id: 'pointer-events',\n install (scope: Interact.Scope) {\n scope.usePlugin(pointerEvents)\n scope.usePlugin(holdRepeat)\n scope.usePlugin(interactableTargets)\n },\n}\n\nexport {\n pointerEvents,\n holdRepeat,\n interactableTargets,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/pointer-events/interactableTargets.d.ts b/@interactjs/pointer-events/interactableTargets.d.ts new file mode 100644 index 000000000..b6ede3dd7 --- /dev/null +++ b/@interactjs/pointer-events/interactableTargets.d.ts @@ -0,0 +1,9 @@ +declare module '@interactjs/core/Interactable' { + interface Interactable { + pointerEvents: typeof pointerEventsMethod; + __backCompatOption: (optionName: string, newValue: any) => any; + } +} +declare function pointerEventsMethod(this: Interact.Interactable, options: any): import("@interactjs/core/Interactable").Interactable; +declare const plugin: Interact.Plugin; +export default plugin; diff --git a/@interactjs/pointer-events/interactableTargets.js b/@interactjs/pointer-events/interactableTargets.js new file mode 100644 index 000000000..8d05cbb93 --- /dev/null +++ b/@interactjs/pointer-events/interactableTargets.js @@ -0,0 +1,68 @@ +import extend from "../utils/extend.js"; + +function install(scope) { + const { + Interactable + } = scope; + Interactable.prototype.pointerEvents = pointerEventsMethod; + const __backCompatOption = Interactable.prototype._backCompatOption; + + Interactable.prototype._backCompatOption = function (optionName, newValue) { + const ret = __backCompatOption.call(this, optionName, newValue); + + if (ret === this) { + this.events.options[optionName] = newValue; + } + + return ret; + }; +} + +function pointerEventsMethod(options) { + extend(this.events.options, options); + return this; +} + +const plugin = { + id: 'pointer-events/interactableTargets', + install, + listeners: { + 'pointerEvents:collect-targets': ({ + targets, + node, + type, + eventTarget + }, scope) => { + scope.interactables.forEachMatch(node, interactable => { + const eventable = interactable.events; + const options = eventable.options; + + if (eventable.types[type] && eventable.types[type].length && interactable.testIgnoreAllow(options, node, eventTarget)) { + targets.push({ + node, + eventable, + props: { + interactable + } + }); + } + }); + }, + 'interactable:new': ({ + interactable + }) => { + interactable.events.getRect = function (element) { + return interactable.getRect(element); + }; + }, + 'interactable:set': ({ + interactable, + options + }, scope) => { + extend(interactable.events.options, scope.pointerEvents.defaults); + extend(interactable.events.options, options.pointerEvents || {}); + } + } +}; +export default plugin; +//# sourceMappingURL=interactableTargets.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/interactableTargets.js.map b/@interactjs/pointer-events/interactableTargets.js.map new file mode 100644 index 000000000..98ddbbe5c --- /dev/null +++ b/@interactjs/pointer-events/interactableTargets.js.map @@ -0,0 +1,46 @@ +{ + "version": 3, + "sources": [ + "interactableTargets.ts" + ], + "names": [ + "extend", + "install", + "scope", + "Interactable", + "prototype", + "pointerEvents", + "pointerEventsMethod", + "__backCompatOption", + "_backCompatOption", + "optionName", + "newValue", + "ret", + "call", + "events", + "options", + "plugin", + "id", + "listeners", + "targets", + "node", + "type", + "eventTarget", + "interactables", + "forEachMatch", + "interactable", + "eventable", + "types", + "length", + "testIgnoreAllow", + "push", + "props", + "getRect", + "element", + "defaults" + ], + "mappings": "AACA,OAAOA,MAAP,MAAmB,oBAAnB;;AAWA,SAASC,OAAT,CAAkBC,KAAlB,EAAgC;AAC9B,QAAM;AAAEC,IAAAA;AAAF,MAAmBD,KAAzB;AAEAC,EAAAA,YAAY,CAACC,SAAb,CAAuBC,aAAvB,GAAuCC,mBAAvC;AAEA,QAAMC,kBAAkB,GAAGJ,YAAY,CAACC,SAAb,CAAuBI,iBAAlD;;AAEAL,EAAAA,YAAY,CAACC,SAAb,CAAuBI,iBAAvB,GAA2C,UAAUC,UAAV,EAAsBC,QAAtB,EAAgC;AACzE,UAAMC,GAAG,GAAGJ,kBAAkB,CAACK,IAAnB,CAAwB,IAAxB,EAA8BH,UAA9B,EAA0CC,QAA1C,CAAZ;;AAEA,QAAIC,GAAG,KAAK,IAAZ,EAAkB;AAChB,WAAKE,MAAL,CAAYC,OAAZ,CAAoBL,UAApB,IAAkCC,QAAlC;AACD;;AAED,WAAOC,GAAP;AACD,GARD;AASD;;AAED,SAASL,mBAAT,CAA2DQ,OAA3D,EAAyE;AACvEd,EAAAA,MAAM,CAAC,KAAKa,MAAL,CAAYC,OAAb,EAAsBA,OAAtB,CAAN;AAEA,SAAO,IAAP;AACD;;AAED,MAAMC,MAAuB,GAAG;AAC9BC,EAAAA,EAAE,EAAE,oCAD0B;AAE9Bf,EAAAA,OAF8B;AAG9BgB,EAAAA,SAAS,EAAE;AACT,qCAAiC,CAAC;AAChCC,MAAAA,OADgC;AAEhCC,MAAAA,IAFgC;AAGhCC,MAAAA,IAHgC;AAIhCC,MAAAA;AAJgC,KAAD,EAK9BnB,KAL8B,KAKpB;AACXA,MAAAA,KAAK,CAACoB,aAAN,CAAoBC,YAApB,CAAiCJ,IAAjC,EAAwCK,YAAD,IAAgC;AACrE,cAAMC,SAAS,GAAGD,YAAY,CAACX,MAA/B;AACA,cAAMC,OAAO,GAAGW,SAAS,CAACX,OAA1B;;AAEA,YACEW,SAAS,CAACC,KAAV,CAAgBN,IAAhB,KACAK,SAAS,CAACC,KAAV,CAAgBN,IAAhB,EAAsBO,MADtB,IAEFH,YAAY,CAACI,eAAb,CAA6Bd,OAA7B,EAAsCK,IAAtC,EAA4CE,WAA5C,CAHA,EAG0D;AACxDH,UAAAA,OAAO,CAACW,IAAR,CAAa;AACXV,YAAAA,IADW;AAEXM,YAAAA,SAFW;AAGXK,YAAAA,KAAK,EAAE;AAAEN,cAAAA;AAAF;AAHI,WAAb;AAKD;AACF,OAdD;AAeD,KAtBQ;AAwBT,wBAAoB,CAAC;AAAEA,MAAAA;AAAF,KAAD,KAAsB;AACxCA,MAAAA,YAAY,CAACX,MAAb,CAAoBkB,OAApB,GAA8B,UAAUC,OAAV,EAAqC;AACjE,eAAOR,YAAY,CAACO,OAAb,CAAqBC,OAArB,CAAP;AACD,OAFD;AAGD,KA5BQ;AA8BT,wBAAoB,CAAC;AAAER,MAAAA,YAAF;AAAgBV,MAAAA;AAAhB,KAAD,EAA4BZ,KAA5B,KAAsC;AACxDF,MAAAA,MAAM,CAACwB,YAAY,CAACX,MAAb,CAAoBC,OAArB,EAA8BZ,KAAK,CAACG,aAAN,CAAoB4B,QAAlD,CAAN;AACAjC,MAAAA,MAAM,CAACwB,YAAY,CAACX,MAAb,CAAoBC,OAArB,EAA8BA,OAAO,CAACT,aAAR,IAAyB,EAAvD,CAAN;AACD;AAjCQ;AAHmB,CAAhC;AAwCA,eAAeU,MAAf", + "sourcesContent": [ + "import { Scope } from '@interactjs/core/scope'\nimport extend from '@interactjs/utils/extend'\n\ntype Interactable = import ('@interactjs/core/Interactable').default\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n pointerEvents: typeof pointerEventsMethod\n __backCompatOption: (optionName: string, newValue: any) => any\n }\n}\n\nfunction install (scope: Scope) {\n const { Interactable } = scope\n\n Interactable.prototype.pointerEvents = pointerEventsMethod\n\n const __backCompatOption = Interactable.prototype._backCompatOption\n\n Interactable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue)\n\n if (ret === this) {\n this.events.options[optionName] = newValue\n }\n\n return ret\n }\n}\n\nfunction pointerEventsMethod (this: Interact.Interactable, options: any) {\n extend(this.events.options, options)\n\n return this\n}\n\nconst plugin: Interact.Plugin = {\n id: 'pointer-events/interactableTargets',\n install,\n listeners: {\n 'pointerEvents:collect-targets': ({\n targets,\n node,\n type,\n eventTarget,\n }, scope) => {\n scope.interactables.forEachMatch(node, (interactable: Interactable) => {\n const eventable = interactable.events\n const options = eventable.options\n\n if (\n eventable.types[type] &&\n eventable.types[type].length &&\n interactable.testIgnoreAllow(options, node, eventTarget)) {\n targets.push({\n node,\n eventable,\n props: { interactable },\n })\n }\n })\n },\n\n 'interactable:new': ({ interactable }) => {\n interactable.events.getRect = function (element: Interact.Element) {\n return interactable.getRect(element)\n }\n },\n\n 'interactable:set': ({ interactable, options }, scope) => {\n extend(interactable.events.options, scope.pointerEvents.defaults)\n extend(interactable.events.options, options.pointerEvents || {})\n },\n },\n}\n\nexport default plugin\n" + ] +} \ No newline at end of file diff --git a/@interactjs/pointer-events/interactableTargets.min.js b/@interactjs/pointer-events/interactableTargets.min.js new file mode 100644 index 000000000..fabba36d1 --- /dev/null +++ b/@interactjs/pointer-events/interactableTargets.min.js @@ -0,0 +1,2 @@ +import t from"../utils/extend.min.js";function e(e){return t(this.events.options,e),this}const n={id:"pointer-events/interactableTargets",install(t){const{Interactable:n}=t;n.prototype.pointerEvents=e;const o=n.prototype._backCompatOption;n.prototype._backCompatOption=function(t,e){const n=o.call(this,t,e);return n===this&&(this.events.options[t]=e),n}},listeners:{"pointerEvents:collect-targets"({targets:t,node:e,type:n,eventTarget:o},s){s.interactables.forEachMatch(e,s=>{const i=s.events,a=i.options;i.types[n]&&i.types[n].length&&s.testIgnoreAllow(a,e,o)&&t.push({node:e,eventable:i,props:{interactable:s}})})},"interactable:new"({interactable:t}){t.events.getRect=e=>t.getRect(e)},"interactable:set"({interactable:e,options:n},o){t(e.events.options,o.pointerEvents.defaults),t(e.events.options,n.pointerEvents||{})}}};export default n; +//# sourceMappingURL=interactableTargets.min.js.map \ No newline at end of file diff --git a/@interactjs/pointer-events/interactableTargets.min.js.map b/@interactjs/pointer-events/interactableTargets.min.js.map new file mode 100644 index 000000000..3e9e2a908 --- /dev/null +++ b/@interactjs/pointer-events/interactableTargets.min.js.map @@ -0,0 +1,48 @@ +{ + "version": 3, + "sources": [ + "interactableTargets.ts" + ], + "names": [ + "extend", + "pointerEventsMethod", + "options", + "this", + "events", + "plugin", + "id", + "install", + "scope", + "Interactable", + "prototype", + "pointerEvents", + "__backCompatOption", + "_backCompatOption", + "optionName", + "newValue", + "ret", + "call", + "listeners", + "[object Object]", + "targets", + "node", + "type", + "eventTarget", + "interactables", + "forEachMatch", + "interactable", + "eventable", + "types", + "length", + "testIgnoreAllow", + "push", + "props", + "getRect", + "element", + "defaults" + ], + "mappings": "OACOA,MAAY,yBA6BnB,SAASC,EAAkDC,GAGzD,OAFAF,EAAOG,KAAKC,OAAOF,QAASA,GAErBC,KAGT,MAAME,EAA0B,CAC9BC,GAAI,qCACJC,QA1BgBC,GAChB,MAAMC,aAAEA,GAAiBD,EAEzBC,EAAaC,UAAUC,cAAgBV,EAEvC,MAAMW,EAAqBH,EAAaC,UAAUG,kBAElDJ,EAAaC,UAAUG,kBAAoB,SAAUC,EAAYC,GAC/D,MAAMC,EAAMJ,EAAmBK,KAAKd,KAAMW,EAAYC,GAMtD,OAJIC,IAAQb,OACVA,KAAKC,OAAOF,QAAQY,GAAcC,GAG7BC,IAaTE,UAAW,CACTC,iCACEC,QAAAA,EACAC,KAAAA,EACAC,KAAAA,EACAC,YAAAA,GACCf,GACDA,EAAMgB,cAAcC,aAAaJ,EAAOK,IACtC,MAAMC,EAAYD,EAAatB,OACzBF,EAAUyB,EAAUzB,QAGxByB,EAAUC,MAAMN,IAChBK,EAAUC,MAAMN,GAAMO,QACxBH,EAAaI,gBAAgB5B,EAASmB,EAAME,IAC1CH,EAAQW,KAAK,CACXV,KAAAA,EACAM,UAAAA,EACAK,MAAO,CAAEN,aAAAA,QAMjBP,oBAAuBO,aAAAA,IACrBA,EAAatB,OAAO6B,QAAoBC,GAC/BR,EAAaO,QAAQC,IAIhCf,oBAAuBO,aAAAA,EAAcxB,QAAAA,GAAWM,GAC9CR,EAAO0B,EAAatB,OAAOF,QAASM,EAAMG,cAAcwB,UACxDnC,EAAO0B,EAAatB,OAAOF,QAASA,EAAQS,eAAiB,sBAKpDN", + "sourcesContent": [ + "import { Scope } from '@interactjs/core/scope'\nimport extend from '@interactjs/utils/extend'\n\ntype Interactable = import ('@interactjs/core/Interactable').default\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n pointerEvents: typeof pointerEventsMethod\n __backCompatOption: (optionName: string, newValue: any) => any\n }\n}\n\nfunction install (scope: Scope) {\n const { Interactable } = scope\n\n Interactable.prototype.pointerEvents = pointerEventsMethod\n\n const __backCompatOption = Interactable.prototype._backCompatOption\n\n Interactable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue)\n\n if (ret === this) {\n this.events.options[optionName] = newValue\n }\n\n return ret\n }\n}\n\nfunction pointerEventsMethod (this: Interact.Interactable, options: any) {\n extend(this.events.options, options)\n\n return this\n}\n\nconst plugin: Interact.Plugin = {\n id: 'pointer-events/interactableTargets',\n install,\n listeners: {\n 'pointerEvents:collect-targets': ({\n targets,\n node,\n type,\n eventTarget,\n }, scope) => {\n scope.interactables.forEachMatch(node, (interactable: Interactable) => {\n const eventable = interactable.events\n const options = eventable.options\n\n if (\n eventable.types[type] &&\n eventable.types[type].length &&\n interactable.testIgnoreAllow(options, node, eventTarget)) {\n targets.push({\n node,\n eventable,\n props: { interactable },\n })\n }\n })\n },\n\n 'interactable:new': ({ interactable }) => {\n interactable.events.getRect = function (element: Interact.Element) {\n return interactable.getRect(element)\n }\n },\n\n 'interactable:set': ({ interactable, options }, scope) => {\n extend(interactable.events.options, scope.pointerEvents.defaults)\n extend(interactable.events.options, options.pointerEvents || {})\n },\n },\n}\n\nexport default plugin\n" + ] +} \ No newline at end of file diff --git a/@interactjs/reflow/.npmignore b/@interactjs/reflow/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/reflow/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/reflow/LICENSE b/@interactjs/reflow/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/reflow/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/reflow/index.d.ts b/@interactjs/reflow/index.d.ts new file mode 100644 index 000000000..167747aab --- /dev/null +++ b/@interactjs/reflow/index.d.ts @@ -0,0 +1,23 @@ +import Interactable from '@interactjs/core/Interactable'; +import { ActionProps } from '@interactjs/core/Interaction'; +import { Scope } from '@interactjs/core/scope'; +declare module '@interactjs/core/Interactable' { + interface Interactable { + reflow: (action: ActionProps) => ReturnType; + } +} +declare module '@interactjs/core/Interaction' { + interface Interaction { + _reflowPromise: Promise; + _reflowResolve: () => void; + } +} +declare module '@interactjs/core/InteractEvent' { + interface PhaseMap { + reflow?: true; + } +} +export declare function install(scope: Scope): void; +declare function reflow(interactable: Interactable, action: ActionProps, scope: Scope): Promise; +declare const _default: import("@interactjs/core/scope").Plugin; +export default _default; diff --git a/@interactjs/reflow/index.js b/@interactjs/reflow/index.js new file mode 100644 index 000000000..d96fb7586 --- /dev/null +++ b/@interactjs/reflow/index.js @@ -0,0 +1,139 @@ +import Interactable from "../core/Interactable.js"; +import { Interaction } from "../core/Interaction.js"; +import { arr, extend, is, pointer as pointerUtils, rect as rectUtils, win } from "../utils/index.js"; +export function install(scope) { + const { + /** @lends Interactable */ + // eslint-disable-next-line no-shadow + Interactable + } = scope; + scope.actions.phases.reflow = true; + /** + * ```js + * const interactable = interact(target) + * const drag = { name: drag, axis: 'x' } + * const resize = { name: resize, edges: { left: true, bottom: true } + * + * interactable.reflow(drag) + * interactable.reflow(resize) + * ``` + * + * Start an action sequence to re-apply modifiers, check drops, etc. + * + * @param { Object } action The action to begin + * @param { string } action.name The name of the action + * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended + */ + + Interactable.prototype.reflow = function (action) { + return reflow(this, action, scope); + }; +} + +function reflow(interactable, action, scope) { + const elements = is.string(interactable.target) ? arr.from(interactable._context.querySelectorAll(interactable.target)) : [interactable.target]; // tslint:disable-next-line variable-name + + const Promise = win.window.Promise; + const promises = Promise ? [] : null; + + for (const element of elements) { + const rect = interactable.getRect(element); + + if (!rect) { + break; + } + + const runningInteraction = arr.find(scope.interactions.list, interaction => { + return interaction.interacting() && interaction.interactable === interactable && interaction.element === element && interaction.prepared.name === action.name; + }); + let reflowPromise; + + if (runningInteraction) { + runningInteraction.move(); + + if (promises) { + reflowPromise = runningInteraction._reflowPromise || new Promise(resolve => { + runningInteraction._reflowResolve = resolve; + }); + } + } else { + const xywh = rectUtils.tlbrToXywh(rect); + const coords = { + page: { + x: xywh.x, + y: xywh.y + }, + client: { + x: xywh.x, + y: xywh.y + }, + timeStamp: scope.now() + }; + const event = pointerUtils.coordsToEvent(coords); + reflowPromise = startReflow(scope, interactable, element, action, event); + } + + if (promises) { + promises.push(reflowPromise); + } + } + + return promises && Promise.all(promises).then(() => interactable); +} + +function startReflow(scope, interactable, element, action, event) { + const interaction = scope.interactions.new({ + pointerType: 'reflow' + }); + const signalArg = { + interaction, + event, + pointer: event, + eventTarget: element, + phase: 'reflow' + }; + interaction.interactable = interactable; + interaction.element = element; + interaction.prepared = extend({}, action); + interaction.prevEvent = event; + interaction.updatePointer(event, event, element, true); + + interaction._doPhase(signalArg); + + const reflowPromise = win.window.Promise ? new win.window.Promise(resolve => { + interaction._reflowResolve = resolve; + }) : null; + interaction._reflowPromise = reflowPromise; + interaction.start(action, interactable, element); + + if (interaction._interacting) { + interaction.move(signalArg); + interaction.end(event); + } else { + interaction.stop(); + } + + interaction.removePointer(event, event); + interaction.pointerIsDown = false; + return reflowPromise; +} + +export default { + id: 'reflow', + install, + listeners: { + // remove completed reflow interactions + 'interactions:stop': ({ + interaction + }, scope) => { + if (interaction.pointerType === 'reflow') { + if (interaction._reflowResolve) { + interaction._reflowResolve(); + } + + arr.remove(scope.interactions.list, interaction); + } + } + } +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/reflow/index.js.map b/@interactjs/reflow/index.js.map new file mode 100644 index 000000000..fe3c9c421 --- /dev/null +++ b/@interactjs/reflow/index.js.map @@ -0,0 +1,86 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "Interactable", + "Interaction", + "arr", + "extend", + "is", + "pointer", + "pointerUtils", + "rect", + "rectUtils", + "win", + "install", + "scope", + "actions", + "phases", + "reflow", + "prototype", + "action", + "interactable", + "elements", + "string", + "target", + "from", + "_context", + "querySelectorAll", + "Promise", + "window", + "promises", + "element", + "getRect", + "runningInteraction", + "find", + "interactions", + "list", + "interaction", + "interacting", + "prepared", + "name", + "reflowPromise", + "move", + "_reflowPromise", + "resolve", + "_reflowResolve", + "xywh", + "tlbrToXywh", + "coords", + "page", + "x", + "y", + "client", + "timeStamp", + "now", + "event", + "coordsToEvent", + "startReflow", + "push", + "all", + "then", + "new", + "pointerType", + "signalArg", + "eventTarget", + "phase", + "prevEvent", + "updatePointer", + "_doPhase", + "start", + "_interacting", + "end", + "stop", + "removePointer", + "pointerIsDown", + "id", + "listeners", + "remove" + ], + "mappings": "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", + "sourcesContent": [ + "import Interactable from '@interactjs/core/Interactable'\nimport { ActionProps, Interaction } from '@interactjs/core/Interaction'\nimport { Scope } from '@interactjs/core/scope'\nimport { arr, extend, is, pointer as pointerUtils, rect as rectUtils, win } from '@interactjs/utils/index'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n reflow: (action: ActionProps) => ReturnType\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n _reflowPromise: Promise\n _reflowResolve: () => void\n }\n}\n\ndeclare module '@interactjs/core/InteractEvent' {\n // eslint-disable-next-line no-shadow\n interface PhaseMap {\n reflow?: true\n }\n}\n\nexport function install (scope: Scope) {\n const {\n /** @lends Interactable */\n // eslint-disable-next-line no-shadow\n Interactable,\n } = scope\n\n scope.actions.phases.reflow = true\n\n /**\n * ```js\n * const interactable = interact(target)\n * const drag = { name: drag, axis: 'x' }\n * const resize = { name: resize, edges: { left: true, bottom: true }\n *\n * interactable.reflow(drag)\n * interactable.reflow(resize)\n * ```\n *\n * Start an action sequence to re-apply modifiers, check drops, etc.\n *\n * @param { Object } action The action to begin\n * @param { string } action.name The name of the action\n * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended\n */\n Interactable.prototype.reflow = function (action) {\n return reflow(this, action, scope)\n }\n}\n\nfunction reflow (interactable: Interactable, action: ActionProps, scope: Scope): Promise {\n const elements = (is.string(interactable.target)\n ? arr.from(interactable._context.querySelectorAll(interactable.target))\n : [interactable.target]) as Interact.Element[]\n\n // tslint:disable-next-line variable-name\n const Promise = (win.window as any).Promise\n const promises: Array> | null = Promise ? [] : null\n\n for (const element of elements) {\n const rect = interactable.getRect(element as HTMLElement | SVGElement)\n\n if (!rect) { break }\n\n const runningInteraction = arr.find(\n scope.interactions.list,\n (interaction: Interaction) => {\n return interaction.interacting() &&\n interaction.interactable === interactable &&\n interaction.element === element &&\n interaction.prepared.name === action.name\n })\n let reflowPromise: Promise\n\n if (runningInteraction) {\n runningInteraction.move()\n\n if (promises) {\n reflowPromise = runningInteraction._reflowPromise || new Promise((resolve: any) => {\n runningInteraction._reflowResolve = resolve\n })\n }\n }\n else {\n const xywh = rectUtils.tlbrToXywh(rect)\n const coords = {\n page : { x: xywh.x, y: xywh.y },\n client : { x: xywh.x, y: xywh.y },\n timeStamp: scope.now(),\n }\n\n const event = pointerUtils.coordsToEvent(coords)\n reflowPromise = startReflow(scope, interactable, element, action, event)\n }\n\n if (promises) {\n promises.push(reflowPromise)\n }\n }\n\n return promises && Promise.all(promises).then(() => interactable)\n}\n\nfunction startReflow (scope: Scope, interactable: Interactable, element: Interact.Element, action: ActionProps, event: any) {\n const interaction = scope.interactions.new({ pointerType: 'reflow' })\n const signalArg = {\n interaction,\n event,\n pointer: event,\n eventTarget: element,\n phase: 'reflow',\n } as const\n\n interaction.interactable = interactable\n interaction.element = element\n interaction.prepared = extend({}, action)\n interaction.prevEvent = event\n interaction.updatePointer(event, event, element, true)\n\n interaction._doPhase(signalArg)\n\n const reflowPromise = (win.window as unknown as any).Promise\n ? new (win.window as unknown as any).Promise((resolve: any) => {\n interaction._reflowResolve = resolve\n })\n : null\n\n interaction._reflowPromise = reflowPromise\n interaction.start(action, interactable, element)\n\n if (interaction._interacting) {\n interaction.move(signalArg)\n interaction.end(event)\n }\n else {\n interaction.stop()\n }\n\n interaction.removePointer(event, event)\n interaction.pointerIsDown = false\n\n return reflowPromise\n}\n\nexport default {\n id: 'reflow',\n install,\n listeners: {\n // remove completed reflow interactions\n 'interactions:stop': ({ interaction }, scope) => {\n if (interaction.pointerType === 'reflow') {\n if (interaction._reflowResolve) {\n interaction._reflowResolve()\n }\n\n arr.remove(scope.interactions.list, interaction)\n }\n },\n },\n} as Interact.Plugin\n" + ] +} \ No newline at end of file diff --git a/@interactjs/reflow/index.min.js b/@interactjs/reflow/index.min.js new file mode 100644 index 000000000..937585a62 --- /dev/null +++ b/@interactjs/reflow/index.min.js @@ -0,0 +1,2 @@ +import e from"../core/Interactable.min.js";import{Interaction as t}from"../core/Interaction.min.js";import{arr as n,extend as o,is as r,pointer as i,rect as s,win as l}from"../utils/index.min.js";export function install(e){const{Interactable:t}=e;e.actions.phases.reflow=!0,t.prototype.reflow=function(t){return function(e,t,o){const c=r.string(e.target)?n.from(e._context.querySelectorAll(e.target)):[e.target],p=l.window.Promise,f=p?[]:null;for(const r of c){const l=e.getRect(r);if(!l)break;const c=n.find(o.interactions.list,n=>n.interacting()&&n.interactable===e&&n.element===r&&n.prepared.name===t.name);let m;if(c)c.move(),f&&(m=c._reflowPromise||new p(e=>{c._reflowResolve=e}));else{const n=s.tlbrToXywh(l),c={page:{x:n.x,y:n.y},client:{x:n.x,y:n.y},timeStamp:o.now()},p=i.coordsToEvent(c);m=a(o,e,r,t,p)}f&&f.push(m)}return f&&p.all(f).then(()=>e)}(this,t,e)}}function a(e,t,n,r,i){const s=e.interactions.new({pointerType:"reflow"}),a={interaction:s,event:i,pointer:i,eventTarget:n,phase:"reflow"};s.interactable=t,s.element=n,s.prepared=o({},r),s.prevEvent=i,s.updatePointer(i,i,n,!0),s._doPhase(a);const c=l.window.Promise?new l.window.Promise(e=>{s._reflowResolve=e}):null;return s._reflowPromise=c,s.start(r,t,n),s._interacting?(s.move(a),s.end(i)):s.stop(),s.removePointer(i,i),s.pointerIsDown=!1,c}export default{id:"reflow",install:install,listeners:{"interactions:stop"({interaction:e},t){"reflow"===e.pointerType&&(e._reflowResolve&&e._reflowResolve(),n.remove(t.interactions.list,e))}}}; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/reflow/index.min.js.map b/@interactjs/reflow/index.min.js.map new file mode 100644 index 000000000..786367419 --- /dev/null +++ b/@interactjs/reflow/index.min.js.map @@ -0,0 +1,88 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "Interactable", + "Interaction", + "arr", + "extend", + "is", + "pointerUtils", + "rectUtils", + "win", + "install", + "scope", + "actions", + "phases", + "reflow", + "prototype", + "action", + "interactable", + "elements", + "string", + "target", + "from", + "_context", + "querySelectorAll", + "Promise", + "window", + "promises", + "element", + "rect", + "getRect", + "runningInteraction", + "find", + "interactions", + "list", + "interaction", + "interacting", + "prepared", + "name", + "reflowPromise", + "move", + "_reflowPromise", + "resolve", + "_reflowResolve", + "xywh", + "tlbrToXywh", + "coords", + "page", + "x", + "y", + "client", + "timeStamp", + "now", + "event", + "coordsToEvent", + "startReflow", + "push", + "all", + "then", + "this", + "new", + "pointerType", + "signalArg", + "pointer", + "eventTarget", + "phase", + "prevEvent", + "updatePointer", + "_doPhase", + "start", + "_interacting", + "end", + "stop", + "removePointer", + "pointerIsDown", + "id", + "listeners", + "[object Object]", + "remove" + ], + "mappings": "OAAOA,MAAkB,oDACHC,MAAmB,2CAEhCC,YAAKC,QAAQC,aAAeC,UAAsBC,SAAWC,MAAW,+BAsB1E,SAASC,QAASC,GACvB,MAAMT,aAGJA,GACES,EAEJA,EAAMC,QAAQC,OAAOC,QAAS,EAkB9BZ,EAAaa,UAAUD,OAAS,SAAUE,GACxC,OAIJ,SAAgDC,EAA4BD,EAAwBL,GAClG,MAAMO,EAAYZ,EAAGa,OAAOF,EAAaG,QACrChB,EAAIiB,KAAKJ,EAAaK,SAASC,iBAAiBN,EAAaG,SAC7D,CAACH,EAAaG,QAGZI,EAAWf,EAAIgB,OAAeD,QAC9BE,EAAwCF,EAAU,GAAK,KAE7D,IAAK,MAAMG,KAAWT,EAAU,CAC9B,MAAMU,EAAOX,EAAaY,QAAQF,GAElC,IAAKC,EAAQ,MAEb,MAAME,EAAqB1B,EAAI2B,KAC7BpB,EAAMqB,aAAaC,KAClBC,GACQA,EAAYC,eACjBD,EAAYjB,eAAiBA,GAC7BiB,EAAYP,UAAYA,GACxBO,EAAYE,SAASC,OAASrB,EAAOqB,MAE3C,IAAIC,EAEJ,GAAIR,EACFA,EAAmBS,OAEfb,IACFY,EAAgBR,EAAmBU,gBAAkB,IAAIhB,EAASiB,IAChEX,EAAmBY,eAAiBD,SAIrC,CACH,MAAME,EAAOnC,EAAUoC,WAAWhB,GAC5BiB,EAAS,CACbC,KAAW,CAAEC,EAAGJ,EAAKI,EAAGC,EAAGL,EAAKK,GAChCC,OAAW,CAAEF,EAAGJ,EAAKI,EAAGC,EAAGL,EAAKK,GAChCE,UAAWvC,EAAMwC,OAGbC,EAAQ7C,EAAa8C,cAAcR,GACzCP,EAAgBgB,EAAe3C,EAAOM,EAAcU,EAASX,EAAQoC,GAGnE1B,GACFA,EAAS6B,KAAKjB,GAIlB,OAAOZ,GAAYF,EAAQgC,IAAI9B,GAAU+B,KAAK,IAAMxC,GAtD3CH,CAAO4C,KAAM1C,EAAQL,IAyDhC,SAAS2C,EAA4C3C,EAAcM,EAA4BU,EAA2BX,EAAwBoC,GAChJ,MAAMlB,EAAcvB,EAAMqB,aAAa2B,IAAI,CAAEC,YAAa,WACpDC,EAAY,CAChB3B,YAAAA,EACAkB,MAAAA,EACAU,QAASV,EACTW,YAAapC,EACbqC,MAAO,UAGT9B,EAAYjB,aAAeA,EAC3BiB,EAAYP,QAAUA,EACtBO,EAAYE,SAAW/B,EAAO,GAAIW,GAClCkB,EAAY+B,UAAYb,EACxBlB,EAAYgC,cAAcd,EAAOA,EAAOzB,GAAS,GAEjDO,EAAYiC,SAASN,GAErB,MAAMvB,EAAiB7B,EAAIgB,OAA0BD,QACjD,IAAKf,EAAIgB,OAA0BD,QAASiB,IAC5CP,EAAYQ,eAAiBD,IAE7B,KAgBJ,OAdAP,EAAYM,eAAiBF,EAC7BJ,EAAYkC,MAAMpD,EAAQC,EAAcU,GAEpCO,EAAYmC,cACdnC,EAAYK,KAAKsB,GACjB3B,EAAYoC,IAAIlB,IAGhBlB,EAAYqC,OAGdrC,EAAYsC,cAAcpB,EAAOA,GACjClB,EAAYuC,eAAgB,EAErBnC,gBAGM,CACboC,GAAI,SACJhE,QAAAA,QACAiE,UAAW,CAETC,qBAAwB1C,YAAAA,GAAevB,GACL,WAA5BuB,EAAY0B,cACV1B,EAAYQ,gBACdR,EAAYQ,iBAGdtC,EAAIyE,OAAOlE,EAAMqB,aAAaC,KAAMC", + "sourcesContent": [ + "import Interactable from '@interactjs/core/Interactable'\nimport { ActionProps, Interaction } from '@interactjs/core/Interaction'\nimport { Scope } from '@interactjs/core/scope'\nimport { arr, extend, is, pointer as pointerUtils, rect as rectUtils, win } from '@interactjs/utils/index'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n reflow: (action: ActionProps) => ReturnType\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n _reflowPromise: Promise\n _reflowResolve: () => void\n }\n}\n\ndeclare module '@interactjs/core/InteractEvent' {\n // eslint-disable-next-line no-shadow\n interface PhaseMap {\n reflow?: true\n }\n}\n\nexport function install (scope: Scope) {\n const {\n /** @lends Interactable */\n // eslint-disable-next-line no-shadow\n Interactable,\n } = scope\n\n scope.actions.phases.reflow = true\n\n /**\n * ```js\n * const interactable = interact(target)\n * const drag = { name: drag, axis: 'x' }\n * const resize = { name: resize, edges: { left: true, bottom: true }\n *\n * interactable.reflow(drag)\n * interactable.reflow(resize)\n * ```\n *\n * Start an action sequence to re-apply modifiers, check drops, etc.\n *\n * @param { Object } action The action to begin\n * @param { string } action.name The name of the action\n * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended\n */\n Interactable.prototype.reflow = function (action) {\n return reflow(this, action, scope)\n }\n}\n\nfunction reflow (interactable: Interactable, action: ActionProps, scope: Scope): Promise {\n const elements = (is.string(interactable.target)\n ? arr.from(interactable._context.querySelectorAll(interactable.target))\n : [interactable.target]) as Interact.Element[]\n\n // tslint:disable-next-line variable-name\n const Promise = (win.window as any).Promise\n const promises: Array> | null = Promise ? [] : null\n\n for (const element of elements) {\n const rect = interactable.getRect(element as HTMLElement | SVGElement)\n\n if (!rect) { break }\n\n const runningInteraction = arr.find(\n scope.interactions.list,\n (interaction: Interaction) => {\n return interaction.interacting() &&\n interaction.interactable === interactable &&\n interaction.element === element &&\n interaction.prepared.name === action.name\n })\n let reflowPromise: Promise\n\n if (runningInteraction) {\n runningInteraction.move()\n\n if (promises) {\n reflowPromise = runningInteraction._reflowPromise || new Promise((resolve: any) => {\n runningInteraction._reflowResolve = resolve\n })\n }\n }\n else {\n const xywh = rectUtils.tlbrToXywh(rect)\n const coords = {\n page : { x: xywh.x, y: xywh.y },\n client : { x: xywh.x, y: xywh.y },\n timeStamp: scope.now(),\n }\n\n const event = pointerUtils.coordsToEvent(coords)\n reflowPromise = startReflow(scope, interactable, element, action, event)\n }\n\n if (promises) {\n promises.push(reflowPromise)\n }\n }\n\n return promises && Promise.all(promises).then(() => interactable)\n}\n\nfunction startReflow (scope: Scope, interactable: Interactable, element: Interact.Element, action: ActionProps, event: any) {\n const interaction = scope.interactions.new({ pointerType: 'reflow' })\n const signalArg = {\n interaction,\n event,\n pointer: event,\n eventTarget: element,\n phase: 'reflow',\n } as const\n\n interaction.interactable = interactable\n interaction.element = element\n interaction.prepared = extend({}, action)\n interaction.prevEvent = event\n interaction.updatePointer(event, event, element, true)\n\n interaction._doPhase(signalArg)\n\n const reflowPromise = (win.window as unknown as any).Promise\n ? new (win.window as unknown as any).Promise((resolve: any) => {\n interaction._reflowResolve = resolve\n })\n : null\n\n interaction._reflowPromise = reflowPromise\n interaction.start(action, interactable, element)\n\n if (interaction._interacting) {\n interaction.move(signalArg)\n interaction.end(event)\n }\n else {\n interaction.stop()\n }\n\n interaction.removePointer(event, event)\n interaction.pointerIsDown = false\n\n return reflowPromise\n}\n\nexport default {\n id: 'reflow',\n install,\n listeners: {\n // remove completed reflow interactions\n 'interactions:stop': ({ interaction }, scope) => {\n if (interaction.pointerType === 'reflow') {\n if (interaction._reflowResolve) {\n interaction._reflowResolve()\n }\n\n arr.remove(scope.interactions.list, interaction)\n }\n },\n },\n} as Interact.Plugin\n" + ] +} \ No newline at end of file diff --git a/@interactjs/reflow/reflow.spec.d.ts b/@interactjs/reflow/reflow.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/reflow/reflow.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/types/.npmignore b/@interactjs/types/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/types/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/types/LICENSE b/@interactjs/types/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/types/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/types/NativePointerEventType.d.ts b/@interactjs/types/NativePointerEventType.d.ts new file mode 100644 index 000000000..95f590a29 --- /dev/null +++ b/@interactjs/types/NativePointerEventType.d.ts @@ -0,0 +1,2 @@ +declare const NativePointerEvent: PointerEvent; +export default NativePointerEvent; diff --git a/@interactjs/types/NativePointerEventType.js b/@interactjs/types/NativePointerEventType.js new file mode 100644 index 000000000..80234dace --- /dev/null +++ b/@interactjs/types/NativePointerEventType.js @@ -0,0 +1,3 @@ +const NativePointerEvent = null; +export default NativePointerEvent; +//# sourceMappingURL=NativePointerEventType.js.map \ No newline at end of file diff --git a/@interactjs/types/NativePointerEventType.js.map b/@interactjs/types/NativePointerEventType.js.map new file mode 100644 index 000000000..201959df4 --- /dev/null +++ b/@interactjs/types/NativePointerEventType.js.map @@ -0,0 +1,13 @@ +{ + "version": 3, + "sources": [ + "NativePointerEventType.ts" + ], + "names": [ + "NativePointerEvent" + ], + "mappings": "AAAA,MAAMA,kBAAkB,GAAG,IAA3B;AACA,eAAeA,kBAAf", + "sourcesContent": [ + "const NativePointerEvent = null as InstanceType\nexport default NativePointerEvent\n" + ] +} \ No newline at end of file diff --git a/@interactjs/types/NativePointerEventType.min.js b/@interactjs/types/NativePointerEventType.min.js new file mode 100644 index 000000000..bb17def64 --- /dev/null +++ b/@interactjs/types/NativePointerEventType.min.js @@ -0,0 +1,2 @@ +export default null; +//# sourceMappingURL=NativePointerEventType.min.js.map \ No newline at end of file diff --git a/@interactjs/types/NativePointerEventType.min.js.map b/@interactjs/types/NativePointerEventType.min.js.map new file mode 100644 index 000000000..57a40fd41 --- /dev/null +++ b/@interactjs/types/NativePointerEventType.min.js.map @@ -0,0 +1,11 @@ +{ + "version": 3, + "sources": [ + "NativePointerEventType.ts" + ], + "names": [], + "mappings": "eAA2B", + "sourcesContent": [ + "const NativePointerEvent = null as InstanceType\nexport default NativePointerEvent\n" + ] +} \ No newline at end of file diff --git a/@interactjs/types/index.d.ts b/@interactjs/types/index.d.ts new file mode 100644 index 000000000..8d2205dfa --- /dev/null +++ b/@interactjs/types/index.d.ts @@ -0,0 +1 @@ +/// diff --git a/@interactjs/types/index.js b/@interactjs/types/index.js new file mode 100644 index 000000000..77c678825 --- /dev/null +++ b/@interactjs/types/index.js @@ -0,0 +1,2 @@ +/// +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/types/index.js.map b/@interactjs/types/index.js.map new file mode 100644 index 000000000..fdb992c59 --- /dev/null +++ b/@interactjs/types/index.js.map @@ -0,0 +1,11 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [], + "mappings": "AAAA", + "sourcesContent": [ + "/// \n" + ] +} \ No newline at end of file diff --git a/@interactjs/types/index.min.js b/@interactjs/types/index.min.js new file mode 100644 index 000000000..0ab6a48ef --- /dev/null +++ b/@interactjs/types/index.min.js @@ -0,0 +1,2 @@ + +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/types/index.min.js.map b/@interactjs/types/index.min.js.map new file mode 100644 index 000000000..aeff569e7 --- /dev/null +++ b/@interactjs/types/index.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": [], + "names": [], + "mappings": "", + "sourcesContent": [] +} \ No newline at end of file diff --git a/@interactjs/types/interactjs-test.d.ts b/@interactjs/types/interactjs-test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/types/interactjs-test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/types/interactjs-test.js b/@interactjs/types/interactjs-test.js new file mode 100644 index 000000000..1fe0e57b5 --- /dev/null +++ b/@interactjs/types/interactjs-test.js @@ -0,0 +1,244 @@ +// eslint-disable-next-line node/no-extraneous-import +import interact from "../interactjs/index.js"; // Interactables + +interact(document.body); +interact(document); +interact(window); +interact('.drag-and-resize').draggable({ + inertia: true, + modifiers: [interact.modifiers.snap({ + targets: [{ + x: 100, + y: 200 + }, (x, y) => ({ + x: x % 20, + y + }), interact.snappers.grid({ + x: 20, + y: 0 + })], + offset: 'startCoords', + relativePoints: [{ + x: 0, + y: 1 + }], + endOnly: true + }), interact.modifiers.snapSize({ + targets: [{ + x: 100, + y: 200 + }, (x, y) => ({ + x: x % 20, + y + }), interact.snappers.grid({ + width: 100, + height: 500 + })], + endOnly: true + }), interact.modifiers.restrictRect({ + restriction: 'parent', + endOnly: true + }), interact.modifiers.restrict({ + restriction: _ => ({ + top: 0, + left: 0, + bottom: 1, + right: 1 + }) + }), interact.modifiers.restrict({ + restriction: _ => document.body + }), interact.modifiers.restrictSize({ + min: document.body, + max: 'parent' + }), interact.modifiers.restrictEdges({ + inner: document.body, + outer: 'parent' + })] +}).resizable({ + inertia: true +}); // Selector context + +const myList = document.querySelector('#my-list'); +interact('li', { + context: myList +}).draggable({ + /* ... */ +}); // Action options + +const target = 'li'; +interact(target).draggable({ + max: 1, + maxPerElement: 2, + manualStart: true, + modifiers: [], + inertia: { + /* ... */ + }, + autoScroll: { + /* ... */ + }, + lockAxis: 'x' || 'y' || 'start', + startAxis: 'x' || 'y' +}).resizable({ + max: 1, + maxPerElement: 2, + manualStart: true, + modifiers: [], + inertia: { + /* ... */ + }, + autoScroll: { + /* ... */ + }, + margin: 50, + square: true || false, + axis: 'x' || 'y' +}).gesturable({ + max: 1, + maxPerElement: 2, + manualStart: true, + modifiers: [] +}); // autoscroll + +const element = 'li'; +interact(element).draggable({ + autoScroll: true +}).resizable({ + autoScroll: { + container: document.body, + margin: 50, + distance: 5, + interval: 10 + } +}); // axis + +interact(target).draggable({ + startAxis: 'x', + lockAxis: 'y' +}).draggable({ + startAxis: 'xy', + lockAxis: 'x' +}); +interact(target).resizable({ + axis: 'x' +}); +const handleEl = 'li'; +interact(target).resizable({ + edges: { + top: true, + // Use pointer coords to check for resize. + left: false, + // Disable resizing from left edge. + bottom: '.resize-s', + // Resize if pointer target matches selector + right: handleEl // Resize if pointer target is the given Element + + } +}); // resize invert + +interact(target).resizable({ + edges: { + bottom: true, + right: true + }, + invert: 'reposition' +}); // resize square + +interact(target).resizable({ + squareResize: true +}); // dropzone accept + +interact(target).dropzone({ + accept: '.drag0, .drag1' +}); // dropzone overlap + +interact(target).dropzone({ + overlap: 0.25 +}); // dropzone checker + +interact(target).dropzone({ + checker(_dragEvent, // related dragmove or dragend + _event, // Touch, Pointer or Mouse Event + dropped, // bool default checker result + _dropzone, // dropzone Interactable + dropElement, // dropzone elemnt + _draggable, // draggable Interactable + _draggableElement) { + // draggable element + // only allow drops into empty dropzone elements + return dropped && !dropElement.hasChildNodes(); + } + +}); +interact.dynamicDrop(); +interact.dynamicDrop(false); // Events + +function listener(event) { + const { + type, + pageX, + pageY + } = event; + alert({ + type, + pageX, + pageY + }); +} + +interact(target).on('dragstart', listener).on('dragmove dragend', listener).on(['resizemove', 'resizeend'], listener).on({ + gesturestart: listener, + gestureend: listener +}); +interact.on('resize', event => { + const { + rect, + deltaRect + } = event; + alert(JSON.stringify({ + rect, + deltaRect + })); +}); +interact(target).resizable({ + listeners: [{ + start: listener, + move: listener + }] +}); +interact(target).draggable({ + listeners: { + start: listener, + end: listener + } +}); +interact(target).draggable({ + onstart: listener, + onmove: listener, + onend: listener +}); +interact.on(['dragmove', 'resizestart'], listener); // devTools options + +interact(target).devTools({ + ignore: { + boxSizing: true, + touchAction: true + } +}); +const dropTarget = 'div'; // Drop Events + +interact(dropTarget).dropzone({ + ondrop(event) { + alert(event.relatedTarget.id + ' was dropped into ' + event.target.id); + } + +}).on('dropactivate', event => { + event.target.classList.add('drop-activated'); +}); +interact(target).on('up', _event => {}); // fast click + +interact('a[href]').on('tap', event => { + window.location.href = event.currentTarget.href; + event.preventDefault(); +}); +//# sourceMappingURL=interactjs-test.js.map \ No newline at end of file diff --git a/@interactjs/types/interactjs-test.js.map b/@interactjs/types/interactjs-test.js.map new file mode 100644 index 000000000..0ccf4dd76 --- /dev/null +++ b/@interactjs/types/interactjs-test.js.map @@ -0,0 +1,114 @@ +{ + "version": 3, + "sources": [ + "interactjs-test.ts" + ], + "names": [ + "interact", + "document", + "body", + "window", + "draggable", + "inertia", + "modifiers", + "snap", + "targets", + "x", + "y", + "snappers", + "grid", + "offset", + "relativePoints", + "endOnly", + "snapSize", + "width", + "height", + "restrictRect", + "restriction", + "restrict", + "_", + "top", + "left", + "bottom", + "right", + "restrictSize", + "min", + "max", + "restrictEdges", + "inner", + "outer", + "resizable", + "myList", + "querySelector", + "context", + "target", + "maxPerElement", + "manualStart", + "autoScroll", + "lockAxis", + "startAxis", + "margin", + "square", + "axis", + "gesturable", + "element", + "container", + "distance", + "interval", + "handleEl", + "edges", + "invert", + "squareResize", + "dropzone", + "accept", + "overlap", + "checker", + "_dragEvent", + "_event", + "dropped", + "_dropzone", + "dropElement", + "_draggable", + "_draggableElement", + "hasChildNodes", + "dynamicDrop", + "listener", + "event", + "type", + "pageX", + "pageY", + "alert", + "on", + "gesturestart", + "gestureend", + "rect", + "deltaRect", + "JSON", + "stringify", + "listeners", + "start", + "move", + "end", + "onstart", + "onmove", + "onend", + "devTools", + "ignore", + "boxSizing", + "touchAction", + "dropTarget", + "ondrop", + "relatedTarget", + "id", + "classList", + "add", + "location", + "href", + "currentTarget", + "preventDefault" + ], + "mappings": "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", + "sourcesContent": [ + "// eslint-disable-next-line node/no-extraneous-import\nimport interact from '@interactjs/interactjs/index'\n\n// Interactables\ninteract(document.body)\ninteract(document)\ninteract(window)\n\ninteract('.drag-and-resize')\n .draggable({\n inertia: true,\n modifiers: [\n interact.modifiers.snap({\n targets: [\n { x: 100, y: 200 },\n (x: number, y: number) => ({ x: x % 20, y }),\n interact.snappers.grid({ x: 20, y: 0 }),\n ],\n offset: 'startCoords',\n relativePoints: [{ x: 0, y: 1 }],\n endOnly: true,\n }),\n interact.modifiers.snapSize({\n targets: [\n { x: 100, y: 200 },\n (x: number, y: number) => ({ x: x % 20, y }),\n interact.snappers.grid({ width: 100, height: 500 }),\n ],\n endOnly: true,\n }),\n interact.modifiers.restrictRect({\n restriction: 'parent',\n endOnly: true,\n }),\n interact.modifiers.restrict({\n restriction: _ => ({ top: 0, left: 0, bottom: 1, right: 1 }),\n }),\n interact.modifiers.restrict({\n restriction: _ => document.body,\n }),\n interact.modifiers.restrictSize({\n min: document.body,\n max: 'parent',\n }),\n interact.modifiers.restrictEdges({\n inner: document.body,\n outer: 'parent',\n }),\n ],\n })\n .resizable({\n inertia: true,\n })\n\n// Selector context\nconst myList: HTMLElement | SVGElement = document.querySelector('#my-list')\n\ninteract('li', {\n context: myList,\n})\n .draggable({ /* ... */ })\n\n// Action options\nconst target = 'li'\ninteract(target)\n .draggable({\n max : 1,\n maxPerElement: 2,\n manualStart : true,\n modifiers : [],\n inertia : {/* ... */},\n autoScroll : {/* ... */},\n\n lockAxis : 'x' || 'y' || 'start',\n startAxis : 'x' || 'y',\n })\n .resizable({\n max : 1,\n maxPerElement: 2,\n manualStart : true,\n modifiers : [],\n inertia : {/* ... */},\n autoScroll : {/* ... */},\n margin : 50,\n\n square : true || false,\n axis : 'x' || 'y',\n })\n .gesturable({\n max : 1,\n maxPerElement: 2,\n manualStart : true,\n modifiers : [],\n })\n\n// autoscroll\nconst element = 'li'\ninteract(element)\n .draggable({\n autoScroll: true,\n })\n .resizable({\n autoScroll: {\n container: document.body,\n margin: 50,\n distance: 5,\n interval: 10,\n },\n })\n\n// axis\ninteract(target).draggable({\n startAxis: 'x',\n lockAxis: 'y',\n}).draggable({\n startAxis: 'xy',\n lockAxis: 'x',\n})\n\ninteract(target).resizable({\n axis: 'x',\n})\n\nconst handleEl = 'li'\ninteract(target).resizable({\n edges: {\n top : true, // Use pointer coords to check for resize.\n left : false, // Disable resizing from left edge.\n bottom: '.resize-s', // Resize if pointer target matches selector\n right : handleEl, // Resize if pointer target is the given Element\n },\n})\n\n// resize invert\ninteract(target).resizable({\n edges: { bottom: true, right: true },\n invert: 'reposition',\n})\n\n// resize square\ninteract(target).resizable({\n squareResize: true,\n})\n\n// dropzone accept\ninteract(target).dropzone({\n accept: '.drag0, .drag1',\n})\n\n// dropzone overlap\ninteract(target).dropzone({\n overlap: 0.25,\n})\n\n// dropzone checker\ninteract(target).dropzone({\n checker (\n _dragEvent: Interact.Element, // related dragmove or dragend\n _event: Event, // Touch, Pointer or Mouse Event\n dropped: boolean, // bool default checker result\n _dropzone: Interact.Interactable, // dropzone Interactable\n dropElement: Interact.Element, // dropzone elemnt\n _draggable: Interact.Interactable, // draggable Interactable\n _draggableElement: Interact.Element) { // draggable element\n // only allow drops into empty dropzone elements\n return dropped && !dropElement.hasChildNodes()\n },\n})\n\ninteract.dynamicDrop()\ninteract.dynamicDrop(false)\n\n// Events\nfunction listener (event) {\n const { type, pageX, pageY } = event\n alert({ type, pageX, pageY })\n}\n\ninteract(target)\n .on('dragstart', listener)\n .on('dragmove dragend', listener)\n .on(['resizemove', 'resizeend'], listener)\n .on({\n gesturestart: listener,\n gestureend: listener,\n })\n\ninteract.on('resize', (event: Interact.ResizeEvent) => {\n const { rect, deltaRect } = event\n alert(JSON.stringify({ rect, deltaRect }))\n})\n\ninteract(target).resizable({\n listeners: [\n { start: listener, move: listener },\n ],\n})\n\ninteract(target).draggable({\n listeners: { start: listener, end: listener },\n})\n\ninteract(target).draggable({\n onstart: listener,\n onmove: listener,\n onend: listener,\n})\n\ninteract.on(['dragmove', 'resizestart'], listener)\n\n// devTools options\ninteract(target).devTools({\n ignore: { boxSizing: true, touchAction: true },\n})\n\nconst dropTarget = 'div'\n// Drop Events\ninteract(dropTarget)\n .dropzone({\n ondrop (event) {\n alert(event.relatedTarget.id +\n ' was dropped into ' +\n event.target.id)\n },\n })\n .on('dropactivate', event => {\n event.target.classList.add('drop-activated')\n })\n\ninteract(target).on('up', _event => {})\n\n// fast click\ninteract('a[href]').on('tap', event => {\n window.location.href = event.currentTarget.href\n\n event.preventDefault()\n})\n" + ] +} \ No newline at end of file diff --git a/@interactjs/types/interactjs-test.min.js b/@interactjs/types/interactjs-test.min.js new file mode 100644 index 000000000..7266b5725 --- /dev/null +++ b/@interactjs/types/interactjs-test.min.js @@ -0,0 +1,2 @@ +import e from"../interactjs/index.min.js";e(document.body),e(document),e(window),e(".drag-and-resize").draggable({inertia:!0,modifiers:[e.modifiers.snap({targets:[{x:100,y:200},(e,r)=>({x:e%20,y:r}),e.snappers.grid({x:20,y:0})],offset:"startCoords",relativePoints:[{x:0,y:1}],endOnly:!0}),e.modifiers.snapSize({targets:[{x:100,y:200},(e,r)=>({x:e%20,y:r}),e.snappers.grid({width:100,height:500})],endOnly:!0}),e.modifiers.restrictRect({restriction:"parent",endOnly:!0}),e.modifiers.restrict({restriction(e){return{top:0,left:0,bottom:1,right:1}}}),e.modifiers.restrict({restriction(e){return document.body}}),e.modifiers.restrictSize({min:document.body,max:"parent"}),e.modifiers.restrictEdges({inner:document.body,outer:"parent"})]}).resizable({inertia:!0}),e("li",{context:document.querySelector("#my-list")}).draggable({});e("li").draggable({max:1,maxPerElement:2,manualStart:!0,modifiers:[],inertia:{},autoScroll:{},lockAxis:"x",startAxis:"x"}).resizable({max:1,maxPerElement:2,manualStart:!0,modifiers:[],inertia:{},autoScroll:{},margin:50,square:!0,axis:"x"}).gesturable({max:1,maxPerElement:2,manualStart:!0,modifiers:[]});e("li").draggable({autoScroll:!0}).resizable({autoScroll:{container:document.body,margin:50,distance:5,interval:10}}),e("li").draggable({startAxis:"x",lockAxis:"y"}).draggable({startAxis:"xy",lockAxis:"x"}),e("li").resizable({axis:"x"});function r(e){const{type:r,pageX:t,pageY:i}=e;alert({type:r,pageX:t,pageY:i})}e("li").resizable({edges:{top:!0,left:!1,bottom:".resize-s",right:"li"}}),e("li").resizable({edges:{bottom:!0,right:!0},invert:"reposition"}),e("li").resizable({squareResize:!0}),e("li").dropzone({accept:".drag0, .drag1"}),e("li").dropzone({overlap:.25}),e("li").dropzone({checker:(e,r,t,i,a,o,n)=>t&&!a.hasChildNodes()}),e.dynamicDrop(),e.dynamicDrop(!1),e("li").on("dragstart",r).on("dragmove dragend",r).on(["resizemove","resizeend"],r).on({gesturestart:r,gestureend:r}),e.on("resize",e=>{const{rect:r,deltaRect:t}=e;alert(JSON.stringify({rect:r,deltaRect:t}))}),e("li").resizable({listeners:[{start:r,move:r}]}),e("li").draggable({listeners:{start:r,end:r}}),e("li").draggable({onstart:r,onmove:r,onend:r}),e.on(["dragmove","resizestart"],r),e("li").devTools({ignore:{boxSizing:!0,touchAction:!0}});e("div").dropzone({ondrop(e){alert(e.relatedTarget.id+" was dropped into "+e.target.id)}}).on("dropactivate",e=>{e.target.classList.add("drop-activated")}),e("li").on("up",e=>{}),e("a[href]").on("tap",e=>{window.location.href=e.currentTarget.href,e.preventDefault()}); +//# sourceMappingURL=interactjs-test.min.js.map \ No newline at end of file diff --git a/@interactjs/types/interactjs-test.min.js.map b/@interactjs/types/interactjs-test.min.js.map new file mode 100644 index 000000000..c6124c6dd --- /dev/null +++ b/@interactjs/types/interactjs-test.min.js.map @@ -0,0 +1,110 @@ +{ + "version": 3, + "sources": [ + "interactjs-test.ts" + ], + "names": [ + "interact", + "document", + "body", + "window", + "draggable", + "inertia", + "modifiers", + "snap", + "targets", + "x", + "y", + "snappers", + "grid", + "offset", + "relativePoints", + "endOnly", + "snapSize", + "width", + "height", + "restrictRect", + "restriction", + "restrict", + "_", + "top", + "left", + "bottom", + "right", + "restrictSize", + "min", + "max", + "restrictEdges", + "inner", + "outer", + "resizable", + "context", + "querySelector", + "maxPerElement", + "manualStart", + "autoScroll", + "lockAxis", + "startAxis", + "margin", + "square", + "axis", + "gesturable", + "container", + "distance", + "interval", + "listener", + "event", + "type", + "pageX", + "pageY", + "alert", + "edges", + "invert", + "squareResize", + "dropzone", + "accept", + "overlap", + "checker", + "_dragEvent", + "_event", + "dropped", + "_dropzone", + "dropElement", + "_draggable", + "_draggableElement", + "hasChildNodes", + "dynamicDrop", + "on", + "gesturestart", + "gestureend", + "rect", + "deltaRect", + "JSON", + "stringify", + "listeners", + "start", + "move", + "end", + "onstart", + "onmove", + "onend", + "devTools", + "ignore", + "boxSizing", + "touchAction", + "ondrop", + "relatedTarget", + "id", + "target", + "classList", + "add", + "location", + "href", + "currentTarget", + "preventDefault" + ], + "mappings": "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", + "sourcesContent": [ + "// eslint-disable-next-line node/no-extraneous-import\nimport interact from '@interactjs/interactjs/index'\n\n// Interactables\ninteract(document.body)\ninteract(document)\ninteract(window)\n\ninteract('.drag-and-resize')\n .draggable({\n inertia: true,\n modifiers: [\n interact.modifiers.snap({\n targets: [\n { x: 100, y: 200 },\n (x: number, y: number) => ({ x: x % 20, y }),\n interact.snappers.grid({ x: 20, y: 0 }),\n ],\n offset: 'startCoords',\n relativePoints: [{ x: 0, y: 1 }],\n endOnly: true,\n }),\n interact.modifiers.snapSize({\n targets: [\n { x: 100, y: 200 },\n (x: number, y: number) => ({ x: x % 20, y }),\n interact.snappers.grid({ width: 100, height: 500 }),\n ],\n endOnly: true,\n }),\n interact.modifiers.restrictRect({\n restriction: 'parent',\n endOnly: true,\n }),\n interact.modifiers.restrict({\n restriction: _ => ({ top: 0, left: 0, bottom: 1, right: 1 }),\n }),\n interact.modifiers.restrict({\n restriction: _ => document.body,\n }),\n interact.modifiers.restrictSize({\n min: document.body,\n max: 'parent',\n }),\n interact.modifiers.restrictEdges({\n inner: document.body,\n outer: 'parent',\n }),\n ],\n })\n .resizable({\n inertia: true,\n })\n\n// Selector context\nconst myList: HTMLElement | SVGElement = document.querySelector('#my-list')\n\ninteract('li', {\n context: myList,\n})\n .draggable({ /* ... */ })\n\n// Action options\nconst target = 'li'\ninteract(target)\n .draggable({\n max : 1,\n maxPerElement: 2,\n manualStart : true,\n modifiers : [],\n inertia : {/* ... */},\n autoScroll : {/* ... */},\n\n lockAxis : 'x' || 'y' || 'start',\n startAxis : 'x' || 'y',\n })\n .resizable({\n max : 1,\n maxPerElement: 2,\n manualStart : true,\n modifiers : [],\n inertia : {/* ... */},\n autoScroll : {/* ... */},\n margin : 50,\n\n square : true || false,\n axis : 'x' || 'y',\n })\n .gesturable({\n max : 1,\n maxPerElement: 2,\n manualStart : true,\n modifiers : [],\n })\n\n// autoscroll\nconst element = 'li'\ninteract(element)\n .draggable({\n autoScroll: true,\n })\n .resizable({\n autoScroll: {\n container: document.body,\n margin: 50,\n distance: 5,\n interval: 10,\n },\n })\n\n// axis\ninteract(target).draggable({\n startAxis: 'x',\n lockAxis: 'y',\n}).draggable({\n startAxis: 'xy',\n lockAxis: 'x',\n})\n\ninteract(target).resizable({\n axis: 'x',\n})\n\nconst handleEl = 'li'\ninteract(target).resizable({\n edges: {\n top : true, // Use pointer coords to check for resize.\n left : false, // Disable resizing from left edge.\n bottom: '.resize-s', // Resize if pointer target matches selector\n right : handleEl, // Resize if pointer target is the given Element\n },\n})\n\n// resize invert\ninteract(target).resizable({\n edges: { bottom: true, right: true },\n invert: 'reposition',\n})\n\n// resize square\ninteract(target).resizable({\n squareResize: true,\n})\n\n// dropzone accept\ninteract(target).dropzone({\n accept: '.drag0, .drag1',\n})\n\n// dropzone overlap\ninteract(target).dropzone({\n overlap: 0.25,\n})\n\n// dropzone checker\ninteract(target).dropzone({\n checker (\n _dragEvent: Interact.Element, // related dragmove or dragend\n _event: Event, // Touch, Pointer or Mouse Event\n dropped: boolean, // bool default checker result\n _dropzone: Interact.Interactable, // dropzone Interactable\n dropElement: Interact.Element, // dropzone elemnt\n _draggable: Interact.Interactable, // draggable Interactable\n _draggableElement: Interact.Element) { // draggable element\n // only allow drops into empty dropzone elements\n return dropped && !dropElement.hasChildNodes()\n },\n})\n\ninteract.dynamicDrop()\ninteract.dynamicDrop(false)\n\n// Events\nfunction listener (event) {\n const { type, pageX, pageY } = event\n alert({ type, pageX, pageY })\n}\n\ninteract(target)\n .on('dragstart', listener)\n .on('dragmove dragend', listener)\n .on(['resizemove', 'resizeend'], listener)\n .on({\n gesturestart: listener,\n gestureend: listener,\n })\n\ninteract.on('resize', (event: Interact.ResizeEvent) => {\n const { rect, deltaRect } = event\n alert(JSON.stringify({ rect, deltaRect }))\n})\n\ninteract(target).resizable({\n listeners: [\n { start: listener, move: listener },\n ],\n})\n\ninteract(target).draggable({\n listeners: { start: listener, end: listener },\n})\n\ninteract(target).draggable({\n onstart: listener,\n onmove: listener,\n onend: listener,\n})\n\ninteract.on(['dragmove', 'resizestart'], listener)\n\n// devTools options\ninteract(target).devTools({\n ignore: { boxSizing: true, touchAction: true },\n})\n\nconst dropTarget = 'div'\n// Drop Events\ninteract(dropTarget)\n .dropzone({\n ondrop (event) {\n alert(event.relatedTarget.id +\n ' was dropped into ' +\n event.target.id)\n },\n })\n .on('dropactivate', event => {\n event.target.classList.add('drop-activated')\n })\n\ninteract(target).on('up', _event => {})\n\n// fast click\ninteract('a[href]').on('tap', event => {\n window.location.href = event.currentTarget.href\n\n event.preventDefault()\n})\n" + ] +} \ No newline at end of file diff --git a/@interactjs/types/types.spec.d.ts b/@interactjs/types/types.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/types/types.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/utils/.npmignore b/@interactjs/utils/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/@interactjs/utils/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/@interactjs/utils/LICENSE b/@interactjs/utils/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/@interactjs/utils/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@interactjs/utils/arr.d.ts b/@interactjs/utils/arr.d.ts new file mode 100644 index 000000000..b528f79b5 --- /dev/null +++ b/@interactjs/utils/arr.d.ts @@ -0,0 +1,8 @@ +declare type Filter = (element: T, index: number, array: T[]) => boolean; +export declare const contains: (array: T[], target: T) => boolean; +export declare const remove: (array: T[], target: T) => T[]; +export declare const merge: (target: (T | U)[], source: U[]) => (T | U)[]; +export declare const from: (source: ArrayLike) => T[]; +export declare const findIndex: (array: T[], func: Filter) => number; +export declare const find: (array: T[], func: Filter) => T; +export {}; diff --git a/@interactjs/utils/arr.js b/@interactjs/utils/arr.js new file mode 100644 index 000000000..2e43ccb5a --- /dev/null +++ b/@interactjs/utils/arr.js @@ -0,0 +1,21 @@ +export const contains = (array, target) => array.indexOf(target) !== -1; +export const remove = (array, target) => array.splice(array.indexOf(target), 1); +export const merge = (target, source) => { + for (const item of source) { + target.push(item); + } + + return target; +}; +export const from = source => merge([], source); +export const findIndex = (array, func) => { + for (let i = 0; i < array.length; i++) { + if (func(array[i], i, array)) { + return i; + } + } + + return -1; +}; +export const find = (array, func) => array[findIndex(array, func)]; +//# sourceMappingURL=arr.js.map \ No newline at end of file diff --git a/@interactjs/utils/arr.js.map b/@interactjs/utils/arr.js.map new file mode 100644 index 000000000..060c4420f --- /dev/null +++ b/@interactjs/utils/arr.js.map @@ -0,0 +1,28 @@ +{ + "version": 3, + "sources": [ + "arr.ts" + ], + "names": [ + "contains", + "array", + "target", + "indexOf", + "remove", + "splice", + "merge", + "source", + "item", + "push", + "from", + "findIndex", + "func", + "i", + "length", + "find" + ], + "mappings": "AAEA,OAAO,MAAMA,QAAQ,GAAG,CAAIC,KAAJ,EAAgBC,MAAhB,KAA8BD,KAAK,CAACE,OAAN,CAAcD,MAAd,MAA0B,CAAC,CAA1E;AAEP,OAAO,MAAME,MAAM,GAAG,CAAIH,KAAJ,EAAgBC,MAAhB,KAA8BD,KAAK,CAACI,MAAN,CAAaJ,KAAK,CAACE,OAAN,CAAcD,MAAd,CAAb,EAAoC,CAApC,CAA7C;AAEP,OAAO,MAAMI,KAAK,GAAG,CAAOJ,MAAP,EAA6BK,MAA7B,KAA6C;AAChE,OAAK,MAAMC,IAAX,IAAmBD,MAAnB,EAA2B;AACzBL,IAAAA,MAAM,CAACO,IAAP,CAAYD,IAAZ;AACD;;AAED,SAAON,MAAP;AACD,CANM;AAQP,OAAO,MAAMQ,IAAI,GAAaH,MAAV,IAAmCD,KAAK,CAAC,EAAD,EAAYC,MAAZ,CAArD;AAEP,OAAO,MAAMI,SAAS,GAAG,CAAIV,KAAJ,EAAgBW,IAAhB,KAAoC;AAC3D,OAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGZ,KAAK,CAACa,MAA1B,EAAkCD,CAAC,EAAnC,EAAuC;AACrC,QAAID,IAAI,CAACX,KAAK,CAACY,CAAD,CAAN,EAAWA,CAAX,EAAcZ,KAAd,CAAR,EAA8B;AAC5B,aAAOY,CAAP;AACD;AACF;;AAED,SAAO,CAAC,CAAR;AACD,CARM;AAUP,OAAO,MAAME,IAAI,GAAG,CAAUd,KAAV,EAAsBW,IAAtB,KAA0CX,KAAK,CAACU,SAAS,CAACV,KAAD,EAAQW,IAAR,CAAV,CAA5D", + "sourcesContent": [ + "type Filter = (element: T, index: number, array: T[]) => boolean\n\nexport const contains = (array: T[], target: T) => array.indexOf(target) !== -1\n\nexport const remove = (array: T[], target: T) => array.splice(array.indexOf(target), 1)\n\nexport const merge = (target: Array, source: U[]) => {\n for (const item of source) {\n target.push(item)\n }\n\n return target\n}\n\nexport const from = (source: ArrayLike) => merge([] as T[], source as T[])\n\nexport const findIndex = (array: T[], func: Filter) => {\n for (let i = 0; i < array.length; i++) {\n if (func(array[i], i, array)) {\n return i\n }\n }\n\n return -1\n}\n\nexport const find = (array: T[], func: Filter) => array[findIndex(array, func)]\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/arr.min.js b/@interactjs/utils/arr.min.js new file mode 100644 index 000000000..5a0d2a0ec --- /dev/null +++ b/@interactjs/utils/arr.min.js @@ -0,0 +1,2 @@ +export const contains=(e,n)=>-1!==e.indexOf(n);export const remove=(e,n)=>e.splice(e.indexOf(n),1);export const merge=(e,n)=>{for(const o of n)e.push(o);return e};export const from=e=>merge([],e);export const findIndex=(e,n)=>{for(let o=0;oe[findIndex(e,n)]; +//# sourceMappingURL=arr.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/arr.min.js.map b/@interactjs/utils/arr.min.js.map new file mode 100644 index 000000000..73e1b7835 --- /dev/null +++ b/@interactjs/utils/arr.min.js.map @@ -0,0 +1,28 @@ +{ + "version": 3, + "sources": [ + "arr.ts" + ], + "names": [ + "contains", + "array", + "target", + "indexOf", + "remove", + "splice", + "merge", + "source", + "item", + "push", + "from", + "findIndex", + "func", + "i", + "length", + "find" + ], + "mappings": "OAEO,MAAMA,SAAW,CAAIC,EAAYC,KAAyC,IAA3BD,EAAME,QAAQD,UAE7D,MAAME,OAAS,CAAIH,EAAYC,IAAcD,EAAMI,OAAOJ,EAAME,QAAQD,GAAS,UAEjF,MAAMI,MAAQ,CAAOJ,EAAsBK,KAChD,IAAK,MAAMC,KAAQD,EACjBL,EAAOO,KAAKD,GAGd,OAAON,UAGF,MAAMQ,KAAiBH,GAAyBD,MAAM,GAAWC,UAEjE,MAAMI,UAAY,CAAIV,EAAYW,KACvC,IAAK,IAAIC,EAAI,EAAGA,EAAIZ,EAAMa,OAAQD,IAChC,GAAID,EAAKX,EAAMY,GAAIA,EAAGZ,GACpB,OAAOY,EAIX,OAAQ,UAGH,MAAME,KAAO,CAAUd,EAAYW,IAAoBX,EAAMU,UAAUV,EAAOW", + "sourcesContent": [ + "type Filter = (element: T, index: number, array: T[]) => boolean\n\nexport const contains = (array: T[], target: T) => array.indexOf(target) !== -1\n\nexport const remove = (array: T[], target: T) => array.splice(array.indexOf(target), 1)\n\nexport const merge = (target: Array, source: U[]) => {\n for (const item of source) {\n target.push(item)\n }\n\n return target\n}\n\nexport const from = (source: ArrayLike) => merge([] as T[], source as T[])\n\nexport const findIndex = (array: T[], func: Filter) => {\n for (let i = 0; i < array.length; i++) {\n if (func(array[i], i, array)) {\n return i\n }\n }\n\n return -1\n}\n\nexport const find = (array: T[], func: Filter) => array[findIndex(array, func)]\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/browser.d.ts b/@interactjs/utils/browser.d.ts new file mode 100644 index 000000000..95b2654d1 --- /dev/null +++ b/@interactjs/utils/browser.d.ts @@ -0,0 +1,21 @@ +declare const browser: { + init: typeof init; + supportsTouch: boolean; + supportsPointerEvent: boolean; + isIOS7: boolean; + isIOS: boolean; + isIe9: boolean; + isOperaMobile: boolean; + prefixedMatchesSelector: string; + pEventTypes: { + up: string; + down: string; + over: string; + out: string; + move: string; + cancel: string; + }; + wheelEvent: string; +}; +declare function init(window: any): void; +export default browser; diff --git a/@interactjs/utils/browser.js b/@interactjs/utils/browser.js new file mode 100644 index 000000000..9cfb27f8c --- /dev/null +++ b/@interactjs/utils/browser.js @@ -0,0 +1,52 @@ +import domObjects from "./domObjects.js"; +import * as is from "./is.js"; +import win from "./window.js"; +const browser = { + init, + supportsTouch: null, + supportsPointerEvent: null, + isIOS7: null, + isIOS: null, + isIe9: null, + isOperaMobile: null, + prefixedMatchesSelector: null, + pEventTypes: null, + wheelEvent: null +}; + +function init(window) { + const Element = domObjects.Element; + const navigator = win.window.navigator; // Does the browser support touch input? + + browser.supportsTouch = 'ontouchstart' in window || is.func(window.DocumentTouch) && domObjects.document instanceof window.DocumentTouch; // Does the browser support PointerEvents + + browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!domObjects.PointerEvent; + browser.isIOS = /iP(hone|od|ad)/.test(navigator.platform); // scrolling doesn't change the result of getClientRects on iOS 7 + + browser.isIOS7 = /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\d]/.test(navigator.appVersion); + browser.isIe9 = /MSIE 9/.test(navigator.userAgent); // Opera Mobile must be handled differently + + browser.isOperaMobile = navigator.appName === 'Opera' && browser.supportsTouch && /Presto/.test(navigator.userAgent); // prefix matchesSelector + + browser.prefixedMatchesSelector = 'matches' in Element.prototype ? 'matches' : 'webkitMatchesSelector' in Element.prototype ? 'webkitMatchesSelector' : 'mozMatchesSelector' in Element.prototype ? 'mozMatchesSelector' : 'oMatchesSelector' in Element.prototype ? 'oMatchesSelector' : 'msMatchesSelector'; + browser.pEventTypes = browser.supportsPointerEvent ? domObjects.PointerEvent === window.MSPointerEvent ? { + up: 'MSPointerUp', + down: 'MSPointerDown', + over: 'mouseover', + out: 'mouseout', + move: 'MSPointerMove', + cancel: 'MSPointerCancel' + } : { + up: 'pointerup', + down: 'pointerdown', + over: 'pointerover', + out: 'pointerout', + move: 'pointermove', + cancel: 'pointercancel' + } : null; // because Webkit and Opera still use 'mousewheel' event type + + browser.wheelEvent = 'onmousewheel' in domObjects.document ? 'mousewheel' : 'wheel'; +} + +export default browser; +//# sourceMappingURL=browser.js.map \ No newline at end of file diff --git a/@interactjs/utils/browser.js.map b/@interactjs/utils/browser.js.map new file mode 100644 index 000000000..c5b1d4141 --- /dev/null +++ b/@interactjs/utils/browser.js.map @@ -0,0 +1,47 @@ +{ + "version": 3, + "sources": [ + "browser.ts" + ], + "names": [ + "domObjects", + "is", + "win", + "browser", + "init", + "supportsTouch", + "supportsPointerEvent", + "isIOS7", + "isIOS", + "isIe9", + "isOperaMobile", + "prefixedMatchesSelector", + "pEventTypes", + "wheelEvent", + "window", + "Element", + "navigator", + "func", + "DocumentTouch", + "document", + "pointerEnabled", + "PointerEvent", + "test", + "platform", + "appVersion", + "userAgent", + "appName", + "prototype", + "MSPointerEvent", + "up", + "down", + "over", + "out", + "move", + "cancel" + ], + "mappings": "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", + "sourcesContent": [ + "import domObjects from './domObjects'\nimport * as is from './is'\nimport win from './window'\n\nconst browser = {\n init,\n supportsTouch: null as boolean,\n supportsPointerEvent: null as boolean,\n isIOS7: null as boolean,\n isIOS: null as boolean,\n isIe9: null as boolean,\n isOperaMobile: null as boolean,\n prefixedMatchesSelector: null as string,\n pEventTypes: null as {\n up: string\n down: string\n over: string\n out: string\n move: string\n cancel: string\n },\n wheelEvent: null as string,\n}\n\nfunction init (window: any) {\n const Element = domObjects.Element\n const navigator = win.window.navigator\n\n // Does the browser support touch input?\n browser.supportsTouch = ('ontouchstart' in window) ||\n (is.func(window.DocumentTouch) && domObjects.document instanceof window.DocumentTouch)\n\n // Does the browser support PointerEvents\n browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!domObjects.PointerEvent\n\n browser.isIOS = (/iP(hone|od|ad)/.test(navigator.platform))\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n browser.isIOS7 = (/iP(hone|od|ad)/.test(navigator.platform) &&\n /OS 7[^\\d]/.test(navigator.appVersion))\n\n browser.isIe9 = /MSIE 9/.test(navigator.userAgent)\n\n // Opera Mobile must be handled differently\n browser.isOperaMobile = (navigator.appName === 'Opera' &&\n browser.supportsTouch &&\n /Presto/.test(navigator.userAgent))\n\n // prefix matchesSelector\n browser.prefixedMatchesSelector = 'matches' in Element.prototype\n ? 'matches'\n : 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector'\n : 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector'\n : 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector'\n : 'msMatchesSelector'\n\n browser.pEventTypes = (browser.supportsPointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null)\n\n // because Webkit and Opera still use 'mousewheel' event type\n browser.wheelEvent = 'onmousewheel' in domObjects.document ? 'mousewheel' : 'wheel'\n}\n\nexport default browser\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/browser.min.js b/@interactjs/utils/browser.min.js new file mode 100644 index 000000000..ebbdd60ef --- /dev/null +++ b/@interactjs/utils/browser.min.js @@ -0,0 +1,2 @@ +import e from"./domObjects.min.js";import*as t from"./is.min.js";import o from"./window.min.js";const n={init(r){const s=e.Element,i=o.window.navigator;n.supportsTouch="ontouchstart"in r||t.func(r.DocumentTouch)&&e.document instanceof r.DocumentTouch,n.supportsPointerEvent=!1!==i.pointerEnabled&&!!e.PointerEvent,n.isIOS=/iP(hone|od|ad)/.test(i.platform),n.isIOS7=/iP(hone|od|ad)/.test(i.platform)&&/OS 7[^\d]/.test(i.appVersion),n.isIe9=/MSIE 9/.test(i.userAgent),n.isOperaMobile="Opera"===i.appName&&n.supportsTouch&&/Presto/.test(i.userAgent),n.prefixedMatchesSelector="matches"in s.prototype?"matches":"webkitMatchesSelector"in s.prototype?"webkitMatchesSelector":"mozMatchesSelector"in s.prototype?"mozMatchesSelector":"oMatchesSelector"in s.prototype?"oMatchesSelector":"msMatchesSelector",n.pEventTypes=n.supportsPointerEvent?e.PointerEvent===r.MSPointerEvent?{up:"MSPointerUp",down:"MSPointerDown",over:"mouseover",out:"mouseout",move:"MSPointerMove",cancel:"MSPointerCancel"}:{up:"pointerup",down:"pointerdown",over:"pointerover",out:"pointerout",move:"pointermove",cancel:"pointercancel"}:null,n.wheelEvent="onmousewheel"in e.document?"mousewheel":"wheel"},supportsTouch:null,supportsPointerEvent:null,isIOS7:null,isIOS:null,isIe9:null,isOperaMobile:null,prefixedMatchesSelector:null,pEventTypes:null,wheelEvent:null};export default n; +//# sourceMappingURL=browser.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/browser.min.js.map b/@interactjs/utils/browser.min.js.map new file mode 100644 index 000000000..ebacf26df --- /dev/null +++ b/@interactjs/utils/browser.min.js.map @@ -0,0 +1,47 @@ +{ + "version": 3, + "sources": [ + "browser.ts" + ], + "names": [ + "domObjects", + "is", + "win", + "browser", + "init", + "window", + "Element", + "navigator", + "supportsTouch", + "func", + "DocumentTouch", + "document", + "supportsPointerEvent", + "pointerEnabled", + "PointerEvent", + "isIOS", + "test", + "platform", + "isIOS7", + "appVersion", + "isIe9", + "userAgent", + "isOperaMobile", + "appName", + "prefixedMatchesSelector", + "prototype", + "pEventTypes", + "MSPointerEvent", + "up", + "down", + "over", + "out", + "move", + "cancel", + "wheelEvent" + ], + "mappings": "OAAOA,MAAgB,gCACXC,MAAQ,qBACbC,MAAS,kBAEhB,MAAMC,EAAU,CACdC,KAmBaC,GACb,MAAMC,EAAUN,EAAWM,QACrBC,EAAaL,EAAIG,OAAOE,UAG9BJ,EAAQK,cAAiB,iBAAkBH,GACxCJ,EAAGQ,KAAKJ,EAAOK,gBAAkBV,EAAWW,oBAAoBN,EAAOK,cAG1EP,EAAQS,sBAAoD,IAA7BL,EAAUM,kBAA8Bb,EAAWc,aAElFX,EAAQY,MAAS,iBAAiBC,KAAKT,EAAUU,UAGjDd,EAAQe,OAAU,iBAAiBF,KAAKT,EAAUU,WACzC,YAAYD,KAAKT,EAAUY,YAEpChB,EAAQiB,MAAQ,SAASJ,KAAKT,EAAUc,WAGxClB,EAAQmB,cAAuC,UAAtBf,EAAUgB,SACjCpB,EAAQK,eACR,SAASQ,KAAKT,EAAUc,WAG1BlB,EAAQqB,wBAA0B,YAAalB,EAAQmB,UACnD,UACA,0BAA2BnB,EAAQmB,UACjC,wBACA,uBAAwBnB,EAAQmB,UAC9B,qBACA,qBAAsBnB,EAAQmB,UAC5B,mBACA,oBAEVtB,EAAQuB,YAAevB,EAAQS,qBAC1BZ,EAAWc,eAAiBT,EAAOsB,eAClC,CACAC,GAAQ,cACRC,KAAQ,gBACRC,KAAQ,YACRC,IAAQ,WACRC,KAAQ,gBACRC,OAAQ,mBAER,CACAL,GAAQ,YACRC,KAAQ,cACRC,KAAQ,cACRC,IAAQ,aACRC,KAAQ,cACRC,OAAQ,iBAEV,KAGJ9B,EAAQ+B,WAAa,iBAAkBlC,EAAWW,SAAW,aAAe,SA1E5EH,cAAe,KACfI,qBAAsB,KACtBM,OAAQ,KACRH,MAAO,KACPK,MAAO,KACPE,cAAe,KACfE,wBAAyB,KACzBE,YAAa,KAQbQ,WAAY,qBA8DC/B", + "sourcesContent": [ + "import domObjects from './domObjects'\nimport * as is from './is'\nimport win from './window'\n\nconst browser = {\n init,\n supportsTouch: null as boolean,\n supportsPointerEvent: null as boolean,\n isIOS7: null as boolean,\n isIOS: null as boolean,\n isIe9: null as boolean,\n isOperaMobile: null as boolean,\n prefixedMatchesSelector: null as string,\n pEventTypes: null as {\n up: string\n down: string\n over: string\n out: string\n move: string\n cancel: string\n },\n wheelEvent: null as string,\n}\n\nfunction init (window: any) {\n const Element = domObjects.Element\n const navigator = win.window.navigator\n\n // Does the browser support touch input?\n browser.supportsTouch = ('ontouchstart' in window) ||\n (is.func(window.DocumentTouch) && domObjects.document instanceof window.DocumentTouch)\n\n // Does the browser support PointerEvents\n browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!domObjects.PointerEvent\n\n browser.isIOS = (/iP(hone|od|ad)/.test(navigator.platform))\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n browser.isIOS7 = (/iP(hone|od|ad)/.test(navigator.platform) &&\n /OS 7[^\\d]/.test(navigator.appVersion))\n\n browser.isIe9 = /MSIE 9/.test(navigator.userAgent)\n\n // Opera Mobile must be handled differently\n browser.isOperaMobile = (navigator.appName === 'Opera' &&\n browser.supportsTouch &&\n /Presto/.test(navigator.userAgent))\n\n // prefix matchesSelector\n browser.prefixedMatchesSelector = 'matches' in Element.prototype\n ? 'matches'\n : 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector'\n : 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector'\n : 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector'\n : 'msMatchesSelector'\n\n browser.pEventTypes = (browser.supportsPointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null)\n\n // because Webkit and Opera still use 'mousewheel' event type\n browser.wheelEvent = 'onmousewheel' in domObjects.document ? 'mousewheel' : 'wheel'\n}\n\nexport default browser\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/clone.d.ts b/@interactjs/utils/clone.d.ts new file mode 100644 index 000000000..08b411b09 --- /dev/null +++ b/@interactjs/utils/clone.d.ts @@ -0,0 +1 @@ +export default function clone(source: T): Partial; diff --git a/@interactjs/utils/clone.js b/@interactjs/utils/clone.js new file mode 100644 index 000000000..2458c9a92 --- /dev/null +++ b/@interactjs/utils/clone.js @@ -0,0 +1,21 @@ +import * as arr from "./arr.js"; +import * as is from "./is.js"; // tslint:disable-next-line ban-types + +export default function clone(source) { + const dest = {}; + + for (const prop in source) { + const value = source[prop]; + + if (is.plainObject(value)) { + dest[prop] = clone(value); + } else if (is.array(value)) { + dest[prop] = arr.from(value); + } else { + dest[prop] = value; + } + } + + return dest; +} +//# sourceMappingURL=clone.js.map \ No newline at end of file diff --git a/@interactjs/utils/clone.js.map b/@interactjs/utils/clone.js.map new file mode 100644 index 000000000..2e08ef6fc --- /dev/null +++ b/@interactjs/utils/clone.js.map @@ -0,0 +1,22 @@ +{ + "version": 3, + "sources": [ + "clone.ts" + ], + "names": [ + "arr", + "is", + "clone", + "source", + "dest", + "prop", + "value", + "plainObject", + "array", + "from" + ], + "mappings": "AAAA,OAAO,KAAKA,GAAZ,MAAqB,UAArB;AACA,OAAO,KAAKC,EAAZ,MAAoB,SAApB,C,CAEA;;AACA,eAAe,SAASC,KAAT,CAAkCC,MAAlC,EAAyD;AACtE,QAAMC,IAAI,GAAG,EAAb;;AAEA,OAAK,MAAMC,IAAX,IAAmBF,MAAnB,EAA2B;AACzB,UAAMG,KAAK,GAAGH,MAAM,CAACE,IAAD,CAApB;;AAEA,QAAIJ,EAAE,CAACM,WAAH,CAAeD,KAAf,CAAJ,EAA2B;AACzBF,MAAAA,IAAI,CAACC,IAAD,CAAJ,GAAaH,KAAK,CAACI,KAAD,CAAlB;AACD,KAFD,MAGK,IAAIL,EAAE,CAACO,KAAH,CAASF,KAAT,CAAJ,EAAqB;AACxBF,MAAAA,IAAI,CAACC,IAAD,CAAJ,GAAaL,GAAG,CAACS,IAAJ,CAASH,KAAT,CAAb;AACD,KAFI,MAGA;AACHF,MAAAA,IAAI,CAACC,IAAD,CAAJ,GAAaC,KAAb;AACD;AACF;;AAED,SAAOF,IAAP;AACD", + "sourcesContent": [ + "import * as arr from './arr'\nimport * as is from './is'\n\n// tslint:disable-next-line ban-types\nexport default function clone (source: T): Partial {\n const dest = {} as Partial\n\n for (const prop in source) {\n const value = source[prop]\n\n if (is.plainObject(value)) {\n dest[prop] = clone(value) as any\n }\n else if (is.array(value)) {\n dest[prop] = arr.from(value) as typeof value\n }\n else {\n dest[prop] = value\n }\n }\n\n return dest\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/clone.min.js b/@interactjs/utils/clone.min.js new file mode 100644 index 000000000..b92211c30 --- /dev/null +++ b/@interactjs/utils/clone.min.js @@ -0,0 +1,2 @@ +import*as r from"./arr.min.js";import*as o from"./is.min.js";export default function n(t){const i={};for(const s in t){const a=t[s];o.plainObject(a)?i[s]=n(a):o.array(a)?i[s]=r.from(a):i[s]=a}return i} +//# sourceMappingURL=clone.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/clone.min.js.map b/@interactjs/utils/clone.min.js.map new file mode 100644 index 000000000..21c1fd3cb --- /dev/null +++ b/@interactjs/utils/clone.min.js.map @@ -0,0 +1,22 @@ +{ + "version": 3, + "sources": [ + "clone.ts" + ], + "names": [ + "arr", + "is", + "clone", + "source", + "dest", + "prop", + "value", + "plainObject", + "array", + "from" + ], + "mappings": "UAAYA,MAAS,yBACTC,MAAQ,6BAGL,SAASC,EAAyBC,GAC/C,MAAMC,EAAO,GAEb,IAAK,MAAMC,KAAQF,EAAQ,CACzB,MAAMG,EAAQH,EAAOE,GAEjBJ,EAAGM,YAAYD,GACjBF,EAAKC,GAAQH,EAAMI,GAEZL,EAAGO,MAAMF,GAChBF,EAAKC,GAAQL,EAAIS,KAAKH,GAGtBF,EAAKC,GAAQC,EAIjB,OAAOF", + "sourcesContent": [ + "import * as arr from './arr'\nimport * as is from './is'\n\n// tslint:disable-next-line ban-types\nexport default function clone (source: T): Partial {\n const dest = {} as Partial\n\n for (const prop in source) {\n const value = source[prop]\n\n if (is.plainObject(value)) {\n dest[prop] = clone(value) as any\n }\n else if (is.array(value)) {\n dest[prop] = arr.from(value) as typeof value\n }\n else {\n dest[prop] = value\n }\n }\n\n return dest\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/domObjects.d.ts b/@interactjs/utils/domObjects.d.ts new file mode 100644 index 000000000..8207499aa --- /dev/null +++ b/@interactjs/utils/domObjects.d.ts @@ -0,0 +1,14 @@ +declare const domObjects: { + init: any; + document: Document; + DocumentFragment: typeof DocumentFragment; + SVGElement: typeof SVGElement; + SVGSVGElement: typeof SVGSVGElement; + SVGElementInstance: any; + Element: typeof Element; + HTMLElement: typeof HTMLElement; + Event: typeof Event; + Touch: typeof Touch; + PointerEvent: typeof PointerEvent; +}; +export default domObjects; diff --git a/@interactjs/utils/domObjects.js b/@interactjs/utils/domObjects.js new file mode 100644 index 000000000..3ad02276b --- /dev/null +++ b/@interactjs/utils/domObjects.js @@ -0,0 +1,32 @@ +const domObjects = { + init, + document: null, + DocumentFragment: null, + SVGElement: null, + SVGSVGElement: null, + SVGElementInstance: null, + Element: null, + HTMLElement: null, + Event: null, + Touch: null, + PointerEvent: null +}; + +function blank() {} + +export default domObjects; + +function init(window) { + const win = window; + domObjects.document = win.document; + domObjects.DocumentFragment = win.DocumentFragment || blank; + domObjects.SVGElement = win.SVGElement || blank; + domObjects.SVGSVGElement = win.SVGSVGElement || blank; + domObjects.SVGElementInstance = win.SVGElementInstance || blank; + domObjects.Element = win.Element || blank; + domObjects.HTMLElement = win.HTMLElement || domObjects.Element; + domObjects.Event = win.Event; + domObjects.Touch = win.Touch || blank; + domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent; +} +//# sourceMappingURL=domObjects.js.map \ No newline at end of file diff --git a/@interactjs/utils/domObjects.js.map b/@interactjs/utils/domObjects.js.map new file mode 100644 index 000000000..9499c2ea5 --- /dev/null +++ b/@interactjs/utils/domObjects.js.map @@ -0,0 +1,28 @@ +{ + "version": 3, + "sources": [ + "domObjects.ts" + ], + "names": [ + "domObjects", + "init", + "document", + "DocumentFragment", + "SVGElement", + "SVGSVGElement", + "SVGElementInstance", + "Element", + "HTMLElement", + "Event", + "Touch", + "PointerEvent", + "blank", + "window", + "win", + "MSPointerEvent" + ], + "mappings": "AAAA,MAAMA,UAYL,GACD;AACEC,EAAAA,IADF;AAEEC,EAAAA,QAAQ,EAAE,IAFZ;AAGEC,EAAAA,gBAAgB,EAAE,IAHpB;AAIEC,EAAAA,UAAU,EAAE,IAJd;AAKEC,EAAAA,aAAa,EAAE,IALjB;AAMEC,EAAAA,kBAAkB,EAAE,IANtB;AAOEC,EAAAA,OAAO,EAAE,IAPX;AAQEC,EAAAA,WAAW,EAAE,IARf;AASEC,EAAAA,KAAK,EAAE,IATT;AAUEC,EAAAA,KAAK,EAAE,IAVT;AAWEC,EAAAA,YAAY,EAAE;AAXhB,CAbA;;AA2BA,SAASC,KAAT,GAAkB,CAAE;;AAEpB,eAAeZ,UAAf;;AAEA,SAASC,IAAT,CAAeY,MAAf,EAA+B;AAC7B,QAAMC,GAAG,GAAGD,MAAZ;AAEAb,EAAAA,UAAU,CAACE,QAAX,GAAgCY,GAAG,CAACZ,QAApC;AACAF,EAAAA,UAAU,CAACG,gBAAX,GAAgCW,GAAG,CAACX,gBAAJ,IAA0BS,KAA1D;AACAZ,EAAAA,UAAU,CAACI,UAAX,GAAgCU,GAAG,CAACV,UAAJ,IAA0BQ,KAA1D;AACAZ,EAAAA,UAAU,CAACK,aAAX,GAAgCS,GAAG,CAACT,aAAJ,IAA0BO,KAA1D;AACAZ,EAAAA,UAAU,CAACM,kBAAX,GAAgCQ,GAAG,CAACR,kBAAJ,IAA0BM,KAA1D;AACAZ,EAAAA,UAAU,CAACO,OAAX,GAAgCO,GAAG,CAACP,OAAJ,IAA0BK,KAA1D;AACAZ,EAAAA,UAAU,CAACQ,WAAX,GAAgCM,GAAG,CAACN,WAAJ,IAA0BR,UAAU,CAACO,OAArE;AAEAP,EAAAA,UAAU,CAACS,KAAX,GAA0BK,GAAG,CAACL,KAA9B;AACAT,EAAAA,UAAU,CAACU,KAAX,GAA0BI,GAAG,CAACJ,KAAJ,IAAaE,KAAvC;AACAZ,EAAAA,UAAU,CAACW,YAAX,GAA2BG,GAAG,CAACH,YAAJ,IAAoBG,GAAG,CAACC,cAAnD;AACD", + "sourcesContent": [ + "const domObjects: {\n init: any\n document: Document\n DocumentFragment: typeof DocumentFragment\n SVGElement: typeof SVGElement\n SVGSVGElement: typeof SVGSVGElement\n SVGElementInstance: any\n Element: typeof Element\n HTMLElement: typeof HTMLElement\n Event: typeof Event\n Touch: typeof Touch\n PointerEvent: typeof PointerEvent\n} =\n{\n init,\n document: null,\n DocumentFragment: null,\n SVGElement: null,\n SVGSVGElement: null,\n SVGElementInstance: null,\n Element: null,\n HTMLElement: null,\n Event: null,\n Touch: null,\n PointerEvent: null,\n}\n\nfunction blank () {}\n\nexport default domObjects\n\nfunction init (window: Window) {\n const win = window as any\n\n domObjects.document = win.document\n domObjects.DocumentFragment = win.DocumentFragment || blank\n domObjects.SVGElement = win.SVGElement || blank\n domObjects.SVGSVGElement = win.SVGSVGElement || blank\n domObjects.SVGElementInstance = win.SVGElementInstance || blank\n domObjects.Element = win.Element || blank\n domObjects.HTMLElement = win.HTMLElement || domObjects.Element\n\n domObjects.Event = win.Event\n domObjects.Touch = win.Touch || blank\n domObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent)\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/domObjects.min.js b/@interactjs/utils/domObjects.min.js new file mode 100644 index 000000000..6bfbed2bc --- /dev/null +++ b/@interactjs/utils/domObjects.min.js @@ -0,0 +1,2 @@ +const e={init(t){const l=t;e.document=l.document,e.DocumentFragment=l.DocumentFragment||n,e.SVGElement=l.SVGElement||n,e.SVGSVGElement=l.SVGSVGElement||n,e.SVGElementInstance=l.SVGElementInstance||n,e.Element=l.Element||n,e.HTMLElement=l.HTMLElement||e.Element,e.Event=l.Event,e.Touch=l.Touch||n,e.PointerEvent=l.PointerEvent||l.MSPointerEvent},document:null,DocumentFragment:null,SVGElement:null,SVGSVGElement:null,SVGElementInstance:null,Element:null,HTMLElement:null,Event:null,Touch:null,PointerEvent:null};function n(){}export default e; +//# sourceMappingURL=domObjects.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/domObjects.min.js.map b/@interactjs/utils/domObjects.min.js.map new file mode 100644 index 000000000..db1278802 --- /dev/null +++ b/@interactjs/utils/domObjects.min.js.map @@ -0,0 +1,28 @@ +{ + "version": 3, + "sources": [ + "domObjects.ts" + ], + "names": [ + "domObjects", + "init", + "window", + "win", + "document", + "DocumentFragment", + "blank", + "SVGElement", + "SVGSVGElement", + "SVGElementInstance", + "Element", + "HTMLElement", + "Event", + "Touch", + "PointerEvent", + "MSPointerEvent" + ], + "mappings": "AAAA,MAAMA,EAaN,CACEC,KAiBaC,GACb,MAAMC,EAAMD,EAEZF,EAAWI,SAAqBD,EAAIC,SACpCJ,EAAWK,iBAAqBF,EAAIE,kBAAsBC,EAC1DN,EAAWO,WAAqBJ,EAAII,YAAsBD,EAC1DN,EAAWQ,cAAqBL,EAAIK,eAAsBF,EAC1DN,EAAWS,mBAAqBN,EAAIM,oBAAsBH,EAC1DN,EAAWU,QAAqBP,EAAIO,SAAsBJ,EAC1DN,EAAWW,YAAqBR,EAAIQ,aAAsBX,EAAWU,QAErEV,EAAWY,MAAeT,EAAIS,MAC9BZ,EAAWa,MAAeV,EAAIU,OAASP,EACvCN,EAAWc,aAAgBX,EAAIW,cAAgBX,EAAIY,gBA7BnDX,SAAU,KACVC,iBAAkB,KAClBE,WAAY,KACZC,cAAe,KACfC,mBAAoB,KACpBC,QAAS,KACTC,YAAa,KACbC,MAAO,KACPC,MAAO,KACPC,aAAc,MAGhB,SAASR,oBAEMN", + "sourcesContent": [ + "const domObjects: {\n init: any\n document: Document\n DocumentFragment: typeof DocumentFragment\n SVGElement: typeof SVGElement\n SVGSVGElement: typeof SVGSVGElement\n SVGElementInstance: any\n Element: typeof Element\n HTMLElement: typeof HTMLElement\n Event: typeof Event\n Touch: typeof Touch\n PointerEvent: typeof PointerEvent\n} =\n{\n init,\n document: null,\n DocumentFragment: null,\n SVGElement: null,\n SVGSVGElement: null,\n SVGElementInstance: null,\n Element: null,\n HTMLElement: null,\n Event: null,\n Touch: null,\n PointerEvent: null,\n}\n\nfunction blank () {}\n\nexport default domObjects\n\nfunction init (window: Window) {\n const win = window as any\n\n domObjects.document = win.document\n domObjects.DocumentFragment = win.DocumentFragment || blank\n domObjects.SVGElement = win.SVGElement || blank\n domObjects.SVGSVGElement = win.SVGSVGElement || blank\n domObjects.SVGElementInstance = win.SVGElementInstance || blank\n domObjects.Element = win.Element || blank\n domObjects.HTMLElement = win.HTMLElement || domObjects.Element\n\n domObjects.Event = win.Event\n domObjects.Touch = win.Touch || blank\n domObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent)\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/domUtils.d.ts b/@interactjs/utils/domUtils.d.ts new file mode 100644 index 000000000..2d61fdfa5 --- /dev/null +++ b/@interactjs/utils/domUtils.d.ts @@ -0,0 +1,29 @@ +export declare function nodeContains(parent: Node | Interact.EventTarget, child: Node | Interact.EventTarget): boolean; +export declare function closest(element: Node, selector: string): import("@interactjs/types/types").Element; +export declare function parentNode(node: Node | Document): Node & ParentNode; +export declare function matchesSelector(element: Interact.Element, selector: string): any; +export declare function indexOfDeepestElement(elements: Interact.Element[] | NodeListOf): number; +export declare function matchesUpTo(element: Interact.Element, selector: string, limit: Node): any; +export declare function getActualElement(element: Interact.Element): import("@interactjs/types/types").Element; +export declare function getScrollXY(relevantWindow: any): { + x: any; + y: any; +}; +export declare function getElementClientRect(element: Interact.Element): { + left: number; + right: number; + top: number; + bottom: number; + width: number; + height: number; +}; +export declare function getElementRect(element: Interact.Element): { + left: number; + right: number; + top: number; + bottom: number; + width: number; + height: number; +}; +export declare function getPath(node: Node | Document): any[]; +export declare function trySelector(value: any): boolean; diff --git a/@interactjs/utils/domUtils.js b/@interactjs/utils/domUtils.js new file mode 100644 index 000000000..4ef91757f --- /dev/null +++ b/@interactjs/utils/domUtils.js @@ -0,0 +1,222 @@ +import browser from "./browser.js"; +import domObjects from "./domObjects.js"; +import * as is from "./is.js"; +import win, { getWindow } from "./window.js"; +export function nodeContains(parent, child) { + while (child) { + if (child === parent) { + return true; + } + + child = child.parentNode; + } + + return false; +} +export function closest(element, selector) { + while (is.element(element)) { + if (matchesSelector(element, selector)) { + return element; + } + + element = parentNode(element); + } + + return null; +} +export function parentNode(node) { + let parent = node.parentNode; + + if (is.docFrag(parent)) { + // skip past #shado-root fragments + // tslint:disable-next-line + while ((parent = parent.host) && is.docFrag(parent)) { + continue; + } + + return parent; + } + + return parent; +} +export function matchesSelector(element, selector) { + // remove /deep/ from selectors if shadowDOM polyfill is used + if (win.window !== win.realWindow) { + selector = selector.replace(/\/deep\//g, ' '); + } + + return element[browser.prefixedMatchesSelector](selector); +} + +const getParent = el => el.parentNode ? el.parentNode : el.host; // Test for the element that's "above" all other qualifiers + + +export function indexOfDeepestElement(elements) { + let deepestZoneParents = []; + let deepestZone = elements[0]; + let index = deepestZone ? 0 : -1; + let i; + let n; + + for (i = 1; i < elements.length; i++) { + const dropzone = elements[i]; // an element might belong to multiple selector dropzones + + if (!dropzone || dropzone === deepestZone) { + continue; + } + + if (!deepestZone) { + deepestZone = dropzone; + index = i; + continue; + } // check if the deepest or current are document.documentElement or document.rootElement + // - if the current dropzone is, do nothing and continue + + + if (dropzone.parentNode === dropzone.ownerDocument) { + continue; + } // - if deepest is, update with the current dropzone and continue to next + else if (deepestZone.parentNode === dropzone.ownerDocument) { + deepestZone = dropzone; + index = i; + continue; + } // compare zIndex of siblings + + + if (dropzone.parentNode === deepestZone.parentNode) { + const deepestZIndex = parseInt(getWindow(deepestZone).getComputedStyle(deepestZone).zIndex, 10) || 0; + const dropzoneZIndex = parseInt(getWindow(dropzone).getComputedStyle(dropzone).zIndex, 10) || 0; + + if (dropzoneZIndex >= deepestZIndex) { + deepestZone = dropzone; + index = i; + } + + continue; + } // populate the ancestry array for the latest deepest dropzone + + + if (!deepestZoneParents.length) { + let parent = deepestZone; + let parentParent; + + while ((parentParent = getParent(parent)) && parentParent !== parent.ownerDocument) { + deepestZoneParents.unshift(parent); + parent = parentParent; + } + } + + let parent; // if this element is an svg element and the current deepest is an + // HTMLElement + + if (deepestZone instanceof domObjects.HTMLElement && dropzone instanceof domObjects.SVGElement && !(dropzone instanceof domObjects.SVGSVGElement)) { + if (dropzone === deepestZone.parentNode) { + continue; + } + + parent = dropzone.ownerSVGElement; + } else { + parent = dropzone; + } + + const dropzoneParents = []; + + while (parent.parentNode !== parent.ownerDocument) { + dropzoneParents.unshift(parent); + parent = getParent(parent); + } + + n = 0; // get (position of last common ancestor) + 1 + + while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) { + n++; + } + + const parents = [dropzoneParents[n - 1], dropzoneParents[n], deepestZoneParents[n]]; + let child = parents[0].lastChild; + + while (child) { + if (child === parents[1]) { + deepestZone = dropzone; + index = i; + deepestZoneParents = dropzoneParents; + break; + } else if (child === parents[2]) { + break; + } + + child = child.previousSibling; + } + } + + return index; +} +export function matchesUpTo(element, selector, limit) { + while (is.element(element)) { + if (matchesSelector(element, selector)) { + return true; + } + + element = parentNode(element); + + if (element === limit) { + return matchesSelector(element, selector); + } + } + + return false; +} +export function getActualElement(element) { + return element instanceof domObjects.SVGElementInstance ? element.correspondingUseElement : element; +} +export function getScrollXY(relevantWindow) { + relevantWindow = relevantWindow || win.window; + return { + x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft, + y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop + }; +} +export function getElementClientRect(element) { + const clientRect = element instanceof domObjects.SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0]; + return clientRect && { + left: clientRect.left, + right: clientRect.right, + top: clientRect.top, + bottom: clientRect.bottom, + width: clientRect.width || clientRect.right - clientRect.left, + height: clientRect.height || clientRect.bottom - clientRect.top + }; +} +export function getElementRect(element) { + const clientRect = getElementClientRect(element); + + if (!browser.isIOS7 && clientRect) { + const scroll = getScrollXY(win.getWindow(element)); + clientRect.left += scroll.x; + clientRect.right += scroll.x; + clientRect.top += scroll.y; + clientRect.bottom += scroll.y; + } + + return clientRect; +} +export function getPath(node) { + const path = []; + + while (node) { + path.push(node); + node = parentNode(node); + } + + return path; +} +export function trySelector(value) { + if (!is.string(value)) { + return false; + } // an exception will be raised if it is invalid + + + domObjects.document.querySelector(value); + return true; +} +//# sourceMappingURL=domUtils.js.map \ No newline at end of file diff --git a/@interactjs/utils/domUtils.js.map b/@interactjs/utils/domUtils.js.map new file mode 100644 index 000000000..e76f6b512 --- /dev/null +++ b/@interactjs/utils/domUtils.js.map @@ -0,0 +1,94 @@ +{ + "version": 3, + "sources": [ + "domUtils.ts" + ], + "names": [ + "browser", + "domObjects", + "is", + "win", + "getWindow", + "nodeContains", + "parent", + "child", + "parentNode", + "closest", + "element", + "selector", + "matchesSelector", + "node", + "docFrag", + "host", + "window", + "realWindow", + "replace", + "prefixedMatchesSelector", + "getParent", + "el", + "indexOfDeepestElement", + "elements", + "deepestZoneParents", + "deepestZone", + "index", + "i", + "n", + "length", + "dropzone", + "ownerDocument", + "deepestZIndex", + "parseInt", + "getComputedStyle", + "zIndex", + "dropzoneZIndex", + "parentParent", + "unshift", + "HTMLElement", + "SVGElement", + "SVGSVGElement", + "ownerSVGElement", + "dropzoneParents", + "parents", + "lastChild", + "previousSibling", + "matchesUpTo", + "limit", + "getActualElement", + "SVGElementInstance", + "correspondingUseElement", + "getScrollXY", + "relevantWindow", + "x", + "scrollX", + "document", + "documentElement", + "scrollLeft", + "y", + "scrollY", + "scrollTop", + "getElementClientRect", + "clientRect", + "getBoundingClientRect", + "getClientRects", + "left", + "right", + "top", + "bottom", + "width", + "height", + "getElementRect", + "isIOS7", + "scroll", + "getPath", + "path", + "push", + "trySelector", + "value", + "string", + "querySelector" + ], + "mappings": "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", + "sourcesContent": [ + "import browser from './browser'\nimport domObjects from './domObjects'\nimport * as is from './is'\nimport win, { getWindow } from './window'\n\nexport function nodeContains (parent: Node | Interact.EventTarget, child: Node | Interact.EventTarget) {\n while (child) {\n if (child === parent) {\n return true\n }\n\n child = (child as Node).parentNode\n }\n\n return false\n}\n\nexport function closest (element: Node, selector: string) {\n while (is.element(element)) {\n if (matchesSelector(element, selector)) { return element }\n\n element = parentNode(element)\n }\n\n return null\n}\n\nexport function parentNode (node: Node | Document) {\n let parent = node.parentNode\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n // tslint:disable-next-line\n while ((parent = (parent as any).host) && is.docFrag(parent)) {\n continue\n }\n\n return parent\n }\n\n return parent\n}\n\nexport function matchesSelector (element: Interact.Element, selector: string) {\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ')\n }\n\n return element[browser.prefixedMatchesSelector](selector)\n}\n\nconst getParent = el => el.parentNode ? el.parentNode : el.host\n\n// Test for the element that's \"above\" all other qualifiers\nexport function indexOfDeepestElement (elements: Interact.Element[] | NodeListOf) {\n let deepestZoneParents = []\n let deepestZone = elements[0]\n let index = deepestZone ? 0 : -1\n let i\n let n\n\n for (i = 1; i < elements.length; i++) {\n const dropzone = elements[i]\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue\n }\n\n if (!deepestZone) {\n deepestZone = dropzone\n index = i\n continue\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone\n index = i\n continue\n }\n\n // compare zIndex of siblings\n if (dropzone.parentNode === deepestZone.parentNode) {\n const deepestZIndex = parseInt(getWindow(deepestZone).getComputedStyle(deepestZone).zIndex, 10) || 0\n const dropzoneZIndex = parseInt(getWindow(dropzone).getComputedStyle(dropzone).zIndex, 10) || 0\n\n if (dropzoneZIndex >= deepestZIndex) {\n deepestZone = dropzone\n index = i\n }\n\n continue\n }\n\n // populate the ancestry array for the latest deepest dropzone\n if (!deepestZoneParents.length) {\n let parent = deepestZone\n let parentParent\n\n while ((parentParent = getParent(parent)) && parentParent !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent)\n parent = parentParent\n }\n }\n\n let parent\n\n // if this element is an svg element and the current deepest is an\n // HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement &&\n dropzone instanceof domObjects.SVGElement &&\n !(dropzone instanceof domObjects.SVGSVGElement)) {\n if (dropzone === deepestZone.parentNode) {\n continue\n }\n\n parent = dropzone.ownerSVGElement\n }\n else {\n parent = dropzone\n }\n\n const dropzoneParents = []\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent)\n parent = getParent(parent)\n }\n\n n = 0\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ]\n\n let child = parents[0].lastChild\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone\n index = i\n deepestZoneParents = dropzoneParents\n\n break\n }\n else if (child === parents[2]) {\n break\n }\n\n child = child.previousSibling\n }\n }\n\n return index\n}\n\nexport function matchesUpTo (element: Interact.Element, selector: string, limit: Node) {\n while (is.element(element)) {\n if (matchesSelector(element, selector)) {\n return true\n }\n\n element = parentNode(element) as Interact.Element\n\n if (element === limit) {\n return matchesSelector(element, selector)\n }\n }\n\n return false\n}\n\nexport function getActualElement (element: Interact.Element) {\n return (element instanceof domObjects.SVGElementInstance\n ? (element as SVGElement).correspondingUseElement\n : element)\n}\n\nexport function getScrollXY (relevantWindow) {\n relevantWindow = relevantWindow || win.window\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n }\n}\n\nexport function getElementClientRect (element: Interact.Element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0])\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n }\n}\n\nexport function getElementRect (element: Interact.Element) {\n const clientRect = getElementClientRect(element)\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = getScrollXY(win.getWindow(element))\n\n clientRect.left += scroll.x\n clientRect.right += scroll.x\n clientRect.top += scroll.y\n clientRect.bottom += scroll.y\n }\n\n return clientRect\n}\n\nexport function getPath (node: Node | Document) {\n const path = []\n\n while (node) {\n path.push(node)\n node = parentNode(node)\n }\n\n return path\n}\n\nexport function trySelector (value) {\n if (!is.string(value)) { return false }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value)\n return true\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/domUtils.min.js b/@interactjs/utils/domUtils.min.js new file mode 100644 index 000000000..71b7ba65a --- /dev/null +++ b/@interactjs/utils/domUtils.min.js @@ -0,0 +1,2 @@ +import e from"./browser.min.js";import t from"./domObjects.min.js";import*as n from"./is.min.js";import o,{getWindow as r}from"./window.min.js";export function nodeContains(e,t){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}export function closest(e,t){for(;n.element(e);){if(matchesSelector(e,t))return e;e=parentNode(e)}return null}export function parentNode(e){let t=e.parentNode;if(n.docFrag(t)){for(;(t=t.host)&&n.docFrag(t););return t}return t}export function matchesSelector(t,n){return o.window!==o.realWindow&&(n=n.replace(/\/deep\//g," ")),t[e.prefixedMatchesSelector](n)}const i=e=>e.parentNode?e.parentNode:e.host;export function indexOfDeepestElement(e){let n,o,c=[],l=e[0],f=l?0:-1;for(n=1;n=e&&(l=u,f=n);continue}if(!c.length){let e,t=l;for(;(e=i(t))&&e!==t.ownerDocument;)c.unshift(t),t=e}let s;if(l instanceof t.HTMLElement&&u instanceof t.SVGElement&&!(u instanceof t.SVGSVGElement)){if(u===l.parentNode)continue;s=u.ownerSVGElement}else s=u;const m=[];for(;s.parentNode!==s.ownerDocument;)m.unshift(s),s=i(s);for(o=0;m[o]&&m[o]===c[o];)o++;const p=[m[o-1],m[o],c[o]];let d=p[0].lastChild;for(;d;){if(d===p[1]){l=u,f=n,c=m;break}if(d===p[2])break;d=d.previousSibling}}return f}export function matchesUpTo(e,t,o){for(;n.element(e);){if(matchesSelector(e,t))return!0;if((e=parentNode(e))===o)return matchesSelector(e,t)}return!1}export function getActualElement(e){return e instanceof t.SVGElementInstance?e.correspondingUseElement:e}export function getScrollXY(e){return{x:(e=e||o.window).scrollX||e.document.documentElement.scrollLeft,y:e.scrollY||e.document.documentElement.scrollTop}}export function getElementClientRect(e){const n=e instanceof t.SVGElement?e.getBoundingClientRect():e.getClientRects()[0];return n&&{left:n.left,right:n.right,top:n.top,bottom:n.bottom,width:n.width||n.right-n.left,height:n.height||n.bottom-n.top}}export function getElementRect(t){const n=getElementClientRect(t);if(!e.isIOS7&&n){const e=getScrollXY(o.getWindow(t));n.left+=e.x,n.right+=e.x,n.top+=e.y,n.bottom+=e.y}return n}export function getPath(e){const t=[];for(;e;)t.push(e),e=parentNode(e);return t}export function trySelector(e){return!!n.string(e)&&(t.document.querySelector(e),!0)} +//# sourceMappingURL=domUtils.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/domUtils.min.js.map b/@interactjs/utils/domUtils.min.js.map new file mode 100644 index 000000000..8aa0422e1 --- /dev/null +++ b/@interactjs/utils/domUtils.min.js.map @@ -0,0 +1,93 @@ +{ + "version": 3, + "sources": [ + "domUtils.ts" + ], + "names": [ + "browser", + "domObjects", + "is", + "win", + "getWindow", + "nodeContains", + "parent", + "child", + "parentNode", + "closest", + "element", + "selector", + "matchesSelector", + "node", + "docFrag", + "host", + "window", + "realWindow", + "replace", + "prefixedMatchesSelector", + "getParent", + "el", + "indexOfDeepestElement", + "elements", + "i", + "n", + "deepestZoneParents", + "deepestZone", + "index", + "length", + "dropzone", + "ownerDocument", + "deepestZIndex", + "parseInt", + "getComputedStyle", + "zIndex", + "parentParent", + "unshift", + "HTMLElement", + "SVGElement", + "SVGSVGElement", + "ownerSVGElement", + "dropzoneParents", + "parents", + "lastChild", + "previousSibling", + "matchesUpTo", + "limit", + "getActualElement", + "SVGElementInstance", + "correspondingUseElement", + "getScrollXY", + "relevantWindow", + "x", + "scrollX", + "document", + "documentElement", + "scrollLeft", + "y", + "scrollY", + "scrollTop", + "getElementClientRect", + "clientRect", + "getBoundingClientRect", + "getClientRects", + "left", + "right", + "top", + "bottom", + "width", + "height", + "getElementRect", + "isIOS7", + "scroll", + "getPath", + "path", + "push", + "trySelector", + "value", + "string", + "querySelector" + ], + "mappings": "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", + "sourcesContent": [ + "import browser from './browser'\nimport domObjects from './domObjects'\nimport * as is from './is'\nimport win, { getWindow } from './window'\n\nexport function nodeContains (parent: Node | Interact.EventTarget, child: Node | Interact.EventTarget) {\n while (child) {\n if (child === parent) {\n return true\n }\n\n child = (child as Node).parentNode\n }\n\n return false\n}\n\nexport function closest (element: Node, selector: string) {\n while (is.element(element)) {\n if (matchesSelector(element, selector)) { return element }\n\n element = parentNode(element)\n }\n\n return null\n}\n\nexport function parentNode (node: Node | Document) {\n let parent = node.parentNode\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n // tslint:disable-next-line\n while ((parent = (parent as any).host) && is.docFrag(parent)) {\n continue\n }\n\n return parent\n }\n\n return parent\n}\n\nexport function matchesSelector (element: Interact.Element, selector: string) {\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ')\n }\n\n return element[browser.prefixedMatchesSelector](selector)\n}\n\nconst getParent = el => el.parentNode ? el.parentNode : el.host\n\n// Test for the element that's \"above\" all other qualifiers\nexport function indexOfDeepestElement (elements: Interact.Element[] | NodeListOf) {\n let deepestZoneParents = []\n let deepestZone = elements[0]\n let index = deepestZone ? 0 : -1\n let i\n let n\n\n for (i = 1; i < elements.length; i++) {\n const dropzone = elements[i]\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue\n }\n\n if (!deepestZone) {\n deepestZone = dropzone\n index = i\n continue\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone\n index = i\n continue\n }\n\n // compare zIndex of siblings\n if (dropzone.parentNode === deepestZone.parentNode) {\n const deepestZIndex = parseInt(getWindow(deepestZone).getComputedStyle(deepestZone).zIndex, 10) || 0\n const dropzoneZIndex = parseInt(getWindow(dropzone).getComputedStyle(dropzone).zIndex, 10) || 0\n\n if (dropzoneZIndex >= deepestZIndex) {\n deepestZone = dropzone\n index = i\n }\n\n continue\n }\n\n // populate the ancestry array for the latest deepest dropzone\n if (!deepestZoneParents.length) {\n let parent = deepestZone\n let parentParent\n\n while ((parentParent = getParent(parent)) && parentParent !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent)\n parent = parentParent\n }\n }\n\n let parent\n\n // if this element is an svg element and the current deepest is an\n // HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement &&\n dropzone instanceof domObjects.SVGElement &&\n !(dropzone instanceof domObjects.SVGSVGElement)) {\n if (dropzone === deepestZone.parentNode) {\n continue\n }\n\n parent = dropzone.ownerSVGElement\n }\n else {\n parent = dropzone\n }\n\n const dropzoneParents = []\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent)\n parent = getParent(parent)\n }\n\n n = 0\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ]\n\n let child = parents[0].lastChild\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone\n index = i\n deepestZoneParents = dropzoneParents\n\n break\n }\n else if (child === parents[2]) {\n break\n }\n\n child = child.previousSibling\n }\n }\n\n return index\n}\n\nexport function matchesUpTo (element: Interact.Element, selector: string, limit: Node) {\n while (is.element(element)) {\n if (matchesSelector(element, selector)) {\n return true\n }\n\n element = parentNode(element) as Interact.Element\n\n if (element === limit) {\n return matchesSelector(element, selector)\n }\n }\n\n return false\n}\n\nexport function getActualElement (element: Interact.Element) {\n return (element instanceof domObjects.SVGElementInstance\n ? (element as SVGElement).correspondingUseElement\n : element)\n}\n\nexport function getScrollXY (relevantWindow) {\n relevantWindow = relevantWindow || win.window\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n }\n}\n\nexport function getElementClientRect (element: Interact.Element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0])\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n }\n}\n\nexport function getElementRect (element: Interact.Element) {\n const clientRect = getElementClientRect(element)\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = getScrollXY(win.getWindow(element))\n\n clientRect.left += scroll.x\n clientRect.right += scroll.x\n clientRect.top += scroll.y\n clientRect.bottom += scroll.y\n }\n\n return clientRect\n}\n\nexport function getPath (node: Node | Document) {\n const path = []\n\n while (node) {\n path.push(node)\n node = parentNode(node)\n }\n\n return path\n}\n\nexport function trySelector (value) {\n if (!is.string(value)) { return false }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value)\n return true\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/domUtils.spec.d.ts b/@interactjs/utils/domUtils.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/utils/domUtils.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/utils/events.d.ts b/@interactjs/utils/events.d.ts new file mode 100644 index 000000000..61e251686 --- /dev/null +++ b/@interactjs/utils/events.d.ts @@ -0,0 +1,42 @@ +declare type Listener = (event: Event | FakeEvent) => any; +declare function add(element: EventTarget, type: string, listener: Listener, optionalArg?: boolean | any): void; +declare function remove(element: EventTarget, type: string, listener?: 'all' | Listener, optionalArg?: boolean | any): void; +declare function addDelegate(selector: string, context: Node, type: string, listener: Listener, optionalArg?: any): void; +declare function removeDelegate(selector: string, context: Document | Interact.Element, type: string, listener?: Listener, optionalArg?: any): void; +declare function delegateListener(event: Event, optionalArg?: any): void; +declare function delegateUseCapture(event: Event): any; +export declare class FakeEvent implements Partial { + originalEvent: Event; + currentTarget: EventTarget; + constructor(originalEvent: Event); + preventOriginalDefault(): void; + stopPropagation(): void; + stopImmediatePropagation(): void; +} +declare const events: { + add: typeof add; + remove: typeof remove; + addDelegate: typeof addDelegate; + removeDelegate: typeof removeDelegate; + delegateListener: typeof delegateListener; + delegateUseCapture: typeof delegateUseCapture; + delegatedEvents: { + [type: string]: { + selectors: string[]; + contexts: Node[]; + listeners: [Listener, boolean, boolean][][]; + }; + }; + documents: Document[]; + supportsOptions: boolean; + supportsPassive: boolean; + _elements: EventTarget[]; + _targets: { + events: { + [type: string]: Listener[]; + }; + typeCount: number; + }[]; + init(window: Window): void; +}; +export default events; diff --git a/@interactjs/utils/events.js b/@interactjs/utils/events.js new file mode 100644 index 000000000..7364ff44b --- /dev/null +++ b/@interactjs/utils/events.js @@ -0,0 +1,262 @@ +import { contains } from "./arr.js"; +import * as domUtils from "./domUtils.js"; +import * as is from "./is.js"; +import pExtend from "./pointerExtend.js"; +import * as pointerUtils from "./pointerUtils.js"; +const elements = []; +const targets = []; +const delegatedEvents = {}; +const documents = []; + +function add(element, type, listener, optionalArg) { + const options = getOptions(optionalArg); + let elementIndex = elements.indexOf(element); + let target = targets[elementIndex]; + + if (!target) { + target = { + events: {}, + typeCount: 0 + }; + elementIndex = elements.push(element) - 1; + targets.push(target); + } + + if (!target.events[type]) { + target.events[type] = []; + target.typeCount++; + } + + if (element.removeEventListener && !contains(target.events[type], listener)) { + element.addEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].push(listener); + } +} + +function remove(element, type, listener, optionalArg) { + const options = getOptions(optionalArg); + const elementIndex = elements.indexOf(element); + const target = targets[elementIndex]; + + if (!target || !target.events) { + return; + } + + if (type === 'all') { + for (type in target.events) { + if (target.events.hasOwnProperty(type)) { + remove(element, type, 'all'); + } + } + + return; + } + + if (target.events[type]) { + const len = target.events[type].length; + + if (listener === 'all') { + for (let i = 0; i < len; i++) { + remove(element, type, target.events[type][i], options); + } + + return; + } else { + for (let i = 0; i < len; i++) { + if (element.removeEventListener && target.events[type][i] === listener) { + element.removeEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].splice(i, 1); + break; + } + } + } + + if (target.events[type] && target.events[type].length === 0) { + target.events[type] = null; + target.typeCount--; + } + } + + if (!target.typeCount) { + targets.splice(elementIndex, 1); + elements.splice(elementIndex, 1); + } +} + +function addDelegate(selector, context, type, listener, optionalArg) { + const options = getOptions(optionalArg); + + if (!delegatedEvents[type]) { + delegatedEvents[type] = { + contexts: [], + listeners: [], + selectors: [] + }; // add delegate listener functions + + for (const doc of documents) { + add(doc, type, delegateListener); + add(doc, type, delegateUseCapture, true); + } + } + + const delegated = delegatedEvents[type]; + let index; + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + break; + } + } + + if (index === -1) { + index = delegated.selectors.length; + delegated.selectors.push(selector); + delegated.contexts.push(context); + delegated.listeners.push([]); + } // keep listener and capture and passive flags + + + delegated.listeners[index].push([listener, !!options.capture, options.passive]); +} + +function removeDelegate(selector, context, type, listener, optionalArg) { + const options = getOptions(optionalArg); + const delegated = delegatedEvents[type]; + let matchFound = false; + let index; + + if (!delegated) { + return; + } // count from last index of delegated to 0 + + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + // look for matching selector and context Node + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + const listeners = delegated.listeners[index]; // each item of the listeners array is an array: [function, capture, passive] + + for (let i = listeners.length - 1; i >= 0; i--) { + const [fn, capture, passive] = listeners[i]; // check if the listener functions and capture and passive flags match + + if (fn === listener && capture === !!options.capture && passive === options.passive) { + // remove the listener from the array of listeners + listeners.splice(i, 1); // if all listeners for this interactable have been removed + // remove the interactable from the delegated arrays + + if (!listeners.length) { + delegated.selectors.splice(index, 1); + delegated.contexts.splice(index, 1); + delegated.listeners.splice(index, 1); // remove delegate function from context + + remove(context, type, delegateListener); + remove(context, type, delegateUseCapture, true); // remove the arrays if they are empty + + if (!delegated.selectors.length) { + delegatedEvents[type] = null; + } + } // only remove one listener + + + matchFound = true; + break; + } + } + + if (matchFound) { + break; + } + } + } +} // bound to the interactable context when a DOM event +// listener is added to a selector interactable + + +function delegateListener(event, optionalArg) { + const options = getOptions(optionalArg); + const fakeEvent = new FakeEvent(event); + const delegated = delegatedEvents[event.type]; + const [eventTarget] = pointerUtils.getEventTargets(event); + let element = eventTarget; // climb up document tree looking for selector matches + + while (is.element(element)) { + for (let i = 0; i < delegated.selectors.length; i++) { + const selector = delegated.selectors[i]; + const context = delegated.contexts[i]; + + if (domUtils.matchesSelector(element, selector) && domUtils.nodeContains(context, eventTarget) && domUtils.nodeContains(context, element)) { + const listeners = delegated.listeners[i]; + fakeEvent.currentTarget = element; + + for (const [fn, capture, passive] of listeners) { + if (capture === !!options.capture && passive === options.passive) { + fn(fakeEvent); + } + } + } + } + + element = domUtils.parentNode(element); + } +} + +function delegateUseCapture(event) { + return delegateListener.call(this, event, true); +} + +function getOptions(param) { + return is.object(param) ? param : { + capture: param + }; +} + +export class FakeEvent { + constructor(originalEvent) { + this.originalEvent = originalEvent; + this.currentTarget = void 0; + // duplicate the event so that currentTarget can be changed + pExtend(this, originalEvent); + } + + preventOriginalDefault() { + this.originalEvent.preventDefault(); + } + + stopPropagation() { + this.originalEvent.stopPropagation(); + } + + stopImmediatePropagation() { + this.originalEvent.stopImmediatePropagation(); + } + +} +const events = { + add, + remove, + addDelegate, + removeDelegate, + delegateListener, + delegateUseCapture, + delegatedEvents, + documents, + supportsOptions: false, + supportsPassive: false, + _elements: elements, + _targets: targets, + + init(window) { + window.document.createElement('div').addEventListener('test', null, { + get capture() { + return events.supportsOptions = true; + }, + + get passive() { + return events.supportsPassive = true; + } + + }); + } + +}; +export default events; +//# sourceMappingURL=events.js.map \ No newline at end of file diff --git a/@interactjs/utils/events.js.map b/@interactjs/utils/events.js.map new file mode 100644 index 000000000..4a6dbbc00 --- /dev/null +++ b/@interactjs/utils/events.js.map @@ -0,0 +1,84 @@ +{ + "version": 3, + "sources": [ + "events.ts" + ], + "names": [ + "contains", + "domUtils", + "is", + "pExtend", + "pointerUtils", + "elements", + "targets", + "delegatedEvents", + "documents", + "add", + "element", + "type", + "listener", + "optionalArg", + "options", + "getOptions", + "elementIndex", + "indexOf", + "target", + "events", + "typeCount", + "push", + "removeEventListener", + "addEventListener", + "supportsOptions", + "capture", + "remove", + "hasOwnProperty", + "len", + "length", + "i", + "splice", + "addDelegate", + "selector", + "context", + "contexts", + "listeners", + "selectors", + "doc", + "delegateListener", + "delegateUseCapture", + "delegated", + "index", + "passive", + "removeDelegate", + "matchFound", + "fn", + "event", + "fakeEvent", + "FakeEvent", + "eventTarget", + "getEventTargets", + "matchesSelector", + "nodeContains", + "currentTarget", + "parentNode", + "call", + "param", + "object", + "constructor", + "originalEvent", + "preventOriginalDefault", + "preventDefault", + "stopPropagation", + "stopImmediatePropagation", + "supportsPassive", + "_elements", + "_targets", + "init", + "window", + "document", + "createElement" + ], + "mappings": "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", + "sourcesContent": [ + "import { contains } from './arr'\nimport * as domUtils from './domUtils'\nimport * as is from './is'\nimport pExtend from './pointerExtend'\nimport * as pointerUtils from './pointerUtils'\n\ntype Listener = (event: Event | FakeEvent) => any\n\nconst elements: EventTarget[] = []\nconst targets: Array<{\n events: { [type: string]: Listener[] }\n typeCount: number\n}> = []\n\nconst delegatedEvents: {\n [type: string]: {\n selectors: string[]\n contexts: Node[]\n listeners: Array>\n }\n} = {}\nconst documents: Document[] = []\n\nfunction add (element: EventTarget, type: string, listener: Listener, optionalArg?: boolean | any) {\n const options = getOptions(optionalArg)\n let elementIndex = elements.indexOf(element)\n let target = targets[elementIndex]\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n }\n\n elementIndex = elements.push(element) - 1\n targets.push(target)\n }\n\n if (!target.events[type]) {\n target.events[type] = []\n target.typeCount++\n }\n\n if (element.removeEventListener && !contains(target.events[type], listener)) {\n element.addEventListener(type, listener as any, events.supportsOptions ? options : !!options.capture)\n target.events[type].push(listener)\n }\n}\n\nfunction remove (element: EventTarget, type: string, listener?: 'all' | Listener, optionalArg?: boolean | any) {\n const options = getOptions(optionalArg)\n const elementIndex = elements.indexOf(element)\n const target = targets[elementIndex]\n\n if (!target || !target.events) {\n return\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all')\n }\n }\n return\n }\n\n if (target.events[type]) {\n const len = target.events[type].length\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options)\n }\n return\n }\n else {\n for (let i = 0; i < len; i++) {\n if (element.removeEventListener && target.events[type][i] === listener) {\n element.removeEventListener(type, listener as any, events.supportsOptions ? options : !!options.capture)\n target.events[type].splice(i, 1)\n\n break\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n (target.events[type] as any) = null\n target.typeCount--\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1)\n elements.splice(elementIndex, 1)\n }\n}\n\nfunction addDelegate (selector: string, context: Node, type: string, listener: Listener, optionalArg?: any) {\n const options = getOptions(optionalArg)\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n contexts : [],\n listeners: [],\n selectors: [],\n }\n\n // add delegate listener functions\n for (const doc of documents) {\n add(doc, type, delegateListener)\n add(doc, type, delegateUseCapture, true)\n }\n }\n\n const delegated = delegatedEvents[type]\n let index\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector &&\n delegated.contexts[index] === context) {\n break\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length\n\n delegated.selectors.push(selector)\n delegated.contexts.push(context)\n delegated.listeners.push([])\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive])\n}\n\nfunction removeDelegate (\n selector: string,\n context: Document | Interact.Element,\n type: string,\n listener?: Listener,\n optionalArg?: any,\n) {\n const options = getOptions(optionalArg)\n const delegated = delegatedEvents[type]\n let matchFound = false\n let index\n\n if (!delegated) { return }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector &&\n delegated.contexts[index] === context) {\n const listeners = delegated.listeners[index]\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i]\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1)\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1)\n delegated.contexts.splice(index, 1)\n delegated.listeners.splice(index, 1)\n\n // remove delegate function from context\n remove(context, type, delegateListener)\n remove(context, type, delegateUseCapture, true)\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null\n }\n }\n\n // only remove one listener\n matchFound = true\n break\n }\n }\n\n if (matchFound) { break }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event: Event, optionalArg?: any) {\n const options = getOptions(optionalArg)\n const fakeEvent = new FakeEvent(event)\n const delegated = delegatedEvents[event.type]\n const [eventTarget] = (pointerUtils.getEventTargets(event))\n let element: Node = eventTarget\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i]\n const context = delegated.contexts[i]\n\n if (domUtils.matchesSelector(element, selector) &&\n domUtils.nodeContains(context, eventTarget) &&\n domUtils.nodeContains(context, element)) {\n const listeners = delegated.listeners[i]\n\n fakeEvent.currentTarget = element\n\n for (const [fn, capture, passive] of listeners) {\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent)\n }\n }\n }\n }\n\n element = domUtils.parentNode(element)\n }\n}\n\nfunction delegateUseCapture (event: Event) {\n return delegateListener.call(this, event, true)\n}\n\nfunction getOptions (param: object) {\n return is.object(param) ? param : { capture: param }\n}\n\nexport class FakeEvent implements Partial {\n currentTarget: EventTarget\n\n constructor (public originalEvent: Event) {\n // duplicate the event so that currentTarget can be changed\n pExtend(this, originalEvent)\n }\n\n preventOriginalDefault () {\n this.originalEvent.preventDefault()\n }\n\n stopPropagation () {\n this.originalEvent.stopPropagation()\n }\n\n stopImmediatePropagation () {\n this.originalEvent.stopImmediatePropagation()\n }\n}\n\nconst events = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n supportsOptions: false,\n supportsPassive: false,\n\n _elements: elements,\n _targets: targets,\n\n init (window: Window) {\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { return (events.supportsOptions = true) },\n get passive () { return (events.supportsPassive = true) },\n })\n },\n}\n\nexport default events\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/events.min.js b/@interactjs/utils/events.min.js new file mode 100644 index 000000000..2198d5f06 --- /dev/null +++ b/@interactjs/utils/events.min.js @@ -0,0 +1,2 @@ +import{contains as e}from"./arr.min.js";import*as t from"./domUtils.min.js";import*as s from"./is.min.js";import n from"./pointerExtend.min.js";import*as o from"./pointerUtils.min.js";const r=[],i=[],l={},p=[];function a(t,s,n,o){const l=f(o);let p=r.indexOf(t),a=i[p];a||(a={events:{},typeCount:0},p=r.push(t)-1,i.push(a)),a.events[s]||(a.events[s]=[],a.typeCount++),t.removeEventListener&&!e(a.events[s],n)&&(t.addEventListener(s,n,m.supportsOptions?l:!!l.capture),a.events[s].push(n))}function c(e,t,s,n){const o=f(n),l=r.indexOf(e),p=i[l];if(p&&p.events)if("all"!==t){if(p.events[t]){const n=p.events[t].length;if("all"===s){for(let s=0;s=0&&(i.selectors[c]!==e||i.contexts[c]!==t);c--);-1===c&&(c=i.selectors.length,i.selectors.push(e),i.contexts.push(t),i.listeners.push([])),i.listeners[c].push([n,!!r.capture,r.passive])},removeDelegate(e,t,s,n,o){const r=f(o),i=l[s];let p,a=!1;if(i)for(p=i.selectors.length-1;p>=0;p--)if(i.selectors[p]===e&&i.contexts[p]===t){const e=i.listeners[p];for(let o=e.length-1;o>=0;o--){const[f,m,g]=e[o];if(f===n&&m===!!r.capture&&g===r.passive){e.splice(o,1),e.length||(i.selectors.splice(p,1),i.contexts.splice(p,1),i.listeners.splice(p,1),c(t,s,u),c(t,s,v,!0),i.selectors.length||(l[s]=null)),a=!0;break}}if(a)break}},delegateListener:u,delegateUseCapture:v,delegatedEvents:l,documents:p,supportsOptions:!1,supportsPassive:!1,_elements:r,_targets:i,init(e){e.document.createElement("div").addEventListener("test",null,{get capture(){return m.supportsOptions=!0},get passive(){return m.supportsPassive=!0}})}};export default m; +//# sourceMappingURL=events.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/events.min.js.map b/@interactjs/utils/events.min.js.map new file mode 100644 index 000000000..ee8ddaab7 --- /dev/null +++ b/@interactjs/utils/events.min.js.map @@ -0,0 +1,84 @@ +{ + "version": 3, + "sources": [ + "events.ts" + ], + "names": [ + "contains", + "domUtils", + "is", + "pExtend", + "pointerUtils", + "elements", + "targets", + "delegatedEvents", + "documents", + "add", + "element", + "type", + "listener", + "optionalArg", + "options", + "getOptions", + "elementIndex", + "indexOf", + "target", + "events", + "typeCount", + "push", + "removeEventListener", + "addEventListener", + "supportsOptions", + "capture", + "remove", + "len", + "length", + "i", + "splice", + "hasOwnProperty", + "delegateListener", + "event", + "fakeEvent", + "FakeEvent", + "delegated", + "eventTarget", + "getEventTargets", + "selectors", + "selector", + "context", + "contexts", + "matchesSelector", + "nodeContains", + "listeners", + "currentTarget", + "fn", + "passive", + "parentNode", + "delegateUseCapture", + "param", + "object", + "constructor", + "originalEvent", + "this", + "preventOriginalDefault", + "preventDefault", + "stopPropagation", + "stopImmediatePropagation", + "addDelegate", + "doc", + "index", + "removeDelegate", + "matchFound", + "supportsPassive", + "_elements", + "_targets", + "init", + "window", + "document", + "createElement" + ], + "mappings": "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", + "sourcesContent": [ + "import { contains } from './arr'\nimport * as domUtils from './domUtils'\nimport * as is from './is'\nimport pExtend from './pointerExtend'\nimport * as pointerUtils from './pointerUtils'\n\ntype Listener = (event: Event | FakeEvent) => any\n\nconst elements: EventTarget[] = []\nconst targets: Array<{\n events: { [type: string]: Listener[] }\n typeCount: number\n}> = []\n\nconst delegatedEvents: {\n [type: string]: {\n selectors: string[]\n contexts: Node[]\n listeners: Array>\n }\n} = {}\nconst documents: Document[] = []\n\nfunction add (element: EventTarget, type: string, listener: Listener, optionalArg?: boolean | any) {\n const options = getOptions(optionalArg)\n let elementIndex = elements.indexOf(element)\n let target = targets[elementIndex]\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n }\n\n elementIndex = elements.push(element) - 1\n targets.push(target)\n }\n\n if (!target.events[type]) {\n target.events[type] = []\n target.typeCount++\n }\n\n if (element.removeEventListener && !contains(target.events[type], listener)) {\n element.addEventListener(type, listener as any, events.supportsOptions ? options : !!options.capture)\n target.events[type].push(listener)\n }\n}\n\nfunction remove (element: EventTarget, type: string, listener?: 'all' | Listener, optionalArg?: boolean | any) {\n const options = getOptions(optionalArg)\n const elementIndex = elements.indexOf(element)\n const target = targets[elementIndex]\n\n if (!target || !target.events) {\n return\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all')\n }\n }\n return\n }\n\n if (target.events[type]) {\n const len = target.events[type].length\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options)\n }\n return\n }\n else {\n for (let i = 0; i < len; i++) {\n if (element.removeEventListener && target.events[type][i] === listener) {\n element.removeEventListener(type, listener as any, events.supportsOptions ? options : !!options.capture)\n target.events[type].splice(i, 1)\n\n break\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n (target.events[type] as any) = null\n target.typeCount--\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1)\n elements.splice(elementIndex, 1)\n }\n}\n\nfunction addDelegate (selector: string, context: Node, type: string, listener: Listener, optionalArg?: any) {\n const options = getOptions(optionalArg)\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n contexts : [],\n listeners: [],\n selectors: [],\n }\n\n // add delegate listener functions\n for (const doc of documents) {\n add(doc, type, delegateListener)\n add(doc, type, delegateUseCapture, true)\n }\n }\n\n const delegated = delegatedEvents[type]\n let index\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector &&\n delegated.contexts[index] === context) {\n break\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length\n\n delegated.selectors.push(selector)\n delegated.contexts.push(context)\n delegated.listeners.push([])\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive])\n}\n\nfunction removeDelegate (\n selector: string,\n context: Document | Interact.Element,\n type: string,\n listener?: Listener,\n optionalArg?: any,\n) {\n const options = getOptions(optionalArg)\n const delegated = delegatedEvents[type]\n let matchFound = false\n let index\n\n if (!delegated) { return }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector &&\n delegated.contexts[index] === context) {\n const listeners = delegated.listeners[index]\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i]\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1)\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1)\n delegated.contexts.splice(index, 1)\n delegated.listeners.splice(index, 1)\n\n // remove delegate function from context\n remove(context, type, delegateListener)\n remove(context, type, delegateUseCapture, true)\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null\n }\n }\n\n // only remove one listener\n matchFound = true\n break\n }\n }\n\n if (matchFound) { break }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event: Event, optionalArg?: any) {\n const options = getOptions(optionalArg)\n const fakeEvent = new FakeEvent(event)\n const delegated = delegatedEvents[event.type]\n const [eventTarget] = (pointerUtils.getEventTargets(event))\n let element: Node = eventTarget\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i]\n const context = delegated.contexts[i]\n\n if (domUtils.matchesSelector(element, selector) &&\n domUtils.nodeContains(context, eventTarget) &&\n domUtils.nodeContains(context, element)) {\n const listeners = delegated.listeners[i]\n\n fakeEvent.currentTarget = element\n\n for (const [fn, capture, passive] of listeners) {\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent)\n }\n }\n }\n }\n\n element = domUtils.parentNode(element)\n }\n}\n\nfunction delegateUseCapture (event: Event) {\n return delegateListener.call(this, event, true)\n}\n\nfunction getOptions (param: object) {\n return is.object(param) ? param : { capture: param }\n}\n\nexport class FakeEvent implements Partial {\n currentTarget: EventTarget\n\n constructor (public originalEvent: Event) {\n // duplicate the event so that currentTarget can be changed\n pExtend(this, originalEvent)\n }\n\n preventOriginalDefault () {\n this.originalEvent.preventDefault()\n }\n\n stopPropagation () {\n this.originalEvent.stopPropagation()\n }\n\n stopImmediatePropagation () {\n this.originalEvent.stopImmediatePropagation()\n }\n}\n\nconst events = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n supportsOptions: false,\n supportsPassive: false,\n\n _elements: elements,\n _targets: targets,\n\n init (window: Window) {\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { return (events.supportsOptions = true) },\n get passive () { return (events.supportsPassive = true) },\n })\n },\n}\n\nexport default events\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/extend.d.ts b/@interactjs/utils/extend.d.ts new file mode 100644 index 000000000..3179be382 --- /dev/null +++ b/@interactjs/utils/extend.d.ts @@ -0,0 +1 @@ +export default function extend(dest: U & Partial, source: T): T & U; diff --git a/@interactjs/utils/extend.js b/@interactjs/utils/extend.js new file mode 100644 index 000000000..ec4020785 --- /dev/null +++ b/@interactjs/utils/extend.js @@ -0,0 +1,9 @@ +export default function extend(dest, source) { + for (const prop in source) { + dest[prop] = source[prop]; + } + + const ret = dest; + return ret; +} +//# sourceMappingURL=extend.js.map \ No newline at end of file diff --git a/@interactjs/utils/extend.js.map b/@interactjs/utils/extend.js.map new file mode 100644 index 000000000..971abdeff --- /dev/null +++ b/@interactjs/utils/extend.js.map @@ -0,0 +1,17 @@ +{ + "version": 3, + "sources": [ + "extend.ts" + ], + "names": [ + "extend", + "dest", + "source", + "prop", + "ret" + ], + "mappings": "AAAA,eAAe,SAASA,MAAT,CAAsCC,IAAtC,EAA4DC,MAA5D,EAA8E;AAC3F,OAAK,MAAMC,IAAX,IAAmBD,MAAnB,EAA2B;AACxBD,IAAAA,IAAD,CAAuBE,IAAvB,IAA+BD,MAAM,CAACC,IAAD,CAArC;AACD;;AAED,QAAMC,GAAG,GAAGH,IAAZ;AAEA,SAAOG,GAAP;AACD", + "sourcesContent": [ + "export default function extend (dest: U & Partial, source: T): T & U {\n for (const prop in source) {\n (dest as unknown as T)[prop] = source[prop]\n }\n\n const ret = dest as T & U\n\n return ret\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/extend.min.js b/@interactjs/utils/extend.min.js new file mode 100644 index 000000000..f0b474d2f --- /dev/null +++ b/@interactjs/utils/extend.min.js @@ -0,0 +1,2 @@ +export default function n(n,t){for(const o in t)n[o]=t[o];return n} +//# sourceMappingURL=extend.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/extend.min.js.map b/@interactjs/utils/extend.min.js.map new file mode 100644 index 000000000..a739bf1fc --- /dev/null +++ b/@interactjs/utils/extend.min.js.map @@ -0,0 +1,16 @@ +{ + "version": 3, + "sources": [ + "extend.ts" + ], + "names": [ + "extend", + "dest", + "source", + "prop" + ], + "mappings": "eAAe,SAASA,EAA6BC,EAAsBC,GACzE,IAAK,MAAMC,KAAQD,EAChBD,EAAsBE,GAAQD,EAAOC,GAKxC,OAFYF", + "sourcesContent": [ + "export default function extend (dest: U & Partial, source: T): T & U {\n for (const prop in source) {\n (dest as unknown as T)[prop] = source[prop]\n }\n\n const ret = dest as T & U\n\n return ret\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/getOriginXY.d.ts b/@interactjs/utils/getOriginXY.d.ts new file mode 100644 index 000000000..a225708f8 --- /dev/null +++ b/@interactjs/utils/getOriginXY.d.ts @@ -0,0 +1,6 @@ +export default function (target: Interact.HasGetRect & { + options: Interact.PerActionDefaults; +}, element: Node, actionName?: Interact.ActionName): { + x: any; + y: any; +}; diff --git a/@interactjs/utils/getOriginXY.js b/@interactjs/utils/getOriginXY.js new file mode 100644 index 000000000..f694f1a08 --- /dev/null +++ b/@interactjs/utils/getOriginXY.js @@ -0,0 +1,12 @@ +import { rectToXY, resolveRectLike } from "./rect.js"; +export default function (target, element, actionName) { + const actionOptions = target.options[actionName]; + const actionOrigin = actionOptions && actionOptions.origin; + const origin = actionOrigin || target.options.origin; + const originRect = resolveRectLike(origin, target, element, [target && element]); + return rectToXY(originRect) || { + x: 0, + y: 0 + }; +} +//# sourceMappingURL=getOriginXY.js.map \ No newline at end of file diff --git a/@interactjs/utils/getOriginXY.js.map b/@interactjs/utils/getOriginXY.js.map new file mode 100644 index 000000000..b358425ce --- /dev/null +++ b/@interactjs/utils/getOriginXY.js.map @@ -0,0 +1,24 @@ +{ + "version": 3, + "sources": [ + "getOriginXY.ts" + ], + "names": [ + "rectToXY", + "resolveRectLike", + "target", + "element", + "actionName", + "actionOptions", + "options", + "actionOrigin", + "origin", + "originRect", + "x", + "y" + ], + "mappings": "AAAA,SAASA,QAAT,EAAmBC,eAAnB,QAA0C,WAA1C;AAEA,eAAe,UACbC,MADa,EAEbC,OAFa,EAGbC,UAHa,EAIb;AACA,QAAMC,aAAa,GAAIH,MAAM,CAACI,OAAR,CAAwBF,UAAxB,CAAtB;AACA,QAAMG,YAAY,GAAGF,aAAa,IAAIA,aAAa,CAACG,MAApD;AACA,QAAMA,MAAM,GAAGD,YAAY,IAAIL,MAAM,CAACI,OAAP,CAAeE,MAA9C;AAEA,QAAMC,UAAU,GAAGR,eAAe,CAACO,MAAD,EAASN,MAAT,EAAiBC,OAAjB,EAA0B,CAACD,MAAM,IAAIC,OAAX,CAA1B,CAAlC;AAEA,SAAOH,QAAQ,CAACS,UAAD,CAAR,IAAwB;AAAEC,IAAAA,CAAC,EAAE,CAAL;AAAQC,IAAAA,CAAC,EAAE;AAAX,GAA/B;AACD", + "sourcesContent": [ + "import { rectToXY, resolveRectLike } from './rect'\n\nexport default function (\n target: Interact.HasGetRect & { options: Interact.PerActionDefaults },\n element: Node,\n actionName?: Interact.ActionName,\n) {\n const actionOptions = (target.options as any)[actionName]\n const actionOrigin = actionOptions && actionOptions.origin\n const origin = actionOrigin || target.options.origin\n\n const originRect = resolveRectLike(origin, target, element, [target && element])\n\n return rectToXY(originRect) || { x: 0, y: 0 }\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/getOriginXY.min.js b/@interactjs/utils/getOriginXY.min.js new file mode 100644 index 000000000..24a2d6c97 --- /dev/null +++ b/@interactjs/utils/getOriginXY.min.js @@ -0,0 +1,2 @@ +import{rectToXY as o,resolveRectLike as i}from"./rect.min.js";export default(r,t,n)=>{const e=r.options[n],p=e&&e.origin||r.options.origin,s=i(p,r,t,[r&&t]);return o(s)||{x:0,y:0}}; +//# sourceMappingURL=getOriginXY.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/getOriginXY.min.js.map b/@interactjs/utils/getOriginXY.min.js.map new file mode 100644 index 000000000..2bc16fde9 --- /dev/null +++ b/@interactjs/utils/getOriginXY.min.js.map @@ -0,0 +1,23 @@ +{ + "version": 3, + "sources": [ + "getOriginXY.ts" + ], + "names": [ + "rectToXY", + "resolveRectLike", + "target", + "element", + "actionName", + "actionOptions", + "options", + "origin", + "originRect", + "x", + "y" + ], + "mappings": "mBAASA,qBAAUC,MAAuB,8BAE3B,CACbC,EACAC,EACAC,KAEA,MAAMC,EAAiBH,EAAOI,QAAgBF,GAExCG,EADeF,GAAiBA,EAAcE,QACrBL,EAAOI,QAAQC,OAExCC,EAAaP,EAAgBM,EAAQL,EAAQC,EAAS,CAACD,GAAUC,IAEvE,OAAOH,EAASQ,IAAe,CAAEC,EAAG,EAAGC,EAAG", + "sourcesContent": [ + "import { rectToXY, resolveRectLike } from './rect'\n\nexport default function (\n target: Interact.HasGetRect & { options: Interact.PerActionDefaults },\n element: Node,\n actionName?: Interact.ActionName,\n) {\n const actionOptions = (target.options as any)[actionName]\n const actionOrigin = actionOptions && actionOptions.origin\n const origin = actionOrigin || target.options.origin\n\n const originRect = resolveRectLike(origin, target, element, [target && element])\n\n return rectToXY(originRect) || { x: 0, y: 0 }\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/hypot.d.ts b/@interactjs/utils/hypot.d.ts new file mode 100644 index 000000000..a9ae05c6f --- /dev/null +++ b/@interactjs/utils/hypot.d.ts @@ -0,0 +1,2 @@ +declare const _default: (x: number, y: number) => number; +export default _default; diff --git a/@interactjs/utils/hypot.js b/@interactjs/utils/hypot.js new file mode 100644 index 000000000..d3512e243 --- /dev/null +++ b/@interactjs/utils/hypot.js @@ -0,0 +1,2 @@ +export default ((x, y) => Math.sqrt(x * x + y * y)); +//# sourceMappingURL=hypot.js.map \ No newline at end of file diff --git a/@interactjs/utils/hypot.js.map b/@interactjs/utils/hypot.js.map new file mode 100644 index 000000000..02b62f173 --- /dev/null +++ b/@interactjs/utils/hypot.js.map @@ -0,0 +1,16 @@ +{ + "version": 3, + "sources": [ + "hypot.ts" + ], + "names": [ + "x", + "y", + "Math", + "sqrt" + ], + "mappings": "AAAA,gBAAe,CAACA,CAAD,EAAYC,CAAZ,KAA2BC,IAAI,CAACC,IAAL,CAAUH,CAAC,GAAGA,CAAJ,GAAQC,CAAC,GAAGA,CAAtB,CAA1C", + "sourcesContent": [ + "export default (x: number, y: number) => Math.sqrt(x * x + y * y)\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/hypot.min.js b/@interactjs/utils/hypot.min.js new file mode 100644 index 000000000..44702ddc5 --- /dev/null +++ b/@interactjs/utils/hypot.min.js @@ -0,0 +1,2 @@ +export default(t,a)=>Math.sqrt(t*t+a*a); +//# sourceMappingURL=hypot.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/hypot.min.js.map b/@interactjs/utils/hypot.min.js.map new file mode 100644 index 000000000..d8e0a7cb1 --- /dev/null +++ b/@interactjs/utils/hypot.min.js.map @@ -0,0 +1,16 @@ +{ + "version": 3, + "sources": [ + "hypot.ts" + ], + "names": [ + "x", + "y", + "Math", + "sqrt" + ], + "mappings": "cAAA,CAAgBA,EAAWC,IAAeC,KAAKC,KAAKH,EAAIA,EAAIC,EAAIA", + "sourcesContent": [ + "export default (x: number, y: number) => Math.sqrt(x * x + y * y)\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/index.d.ts b/@interactjs/utils/index.d.ts new file mode 100644 index 000000000..4244cebb9 --- /dev/null +++ b/@interactjs/utils/index.d.ts @@ -0,0 +1,17 @@ +import * as arr from './arr'; +import * as dom from './domUtils'; +import * as is from './is'; +import * as pointer from './pointerUtils'; +import * as rect from './rect'; +import win from './window'; +export declare function warnOnce(this: T, method: (...args: any[]) => any, message: string): (this: T) => any; +export declare function copyAction(dest: Interact.ActionProps, src: Interact.ActionProps): import("@interactjs/core/Interaction").ActionProps; +export { default as browser } from './browser'; +export { default as clone } from './clone'; +export { default as events } from './events'; +export { default as extend } from './extend'; +export { default as getOriginXY } from './getOriginXY'; +export { default as hypot } from './hypot'; +export { default as normalizeListeners } from './normalizeListeners'; +export { default as raf } from './raf'; +export { win, arr, dom, is, pointer, rect }; diff --git a/@interactjs/utils/index.js b/@interactjs/utils/index.js new file mode 100644 index 000000000..28c2bc7a4 --- /dev/null +++ b/@interactjs/utils/index.js @@ -0,0 +1,34 @@ +import * as arr from "./arr.js"; +import * as dom from "./domUtils.js"; +import * as is from "./is.js"; +import * as pointer from "./pointerUtils.js"; +import * as rect from "./rect.js"; +import win from "./window.js"; +export function warnOnce(method, message) { + let warned = false; // eslint-disable-next-line no-shadow + + return function () { + if (!warned) { + win.window.console.warn(message); + warned = true; + } + + return method.apply(this, arguments); + }; +} +export function copyAction(dest, src) { + dest.name = src.name; + dest.axis = src.axis; + dest.edges = src.edges; + return dest; +} +export { default as browser } from "./browser.js"; +export { default as clone } from "./clone.js"; +export { default as events } from "./events.js"; +export { default as extend } from "./extend.js"; +export { default as getOriginXY } from "./getOriginXY.js"; +export { default as hypot } from "./hypot.js"; +export { default as normalizeListeners } from "./normalizeListeners.js"; +export { default as raf } from "./raf.js"; +export { win, arr, dom, is, pointer, rect }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@interactjs/utils/index.js.map b/@interactjs/utils/index.js.map new file mode 100644 index 000000000..1b95a6dc3 --- /dev/null +++ b/@interactjs/utils/index.js.map @@ -0,0 +1,42 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "arr", + "dom", + "is", + "pointer", + "rect", + "win", + "warnOnce", + "method", + "message", + "warned", + "window", + "console", + "warn", + "apply", + "arguments", + "copyAction", + "dest", + "src", + "name", + "axis", + "edges", + "default", + "browser", + "clone", + "events", + "extend", + "getOriginXY", + "hypot", + "normalizeListeners", + "raf" + ], + "mappings": "AAAA,OAAO,KAAKA,GAAZ,MAAqB,UAArB;AACA,OAAO,KAAKC,GAAZ,MAAqB,eAArB;AACA,OAAO,KAAKC,EAAZ,MAAoB,SAApB;AACA,OAAO,KAAKC,OAAZ,MAAyB,mBAAzB;AACA,OAAO,KAAKC,IAAZ,MAAsB,WAAtB;AACA,OAAOC,GAAP,MAAgB,aAAhB;AAEA,OAAO,SAASC,QAAT,CAA+BC,MAA/B,EAAgEC,OAAhE,EAAiF;AACtF,MAAIC,MAAM,GAAG,KAAb,CADsF,CAGtF;;AACA,SAAO,YAAmB;AACxB,QAAI,CAACA,MAAL,EAAa;AACVJ,MAAAA,GAAD,CAAaK,MAAb,CAAoBC,OAApB,CAA4BC,IAA5B,CAAiCJ,OAAjC;AACAC,MAAAA,MAAM,GAAG,IAAT;AACD;;AAED,WAAOF,MAAM,CAACM,KAAP,CAAa,IAAb,EAAmBC,SAAnB,CAAP;AACD,GAPD;AAQD;AAED,OAAO,SAASC,UAAT,CAAqBC,IAArB,EAAiDC,GAAjD,EAA4E;AACjFD,EAAAA,IAAI,CAACE,IAAL,GAAaD,GAAG,CAACC,IAAjB;AACAF,EAAAA,IAAI,CAACG,IAAL,GAAaF,GAAG,CAACE,IAAjB;AACAH,EAAAA,IAAI,CAACI,KAAL,GAAaH,GAAG,CAACG,KAAjB;AAEA,SAAOJ,IAAP;AACD;AAED,SAASK,OAAO,IAAIC,OAApB,QAAmC,cAAnC;AACA,SAASD,OAAO,IAAIE,KAApB,QAAiC,YAAjC;AACA,SAASF,OAAO,IAAIG,MAApB,QAAkC,aAAlC;AACA,SAASH,OAAO,IAAII,MAApB,QAAkC,aAAlC;AACA,SAASJ,OAAO,IAAIK,WAApB,QAAuC,kBAAvC;AACA,SAASL,OAAO,IAAIM,KAApB,QAAiC,YAAjC;AACA,SAASN,OAAO,IAAIO,kBAApB,QAA8C,yBAA9C;AACA,SAASP,OAAO,IAAIQ,GAApB,QAA+B,UAA/B;AACA,SAASxB,GAAT,EAAcL,GAAd,EAAmBC,GAAnB,EAAwBC,EAAxB,EAA4BC,OAA5B,EAAqCC,IAArC", + "sourcesContent": [ + "import * as arr from './arr'\nimport * as dom from './domUtils'\nimport * as is from './is'\nimport * as pointer from './pointerUtils'\nimport * as rect from './rect'\nimport win from './window'\n\nexport function warnOnce (this: T, method: (...args: any[]) => any, message: string) {\n let warned = false\n\n // eslint-disable-next-line no-shadow\n return function (this: T) {\n if (!warned) {\n (win as any).window.console.warn(message)\n warned = true\n }\n\n return method.apply(this, arguments)\n }\n}\n\nexport function copyAction (dest: Interact.ActionProps, src: Interact.ActionProps) {\n dest.name = src.name\n dest.axis = src.axis\n dest.edges = src.edges\n\n return dest\n}\n\nexport { default as browser } from './browser'\nexport { default as clone } from './clone'\nexport { default as events } from './events'\nexport { default as extend } from './extend'\nexport { default as getOriginXY } from './getOriginXY'\nexport { default as hypot } from './hypot'\nexport { default as normalizeListeners } from './normalizeListeners'\nexport { default as raf } from './raf'\nexport { win, arr, dom, is, pointer, rect }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/index.min.js b/@interactjs/utils/index.min.js new file mode 100644 index 000000000..8aae1fe31 --- /dev/null +++ b/@interactjs/utils/index.min.js @@ -0,0 +1,2 @@ +import*as r from"./arr.min.js";import*as e from"./domUtils.min.js";import*as o from"./is.min.js";import*as t from"./pointerUtils.min.js";import*as n from"./rect.min.js";import s from"./window.min.js";export function warnOnce(r,e){let o=!1;return function(){return o||(s.window.console.warn(e),o=!0),r.apply(this,arguments)}}export function copyAction(r,e){return r.name=e.name,r.axis=e.axis,r.edges=e.edges,r}export{default as browser}from"./browser.min.js";export{default as clone}from"./clone.min.js";export{default as events}from"./events.min.js";export{default as extend}from"./extend.min.js";export{default as getOriginXY}from"./getOriginXY.min.js";export{default as hypot}from"./hypot.min.js";export{default as normalizeListeners}from"./normalizeListeners.min.js";export{default as raf}from"./raf.min.js";export{s as win,r as arr,e as dom,o as is,t as pointer,n as rect}; +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/index.min.js.map b/@interactjs/utils/index.min.js.map new file mode 100644 index 000000000..8aaafea53 --- /dev/null +++ b/@interactjs/utils/index.min.js.map @@ -0,0 +1,35 @@ +{ + "version": 3, + "sources": [ + "index.ts" + ], + "names": [ + "arr", + "dom", + "is", + "pointer", + "rect", + "win", + "warnOnce", + "method", + "message", + "warned", + "window", + "console", + "warn", + "apply", + "this", + "arguments", + "copyAction", + "dest", + "src", + "name", + "axis", + "edges", + "default" + ], + "mappings": "UAAYA,MAAS,yBACTC,MAAS,8BACTC,MAAQ,wBACRC,MAAa,kCACbC,MAAU,uBACfC,MAAS,yBAET,SAASC,SAAsBC,EAAiCC,GACrE,IAAIC,GAAS,EAGb,OAAO,WAML,OALKA,IACFJ,EAAYK,OAAOC,QAAQC,KAAKJ,GACjCC,GAAS,GAGJF,EAAOM,MAAMC,KAAMC,mBAIvB,SAASC,WAAYC,EAA4BC,GAKtD,OAJAD,EAAKE,KAAQD,EAAIC,KACjBF,EAAKG,KAAQF,EAAIE,KACjBH,EAAKI,MAAQH,EAAIG,MAEVJ,SAGAK,uBAA0B,0BAC1BA,qBAAwB,wBACxBA,sBAAyB,yBACzBA,sBAAyB,yBACzBA,2BAA8B,8BAC9BA,qBAAwB,wBACxBA,kCAAqC,qCACrCA,mBAAsB,sBACtBjB,SAAKL,SAAKC,SAAKC,QAAIC,aAASC", + "sourcesContent": [ + "import * as arr from './arr'\nimport * as dom from './domUtils'\nimport * as is from './is'\nimport * as pointer from './pointerUtils'\nimport * as rect from './rect'\nimport win from './window'\n\nexport function warnOnce (this: T, method: (...args: any[]) => any, message: string) {\n let warned = false\n\n // eslint-disable-next-line no-shadow\n return function (this: T) {\n if (!warned) {\n (win as any).window.console.warn(message)\n warned = true\n }\n\n return method.apply(this, arguments)\n }\n}\n\nexport function copyAction (dest: Interact.ActionProps, src: Interact.ActionProps) {\n dest.name = src.name\n dest.axis = src.axis\n dest.edges = src.edges\n\n return dest\n}\n\nexport { default as browser } from './browser'\nexport { default as clone } from './clone'\nexport { default as events } from './events'\nexport { default as extend } from './extend'\nexport { default as getOriginXY } from './getOriginXY'\nexport { default as hypot } from './hypot'\nexport { default as normalizeListeners } from './normalizeListeners'\nexport { default as raf } from './raf'\nexport { win, arr, dom, is, pointer, rect }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/is.d.ts b/@interactjs/utils/is.d.ts new file mode 100644 index 000000000..f8b0fe799 --- /dev/null +++ b/@interactjs/utils/is.d.ts @@ -0,0 +1,12 @@ +export declare const window: (thing: any) => thing is Window; +export declare const docFrag: (thing: any) => thing is DocumentFragment; +export declare const object: (thing: any) => thing is { + [index: string]: any; +}; +export declare const func: (thing: any) => thing is (...args: any[]) => any; +export declare const number: (thing: any) => thing is number; +export declare const bool: (thing: any) => thing is boolean; +export declare const string: (thing: any) => thing is string; +export declare const element: (thing: any) => thing is import("@interactjs/types/types").Element; +export declare const plainObject: typeof object; +export declare const array: (thing: any) => thing is T[]; diff --git a/@interactjs/utils/is.js b/@interactjs/utils/is.js new file mode 100644 index 000000000..90008a46d --- /dev/null +++ b/@interactjs/utils/is.js @@ -0,0 +1,23 @@ +// tslint:disable variable-name +import isWindow from "./isWindow.js"; +import win from "./window.js"; +export const window = thing => thing === win.window || isWindow(thing); +export const docFrag = thing => object(thing) && thing.nodeType === 11; +export const object = thing => !!thing && typeof thing === 'object'; +export const func = thing => typeof thing === 'function'; +export const number = thing => typeof thing === 'number'; +export const bool = thing => typeof thing === 'boolean'; +export const string = thing => typeof thing === 'string'; +export const element = thing => { + if (!thing || typeof thing !== 'object') { + return false; + } + + const _window = win.getWindow(thing) || win.window; + + return /object|function/.test(typeof _window.Element) ? thing instanceof _window.Element // DOM2 + : thing.nodeType === 1 && typeof thing.nodeName === 'string'; +}; +export const plainObject = thing => object(thing) && !!thing.constructor && /function Object\b/.test(thing.constructor.toString()); +export const array = thing => object(thing) && typeof thing.length !== 'undefined' && func(thing.splice); +//# sourceMappingURL=is.js.map \ No newline at end of file diff --git a/@interactjs/utils/is.js.map b/@interactjs/utils/is.js.map new file mode 100644 index 000000000..947c03f25 --- /dev/null +++ b/@interactjs/utils/is.js.map @@ -0,0 +1,35 @@ +{ + "version": 3, + "sources": [ + "is.ts" + ], + "names": [ + "isWindow", + "win", + "window", + "thing", + "docFrag", + "object", + "nodeType", + "func", + "number", + "bool", + "string", + "element", + "_window", + "getWindow", + "test", + "Element", + "nodeName", + "plainObject", + "constructor", + "toString", + "array", + "length", + "splice" + ], + "mappings": "AAAA;AAEA,OAAOA,QAAP,MAAqB,eAArB;AACA,OAAOC,GAAP,MAAgB,aAAhB;AAEA,OAAO,MAAMC,MAAM,GAAIC,KAAD,IACpBA,KAAK,KAAKF,GAAG,CAACC,MAAd,IAAwBF,QAAQ,CAACG,KAAD,CAD3B;AAGP,OAAO,MAAMC,OAAO,GAAID,KAAD,IACrBE,MAAM,CAACF,KAAD,CAAN,IAAiBA,KAAK,CAACG,QAAN,KAAmB,EAD/B;AAGP,OAAO,MAAMD,MAAM,GAAIF,KAAD,IACpB,CAAC,CAACA,KAAF,IAAY,OAAOA,KAAP,KAAiB,QADxB;AAGP,OAAO,MAAMI,IAAI,GAAIJ,KAAD,IAClB,OAAOA,KAAP,KAAiB,UADZ;AAGP,OAAO,MAAMK,MAAM,GAAIL,KAAD,IACpB,OAAOA,KAAP,KAAiB,QADZ;AAGP,OAAO,MAAMM,IAAI,GAAIN,KAAD,IAClB,OAAOA,KAAP,KAAiB,SADZ;AAGP,OAAO,MAAMO,MAAM,GAAIP,KAAD,IACpB,OAAOA,KAAP,KAAiB,QADZ;AAGP,OAAO,MAAMQ,OAAO,GAAIR,KAAD,IAA2C;AAChE,MAAI,CAACA,KAAD,IAAW,OAAOA,KAAP,KAAiB,QAAhC,EAA2C;AAAE,WAAO,KAAP;AAAc;;AAE3D,QAAMS,OAAO,GAAGX,GAAG,CAACY,SAAJ,CAAcV,KAAd,KAAwBF,GAAG,CAACC,MAA5C;;AAEA,SAAQ,kBAAkBY,IAAlB,CAAuB,OAAOF,OAAO,CAACG,OAAtC,IACJZ,KAAK,YAAYS,OAAO,CAACG,OADrB,CAC6B;AAD7B,IAEJZ,KAAK,CAACG,QAAN,KAAmB,CAAnB,IAAwB,OAAOH,KAAK,CAACa,QAAb,KAA0B,QAFtD;AAGD,CARM;AAUP,OAAO,MAAMC,WAA0B,GAAId,KAAD,IACxCE,MAAM,CAACF,KAAD,CAAN,IACA,CAAC,CAACA,KAAK,CAACe,WADR,IAEA,oBAAoBJ,IAApB,CAAyBX,KAAK,CAACe,WAAN,CAAkBC,QAAlB,EAAzB,CAHK;AAKP,OAAO,MAAMC,KAAK,GAAuBjB,KAApB,IAClBE,MAAM,CAACF,KAAD,CAAN,IACA,OAAOA,KAAK,CAACkB,MAAb,KAAwB,WADxB,IAEDd,IAAI,CAACJ,KAAK,CAACmB,MAAP,CAHC", + "sourcesContent": [ + "// tslint:disable variable-name\n\nimport isWindow from './isWindow'\nimport win from './window'\n\nexport const window = (thing: any): thing is Window =>\n thing === win.window || isWindow(thing)\n\nexport const docFrag = (thing: any): thing is DocumentFragment =>\n object(thing) && thing.nodeType === 11\n\nexport const object = (thing: any): thing is { [index: string]: any } =>\n !!thing && (typeof thing === 'object')\n\nexport const func = (thing: any): thing is (...args: any[]) => any =>\n typeof thing === 'function'\n\nexport const number = (thing: any): thing is number =>\n typeof thing === 'number'\n\nexport const bool = (thing: any): thing is boolean =>\n typeof thing === 'boolean'\n\nexport const string = (thing: any): thing is string =>\n typeof thing === 'string'\n\nexport const element = (thing: any): thing is Interact.Element => {\n if (!thing || (typeof thing !== 'object')) { return false }\n\n const _window = win.getWindow(thing) || win.window\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element // DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string')\n}\n\nexport const plainObject: typeof object = (thing: any): thing is { [index: string]: any } =>\n object(thing) &&\n !!thing.constructor &&\n /function Object\\b/.test(thing.constructor.toString())\n\nexport const array = (thing: any): thing is T[] =>\n (object(thing) &&\n (typeof thing.length !== 'undefined') &&\n func(thing.splice))\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/is.min.js b/@interactjs/utils/is.min.js new file mode 100644 index 000000000..625083efe --- /dev/null +++ b/@interactjs/utils/is.min.js @@ -0,0 +1,2 @@ +import o from"./isWindow.min.js";import t from"./window.min.js";export const window=e=>e===t.window||o(e);export const docFrag=o=>object(o)&&11===o.nodeType;export const object=o=>!!o&&"object"==typeof o;export const func=o=>"function"==typeof o;export const number=o=>"number"==typeof o;export const bool=o=>"boolean"==typeof o;export const string=o=>"string"==typeof o;export const element=o=>{if(!o||"object"!=typeof o)return!1;const e=t.getWindow(o)||t.window;return/object|function/.test(typeof e.Element)?o instanceof e.Element:1===o.nodeType&&"string"==typeof o.nodeName};export const plainObject=o=>object(o)&&!!o.constructor&&/function Object\b/.test(o.constructor.toString());export const array=o=>object(o)&&void 0!==o.length&&func(o.splice); +//# sourceMappingURL=is.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/is.min.js.map b/@interactjs/utils/is.min.js.map new file mode 100644 index 000000000..0e7c6fd72 --- /dev/null +++ b/@interactjs/utils/is.min.js.map @@ -0,0 +1,35 @@ +{ + "version": 3, + "sources": [ + "is.ts" + ], + "names": [ + "isWindow", + "win", + "window", + "thing", + "docFrag", + "object", + "nodeType", + "func", + "number", + "bool", + "string", + "element", + "_window", + "getWindow", + "test", + "Element", + "nodeName", + "plainObject", + "constructor", + "toString", + "array", + "length", + "splice" + ], + "mappings": "OAEOA,MAAc,2BACdC,MAAS,yBAET,MAAMC,OAAUC,GACrBA,IAAUF,EAAIC,QAAUF,EAASG,UAE5B,MAAMC,QAAWD,GACtBE,OAAOF,IAA6B,KAAnBA,EAAMG,gBAElB,MAAMD,OAAUF,KACnBA,GAA2B,iBAAVA,SAEd,MAAMI,KAAQJ,GACF,mBAAVA,SAEF,MAAMK,OAAUL,GACJ,iBAAVA,SAEF,MAAMM,KAAQN,GACF,kBAAVA,SAEF,MAAMO,OAAUP,GACJ,iBAAVA,SAEF,MAAMQ,QAAWR,IACtB,IAAKA,GAA2B,iBAAVA,EAAuB,OAAO,EAEpD,MAAMS,EAAUX,EAAIY,UAAUV,IAAUF,EAAIC,OAE5C,MAAQ,kBAAkBY,YAAYF,EAAQG,SAC1CZ,aAAiBS,EAAQG,QACN,IAAnBZ,EAAMG,UAA4C,iBAAnBH,EAAMa,iBAGpC,MAAMC,YAA8Bd,GACzCE,OAAOF,MACLA,EAAMe,aACR,oBAAoBJ,KAAKX,EAAMe,YAAYC,mBAEtC,MAAMC,MAA4BjB,GACtCE,OAAOF,SACiB,IAAjBA,EAAMkB,QACdd,KAAKJ,EAAMmB", + "sourcesContent": [ + "// tslint:disable variable-name\n\nimport isWindow from './isWindow'\nimport win from './window'\n\nexport const window = (thing: any): thing is Window =>\n thing === win.window || isWindow(thing)\n\nexport const docFrag = (thing: any): thing is DocumentFragment =>\n object(thing) && thing.nodeType === 11\n\nexport const object = (thing: any): thing is { [index: string]: any } =>\n !!thing && (typeof thing === 'object')\n\nexport const func = (thing: any): thing is (...args: any[]) => any =>\n typeof thing === 'function'\n\nexport const number = (thing: any): thing is number =>\n typeof thing === 'number'\n\nexport const bool = (thing: any): thing is boolean =>\n typeof thing === 'boolean'\n\nexport const string = (thing: any): thing is string =>\n typeof thing === 'string'\n\nexport const element = (thing: any): thing is Interact.Element => {\n if (!thing || (typeof thing !== 'object')) { return false }\n\n const _window = win.getWindow(thing) || win.window\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element // DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string')\n}\n\nexport const plainObject: typeof object = (thing: any): thing is { [index: string]: any } =>\n object(thing) &&\n !!thing.constructor &&\n /function Object\\b/.test(thing.constructor.toString())\n\nexport const array = (thing: any): thing is T[] =>\n (object(thing) &&\n (typeof thing.length !== 'undefined') &&\n func(thing.splice))\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/isWindow.d.ts b/@interactjs/utils/isWindow.d.ts new file mode 100644 index 000000000..eb3719fa8 --- /dev/null +++ b/@interactjs/utils/isWindow.d.ts @@ -0,0 +1,2 @@ +declare const _default: (thing: any) => boolean; +export default _default; diff --git a/@interactjs/utils/isWindow.js b/@interactjs/utils/isWindow.js new file mode 100644 index 000000000..55efd021e --- /dev/null +++ b/@interactjs/utils/isWindow.js @@ -0,0 +1,2 @@ +export default (thing => !!(thing && thing.Window) && thing instanceof thing.Window); +//# sourceMappingURL=isWindow.js.map \ No newline at end of file diff --git a/@interactjs/utils/isWindow.js.map b/@interactjs/utils/isWindow.js.map new file mode 100644 index 000000000..b8fd6d38e --- /dev/null +++ b/@interactjs/utils/isWindow.js.map @@ -0,0 +1,14 @@ +{ + "version": 3, + "sources": [ + "isWindow.ts" + ], + "names": [ + "thing", + "Window" + ], + "mappings": "AAAA,gBAAgBA,KAAD,IAAgB,CAAC,EAAEA,KAAK,IAAIA,KAAK,CAACC,MAAjB,CAAD,IAA8BD,KAAK,YAAYA,KAAK,CAACC,MAApF", + "sourcesContent": [ + "export default (thing: any) => !!(thing && thing.Window) && (thing instanceof thing.Window)\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/isWindow.min.js b/@interactjs/utils/isWindow.min.js new file mode 100644 index 000000000..6685126ad --- /dev/null +++ b/@interactjs/utils/isWindow.min.js @@ -0,0 +1,2 @@ +export default n=>!(!n||!n.Window)&&n instanceof n.Window; +//# sourceMappingURL=isWindow.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/isWindow.min.js.map b/@interactjs/utils/isWindow.min.js.map new file mode 100644 index 000000000..b8820b4a4 --- /dev/null +++ b/@interactjs/utils/isWindow.min.js.map @@ -0,0 +1,14 @@ +{ + "version": 3, + "sources": [ + "isWindow.ts" + ], + "names": [ + "thing", + "Window" + ], + "mappings": "eAAgBA,MAAkBA,IAASA,EAAMC,SAAYD,aAAiBA,EAAMC", + "sourcesContent": [ + "export default (thing: any) => !!(thing && thing.Window) && (thing instanceof thing.Window)\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/normalizeListeners.d.ts b/@interactjs/utils/normalizeListeners.d.ts new file mode 100644 index 000000000..96389ffc6 --- /dev/null +++ b/@interactjs/utils/normalizeListeners.d.ts @@ -0,0 +1,4 @@ +export interface NormalizedListeners { + [type: string]: Interact.Listener[]; +} +export default function normalize(type: Interact.EventTypes, listeners?: Interact.ListenersArg | Interact.ListenersArg[], result?: NormalizedListeners): NormalizedListeners; diff --git a/@interactjs/utils/normalizeListeners.js b/@interactjs/utils/normalizeListeners.js new file mode 100644 index 000000000..514876dc8 --- /dev/null +++ b/@interactjs/utils/normalizeListeners.js @@ -0,0 +1,40 @@ +import extend from "./extend.js"; +import * as is from "./is.js"; +export default function normalize(type, listeners, result) { + result = result || {}; + + if (is.string(type) && type.search(' ') !== -1) { + type = split(type); + } + + if (is.array(type)) { + return type.reduce((acc, t) => extend(acc, normalize(t, listeners, result)), result); + } // ({ type: fn }) -> ('', { type: fn }) + + + if (is.object(type)) { + listeners = type; + type = ''; + } + + if (is.func(listeners)) { + result[type] = result[type] || []; + result[type].push(listeners); + } else if (is.array(listeners)) { + for (const l of listeners) { + normalize(type, l, result); + } + } else if (is.object(listeners)) { + for (const prefix in listeners) { + const combinedTypes = split(prefix).map(p => `${type}${p}`); + normalize(combinedTypes, listeners[prefix], result); + } + } + + return result; +} + +function split(type) { + return type.trim().split(/ +/); +} +//# sourceMappingURL=normalizeListeners.js.map \ No newline at end of file diff --git a/@interactjs/utils/normalizeListeners.js.map b/@interactjs/utils/normalizeListeners.js.map new file mode 100644 index 000000000..a0300c7aa --- /dev/null +++ b/@interactjs/utils/normalizeListeners.js.map @@ -0,0 +1,34 @@ +{ + "version": 3, + "sources": [ + "normalizeListeners.ts" + ], + "names": [ + "extend", + "is", + "normalize", + "type", + "listeners", + "result", + "string", + "search", + "split", + "array", + "reduce", + "acc", + "t", + "object", + "func", + "push", + "l", + "prefix", + "combinedTypes", + "map", + "p", + "trim" + ], + "mappings": "AAAA,OAAOA,MAAP,MAAmB,aAAnB;AACA,OAAO,KAAKC,EAAZ,MAAoB,SAApB;AAMA,eAAe,SAASC,SAAT,CACbC,IADa,EAEbC,SAFa,EAGbC,MAHa,EAIQ;AACrBA,EAAAA,MAAM,GAAGA,MAAM,IAAI,EAAnB;;AAEA,MAAIJ,EAAE,CAACK,MAAH,CAAUH,IAAV,KAAmBA,IAAI,CAACI,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAA7C,EAAgD;AAC9CJ,IAAAA,IAAI,GAAGK,KAAK,CAACL,IAAD,CAAZ;AACD;;AAED,MAAIF,EAAE,CAACQ,KAAH,CAASN,IAAT,CAAJ,EAAoB;AAClB,WAAOA,IAAI,CAACO,MAAL,CACL,CAACC,GAAD,EAAMC,CAAN,KAAYZ,MAAM,CAACW,GAAD,EAAMT,SAAS,CAACU,CAAD,EAAIR,SAAJ,EAAeC,MAAf,CAAf,CADb,EAELA,MAFK,CAAP;AAID,GAZoB,CAcrB;;;AACA,MAAIJ,EAAE,CAACY,MAAH,CAAUV,IAAV,CAAJ,EAAqB;AACnBC,IAAAA,SAAS,GAAGD,IAAZ;AACAA,IAAAA,IAAI,GAAG,EAAP;AACD;;AAED,MAAIF,EAAE,CAACa,IAAH,CAAQV,SAAR,CAAJ,EAAwB;AACtBC,IAAAA,MAAM,CAACF,IAAD,CAAN,GAAeE,MAAM,CAACF,IAAD,CAAN,IAAgB,EAA/B;AACAE,IAAAA,MAAM,CAACF,IAAD,CAAN,CAAaY,IAAb,CAAkBX,SAAlB;AACD,GAHD,MAIK,IAAIH,EAAE,CAACQ,KAAH,CAASL,SAAT,CAAJ,EAAyB;AAC5B,SAAK,MAAMY,CAAX,IAAgBZ,SAAhB,EAA2B;AACzBF,MAAAA,SAAS,CAACC,IAAD,EAAOa,CAAP,EAAUX,MAAV,CAAT;AACD;AACF,GAJI,MAKA,IAAIJ,EAAE,CAACY,MAAH,CAAUT,SAAV,CAAJ,EAA0B;AAC7B,SAAK,MAAMa,MAAX,IAAqBb,SAArB,EAAgC;AAC9B,YAAMc,aAAa,GAAGV,KAAK,CAACS,MAAD,CAAL,CAAcE,GAAd,CAAkBC,CAAC,IAAK,GAAEjB,IAAK,GAAEiB,CAAE,EAAnC,CAAtB;AAEAlB,MAAAA,SAAS,CAACgB,aAAD,EAAgBd,SAAS,CAACa,MAAD,CAAzB,EAAmCZ,MAAnC,CAAT;AACD;AACF;;AAED,SAAOA,MAAP;AACD;;AAED,SAASG,KAAT,CAAgBL,IAAhB,EAA8B;AAC5B,SAAOA,IAAI,CAACkB,IAAL,GAAYb,KAAZ,CAAkB,IAAlB,CAAP;AACD", + "sourcesContent": [ + "import extend from './extend'\nimport * as is from './is'\n\nexport interface NormalizedListeners {\n [type: string]: Interact.Listener[]\n}\n\nexport default function normalize (\n type: Interact.EventTypes,\n listeners?: Interact.ListenersArg | Interact.ListenersArg[],\n result?: NormalizedListeners,\n): NormalizedListeners {\n result = result || {}\n\n if (is.string(type) && type.search(' ') !== -1) {\n type = split(type)\n }\n\n if (is.array(type)) {\n return type.reduce(\n (acc, t) => extend(acc, normalize(t, listeners, result)),\n result,\n )\n }\n\n // ({ type: fn }) -> ('', { type: fn })\n if (is.object(type)) {\n listeners = type\n type = ''\n }\n\n if (is.func(listeners)) {\n result[type] = result[type] || []\n result[type].push(listeners)\n }\n else if (is.array(listeners)) {\n for (const l of listeners) {\n normalize(type, l, result)\n }\n }\n else if (is.object(listeners)) {\n for (const prefix in listeners) {\n const combinedTypes = split(prefix).map(p => `${type}${p}`)\n\n normalize(combinedTypes, listeners[prefix], result)\n }\n }\n\n return result as NormalizedListeners\n}\n\nfunction split (type: string) {\n return type.trim().split(/ +/)\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/normalizeListeners.min.js b/@interactjs/utils/normalizeListeners.min.js new file mode 100644 index 000000000..faa3ceb95 --- /dev/null +++ b/@interactjs/utils/normalizeListeners.min.js @@ -0,0 +1,2 @@ +import r from"./extend.min.js";import*as t from"./is.min.js";export default function e(n,o,f){if(f=f||{},t.string(n)&&-1!==n.search(" ")&&(n=i(n)),t.array(n))return n.reduce((t,i)=>r(t,e(i,o,f)),f);if(t.object(n)&&(o=n,n=""),t.func(o))f[n]=f[n]||[],f[n].push(o);else if(t.array(o))for(const r of o)e(n,r,f);else if(t.object(o))for(const r in o){e(i(r).map(r=>`${n}${r}`),o[r],f)}return f}function i(r){return r.trim().split(/ +/)} +//# sourceMappingURL=normalizeListeners.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/normalizeListeners.min.js.map b/@interactjs/utils/normalizeListeners.min.js.map new file mode 100644 index 000000000..078012a13 --- /dev/null +++ b/@interactjs/utils/normalizeListeners.min.js.map @@ -0,0 +1,33 @@ +{ + "version": 3, + "sources": [ + "normalizeListeners.ts" + ], + "names": [ + "extend", + "is", + "normalize", + "type", + "listeners", + "result", + "string", + "search", + "split", + "array", + "reduce", + "acc", + "t", + "object", + "func", + "push", + "l", + "prefix", + "map", + "p", + "trim" + ], + "mappings": "OAAOA,MAAY,4BACPC,MAAQ,6BAML,SAASC,EACtBC,EACAC,EACAC,GAQA,GANAA,EAASA,GAAU,GAEfJ,EAAGK,OAAOH,KAA+B,IAAtBA,EAAKI,OAAO,OACjCJ,EAAOK,EAAML,IAGXF,EAAGQ,MAAMN,GACX,OAAOA,EAAKO,OACV,CAACC,EAAKC,IAAMZ,EAAOW,EAAKT,EAAUU,EAAGR,EAAWC,IAChDA,GAUJ,GALIJ,EAAGY,OAAOV,KACZC,EAAYD,EACZA,EAAO,IAGLF,EAAGa,KAAKV,GACVC,EAAOF,GAAQE,EAAOF,IAAS,GAC/BE,EAAOF,GAAMY,KAAKX,QAEf,GAAIH,EAAGQ,MAAML,GAChB,IAAK,MAAMY,KAAKZ,EACdF,EAAUC,EAAMa,EAAGX,QAGlB,GAAIJ,EAAGY,OAAOT,GACjB,IAAK,MAAMa,KAAUb,EAAW,CAG9BF,EAFsBM,EAAMS,GAAQC,IAAIC,GAAM,GAAEhB,IAAOgB,KAE9Bf,EAAUa,GAASZ,GAIhD,OAAOA,EAGT,SAASG,EAAOL,GACd,OAAOA,EAAKiB,OAAOZ,MAAM", + "sourcesContent": [ + "import extend from './extend'\nimport * as is from './is'\n\nexport interface NormalizedListeners {\n [type: string]: Interact.Listener[]\n}\n\nexport default function normalize (\n type: Interact.EventTypes,\n listeners?: Interact.ListenersArg | Interact.ListenersArg[],\n result?: NormalizedListeners,\n): NormalizedListeners {\n result = result || {}\n\n if (is.string(type) && type.search(' ') !== -1) {\n type = split(type)\n }\n\n if (is.array(type)) {\n return type.reduce(\n (acc, t) => extend(acc, normalize(t, listeners, result)),\n result,\n )\n }\n\n // ({ type: fn }) -> ('', { type: fn })\n if (is.object(type)) {\n listeners = type\n type = ''\n }\n\n if (is.func(listeners)) {\n result[type] = result[type] || []\n result[type].push(listeners)\n }\n else if (is.array(listeners)) {\n for (const l of listeners) {\n normalize(type, l, result)\n }\n }\n else if (is.object(listeners)) {\n for (const prefix in listeners) {\n const combinedTypes = split(prefix).map(p => `${type}${p}`)\n\n normalize(combinedTypes, listeners[prefix], result)\n }\n }\n\n return result as NormalizedListeners\n}\n\nfunction split (type: string) {\n return type.trim().split(/ +/)\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/normalizeListeners.spec.d.ts b/@interactjs/utils/normalizeListeners.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/@interactjs/utils/normalizeListeners.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/@interactjs/utils/pointerExtend.d.ts b/@interactjs/utils/pointerExtend.d.ts new file mode 100644 index 000000000..8aad3417e --- /dev/null +++ b/@interactjs/utils/pointerExtend.d.ts @@ -0,0 +1,12 @@ +export interface PointerExtend { + webkit: RegExp; + [prefix: string]: RegExp; +} +declare function pointerExtend(dest: any, source: any): any; +declare namespace pointerExtend { + var prefixedPropREs: { + webkit: RegExp; + moz: RegExp; + }; +} +export default pointerExtend; diff --git a/@interactjs/utils/pointerExtend.js b/@interactjs/utils/pointerExtend.js new file mode 100644 index 000000000..62a9c622d --- /dev/null +++ b/@interactjs/utils/pointerExtend.js @@ -0,0 +1,26 @@ +function pointerExtend(dest, source) { + for (const prop in source) { + const prefixedPropREs = pointerExtend.prefixedPropREs; + let deprecated = false; // skip deprecated prefixed properties + + for (const vendor in prefixedPropREs) { + if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) { + deprecated = true; + break; + } + } + + if (!deprecated && typeof source[prop] !== 'function') { + dest[prop] = source[prop]; + } + } + + return dest; +} + +pointerExtend.prefixedPropREs = { + webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/, + moz: /(Pressure)$/ +}; +export default pointerExtend; +//# sourceMappingURL=pointerExtend.js.map \ No newline at end of file diff --git a/@interactjs/utils/pointerExtend.js.map b/@interactjs/utils/pointerExtend.js.map new file mode 100644 index 000000000..fd9040cfa --- /dev/null +++ b/@interactjs/utils/pointerExtend.js.map @@ -0,0 +1,23 @@ +{ + "version": 3, + "sources": [ + "pointerExtend.ts" + ], + "names": [ + "pointerExtend", + "dest", + "source", + "prop", + "prefixedPropREs", + "deprecated", + "vendor", + "indexOf", + "test", + "webkit", + "moz" + ], + "mappings": "AAKA,SAASA,aAAT,CAAwBC,IAAxB,EAA8BC,MAA9B,EAAsC;AACpC,OAAK,MAAMC,IAAX,IAAmBD,MAAnB,EAA2B;AACzB,UAAME,eAAe,GAAGJ,aAAa,CAACI,eAAtC;AACA,QAAIC,UAAU,GAAG,KAAjB,CAFyB,CAIzB;;AACA,SAAK,MAAMC,MAAX,IAAqBF,eAArB,EAAsC;AACpC,UAAID,IAAI,CAACI,OAAL,CAAaD,MAAb,MAAyB,CAAzB,IAA8BF,eAAe,CAACE,MAAD,CAAf,CAAwBE,IAAxB,CAA6BL,IAA7B,CAAlC,EAAsE;AACpEE,QAAAA,UAAU,GAAG,IAAb;AACA;AACD;AACF;;AAED,QAAI,CAACA,UAAD,IAAe,OAAOH,MAAM,CAACC,IAAD,CAAb,KAAwB,UAA3C,EAAuD;AACrDF,MAAAA,IAAI,CAACE,IAAD,CAAJ,GAAaD,MAAM,CAACC,IAAD,CAAnB;AACD;AACF;;AACD,SAAOF,IAAP;AACD;;AAEDD,aAAa,CAACI,eAAd,GAAgC;AAC9BK,EAAAA,MAAM,EAAE,gDADsB;AAE9BC,EAAAA,GAAG,EAAE;AAFyB,CAAhC;AAKA,eAAeV,aAAf", + "sourcesContent": [ + "export interface PointerExtend {\n webkit: RegExp\n [prefix: string]: RegExp\n}\n\nfunction pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = pointerExtend.prefixedPropREs\n let deprecated = false\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true\n break\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop]\n }\n }\n return dest\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n moz: /(Pressure)$/,\n}\n\nexport default pointerExtend\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/pointerExtend.min.js b/@interactjs/utils/pointerExtend.min.js new file mode 100644 index 000000000..8097d8bce --- /dev/null +++ b/@interactjs/utils/pointerExtend.min.js @@ -0,0 +1,2 @@ +function e(o,t){for(const n in t){const r=e.prefixedPropREs;let i=!1;for(const e in r)if(0===n.indexOf(e)&&r[e].test(n)){i=!0;break}i||"function"==typeof t[n]||(o[n]=t[n])}return o}e.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,moz:/(Pressure)$/};export default e; +//# sourceMappingURL=pointerExtend.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/pointerExtend.min.js.map b/@interactjs/utils/pointerExtend.min.js.map new file mode 100644 index 000000000..ba791266a --- /dev/null +++ b/@interactjs/utils/pointerExtend.min.js.map @@ -0,0 +1,23 @@ +{ + "version": 3, + "sources": [ + "pointerExtend.ts" + ], + "names": [ + "pointerExtend", + "dest", + "source", + "prop", + "prefixedPropREs", + "deprecated", + "vendor", + "indexOf", + "test", + "webkit", + "moz" + ], + "mappings": "AAKA,SAASA,EAAeC,EAAMC,GAC5B,IAAK,MAAMC,KAAQD,EAAQ,CACzB,MAAME,EAAkBJ,EAAcI,gBACtC,IAAIC,GAAa,EAGjB,IAAK,MAAMC,KAAUF,EACnB,GAA6B,IAAzBD,EAAKI,QAAQD,IAAiBF,EAAgBE,GAAQE,KAAKL,GAAO,CACpEE,GAAa,EACb,MAICA,GAAsC,mBAAjBH,EAAOC,KAC/BF,EAAKE,GAAQD,EAAOC,IAGxB,OAAOF,EAGTD,EAAcI,gBAAkB,CAC9BK,OAAQ,iDACRC,IAAK,8BAGQV", + "sourcesContent": [ + "export interface PointerExtend {\n webkit: RegExp\n [prefix: string]: RegExp\n}\n\nfunction pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = pointerExtend.prefixedPropREs\n let deprecated = false\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true\n break\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop]\n }\n }\n return dest\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n moz: /(Pressure)$/,\n}\n\nexport default pointerExtend\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/pointerUtils.d.ts b/@interactjs/utils/pointerUtils.d.ts new file mode 100644 index 000000000..ba5c8a6a0 --- /dev/null +++ b/@interactjs/utils/pointerUtils.d.ts @@ -0,0 +1,422 @@ +import pointerExtend from './pointerExtend'; +export declare function copyCoords(dest: Interact.CoordsSetMember, src: Interact.CoordsSetMember): void; +export declare function setCoordDeltas(targetObj: Interact.CoordsSetMember, prev: Interact.CoordsSetMember, cur: Interact.CoordsSetMember): void; +export declare function setCoordVelocity(targetObj: Interact.CoordsSetMember, delta: Interact.CoordsSetMember): void; +export declare function setZeroCoords(targetObj: Interact.CoordsSetMember): void; +export declare function isNativePointer(pointer: any): boolean; +export declare function getXY(type: any, pointer: any, xy: any): any; +export declare function getPageXY(pointer: Interact.PointerType | Interact.InteractEvent, page?: Interact.Point): import("@interactjs/types/types").Point; +export declare function getClientXY(pointer: any, client: any): any; +export declare function getPointerId(pointer: any): any; +export declare function setCoords(targetObj: any, pointers: any[], timeStamp: number): void; +export declare function getTouchPair(event: any): any[]; +export declare function pointerAverage(pointers: PointerEvent[] | Event[]): { + pageX: number; + pageY: number; + clientX: number; + clientY: number; + screenX: number; + screenY: number; +}; +export declare function touchBBox(event: Event | Array<(Interact.PointerType) | TouchEvent>): { + x: number; + y: number; + left: number; + top: number; + right: number; + bottom: number; + width: number; + height: number; +}; +export declare function touchDistance(event: any, deltaSource: any): number; +export declare function touchAngle(event: any, deltaSource: any): number; +export declare function getPointerType(pointer: any): any; +export declare function getEventTargets(event: any): import("@interactjs/types/types").Element[]; +export declare function newCoords(): Interact.CoordsSetMember; +export declare function coordsToEvent(coords: MockCoords): ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & MouseEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & MouseEvent & PointerEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & MouseEvent & import("@interactjs/pointer-events/PointerEvent").default) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & MouseEvent & import("@interactjs/core/InteractEvent").InteractEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & MouseEvent & TouchEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & Touch & MouseEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & Touch & PointerEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & Touch & import("@interactjs/pointer-events/PointerEvent").default) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & Touch & import("@interactjs/core/InteractEvent").InteractEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & Touch & TouchEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & PointerEvent & MouseEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & PointerEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & PointerEvent & import("@interactjs/pointer-events/PointerEvent").default) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & PointerEvent & import("@interactjs/core/InteractEvent").InteractEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & PointerEvent & TouchEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/pointer-events/PointerEvent").default & MouseEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/pointer-events/PointerEvent").default & PointerEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/pointer-events/PointerEvent").default) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/pointer-events/PointerEvent").default & import("@interactjs/core/InteractEvent").InteractEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/pointer-events/PointerEvent").default & TouchEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/core/InteractEvent").InteractEvent & MouseEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/core/InteractEvent").InteractEvent & PointerEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/core/InteractEvent").InteractEvent & import("@interactjs/pointer-events/PointerEvent").default) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/core/InteractEvent").InteractEvent) | ({ + coords: MockCoords; + readonly page: any; + readonly client: any; + readonly timeStamp: any; + readonly pageX: any; + readonly pageY: any; + readonly clientX: any; + readonly clientY: any; + readonly pointerId: any; + readonly target: any; + readonly type: any; + readonly pointerType: any; + readonly buttons: any; + preventDefault(): void; +} & import("@interactjs/core/InteractEvent").InteractEvent & TouchEvent); +export interface MockCoords { + page: Interact.Point; + client: Interact.Point; + timeStamp?: number; + pointerId?: any; + target?: any; + type?: string; + pointerType?: string; + buttons?: number; +} +export { pointerExtend }; diff --git a/@interactjs/utils/pointerUtils.js b/@interactjs/utils/pointerUtils.js new file mode 100644 index 000000000..8a4bb54ac --- /dev/null +++ b/@interactjs/utils/pointerUtils.js @@ -0,0 +1,255 @@ +import browser from "./browser.js"; +import dom from "./domObjects.js"; +import * as domUtils from "./domUtils.js"; +import hypot from "./hypot.js"; +import * as is from "./is.js"; +import pointerExtend from "./pointerExtend.js"; +export function copyCoords(dest, src) { + dest.page = dest.page || {}; + dest.page.x = src.page.x; + dest.page.y = src.page.y; + dest.client = dest.client || {}; + dest.client.x = src.client.x; + dest.client.y = src.client.y; + dest.timeStamp = src.timeStamp; +} +export function setCoordDeltas(targetObj, prev, cur) { + targetObj.page.x = cur.page.x - prev.page.x; + targetObj.page.y = cur.page.y - prev.page.y; + targetObj.client.x = cur.client.x - prev.client.x; + targetObj.client.y = cur.client.y - prev.client.y; + targetObj.timeStamp = cur.timeStamp - prev.timeStamp; +} +export function setCoordVelocity(targetObj, delta) { + const dt = Math.max(delta.timeStamp / 1000, 0.001); + targetObj.page.x = delta.page.x / dt; + targetObj.page.y = delta.page.y / dt; + targetObj.client.x = delta.client.x / dt; + targetObj.client.y = delta.client.y / dt; + targetObj.timeStamp = dt; +} +export function setZeroCoords(targetObj) { + targetObj.page.x = 0; + targetObj.page.y = 0; + targetObj.client.x = 0; + targetObj.client.y = 0; +} +export function isNativePointer(pointer) { + return pointer instanceof dom.Event || pointer instanceof dom.Touch; +} // Get specified X/Y coords for mouse or event.touches[0] + +export function getXY(type, pointer, xy) { + xy = xy || {}; + type = type || 'page'; + xy.x = pointer[type + 'X']; + xy.y = pointer[type + 'Y']; + return xy; +} +export function getPageXY(pointer, page) { + page = page || { + x: 0, + y: 0 + }; // Opera Mobile handles the viewport and scrolling oddly + + if (browser.isOperaMobile && isNativePointer(pointer)) { + getXY('screen', pointer, page); + page.x += window.scrollX; + page.y += window.scrollY; + } else { + getXY('page', pointer, page); + } + + return page; +} +export function getClientXY(pointer, client) { + client = client || {}; + + if (browser.isOperaMobile && isNativePointer(pointer)) { + // Opera Mobile handles the viewport and scrolling oddly + getXY('screen', pointer, client); + } else { + getXY('client', pointer, client); + } + + return client; +} +export function getPointerId(pointer) { + return is.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier; +} +export function setCoords(targetObj, pointers, timeStamp) { + const pointer = pointers.length > 1 ? pointerAverage(pointers) : pointers[0]; + const tmpXY = {}; + getPageXY(pointer, tmpXY); + targetObj.page.x = tmpXY.x; + targetObj.page.y = tmpXY.y; + getClientXY(pointer, tmpXY); + targetObj.client.x = tmpXY.x; + targetObj.client.y = tmpXY.y; + targetObj.timeStamp = timeStamp; +} +export function getTouchPair(event) { + const touches = []; // array of touches is supplied + + if (is.array(event)) { + touches[0] = event[0]; + touches[1] = event[1]; + } // an event + else { + if (event.type === 'touchend') { + if (event.touches.length === 1) { + touches[0] = event.touches[0]; + touches[1] = event.changedTouches[0]; + } else if (event.touches.length === 0) { + touches[0] = event.changedTouches[0]; + touches[1] = event.changedTouches[1]; + } + } else { + touches[0] = event.touches[0]; + touches[1] = event.touches[1]; + } + } + + return touches; +} +export function pointerAverage(pointers) { + const average = { + pageX: 0, + pageY: 0, + clientX: 0, + clientY: 0, + screenX: 0, + screenY: 0 + }; + + for (const pointer of pointers) { + for (const prop in average) { + average[prop] += pointer[prop]; + } + } + + for (const prop in average) { + average[prop] /= pointers.length; + } + + return average; +} +export function touchBBox(event) { + if (!event.length && !(event.touches && event.touches.length > 1)) { + return null; + } + + const touches = getTouchPair(event); + const minX = Math.min(touches[0].pageX, touches[1].pageX); + const minY = Math.min(touches[0].pageY, touches[1].pageY); + const maxX = Math.max(touches[0].pageX, touches[1].pageX); + const maxY = Math.max(touches[0].pageY, touches[1].pageY); + return { + x: minX, + y: minY, + left: minX, + top: minY, + right: maxX, + bottom: maxY, + width: maxX - minX, + height: maxY - minY + }; +} +export function touchDistance(event, deltaSource) { + const sourceX = deltaSource + 'X'; + const sourceY = deltaSource + 'Y'; + const touches = getTouchPair(event); + const dx = touches[0][sourceX] - touches[1][sourceX]; + const dy = touches[0][sourceY] - touches[1][sourceY]; + return hypot(dx, dy); +} +export function touchAngle(event, deltaSource) { + const sourceX = deltaSource + 'X'; + const sourceY = deltaSource + 'Y'; + const touches = getTouchPair(event); + const dx = touches[1][sourceX] - touches[0][sourceX]; + const dy = touches[1][sourceY] - touches[0][sourceY]; + const angle = 180 * Math.atan2(dy, dx) / Math.PI; + return angle; +} +export function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof dom.Touch ? 'touch' : 'mouse'; +} // [ event.target, event.currentTarget ] + +export function getEventTargets(event) { + const path = is.func(event.composedPath) ? event.composedPath() : event.path; + return [domUtils.getActualElement(path ? path[0] : event.target), domUtils.getActualElement(event.currentTarget)]; +} +export function newCoords() { + return { + page: { + x: 0, + y: 0 + }, + client: { + x: 0, + y: 0 + }, + timeStamp: 0 + }; +} +export function coordsToEvent(coords) { + const event = { + coords, + + get page() { + return this.coords.page; + }, + + get client() { + return this.coords.client; + }, + + get timeStamp() { + return this.coords.timeStamp; + }, + + get pageX() { + return this.coords.page.x; + }, + + get pageY() { + return this.coords.page.y; + }, + + get clientX() { + return this.coords.client.x; + }, + + get clientY() { + return this.coords.client.y; + }, + + get pointerId() { + return this.coords.pointerId; + }, + + get target() { + return this.coords.target; + }, + + get type() { + return this.coords.type; + }, + + get pointerType() { + return this.coords.pointerType; + }, + + get buttons() { + return this.coords.buttons; + }, + + preventDefault() {} + + }; + return event; +} +export { pointerExtend }; +//# sourceMappingURL=pointerUtils.js.map \ No newline at end of file diff --git a/@interactjs/utils/pointerUtils.js.map b/@interactjs/utils/pointerUtils.js.map new file mode 100644 index 000000000..0eb47a6ad --- /dev/null +++ b/@interactjs/utils/pointerUtils.js.map @@ -0,0 +1,110 @@ +{ + "version": 3, + "sources": [ + "pointerUtils.ts" + ], + "names": [ + "browser", + "dom", + "domUtils", + "hypot", + "is", + "pointerExtend", + "copyCoords", + "dest", + "src", + "page", + "x", + "y", + "client", + "timeStamp", + "setCoordDeltas", + "targetObj", + "prev", + "cur", + "setCoordVelocity", + "delta", + "dt", + "Math", + "max", + "setZeroCoords", + "isNativePointer", + "pointer", + "Event", + "Touch", + "getXY", + "type", + "xy", + "getPageXY", + "isOperaMobile", + "window", + "scrollX", + "scrollY", + "getClientXY", + "getPointerId", + "number", + "pointerId", + "identifier", + "setCoords", + "pointers", + "length", + "pointerAverage", + "tmpXY", + "getTouchPair", + "event", + "touches", + "array", + "changedTouches", + "average", + "pageX", + "pageY", + "clientX", + "clientY", + "screenX", + "screenY", + "prop", + "touchBBox", + "minX", + "min", + "minY", + "maxX", + "maxY", + "left", + "top", + "right", + "bottom", + "width", + "height", + "touchDistance", + "deltaSource", + "sourceX", + "sourceY", + "dx", + "dy", + "touchAngle", + "angle", + "atan2", + "PI", + "getPointerType", + "string", + "pointerType", + "undefined", + "test", + "getEventTargets", + "path", + "func", + "composedPath", + "getActualElement", + "target", + "currentTarget", + "newCoords", + "coordsToEvent", + "coords", + "buttons", + "preventDefault" + ], + "mappings": "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", + "sourcesContent": [ + "import browser from './browser'\nimport dom from './domObjects'\nimport * as domUtils from './domUtils'\nimport hypot from './hypot'\nimport * as is from './is'\nimport pointerExtend from './pointerExtend'\n\nexport function copyCoords (dest: Interact.CoordsSetMember, src: Interact.CoordsSetMember) {\n dest.page = dest.page || {} as any\n dest.page.x = src.page.x\n dest.page.y = src.page.y\n\n dest.client = dest.client || {} as any\n dest.client.x = src.client.x\n dest.client.y = src.client.y\n\n dest.timeStamp = src.timeStamp\n}\n\nexport function setCoordDeltas (targetObj: Interact.CoordsSetMember, prev: Interact.CoordsSetMember, cur: Interact.CoordsSetMember) {\n targetObj.page.x = cur.page.x - prev.page.x\n targetObj.page.y = cur.page.y - prev.page.y\n targetObj.client.x = cur.client.x - prev.client.x\n targetObj.client.y = cur.client.y - prev.client.y\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp\n}\n\nexport function setCoordVelocity (targetObj: Interact.CoordsSetMember, delta: Interact.CoordsSetMember) {\n const dt = Math.max(delta.timeStamp / 1000, 0.001)\n\n targetObj.page.x = delta.page.x / dt\n targetObj.page.y = delta.page.y / dt\n targetObj.client.x = delta.client.x / dt\n targetObj.client.y = delta.client.y / dt\n targetObj.timeStamp = dt\n}\n\nexport function setZeroCoords (targetObj: Interact.CoordsSetMember) {\n targetObj.page.x = 0\n targetObj.page.y = 0\n targetObj.client.x = 0\n targetObj.client.y = 0\n}\n\nexport function isNativePointer (pointer: any) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch)\n}\n\n// Get specified X/Y coords for mouse or event.touches[0]\nexport function getXY (type, pointer, xy) {\n xy = xy || {}\n type = type || 'page'\n\n xy.x = pointer[type + 'X']\n xy.y = pointer[type + 'Y']\n\n return xy\n}\n\nexport function getPageXY (pointer: Interact.PointerType | Interact.InteractEvent, page?: Interact.Point) {\n page = page || { x: 0, y: 0 }\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && isNativePointer(pointer)) {\n getXY('screen', pointer, page)\n\n page.x += window.scrollX\n page.y += window.scrollY\n }\n else {\n getXY('page', pointer, page)\n }\n\n return page\n}\n\nexport function getClientXY (pointer, client) {\n client = client || {}\n\n if (browser.isOperaMobile && isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n getXY('screen', pointer, client)\n }\n else {\n getXY('client', pointer, client)\n }\n\n return client\n}\n\nexport function getPointerId (pointer) {\n return is.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier\n}\n\nexport function setCoords (targetObj, pointers: any[], timeStamp: number) {\n const pointer = (pointers.length > 1\n ? pointerAverage(pointers)\n : pointers[0])\n\n const tmpXY = {} as { x: number, y: number }\n\n getPageXY(pointer, tmpXY)\n targetObj.page.x = tmpXY.x\n targetObj.page.y = tmpXY.y\n\n getClientXY(pointer, tmpXY)\n targetObj.client.x = tmpXY.x\n targetObj.client.y = tmpXY.y\n\n targetObj.timeStamp = timeStamp\n}\n\nexport function getTouchPair (event) {\n const touches = []\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0]\n touches[1] = event[1]\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0]\n touches[1] = event.changedTouches[0]\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0]\n touches[1] = event.changedTouches[1]\n }\n }\n else {\n touches[0] = event.touches[0]\n touches[1] = event.touches[1]\n }\n }\n\n return touches\n}\n\nexport function pointerAverage (pointers: PointerEvent[] | Event[]) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n }\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop]\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length\n }\n\n return average\n}\n\nexport function touchBBox (event: Event | Array<(Interact.PointerType) | TouchEvent>) {\n if (!(event as any).length &&\n !((event as TouchEvent).touches &&\n (event as TouchEvent).touches.length > 1)) {\n return null\n }\n\n const touches = getTouchPair(event)\n const minX = Math.min(touches[0].pageX, touches[1].pageX)\n const minY = Math.min(touches[0].pageY, touches[1].pageY)\n const maxX = Math.max(touches[0].pageX, touches[1].pageX)\n const maxY = Math.max(touches[0].pageY, touches[1].pageY)\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n right: maxX,\n bottom: maxY,\n width: maxX - minX,\n height: maxY - minY,\n }\n}\n\nexport function touchDistance (event, deltaSource) {\n const sourceX = deltaSource + 'X'\n const sourceY = deltaSource + 'Y'\n const touches = getTouchPair(event)\n\n const dx = touches[0][sourceX] - touches[1][sourceX]\n const dy = touches[0][sourceY] - touches[1][sourceY]\n\n return hypot(dx, dy)\n}\n\nexport function touchAngle (event, deltaSource) {\n const sourceX = deltaSource + 'X'\n const sourceY = deltaSource + 'Y'\n const touches = getTouchPair(event)\n const dx = touches[1][sourceX] - touches[0][sourceX]\n const dy = touches[1][sourceY] - touches[0][sourceY]\n const angle = 180 * Math.atan2(dy, dx) / Math.PI\n\n return angle\n}\n\nexport function getPointerType (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof dom.Touch\n ? 'touch'\n : 'mouse'\n}\n\n// [ event.target, event.currentTarget ]\nexport function getEventTargets (event) {\n const path = is.func(event.composedPath) ? event.composedPath() : event.path\n\n return [\n domUtils.getActualElement(path ? path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ]\n}\n\nexport function newCoords (): Interact.CoordsSetMember {\n return {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n }\n}\n\nexport function coordsToEvent (coords: MockCoords) {\n const event = {\n coords,\n get page () { return this.coords.page },\n get client () { return this.coords.client },\n get timeStamp () { return this.coords.timeStamp },\n get pageX () { return this.coords.page.x },\n get pageY () { return this.coords.page.y },\n get clientX () { return this.coords.client.x },\n get clientY () { return this.coords.client.y },\n get pointerId () { return this.coords.pointerId },\n get target () { return this.coords.target },\n get type () { return this.coords.type },\n get pointerType () { return this.coords.pointerType },\n get buttons () { return this.coords.buttons },\n preventDefault () {},\n }\n\n return event as typeof event & Interact.PointerType & Interact.PointerEventType\n}\n\nexport interface MockCoords {\n page: Interact.Point\n client: Interact.Point\n timeStamp?: number\n pointerId?: any\n target?: any\n type?: string\n pointerType?: string\n buttons?: number\n}\n\nexport { pointerExtend }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/pointerUtils.min.js b/@interactjs/utils/pointerUtils.min.js new file mode 100644 index 000000000..e6a924a76 --- /dev/null +++ b/@interactjs/utils/pointerUtils.min.js @@ -0,0 +1,2 @@ +import t from"./browser.min.js";import e from"./domObjects.min.js";import*as n from"./domUtils.min.js";import o from"./hypot.min.js";import*as r from"./is.min.js";import i from"./pointerExtend.min.js";export function copyCoords(t,e){t.page=t.page||{},t.page.x=e.page.x,t.page.y=e.page.y,t.client=t.client||{},t.client.x=e.client.x,t.client.y=e.client.y,t.timeStamp=e.timeStamp}export function setCoordDeltas(t,e,n){t.page.x=n.page.x-e.page.x,t.page.y=n.page.y-e.page.y,t.client.x=n.client.x-e.client.x,t.client.y=n.client.y-e.client.y,t.timeStamp=n.timeStamp-e.timeStamp}export function setCoordVelocity(t,e){const n=Math.max(e.timeStamp/1e3,.001);t.page.x=e.page.x/n,t.page.y=e.page.y/n,t.client.x=e.client.x/n,t.client.y=e.client.y/n,t.timeStamp=n}export function setZeroCoords(t){t.page.x=0,t.page.y=0,t.client.x=0,t.client.y=0}export function isNativePointer(t){return t instanceof e.Event||t instanceof e.Touch}export function getXY(t,e,n){return t=t||"page",(n=n||{}).x=e[t+"X"],n.y=e[t+"Y"],n}export function getPageXY(e,n){return n=n||{x:0,y:0},t.isOperaMobile&&isNativePointer(e)?(getXY("screen",e,n),n.x+=window.scrollX,n.y+=window.scrollY):getXY("page",e,n),n}export function getClientXY(e,n){return n=n||{},t.isOperaMobile&&isNativePointer(e)?getXY("screen",e,n):getXY("client",e,n),n}export function getPointerId(t){return r.number(t.pointerId)?t.pointerId:t.identifier}export function setCoords(t,e,n){const o=e.length>1?pointerAverage(e):e[0],r={};getPageXY(o,r),t.page.x=r.x,t.page.y=r.y,getClientXY(o,r),t.client.x=r.x,t.client.y=r.y,t.timeStamp=n}export function getTouchPair(t){const e=[];return r.array(t)?(e[0]=t[0],e[1]=t[1]):"touchend"===t.type?1===t.touches.length?(e[0]=t.touches[0],e[1]=t.changedTouches[0]):0===t.touches.length&&(e[0]=t.changedTouches[0],e[1]=t.changedTouches[1]):(e[0]=t.touches[0],e[1]=t.touches[1]),e}export function pointerAverage(t){const e={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0};for(const n of t)for(const t in e)e[t]+=n[t];for(const n in e)e[n]/=t.length;return e}export function touchBBox(t){if(!(t.length||t.touches&&t.touches.length>1))return null;const e=getTouchPair(t),n=Math.min(e[0].pageX,e[1].pageX),o=Math.min(e[0].pageY,e[1].pageY),r=Math.max(e[0].pageX,e[1].pageX),i=Math.max(e[0].pageY,e[1].pageY);return{x:n,y:o,left:n,top:o,right:r,bottom:i,width:r-n,height:i-o}}export function touchDistance(t,e){const n=e+"X",r=e+"Y",i=getTouchPair(t),c=i[0][n]-i[1][n],p=i[0][r]-i[1][r];return o(c,p)}export function touchAngle(t,e){const n=e+"X",o=e+"Y",r=getTouchPair(t),i=r[1][n]-r[0][n],c=r[1][o]-r[0][o];return 180*Math.atan2(c,i)/Math.PI}export function getPointerType(t){return r.string(t.pointerType)?t.pointerType:r.number(t.pointerType)?[void 0,void 0,"touch","pen","mouse"][t.pointerType]:/touch/.test(t.type)||t instanceof e.Touch?"touch":"mouse"}export function getEventTargets(t){const e=r.func(t.composedPath)?t.composedPath():t.path;return[n.getActualElement(e?e[0]:t.target),n.getActualElement(t.currentTarget)]}export function newCoords(){return{page:{x:0,y:0},client:{x:0,y:0},timeStamp:0}}export function coordsToEvent(t){return{coords:t,get page(){return this.coords.page},get client(){return this.coords.client},get timeStamp(){return this.coords.timeStamp},get pageX(){return this.coords.page.x},get pageY(){return this.coords.page.y},get clientX(){return this.coords.client.x},get clientY(){return this.coords.client.y},get pointerId(){return this.coords.pointerId},get target(){return this.coords.target},get type(){return this.coords.type},get pointerType(){return this.coords.pointerType},get buttons(){return this.coords.buttons},preventDefault(){}}}export{i as pointerExtend}; +//# sourceMappingURL=pointerUtils.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/pointerUtils.min.js.map b/@interactjs/utils/pointerUtils.min.js.map new file mode 100644 index 000000000..a2caab5bc --- /dev/null +++ b/@interactjs/utils/pointerUtils.min.js.map @@ -0,0 +1,110 @@ +{ + "version": 3, + "sources": [ + "pointerUtils.ts" + ], + "names": [ + "browser", + "dom", + "domUtils", + "hypot", + "is", + "pointerExtend", + "copyCoords", + "dest", + "src", + "page", + "x", + "y", + "client", + "timeStamp", + "setCoordDeltas", + "targetObj", + "prev", + "cur", + "setCoordVelocity", + "delta", + "dt", + "Math", + "max", + "setZeroCoords", + "isNativePointer", + "pointer", + "Event", + "Touch", + "getXY", + "type", + "xy", + "getPageXY", + "isOperaMobile", + "window", + "scrollX", + "scrollY", + "getClientXY", + "getPointerId", + "number", + "pointerId", + "identifier", + "setCoords", + "pointers", + "length", + "pointerAverage", + "tmpXY", + "getTouchPair", + "event", + "touches", + "array", + "changedTouches", + "average", + "pageX", + "pageY", + "clientX", + "clientY", + "screenX", + "screenY", + "prop", + "touchBBox", + "minX", + "min", + "minY", + "maxX", + "maxY", + "left", + "top", + "right", + "bottom", + "width", + "height", + "touchDistance", + "deltaSource", + "sourceX", + "sourceY", + "dx", + "dy", + "touchAngle", + "atan2", + "PI", + "getPointerType", + "string", + "pointerType", + "undefined", + "test", + "getEventTargets", + "path", + "func", + "composedPath", + "getActualElement", + "target", + "currentTarget", + "newCoords", + "coordsToEvent", + "coords", + "this", + "buttons", + "preventDefault" + ], + "mappings": "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", + "sourcesContent": [ + "import browser from './browser'\nimport dom from './domObjects'\nimport * as domUtils from './domUtils'\nimport hypot from './hypot'\nimport * as is from './is'\nimport pointerExtend from './pointerExtend'\n\nexport function copyCoords (dest: Interact.CoordsSetMember, src: Interact.CoordsSetMember) {\n dest.page = dest.page || {} as any\n dest.page.x = src.page.x\n dest.page.y = src.page.y\n\n dest.client = dest.client || {} as any\n dest.client.x = src.client.x\n dest.client.y = src.client.y\n\n dest.timeStamp = src.timeStamp\n}\n\nexport function setCoordDeltas (targetObj: Interact.CoordsSetMember, prev: Interact.CoordsSetMember, cur: Interact.CoordsSetMember) {\n targetObj.page.x = cur.page.x - prev.page.x\n targetObj.page.y = cur.page.y - prev.page.y\n targetObj.client.x = cur.client.x - prev.client.x\n targetObj.client.y = cur.client.y - prev.client.y\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp\n}\n\nexport function setCoordVelocity (targetObj: Interact.CoordsSetMember, delta: Interact.CoordsSetMember) {\n const dt = Math.max(delta.timeStamp / 1000, 0.001)\n\n targetObj.page.x = delta.page.x / dt\n targetObj.page.y = delta.page.y / dt\n targetObj.client.x = delta.client.x / dt\n targetObj.client.y = delta.client.y / dt\n targetObj.timeStamp = dt\n}\n\nexport function setZeroCoords (targetObj: Interact.CoordsSetMember) {\n targetObj.page.x = 0\n targetObj.page.y = 0\n targetObj.client.x = 0\n targetObj.client.y = 0\n}\n\nexport function isNativePointer (pointer: any) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch)\n}\n\n// Get specified X/Y coords for mouse or event.touches[0]\nexport function getXY (type, pointer, xy) {\n xy = xy || {}\n type = type || 'page'\n\n xy.x = pointer[type + 'X']\n xy.y = pointer[type + 'Y']\n\n return xy\n}\n\nexport function getPageXY (pointer: Interact.PointerType | Interact.InteractEvent, page?: Interact.Point) {\n page = page || { x: 0, y: 0 }\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && isNativePointer(pointer)) {\n getXY('screen', pointer, page)\n\n page.x += window.scrollX\n page.y += window.scrollY\n }\n else {\n getXY('page', pointer, page)\n }\n\n return page\n}\n\nexport function getClientXY (pointer, client) {\n client = client || {}\n\n if (browser.isOperaMobile && isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n getXY('screen', pointer, client)\n }\n else {\n getXY('client', pointer, client)\n }\n\n return client\n}\n\nexport function getPointerId (pointer) {\n return is.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier\n}\n\nexport function setCoords (targetObj, pointers: any[], timeStamp: number) {\n const pointer = (pointers.length > 1\n ? pointerAverage(pointers)\n : pointers[0])\n\n const tmpXY = {} as { x: number, y: number }\n\n getPageXY(pointer, tmpXY)\n targetObj.page.x = tmpXY.x\n targetObj.page.y = tmpXY.y\n\n getClientXY(pointer, tmpXY)\n targetObj.client.x = tmpXY.x\n targetObj.client.y = tmpXY.y\n\n targetObj.timeStamp = timeStamp\n}\n\nexport function getTouchPair (event) {\n const touches = []\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0]\n touches[1] = event[1]\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0]\n touches[1] = event.changedTouches[0]\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0]\n touches[1] = event.changedTouches[1]\n }\n }\n else {\n touches[0] = event.touches[0]\n touches[1] = event.touches[1]\n }\n }\n\n return touches\n}\n\nexport function pointerAverage (pointers: PointerEvent[] | Event[]) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n }\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop]\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length\n }\n\n return average\n}\n\nexport function touchBBox (event: Event | Array<(Interact.PointerType) | TouchEvent>) {\n if (!(event as any).length &&\n !((event as TouchEvent).touches &&\n (event as TouchEvent).touches.length > 1)) {\n return null\n }\n\n const touches = getTouchPair(event)\n const minX = Math.min(touches[0].pageX, touches[1].pageX)\n const minY = Math.min(touches[0].pageY, touches[1].pageY)\n const maxX = Math.max(touches[0].pageX, touches[1].pageX)\n const maxY = Math.max(touches[0].pageY, touches[1].pageY)\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n right: maxX,\n bottom: maxY,\n width: maxX - minX,\n height: maxY - minY,\n }\n}\n\nexport function touchDistance (event, deltaSource) {\n const sourceX = deltaSource + 'X'\n const sourceY = deltaSource + 'Y'\n const touches = getTouchPair(event)\n\n const dx = touches[0][sourceX] - touches[1][sourceX]\n const dy = touches[0][sourceY] - touches[1][sourceY]\n\n return hypot(dx, dy)\n}\n\nexport function touchAngle (event, deltaSource) {\n const sourceX = deltaSource + 'X'\n const sourceY = deltaSource + 'Y'\n const touches = getTouchPair(event)\n const dx = touches[1][sourceX] - touches[0][sourceX]\n const dy = touches[1][sourceY] - touches[0][sourceY]\n const angle = 180 * Math.atan2(dy, dx) / Math.PI\n\n return angle\n}\n\nexport function getPointerType (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof dom.Touch\n ? 'touch'\n : 'mouse'\n}\n\n// [ event.target, event.currentTarget ]\nexport function getEventTargets (event) {\n const path = is.func(event.composedPath) ? event.composedPath() : event.path\n\n return [\n domUtils.getActualElement(path ? path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ]\n}\n\nexport function newCoords (): Interact.CoordsSetMember {\n return {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n }\n}\n\nexport function coordsToEvent (coords: MockCoords) {\n const event = {\n coords,\n get page () { return this.coords.page },\n get client () { return this.coords.client },\n get timeStamp () { return this.coords.timeStamp },\n get pageX () { return this.coords.page.x },\n get pageY () { return this.coords.page.y },\n get clientX () { return this.coords.client.x },\n get clientY () { return this.coords.client.y },\n get pointerId () { return this.coords.pointerId },\n get target () { return this.coords.target },\n get type () { return this.coords.type },\n get pointerType () { return this.coords.pointerType },\n get buttons () { return this.coords.buttons },\n preventDefault () {},\n }\n\n return event as typeof event & Interact.PointerType & Interact.PointerEventType\n}\n\nexport interface MockCoords {\n page: Interact.Point\n client: Interact.Point\n timeStamp?: number\n pointerId?: any\n target?: any\n type?: string\n pointerType?: string\n buttons?: number\n}\n\nexport { pointerExtend }\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/raf.d.ts b/@interactjs/utils/raf.d.ts new file mode 100644 index 000000000..21c9996dd --- /dev/null +++ b/@interactjs/utils/raf.d.ts @@ -0,0 +1,7 @@ +declare function init(window: any): void; +declare const _default: { + request: (callback: any) => any; + cancel: (token: any) => any; + init: typeof init; +}; +export default _default; diff --git a/@interactjs/utils/raf.js b/@interactjs/utils/raf.js new file mode 100644 index 000000000..d6f1ee49b --- /dev/null +++ b/@interactjs/utils/raf.js @@ -0,0 +1,39 @@ +let lastTime = 0; +let request; +let cancel; + +function init(window) { + request = window.requestAnimationFrame; + cancel = window.cancelAnimationFrame; + + if (!request) { + const vendors = ['ms', 'moz', 'webkit', 'o']; + + for (const vendor of vendors) { + request = window[`${vendor}RequestAnimationFrame`]; + cancel = window[`${vendor}CancelAnimationFrame`] || window[`${vendor}CancelRequestAnimationFrame`]; + } + } + + if (!request) { + request = callback => { + const currTime = Date.now(); + const timeToCall = Math.max(0, 16 - (currTime - lastTime)); // eslint-disable-next-line standard/no-callback-literal + + const token = setTimeout(() => { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return token; + }; + + cancel = token => clearTimeout(token); + } +} + +export default { + request: callback => request(callback), + cancel: token => cancel(token), + init +}; +//# sourceMappingURL=raf.js.map \ No newline at end of file diff --git a/@interactjs/utils/raf.js.map b/@interactjs/utils/raf.js.map new file mode 100644 index 000000000..71a91e9fa --- /dev/null +++ b/@interactjs/utils/raf.js.map @@ -0,0 +1,31 @@ +{ + "version": 3, + "sources": [ + "raf.ts" + ], + "names": [ + "lastTime", + "request", + "cancel", + "init", + "window", + "requestAnimationFrame", + "cancelAnimationFrame", + "vendors", + "vendor", + "callback", + "currTime", + "Date", + "now", + "timeToCall", + "Math", + "max", + "token", + "setTimeout", + "clearTimeout" + ], + "mappings": "AAAA,IAAIA,QAAQ,GAAG,CAAf;AACA,IAAIC,OAAJ;AACA,IAAIC,MAAJ;;AAEA,SAASC,IAAT,CAAeC,MAAf,EAAuB;AACrBH,EAAAA,OAAO,GAAGG,MAAM,CAACC,qBAAjB;AACAH,EAAAA,MAAM,GAAGE,MAAM,CAACE,oBAAhB;;AAEA,MAAI,CAACL,OAAL,EAAc;AACZ,UAAMM,OAAO,GAAG,CAAC,IAAD,EAAO,KAAP,EAAc,QAAd,EAAwB,GAAxB,CAAhB;;AAEA,SAAK,MAAMC,MAAX,IAAqBD,OAArB,EAA8B;AAC5BN,MAAAA,OAAO,GAAGG,MAAM,CAAE,GAAEI,MAAO,uBAAX,CAAhB;AACAN,MAAAA,MAAM,GAAGE,MAAM,CAAE,GAAEI,MAAO,sBAAX,CAAN,IAA2CJ,MAAM,CAAE,GAAEI,MAAO,6BAAX,CAA1D;AACD;AACF;;AAED,MAAI,CAACP,OAAL,EAAc;AACZA,IAAAA,OAAO,GAAGQ,QAAQ,IAAI;AACpB,YAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAL,EAAjB;AACA,YAAMC,UAAU,GAAGC,IAAI,CAACC,GAAL,CAAS,CAAT,EAAY,MAAML,QAAQ,GAAGV,QAAjB,CAAZ,CAAnB,CAFoB,CAGpB;;AACA,YAAMgB,KAAK,GAAGC,UAAU,CAAC,MAAM;AAAER,QAAAA,QAAQ,CAACC,QAAQ,GAAGG,UAAZ,CAAR;AAAiC,OAA1C,EACtBA,UADsB,CAAxB;AAGAb,MAAAA,QAAQ,GAAGU,QAAQ,GAAGG,UAAtB;AACA,aAAOG,KAAP;AACD,KATD;;AAWAd,IAAAA,MAAM,GAAGc,KAAK,IAAIE,YAAY,CAACF,KAAD,CAA9B;AACD;AACF;;AAED,eAAe;AACbf,EAAAA,OAAO,EAAEQ,QAAQ,IAAIR,OAAO,CAACQ,QAAD,CADf;AAEbP,EAAAA,MAAM,EAAEc,KAAK,IAAId,MAAM,CAACc,KAAD,CAFV;AAGbb,EAAAA;AAHa,CAAf", + "sourcesContent": [ + "let lastTime = 0\nlet request\nlet cancel\n\nfunction init (window) {\n request = window.requestAnimationFrame\n cancel = window.cancelAnimationFrame\n\n if (!request) {\n const vendors = ['ms', 'moz', 'webkit', 'o']\n\n for (const vendor of vendors) {\n request = window[`${vendor}RequestAnimationFrame`]\n cancel = window[`${vendor}CancelAnimationFrame`] || window[`${vendor}CancelRequestAnimationFrame`]\n }\n }\n\n if (!request) {\n request = callback => {\n const currTime = Date.now()\n const timeToCall = Math.max(0, 16 - (currTime - lastTime))\n // eslint-disable-next-line standard/no-callback-literal\n const token = setTimeout(() => { callback(currTime + timeToCall) },\n timeToCall)\n\n lastTime = currTime + timeToCall\n return token\n }\n\n cancel = token => clearTimeout(token)\n }\n}\n\nexport default {\n request: callback => request(callback),\n cancel: token => cancel(token),\n init,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/raf.min.js b/@interactjs/utils/raf.min.js new file mode 100644 index 000000000..7110e9ecb --- /dev/null +++ b/@interactjs/utils/raf.min.js @@ -0,0 +1,2 @@ +let e,t,n=0;export default{request(t){return e(t)},cancel(e){return t(e)},init(a){if(e=a.requestAnimationFrame,t=a.cancelAnimationFrame,!e){const n=["ms","moz","webkit","o"];for(const i of n)e=a[`${i}RequestAnimationFrame`],t=a[`${i}CancelAnimationFrame`]||a[`${i}CancelRequestAnimationFrame`]}e||(e=e=>{const t=Date.now(),a=Math.max(0,16-(t-n)),i=setTimeout(()=>{e(t+a)},a);return n=t+a,i},t=e=>clearTimeout(e))}}; +//# sourceMappingURL=raf.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/raf.min.js.map b/@interactjs/utils/raf.min.js.map new file mode 100644 index 000000000..827657dc8 --- /dev/null +++ b/@interactjs/utils/raf.min.js.map @@ -0,0 +1,31 @@ +{ + "version": 3, + "sources": [ + "raf.ts" + ], + "names": [ + "request", + "cancel", + "lastTime", + "callback", + "token", + "init", + "window", + "requestAnimationFrame", + "cancelAnimationFrame", + "vendors", + "vendor", + "currTime", + "Date", + "now", + "timeToCall", + "Math", + "max", + "setTimeout", + "clearTimeout" + ], + "mappings": "AAAA,IACIA,EACAC,EAFAC,EAAW,gBAiCA,CACbF,QAASG,GAAYH,OAAAA,EAAQG,IAC7BF,OAAQG,GAASH,OAAAA,EAAOG,IACxBC,KAhCaC,GAIb,GAHAN,EAAUM,EAAOC,sBACjBN,EAASK,EAAOE,sBAEXR,EAAS,CACZ,MAAMS,EAAU,CAAC,KAAM,MAAO,SAAU,KAExC,IAAK,MAAMC,KAAUD,EACnBT,EAAUM,EAAQ,GAAEI,0BACpBT,EAASK,EAAQ,GAAEI,0BAAiCJ,EAAQ,GAAEI,gCAI7DV,IACHA,EAAUG,IACR,MAAMQ,EAAWC,KAAKC,MAChBC,EAAaC,KAAKC,IAAI,EAAG,IAAML,EAAWT,IAE1CE,EAAQa,WAAW,KAAQd,EAASQ,EAAWG,IACnDA,GAGF,OADAZ,EAAWS,EAAWG,EACfV,GAGTH,EAASG,GAASc,aAAad", + "sourcesContent": [ + "let lastTime = 0\nlet request\nlet cancel\n\nfunction init (window) {\n request = window.requestAnimationFrame\n cancel = window.cancelAnimationFrame\n\n if (!request) {\n const vendors = ['ms', 'moz', 'webkit', 'o']\n\n for (const vendor of vendors) {\n request = window[`${vendor}RequestAnimationFrame`]\n cancel = window[`${vendor}CancelAnimationFrame`] || window[`${vendor}CancelRequestAnimationFrame`]\n }\n }\n\n if (!request) {\n request = callback => {\n const currTime = Date.now()\n const timeToCall = Math.max(0, 16 - (currTime - lastTime))\n // eslint-disable-next-line standard/no-callback-literal\n const token = setTimeout(() => { callback(currTime + timeToCall) },\n timeToCall)\n\n lastTime = currTime + timeToCall\n return token\n }\n\n cancel = token => clearTimeout(token)\n }\n}\n\nexport default {\n request: callback => request(callback),\n cancel: token => cancel(token),\n init,\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/rect.d.ts b/@interactjs/utils/rect.d.ts new file mode 100644 index 000000000..91779fd58 --- /dev/null +++ b/@interactjs/utils/rect.d.ts @@ -0,0 +1,9 @@ +export declare function getStringOptionResult(value: any, target: Interact.HasGetRect, element: any): (Node & ParentNode) | import("@interactjs/types/types").Rect; +export declare function resolveRectLike(value: Interact.RectResolvable, target?: Interact.HasGetRect, element?: Node, functionArgs?: T): import("@interactjs/types/types").Rect; +export declare function rectToXY(rect: any): { + x: any; + y: any; +}; +export declare function xywhToTlbr(rect: any): any; +export declare function tlbrToXywh(rect: any): any; +export declare function addEdges(edges: Interact.EdgeOptions, rect: Interact.Rect, delta: Interact.Point): void; diff --git a/@interactjs/utils/rect.js b/@interactjs/utils/rect.js new file mode 100644 index 000000000..ac757a45b --- /dev/null +++ b/@interactjs/utils/rect.js @@ -0,0 +1,78 @@ +import { closest, getElementRect, parentNode } from "./domUtils.js"; +import extend from "./extend.js"; +import * as is from "./is.js"; +export function getStringOptionResult(value, target, element) { + if (value === 'parent') { + return parentNode(element); + } + + if (value === 'self') { + return target.getRect(element); + } + + return closest(element, value); +} +export function resolveRectLike(value, target, element, functionArgs) { + let returnValue = value; + + if (is.string(returnValue)) { + returnValue = getStringOptionResult(returnValue, target, element); + } else if (is.func(returnValue)) { + returnValue = returnValue(...functionArgs); + } + + if (is.element(returnValue)) { + returnValue = getElementRect(returnValue); + } + + return returnValue; +} +export function rectToXY(rect) { + return rect && { + x: 'x' in rect ? rect.x : rect.left, + y: 'y' in rect ? rect.y : rect.top + }; +} +export function xywhToTlbr(rect) { + if (rect && !('left' in rect && 'top' in rect)) { + rect = extend({}, rect); + rect.left = rect.x || 0; + rect.top = rect.y || 0; + rect.right = rect.right || rect.left + rect.width; + rect.bottom = rect.bottom || rect.top + rect.height; + } + + return rect; +} +export function tlbrToXywh(rect) { + if (rect && !('x' in rect && 'y' in rect)) { + rect = extend({}, rect); + rect.x = rect.left || 0; + rect.y = rect.top || 0; + rect.width = rect.width || rect.right || 0 - rect.x; + rect.height = rect.height || rect.bottom || 0 - rect.y; + } + + return rect; +} +export function addEdges(edges, rect, delta) { + if (edges.left) { + rect.left += delta.x; + } + + if (edges.right) { + rect.right += delta.x; + } + + if (edges.top) { + rect.top += delta.y; + } + + if (edges.bottom) { + rect.bottom += delta.y; + } + + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; +} +//# sourceMappingURL=rect.js.map \ No newline at end of file diff --git a/@interactjs/utils/rect.js.map b/@interactjs/utils/rect.js.map new file mode 100644 index 000000000..b5bf2fef8 --- /dev/null +++ b/@interactjs/utils/rect.js.map @@ -0,0 +1,42 @@ +{ + "version": 3, + "sources": [ + "rect.ts" + ], + "names": [ + "closest", + "getElementRect", + "parentNode", + "extend", + "is", + "getStringOptionResult", + "value", + "target", + "element", + "getRect", + "resolveRectLike", + "functionArgs", + "returnValue", + "string", + "func", + "rectToXY", + "rect", + "x", + "left", + "y", + "top", + "xywhToTlbr", + "right", + "width", + "bottom", + "height", + "tlbrToXywh", + "addEdges", + "edges", + "delta" + ], + "mappings": "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", + "sourcesContent": [ + "import { closest, getElementRect, parentNode } from './domUtils'\nimport extend from './extend'\nimport * as is from './is'\n\nexport function getStringOptionResult (value: any, target: Interact.HasGetRect, element) {\n if (value === 'parent') { return parentNode(element) }\n\n if (value === 'self') { return target.getRect(element) }\n\n return closest(element, value)\n}\n\nexport function resolveRectLike (\n value: Interact.RectResolvable,\n target?: Interact.HasGetRect,\n element?: Node,\n functionArgs?: T,\n) {\n let returnValue: any = value\n if (is.string(returnValue)) {\n returnValue = getStringOptionResult(returnValue, target, element)\n }\n else if (is.func(returnValue)) {\n returnValue = returnValue(...functionArgs)\n }\n\n if (is.element(returnValue)) {\n returnValue = getElementRect(returnValue)\n }\n\n return returnValue as Interact.Rect\n}\n\nexport function rectToXY (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n }\n}\n\nexport function xywhToTlbr (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect)\n\n rect.left = rect.x || 0\n rect.top = rect.y || 0\n rect.right = rect.right || (rect.left + rect.width)\n rect.bottom = rect.bottom || (rect.top + rect.height)\n }\n\n return rect\n}\n\nexport function tlbrToXywh (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect)\n\n rect.x = rect.left || 0\n rect.y = rect.top || 0\n rect.width = rect.width || (rect.right || 0 - rect.x)\n rect.height = rect.height || (rect.bottom || 0 - rect.y)\n }\n\n return rect\n}\n\nexport function addEdges (edges: Interact.EdgeOptions, rect: Interact.Rect, delta: Interact.Point) {\n if (edges.left) { rect.left += delta.x }\n if (edges.right) { rect.right += delta.x }\n if (edges.top) { rect.top += delta.y }\n if (edges.bottom) { rect.bottom += delta.y }\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/rect.min.js b/@interactjs/utils/rect.min.js new file mode 100644 index 000000000..85378be53 --- /dev/null +++ b/@interactjs/utils/rect.min.js @@ -0,0 +1,2 @@ +import{closest as t,getElementRect as o,parentNode as e}from"./domUtils.min.js";import i from"./extend.min.js";import*as r from"./is.min.js";export function getStringOptionResult(o,i,r){return"parent"===o?e(r):"self"===o?i.getRect(r):t(r,o)}export function resolveRectLike(t,e,i,n){let h=t;return r.string(h)?h=getStringOptionResult(h,e,i):r.func(h)&&(h=h(...n)),r.element(h)&&(h=o(h)),h}export function rectToXY(t){return t&&{x:"x"in t?t.x:t.left,y:"y"in t?t.y:t.top}}export function xywhToTlbr(t){return!t||"left"in t&&"top"in t||((t=i({},t)).left=t.x||0,t.top=t.y||0,t.right=t.right||t.left+t.width,t.bottom=t.bottom||t.top+t.height),t}export function tlbrToXywh(t){return!t||"x"in t&&"y"in t||((t=i({},t)).x=t.left||0,t.y=t.top||0,t.width=t.width||t.right||0-t.x,t.height=t.height||t.bottom||0-t.y),t}export function addEdges(t,o,e){t.left&&(o.left+=e.x),t.right&&(o.right+=e.x),t.top&&(o.top+=e.y),t.bottom&&(o.bottom+=e.y),o.width=o.right-o.left,o.height=o.bottom-o.top} +//# sourceMappingURL=rect.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/rect.min.js.map b/@interactjs/utils/rect.min.js.map new file mode 100644 index 000000000..153af0da9 --- /dev/null +++ b/@interactjs/utils/rect.min.js.map @@ -0,0 +1,42 @@ +{ + "version": 3, + "sources": [ + "rect.ts" + ], + "names": [ + "closest", + "getElementRect", + "parentNode", + "extend", + "is", + "getStringOptionResult", + "value", + "target", + "element", + "getRect", + "resolveRectLike", + "functionArgs", + "returnValue", + "string", + "func", + "rectToXY", + "rect", + "x", + "left", + "y", + "top", + "xywhToTlbr", + "right", + "width", + "bottom", + "height", + "tlbrToXywh", + "addEdges", + "edges", + "delta" + ], + "mappings": "kBAASA,oBAASC,gBAAgBC,MAAkB,2BAC7CC,MAAY,4BACPC,MAAQ,qBAEb,SAASC,sBAAuBC,EAAYC,EAA6BC,GAC9E,MAAc,WAAVF,EAA6BJ,EAAWM,GAE9B,SAAVF,EAA2BC,EAAOE,QAAQD,GAEvCR,EAAQQ,EAASF,UAGnB,SAASI,gBACdJ,EACAC,EACAC,EACAG,GAEA,IAAIC,EAAmBN,EAYvB,OAXIF,EAAGS,OAAOD,GACZA,EAAcP,sBAAsBO,EAAaL,EAAQC,GAElDJ,EAAGU,KAAKF,KACfA,EAAcA,KAAeD,IAG3BP,EAAGI,QAAQI,KACbA,EAAcX,EAAeW,IAGxBA,SAGF,SAASG,SAAUC,GACxB,OAAQA,GAAQ,CACdC,EAAG,MAAOD,EAAOA,EAAKC,EAAID,EAAKE,KAC/BC,EAAG,MAAOH,EAAOA,EAAKG,EAAIH,EAAKI,YAI5B,SAASC,WAAYL,GAU1B,OATIA,GAAU,SAAUA,GAAQ,QAASA,KACvCA,EAAOb,EAAO,GAAIa,IAEbE,KAASF,EAAKC,GAAK,EACxBD,EAAKI,IAASJ,EAAKG,GAAK,EACxBH,EAAKM,MAASN,EAAKM,OAAYN,EAAKE,KAAOF,EAAKO,MAChDP,EAAKQ,OAASR,EAAKQ,QAAYR,EAAKI,IAAMJ,EAAKS,QAG1CT,SAGF,SAASU,WAAYV,GAU1B,OATIA,GAAU,MAAOA,GAAQ,MAAOA,KAClCA,EAAOb,EAAO,GAAIa,IAEbC,EAASD,EAAKE,MAAQ,EAC3BF,EAAKG,EAASH,EAAKI,KAAQ,EAC3BJ,EAAKO,MAASP,EAAKO,OAAWP,EAAKM,OAAS,EAAKN,EAAKC,EACtDD,EAAKS,OAAST,EAAKS,QAAWT,EAAKQ,QAAU,EAAIR,EAAKG,GAGjDH,SAGF,SAASW,SAAUC,EAA6BZ,EAAqBa,GACtED,EAAMV,OAAUF,EAAKE,MAAUW,EAAMZ,GACrCW,EAAMN,QAAUN,EAAKM,OAAUO,EAAMZ,GACrCW,EAAMR,MAAUJ,EAAKI,KAAUS,EAAMV,GACrCS,EAAMJ,SAAUR,EAAKQ,QAAUK,EAAMV,GAEzCH,EAAKO,MAAQP,EAAKM,MAAQN,EAAKE,KAC/BF,EAAKS,OAAST,EAAKQ,OAASR,EAAKI", + "sourcesContent": [ + "import { closest, getElementRect, parentNode } from './domUtils'\nimport extend from './extend'\nimport * as is from './is'\n\nexport function getStringOptionResult (value: any, target: Interact.HasGetRect, element) {\n if (value === 'parent') { return parentNode(element) }\n\n if (value === 'self') { return target.getRect(element) }\n\n return closest(element, value)\n}\n\nexport function resolveRectLike (\n value: Interact.RectResolvable,\n target?: Interact.HasGetRect,\n element?: Node,\n functionArgs?: T,\n) {\n let returnValue: any = value\n if (is.string(returnValue)) {\n returnValue = getStringOptionResult(returnValue, target, element)\n }\n else if (is.func(returnValue)) {\n returnValue = returnValue(...functionArgs)\n }\n\n if (is.element(returnValue)) {\n returnValue = getElementRect(returnValue)\n }\n\n return returnValue as Interact.Rect\n}\n\nexport function rectToXY (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n }\n}\n\nexport function xywhToTlbr (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect)\n\n rect.left = rect.x || 0\n rect.top = rect.y || 0\n rect.right = rect.right || (rect.left + rect.width)\n rect.bottom = rect.bottom || (rect.top + rect.height)\n }\n\n return rect\n}\n\nexport function tlbrToXywh (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect)\n\n rect.x = rect.left || 0\n rect.y = rect.top || 0\n rect.width = rect.width || (rect.right || 0 - rect.x)\n rect.height = rect.height || (rect.bottom || 0 - rect.y)\n }\n\n return rect\n}\n\nexport function addEdges (edges: Interact.EdgeOptions, rect: Interact.Rect, delta: Interact.Point) {\n if (edges.left) { rect.left += delta.x }\n if (edges.right) { rect.right += delta.x }\n if (edges.top) { rect.top += delta.y }\n if (edges.bottom) { rect.bottom += delta.y }\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n}\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/window.d.ts b/@interactjs/utils/window.d.ts new file mode 100644 index 000000000..81a122c94 --- /dev/null +++ b/@interactjs/utils/window.d.ts @@ -0,0 +1,11 @@ +declare const win: { + realWindow: Window; + window: Window; + getWindow: typeof getWindow; + init: typeof init; +}; +export declare function init(window: Window & { + wrap?: (...args: any[]) => any; +}): void; +export declare function getWindow(node: any): any; +export default win; diff --git a/@interactjs/utils/window.js b/@interactjs/utils/window.js new file mode 100644 index 000000000..165a0b877 --- /dev/null +++ b/@interactjs/utils/window.js @@ -0,0 +1,39 @@ +import isWindow from "./isWindow.js"; +const win = { + realWindow: undefined, + window: undefined, + getWindow, + init +}; +export function init(window) { + // get wrapped window if using Shadow DOM polyfill + win.realWindow = window; // create a TextNode + + const el = window.document.createTextNode(''); // check if it's wrapped by a polyfill + + if (el.ownerDocument !== window.document && typeof window.wrap === 'function' && window.wrap(el) === el) { + // use wrapped window + window = window.wrap(window); + } + + win.window = window; +} + +if (typeof window === 'undefined') { + win.window = undefined; + win.realWindow = undefined; +} else { + init(window); +} + +export function getWindow(node) { + if (isWindow(node)) { + return node; + } + + const rootNode = node.ownerDocument || node; + return rootNode.defaultView || win.window; +} +win.init = init; +export default win; +//# sourceMappingURL=window.js.map \ No newline at end of file diff --git a/@interactjs/utils/window.js.map b/@interactjs/utils/window.js.map new file mode 100644 index 000000000..05265c888 --- /dev/null +++ b/@interactjs/utils/window.js.map @@ -0,0 +1,27 @@ +{ + "version": 3, + "sources": [ + "window.ts" + ], + "names": [ + "isWindow", + "win", + "realWindow", + "undefined", + "window", + "getWindow", + "init", + "el", + "document", + "createTextNode", + "ownerDocument", + "wrap", + "node", + "rootNode", + "defaultView" + ], + "mappings": "AAAA,OAAOA,QAAP,MAAqB,eAArB;AAEA,MAAMC,GAAG,GAAG;AACVC,EAAAA,UAAU,EAAEC,SADF;AAEVC,EAAAA,MAAM,EAAED,SAFE;AAGVE,EAAAA,SAHU;AAIVC,EAAAA;AAJU,CAAZ;AAOA,OAAO,SAASA,IAAT,CAAeF,MAAf,EAAoE;AACzE;AAEAH,EAAAA,GAAG,CAACC,UAAJ,GAAiBE,MAAjB,CAHyE,CAKzE;;AACA,QAAMG,EAAE,GAAGH,MAAM,CAACI,QAAP,CAAgBC,cAAhB,CAA+B,EAA/B,CAAX,CANyE,CAQzE;;AACA,MAAIF,EAAE,CAACG,aAAH,KAAqBN,MAAM,CAACI,QAA5B,IACA,OAAOJ,MAAM,CAACO,IAAd,KAAuB,UADvB,IAEFP,MAAM,CAACO,IAAP,CAAYJ,EAAZ,MAAoBA,EAFtB,EAE0B;AACxB;AACAH,IAAAA,MAAM,GAAGA,MAAM,CAACO,IAAP,CAAYP,MAAZ,CAAT;AACD;;AAEDH,EAAAA,GAAG,CAACG,MAAJ,GAAaA,MAAb;AACD;;AAED,IAAI,OAAOA,MAAP,KAAkB,WAAtB,EAAmC;AACjCH,EAAAA,GAAG,CAACG,MAAJ,GAAiBD,SAAjB;AACAF,EAAAA,GAAG,CAACC,UAAJ,GAAiBC,SAAjB;AACD,CAHD,MAIK;AACHG,EAAAA,IAAI,CAACF,MAAD,CAAJ;AACD;;AAED,OAAO,SAASC,SAAT,CAAoBO,IAApB,EAA+B;AACpC,MAAIZ,QAAQ,CAACY,IAAD,CAAZ,EAAoB;AAClB,WAAOA,IAAP;AACD;;AAED,QAAMC,QAAQ,GAAID,IAAI,CAACF,aAAL,IAAsBE,IAAxC;AAEA,SAAOC,QAAQ,CAACC,WAAT,IAAwBb,GAAG,CAACG,MAAnC;AACD;AAEDH,GAAG,CAACK,IAAJ,GAAWA,IAAX;AAEA,eAAeL,GAAf", + "sourcesContent": [ + "import isWindow from './isWindow'\n\nconst win = {\n realWindow: undefined as Window,\n window: undefined as Window,\n getWindow,\n init,\n}\n\nexport function init (window: Window & { wrap?: (...args: any[]) => any }) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window\n\n // create a TextNode\n const el = window.document.createTextNode('')\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document &&\n typeof window.wrap === 'function' &&\n window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window)\n }\n\n win.window = window\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined\n win.realWindow = undefined\n}\nelse {\n init(window)\n}\n\nexport function getWindow (node: any) {\n if (isWindow(node)) {\n return node\n }\n\n const rootNode = (node.ownerDocument || node)\n\n return rootNode.defaultView || win.window\n}\n\nwin.init = init\n\nexport default win\n" + ] +} \ No newline at end of file diff --git a/@interactjs/utils/window.min.js b/@interactjs/utils/window.min.js new file mode 100644 index 000000000..5d9c81d77 --- /dev/null +++ b/@interactjs/utils/window.min.js @@ -0,0 +1,2 @@ +import i from"./isWindow.min.js";const n={realWindow:void 0,window:void 0,getWindow:getWindow,init:init};export function init(i){n.realWindow=i;const o=i.document.createTextNode("");o.ownerDocument!==i.document&&"function"==typeof i.wrap&&i.wrap(o)===o&&(i=i.wrap(i)),n.window=i}"undefined"==typeof window?(n.window=void 0,n.realWindow=void 0):init(window);export function getWindow(o){if(i(o))return o;return(o.ownerDocument||o).defaultView||n.window}n.init=init;export default n; +//# sourceMappingURL=window.min.js.map \ No newline at end of file diff --git a/@interactjs/utils/window.min.js.map b/@interactjs/utils/window.min.js.map new file mode 100644 index 000000000..5d900a03a --- /dev/null +++ b/@interactjs/utils/window.min.js.map @@ -0,0 +1,26 @@ +{ + "version": 3, + "sources": [ + "window.ts" + ], + "names": [ + "isWindow", + "win", + "realWindow", + "undefined", + "window", + "getWindow", + "init", + "el", + "document", + "createTextNode", + "ownerDocument", + "wrap", + "node", + "defaultView" + ], + "mappings": "OAAOA,MAAc,oBAErB,MAAMC,EAAM,CACVC,gBAAYC,EACZC,YAAQD,EACRE,UAAAA,UACAC,KAAAA,aAGK,SAASA,KAAMF,GAGpBH,EAAIC,WAAaE,EAGjB,MAAMG,EAAKH,EAAOI,SAASC,eAAe,IAGtCF,EAAGG,gBAAkBN,EAAOI,UACL,mBAAhBJ,EAAOO,MAChBP,EAAOO,KAAKJ,KAAQA,IAEpBH,EAASA,EAAOO,KAAKP,IAGvBH,EAAIG,OAASA,EAGO,oBAAXA,QACTH,EAAIG,YAAaD,EACjBF,EAAIC,gBAAaC,GAGjBG,KAAKF,eAGA,SAASC,UAAWO,GACzB,GAAIZ,EAASY,GACX,OAAOA,EAKT,OAFkBA,EAAKF,eAAiBE,GAExBC,aAAeZ,EAAIG,OAGrCH,EAAIK,KAAOA,oBAEIL", + "sourcesContent": [ + "import isWindow from './isWindow'\n\nconst win = {\n realWindow: undefined as Window,\n window: undefined as Window,\n getWindow,\n init,\n}\n\nexport function init (window: Window & { wrap?: (...args: any[]) => any }) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window\n\n // create a TextNode\n const el = window.document.createTextNode('')\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document &&\n typeof window.wrap === 'function' &&\n window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window)\n }\n\n win.window = window\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined\n win.realWindow = undefined\n}\nelse {\n init(window)\n}\n\nexport function getWindow (node: any) {\n if (isWindow(node)) {\n return node\n }\n\n const rootNode = (node.ownerDocument || node)\n\n return rootNode.defaultView || win.window\n}\n\nwin.init = init\n\nexport default win\n" + ] +} \ No newline at end of file diff --git a/interactjs/.npmignore b/interactjs/.npmignore new file mode 100644 index 000000000..468d7c506 --- /dev/null +++ b/interactjs/.npmignore @@ -0,0 +1,7 @@ +# copied from [root]/.npmignore +*.ts +!*.d.ts +*.spec.ts +*.spec.js +dist/docs +guide diff --git a/interactjs/LICENSE b/interactjs/LICENSE new file mode 100644 index 000000000..e4854f77d --- /dev/null +++ b/interactjs/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2012-present Taye Adeyemi + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/interactjs/README.md b/interactjs/README.md new file mode 100644 index 000000000..6fb0ade83 --- /dev/null +++ b/interactjs/README.md @@ -0,0 +1,112 @@ +interact.js + +

+ JavaScript drag and drop, resizing and multi-touch gestures with inertia and snapping for modern browsers (and also IE9+). +

+ +
+Gitter +jsDelivr +Build Status + +
+
+ +Features include: + + - **inertia** and **snapping** + - **multi-touch**, simultaneous interactions + - cross browser and device, supporting the **desktop and mobile** versions of + Chrome, Firefox and Opera as well as **Internet Explorer 9+** + - interaction with [**SVG**](http://interactjs.io/#use_in_svg_files) elements + - being **standalone and customizable** + - **not modifying the DOM** except to change the cursor (but you can disable + that) + +Installation +------------ + +* [npm](https://www.npmjs.org/): `npm install interactjs` +* [jsDelivr CDN](https://cdn.jsdelivr.net/npm/interactjs/): `` +* [unpkg CDN](https://unpkg.com/interactjs/): `` +* [Rails 5.1+](https://rubyonrails.org/): + 1. `yarn add interactjs` + 2. `//= require interactjs/interact` +* [Webjars SBT/Play 2](https://www.webjars.org/): `libraryDependencies ++= Seq("org.webjars.npm" % "interactjs" % version)` + +### Typescript definitions + +The project is written in Typescript and the npm package includes the type +definitions, but if you need the typings alone, you can install them with: + +``` +npm install --save-dev @interactjs/types +``` + +Documentation +------------- + +http://interactjs.io/docs + +Example +------- + +```javascript +var pixelSize = 16; + +interact('.rainbow-pixel-canvas') + .origin('self') + .draggable({ + modifiers: [ + interact.modifiers.snap({ + // snap to the corners of a grid + targets: [ + interact.snappers.grid({ x: pixelSize, y: pixelSize }), + ], + }) + ], + listeners: { + // draw colored squares on move + move: function (event) { + var context = event.target.getContext('2d'), + // calculate the angle of the drag direction + dragAngle = 180 * Math.atan2(event.dx, event.dy) / Math.PI; + + // set color based on drag angle and speed + context.fillStyle = 'hsl(' + dragAngle + ', 86%, ' + + (30 + Math.min(event.speed / 1000, 1) * 50) + '%)'; + + // draw squares + context.fillRect(event.pageX - pixelSize / 2, event.pageY - pixelSize / 2, + pixelSize, pixelSize); + } + } + }) + // clear the canvas on doubletap + .on('doubletap', function (event) { + var context = event.target.getContext('2d'); + + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + }); + + function resizeCanvases () { + [].forEach.call(document.querySelectorAll('.rainbow-pixel-canvas'), function (canvas) { + canvas.width = document.body.clientWidth; + canvas.height = window.innerHeight * 0.7; + }); + } + + // interact.js can also add DOM event listeners + interact(document).on('DOMContentLoaded', resizeCanvases); + interact(window).on('resize', resizeCanvases); +``` + +See the above code in action at https://codepen.io/taye/pen/tCKAm + +License +------- + +interact.js is released under the [MIT License](http://taye.mit-license.org). + +[ijs-twitter]: https://twitter.com/interactjs +[upcoming-changes]: https://github.com/taye/interact.js/blob/master/CHANGELOG.md#upcoming-changes diff --git a/interactjs/dist/api/@interactjs_actions_drag.ts.html b/interactjs/dist/api/@interactjs_actions_drag.ts.html new file mode 100644 index 000000000..468216b4e --- /dev/null +++ b/interactjs/dist/api/@interactjs_actions_drag.ts.html @@ -0,0 +1,242 @@ + + + + + + @interactjs/actions/drag.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/actions/drag.ts

+ + + + + + + +
+
+
import { Scope } from '@interactjs/core/scope'
+import * as is from '@interactjs/utils/is'
+
+declare module '@interactjs/core/Interactable' {
+  interface Interactable {
+    draggable: DraggableMethod
+  }
+}
+
+declare module '@interactjs/core/defaultOptions' {
+  interface ActionDefaults {
+    drag: Interact.DraggableOptions
+  }
+}
+
+declare module '@interactjs/core/scope' {
+  interface ActionMap {
+    drag?: typeof drag
+  }
+}
+
+export type DragEvent = Interact.InteractEvent<'drag'>
+
+export type DraggableMethod = Interact.ActionMethod<Interact.DraggableOptions>
+
+function install (scope: Scope) {
+  const {
+    actions,
+    Interactable,
+    defaults,
+  } = scope
+
+  Interactable.prototype.draggable = drag.draggable
+
+  actions.map.drag = drag
+  actions.methodDict.drag = 'draggable'
+
+  defaults.actions.drag = drag.defaults
+}
+
+function beforeMove ({ interaction }) {
+  if (interaction.prepared.name !== 'drag') { return }
+
+  const axis = interaction.prepared.axis
+
+  if (axis === 'x') {
+    interaction.coords.cur.page.y   = interaction.coords.start.page.y
+    interaction.coords.cur.client.y = interaction.coords.start.client.y
+
+    interaction.coords.velocity.client.y = 0
+    interaction.coords.velocity.page.y   = 0
+  }
+  else if (axis === 'y') {
+    interaction.coords.cur.page.x   = interaction.coords.start.page.x
+    interaction.coords.cur.client.x = interaction.coords.start.client.x
+
+    interaction.coords.velocity.client.x = 0
+    interaction.coords.velocity.page.x   = 0
+  }
+}
+
+function move ({ iEvent, interaction }) {
+  if (interaction.prepared.name !== 'drag') { return }
+
+  const axis = interaction.prepared.axis
+
+  if (axis === 'x' || axis === 'y') {
+    const opposite = axis === 'x' ? 'y' : 'x'
+
+    iEvent.page[opposite]   = interaction.coords.start.page[opposite]
+    iEvent.client[opposite] = interaction.coords.start.client[opposite]
+    iEvent.delta[opposite] = 0
+  }
+}
+
+/**
+ * ```js
+ * interact(element).draggable({
+ *     onstart: function (event) {},
+ *     onmove : function (event) {},
+ *     onend  : function (event) {},
+ *
+ *     // the axis in which the first movement must be
+ *     // for the drag sequence to start
+ *     // 'xy' by default - any direction
+ *     startAxis: 'x' || 'y' || 'xy',
+ *
+ *     // 'xy' by default - don't restrict to one axis (move in any direction)
+ *     // 'x' or 'y' to restrict movement to either axis
+ *     // 'start' to restrict movement to the axis the drag started in
+ *     lockAxis: 'x' || 'y' || 'xy' || 'start',
+ *
+ *     // max number of drags that can happen concurrently
+ *     // with elements of this Interactable. Infinity by default
+ *     max: Infinity,
+ *
+ *     // max number of drags that can target the same element+Interactable
+ *     // 1 by default
+ *     maxPerElement: 2
+ * })
+ *
+ * var isDraggable = interact('element').draggable(); // true
+ * ```
+ *
+ * Get or set whether drag actions can be performed on the target
+ *
+ * @alias Interactable.prototype.draggable
+ *
+ * @param {boolean | object} [options] true/false or An object with event
+ * listeners to be fired on drag events (object makes the Interactable
+ * draggable)
+ * @return {boolean | Interactable} boolean indicating if this can be the
+ * target of drag events, or this Interctable
+ */
+const draggable: DraggableMethod = function draggable (this: Interact.Interactable, options?: Interact.DraggableOptions | boolean): any {
+  if (is.object(options)) {
+    this.options.drag.enabled = options.enabled !== false
+    this.setPerAction('drag', options)
+    this.setOnEvents('drag', options)
+
+    if (/^(xy|x|y|start)$/.test(options.lockAxis)) {
+      this.options.drag.lockAxis = options.lockAxis
+    }
+    if (/^(xy|x|y)$/.test(options.startAxis)) {
+      this.options.drag.startAxis = options.startAxis
+    }
+
+    return this
+  }
+
+  if (is.bool(options)) {
+    this.options.drag.enabled = options
+
+    return this
+  }
+
+  return this.options.drag
+}
+
+const drag: Interact.Plugin = {
+  id: 'actions/drag',
+  install,
+  listeners: {
+    'interactions:before-action-move': beforeMove,
+    'interactions:action-resume': beforeMove,
+
+    // dragmove
+    'interactions:action-move': move,
+    'auto-start:check': arg => {
+      const { interaction, interactable, buttons } = arg
+      const dragOptions = interactable.options.drag
+
+      if (
+        !(dragOptions && dragOptions.enabled) ||
+        // check mouseButton setting if the pointer is down
+        (interaction.pointerIsDown &&
+         /mouse|pointer/.test(interaction.pointerType) &&
+       (buttons & interactable.options.drag.mouseButtons) === 0)
+      ) {
+        return undefined
+      }
+
+      arg.action = {
+        name: 'drag',
+        axis: (dragOptions.lockAxis === 'start'
+          ? dragOptions.startAxis
+          : dragOptions.lockAxis),
+      }
+
+      return false
+    },
+  },
+  draggable,
+  beforeMove,
+  move,
+  defaults: {
+    startAxis : 'xy',
+    lockAxis  : 'xy',
+  } as Interact.DropzoneOptions,
+
+  getCursor () {
+    return 'move'
+  },
+}
+
+export default drag
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_actions_drop_DropEvent.ts.html b/interactjs/dist/api/@interactjs_actions_drop_DropEvent.ts.html new file mode 100644 index 000000000..ce435bc75 --- /dev/null +++ b/interactjs/dist/api/@interactjs_actions_drop_DropEvent.ts.html @@ -0,0 +1,148 @@ + + + + + + @interactjs/actions/drop/DropEvent.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/actions/drop/DropEvent.ts

+ + + + + + + +
+
+
import BaseEvent from '@interactjs/core/BaseEvent'
+import Interactable from '@interactjs/core/Interactable'
+import InteractEvent from '@interactjs/core/InteractEvent'
+import * as arr from '@interactjs/utils/arr'
+
+class DropEvent extends BaseEvent {
+  target: Interact.Element
+  dropzone: Interactable
+  dragEvent: InteractEvent<'drag'>
+  relatedTarget: Interact.Element
+  draggable: Interactable
+  timeStamp: number
+  propagationStopped = false
+  immediatePropagationStopped = false
+
+  /**
+   * Class of events fired on dropzones during drags with acceptable targets.
+   */
+  constructor (dropState: import('./').DropState, dragEvent: InteractEvent<'drag'>, type: string) {
+    super(dragEvent._interaction)
+
+    const { element, dropzone } = type === 'dragleave'
+      ? dropState.prev
+      : dropState.cur
+
+    this.type          = type
+    this.target        = element
+    this.currentTarget = element
+    this.dropzone      = dropzone
+    this.dragEvent     = dragEvent
+    this.relatedTarget = dragEvent.target
+    this.draggable     = dragEvent.interactable
+    this.timeStamp     = dragEvent.timeStamp
+  }
+
+  /**
+   * If this is a `dropactivate` event, the dropzone element will be
+   * deactivated.
+   *
+   * If this is a `dragmove` or `dragenter`, a `dragleave` will be fired on the
+   * dropzone element and more.
+   */
+  reject () {
+    const { dropState } = this._interaction
+
+    if (
+      (this.type !== 'dropactivate') && (
+        !this.dropzone ||
+        dropState.cur.dropzone !== this.dropzone ||
+        dropState.cur.element !== this.target)) {
+      return
+    }
+
+    dropState.prev.dropzone = this.dropzone
+    dropState.prev.element = this.target
+
+    dropState.rejected = true
+    dropState.events.enter = null
+
+    this.stopImmediatePropagation()
+
+    if (this.type === 'dropactivate') {
+      const activeDrops = dropState.activeDrops
+      const index = arr.findIndex(activeDrops, ({ dropzone, element }) =>
+        dropzone === this.dropzone && element === this.target)
+
+      dropState.activeDrops.splice(index, 1)
+
+      const deactivateEvent = new DropEvent(dropState, this.dragEvent, 'dropdeactivate')
+
+      deactivateEvent.dropzone = this.dropzone
+      deactivateEvent.target = this.target
+
+      this.dropzone.fire(deactivateEvent)
+    }
+    else {
+      this.dropzone.fire(new DropEvent(dropState, this.dragEvent, 'dragleave'))
+    }
+  }
+
+  preventDefault () {}
+
+  stopPropagation () {
+    this.propagationStopped = true
+  }
+
+  stopImmediatePropagation () {
+    this.immediatePropagationStopped = this.propagationStopped = true
+  }
+}
+
+export default DropEvent
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_actions_drop_index.ts.html b/interactjs/dist/api/@interactjs_actions_drop_index.ts.html new file mode 100644 index 000000000..e4a4ee977 --- /dev/null +++ b/interactjs/dist/api/@interactjs_actions_drop_index.ts.html @@ -0,0 +1,631 @@ + + + + + + @interactjs/actions/drop/index.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/actions/drop/index.ts

+ + + + + + + +
+
+
import Interactable from '@interactjs/core/Interactable'
+import InteractEvent from '@interactjs/core/InteractEvent'
+import { Scope } from '@interactjs/core/scope'
+import * as utils from '@interactjs/utils/index'
+import drag from '../drag'
+import DropEvent from './DropEvent'
+
+export interface DropzoneMethod {
+  (options: Interact.DropzoneOptions | boolean): Interact.Interactable
+  (): Interact.DropzoneOptions
+}
+
+declare module '@interactjs/core/Interactable' {
+  interface Interactable {
+    dropzone: DropzoneMethod
+    dropCheck: (
+      dragEvent: InteractEvent,
+      event: Interact.PointerEventType,
+      draggable: Interactable,
+      draggableElement: Interact.Element,
+      dropElemen: Interact.Element,
+      rect: any
+    ) => boolean
+  }
+}
+
+declare module '@interactjs/core/Interaction' {
+  interface Interaction {
+    dropState?: DropState
+  }
+}
+
+declare module '@interactjs/core/defaultOptions' {
+  interface ActionDefaults {
+    drop: Interact.DropzoneOptions
+  }
+}
+
+declare module '@interactjs/core/scope' {
+  interface ActionMap {
+    drop?: typeof drop
+  }
+
+  interface Scope {
+    dynamicDrop?: boolean
+  }
+
+  interface SignalArgs {
+    'actions/drop:start': DropSignalArg
+    'actions/drop:move': DropSignalArg
+    'actions/drop:end': DropSignalArg
+  }
+}
+
+interface DropSignalArg {
+  interaction: Interact.Interaction
+  dragEvent: Interact.DragEvent
+}
+
+export interface DropState {
+  cur: {
+    dropzone: Interactable    // the dropzone a drag target might be dropped into
+    element: Interact.Element // the element at the time of checking
+  }
+  prev: {
+    dropzone: Interactable    // the dropzone that was recently dragged away from
+    element: Interact.Element // the element at the time of checking
+  }
+  rejected: boolean           // wheather the potential drop was rejected from a listener
+  events: any                 // the drop events related to the current drag event
+  activeDrops: Array<{
+    dropzone: Interactable
+    element: Interact.Element
+    rect: Interact.Rect
+  }>
+}
+
+function install (scope: Scope) {
+  const {
+    actions,
+    /** @lends module:interact */
+    interact,
+    /** @lends Interactable */
+    Interactable, // eslint-disable-line no-shadow
+    defaults,
+  } = scope
+
+  scope.usePlugin(drag)
+
+  /**
+   *
+   * ```js
+   * interact('.drop').dropzone({
+   *   accept: '.can-drop' || document.getElementById('single-drop'),
+   *   overlap: 'pointer' || 'center' || zeroToOne
+   * }
+   * ```
+   *
+   * Returns or sets whether draggables can be dropped onto this target to
+   * trigger drop events
+   *
+   * Dropzones can receive the following events:
+   *  - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends
+   *  - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone
+   *  - `dragmove` when a draggable that has entered the dropzone is moved
+   *  - `drop` when a draggable is dropped into this dropzone
+   *
+   * Use the `accept` option to allow only elements that match the given CSS
+   * selector or element. The value can be:
+   *
+   *  - **an Element** - only that element can be dropped into this dropzone.
+   *  - **a string**, - the element being dragged must match it as a CSS selector.
+   *  - **`null`** - accept options is cleared - it accepts any element.
+   *
+   * Use the `overlap` option to set how drops are checked for. The allowed
+   * values are:
+   *
+   *   - `'pointer'`, the pointer must be over the dropzone (default)
+   *   - `'center'`, the draggable element's center must be over the dropzone
+   *   - a number from 0-1 which is the `(intersection area) / (draggable area)`.
+   *   e.g. `0.5` for drop to happen when half of the area of the draggable is
+   *   over the dropzone
+   *
+   * Use the `checker` option to specify a function to check if a dragged element
+   * is over this Interactable.
+   *
+   * @param {boolean | object | null} [options] The new options to be set.
+   * @return {boolean | Interactable} The current setting or this Interactable
+   */
+  Interactable.prototype.dropzone = function (this: Interact.Interactable, options?: Interact.DropzoneOptions | boolean) {
+    return dropzoneMethod(this, options)
+  }
+
+  /**
+   * ```js
+   * interact(target)
+   * .dropChecker(function(dragEvent,         // related dragmove or dragend event
+   *                       event,             // TouchEvent/PointerEvent/MouseEvent
+   *                       dropped,           // bool result of the default checker
+   *                       dropzone,          // dropzone Interactable
+   *                       dropElement,       // dropzone elemnt
+   *                       draggable,         // draggable Interactable
+   *                       draggableElement) {// draggable element
+   *
+   *   return dropped && event.target.hasAttribute('allow-drop')
+   * }
+   * ```
+   */
+  Interactable.prototype.dropCheck = function (this: Interact.Interactable, dragEvent, event, draggable, draggableElement, dropElement, rect) {
+    return dropCheckMethod(this, dragEvent, event, draggable, draggableElement, dropElement, rect)
+  }
+
+  /**
+   * Returns or sets whether the dimensions of dropzone elements are calculated
+   * on every dragmove or only on dragstart for the default dropChecker
+   *
+   * @param {boolean} [newValue] True to check on each move. False to check only
+   * before start
+   * @return {boolean | interact} The current setting or interact
+   */
+  interact.dynamicDrop = function (newValue?: boolean) {
+    if (utils.is.bool(newValue)) {
+      // if (dragging && scope.dynamicDrop !== newValue && !newValue) {
+      //  calcRects(dropzones)
+      // }
+
+      scope.dynamicDrop = newValue
+
+      return interact
+    }
+    return scope.dynamicDrop
+  }
+
+  utils.extend(actions.phaselessTypes, {
+    dragenter: true,
+    dragleave: true,
+    dropactivate: true,
+    dropdeactivate: true,
+    dropmove: true,
+    drop: true,
+  })
+  actions.methodDict.drop = 'dropzone'
+
+  scope.dynamicDrop = false
+
+  defaults.actions.drop = drop.defaults
+}
+
+function collectDrops ({ interactables }, draggableElement) {
+  const drops = []
+
+  // collect all dropzones and their elements which qualify for a drop
+  for (const dropzone of interactables.list) {
+    if (!dropzone.options.drop.enabled) { continue }
+
+    const accept = dropzone.options.drop.accept
+
+    // test the draggable draggableElement against the dropzone's accept setting
+    if ((utils.is.element(accept) && accept !== draggableElement) ||
+        (utils.is.string(accept) &&
+        !utils.dom.matchesSelector(draggableElement, accept)) ||
+        (utils.is.func(accept) && !accept({ dropzone, draggableElement }))) {
+      continue
+    }
+
+    // query for new elements if necessary
+    const dropElements = utils.is.string(dropzone.target)
+      ? dropzone._context.querySelectorAll(dropzone.target)
+      : utils.is.array(dropzone.target) ? dropzone.target : [dropzone.target]
+
+    for (const dropzoneElement of dropElements) {
+      if (dropzoneElement !== draggableElement) {
+        drops.push({
+          dropzone,
+          element: dropzoneElement,
+        })
+      }
+    }
+  }
+
+  return drops
+}
+
+function fireActivationEvents (activeDrops, event) {
+  // loop through all active dropzones and trigger event
+  for (const { dropzone, element } of activeDrops.slice()) {
+    event.dropzone = dropzone
+
+    // set current element as event target
+    event.target = element
+    dropzone.fire(event)
+    event.propagationStopped = event.immediatePropagationStopped = false
+  }
+}
+
+// return a new array of possible drops. getActiveDrops should always be
+// called when a drag has just started or a drag event happens while
+// dynamicDrop is true
+function getActiveDrops (scope: Scope, dragElement: Interact.Element) {
+  // get dropzones and their elements that could receive the draggable
+  const activeDrops = collectDrops(scope, dragElement)
+
+  for (const activeDrop of activeDrops) {
+    activeDrop.rect = activeDrop.dropzone.getRect(activeDrop.element)
+  }
+
+  return activeDrops
+}
+
+function getDrop ({ dropState, interactable: draggable, element: dragElement }: Partial<Interact.Interaction>, dragEvent, pointerEvent) {
+  const validDrops = []
+
+  // collect all dropzones and their elements which qualify for a drop
+  for (const { dropzone, element: dropzoneElement, rect } of dropState.activeDrops) {
+    validDrops.push(dropzone.dropCheck(dragEvent, pointerEvent, draggable, dragElement, dropzoneElement, rect)
+      ? dropzoneElement
+      : null)
+  }
+
+  // get the most appropriate dropzone based on DOM depth and order
+  const dropIndex = utils.dom.indexOfDeepestElement(validDrops)
+
+  return dropState.activeDrops[dropIndex] || null
+}
+
+function getDropEvents (interaction: Interact.Interaction, _pointerEvent, dragEvent) {
+  const { dropState } = interaction
+  const dropEvents = {
+    enter     : null,
+    leave     : null,
+    activate  : null,
+    deactivate: null,
+    move      : null,
+    drop      : null,
+  }
+
+  if (dragEvent.type === 'dragstart') {
+    dropEvents.activate = new DropEvent(dropState, dragEvent, 'dropactivate')
+
+    dropEvents.activate.target   = null
+    dropEvents.activate.dropzone = null
+  }
+  if (dragEvent.type === 'dragend') {
+    dropEvents.deactivate = new DropEvent(dropState, dragEvent, 'dropdeactivate')
+
+    dropEvents.deactivate.target   = null
+    dropEvents.deactivate.dropzone = null
+  }
+
+  if (dropState.rejected) {
+    return dropEvents
+  }
+
+  if (dropState.cur.element !== dropState.prev.element) {
+    // if there was a previous dropzone, create a dragleave event
+    if (dropState.prev.dropzone) {
+      dropEvents.leave = new DropEvent(dropState, dragEvent, 'dragleave')
+
+      dragEvent.dragLeave    = dropEvents.leave.target   = dropState.prev.element
+      dragEvent.prevDropzone = dropEvents.leave.dropzone = dropState.prev.dropzone
+    }
+    // if dropzone is not null, create a dragenter event
+    if (dropState.cur.dropzone) {
+      dropEvents.enter = new DropEvent(dropState, dragEvent, 'dragenter')
+
+      dragEvent.dragEnter = dropState.cur.element
+      dragEvent.dropzone = dropState.cur.dropzone
+    }
+  }
+
+  if (dragEvent.type === 'dragend' && dropState.cur.dropzone) {
+    dropEvents.drop = new DropEvent(dropState, dragEvent, 'drop')
+
+    dragEvent.dropzone = dropState.cur.dropzone
+    dragEvent.relatedTarget = dropState.cur.element
+  }
+  if (dragEvent.type === 'dragmove' && dropState.cur.dropzone) {
+    dropEvents.move = new DropEvent(dropState, dragEvent, 'dropmove')
+
+    dropEvents.move.dragmove = dragEvent
+    dragEvent.dropzone = dropState.cur.dropzone
+  }
+
+  return dropEvents
+}
+
+function fireDropEvents (interaction: Interact.Interaction, events) {
+  const { dropState } = interaction
+  const {
+    activeDrops,
+    cur,
+    prev,
+  } = dropState
+
+  if (events.leave) { prev.dropzone.fire(events.leave) }
+  if (events.move) { cur.dropzone.fire(events.move) }
+  if (events.enter) { cur.dropzone.fire(events.enter) }
+  if (events.drop) { cur.dropzone.fire(events.drop) }
+
+  if (events.deactivate) {
+    fireActivationEvents(activeDrops, events.deactivate)
+  }
+
+  dropState.prev.dropzone  = cur.dropzone
+  dropState.prev.element = cur.element
+}
+
+function onEventCreated ({ interaction, iEvent, event }: Interact.DoPhaseArg<'drag', Interact.EventPhase>, scope) {
+  if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return }
+
+  const { dropState } = interaction
+
+  if (scope.dynamicDrop) {
+    dropState.activeDrops = getActiveDrops(scope, interaction.element)
+  }
+
+  const dragEvent = iEvent
+  const dropResult = getDrop(interaction, dragEvent, event)
+
+  // update rejected status
+  dropState.rejected = dropState.rejected &&
+    !!dropResult &&
+    dropResult.dropzone === dropState.cur.dropzone &&
+    dropResult.element === dropState.cur.element
+
+  dropState.cur.dropzone  = dropResult && dropResult.dropzone
+  dropState.cur.element = dropResult && dropResult.element
+
+  dropState.events = getDropEvents(interaction, event, dragEvent)
+}
+
+function dropzoneMethod (interactable: Interact.Interactable): Interact.DropzoneOptions
+function dropzoneMethod (interactable: Interact.Interactable, options: Interact.DropzoneOptions | boolean)
+function dropzoneMethod (interactable: Interact.Interactable, options?: Interact.DropzoneOptions | boolean) {
+  if (utils.is.object(options)) {
+    interactable.options.drop.enabled = options.enabled !== false
+
+    if (options.listeners) {
+      const normalized = utils.normalizeListeners(options.listeners)
+      // rename 'drop' to '' as it will be prefixed with 'drop'
+      const corrected = Object.keys(normalized).reduce((acc, type) => {
+        const correctedType = /^(enter|leave)/.test(type)
+          ? `drag${type}`
+          : /^(activate|deactivate|move)/.test(type)
+            ? `drop${type}`
+            : type
+
+        acc[correctedType] = normalized[type]
+
+        return acc
+      }, {})
+
+      interactable.off(interactable.options.drop.listeners)
+      interactable.on(corrected)
+      interactable.options.drop.listeners = corrected
+    }
+
+    if (utils.is.func(options.ondrop)) { interactable.on('drop', options.ondrop) }
+    if (utils.is.func(options.ondropactivate)) { interactable.on('dropactivate', options.ondropactivate) }
+    if (utils.is.func(options.ondropdeactivate)) { interactable.on('dropdeactivate', options.ondropdeactivate) }
+    if (utils.is.func(options.ondragenter)) { interactable.on('dragenter', options.ondragenter) }
+    if (utils.is.func(options.ondragleave)) { interactable.on('dragleave', options.ondragleave) }
+    if (utils.is.func(options.ondropmove)) { interactable.on('dropmove', options.ondropmove) }
+
+    if (/^(pointer|center)$/.test(options.overlap as string)) {
+      interactable.options.drop.overlap = options.overlap
+    }
+    else if (utils.is.number(options.overlap)) {
+      interactable.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0)
+    }
+    if ('accept' in options) {
+      interactable.options.drop.accept = options.accept
+    }
+    if ('checker' in options) {
+      interactable.options.drop.checker = options.checker
+    }
+
+    return interactable
+  }
+
+  if (utils.is.bool(options)) {
+    interactable.options.drop.enabled = options
+
+    return interactable
+  }
+
+  return interactable.options.drop
+}
+
+function dropCheckMethod (
+  interactable: Interact.Interactable,
+  dragEvent: InteractEvent,
+  event: Interact.PointerEventType,
+  draggable: Interact.Interactable,
+  draggableElement: Interact.Element,
+  dropElement: Interact.Element,
+  rect: any,
+) {
+  let dropped = false
+
+  // if the dropzone has no rect (eg. display: none)
+  // call the custom dropChecker or just return false
+  if (!(rect = rect || interactable.getRect(dropElement))) {
+    return (interactable.options.drop.checker
+      ? interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement)
+      : false)
+  }
+
+  const dropOverlap = interactable.options.drop.overlap
+
+  if (dropOverlap === 'pointer') {
+    const origin = utils.getOriginXY(draggable, draggableElement, 'drag')
+    const page = utils.pointer.getPageXY(dragEvent)
+
+    page.x += origin.x
+    page.y += origin.y
+
+    const horizontal = (page.x > rect.left) && (page.x < rect.right)
+    const vertical   = (page.y > rect.top) && (page.y < rect.bottom)
+
+    dropped = horizontal && vertical
+  }
+
+  const dragRect = draggable.getRect(draggableElement)
+
+  if (dragRect && dropOverlap === 'center') {
+    const cx = dragRect.left + dragRect.width  / 2
+    const cy = dragRect.top  + dragRect.height / 2
+
+    dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom
+  }
+
+  if (dragRect && utils.is.number(dropOverlap)) {
+    const overlapArea  = (Math.max(0, Math.min(rect.right, dragRect.right) - Math.max(rect.left, dragRect.left)) *
+                          Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top, dragRect.top)))
+
+    const overlapRatio = overlapArea / (dragRect.width * dragRect.height)
+
+    dropped = overlapRatio >= dropOverlap
+  }
+
+  if (interactable.options.drop.checker) {
+    dropped = interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement)
+  }
+
+  return dropped
+}
+
+const drop: Interact.Plugin = {
+  id: 'actions/drop',
+  install,
+  listeners: {
+    'interactions:before-action-start': ({ interaction }) => {
+      if (interaction.prepared.name !== 'drag') { return }
+
+      interaction.dropState = {
+        cur: {
+          dropzone: null,
+          element: null,
+        },
+        prev: {
+          dropzone: null,
+          element: null,
+        },
+        rejected: null,
+        events: null,
+        activeDrops: [],
+      }
+    },
+
+    'interactions:after-action-start': ({ interaction, event, iEvent: dragEvent }: Interact.DoPhaseArg<'drag', Interact.EventPhase>, scope) => {
+      if (interaction.prepared.name !== 'drag') { return }
+
+      const { dropState } = interaction
+
+      // reset active dropzones
+      dropState.activeDrops = null
+      dropState.events = null
+      dropState.activeDrops = getActiveDrops(scope, interaction.element)
+      dropState.events = getDropEvents(interaction, event, dragEvent)
+
+      if (dropState.events.activate) {
+        fireActivationEvents(dropState.activeDrops, dropState.events.activate)
+        scope.fire('actions/drop:start', { interaction, dragEvent })
+      }
+    },
+
+    // FIXME proper signal types
+    'interactions:action-move': onEventCreated,
+    'interactions:action-end': onEventCreated,
+
+    'interactions:after-action-move': function fireDropAfterMove ({ interaction, iEvent: dragEvent }: Interact.DoPhaseArg<'drag', Interact.EventPhase>, scope) {
+      if (interaction.prepared.name !== 'drag') { return }
+
+      fireDropEvents(interaction, interaction.dropState.events)
+
+      scope.fire('actions/drop:move', { interaction, dragEvent })
+      interaction.dropState.events = {}
+    },
+
+    'interactions:after-action-end': ({ interaction, iEvent: dragEvent }: Interact.DoPhaseArg<'drag', Interact.EventPhase>, scope) => {
+      if (interaction.prepared.name !== 'drag') { return }
+
+      fireDropEvents(interaction, interaction.dropState.events)
+      scope.fire('actions/drop:end', { interaction, dragEvent })
+    },
+
+    'interactions:stop': ({ interaction }) => {
+      if (interaction.prepared.name !== 'drag') { return }
+
+      const { dropState } = interaction
+
+      if (dropState) {
+        dropState.activeDrops = null
+        dropState.events = null
+        dropState.cur.dropzone = null
+        dropState.cur.element = null
+        dropState.prev.dropzone = null
+        dropState.prev.element = null
+        dropState.rejected = false
+      }
+    },
+  },
+  getActiveDrops,
+  getDrop,
+  getDropEvents,
+  fireDropEvents,
+  defaults: {
+    enabled: false,
+    accept : null,
+    overlap: 'pointer',
+  } as Interact.DropzoneOptions,
+}
+
+export default drop
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_actions_gesture.ts.html b/interactjs/dist/api/@interactjs_actions_gesture.ts.html new file mode 100644 index 000000000..80b808e4b --- /dev/null +++ b/interactjs/dist/api/@interactjs_actions_gesture.ts.html @@ -0,0 +1,255 @@ + + + + + + @interactjs/actions/gesture.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/actions/gesture.ts

+ + + + + + + +
+
+
import * as utils from '@interactjs/utils/index'
+
+export type GesturableMethod = Interact.ActionMethod<Interact.GesturableOptions>
+
+declare module '@interactjs/core/Interaction' {
+  interface Interaction {
+    gesture?: {
+      angle: number           // angle from first to second touch
+      distance: number
+      scale: number           // gesture.distance / gesture.startDistance
+      startAngle: number      // angle of line joining two touches
+      startDistance: number   // distance between two touches of touchStart
+    }
+  }
+}
+
+declare module '@interactjs/core/Interactable' {
+  interface Interactable {
+    gesturable: GesturableMethod
+  }
+}
+
+declare module '@interactjs/core/defaultOptions' {
+  interface ActionDefaults {
+    gesture: Interact.GesturableOptions
+  }
+}
+
+declare module '@interactjs/core/scope' {
+  interface ActionMap {
+    gesture?: typeof gesture
+  }
+}
+
+export interface GestureEvent extends Interact.InteractEvent<'gesture'> {
+  distance: number
+  angle: number
+  da: number // angle change
+  scale: number // ratio of distance start to current event
+  ds: number // scale change
+  box: Interact.Rect // enclosing box of all points
+  touches: Interact.PointerType[]
+}
+
+export interface GestureSignalArg extends Interact.DoPhaseArg<'gesture', Interact.EventPhase> {
+  iEvent: GestureEvent
+  interaction: Interact.Interaction<'gesture'>
+}
+
+function install (scope: Interact.Scope) {
+  const {
+    actions,
+    Interactable,
+    defaults,
+  } = scope
+
+  /**
+   * ```js
+   * interact(element).gesturable({
+   *     onstart: function (event) {},
+   *     onmove : function (event) {},
+   *     onend  : function (event) {},
+   *
+   *     // limit multiple gestures.
+   *     // See the explanation in {@link Interactable.draggable} example
+   *     max: Infinity,
+   *     maxPerElement: 1,
+   * })
+   *
+   * var isGestureable = interact(element).gesturable()
+   * ```
+   *
+   * Gets or sets whether multitouch gestures can be performed on the target
+   *
+   * @param {boolean | object} [options] true/false or An object with event
+   * listeners to be fired on gesture events (makes the Interactable gesturable)
+   * @return {boolean | Interactable} A boolean indicating if this can be the
+   * target of gesture events, or this Interactable
+   */
+  Interactable.prototype.gesturable = function (this: Interact.Interactable, options: Interact.GesturableOptions | boolean) {
+    if (utils.is.object(options)) {
+      this.options.gesture.enabled = options.enabled !== false
+      this.setPerAction('gesture', options)
+      this.setOnEvents('gesture', options)
+
+      return this
+    }
+
+    if (utils.is.bool(options)) {
+      this.options.gesture.enabled = options
+
+      return this
+    }
+
+    return this.options.gesture as Interact.Options
+  } as GesturableMethod
+
+  actions.map.gesture = gesture
+  actions.methodDict.gesture = 'gesturable'
+
+  defaults.actions.gesture = gesture.defaults
+}
+
+function updateGestureProps ({ interaction, iEvent, phase }: GestureSignalArg) {
+  if (interaction.prepared.name !== 'gesture') { return }
+
+  const pointers = interaction.pointers.map(p => p.pointer)
+  const starting = phase === 'start'
+  const ending = phase === 'end'
+  const deltaSource = interaction.interactable.options.deltaSource
+
+  iEvent.touches = [pointers[0], pointers[1]]
+
+  if (starting) {
+    iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource)
+    iEvent.box      = utils.pointer.touchBBox(pointers)
+    iEvent.scale    = 1
+    iEvent.ds       = 0
+    iEvent.angle    = utils.pointer.touchAngle(pointers, deltaSource)
+    iEvent.da       = 0
+
+    interaction.gesture.startDistance = iEvent.distance
+    interaction.gesture.startAngle = iEvent.angle
+  }
+  else if (ending) {
+    const prevEvent = interaction.prevEvent as GestureEvent
+
+    iEvent.distance = prevEvent.distance
+    iEvent.box      = prevEvent.box
+    iEvent.scale    = prevEvent.scale
+    iEvent.ds       = 0
+    iEvent.angle    = prevEvent.angle
+    iEvent.da       = 0
+  }
+  else {
+    iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource)
+    iEvent.box      = utils.pointer.touchBBox(pointers)
+    iEvent.scale    = iEvent.distance / interaction.gesture.startDistance
+    iEvent.angle    = utils.pointer.touchAngle(pointers, deltaSource)
+
+    iEvent.ds = iEvent.scale - interaction.gesture.scale
+    iEvent.da = iEvent.angle - interaction.gesture.angle
+  }
+
+  interaction.gesture.distance = iEvent.distance
+  interaction.gesture.angle = iEvent.angle
+
+  if (utils.is.number(iEvent.scale) &&
+      iEvent.scale !== Infinity &&
+      !isNaN(iEvent.scale)) {
+    interaction.gesture.scale = iEvent.scale
+  }
+}
+
+const gesture: Interact.Plugin = {
+  id: 'actions/gesture',
+  before: ['actions/drag', 'actions/resize'],
+  install,
+  listeners: {
+    'interactions:action-start': updateGestureProps,
+    'interactions:action-move': updateGestureProps,
+    'interactions:action-end': updateGestureProps,
+
+    'interactions:new': ({ interaction }) => {
+      interaction.gesture = {
+        angle: 0,
+        distance: 0,
+        scale: 1,
+        startAngle: 0,
+        startDistance: 0,
+      }
+    },
+
+    'auto-start:check': arg => {
+      if (arg.interaction.pointers.length < 2) {
+        return undefined
+      }
+
+      const gestureOptions = arg.interactable.options.gesture
+
+      if (!(gestureOptions && gestureOptions.enabled)) {
+        return undefined
+      }
+
+      arg.action = { name: 'gesture' }
+
+      return false
+    },
+  },
+
+  defaults: {
+  },
+
+  getCursor () {
+    return ''
+  },
+}
+
+export default gesture
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_actions_resize.ts.html b/interactjs/dist/api/@interactjs_actions_resize.ts.html new file mode 100644 index 000000000..b6a6a5c30 --- /dev/null +++ b/interactjs/dist/api/@interactjs_actions_resize.ts.html @@ -0,0 +1,522 @@ + + + + + + @interactjs/actions/resize.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/actions/resize.ts

+ + + + + + + +
+
+
import { Interaction } from '@interactjs/core/Interaction'
+import { Scope } from '@interactjs/core/scope'
+import * as dom from '@interactjs/utils/domUtils'
+import extend from '@interactjs/utils/extend'
+import * as is from '@interactjs/utils/is'
+
+export type EdgeName = 'top' | 'left' | 'bottom' | 'right'
+
+export type ResizableMethod = Interact.ActionMethod<Interact.ResizableOptions>
+
+declare module '@interactjs/core/Interactable' {
+  interface Interactable {
+    resizable: ResizableMethod
+  }
+}
+
+declare module '@interactjs/core/Interaction' {
+  interface Interaction {
+    resizeAxes: 'x' | 'y' | 'xy'
+    resizeStartAspectRatio: number
+  }
+}
+
+declare module '@interactjs/core/defaultOptions' {
+  interface ActionDefaults {
+    resize: Interact.ResizableOptions
+  }
+}
+
+declare module '@interactjs/core/scope' {
+  interface ActionMap {
+    resize?: typeof resize
+  }
+}
+
+export interface ResizeEvent<P extends Interact.EventPhase = Interact.EventPhase> extends Interact.InteractEvent<'resize', P> {
+  deltaRect?: Interact.FullRect
+  edges?: Interact.ActionProps['edges']
+}
+
+function install (scope: Scope) {
+  const {
+    actions,
+    browser,
+    /** @lends Interactable */
+    Interactable, // tslint:disable-line no-shadowed-variable
+    defaults,
+  } = scope
+
+  // Less Precision with touch input
+
+  resize.cursors = initCursors(browser)
+  resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10
+
+  /**
+   * ```js
+   * interact(element).resizable({
+   *   onstart: function (event) {},
+   *   onmove : function (event) {},
+   *   onend  : function (event) {},
+   *
+   *   edges: {
+   *     top   : true,       // Use pointer coords to check for resize.
+   *     left  : false,      // Disable resizing from left edge.
+   *     bottom: '.resize-s',// Resize if pointer target matches selector
+   *     right : handleEl    // Resize if pointer target is the given Element
+   *   },
+   *
+   *     // Width and height can be adjusted independently. When `true`, width and
+   *     // height are adjusted at a 1:1 ratio.
+   *     square: false,
+   *
+   *     // Width and height can be adjusted independently. When `true`, width and
+   *     // height maintain the aspect ratio they had when resizing started.
+   *     preserveAspectRatio: false,
+   *
+   *   // a value of 'none' will limit the resize rect to a minimum of 0x0
+   *   // 'negate' will allow the rect to have negative width/height
+   *   // 'reposition' will keep the width/height positive by swapping
+   *   // the top and bottom edges and/or swapping the left and right edges
+   *   invert: 'none' || 'negate' || 'reposition'
+   *
+   *   // limit multiple resizes.
+   *   // See the explanation in the {@link Interactable.draggable} example
+   *   max: Infinity,
+   *   maxPerElement: 1,
+   * })
+   *
+   * var isResizeable = interact(element).resizable()
+   * ```
+   *
+   * Gets or sets whether resize actions can be performed on the target
+   *
+   * @param {boolean | object} [options] true/false or An object with event
+   * listeners to be fired on resize events (object makes the Interactable
+   * resizable)
+   * @return {boolean | Interactable} A boolean indicating if this can be the
+   * target of resize elements, or this Interactable
+   */
+  Interactable.prototype.resizable = function (this: Interact.Interactable, options: Interact.ResizableOptions | boolean) {
+    return resizable(this, options, scope)
+  } as ResizableMethod
+
+  actions.map.resize = resize
+  actions.methodDict.resize = 'resizable'
+
+  defaults.actions.resize = resize.defaults
+}
+
+function resizeChecker (arg) {
+  const { interaction, interactable, element, rect, buttons } = arg
+
+  if (!rect) { return undefined }
+
+  const page = extend({}, interaction.coords.cur.page)
+  const resizeOptions = interactable.options.resize
+
+  if (
+    !(resizeOptions && resizeOptions.enabled) ||
+    // check mouseButton setting if the pointer is down
+    (interaction.pointerIsDown &&
+     /mouse|pointer/.test(interaction.pointerType) &&
+   (buttons & resizeOptions.mouseButtons) === 0)
+  ) {
+    return undefined
+  }
+
+  // if using resize.edges
+  if (is.object(resizeOptions.edges)) {
+    const resizeEdges = {
+      left: false,
+      right: false,
+      top: false,
+      bottom: false,
+    }
+
+    for (const edge in resizeEdges) {
+      resizeEdges[edge] = checkResizeEdge(edge,
+        resizeOptions.edges[edge],
+        page,
+        interaction._latestPointer.eventTarget,
+        element,
+        rect,
+        resizeOptions.margin || resize.defaultMargin)
+    }
+
+    resizeEdges.left = resizeEdges.left && !resizeEdges.right
+    resizeEdges.top  = resizeEdges.top  && !resizeEdges.bottom
+
+    if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {
+      arg.action = {
+        name: 'resize',
+        edges: resizeEdges,
+      }
+    }
+  }
+  else {
+    const right  = resizeOptions.axis !== 'y' && page.x > (rect.right  - resize.defaultMargin)
+    const bottom = resizeOptions.axis !== 'x' && page.y > (rect.bottom - resize.defaultMargin)
+
+    if (right || bottom) {
+      arg.action = {
+        name: 'resize',
+        axes: (right ? 'x' : '') + (bottom ? 'y' : ''),
+      }
+    }
+  }
+
+  return arg.action ? false : undefined
+}
+
+function resizable (interactable: Interact.Interactable, options: Interact.OrBoolean<Interact.ResizableOptions> | boolean, scope: Scope) {
+  if (is.object(options)) {
+    interactable.options.resize.enabled = options.enabled !== false
+    interactable.setPerAction('resize', options)
+    interactable.setOnEvents('resize', options)
+
+    if (is.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) {
+      interactable.options.resize.axis = options.axis
+    }
+    else if (options.axis === null) {
+      interactable.options.resize.axis = scope.defaults.actions.resize.axis
+    }
+
+    if (is.bool(options.preserveAspectRatio)) {
+      interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio
+    }
+    else if (is.bool(options.square)) {
+      interactable.options.resize.square = options.square
+    }
+
+    return interactable
+  }
+  if (is.bool(options)) {
+    interactable.options.resize.enabled = options
+
+    return interactable
+  }
+  return interactable.options.resize
+}
+
+function checkResizeEdge (
+  name: string,
+  value: any,
+  page: Interact.Point,
+  element: Node,
+  interactableElement: Interact.Element,
+  rect: Interact.Rect,
+  margin: number,
+) {
+  // false, '', undefined, null
+  if (!value) { return false }
+
+  // true value, use pointer coords and element rect
+  if (value === true) {
+    // if dimensions are negative, "switch" edges
+    const width  = is.number(rect.width) ? rect.width  : rect.right  - rect.left
+    const height = is.number(rect.height) ? rect.height : rect.bottom - rect.top
+
+    // don't use margin greater than half the relevent dimension
+    margin = Math.min(margin, (name === 'left' || name === 'right' ? width : height) / 2)
+
+    if (width < 0) {
+      if      (name === 'left')  { name = 'right' }
+      else if (name === 'right') { name = 'left'  }
+    }
+    if (height < 0) {
+      if      (name === 'top')    { name = 'bottom' }
+      else if (name === 'bottom') { name = 'top'    }
+    }
+
+    if (name === 'left') { return page.x < ((width  >= 0 ? rect.left : rect.right) + margin) }
+    if (name === 'top') { return page.y < ((height >= 0 ? rect.top : rect.bottom) + margin) }
+
+    if (name === 'right') { return page.x > ((width  >= 0 ? rect.right : rect.left) - margin) }
+    if (name === 'bottom') { return page.y > ((height >= 0 ? rect.bottom : rect.top) - margin) }
+  }
+
+  // the remaining checks require an element
+  if (!is.element(element)) { return false }
+
+  return is.element(value)
+  // the value is an element to use as a resize handle
+    ? value === element
+    // otherwise check if element matches value as selector
+    : dom.matchesUpTo(element, value, interactableElement)
+}
+
+function initCursors (browser: typeof import ('@interactjs/utils/browser').default) {
+  return (browser.isIe9 ? {
+    x : 'e-resize',
+    y : 's-resize',
+    xy: 'se-resize',
+
+    top        : 'n-resize',
+    left       : 'w-resize',
+    bottom     : 's-resize',
+    right      : 'e-resize',
+    topleft    : 'se-resize',
+    bottomright: 'se-resize',
+    topright   : 'ne-resize',
+    bottomleft : 'ne-resize',
+  } : {
+    x : 'ew-resize',
+    y : 'ns-resize',
+    xy: 'nwse-resize',
+
+    top        : 'ns-resize',
+    left       : 'ew-resize',
+    bottom     : 'ns-resize',
+    right      : 'ew-resize',
+    topleft    : 'nwse-resize',
+    bottomright: 'nwse-resize',
+    topright   : 'nesw-resize',
+    bottomleft : 'nesw-resize',
+  })
+}
+
+function start ({ iEvent, interaction }: { iEvent: Interact.InteractEvent<any, any>, interaction: Interaction }) {
+  if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {
+    return
+  }
+
+  const resizeEvent = iEvent as ResizeEvent
+  const rect = interaction.rect
+
+  interaction._rects = {
+    start: extend({}, rect),
+    corrected: extend({}, rect),
+    previous: extend({}, rect),
+    delta: {
+      left: 0,
+      right : 0,
+      width : 0,
+      top : 0,
+      bottom: 0,
+      height: 0,
+    },
+  }
+
+  resizeEvent.edges = interaction.prepared.edges
+  resizeEvent.rect = interaction._rects.corrected
+  resizeEvent.deltaRect = interaction._rects.delta
+}
+
+function move ({ iEvent, interaction }: { iEvent: Interact.InteractEvent<any, any>, interaction: Interaction }) {
+  if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { return }
+
+  const resizeEvent = iEvent as ResizeEvent
+  const resizeOptions = interaction.interactable.options.resize
+  const invert = resizeOptions.invert
+  const invertible = invert === 'reposition' || invert === 'negate'
+
+  // eslint-disable-next-line no-shadow
+  const current = interaction.rect
+  const { start: startRect, corrected, delta: deltaRect, previous } = interaction._rects
+
+  extend(previous, corrected)
+
+  if (invertible) {
+    // if invertible, copy the current rect
+    extend(corrected, current)
+
+    if (invert === 'reposition') {
+      // swap edge values if necessary to keep width/height positive
+      if (corrected.top > corrected.bottom) {
+        const swap = corrected.top
+
+        corrected.top = corrected.bottom
+        corrected.bottom = swap
+      }
+      if (corrected.left > corrected.right) {
+        const swap = corrected.left
+
+        corrected.left = corrected.right
+        corrected.right = swap
+      }
+    }
+  }
+  else {
+    // if not invertible, restrict to minimum of 0x0 rect
+    corrected.top    = Math.min(current.top, startRect.bottom)
+    corrected.bottom = Math.max(current.bottom, startRect.top)
+    corrected.left   = Math.min(current.left, startRect.right)
+    corrected.right  = Math.max(current.right, startRect.left)
+  }
+
+  corrected.width  = corrected.right  - corrected.left
+  corrected.height = corrected.bottom - corrected.top
+
+  for (const edge in corrected) {
+    deltaRect[edge] = corrected[edge] - previous[edge]
+  }
+
+  resizeEvent.edges = interaction.prepared.edges
+  resizeEvent.rect = corrected
+  resizeEvent.deltaRect = deltaRect
+}
+
+function end ({ iEvent, interaction }: { iEvent: Interact.InteractEvent<any, any>, interaction: Interaction }) {
+  if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { return }
+
+  const resizeEvent = iEvent as ResizeEvent
+
+  resizeEvent.edges = interaction.prepared.edges
+  resizeEvent.rect = interaction._rects.corrected
+  resizeEvent.deltaRect = interaction._rects.delta
+}
+
+function updateEventAxes ({ iEvent, interaction }: { iEvent: Interact.InteractEvent<any, any>, interaction: Interaction }) {
+  if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) { return }
+
+  const options = interaction.interactable.options
+  const resizeEvent = iEvent as ResizeEvent
+
+  if (options.resize.square) {
+    if (interaction.resizeAxes === 'y') {
+      resizeEvent.delta.x = resizeEvent.delta.y
+    }
+    else {
+      resizeEvent.delta.y = resizeEvent.delta.x
+    }
+    resizeEvent.axes = 'xy'
+  }
+  else {
+    resizeEvent.axes = interaction.resizeAxes
+
+    if (interaction.resizeAxes === 'x') {
+      resizeEvent.delta.y = 0
+    }
+    else if (interaction.resizeAxes === 'y') {
+      resizeEvent.delta.x = 0
+    }
+  }
+}
+
+const resize: Interact.Plugin = {
+  id: 'actions/resize',
+  before: ['actions/drag'],
+  install,
+  listeners: {
+    'interactions:new': ({ interaction }) => {
+      interaction.resizeAxes = 'xy'
+    },
+
+    'interactions:action-start': arg => {
+      start(arg)
+      updateEventAxes(arg)
+    },
+    'interactions:action-move': arg => {
+      move(arg)
+      updateEventAxes(arg)
+    },
+    'interactions:action-end': end,
+    'auto-start:check': resizeChecker,
+  },
+
+  defaults: {
+    square: false,
+    preserveAspectRatio: false,
+    axis: 'xy',
+
+    // use default margin
+    margin: NaN,
+
+    // object with props left, right, top, bottom which are
+    // true/false values to resize when the pointer is over that edge,
+    // CSS selectors to match the handles for each direction
+    // or the Elements for each handle
+    edges: null,
+
+    // a value of 'none' will limit the resize rect to a minimum of 0x0
+    // 'negate' will alow the rect to have negative width/height
+    // 'reposition' will keep the width/height positive by swapping
+    // the top and bottom edges and/or swapping the left and right edges
+    invert: 'none',
+  } as Interact.ResizableOptions,
+
+  cursors: null as ReturnType<typeof initCursors>,
+
+  getCursor ({ edges, axis, name }: Interact.ActionProps) {
+    const cursors = resize.cursors
+    let result: string = null
+
+    if (axis) {
+      result = cursors[name + axis]
+    }
+    else if (edges) {
+      let cursorKey = ''
+
+      for (const edge of ['top', 'bottom', 'left', 'right']) {
+        if (edges[edge]) {
+          cursorKey += edge
+        }
+      }
+
+      result = cursors[cursorKey]
+    }
+
+    return result
+  },
+
+  defaultMargin: null as number,
+}
+
+export default resize
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_auto-start_InteractableMethods.ts.html b/interactjs/dist/api/@interactjs_auto-start_InteractableMethods.ts.html new file mode 100644 index 000000000..2e8245c43 --- /dev/null +++ b/interactjs/dist/api/@interactjs_auto-start_InteractableMethods.ts.html @@ -0,0 +1,277 @@ + + + + + + @interactjs/auto-start/InteractableMethods.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/auto-start/InteractableMethods.ts

+ + + + + + + +
+
+
import { warnOnce } from '@interactjs/utils/index'
+import * as is from '@interactjs/utils/is'
+
+declare module '@interactjs/core/Interactable' {
+  interface Interactable {
+    getAction: (
+      this: Interact.Interactable,
+      pointer: Interact.PointerType,
+      event: Interact.PointerEventType,
+      interaction: Interact.Interaction,
+      element: Interact.Element,
+    ) => Interact.ActionProps | null
+    styleCursor: typeof styleCursor
+    actionChecker: typeof actionChecker
+    ignoreFrom: {
+      (...args: any[]): Interactable
+      (): boolean
+    }
+    allowFrom: {
+      (...args: any[]): Interactable
+      (): boolean
+    }
+  }
+}
+
+declare module '@interactjs/core/Interaction' {
+  interface Interaction {
+    pointerIsDown: boolean
+  }
+}
+
+function install (scope: Interact.Scope) {
+  const {
+    /** @lends Interactable */
+    Interactable, // tslint:disable-line no-shadowed-variable
+  } = scope
+
+  Interactable.prototype.getAction = function getAction (
+    this: Interact.Interactable,
+    pointer: Interact.PointerType,
+    event: Interact.PointerEventType,
+    interaction: Interact.Interaction,
+    element: Interact.Element,
+  ): Interact.ActionProps {
+    const action = defaultActionChecker(this, event, interaction, element, scope)
+
+    if (this.options.actionChecker) {
+      return this.options.actionChecker(pointer, event, action, this, element, interaction)
+    }
+
+    return action
+  }
+
+  /**
+   * ```js
+   * interact(element, { ignoreFrom: document.getElementById('no-action') })
+   * // or
+   * interact(element).ignoreFrom('input, textarea, a')
+   * ```
+   * @deprecated
+   * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any
+   * of it's parents match the given CSS selector or Element, no
+   * drag/resize/gesture is started.
+   *
+   * Don't use this method. Instead set the `ignoreFrom` option for each action
+   * or for `pointerEvents`
+   *
+   * @example
+   * interact(targett)
+   *   .draggable({
+   *     ignoreFrom: 'input, textarea, a[href]'',
+   *   })
+   *   .pointerEvents({
+   *     ignoreFrom: '[no-pointer]',
+   *   })
+   *
+   * @param {string | Element | null} [newValue] a CSS selector string, an
+   * Element or `null` to not ignore any elements
+   * @return {string | Element | object} The current ignoreFrom value or this
+   * Interactable
+   */
+  Interactable.prototype.ignoreFrom = warnOnce(function (this: Interact.Interactable, newValue) {
+    return this._backCompatOption('ignoreFrom', newValue)
+  }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).')
+
+  /**
+   * @deprecated
+   *
+   * A drag/resize/gesture is started only If the target of the `mousedown`,
+   * `pointerdown` or `touchstart` event or any of it's parents match the given
+   * CSS selector or Element.
+   *
+   * Don't use this method. Instead set the `allowFrom` option for each action
+   * or for `pointerEvents`
+   *
+   * @example
+   * interact(targett)
+   *   .resizable({
+   *     allowFrom: '.resize-handle',
+   *   .pointerEvents({
+   *     allowFrom: '.handle',,
+   *   })
+   *
+   * @param {string | Element | null} [newValue] a CSS selector string, an
+   * Element or `null` to allow from any element
+   * @return {string | Element | object} The current allowFrom value or this
+   * Interactable
+   */
+  Interactable.prototype.allowFrom = warnOnce(function (this: Interact.Interactable, newValue) {
+    return this._backCompatOption('allowFrom', newValue)
+  }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).')
+
+  /**
+   * ```js
+   * interact('.resize-drag')
+   *   .resizable(true)
+   *   .draggable(true)
+   *   .actionChecker(function (pointer, event, action, interactable, element, interaction) {
+   *
+   *   if (interact.matchesSelector(event.target, '.drag-handle')) {
+   *     // force drag with handle target
+   *     action.name = drag
+   *   }
+   *   else {
+   *     // resize from the top and right edges
+   *     action.name  = 'resize'
+   *     action.edges = { top: true, right: true }
+   *   }
+   *
+   *   return action
+   * })
+   * ```
+   *
+   * Returns or sets the function used to check action to be performed on
+   * pointerDown
+   *
+   * @param {function | null} [checker] A function which takes a pointer event,
+   * defaultAction string, interactable, element and interaction as parameters
+   * and returns an object with name property 'drag' 'resize' or 'gesture' and
+   * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right
+   * props.
+   * @return {Function | Interactable} The checker function or this Interactable
+   */
+  Interactable.prototype.actionChecker = actionChecker
+
+  /**
+   * Returns or sets whether the the cursor should be changed depending on the
+   * action that would be performed if the mouse were pressed and dragged.
+   *
+   * @param {boolean} [newValue]
+   * @return {boolean | Interactable} The current setting or this Interactable
+   */
+  Interactable.prototype.styleCursor = styleCursor
+}
+
+function defaultActionChecker (
+  interactable: Interact.Interactable,
+  event: Interact.PointerEventType,
+  interaction: Interact.Interaction,
+  element: Interact.Element,
+  scope: Interact.Scope,
+) {
+  const rect = interactable.getRect(element)
+  const buttons = (event as MouseEvent).buttons || ({
+    0: 1,
+    1: 4,
+    3: 8,
+    4: 16,
+  })[(event as MouseEvent).button as 0 | 1 | 3 | 4]
+  const arg = {
+    action: null,
+    interactable,
+    interaction,
+    element,
+    rect,
+    buttons,
+  }
+
+  scope.fire('auto-start:check', arg)
+
+  return arg.action
+}
+
+function styleCursor (this: Interact.Interactable): boolean
+function styleCursor (this: Interact.Interactable, newValue: boolean): typeof this
+function styleCursor (this: Interact.Interactable, newValue?: boolean) {
+  if (is.bool(newValue)) {
+    this.options.styleCursor = newValue
+
+    return this
+  }
+
+  if (newValue === null) {
+    delete this.options.styleCursor
+
+    return this
+  }
+
+  return this.options.styleCursor
+}
+
+function actionChecker (this: Interact.Interactable, checker: any) {
+  if (is.func(checker)) {
+    this.options.actionChecker = checker
+
+    return this
+  }
+
+  if (checker === null) {
+    delete this.options.actionChecker
+
+    return this
+  }
+
+  return this.options.actionChecker
+}
+
+export default {
+  id: 'auto-start/interactableMethods',
+  install,
+}
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_auto-start_base.ts.html b/interactjs/dist/api/@interactjs_auto-start_base.ts.html new file mode 100644 index 000000000..51b4f57d3 --- /dev/null +++ b/interactjs/dist/api/@interactjs_auto-start_base.ts.html @@ -0,0 +1,439 @@ + + + + + + @interactjs/auto-start/base.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/auto-start/base.ts

+ + + + + + + +
+
+
import * as utils from '@interactjs/utils/index'
+import InteractableMethods from './InteractableMethods'
+
+declare module '@interactjs/interact/index' {
+  interface InteractStatic {
+    maxInteractions: (newValue: any) => any
+  }
+}
+
+declare module '@interactjs/core/scope' {
+  interface Scope {
+    autoStart: AutoStart
+    maxInteractions: (...args: any[]) => any
+  }
+
+  interface SignalArgs {
+    'autoStart:before-start': Interact.SignalArgs['interactions:move']
+    'autoStart:prepared': { interaction: Interact.Interaction }
+    'auto-start:check': CheckSignalArg
+  }
+}
+
+declare module '@interactjs/core/defaultOptions' {
+  interface BaseDefaults {
+    actionChecker?: any
+    cursorChecker?: any
+    styleCursor?: any
+  }
+
+  interface PerActionDefaults {
+    manualStart?: boolean
+    max?: number
+    maxPerElement?: number
+    allowFrom?: string | Interact.Element
+    ignoreFrom?: string | Interact.Element
+    cursorChecker?: Interact.CursorChecker
+
+    // only allow left button by default
+    // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value
+    mouseButtons?: 0 | 1 | 2 | 4 | 16
+  }
+}
+
+interface CheckSignalArg {
+  interactable: Interact.Interactable
+  interaction: Interact.Interaction
+  element: Interact.Element
+  action: Interact.ActionProps
+  buttons: number
+}
+
+export interface AutoStart {
+  // Allow this many interactions to happen simultaneously
+  maxInteractions: number
+  withinInteractionLimit: typeof withinInteractionLimit
+  cursorElement: Interact.Element
+}
+
+function install (scope: Interact.Scope) {
+  const {
+    interact,
+    defaults,
+  } = scope
+
+  scope.usePlugin(InteractableMethods)
+
+  defaults.base.actionChecker = null
+  defaults.base.styleCursor = true
+
+  utils.extend(defaults.perAction, {
+    manualStart: false,
+    max: Infinity,
+    maxPerElement: 1,
+    allowFrom:  null,
+    ignoreFrom: null,
+
+    // only allow left button by default
+    // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value
+    mouseButtons: 1,
+  })
+
+  /**
+   * Returns or sets the maximum number of concurrent interactions allowed.  By
+   * default only 1 interaction is allowed at a time (for backwards
+   * compatibility). To allow multiple interactions on the same Interactables and
+   * elements, you need to enable it in the draggable, resizable and gesturable
+   * `'max'` and `'maxPerElement'` options.
+   *
+   * @alias module:interact.maxInteractions
+   *
+   * @param {number} [newValue] Any number. newValue <= 0 means no interactions.
+   */
+  interact.maxInteractions = newValue => maxInteractions(newValue, scope)
+
+  scope.autoStart = {
+    // Allow this many interactions to happen simultaneously
+    maxInteractions: Infinity,
+    withinInteractionLimit,
+    cursorElement: null,
+  }
+}
+
+function prepareOnDown ({ interaction, pointer, event, eventTarget }: Interact.SignalArgs['interactions:down'], scope: Interact.Scope) {
+  if (interaction.interacting()) { return }
+
+  const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope)
+  prepare(interaction, actionInfo, scope)
+}
+
+function prepareOnMove ({ interaction, pointer, event, eventTarget }: Interact.SignalArgs['interactions:move'], scope: Interact.Scope) {
+  if (interaction.pointerType !== 'mouse' ||
+      interaction.pointerIsDown ||
+      interaction.interacting()) { return }
+
+  const actionInfo = getActionInfo(interaction, pointer, event, eventTarget as Interact.Element, scope)
+  prepare(interaction, actionInfo, scope)
+}
+
+function startOnMove (arg: Interact.SignalArgs['interactions:move'], scope: Interact.Scope) {
+  const { interaction } = arg
+
+  if (!interaction.pointerIsDown ||
+      interaction.interacting() ||
+      !interaction.pointerWasMoved ||
+      !interaction.prepared.name) {
+    return
+  }
+
+  scope.fire('autoStart:before-start', arg)
+
+  const { interactable } = interaction
+  const actionName = interaction.prepared.name
+
+  if (actionName && interactable) {
+    // check manualStart and interaction limit
+    if (interactable.options[actionName].manualStart ||
+        !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) {
+      interaction.stop()
+    }
+    else {
+      interaction.start(interaction.prepared, interactable, interaction.element)
+      setInteractionCursor(interaction, scope)
+    }
+  }
+}
+
+function clearCursorOnStop ({ interaction }: { interaction: Interact.Interaction }, scope: Interact.Scope) {
+  const { interactable } = interaction
+
+  if (interactable && interactable.options.styleCursor) {
+    setCursor(interaction.element, '', scope)
+  }
+}
+
+// Check if the current interactable supports the action.
+// If so, return the validated action. Otherwise, return null
+function validateAction<T extends Interact.ActionName> (
+  action: Interact.ActionProps<T>,
+  interactable: Interact.Interactable,
+  element: Interact.Element,
+  eventTarget: Interact.EventTarget,
+  scope: Interact.Scope,
+) {
+  if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) &&
+      interactable.options[action.name].enabled &&
+      withinInteractionLimit(interactable, element, action, scope)) {
+    return action
+  }
+
+  return null
+}
+
+function validateMatches (
+  interaction: Interact.Interaction,
+  pointer: Interact.PointerType,
+  event: Interact.PointerEventType,
+  matches: Interact.Interactable[],
+  matchElements: Interact.Element[],
+  eventTarget: Interact.EventTarget,
+  scope: Interact.Scope,
+) {
+  for (let i = 0, len = matches.length; i < len; i++) {
+    const match = matches[i]
+    const matchElement = matchElements[i]
+    const matchAction = match.getAction(pointer, event, interaction, matchElement)
+
+    if (!matchAction) { continue }
+
+    const action = validateAction(
+      matchAction,
+      match,
+      matchElement,
+      eventTarget,
+      scope)
+
+    if (action) {
+      return {
+        action,
+        interactable: match,
+        element: matchElement,
+      }
+    }
+  }
+
+  return { action: null, interactable: null, element: null }
+}
+
+function getActionInfo (
+  interaction: Interact.Interaction,
+  pointer: Interact.PointerType,
+  event: Interact.PointerEventType,
+  eventTarget: Interact.EventTarget,
+  scope: Interact.Scope,
+) {
+  let matches: Interact.Interactable[] = []
+  let matchElements: Interact.Element[] = []
+
+  let element = eventTarget as Interact.Element
+
+  function pushMatches (interactable: Interact.Interactable) {
+    matches.push(interactable)
+    matchElements.push(element)
+  }
+
+  while (utils.is.element(element)) {
+    matches = []
+    matchElements = []
+
+    scope.interactables.forEachMatch(element, pushMatches)
+
+    const actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope)
+
+    if (actionInfo.action &&
+      !actionInfo.interactable.options[actionInfo.action.name].manualStart) {
+      return actionInfo
+    }
+
+    element = utils.dom.parentNode(element) as Interact.Element
+  }
+
+  return { action: null, interactable: null, element: null }
+}
+
+function prepare (
+  interaction: Interact.Interaction,
+  { action, interactable, element }: {
+    action: Interact.ActionProps
+    interactable: Interact.Interactable
+    element: Interact.Element
+  },
+  scope: Interact.Scope,
+) {
+  action = action || { name: null }
+
+  interaction.interactable = interactable
+  interaction.element = element
+  utils.copyAction(interaction.prepared, action)
+
+  interaction.rect = interactable && action.name
+    ? interactable.getRect(element)
+    : null
+
+  setInteractionCursor(interaction, scope)
+
+  scope.fire('autoStart:prepared', { interaction })
+}
+
+function withinInteractionLimit<T extends Interact.ActionName> (
+  interactable: Interact.Interactable,
+  element: Interact.Element,
+  action: Interact.ActionProps<T>,
+  scope: Interact.Scope,
+) {
+  const options = interactable.options
+  const maxActions = options[action.name].max
+  const maxPerElement = options[action.name].maxPerElement
+  const autoStartMax = scope.autoStart.maxInteractions
+  let activeInteractions = 0
+  let interactableCount = 0
+  let elementCount = 0
+
+  // no actions if any of these values == 0
+  if (!(maxActions && maxPerElement && autoStartMax)) { return false }
+
+  for (const interaction of scope.interactions.list) {
+    const otherAction = interaction.prepared.name
+
+    if (!interaction.interacting()) { continue }
+
+    activeInteractions++
+
+    if (activeInteractions >= autoStartMax) {
+      return false
+    }
+
+    if (interaction.interactable !== interactable) { continue }
+
+    interactableCount += otherAction === action.name ? 1 : 0
+
+    if (interactableCount >= maxActions) {
+      return false
+    }
+
+    if (interaction.element === element) {
+      elementCount++
+
+      if (otherAction === action.name && elementCount >= maxPerElement) {
+        return false
+      }
+    }
+  }
+
+  return autoStartMax > 0
+}
+
+function maxInteractions (newValue: any, scope: Interact.Scope) {
+  if (utils.is.number(newValue)) {
+    scope.autoStart.maxInteractions = newValue
+
+    return this
+  }
+
+  return scope.autoStart.maxInteractions
+}
+
+function setCursor (element: Interact.Element, cursor: string, scope: Interact.Scope) {
+  const { cursorElement: prevCursorElement } = scope.autoStart
+
+  if (prevCursorElement && prevCursorElement !== element) {
+    prevCursorElement.style.cursor = ''
+  }
+
+  element.ownerDocument.documentElement.style.cursor = cursor
+  element.style.cursor = cursor
+  scope.autoStart.cursorElement = cursor ? element : null
+}
+
+function setInteractionCursor<T extends Interact.ActionName> (interaction: Interact.Interaction<T>, scope: Interact.Scope) {
+  const { interactable, element, prepared } = interaction
+
+  if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) {
+    // clear previous target element cursor
+    if (scope.autoStart.cursorElement) {
+      setCursor(scope.autoStart.cursorElement, '', scope)
+    }
+
+    return
+  }
+
+  let cursor = ''
+
+  if (prepared.name) {
+    const cursorChecker: Interact.CursorChecker = interactable.options[prepared.name].cursorChecker
+
+    if (utils.is.func(cursorChecker)) {
+      cursor = cursorChecker(prepared, interactable, element, interaction._interacting)
+    }
+    else {
+      cursor = scope.actions.map[prepared.name].getCursor(prepared)
+    }
+  }
+
+  setCursor(interaction.element, cursor || '', scope)
+}
+
+const autoStart: Interact.Plugin = {
+  id: 'auto-start/base',
+  before: ['actions', 'actions/drag', 'actions/resize', 'actions/gesture'],
+  install,
+  listeners: {
+    'interactions:down': prepareOnDown,
+    'interactions:move': (arg, scope) => {
+      prepareOnMove(arg, scope)
+      startOnMove(arg, scope)
+    },
+    'interactions:stop': clearCursorOnStop,
+  },
+  maxInteractions,
+  withinInteractionLimit,
+  validateAction,
+} as Interact.Plugin
+
+export default autoStart
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_core_BaseEvent.ts.html b/interactjs/dist/api/@interactjs_core_BaseEvent.ts.html new file mode 100644 index 000000000..6212482ff --- /dev/null +++ b/interactjs/dist/api/@interactjs_core_BaseEvent.ts.html @@ -0,0 +1,92 @@ + + + + + + @interactjs/core/BaseEvent.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/core/BaseEvent.ts

+ + + + + + + +
+
+
export class BaseEvent<T extends Interact.ActionName = any> {
+  type: string
+  target: EventTarget
+  currentTarget: EventTarget
+  interactable: Interact.Interactable
+  _interaction: Interact.Interaction<T>
+  timeStamp: any
+  immediatePropagationStopped = false
+  propagationStopped = false
+
+  get interaction (): Interact.InteractionProxy<T> {
+    return this._interaction._proxy
+  }
+
+  constructor (interaction: Interact.Interaction) {
+    this._interaction = interaction
+  }
+
+  preventDefault () {}
+
+  /**
+   * Don't call any other listeners (even on the current target)
+   */
+  stopPropagation () {
+    this.propagationStopped = true
+  }
+
+  /**
+   * Don't call listeners on the remaining targets
+   */
+  stopImmediatePropagation () {
+    this.immediatePropagationStopped = this.propagationStopped = true
+  }
+}
+
+export default BaseEvent
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_core_InteractEvent.ts.html b/interactjs/dist/api/@interactjs_core_InteractEvent.ts.html new file mode 100644 index 000000000..064c98340 --- /dev/null +++ b/interactjs/dist/api/@interactjs_core_InteractEvent.ts.html @@ -0,0 +1,261 @@ + + + + + + @interactjs/core/InteractEvent.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/core/InteractEvent.ts

+ + + + + + + +
+
+
import extend from '@interactjs/utils/extend'
+import getOriginXY from '@interactjs/utils/getOriginXY'
+import hypot from '@interactjs/utils/hypot'
+import BaseEvent from './BaseEvent'
+import defaults from './defaultOptions'
+import Interaction from './Interaction'
+
+export type EventPhase = keyof PhaseMap
+
+export interface PhaseMap {
+  start: true
+  move: true
+  end: true
+}
+
+export class InteractEvent<
+  T extends Interact.ActionName = never,
+  P extends EventPhase = EventPhase,
+> extends BaseEvent<T> {
+  target: Interact.Element
+  currentTarget: Interact.Element
+  relatedTarget: null = null
+  screenX?: number
+  screenY?: number
+  button: number
+  buttons: number
+  ctrlKey: boolean
+  shiftKey: boolean
+  altKey: boolean
+  metaKey: boolean
+  page: Interact.Point
+  client: Interact.Point
+  delta: Interact.Point
+  rect: Interact.FullRect
+  x0: number
+  y0: number
+  t0: number
+  dt: number
+  duration: number
+  clientX0: number
+  clientY0: number
+  velocity: Interact.Point
+  speed: number
+  swipe: ReturnType<InteractEvent<T>['getSwipe']>
+  timeStamp: any
+  // drag
+  dragEnter?: Interact.Element
+  dragLeave?: Interact.Element
+  // resize
+  axes?: 'x' | 'y' | 'xy'
+  preEnd?: boolean
+
+  /** */
+  constructor (
+    interaction: Interaction,
+    event: Interact.PointerEventType,
+    actionName: T,
+    phase: P,
+    element: Interact.Element,
+    preEnd?: boolean,
+    type?: string,
+  ) {
+    super(interaction)
+
+    element = element || interaction.element
+
+    const target      = interaction.interactable
+    const deltaSource = (((target && target.options) || defaults) as any).deltaSource as 'page' | 'client'
+    const origin      = getOriginXY(target, element, actionName)
+    const starting    = phase === 'start'
+    const ending      = phase === 'end'
+    const prevEvent   = starting ? this : interaction.prevEvent
+    const coords      = starting
+      ? interaction.coords.start
+      : ending
+        ? { page: prevEvent.page, client: prevEvent.client, timeStamp: interaction.coords.cur.timeStamp }
+        : interaction.coords.cur
+
+    this.page      = extend({}, coords.page)
+    this.client    = extend({}, coords.client)
+    this.rect      = extend({}, interaction.rect)
+    this.timeStamp = coords.timeStamp
+
+    if (!ending) {
+      this.page.x -= origin.x
+      this.page.y -= origin.y
+
+      this.client.x -= origin.x
+      this.client.y -= origin.y
+    }
+
+    this.ctrlKey       = event.ctrlKey
+    this.altKey        = event.altKey
+    this.shiftKey      = event.shiftKey
+    this.metaKey       = event.metaKey
+    this.button        = (event as MouseEvent).button
+    this.buttons       = (event as MouseEvent).buttons
+    this.target        = element
+    this.currentTarget = element
+    this.preEnd        = preEnd
+    this.type          = type || (actionName + (phase || ''))
+    this.interactable  = target
+
+    this.t0 = starting
+      ? interaction.pointers[interaction.pointers.length - 1].downTime
+      : prevEvent.t0
+
+    this.x0       = interaction.coords.start.page.x - origin.x
+    this.y0       = interaction.coords.start.page.y - origin.y
+    this.clientX0 = interaction.coords.start.client.x - origin.x
+    this.clientY0 = interaction.coords.start.client.y - origin.y
+
+    if (starting || ending) {
+      this.delta = { x: 0, y: 0 }
+    }
+    else {
+      this.delta = {
+        x: this[deltaSource].x - prevEvent[deltaSource].x,
+        y: this[deltaSource].y - prevEvent[deltaSource].y,
+      }
+    }
+
+    this.dt        = interaction.coords.delta.timeStamp
+    this.duration  = this.timeStamp - this.t0
+
+    // velocity and speed in pixels per second
+    this.velocity = extend({}, interaction.coords.velocity[deltaSource])
+    this.speed = hypot(this.velocity.x, this.velocity.y)
+
+    this.swipe = (ending || phase === 'inertiastart') ? this.getSwipe() : null
+  }
+
+  get pageX () { return this.page.x }
+  set pageX (value) { this.page.x = value }
+  get pageY () { return this.page.y }
+  set pageY (value) { this.page.y = value }
+
+  get clientX () { return this.client.x }
+  set clientX (value) { this.client.x = value }
+  get clientY () { return this.client.y }
+  set clientY (value) { this.client.y = value }
+
+  get dx () { return this.delta.x }
+  set dx (value) { this.delta.x = value }
+  get dy () { return this.delta.y }
+  set dy (value) { this.delta.y = value }
+
+  get velocityX () { return this.velocity.x }
+  set velocityX (value) { this.velocity.x = value }
+  get velocityY () { return this.velocity.y }
+  set velocityY (value) { this.velocity.y = value }
+
+  getSwipe () {
+    const interaction = this._interaction
+
+    if (interaction.prevEvent.speed < 600 ||
+        this.timeStamp - interaction.prevEvent.timeStamp > 150) {
+      return null
+    }
+
+    let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI
+    const overlap = 22.5
+
+    if (angle < 0) {
+      angle += 360
+    }
+
+    const left = 135 - overlap <= angle && angle < 225 + overlap
+    const up   = 225 - overlap <= angle && angle < 315 + overlap
+
+    const right = !left && (315 - overlap <= angle || angle <  45 + overlap)
+    const down  = !up   &&   45 - overlap <= angle && angle < 135 + overlap
+
+    return {
+      up,
+      down,
+      left,
+      right,
+      angle,
+      speed: interaction.prevEvent.speed,
+      velocity: {
+        x: interaction.prevEvent.velocityX,
+        y: interaction.prevEvent.velocityY,
+      },
+    }
+  }
+
+  preventDefault () {}
+
+  /**
+   * Don't call listeners on the remaining targets
+   */
+  stopImmediatePropagation () {
+    this.immediatePropagationStopped = this.propagationStopped = true
+  }
+
+  /**
+   * Don't call any other listeners (even on the current target)
+   */
+  stopPropagation () {
+    this.propagationStopped = true
+  }
+}
+
+export default InteractEvent
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_core_Interactable.ts.html b/interactjs/dist/api/@interactjs_core_Interactable.ts.html new file mode 100644 index 000000000..22b45a19f --- /dev/null +++ b/interactjs/dist/api/@interactjs_core_Interactable.ts.html @@ -0,0 +1,451 @@ + + + + + + @interactjs/core/Interactable.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/core/Interactable.ts

+ + + + + + + +
+
+
import * as arr from '@interactjs/utils/arr'
+import browser from '@interactjs/utils/browser'
+import clone from '@interactjs/utils/clone'
+import { getElementRect, matchesUpTo, nodeContains, trySelector } from '@interactjs/utils/domUtils'
+import events from '@interactjs/utils/events'
+import extend from '@interactjs/utils/extend'
+import * as is from '@interactjs/utils/is'
+import normalizeListeners from '@interactjs/utils/normalizeListeners'
+import { getWindow } from '@interactjs/utils/window'
+import { ActionDefaults, Defaults, Options } from './defaultOptions'
+import Eventable from './Eventable'
+import { Actions, isNonNativeEvent } from './scope'
+
+type IgnoreValue = string | Interact.Element | boolean
+
+/** */
+export class Interactable implements Partial<Eventable> {
+  protected get _defaults (): Defaults {
+    return {
+      base: {},
+      perAction: {},
+      actions: {} as ActionDefaults,
+    }
+  }
+
+  readonly options!: Required<Options>
+  readonly _actions: Actions
+  readonly target: Interact.Target
+  readonly events = new Eventable()
+  readonly _context: Document | Interact.Element
+  readonly _win: Window
+  readonly _doc: Document
+
+  /** */
+  constructor (target: Interact.Target, options: any, defaultContext: Document | Interact.Element) {
+    this._actions = options.actions
+    this.target   = target
+    this._context = options.context || defaultContext
+    this._win     = getWindow(trySelector(target) ? this._context : target)
+    this._doc     = this._win.document
+
+    this.set(options)
+  }
+
+  setOnEvents (actionName: Interact.ActionName, phases: NonNullable<any>) {
+    if (is.func(phases.onstart)) { this.on(`${actionName}start`, phases.onstart) }
+    if (is.func(phases.onmove)) { this.on(`${actionName}move`, phases.onmove) }
+    if (is.func(phases.onend)) { this.on(`${actionName}end`, phases.onend) }
+    if (is.func(phases.oninertiastart)) { this.on(`${actionName}inertiastart`, phases.oninertiastart) }
+
+    return this
+  }
+
+  updatePerActionListeners (actionName: Interact.ActionName, prev: Interact.Listeners, cur: Interact.Listeners) {
+    if (is.array(prev) || is.object(prev)) {
+      this.off(actionName, prev)
+    }
+
+    if (is.array(cur) || is.object(cur)) {
+      this.on(actionName, cur)
+    }
+  }
+
+  setPerAction (actionName: Interact.ActionName, options: Interact.OrBoolean<Options>) {
+    const defaults = this._defaults
+
+    // for all the default per-action options
+    for (const optionName_ in options) {
+      const optionName = optionName_ as keyof Interact.PerActionDefaults
+      const actionOptions = this.options[actionName]
+      const optionValue: any = options[optionName]
+
+      // remove old event listeners and add new ones
+      if (optionName === 'listeners') {
+        this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue as Interact.Listeners)
+      }
+
+      // if the option value is an array
+      if (is.array<any>(optionValue)) {
+        (actionOptions[optionName] as any) = arr.from(optionValue)
+      }
+      // if the option value is an object
+      else if (is.plainObject(optionValue)) {
+        // copy the object
+        (actionOptions[optionName] as any) = extend(
+          actionOptions[optionName] || {} as any,
+          clone(optionValue))
+
+        // set anabled field to true if it exists in the defaults
+        if (is.object(defaults.perAction[optionName]) && 'enabled' in (defaults.perAction[optionName] as any)) {
+          (actionOptions[optionName] as any).enabled = optionValue.enabled !== false
+        }
+      }
+      // if the option value is a boolean and the default is an object
+      else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) {
+        (actionOptions[optionName] as any).enabled = optionValue
+      }
+      // if it's anything else, do a plain assignment
+      else {
+        (actionOptions[optionName] as any) = optionValue
+      }
+    }
+  }
+
+  /**
+   * The default function to get an Interactables bounding rect. Can be
+   * overridden using {@link Interactable.rectChecker}.
+   *
+   * @param {Element} [element] The element to measure.
+   * @return {object} The object's bounding rectangle.
+   */
+  getRect (element: Interact.Element) {
+    element = element || (is.element(this.target)
+      ? this.target
+      : null)
+
+    if (is.string(this.target)) {
+      element = element || this._context.querySelector(this.target)
+    }
+
+    return getElementRect(element)
+  }
+
+  /**
+   * Returns or sets the function used to calculate the interactable's
+   * element's rectangle
+   *
+   * @param {function} [checker] A function which returns this Interactable's
+   * bounding rectangle. See {@link Interactable.getRect}
+   * @return {function | object} The checker function or this Interactable
+   */
+  rectChecker (checker: (element: Interact.Element) => any) {
+    if (is.func(checker)) {
+      this.getRect = checker
+
+      return this
+    }
+
+    if (checker === null) {
+      delete this.getRect
+
+      return this
+    }
+
+    return this.getRect
+  }
+
+  _backCompatOption (optionName: keyof Interact.Options, newValue: any) {
+    if (trySelector(newValue) || is.object(newValue)) {
+      (this.options[optionName] as any) = newValue
+
+      for (const action in this._actions.map) {
+        (this.options[action][optionName] as any) = newValue
+      }
+
+      return this
+    }
+
+    return this.options[optionName]
+  }
+
+  /**
+   * Gets or sets the origin of the Interactable's element.  The x and y
+   * of the origin will be subtracted from action event coordinates.
+   *
+   * @param {Element | object | string} [origin] An HTML or SVG Element whose
+   * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'
+   * or any CSS selector
+   *
+   * @return {object} The current origin or this Interactable
+   */
+  origin (newValue: any) {
+    return this._backCompatOption('origin', newValue)
+  }
+
+  /**
+   * Returns or sets the mouse coordinate types used to calculate the
+   * movement of the pointer.
+   *
+   * @param {string} [newValue] Use 'client' if you will be scrolling while
+   * interacting; Use 'page' if you want autoScroll to work
+   * @return {string | object} The current deltaSource or this Interactable
+   */
+  deltaSource (newValue?: string) {
+    if (newValue === 'page' || newValue === 'client') {
+      this.options.deltaSource = newValue
+
+      return this
+    }
+
+    return this.options.deltaSource
+  }
+
+  /**
+   * Gets the selector context Node of the Interactable. The default is
+   * `window.document`.
+   *
+   * @return {Node} The context Node of this Interactable
+   */
+  context () {
+    return this._context
+  }
+
+  inContext (element: Document | Node) {
+    return (this._context === element.ownerDocument ||
+            nodeContains(this._context, element))
+  }
+
+  testIgnoreAllow (
+    this: Interactable,
+    options: { ignoreFrom?: IgnoreValue, allowFrom?: IgnoreValue },
+    targetNode: Node,
+    eventTarget: Interact.EventTarget,
+  ) {
+    return (!this.testIgnore(options.ignoreFrom, targetNode, eventTarget) &&
+            this.testAllow(options.allowFrom, targetNode, eventTarget))
+  }
+
+  testAllow (
+    this: Interactable,
+    allowFrom: IgnoreValue,
+    targetNode: Node,
+    element: Interact.EventTarget,
+  ) {
+    if (!allowFrom) { return true }
+
+    if (!is.element(element)) { return false }
+
+    if (is.string(allowFrom)) {
+      return matchesUpTo(element, allowFrom, targetNode)
+    }
+    else if (is.element(allowFrom)) {
+      return nodeContains(allowFrom, element)
+    }
+
+    return false
+  }
+
+  testIgnore (
+    this: Interactable,
+    ignoreFrom: IgnoreValue,
+    targetNode: Node,
+    element: Interact.EventTarget,
+  ) {
+    if (!ignoreFrom || !is.element(element)) { return false }
+
+    if (is.string(ignoreFrom)) {
+      return matchesUpTo(element, ignoreFrom, targetNode)
+    }
+    else if (is.element(ignoreFrom)) {
+      return nodeContains(ignoreFrom, element)
+    }
+
+    return false
+  }
+
+  /**
+   * Calls listeners for the given InteractEvent type bound globally
+   * and directly to this Interactable
+   *
+   * @param {InteractEvent} iEvent The InteractEvent object to be fired on this
+   * Interactable
+   * @return {Interactable} this Interactable
+   */
+  fire (iEvent: object) {
+    this.events.fire(iEvent)
+
+    return this
+  }
+
+  _onOff (method: 'on' | 'off', typeArg: Interact.EventTypes, listenerArg?: Interact.ListenersArg | null, options?: any) {
+    if (is.object(typeArg) && !is.array(typeArg)) {
+      options = listenerArg
+      listenerArg = null
+    }
+
+    const addRemove = method === 'on' ? 'add' : 'remove'
+    const listeners = normalizeListeners(typeArg, listenerArg)
+
+    for (let type in listeners) {
+      if (type === 'wheel') { type = browser.wheelEvent }
+
+      for (const listener of listeners[type]) {
+        // if it is an action event type
+        if (isNonNativeEvent(type, this._actions)) {
+          this.events[method](type, listener)
+        }
+        // delegated event
+        else if (is.string(this.target)) {
+          events[`${addRemove}Delegate` as 'addDelegate' | 'removeDelegate'](this.target, this._context, type, listener, options)
+        }
+        // remove listener from this Interactable's element
+        else {
+          (events[addRemove] as typeof events.remove)(this.target, type, listener, options)
+        }
+      }
+    }
+
+    return this
+  }
+
+  /**
+   * Binds a listener for an InteractEvent, pointerEvent or DOM event.
+   *
+   * @param {string | array | object} types The types of events to listen
+   * for
+   * @param {function | array | object} [listener] The event listener function(s)
+   * @param {object | boolean} [options] options object or useCapture flag for
+   * addEventListener
+   * @return {Interactable} This Interactable
+   */
+  on (types: Interact.EventTypes, listener?: Interact.ListenersArg, options?: any) {
+    return this._onOff('on', types, listener, options)
+  }
+
+  /**
+   * Removes an InteractEvent, pointerEvent or DOM event listener.
+   *
+   * @param {string | array | object} types The types of events that were
+   * listened for
+   * @param {function | array | object} [listener] The event listener function(s)
+   * @param {object | boolean} [options] options object or useCapture flag for
+   * removeEventListener
+   * @return {Interactable} This Interactable
+   */
+  off (types: string | string[] | Interact.EventTypes, listener?: Interact.ListenersArg, options?: any) {
+    return this._onOff('off', types, listener, options)
+  }
+
+  /**
+   * Reset the options of this Interactable
+   *
+   * @param {object} options The new settings to apply
+   * @return {object} This Interactable
+   */
+  set (options: Interact.OptionsArg) {
+    const defaults = this._defaults
+
+    if (!is.object(options)) {
+      options = {}
+    }
+
+    (this.options as Required<Options>) = clone(defaults.base) as Required<Options>
+
+    for (const actionName_ in this._actions.methodDict) {
+      const actionName = actionName_ as Interact.ActionName
+      const methodName = this._actions.methodDict[actionName]
+
+      this.options[actionName] = {}
+      this.setPerAction(actionName, extend(extend({}, defaults.perAction), defaults.actions[actionName]))
+
+      this[methodName](options[actionName])
+    }
+
+    for (const setting in options) {
+      if (is.func(this[setting])) {
+        this[setting](options[setting])
+      }
+    }
+
+    return this
+  }
+
+  /**
+   * Remove this interactable from the list of interactables and remove it's
+   * action capabilities and event listeners
+   *
+   * @return {interact}
+   */
+  unset () {
+    events.remove(this.target as Node, 'all')
+
+    if (is.string(this.target)) {
+      // remove delegated events
+      for (const type in events.delegatedEvents) {
+        const delegated = events.delegatedEvents[type]
+
+        if (delegated.selectors[0] === this.target &&
+            delegated.contexts[0] === this._context) {
+          delegated.selectors.splice(0, 1)
+          delegated.contexts.splice(0, 1)
+          delegated.listeners.splice(0, 1)
+        }
+
+        events.remove(this._context, type, events.delegateListener)
+        events.remove(this._context, type, events.delegateUseCapture, true)
+      }
+    }
+    else {
+      events.remove(this.target as Node, 'all')
+    }
+  }
+}
+
+export default Interactable
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_core_Interaction.ts.html b/interactjs/dist/api/@interactjs_core_Interaction.ts.html new file mode 100644 index 000000000..95ce78817 --- /dev/null +++ b/interactjs/dist/api/@interactjs_core_Interaction.ts.html @@ -0,0 +1,667 @@ + + + + + + @interactjs/core/Interaction.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/core/Interaction.ts

+ + + + + + + +
+
+
import * as utils from '@interactjs/utils/index'
+import Interactable from './Interactable'
+import InteractEvent, { EventPhase } from './InteractEvent'
+import PointerInfo from './PointerInfo'
+import { ActionName } from './scope'
+
+export interface ActionProps<T extends ActionName = Interact.ActionName> {
+  name: T
+  axis?: 'x' | 'y' | 'xy'
+  edges?: Interact.EdgeOptions
+}
+
+export interface StartAction extends ActionProps {
+  name: ActionName
+}
+
+export enum _ProxyValues {
+  interactable = '',
+  element = '',
+  prepared = '',
+  pointerIsDown = '',
+  pointerWasMoved = '',
+  _proxy = ''
+}
+
+export enum _ProxyMethods {
+  start = '',
+  move = '',
+  end = '',
+  stop = '',
+  interacting = ''
+}
+
+export type PointerArgProps<T extends {} = {}> = {
+  pointer: Interact.PointerType
+  event: Interact.PointerEventType
+  eventTarget: Interact.EventTarget
+  pointerIndex: number
+  pointerInfo: PointerInfo
+  interaction: Interaction
+} & T
+
+export interface DoPhaseArg<T extends ActionName, P extends EventPhase> {
+  event: Interact.PointerEventType
+  phase: EventPhase
+  interaction: Interaction<T>
+  iEvent: InteractEvent<T, P>
+  preEnd?: boolean
+  type?: string
+}
+
+export type DoAnyPhaseArg = DoPhaseArg<ActionName, EventPhase>
+
+declare module '@interactjs/core/scope' {
+  interface SignalArgs {
+    'interactions:new': { interaction: Interaction }
+    'interactions:down': PointerArgProps<{
+      type: 'down'
+    }>
+    'interactions:move': PointerArgProps<{
+      type: 'move'
+      dx: number
+      dy: number
+      duplicate: boolean
+    }>
+    'interactions:up': PointerArgProps<{
+      type: 'up'
+      curEventTarget: EventTarget
+    }>
+    'interactions:cancel': SignalArgs['interactions:up'] & {
+      type: 'cancel'
+      curEventTarget: EventTarget
+    }
+    'interactions:update-pointer': PointerArgProps<{
+      down: boolean
+    }>
+    'interactions:remove-pointer': PointerArgProps
+    'interactions:blur'
+    'interactions:before-action-start': Omit<DoAnyPhaseArg, 'iEvent'>
+    'interactions:action-start': DoAnyPhaseArg
+    'interactions:after-action-start': DoAnyPhaseArg
+    'interactions:before-action-move': Omit<DoAnyPhaseArg, 'iEvent'>
+    'interactions:action-move': DoAnyPhaseArg
+    'interactions:after-action-move': DoAnyPhaseArg
+    'interactions:before-action-end': Omit<DoAnyPhaseArg, 'iEvent'>
+    'interactions:action-end': DoAnyPhaseArg
+    'interactions:after-action-end': DoAnyPhaseArg
+    'interactions:stop': { interaction: Interaction }
+  }
+}
+
+export type InteractionProxy<T extends ActionName = ActionName> = Pick<
+Interaction<T>,
+keyof typeof _ProxyValues | keyof typeof _ProxyMethods
+>
+
+let idCounter = 0
+
+export class Interaction<T extends ActionName = ActionName> {
+  // current interactable being interacted with
+  interactable: Interactable = null
+
+  // the target element of the interactable
+  element: Interact.Element = null
+  rect: Interact.FullRect
+  _rects?: {
+    start: Interact.FullRect
+    corrected: Interact.FullRect
+    previous: Interact.FullRect
+    delta: Interact.FullRect
+  }
+  edges: Interact.EdgeOptions
+
+  _scopeFire: Interact.Scope['fire']
+
+  // action that's ready to be fired on next move event
+  prepared: ActionProps<T> = {
+    name : null,
+    axis : null,
+    edges: null,
+  }
+
+  pointerType: string
+
+  // keep track of added pointers
+  pointers: PointerInfo[] = []
+
+  // pointerdown/mousedown/touchstart event
+  downEvent: Interact.PointerEventType = null
+
+  downPointer: Interact.PointerType = {} as Interact.PointerType
+
+  _latestPointer: {
+    pointer: Interact.PointerType
+    event: Interact.PointerEventType
+    eventTarget: Node
+  } = {
+    pointer: null,
+    event: null,
+    eventTarget: null,
+  }
+
+  // previous action event
+  prevEvent: InteractEvent<T, EventPhase> = null
+
+  pointerIsDown = false
+  pointerWasMoved = false
+  _interacting = false
+  _ending = false
+  _stopped = true
+  _proxy: InteractionProxy<T> = null
+
+  simulation = null
+
+  get pointerMoveTolerance () {
+    return 1
+  }
+
+  /**
+   * @alias Interaction.prototype.move
+   */
+  doMove = utils.warnOnce(
+    function (this: Interaction, signalArg: any) {
+      this.move(signalArg)
+    },
+    'The interaction.doMove() method has been renamed to interaction.move()')
+
+  coords: Interact.CoordsSet = {
+    // Starting InteractEvent pointer coordinates
+    start: utils.pointer.newCoords(),
+    // Previous native pointer move event coordinates
+    prev: utils.pointer.newCoords(),
+    // current native pointer move event coordinates
+    cur: utils.pointer.newCoords(),
+    // Change in coordinates and time of the pointer
+    delta: utils.pointer.newCoords(),
+    // pointer velocity
+    velocity: utils.pointer.newCoords(),
+  }
+
+  readonly _id: number = idCounter++
+
+  /** */
+  constructor ({ pointerType, scopeFire }: {
+    pointerType?: string
+    scopeFire: Interact.Scope['fire']
+  }) {
+    this._scopeFire = scopeFire
+    this.pointerType = pointerType
+
+    const that = this
+
+    this._proxy = {} as InteractionProxy<T>
+
+    for (const key in _ProxyValues) {
+      Object.defineProperty(this._proxy, key, {
+        get () { return that[key] },
+      })
+    }
+
+    for (const key in _ProxyMethods) {
+      Object.defineProperty(this._proxy, key, {
+        value: (...args) => that[key](...args),
+      })
+    }
+
+    this._scopeFire('interactions:new', { interaction: this })
+  }
+
+  pointerDown (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget) {
+    const pointerIndex = this.updatePointer(pointer, event, eventTarget, true)
+    const pointerInfo = this.pointers[pointerIndex]
+
+    this._scopeFire('interactions:down', {
+      pointer,
+      event,
+      eventTarget,
+      pointerIndex,
+      pointerInfo,
+      type: 'down',
+      interaction: this,
+    })
+  }
+
+  /**
+   * ```js
+   * interact(target)
+   *   .draggable({
+   *     // disable the default drag start by down->move
+   *     manualStart: true
+   *   })
+   *   // start dragging after the user holds the pointer down
+   *   .on('hold', function (event) {
+   *     var interaction = event.interaction
+   *
+   *     if (!interaction.interacting()) {
+   *       interaction.start({ name: 'drag' },
+   *                         event.interactable,
+   *                         event.currentTarget)
+   *     }
+   * })
+   * ```
+   *
+   * Start an action with the given Interactable and Element as tartgets. The
+   * action must be enabled for the target Interactable and an appropriate
+   * number of pointers must be held down - 1 for drag/resize, 2 for gesture.
+   *
+   * Use it with `interactable.<action>able({ manualStart: false })` to always
+   * [start actions manually](https://github.com/taye/interact.js/issues/114)
+   *
+   * @param {object} action   The action to be performed - drag, resize, etc.
+   * @param {Interactable} target  The Interactable to target
+   * @param {Element} element The DOM Element to target
+   * @return {object} interact
+   */
+  start (action: StartAction, interactable: Interactable, element: Interact.Element) {
+    if (this.interacting() ||
+        !this.pointerIsDown ||
+        this.pointers.length < (action.name === 'gesture' ? 2 : 1) ||
+        !interactable.options[action.name].enabled) {
+      return false
+    }
+
+    utils.copyAction(this.prepared, action)
+
+    this.interactable = interactable
+    this.element      = element
+    this.rect         = interactable.getRect(element)
+    this.edges        = this.prepared.edges
+      ? utils.extend({}, this.prepared.edges)
+      : { left: true, right: true, top: true, bottom: true }
+    this._stopped     = false
+    this._interacting = this._doPhase({
+      interaction: this,
+      event: this.downEvent,
+      phase: 'start',
+    }) && !this._stopped
+
+    return this._interacting
+  }
+
+  pointerMove (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget) {
+    if (!this.simulation && !(this.modification && this.modification.endResult)) {
+      this.updatePointer(pointer, event, eventTarget, false)
+    }
+
+    const duplicateMove = (this.coords.cur.page.x === this.coords.prev.page.x &&
+                           this.coords.cur.page.y === this.coords.prev.page.y &&
+                           this.coords.cur.client.x === this.coords.prev.client.x &&
+                           this.coords.cur.client.y === this.coords.prev.client.y)
+
+    let dx
+    let dy
+
+    // register movement greater than pointerMoveTolerance
+    if (this.pointerIsDown && !this.pointerWasMoved) {
+      dx = this.coords.cur.client.x - this.coords.start.client.x
+      dy = this.coords.cur.client.y - this.coords.start.client.y
+
+      this.pointerWasMoved = utils.hypot(dx, dy) > this.pointerMoveTolerance
+    }
+
+    const pointerIndex = this.getPointerIndex(pointer)
+    const signalArg = {
+      pointer,
+      pointerIndex,
+      pointerInfo: this.pointers[pointerIndex],
+      event,
+      type: 'move' as const,
+      eventTarget,
+      dx,
+      dy,
+      duplicate: duplicateMove,
+      interaction: this,
+    }
+
+    if (!duplicateMove) {
+      // set pointer coordinate, time changes and velocity
+      utils.pointer.setCoordVelocity(this.coords.velocity, this.coords.delta)
+    }
+
+    this._scopeFire('interactions:move', signalArg)
+
+    if (!duplicateMove && !this.simulation) {
+      // if interacting, fire an 'action-move' signal etc
+      if (this.interacting()) {
+        signalArg.type = null
+        this.move(signalArg)
+      }
+
+      if (this.pointerWasMoved) {
+        utils.pointer.copyCoords(this.coords.prev, this.coords.cur)
+      }
+    }
+  }
+
+  /**
+   * ```js
+   * interact(target)
+   *   .draggable(true)
+   *   .on('dragmove', function (event) {
+   *     if (someCondition) {
+   *       // change the snap settings
+   *       event.interactable.draggable({ snap: { targets: [] }})
+   *       // fire another move event with re-calculated snap
+   *       event.interaction.move()
+   *     }
+   *   })
+   * ```
+   *
+   * Force a move of the current action at the same coordinates. Useful if
+   * snap/restrict has been changed and you want a movement with the new
+   * settings.
+   */
+  move (signalArg?) {
+    if (!signalArg || !signalArg.event) {
+      utils.pointer.setZeroCoords(this.coords.delta)
+    }
+
+    signalArg = utils.extend({
+      pointer: this._latestPointer.pointer,
+      event: this._latestPointer.event,
+      eventTarget: this._latestPointer.eventTarget,
+      interaction: this,
+    }, signalArg || {})
+
+    signalArg.phase = 'move'
+
+    this._doPhase(signalArg)
+  }
+
+  // End interact move events and stop auto-scroll unless simulation is running
+  pointerUp (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget, curEventTarget: Interact.EventTarget) {
+    let pointerIndex = this.getPointerIndex(pointer)
+
+    if (pointerIndex === -1) {
+      pointerIndex = this.updatePointer(pointer, event, eventTarget, false)
+    }
+
+    const type = /cancel$/i.test(event.type) ? 'cancel' : 'up'
+
+    this._scopeFire(`interactions:${type}` as 'interactions:up' | 'interactions:cancel', {
+      pointer,
+      pointerIndex,
+      pointerInfo: this.pointers[pointerIndex],
+      event,
+      eventTarget,
+      type: type as any,
+      curEventTarget,
+      interaction: this,
+    })
+
+    if (!this.simulation) {
+      this.end(event)
+    }
+
+    this.pointerIsDown = false
+    this.removePointer(pointer, event)
+  }
+
+  documentBlur (event) {
+    this.end(event)
+    this._scopeFire('interactions:blur', { event, type: 'blur', interaction: this })
+  }
+
+  /**
+   * ```js
+   * interact(target)
+   *   .draggable(true)
+   *   .on('move', function (event) {
+   *     if (event.pageX > 1000) {
+   *       // end the current action
+   *       event.interaction.end()
+   *       // stop all further listeners from being called
+   *       event.stopImmediatePropagation()
+   *     }
+   *   })
+   * ```
+   *
+   * @param {PointerEvent} [event]
+   */
+  end (event?: Interact.PointerEventType) {
+    this._ending = true
+    event = event || this._latestPointer.event
+    let endPhaseResult
+
+    if (this.interacting()) {
+      endPhaseResult = this._doPhase({
+        event,
+        interaction: this,
+        phase: 'end',
+      })
+    }
+
+    this._ending = false
+
+    if (endPhaseResult === true) {
+      this.stop()
+    }
+  }
+
+  currentAction () {
+    return this._interacting ? this.prepared.name : null
+  }
+
+  interacting () {
+    return this._interacting
+  }
+
+  /** */
+  stop () {
+    this._scopeFire('interactions:stop', { interaction: this })
+
+    this.interactable = this.element = null
+
+    this._interacting = false
+    this._stopped = true
+    this.prepared.name = this.prevEvent = null
+  }
+
+  getPointerIndex (pointer) {
+    const pointerId = utils.pointer.getPointerId(pointer)
+
+    // mouse and pen interactions may have only one pointer
+    return (this.pointerType === 'mouse' || this.pointerType === 'pen')
+      ? this.pointers.length - 1
+      : utils.arr.findIndex(this.pointers, curPointer => curPointer.id === pointerId)
+  }
+
+  getPointerInfo (pointer) {
+    return this.pointers[this.getPointerIndex(pointer)]
+  }
+
+  updatePointer (pointer: Interact.PointerType, event: Interact.PointerEventType, eventTarget: Interact.EventTarget, down?: boolean) {
+    const id = utils.pointer.getPointerId(pointer)
+    let pointerIndex = this.getPointerIndex(pointer)
+    let pointerInfo = this.pointers[pointerIndex]
+
+    down = down === false
+      ? false
+      : down || /(down|start)$/i.test(event.type)
+
+    if (!pointerInfo) {
+      pointerInfo = new PointerInfo(
+        id,
+        pointer,
+        event,
+        null,
+        null,
+      )
+
+      pointerIndex = this.pointers.length
+      this.pointers.push(pointerInfo)
+    }
+    else {
+      pointerInfo.pointer = pointer
+    }
+
+    utils.pointer.setCoords(this.coords.cur, this.pointers.map(p => p.pointer), this._now())
+    utils.pointer.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur)
+
+    if (down) {
+      this.pointerIsDown = true
+
+      pointerInfo.downTime = this.coords.cur.timeStamp
+      pointerInfo.downTarget = eventTarget
+      utils.pointer.pointerExtend(this.downPointer, pointer)
+
+      if (!this.interacting()) {
+        utils.pointer.copyCoords(this.coords.start, this.coords.cur)
+        utils.pointer.copyCoords(this.coords.prev, this.coords.cur)
+
+        this.downEvent = event
+        this.pointerWasMoved = false
+      }
+    }
+
+    this._updateLatestPointer(pointer, event, eventTarget)
+
+    this._scopeFire('interactions:update-pointer', {
+      pointer,
+      event,
+      eventTarget,
+      down,
+      pointerInfo,
+      pointerIndex,
+      interaction: this,
+    })
+
+    return pointerIndex
+  }
+
+  removePointer (pointer: Interact.PointerType, event: Interact.PointerEventType) {
+    const pointerIndex = this.getPointerIndex(pointer)
+
+    if (pointerIndex === -1) { return }
+
+    const pointerInfo = this.pointers[pointerIndex]
+
+    this._scopeFire('interactions:remove-pointer', {
+      pointer,
+      event,
+      eventTarget: null,
+      pointerIndex,
+      pointerInfo,
+      interaction: this,
+    })
+
+    this.pointers.splice(pointerIndex, 1)
+  }
+
+  _updateLatestPointer (pointer, event, eventTarget) {
+    this._latestPointer.pointer = pointer
+    this._latestPointer.event = event
+    this._latestPointer.eventTarget = eventTarget
+  }
+
+  destroy () {
+    this._latestPointer.pointer = null
+    this._latestPointer.event = null
+    this._latestPointer.eventTarget = null
+  }
+
+  _createPreparedEvent<P extends EventPhase> (event: Interact.PointerEventType, phase: P, preEnd?: boolean, type?: string) {
+    return new InteractEvent<T, P>(this, event, this.prepared.name, phase, this.element, preEnd, type)
+  }
+
+  _fireEvent<P extends EventPhase> (iEvent: InteractEvent<T, P>) {
+    this.interactable.fire(iEvent)
+
+    if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) {
+      this.prevEvent = iEvent
+    }
+  }
+
+  _doPhase<P extends EventPhase> (signalArg: Omit<DoPhaseArg<T, P>, 'iEvent'> & { iEvent?: InteractEvent<T, P> }) {
+    const { event, phase, preEnd, type } = signalArg
+    const { rect } = this
+
+    if (rect && phase === 'move') {
+      // update the rect changes due to pointer move
+      utils.rect.addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource])
+
+      rect.width = rect.right - rect.left
+      rect.height = rect.bottom - rect.top
+    }
+
+    const beforeResult = this._scopeFire(`interactions:before-action-${phase}` as any, signalArg)
+
+    if (beforeResult === false) {
+      return false
+    }
+
+    const iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type)
+
+    this._scopeFire(`interactions:action-${phase}` as any, signalArg)
+
+    if (phase === 'start') { this.prevEvent = iEvent }
+
+    this._fireEvent(iEvent)
+
+    this._scopeFire(`interactions:after-action-${phase}` as any, signalArg)
+
+    return true
+  }
+
+  _now () { return Date.now() }
+}
+
+export default Interaction
+export { PointerInfo }
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_core_interactablePreventDefault.ts.html b/interactjs/dist/api/@interactjs_core_interactablePreventDefault.ts.html new file mode 100644 index 000000000..21884a607 --- /dev/null +++ b/interactjs/dist/api/@interactjs_core_interactablePreventDefault.ts.html @@ -0,0 +1,173 @@ + + + + + + @interactjs/core/interactablePreventDefault.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/core/interactablePreventDefault.ts

+ + + + + + + +
+
+
import { matchesSelector, nodeContains } from '@interactjs/utils/domUtils'
+import events from '@interactjs/utils/events'
+import * as is from '@interactjs/utils/is'
+import { getWindow } from '@interactjs/utils/window'
+
+declare module '@interactjs/core/Interactable' {
+  interface Interactable {
+    preventDefault: typeof preventDefault
+    checkAndPreventDefault: (event: Event) => void
+  }
+}
+
+type PreventDefaultValue = 'always' | 'never' | 'auto'
+function preventDefault (this: Interact.Interactable): PreventDefaultValue
+function preventDefault (this: Interact.Interactable, newValue: PreventDefaultValue): typeof this
+function preventDefault (this: Interact.Interactable, newValue?: PreventDefaultValue) {
+  if (/^(always|never|auto)$/.test(newValue)) {
+    this.options.preventDefault = newValue
+    return this
+  }
+
+  if (is.bool(newValue)) {
+    this.options.preventDefault = newValue ? 'always' : 'never'
+    return this
+  }
+
+  return this.options.preventDefault
+}
+
+function checkAndPreventDefault (interactable: Interact.Interactable, scope: Interact.Scope, event: Event) {
+  const setting = interactable.options.preventDefault
+
+  if (setting === 'never') { return }
+
+  if (setting === 'always') {
+    event.preventDefault()
+    return
+  }
+
+  // setting === 'auto'
+
+  // if the browser supports passive event listeners and isn't running on iOS,
+  // don't preventDefault of touch{start,move} events. CSS touch-action and
+  // user-select should be used instead of calling event.preventDefault().
+  if (events.supportsPassive && /^touch(start|move)$/.test(event.type)) {
+    const doc = getWindow(event.target).document
+    const docOptions = scope.getDocOptions(doc)
+
+    if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) {
+      return
+    }
+  }
+
+  // don't preventDefault of pointerdown events
+  if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {
+    return
+  }
+
+  // don't preventDefault on editable elements
+  if (is.element(event.target) &&
+      matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {
+    return
+  }
+
+  event.preventDefault()
+}
+
+function onInteractionEvent ({ interaction, event }: { interaction: Interact.Interaction, event: Interact.PointerEventType }) {
+  if (interaction.interactable) {
+    interaction.interactable.checkAndPreventDefault(event as Event)
+  }
+}
+
+export function install (scope: Interact.Scope) {
+  /** @lends Interactable */
+  const { Interactable } = scope
+
+  /**
+   * Returns or sets whether to prevent the browser's default behaviour in
+   * response to pointer events. Can be set to:
+   *  - `'always'` to always prevent
+   *  - `'never'` to never prevent
+   *  - `'auto'` to let interact.js try to determine what would be best
+   *
+   * @param {string} [newValue] `'always'`, `'never'` or `'auto'`
+   * @return {string | Interactable} The current setting or this Interactable
+   */
+  Interactable.prototype.preventDefault = preventDefault
+
+  Interactable.prototype.checkAndPreventDefault = function (event) {
+    return checkAndPreventDefault(this, scope, event)
+  }
+
+  // prevent native HTML5 drag on interact.js target elements
+  scope.interactions.docEvents.push({
+    type: 'dragstart',
+    listener (event) {
+      for (const interaction of scope.interactions.list) {
+        if (interaction.element &&
+          (interaction.element === event.target ||
+           nodeContains(interaction.element, event.target))) {
+          interaction.interactable.checkAndPreventDefault(event)
+          return
+        }
+      }
+    },
+  })
+}
+
+export default {
+  id: 'core/interactablePreventDefault',
+  install,
+  listeners: ['down', 'move', 'up', 'cancel'].reduce((acc, eventType) => {
+    acc[`interactions:${eventType}`] = onInteractionEvent
+    return acc
+  }, {} as any),
+}
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_interact_index.ts.html b/interactjs/dist/api/@interactjs_interact_index.ts.html new file mode 100644 index 000000000..c6fd67ab5 --- /dev/null +++ b/interactjs/dist/api/@interactjs_interact_index.ts.html @@ -0,0 +1,355 @@ + + + + + + @interactjs/interact/index.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/interact/index.ts

+ + + + + + + +
+
+
/** @module interact */
+
+import '@interactjs/types/index'
+import { Options } from '@interactjs/core/defaultOptions'
+import Interactable from '@interactjs/core/Interactable'
+import { isNonNativeEvent, Scope } from '@interactjs/core/scope'
+import browser from '@interactjs/utils/browser'
+import events from '@interactjs/utils/events'
+import * as utils from '@interactjs/utils/index'
+
+declare module '@interactjs/core/scope' {
+  interface Scope {
+    interact?: InteractStatic
+  }
+}
+
+export interface InteractStatic {
+  (target: Interact.Target, options?: Options): Interactable
+  on: typeof on
+  pointerMoveTolerance: typeof pointerMoveTolerance
+  stop: typeof stop
+  supportsPointerEvent: typeof supportsPointerEvent
+  supportsTouch: typeof supportsTouch
+  debug: typeof debug
+  off: typeof off
+  isSet: typeof isSet
+  use: typeof use
+  getPointerAverage: typeof utils.pointer.pointerAverage
+  getTouchBBox: typeof utils.pointer.touchBBox
+  getTouchDistance: typeof utils.pointer.touchDistance
+  getTouchAngle: typeof utils.pointer.touchAngle
+  getElementRect: typeof utils.dom.getElementRect
+  getElementClientRect: typeof utils.dom.getElementClientRect
+  matchesSelector: typeof utils.dom.matchesSelector
+  closest: typeof utils.dom.closest
+  addDocument: typeof scope.addDocument
+  removeDocument: typeof scope.removeDocument
+  dynamicDrop: (newValue?: boolean) => boolean | Interact.interact
+  version: string
+}
+
+const globalEvents: any = {}
+const scope = new Scope()
+
+export function init (win: Window) {
+  scope.init(win)
+
+  return interact
+}
+
+/**
+ * ```js
+ * interact('#draggable').draggable(true)
+ *
+ * var rectables = interact('rect')
+ * rectables
+ *   .gesturable(true)
+ *   .on('gesturemove', function (event) {
+ *       // ...
+ *   })
+ * ```
+ *
+ * The methods of this variable can be used to set elements as interactables
+ * and also to change various default settings.
+ *
+ * Calling it as a function and passing an element or a valid CSS selector
+ * string returns an Interactable object which has various methods to configure
+ * it.
+ *
+ * @global
+ *
+ * @param {Element | string} target The HTML or SVG Element to interact with
+ * or CSS selector
+ * @return {Interactable}
+ */
+export const interact: InteractStatic = function interact (target: Interact.Target, options?: any) {
+  let interactable = scope.interactables.get(target, options)
+
+  if (!interactable) {
+    interactable = scope.interactables.new(target, options)
+    interactable.events.global = globalEvents
+  }
+
+  return interactable
+} as InteractStatic
+
+/**
+ * Use a plugin
+ *
+ * @alias module:interact.use
+ *
+ * @param {Object} plugin
+ * @param {function} plugin.install
+ * @return {interact}
+ */
+interact.use = use
+function use (plugin: Interact.Plugin, options?: { [key: string]: any }) {
+  scope.usePlugin(plugin, options)
+
+  return interact
+}
+
+/**
+ * Check if an element or selector has been set with the {@link interact}
+ * function
+ *
+ * @alias module:interact.isSet
+ *
+ * @param {Element} element The Element being searched for
+ * @return {boolean} Indicates if the element or CSS selector was previously
+ * passed to interact
+ */
+interact.isSet = isSet
+function isSet (target: Interact.Element, options?: any) {
+  return !!scope.interactables.get(target, options && options.context)
+}
+
+/**
+ * Add a global listener for an InteractEvent or adds a DOM event to `document`
+ *
+ * @alias module:interact.on
+ *
+ * @param {string | array | object} type The types of events to listen for
+ * @param {function} listener The function event (s)
+ * @param {object | boolean} [options] object or useCapture flag for
+ * addEventListener
+ * @return {object} interact
+ */
+interact.on = on
+function on (type: string | Interact.EventTypes, listener: Interact.ListenersArg, options?: object) {
+  if (utils.is.string(type) && type.search(' ') !== -1) {
+    type = type.trim().split(/ +/)
+  }
+
+  if (utils.is.array(type)) {
+    for (const eventType of (type as any[])) {
+      interact.on(eventType, listener, options)
+    }
+
+    return interact
+  }
+
+  if (utils.is.object(type)) {
+    for (const prop in type) {
+      interact.on(prop, (type as any)[prop], listener)
+    }
+
+    return interact
+  }
+
+  // if it is an InteractEvent type, add listener to globalEvents
+  if (isNonNativeEvent(type, scope.actions)) {
+    // if this type of event was never bound
+    if (!globalEvents[type]) {
+      globalEvents[type] = [listener]
+    }
+    else {
+      globalEvents[type].push(listener)
+    }
+  }
+  // If non InteractEvent type, addEventListener to document
+  else {
+    events.add(scope.document, type, listener as Interact.Listener, { options })
+  }
+
+  return interact
+}
+
+/**
+ * Removes a global InteractEvent listener or DOM event from `document`
+ *
+ * @alias module:interact.off
+ *
+ * @param {string | array | object} type The types of events that were listened
+ * for
+ * @param {function} listener The listener function to be removed
+ * @param {object | boolean} options [options] object or useCapture flag for
+ * removeEventListener
+ * @return {object} interact
+ */
+interact.off = off
+function off (type: Interact.EventTypes, listener: any, options?: object) {
+  if (utils.is.string(type) && type.search(' ') !== -1) {
+    type = type.trim().split(/ +/)
+  }
+
+  if (utils.is.array(type)) {
+    for (const eventType of type) {
+      interact.off(eventType, listener, options)
+    }
+
+    return interact
+  }
+
+  if (utils.is.object(type)) {
+    for (const prop in type) {
+      interact.off(prop, type[prop], listener)
+    }
+
+    return interact
+  }
+
+  if (isNonNativeEvent(type, scope.actions)) {
+    let index
+
+    if (type in globalEvents &&
+        (index = globalEvents[type].indexOf(listener)) !== -1) {
+      globalEvents[type].splice(index, 1)
+    }
+  }
+  else {
+    events.remove(scope.document, type, listener, options)
+  }
+
+  return interact
+}
+
+interact.debug = debug
+function debug () {
+  return scope
+}
+
+// expose the functions used to calculate multi-touch properties
+interact.getPointerAverage  = utils.pointer.pointerAverage
+interact.getTouchBBox       = utils.pointer.touchBBox
+interact.getTouchDistance   = utils.pointer.touchDistance
+interact.getTouchAngle      = utils.pointer.touchAngle
+
+interact.getElementRect       = utils.dom.getElementRect
+interact.getElementClientRect = utils.dom.getElementClientRect
+interact.matchesSelector      = utils.dom.matchesSelector
+interact.closest              = utils.dom.closest
+
+/**
+ * @alias module:interact.supportsTouch
+ *
+ * @return {boolean} Whether or not the browser supports touch input
+ */
+interact.supportsTouch = supportsTouch
+function supportsTouch () {
+  return browser.supportsTouch
+}
+
+/**
+ * @alias module:interact.supportsPointerEvent
+ *
+ * @return {boolean} Whether or not the browser supports PointerEvents
+ */
+interact.supportsPointerEvent = supportsPointerEvent
+function supportsPointerEvent () {
+  return browser.supportsPointerEvent
+}
+
+/**
+ * Cancels all interactions (end events are not fired)
+ *
+ * @alias module:interact.stop
+ *
+ * @return {object} interact
+ */
+interact.stop = stop
+function stop () {
+  for (const interaction of scope.interactions.list) {
+    interaction.stop()
+  }
+
+  return interact
+}
+
+/**
+ * Returns or sets the distance the pointer must be moved before an action
+ * sequence occurs. This also affects tolerance for tap events.
+ *
+ * @alias module:interact.pointerMoveTolerance
+ *
+ * @param {number} [newValue] The movement from the start position must be greater than this value
+ * @return {interact | number}
+ */
+interact.pointerMoveTolerance = pointerMoveTolerance
+function pointerMoveTolerance (newValue?: number) {
+  if (utils.is.number(newValue)) {
+    scope.interactions.pointerMoveTolerance = newValue
+
+    return interact
+  }
+
+  return scope.interactions.pointerMoveTolerance
+}
+
+interact.addDocument = (doc, options) => scope.addDocument(doc, options)
+interact.removeDocument = doc => scope.removeDocument(doc)
+
+// eslint-disable-next-line no-undef
+interact.version = process.env.npm_package_version
+
+scope.interact = interact
+
+export { scope }
+export default interact
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_modifiers_aspectRatio.ts.html b/interactjs/dist/api/@interactjs_modifiers_aspectRatio.ts.html new file mode 100644 index 000000000..4a41b521f --- /dev/null +++ b/interactjs/dist/api/@interactjs_modifiers_aspectRatio.ts.html @@ -0,0 +1,211 @@ + + + + + + @interactjs/modifiers/aspectRatio.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/modifiers/aspectRatio.ts

+ + + + + + + +
+
+
/* eslint-disable */
+
+/**
+ * @module modifiers/aspectRatio
+ *
+ * @description
+ * This module forces elements to be resized with a specified dx/dy ratio.
+ *
+ * @example
+ * interact(target).resizable({
+ *   modifiers: [
+ *     interact.modifiers.snapSize({
+ *       targets: [ interact.createSnapGrid({ x: 20, y: 20 }) ],
+ *     }),
+ *     interact.aspectRatio({ ratio: 'preserve' }),
+ *   ],
+ * });
+ */
+
+import extend from '@interactjs/utils/extend'
+import { addEdges } from '@interactjs/utils/rect'
+import { Modifier, ModifierModule, ModifierState } from './base'
+import Modification from './Modification'
+import { makeModifier } from './base'
+
+export interface AspectRatioOptions {
+  ratio?: number | 'preserve'
+  equalDelta?: boolean
+  modifiers?: Modifier[]
+  enabled?: boolean
+}
+
+export type AspectRatioState = ModifierState<AspectRatioOptions, {
+  startCoords: Interact.Point
+  startRect: Interact.Rect
+  linkedEdges: Interact.EdgeOptions
+  ratio: number
+  equalDelta: boolean
+  xIsPrimaryAxis: boolean
+  edgeSign: 1 | -1
+  subModification: Modification
+}>
+
+const aspectRatio: ModifierModule<AspectRatioOptions, AspectRatioState> = {
+  start (arg) {
+    const { state, rect, edges: originalEdges, pageCoords: coords } = arg
+    let { ratio } = state.options
+    const { equalDelta, modifiers } = state.options
+
+    if (ratio === 'preserve') {
+      ratio = rect.width / rect.height
+    }
+
+    state.startCoords = extend({}, coords)
+    state.startRect = extend({}, rect)
+    state.ratio = ratio
+    state.equalDelta = equalDelta
+
+    const linkedEdges = state.linkedEdges = {
+      top   : originalEdges.top    || (originalEdges.left   && !originalEdges.bottom),
+      left  : originalEdges.left   || (originalEdges.top    && !originalEdges.right),
+      bottom: originalEdges.bottom || (originalEdges.right  && !originalEdges.top),
+      right : originalEdges.right  || (originalEdges.bottom && !originalEdges.left),
+    }
+
+    state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right)
+
+    if (state.equalDelta) {
+      state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1) as 1 | -1
+    }
+    else {
+      const negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left
+      state.edgeSign = negativeSecondaryEdge ? -1 : 1
+    }
+
+    extend(arg.edges, linkedEdges)
+
+    if (!modifiers || !modifiers.length) { return }
+
+    const subModification = new Modification(arg.interaction)
+
+    subModification.copyFrom(arg.interaction.modification)
+    subModification.prepareStates(modifiers)
+
+    state.subModification = subModification
+    subModification.startAll({ ...arg })
+  },
+
+  set (arg) {
+    const { state, rect, coords } = arg
+    const initialCoords = extend({}, coords)
+    const aspectMethod = state.equalDelta ? setEqualDelta : setRatio
+
+    aspectMethod(state, state.xIsPrimaryAxis, coords, rect)
+
+    if (!state.subModification) { return null }
+
+    const correctedRect = extend({}, rect)
+
+    addEdges(state.linkedEdges, correctedRect, { x: coords.x - initialCoords.x, y: coords.y - initialCoords.y })
+
+    const result = state.subModification.setAll({
+      ...arg,
+      rect: correctedRect,
+      edges: state.linkedEdges,
+      pageCoords: coords,
+      prevCoords: coords,
+      prevRect: correctedRect,
+    })
+
+    const { delta } = result
+
+    if (result.changed) {
+      const xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y)
+
+      // do aspect modification again with critical edge axis as primary
+      aspectMethod(state, xIsCriticalAxis, result.coords, result.rect)
+      extend(coords, result.coords)
+    }
+
+    return result.eventProps
+  },
+
+  defaults: {
+    ratio: 'preserve',
+    equalDelta: false,
+    modifiers: [],
+    enabled: false,
+  },
+}
+
+function setEqualDelta ({ startCoords, edgeSign }: AspectRatioState, xIsPrimaryAxis: boolean, coords: Interact.Point) {
+  if (xIsPrimaryAxis) {
+    coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign
+  }
+  else {
+    coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign
+  }
+}
+
+function setRatio ({ startRect, startCoords, ratio, edgeSign }: AspectRatioState, xIsPrimaryAxis: boolean, coords: Interact.Point, rect: Interact.Rect) {
+  if (xIsPrimaryAxis) {
+    const newHeight = rect.width / ratio
+
+    coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign
+  }
+  else {
+    const newWidth = rect.height * ratio
+
+    coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign
+  }
+}
+
+export default makeModifier(aspectRatio, 'aspectRatio')
+export { aspectRatio }
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_modifiers_snap_edges.ts.html b/interactjs/dist/api/@interactjs_modifiers_snap_edges.ts.html new file mode 100644 index 000000000..c384a7667 --- /dev/null +++ b/interactjs/dist/api/@interactjs_modifiers_snap_edges.ts.html @@ -0,0 +1,119 @@ + + + + + + @interactjs/modifiers/snap/edges.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/modifiers/snap/edges.ts

+ + + + + + + +
+
+
/**
+ * @module modifiers/snapEdges
+ *
+ * @description
+ * This module allows snapping of the edges of targets during resize
+ * interactions.
+ *
+ * @example
+ * interact(target).resizable({
+ *   snapEdges: {
+ *     targets: [interact.snappers.grid({ x: 100, y: 50 })],
+ *   },
+ * })
+ *
+ * interact(target).resizable({
+ *   snapEdges: {
+ *     targets: [
+ *       interact.snappers.grid({
+ *        top: 50,
+ *        left: 50,
+ *        bottom: 100,
+ *        right: 100,
+ *       }),
+ *     ],
+ *   },
+ * })
+ */
+
+import clone from '@interactjs/utils/clone'
+import extend from '@interactjs/utils/extend'
+import { ModifierArg, ModifierModule, makeModifier } from '../base'
+import { SnapOptions, SnapState } from './pointer'
+import { snapSize } from './size'
+
+export type SnapEdgesOptions = Pick<SnapOptions, 'targets' | 'range' | 'offset' | 'endOnly' | 'enabled'>
+
+function start (arg: ModifierArg<SnapState>) {
+  const { edges } = arg
+
+  if (!edges) { return null }
+
+  arg.state.targetFields = arg.state.targetFields || [
+    [edges.left ? 'left' : 'right', edges.top ? 'top' : 'bottom'],
+  ]
+
+  return snapSize.start(arg)
+}
+
+const snapEdges: ModifierModule<SnapEdgesOptions, SnapState> = {
+  start,
+  set: snapSize.set,
+  defaults: extend(
+    clone(snapSize.defaults),
+    {
+      targets: null,
+      range: null,
+      offset: { x: 0, y: 0 },
+    } as const,
+  ),
+}
+
+export default makeModifier(snapEdges, 'snapEdges')
+export { snapEdges }
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_pointer-events_PointerEvent.ts.html b/interactjs/dist/api/@interactjs_pointer-events_PointerEvent.ts.html new file mode 100644 index 000000000..5f41dab89 --- /dev/null +++ b/interactjs/dist/api/@interactjs_pointer-events_PointerEvent.ts.html @@ -0,0 +1,140 @@ + + + + + + @interactjs/pointer-events/PointerEvent.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/pointer-events/PointerEvent.ts

+ + + + + + + +
+
+
import BaseEvent from '../core/BaseEvent'
+import * as pointerUtils from '../utils/pointerUtils'
+
+export default class PointerEvent<T extends string = any> extends BaseEvent {
+  type: T
+  originalEvent: Interact.PointerEventType
+  pointerId: number
+  pointerType: string
+  double: boolean
+  pageX: number
+  pageY: number
+  clientX: number
+  clientY: number
+  dt: number
+  eventable: any
+  [key: string]: any
+
+  /** */
+  constructor (
+    type: T,
+    pointer: Interact.PointerType | PointerEvent<any>,
+    event: Interact.PointerEventType,
+    eventTarget: Interact.EventTarget,
+    interaction: Interact.Interaction,
+    timeStamp: number,
+  ) {
+    super(interaction)
+    pointerUtils.pointerExtend(this, event)
+
+    if (event !== pointer) {
+      pointerUtils.pointerExtend(this, pointer)
+    }
+
+    this.timeStamp     = timeStamp
+    this.originalEvent = event
+    this.type          = type
+    this.pointerId     = pointerUtils.getPointerId(pointer)
+    this.pointerType   = pointerUtils.getPointerType(pointer)
+    this.target        = eventTarget
+    this.currentTarget = null
+
+    if (type === 'tap') {
+      const pointerIndex = interaction.getPointerIndex(pointer)
+      this.dt = this.timeStamp - interaction.pointers[pointerIndex].downTime
+
+      const interval = this.timeStamp - interaction.tapTime
+
+      this.double = !!(interaction.prevTap &&
+        interaction.prevTap.type !== 'doubletap' &&
+        interaction.prevTap.target === this.target &&
+        interval < 500)
+    }
+    else if (type === 'doubletap') {
+      this.dt = (pointer as PointerEvent<'tap'>).timeStamp - interaction.tapTime
+    }
+  }
+
+  _subtractOrigin ({ x: originX, y: originY }: Interact.Point) {
+    this.pageX   -= originX
+    this.pageY   -= originY
+    this.clientX -= originX
+    this.clientY -= originY
+
+    return this
+  }
+
+  _addOrigin ({ x: originX, y: originY }: Interact.Point) {
+    this.pageX   += originX
+    this.pageY   += originY
+    this.clientX += originX
+    this.clientY += originY
+
+    return this
+  }
+
+  /**
+   * Prevent the default behaviour of the original Event
+   */
+  preventDefault () {
+    this.originalEvent.preventDefault()
+  }
+}
+
+export { PointerEvent }
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/@interactjs_reflow_index.ts.html b/interactjs/dist/api/@interactjs_reflow_index.ts.html new file mode 100644 index 000000000..709f43c05 --- /dev/null +++ b/interactjs/dist/api/@interactjs_reflow_index.ts.html @@ -0,0 +1,221 @@ + + + + + + @interactjs/reflow/index.ts - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

@interactjs/reflow/index.ts

+ + + + + + + +
+
+
import Interactable from '@interactjs/core/Interactable'
+import { ActionProps, Interaction } from '@interactjs/core/Interaction'
+import { Scope } from '@interactjs/core/scope'
+import { arr, extend, is, pointer as pointerUtils, rect as rectUtils, win } from '@interactjs/utils/index'
+
+declare module '@interactjs/core/Interactable' {
+  interface Interactable {
+    reflow: (action: ActionProps) => ReturnType<typeof reflow>
+  }
+}
+
+declare module '@interactjs/core/Interaction' {
+  interface Interaction {
+    _reflowPromise: Promise<void>
+    _reflowResolve: () => void
+  }
+}
+
+declare module '@interactjs/core/InteractEvent' {
+  // eslint-disable-next-line no-shadow
+  interface PhaseMap {
+    reflow?: true
+  }
+}
+
+export function install (scope: Scope) {
+  const {
+    /** @lends Interactable */
+    // eslint-disable-next-line no-shadow
+    Interactable,
+  } = scope
+
+  scope.actions.phases.reflow = true
+
+  /**
+   * ```js
+   * const interactable = interact(target)
+   * const drag = { name: drag, axis: 'x' }
+   * const resize = { name: resize, edges: { left: true, bottom: true }
+   *
+   * interactable.reflow(drag)
+   * interactable.reflow(resize)
+   * ```
+   *
+   * Start an action sequence to re-apply modifiers, check drops, etc.
+   *
+   * @param { Object } action The action to begin
+   * @param { string } action.name The name of the action
+   * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended
+   */
+  Interactable.prototype.reflow = function (action) {
+    return reflow(this, action, scope)
+  }
+}
+
+function reflow<T extends Interact.ActionName> (interactable: Interactable, action: ActionProps<T>, scope: Scope): Promise<Interactable> {
+  const elements = (is.string(interactable.target)
+    ? arr.from(interactable._context.querySelectorAll(interactable.target))
+    : [interactable.target]) as Interact.Element[]
+
+  // tslint:disable-next-line variable-name
+  const Promise = (win.window as any).Promise
+  const promises: Array<Promise<null>> | null = Promise ? [] : null
+
+  for (const element of elements) {
+    const rect = interactable.getRect(element as HTMLElement | SVGElement)
+
+    if (!rect) { break }
+
+    const runningInteraction = arr.find(
+      scope.interactions.list,
+      (interaction: Interaction) => {
+        return interaction.interacting() &&
+          interaction.interactable === interactable &&
+          interaction.element === element &&
+          interaction.prepared.name === action.name
+      })
+    let reflowPromise: Promise<null>
+
+    if (runningInteraction) {
+      runningInteraction.move()
+
+      if (promises) {
+        reflowPromise = runningInteraction._reflowPromise || new Promise((resolve: any) => {
+          runningInteraction._reflowResolve = resolve
+        })
+      }
+    }
+    else {
+      const xywh = rectUtils.tlbrToXywh(rect)
+      const coords = {
+        page     : { x: xywh.x, y: xywh.y },
+        client   : { x: xywh.x, y: xywh.y },
+        timeStamp: scope.now(),
+      }
+
+      const event = pointerUtils.coordsToEvent(coords)
+      reflowPromise = startReflow<T>(scope, interactable, element, action, event)
+    }
+
+    if (promises) {
+      promises.push(reflowPromise)
+    }
+  }
+
+  return promises && Promise.all(promises).then(() => interactable)
+}
+
+function startReflow<T extends Interact.ActionName> (scope: Scope, interactable: Interactable, element: Interact.Element, action: ActionProps<T>, event: any) {
+  const interaction = scope.interactions.new({ pointerType: 'reflow' })
+  const signalArg = {
+    interaction,
+    event,
+    pointer: event,
+    eventTarget: element,
+    phase: 'reflow',
+  } as const
+
+  interaction.interactable = interactable
+  interaction.element = element
+  interaction.prepared = extend({}, action)
+  interaction.prevEvent = event
+  interaction.updatePointer(event, event, element, true)
+
+  interaction._doPhase(signalArg)
+
+  const reflowPromise = (win.window as unknown as any).Promise
+    ? new (win.window as unknown as any).Promise((resolve: any) => {
+      interaction._reflowResolve = resolve
+    })
+    : null
+
+  interaction._reflowPromise = reflowPromise
+  interaction.start(action, interactable, element)
+
+  if (interaction._interacting) {
+    interaction.move(signalArg)
+    interaction.end(event)
+  }
+  else {
+    interaction.stop()
+  }
+
+  interaction.removePointer(event, event)
+  interaction.pointerIsDown = false
+
+  return reflowPromise
+}
+
+export default {
+  id: 'reflow',
+  install,
+  listeners: {
+    // remove completed reflow interactions
+    'interactions:stop': ({ interaction }, scope) => {
+      if (interaction.pointerType === 'reflow') {
+        if (interaction._reflowResolve) {
+          interaction._reflowResolve()
+        }
+
+        arr.remove(scope.interactions.list, interaction)
+      }
+    },
+  },
+} as Interact.Plugin
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/DropEvent.html b/interactjs/dist/api/DropEvent.html new file mode 100644 index 000000000..e0f2e46f0 --- /dev/null +++ b/interactjs/dist/api/DropEvent.html @@ -0,0 +1,262 @@ + + + + + + DropEvent - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

DropEvent

+ + + + + + + +
+ +
+ +

+ DropEvent +

+ + +
+ +
+
+ + +
+ + + +

new DropEvent()

+ + + + + +
+

Class of events fired on dropzones during drags with acceptable targets.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ + + +
+ + + +

reject()

+ + + + + +
+

If this is a dropactivate event, the dropzone element will be +deactivated.

+

If this is a dragmove or dragenter, a dragleave will be fired on the +dropzone element and more.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/InteractEvent_InteractEvent.html b/interactjs/dist/api/InteractEvent_InteractEvent.html new file mode 100644 index 000000000..13863221b --- /dev/null +++ b/interactjs/dist/api/InteractEvent_InteractEvent.html @@ -0,0 +1,167 @@ + + + + + + InteractEvent - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

InteractEvent

+ + + + + + + +
+ +
+ +

+ InteractEvent +

+ + +
+ +
+
+ + +
+ + + +

new InteractEvent()

+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/Interactable.html b/interactjs/dist/api/Interactable.html new file mode 100644 index 000000000..7e38cf2e8 --- /dev/null +++ b/interactjs/dist/api/Interactable.html @@ -0,0 +1,3477 @@ + + + + + + Interactable - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

Interactable

+ + + + + + + +
+ +
+ +

+ Interactable +

+ + +
+ +
+
+ + +
+ + + +

new Interactable()

+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + +

Classes

+ +
+
Interactable
+
+
+ + + + + + + +

Members

+ + + +
+

actionChecker

+ + + + +
+
interact('.resize-drag')
+  .resizable(true)
+  .draggable(true)
+  .actionChecker(function (pointer, event, action, interactable, element, interaction) {
+
+  if (interact.matchesSelector(event.target, '.drag-handle')) {
+    // force drag with handle target
+    action.name = drag
+  }
+  else {
+    // resize from the top and right edges
+    action.name  = 'resize'
+    action.edges = { top: true, right: true }
+  }
+
+  return action
+})
+
+

Returns or sets the function used to check action to be performed on +pointerDown

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + +
+

allowFrom

+ + + + + + + + +
+ + + + + + + + + + + + + + + + +
Deprecated:
  • A drag/resize/gesture is started only If the target of the `mousedown`, +`pointerdown` or `touchstart` event or any of it's parents match the given +CSS selector or Element. + +Don't use this method. Instead set the `allowFrom` option for each action +or for `pointerEvents`
+ + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + +
interact(targett)
+  .resizable({
+    allowFrom: '.resize-handle',
+  .pointerEvents({
+    allowFrom: '.handle',,
+  })
+ + +
+ + + +
+

ignoreFrom

+ + + + +
+
interact(element, { ignoreFrom: document.getElementById('no-action') })
+// or
+interact(element).ignoreFrom('input, textarea, a')
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
Deprecated:
  • If the target of the `mousedown`, `pointerdown` or `touchstart` event or any +of it's parents match the given CSS selector or Element, no +drag/resize/gesture is started. + +Don't use this method. Instead set the `ignoreFrom` option for each action +or for `pointerEvents`
+ + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + +
interact(targett)
+  .draggable({
+    ignoreFrom: 'input, textarea, a[href]'',
+  })
+  .pointerEvents({
+    ignoreFrom: '[no-pointer]',
+  })
+ + +
+ + + +
+

preventDefault

+ + + + +
+

Returns or sets whether to prevent the browser's default behaviour in +response to pointer events. Can be set to:

+
    +
  • 'always' to always prevent
  • +
  • 'never' to never prevent
  • +
  • 'auto' to let interact.js try to determine what would be best
  • +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + +
+

styleCursor

+ + + + +
+

Returns or sets whether the the cursor should be changed depending on the +action that would be performed if the mouse were pressed and dragged.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + + + +

Methods

+ + + +
+ + + +

context() → {Node}

+ + + + + +
+

Gets the selector context Node of the Interactable. The default is +window.document.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Node + + +
+
+ + +
+

The context Node of this Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

deltaSource(newValueopt) → {string|object}

+ + + + + +
+

Returns or sets the mouse coordinate types used to calculate the +movement of the pointer.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
newValue + + +string + + + + + + <optional>
+ + + + + +
+

Use 'client' if you will be scrolling while +interacting; Use 'page' if you want autoScroll to work

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +string +| + +object + + +
+
+ + +
+

The current deltaSource or this Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

draggable(optionsopt) → {boolean|Interactable}

+ + + + + +
+
interact(element).draggable({
+    onstart: function (event) {},
+    onmove : function (event) {},
+    onend  : function (event) {},
+
+    // the axis in which the first movement must be
+    // for the drag sequence to start
+    // 'xy' by default - any direction
+    startAxis: 'x' || 'y' || 'xy',
+
+    // 'xy' by default - don't restrict to one axis (move in any direction)
+    // 'x' or 'y' to restrict movement to either axis
+    // 'start' to restrict movement to the axis the drag started in
+    lockAxis: 'x' || 'y' || 'xy' || 'start',
+
+    // max number of drags that can happen concurrently
+    // with elements of this Interactable. Infinity by default
+    max: Infinity,
+
+    // max number of drags that can target the same element+Interactable
+    // 1 by default
+    maxPerElement: 2
+})
+
+var isDraggable = interact('element').draggable(); // true
+
+

Get or set whether drag actions can be performed on the target

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
options + + +boolean +| + +object + + + + + + <optional>
+ + + + + +
+

true/false or An object with event +listeners to be fired on drag events (object makes the Interactable +draggable)

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +boolean +| + +Interactable + + +
+
+ + +
+

boolean indicating if this can be the +target of drag events, or this Interctable

+
+ + +
+ + + +
+ + + +
+ + + +

dropCheck()

+ + + + + +
+
interact(target)
+.dropChecker(function(dragEvent,         // related dragmove or dragend event
+                      event,             // TouchEvent/PointerEvent/MouseEvent
+                      dropped,           // bool result of the default checker
+                      dropzone,          // dropzone Interactable
+                      dropElement,       // dropzone elemnt
+                      draggable,         // draggable Interactable
+                      draggableElement) {// draggable element
+
+  return dropped && event.target.hasAttribute('allow-drop')
+}
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +

dropzone(optionsopt) → {boolean|Interactable}

+ + + + + +
+
interact('.drop').dropzone({
+  accept: '.can-drop' || document.getElementById('single-drop'),
+  overlap: 'pointer' || 'center' || zeroToOne
+}
+
+

Returns or sets whether draggables can be dropped onto this target to +trigger drop events

+

Dropzones can receive the following events:

+
    +
  • dropactivate and dropdeactivate when an acceptable drag starts and ends
  • +
  • dragenter and dragleave when a draggable enters and leaves the dropzone
  • +
  • dragmove when a draggable that has entered the dropzone is moved
  • +
  • drop when a draggable is dropped into this dropzone
  • +
+

Use the accept option to allow only elements that match the given CSS +selector or element. The value can be:

+
    +
  • an Element - only that element can be dropped into this dropzone.
  • +
  • a string, - the element being dragged must match it as a CSS selector.
  • +
  • null - accept options is cleared - it accepts any element.
  • +
+

Use the overlap option to set how drops are checked for. The allowed +values are:

+
    +
  • 'pointer', the pointer must be over the dropzone (default)
  • +
  • 'center', the draggable element's center must be over the dropzone
  • +
  • a number from 0-1 which is the (intersection area) / (draggable area). +e.g. 0.5 for drop to happen when half of the area of the draggable is +over the dropzone
  • +
+

Use the checker option to specify a function to check if a dragged element +is over this Interactable.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
options + + +boolean +| + +object +| + +null + + + + + + <optional>
+ + + + + +
+

The new options to be set.

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +boolean +| + +Interactable + + +
+
+ + +
+

The current setting or this Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

fire(iEvent) → {Interactable}

+ + + + + +
+

Calls listeners for the given InteractEvent type bound globally +and directly to this Interactable

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
iEvent + + +InteractEvent + + + + +

The InteractEvent object to be fired on this +Interactable

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Interactable + + +
+
+ + +
+

this Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

gesturable(optionsopt) → {boolean|Interactable}

+ + + + + +
+
interact(element).gesturable({
+    onstart: function (event) {},
+    onmove : function (event) {},
+    onend  : function (event) {},
+
+    // limit multiple gestures.
+    // See the explanation in Interactable.draggable example
+    max: Infinity,
+    maxPerElement: 1,
+})
+
+var isGestureable = interact(element).gesturable()
+
+

Gets or sets whether multitouch gestures can be performed on the target

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
options + + +boolean +| + +object + + + + + + <optional>
+ + + + + +
+

true/false or An object with event +listeners to be fired on gesture events (makes the Interactable gesturable)

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +boolean +| + +Interactable + + +
+
+ + +
+

A boolean indicating if this can be the +target of gesture events, or this Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

getRect(elementopt) → {object}

+ + + + + +
+

The default function to get an Interactables bounding rect. Can be +overridden using Interactable.rectChecker.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
element + + +Element + + + + + + <optional>
+ + + + + +
+

The element to measure.

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +object + + +
+
+ + +
+

The object's bounding rectangle.

+
+ + +
+ + + +
+ + + +
+ + + +

off(types, listeneropt, optionsopt) → {Interactable}

+ + + + + +
+

Removes an InteractEvent, pointerEvent or DOM event listener.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
types + + +string +| + +array +| + +object + + + + + + + + + + +

The types of events that were +listened for

+ +
listener + + +function +| + +array +| + +object + + + + + + <optional>
+ + + + + +
+

The event listener function(s)

+ +
options + + +object +| + +boolean + + + + + + <optional>
+ + + + + +
+

options object or useCapture flag for +removeEventListener

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Interactable + + +
+
+ + +
+

This Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

on(types, listeneropt, optionsopt) → {Interactable}

+ + + + + +
+

Binds a listener for an InteractEvent, pointerEvent or DOM event.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
types + + +string +| + +array +| + +object + + + + + + + + + + +

The types of events to listen +for

+ +
listener + + +function +| + +array +| + +object + + + + + + <optional>
+ + + + + +
+

The event listener function(s)

+ +
options + + +object +| + +boolean + + + + + + <optional>
+ + + + + +
+

options object or useCapture flag for +addEventListener

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Interactable + + +
+
+ + +
+

This Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

origin(originopt) → {object}

+ + + + + +
+

Gets or sets the origin of the Interactable's element. The x and y +of the origin will be subtracted from action event coordinates.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
origin + + +Element +| + +object +| + +string + + + + + + <optional>
+ + + + + +
+

An HTML or SVG Element whose +rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self' +or any CSS selector

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +object + + +
+
+ + +
+

The current origin or this Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

rectChecker(checkeropt) → {function|object}

+ + + + + +
+

Returns or sets the function used to calculate the interactable's +element's rectangle

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
checker + + +function + + + + + + <optional>
+ + + + + +
+

A function which returns this Interactable's +bounding rectangle. See Interactable.getRect

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +function +| + +object + + +
+
+ + +
+

The checker function or this Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

reflow(action) → {Promise}

+ + + + + +
+
const interactable = interact(target)
+const drag = { name: drag, axis: 'x' }
+const resize = { name: resize, edges: { left: true, bottom: true }
+
+interactable.reflow(drag)
+interactable.reflow(resize)
+
+

Start an action sequence to re-apply modifiers, check drops, etc.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
action + + +Object + + + + +

The action to begin

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + +string + + + + +

The name of the action

+ +
+ + +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Promise + + +
+
+ + +
+

A promise that resolves to the Interactable when actions on all targets have ended

+
+ + +
+ + + +
+ + + +
+ + + +

resizable(optionsopt) → {boolean|Interactable}

+ + + + + +
+
interact(element).resizable({
+  onstart: function (event) {},
+  onmove : function (event) {},
+  onend  : function (event) {},
+
+  edges: {
+    top   : true,       // Use pointer coords to check for resize.
+    left  : false,      // Disable resizing from left edge.
+    bottom: '.resize-s',// Resize if pointer target matches selector
+    right : handleEl    // Resize if pointer target is the given Element
+  },
+
+    // Width and height can be adjusted independently. When `true`, width and
+    // height are adjusted at a 1:1 ratio.
+    square: false,
+
+    // Width and height can be adjusted independently. When `true`, width and
+    // height maintain the aspect ratio they had when resizing started.
+    preserveAspectRatio: false,
+
+  // a value of 'none' will limit the resize rect to a minimum of 0x0
+  // 'negate' will allow the rect to have negative width/height
+  // 'reposition' will keep the width/height positive by swapping
+  // the top and bottom edges and/or swapping the left and right edges
+  invert: 'none' || 'negate' || 'reposition'
+
+  // limit multiple resizes.
+  // See the explanation in the Interactable.draggable example
+  max: Infinity,
+  maxPerElement: 1,
+})
+
+var isResizeable = interact(element).resizable()
+
+

Gets or sets whether resize actions can be performed on the target

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
options + + +boolean +| + +object + + + + + + <optional>
+ + + + + +
+

true/false or An object with event +listeners to be fired on resize events (object makes the Interactable +resizable)

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +boolean +| + +Interactable + + +
+
+ + +
+

A boolean indicating if this can be the +target of resize elements, or this Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

set(options) → {object}

+ + + + + +
+

Reset the options of this Interactable

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +object + + + + +

The new settings to apply

+ +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +object + + +
+
+ + +
+

This Interactable

+
+ + +
+ + + +
+ + + +
+ + + +

unset() → {interact}

+ + + + + +
+

Remove this interactable from the list of interactables and remove it's +action capabilities and event listeners

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +interact + + +
+
+ + + +
+ + + +
+ + + + + + + +
+ +
+ + + + +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/Interaction_Interaction.html b/interactjs/dist/api/Interaction_Interaction.html new file mode 100644 index 000000000..c729760d8 --- /dev/null +++ b/interactjs/dist/api/Interaction_Interaction.html @@ -0,0 +1,167 @@ + + + + + + Interaction - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

Interaction

+ + + + + + + +
+ +
+ +

+ Interaction +

+ + +
+ +
+
+ + +
+ + + +

new Interaction()

+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/doclets.json b/interactjs/dist/api/doclets.json new file mode 100644 index 000000000..ec0bc8be8 --- /dev/null +++ b/interactjs/dist/api/doclets.json @@ -0,0 +1 @@ +[{"comment":"/** @article /home/travis/build/taye/interact.js/jsdoc/index.md **/","meta":{"filename":"index.md","lineno":1,"columnno":0,"path":"","code":{},"shortpath":"jsdoc/index.md"},"kind":"article","source":"\n\n","name":"index","filename":"index.md","title":"API Reference","longname":"article:index","description":"

","outfilename":"index.html","scope":"global","___id":"T000002R003590","___s":true,"attribs":"","id":"index","ancestors":[]},{"comment":"/**\n * Don't call listeners on the remaining targets\n */","meta":{"range":[460,563],"filename":"BaseEvent.ts","lineno":28,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100007762","name":"BaseEvent#stopImmediatePropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"@interactjs/core/BaseEvent.ts"},"description":"

Don't call listeners on the remaining targets

","name":"stopImmediatePropagation","longname":"BaseEvent#stopImmediatePropagation","kind":"function","memberof":"BaseEvent","scope":"instance","params":[],"___id":"T000002R000859","___s":true,"attribs":"","id":"stopImmediatePropagation","signature":"()","ancestors":[]},{"comment":"/**\n * Don't call any other listeners (even on the current target)\n */","meta":{"range":[333,392],"filename":"BaseEvent.ts","lineno":21,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100007752","name":"BaseEvent#stopPropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"@interactjs/core/BaseEvent.ts"},"description":"

Don't call any other listeners (even on the current target)

","name":"stopPropagation","longname":"BaseEvent#stopPropagation","kind":"function","memberof":"BaseEvent","scope":"instance","params":[],"___id":"T000002R000857","___s":true,"attribs":"","id":"stopPropagation","signature":"()","ancestors":[]},{"comment":"/**\n * Class of events fired on dropzones during drags with acceptable targets.\n */","meta":{"range":[297,757],"filename":"DropEvent.ts","lineno":16,"columnno":2,"path":"../@interactjs/actions/drop","code":{"id":"astnode100000545","name":"DropEvent","type":"MethodDefinition","paramnames":["dropState","dragEvent","type"]},"vars":{"":null},"shortpath":"@interactjs/actions/drop/DropEvent.ts"},"description":"

Class of events fired on dropzones during drags with acceptable targets.

","name":"DropEvent","longname":"DropEvent","kind":"class","scope":"global","params":[],"___id":"T000003R000002","___s":true,"attribs":"","id":"DropEvent","signature":"()","ancestors":[]},{"comment":"/**\n * If this is a `dropactivate` event, the dropzone element will be\n * deactivated.\n *\n * If this is a `dragmove` or `dragenter`, a `dragleave` will be fired on the\n * dropzone element and more.\n */","meta":{"range":[978,2017],"filename":"DropEvent.ts","lineno":36,"columnno":2,"path":"../@interactjs/actions/drop","code":{"id":"astnode100000629","name":"DropEvent#reject","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"@interactjs/actions/drop/DropEvent.ts"},"description":"

If this is a dropactivate event, the dropzone element will be\ndeactivated.

\n

If this is a dragmove or dragenter, a dragleave will be fired on the\ndropzone element and more.

","name":"reject","longname":"DropEvent#reject","kind":"function","memberof":"DropEvent","scope":"instance","params":[],"___id":"T000002R000071","___s":true,"attribs":"","id":"reject","signature":"()","ancestors":["DropEvent#"]},{"comment":"/**\n * ```js\n * interact('#draggable').draggable(true)\n *\n * var rectables = interact('rect')\n * rectables\n * .gesturable(true)\n * .on('gesturemove', function (event) {\n * // ...\n * })\n * ```\n *\n * The methods of this variable can be used to set elements as interactables\n * and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to configure\n * it.\n *\n * @global\n *\n * @param {Element | string} target The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\n */","meta":{"range":[1031,1317],"filename":"index.ts","lineno":51,"columnno":0,"path":"../@interactjs/interact","code":{"id":"astnode100016808","name":"exports.interact","type":"VariableDeclaration"},"shortpath":"@interactjs/interact/index.ts"},"description":"
interact('#draggable').draggable(true)\n\nvar rectables = interact('rect')\nrectables\n  .gesturable(true)\n  .on('gesturemove', function (event) {\n      // ...\n  })\n
\n

The methods of this variable can be used to set elements as interactables\nand also to change various default settings.

\n

Calling it as a function and passing an element or a valid CSS selector\nstring returns an Interactable object which has various methods to configure\nit.

","scope":"global","params":[{"type":{"names":["Element","string"]},"description":"

The HTML or SVG Element to interact with\nor CSS selector

","name":"target"}],"returns":[{"type":{"names":["Interactable"]}}],"name":"interact","longname":"interact","kind":"member","___id":"T000002R001835","___s":true,"attribs":"(constant) ","id":"interact","ancestors":[],"signature":""},{"comment":"/**\n * Returns or sets whether the dimensions of dropzone elements are calculated\n * on every dragmove or only on dragstart for the default dropChecker\n *\n * @param {boolean} [newValue] True to check on each move. False to check only\n * before start\n * @return {boolean | interact} The current setting or interact\n */","meta":{"range":[3523,3816],"filename":"index.ts","lineno":153,"columnno":2,"path":"../@interactjs/actions/drop","code":{"id":"astnode100000924","name":"interact.dynamicDrop","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"scope.dynamicDrop":"scope.dynamicDrop"},"shortpath":"@interactjs/actions/drop/index.ts"},"description":"

Returns or sets whether the dimensions of dropzone elements are calculated\non every dragmove or only on dragstart for the default dropChecker

","params":[{"type":{"names":["boolean"]},"optional":true,"description":"

True to check on each move. False to check only\nbefore start

","name":"newValue"}],"returns":[{"type":{"names":["boolean","interact"]},"description":"

The current setting or interact

"}],"name":"dynamicDrop","longname":"interact.dynamicDrop","kind":"function","memberof":"interact","scope":"static","___id":"T000002R000098","___s":true,"attribs":"(static) ","id":".dynamicDrop","signature":"(newValueopt) → {boolean|interact}","ancestors":["interact."]},{"comment":"/** */","meta":{"range":[761,1061],"filename":"Interactable.ts","lineno":26,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008098","name":"exports.Interactable","type":"MethodDefinition","paramnames":["target","options","defaultContext"]},"shortpath":"@interactjs/core/Interactable.ts"},"name":"Interactable","longname":"Interactable","kind":"class","memberof":"Interactable","scope":"instance","___id":"T000003R000003","___s":true,"attribs":"","id":"Interactable","signature":"()","ancestors":[]},{"comment":"/**\n * ```js\n * interact('.resize-drag')\n * .resizable(true)\n * .draggable(true)\n * .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n *\n * if (interact.matchesSelector(event.target, '.drag-handle')) {\n * // force drag with handle target\n * action.name = drag\n * }\n * else {\n * // resize from the top and right edges\n * action.name = 'resize'\n * action.edges = { top: true, right: true }\n * }\n *\n * return action\n * })\n * ```\n *\n * Returns or sets the function used to check action to be performed on\n * pointerDown\n *\n * @param {function | null} [checker] A function which takes a pointer event,\n * defaultAction string, interactable, element and interaction as parameters\n * and returns an object with name property 'drag' 'resize' or 'gesture' and\n * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n * props.\n * @return {Function | Interactable} The checker function or this Interactable\n */","meta":{"range":[3745,3797],"filename":"InteractableMethods.ts","lineno":113,"columnno":2,"path":"../@interactjs/auto-start","code":{"id":"astnode100007551","name":"Interactable.prototype.actionChecker","type":"Identifier","value":"actionChecker","paramnames":[]},"shortpath":"@interactjs/auto-start/InteractableMethods.ts"},"description":"
interact('.resize-drag')\n  .resizable(true)\n  .draggable(true)\n  .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n\n  if (interact.matchesSelector(event.target, '.drag-handle')) {\n    // force drag with handle target\n    action.name = drag\n  }\n  else {\n    // resize from the top and right edges\n    action.name  = 'resize'\n    action.edges = { top: true, right: true }\n  }\n\n  return action\n})\n
\n

Returns or sets the function used to check action to be performed on\npointerDown

","params":[{"type":{"names":["function","null"]},"optional":true,"description":"

A function which takes a pointer event,\ndefaultAction string, interactable, element and interaction as parameters\nand returns an object with name property 'drag' 'resize' or 'gesture' and\noptionally an edges object with boolean 'top', 'left', 'bottom' and right\nprops.

","name":"checker"}],"returns":[{"type":{"names":["function","Interactable"]},"description":"

The checker function or this Interactable

"}],"name":"actionChecker","longname":"Interactable#actionChecker","kind":"member","memberof":"Interactable","scope":"instance","___id":"T000002R000826","___s":true,"attribs":"","id":"actionChecker","ancestors":["#Interactable#"],"signature":""},{"comment":"/**\n * @deprecated\n *\n * A drag/resize/gesture is started only If the target of the `mousedown`,\n * `pointerdown` or `touchstart` event or any of it's parents match the given\n * CSS selector or Element.\n *\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * })\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to allow from any element\n * @return {string | Element | object} The current allowFrom value or this\n * Interactable\n */","meta":{"range":[2454,2681],"filename":"InteractableMethods.ts","lineno":86,"columnno":2,"path":"../@interactjs/auto-start","code":{"id":"astnode100007531","name":"Interactable.prototype.allowFrom","type":"CallExpression","value":"","paramnames":[]},"shortpath":"@interactjs/auto-start/InteractableMethods.ts"},"deprecated":"A drag/resize/gesture is started only If the target of the `mousedown`,\n`pointerdown` or `touchstart` event or any of it's parents match the given\nCSS selector or Element.\n\nDon't use this method. Instead set the `allowFrom` option for each action\nor for `pointerEvents`","examples":[{"caption":"","code":"interact(targett)\n .resizable({\n allowFrom: '.resize-handle',\n .pointerEvents({\n allowFrom: '.handle',,\n })"}],"params":[{"type":{"names":["string","Element","null"]},"optional":true,"description":"

a CSS selector string, an\nElement or null to allow from any element

","name":"newValue"}],"returns":[{"type":{"names":["string","Element","object"]},"description":"

The current allowFrom value or this\nInteractable

"}],"name":"allowFrom","longname":"Interactable#allowFrom","kind":"member","memberof":"Interactable","scope":"instance","___id":"T000002R000825","___s":true,"attribs":"","id":"allowFrom","ancestors":["#Interactable#"],"signature":""},{"comment":"/**\n * Gets the selector context Node of the Interactable. The default is\n * `window.document`.\n *\n * @return {Node} The context Node of this Interactable\n */","meta":{"range":[5762,5803],"filename":"Interactable.ts","lineno":194,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008632","name":"Interactable#context","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

Gets the selector context Node of the Interactable. The default is\nwindow.document.

","returns":[{"type":{"names":["Node"]},"description":"

The context Node of this Interactable

"}],"name":"context","longname":"Interactable#context","kind":"function","memberof":"Interactable","scope":"instance","params":[],"___id":"T000002R000937","___s":true,"attribs":"","id":"context","signature":"() → {Node}","ancestors":["#Interactable#"]},{"comment":"/**\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n * @param {string} [newValue] Use 'client' if you will be scrolling while\n * interacting; Use 'page' if you want autoScroll to work\n * @return {string | object} The current deltaSource or this Interactable\n */","meta":{"range":[5397,5586],"filename":"Interactable.ts","lineno":176,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008602","name":"Interactable#deltaSource","type":"MethodDefinition","paramnames":["newValue"]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

Returns or sets the mouse coordinate types used to calculate the\nmovement of the pointer.

","params":[{"type":{"names":["string"]},"optional":true,"description":"

Use 'client' if you will be scrolling while\ninteracting; Use 'page' if you want autoScroll to work

","name":"newValue"}],"returns":[{"type":{"names":["string","object"]},"description":"

The current deltaSource or this Interactable

"}],"name":"deltaSource","longname":"Interactable#deltaSource","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000935","___s":true,"attribs":"","id":"deltaSource","signature":"(newValueopt) → {string|object}","ancestors":["#Interactable#"]},{"comment":"/**\n * ```js\n * interact(element).draggable({\n * onstart: function (event) {},\n * onmove : function (event) {},\n * onend : function (event) {},\n *\n * // the axis in which the first movement must be\n * // for the drag sequence to start\n * // 'xy' by default - any direction\n * startAxis: 'x' || 'y' || 'xy',\n *\n * // 'xy' by default - don't restrict to one axis (move in any direction)\n * // 'x' or 'y' to restrict movement to either axis\n * // 'start' to restrict movement to the axis the drag started in\n * lockAxis: 'x' || 'y' || 'xy' || 'start',\n *\n * // max number of drags that can happen concurrently\n * // with elements of this Interactable. Infinity by default\n * max: Infinity,\n *\n * // max number of drags that can target the same element+Interactable\n * // 1 by default\n * maxPerElement: 2\n * })\n *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @alias Interactable.prototype.draggable\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\n */","meta":{"range":[2745,3317],"filename":"drag.ts","lineno":76,"columnno":6,"path":"../@interactjs/actions","code":{"id":"astnode100000303","name":"draggable","type":"FunctionExpression","value":"draggable"},"vars":{"this.options.drag.enabled":"Interactable#draggable#options.drag.enabled","this.options.drag.lockAxis":"Interactable#draggable#options.drag.lockAxis","this.options.drag.startAxis":"Interactable#draggable#options.drag.startAxis"},"shortpath":"@interactjs/actions/drag.ts"},"description":"
interact(element).draggable({\n    onstart: function (event) {},\n    onmove : function (event) {},\n    onend  : function (event) {},\n\n    // the axis in which the first movement must be\n    // for the drag sequence to start\n    // 'xy' by default - any direction\n    startAxis: 'x' || 'y' || 'xy',\n\n    // 'xy' by default - don't restrict to one axis (move in any direction)\n    // 'x' or 'y' to restrict movement to either axis\n    // 'start' to restrict movement to the axis the drag started in\n    lockAxis: 'x' || 'y' || 'xy' || 'start',\n\n    // max number of drags that can happen concurrently\n    // with elements of this Interactable. Infinity by default\n    max: Infinity,\n\n    // max number of drags that can target the same element+Interactable\n    // 1 by default\n    maxPerElement: 2\n})\n\nvar isDraggable = interact('element').draggable(); // true\n
\n

Get or set whether drag actions can be performed on the target

","alias":"Interactable.prototype.draggable","params":[{"type":{"names":["boolean","object"]},"optional":true,"description":"

true/false or An object with event\nlisteners to be fired on drag events (object makes the Interactable\ndraggable)

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

boolean indicating if this can be the\ntarget of drag events, or this Interctable

"}],"name":"draggable","longname":"Interactable#draggable","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000029","___s":true,"attribs":"","id":"draggable","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["#Interactable#"]},{"comment":"/**\n * ```js\n * interact(target)\n * .dropChecker(function(dragEvent, // related dragmove or dragend event\n * event, // TouchEvent/PointerEvent/MouseEvent\n * dropped, // bool result of the default checker\n * dropzone, // dropzone Interactable\n * dropElement, // dropzone elemnt\n * draggable, // draggable Interactable\n * draggableElement) {// draggable element\n *\n * return dropped && event.target.hasAttribute('allow-drop')\n * }\n * ```\n */","meta":{"range":[2967,3183],"filename":"index.ts","lineno":134,"columnno":2,"path":"../@interactjs/actions/drop","code":{"id":"astnode100000899","name":"Interactable.prototype.dropCheck","type":"FunctionExpression","paramnames":["dragEvent","event","draggable","draggableElement","dropElement","rect"]},"shortpath":"@interactjs/actions/drop/index.ts"},"description":"
interact(target)\n.dropChecker(function(dragEvent,         // related dragmove or dragend event\n                      event,             // TouchEvent/PointerEvent/MouseEvent\n                      dropped,           // bool result of the default checker\n                      dropzone,          // dropzone Interactable\n                      dropElement,       // dropzone elemnt\n                      draggable,         // draggable Interactable\n                      draggableElement) {// draggable element\n\n  return dropped && event.target.hasAttribute('allow-drop')\n}\n
","name":"dropCheck","longname":"Interactable#dropCheck","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000097","___s":true,"attribs":"","id":"dropCheck","signature":"()","ancestors":["#Interactable#"]},{"comment":"/**\n *\n * ```js\n * interact('.drop').dropzone({\n * accept: '.can-drop' || document.getElementById('single-drop'),\n * overlap: 'pointer' || 'center' || zeroToOne\n * }\n * ```\n *\n * Returns or sets whether draggables can be dropped onto this target to\n * trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged element\n * is over this Interactable.\n *\n * @param {boolean | object | null} [options] The new options to be set.\n * @return {boolean | Interactable} The current setting or this Interactable\n */","meta":{"range":[2204,2304],"filename":"index.ts","lineno":90,"columnno":2,"path":"../@interactjs/actions/drop","code":{"id":"astnode100000884","name":"Interactable.prototype.dropzone","type":"FunctionExpression","paramnames":["options"]},"shortpath":"@interactjs/actions/drop/index.ts"},"description":"
interact('.drop').dropzone({\n  accept: '.can-drop' || document.getElementById('single-drop'),\n  overlap: 'pointer' || 'center' || zeroToOne\n}\n
\n

Returns or sets whether draggables can be dropped onto this target to\ntrigger drop events

\n

Dropzones can receive the following events:

\n
    \n
  • dropactivate and dropdeactivate when an acceptable drag starts and ends
  • \n
  • dragenter and dragleave when a draggable enters and leaves the dropzone
  • \n
  • dragmove when a draggable that has entered the dropzone is moved
  • \n
  • drop when a draggable is dropped into this dropzone
  • \n
\n

Use the accept option to allow only elements that match the given CSS\nselector or element. The value can be:

\n
    \n
  • an Element - only that element can be dropped into this dropzone.
  • \n
  • a string, - the element being dragged must match it as a CSS selector.
  • \n
  • null - accept options is cleared - it accepts any element.
  • \n
\n

Use the overlap option to set how drops are checked for. The allowed\nvalues are:

\n
    \n
  • 'pointer', the pointer must be over the dropzone (default)
  • \n
  • 'center', the draggable element's center must be over the dropzone
  • \n
  • a number from 0-1 which is the (intersection area) / (draggable area).\ne.g. 0.5 for drop to happen when half of the area of the draggable is\nover the dropzone
  • \n
\n

Use the checker option to specify a function to check if a dragged element\nis over this Interactable.

","params":[{"type":{"names":["boolean","object","null"]},"optional":true,"description":"

The new options to be set.

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

The current setting or this Interactable

"}],"name":"dropzone","longname":"Interactable#dropzone","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000096","___s":true,"attribs":"","id":"dropzone","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["#Interactable#"]},{"comment":"/**\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n * Interactable\n * @return {Interactable} this Interactable\n */","meta":{"range":[7085,7150],"filename":"Interactable.ts","lineno":257,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008785","name":"Interactable#fire","type":"MethodDefinition","paramnames":["iEvent"]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

Calls listeners for the given InteractEvent type bound globally\nand directly to this Interactable

","params":[{"type":{"names":["InteractEvent"]},"description":"

The InteractEvent object to be fired on this\nInteractable

","name":"iEvent"}],"returns":[{"type":{"names":["Interactable"]},"description":"

this Interactable

"}],"name":"fire","longname":"Interactable#fire","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000942","___s":true,"attribs":"","id":"fire","signature":"(iEvent) → {Interactable}","ancestors":["#Interactable#"]},{"comment":"/**\n * ```js\n * interact(element).gesturable({\n * onstart: function (event) {},\n * onmove : function (event) {},\n * onend : function (event) {},\n *\n * // limit multiple gestures.\n * // See the explanation in {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * })\n *\n * var isGestureable = interact(element).gesturable()\n * ```\n *\n * Gets or sets whether multitouch gestures can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on gesture events (makes the Interactable gesturable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of gesture events, or this Interactable\n */","meta":{"range":[942,1356],"filename":"gesture.ts","lineno":57,"columnno":2,"path":"../@interactjs/actions","code":{"id":"astnode100002843","name":"Interactable.prototype.gesturable","type":"FunctionExpression","paramnames":["options"]},"vars":{"this.options.gesture.enabled":"Interactable#gesturable#options.gesture.enabled"},"shortpath":"@interactjs/actions/gesture.ts"},"description":"
interact(element).gesturable({\n    onstart: function (event) {},\n    onmove : function (event) {},\n    onend  : function (event) {},\n\n    // limit multiple gestures.\n    // See the explanation in {@link Interactable.draggable} example\n    max: Infinity,\n    maxPerElement: 1,\n})\n\nvar isGestureable = interact(element).gesturable()\n
\n

Gets or sets whether multitouch gestures can be performed on the target

","params":[{"type":{"names":["boolean","object"]},"optional":true,"description":"

true/false or An object with event\nlisteners to be fired on gesture events (makes the Interactable gesturable)

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

A boolean indicating if this can be the\ntarget of gesture events, or this Interactable

"}],"name":"gesturable","longname":"Interactable#gesturable","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000282","___s":true,"attribs":"","id":"gesturable","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["#Interactable#"]},{"comment":"/**\n * The default function to get an Interactables bounding rect. Can be\n * overridden using {@link Interactable.rectChecker}.\n *\n * @param {Element} [element] The element to measure.\n * @return {object} The object's bounding rectangle.\n */","meta":{"range":[3463,3705],"filename":"Interactable.ts","lineno":105,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008452","name":"Interactable#getRect","type":"MethodDefinition","paramnames":["element"]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

The default function to get an Interactables bounding rect. Can be\noverridden using {@link Interactable.rectChecker}.

","params":[{"type":{"names":["Element"]},"optional":true,"description":"

The element to measure.

","name":"element"}],"returns":[{"type":{"names":["object"]},"description":"

The object's bounding rectangle.

"}],"name":"getRect","longname":"Interactable#getRect","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000925","___s":true,"attribs":"","id":"getRect","signature":"(elementopt) → {object}","ancestors":["#Interactable#"]},{"comment":"/**\n * ```js\n * interact(element, { ignoreFrom: document.getElementById('no-action') })\n * // or\n * interact(element).ignoreFrom('input, textarea, a')\n * ```\n * @deprecated\n * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n * of it's parents match the given CSS selector or Element, no\n * drag/resize/gesture is started.\n *\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * })\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to not ignore any elements\n * @return {string | Element | object} The current ignoreFrom value or this\n * Interactable\n */","meta":{"range":[1495,1726],"filename":"InteractableMethods.ts","lineno":54,"columnno":2,"path":"../@interactjs/auto-start","code":{"id":"astnode100007511","name":"Interactable.prototype.ignoreFrom","type":"CallExpression","value":"","paramnames":[]},"shortpath":"@interactjs/auto-start/InteractableMethods.ts"},"description":"
interact(element, { ignoreFrom: document.getElementById('no-action') })\n// or\ninteract(element).ignoreFrom('input, textarea, a')\n
","deprecated":"If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\nof it's parents match the given CSS selector or Element, no\ndrag/resize/gesture is started.\n\nDon't use this method. Instead set the `ignoreFrom` option for each action\nor for `pointerEvents`","examples":[{"caption":"","code":"interact(targett)\n .draggable({\n ignoreFrom: 'input, textarea, a[href]'',\n })\n .pointerEvents({\n ignoreFrom: '[no-pointer]',\n })"}],"params":[{"type":{"names":["string","Element","null"]},"optional":true,"description":"

a CSS selector string, an\nElement or null to not ignore any elements

","name":"newValue"}],"returns":[{"type":{"names":["string","Element","object"]},"description":"

The current ignoreFrom value or this\nInteractable

"}],"name":"ignoreFrom","longname":"Interactable#ignoreFrom","kind":"member","memberof":"Interactable","scope":"instance","___id":"T000002R000824","___s":true,"attribs":"","id":"ignoreFrom","ancestors":["#Interactable#"],"signature":""},{"comment":"/**\n * Removes an InteractEvent, pointerEvent or DOM event listener.\n *\n * @param {string | array | object} types The types of events that were\n * listened for\n * @param {function | array | object} [listener] The event listener function(s)\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {Interactable} This Interactable\n */","meta":{"range":[9014,9106],"filename":"Interactable.ts","lineno":316,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008944","name":"Interactable#off","type":"MethodDefinition","paramnames":["types","listener","options"]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

Removes an InteractEvent, pointerEvent or DOM event listener.

","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events that were\nlistened for

","name":"types"},{"type":{"names":["function","array","object"]},"optional":true,"description":"

The event listener function(s)

","name":"listener"},{"type":{"names":["object","boolean"]},"optional":true,"description":"

options object or useCapture flag for\nremoveEventListener

","name":"options"}],"returns":[{"type":{"names":["Interactable"]},"description":"

This Interactable

"}],"name":"off","longname":"Interactable#off","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000952","___s":true,"attribs":"","id":"off","signature":"(types, listeneropt, optionsopt) → {Interactable}","ancestors":["#Interactable#"]},{"comment":"/**\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} types The types of events to listen\n * for\n * @param {function | array | object} [listener] The event listener function(s)\n * @param {object | boolean} [options] options object or useCapture flag for\n * addEventListener\n * @return {Interactable} This Interactable\n */","meta":{"range":[8511,8601],"filename":"Interactable.ts","lineno":302,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008928","name":"Interactable#on","type":"MethodDefinition","paramnames":["types","listener","options"]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

Binds a listener for an InteractEvent, pointerEvent or DOM event.

","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events to listen\nfor

","name":"types"},{"type":{"names":["function","array","object"]},"optional":true,"description":"

The event listener function(s)

","name":"listener"},{"type":{"names":["object","boolean"]},"optional":true,"description":"

options object or useCapture flag for\naddEventListener

","name":"options"}],"returns":[{"type":{"names":["Interactable"]},"description":"

This Interactable

"}],"name":"on","longname":"Interactable#on","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000951","___s":true,"attribs":"","id":"on","signature":"(types, listeneropt, optionsopt) → {Interactable}","ancestors":["#Interactable#"]},{"comment":"/**\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n * @param {Element | object | string} [origin] An HTML or SVG Element whose\n * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n * or any CSS selector\n *\n * @return {object} The current origin or this Interactable\n */","meta":{"range":[4986,5063],"filename":"Interactable.ts","lineno":162,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008590","name":"Interactable#origin","type":"MethodDefinition","paramnames":["newValue"]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

Gets or sets the origin of the Interactable's element. The x and y\nof the origin will be subtracted from action event coordinates.

","params":[{"type":{"names":["Element","object","string"]},"optional":true,"description":"

An HTML or SVG Element whose\nrect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\nor any CSS selector

","name":"origin"}],"returns":[{"type":{"names":["object"]},"description":"

The current origin or this Interactable

"}],"name":"origin","longname":"Interactable#origin","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000934","___s":true,"attribs":"","id":"origin","signature":"(originopt) → {object}","ancestors":["#Interactable#"]},{"comment":"/**\n * Returns or sets whether to prevent the browser's default behaviour in\n * response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n * @param {string} [newValue] `'always'`, `'never'` or `'auto'`\n * @return {string | Interactable} The current setting or this Interactable\n */","meta":{"range":[2356,2410],"filename":"interactablePreventDefault.ts","lineno":78,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100009411","name":"Interactable.prototype.preventDefault","type":"Identifier","value":"preventDefault","paramnames":[]},"shortpath":"@interactjs/core/interactablePreventDefault.ts"},"description":"

Returns or sets whether to prevent the browser's default behaviour in\nresponse to pointer events. Can be set to:

\n
    \n
  • 'always' to always prevent
  • \n
  • 'never' to never prevent
  • \n
  • 'auto' to let interact.js try to determine what would be best
  • \n
","params":[{"type":{"names":["string"]},"optional":true,"description":"

'always', 'never' or 'auto'

","name":"newValue"}],"returns":[{"type":{"names":["string","Interactable"]},"description":"

The current setting or this Interactable

"}],"name":"preventDefault","longname":"Interactable#preventDefault","kind":"member","memberof":"Interactable","scope":"instance","___id":"T000002R000980","___s":true,"attribs":"","id":"preventDefault","ancestors":["#Interactable#"],"signature":""},{"comment":"/**\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n * @param {function} [checker] A function which returns this Interactable's\n * bounding rectangle. See {@link Interactable.getRect}\n * @return {function | object} The checker function or this Interactable\n */","meta":{"range":[4034,4250],"filename":"Interactable.ts","lineno":124,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008501","name":"Interactable#rectChecker","type":"MethodDefinition","paramnames":["checker"]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

Returns or sets the function used to calculate the interactable's\nelement's rectangle

","params":[{"type":{"names":["function"]},"optional":true,"description":"

A function which returns this Interactable's\nbounding rectangle. See {@link Interactable.getRect}

","name":"checker"}],"returns":[{"type":{"names":["function","object"]},"description":"

The checker function or this Interactable

"}],"name":"rectChecker","longname":"Interactable#rectChecker","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000928","___s":true,"attribs":"","id":"rectChecker","signature":"(checkeropt) → {function|object}","ancestors":["#Interactable#"]},{"comment":"/**\n * ```js\n * const interactable = interact(target)\n * const drag = { name: drag, axis: 'x' }\n * const resize = { name: resize, edges: { left: true, bottom: true }\n *\n * interactable.reflow(drag)\n * interactable.reflow(resize)\n * ```\n *\n * Start an action sequence to re-apply modifiers, check drops, etc.\n *\n * @param { Object } action The action to begin\n * @param { string } action.name The name of the action\n * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended\n */","meta":{"range":[973,1068],"filename":"index.ts","lineno":35,"columnno":2,"path":"../@interactjs/reflow","code":{"id":"astnode100024630","name":"Interactable.prototype.reflow","type":"FunctionExpression","paramnames":["action"]},"shortpath":"@interactjs/reflow/index.ts"},"description":"
const interactable = interact(target)\nconst drag = { name: drag, axis: 'x' }\nconst resize = { name: resize, edges: { left: true, bottom: true }\n\ninteractable.reflow(drag)\ninteractable.reflow(resize)\n
\n

Start an action sequence to re-apply modifiers, check drops, etc.

","params":[{"type":{"names":["Object"]},"description":"

The action to begin

","name":"action","subparams":[{"type":{"names":["string"]},"description":"

The name of the action

","name":"name"}]},null],"returns":[{"type":{"names":["Promise"]},"description":"

A promise that resolves to the Interactable when actions on all targets have ended

"}],"name":"reflow","longname":"Interactable#reflow","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R002850","___s":true,"attribs":"","id":"reflow","signature":"(action) → {Promise}","ancestors":["#Interactable#"]},{"comment":"/**\n * ```js\n * interact(element).resizable({\n * onstart: function (event) {},\n * onmove : function (event) {},\n * onend : function (event) {},\n *\n * edges: {\n * top : true, // Use pointer coords to check for resize.\n * left : false, // Disable resizing from left edge.\n * bottom: '.resize-s',// Resize if pointer target matches selector\n * right : handleEl // Resize if pointer target is the given Element\n * },\n *\n * // Width and height can be adjusted independently. When `true`, width and\n * // height are adjusted at a 1:1 ratio.\n * square: false,\n *\n * // Width and height can be adjusted independently. When `true`, width and\n * // height maintain the aspect ratio they had when resizing started.\n * preserveAspectRatio: false,\n *\n * // a value of 'none' will limit the resize rect to a minimum of 0x0\n * // 'negate' will allow the rect to have negative width/height\n * // 'reposition' will keep the width/height positive by swapping\n * // the top and bottom edges and/or swapping the left and right edges\n * invert: 'none' || 'negate' || 'reposition'\n *\n * // limit multiple resizes.\n * // See the explanation in the {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * })\n *\n * var isResizeable = interact(element).resizable()\n * ```\n *\n * Gets or sets whether resize actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on resize events (object makes the Interactable\n * resizable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of resize elements, or this Interactable\n */","meta":{"range":[2374,2477],"filename":"resize.ts","lineno":55,"columnno":2,"path":"../@interactjs/actions","code":{"id":"astnode100003498","name":"Interactable.prototype.resizable","type":"FunctionExpression","paramnames":["options"]},"shortpath":"@interactjs/actions/resize.ts"},"description":"
interact(element).resizable({\n  onstart: function (event) {},\n  onmove : function (event) {},\n  onend  : function (event) {},\n\n  edges: {\n    top   : true,       // Use pointer coords to check for resize.\n    left  : false,      // Disable resizing from left edge.\n    bottom: '.resize-s',// Resize if pointer target matches selector\n    right : handleEl    // Resize if pointer target is the given Element\n  },\n\n    // Width and height can be adjusted independently. When `true`, width and\n    // height are adjusted at a 1:1 ratio.\n    square: false,\n\n    // Width and height can be adjusted independently. When `true`, width and\n    // height maintain the aspect ratio they had when resizing started.\n    preserveAspectRatio: false,\n\n  // a value of 'none' will limit the resize rect to a minimum of 0x0\n  // 'negate' will allow the rect to have negative width/height\n  // 'reposition' will keep the width/height positive by swapping\n  // the top and bottom edges and/or swapping the left and right edges\n  invert: 'none' || 'negate' || 'reposition'\n\n  // limit multiple resizes.\n  // See the explanation in the {@link Interactable.draggable} example\n  max: Infinity,\n  maxPerElement: 1,\n})\n\nvar isResizeable = interact(element).resizable()\n
\n

Gets or sets whether resize actions can be performed on the target

","params":[{"type":{"names":["boolean","object"]},"optional":true,"description":"

true/false or An object with event\nlisteners to be fired on resize events (object makes the Interactable\nresizable)

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

A boolean indicating if this can be the\ntarget of resize elements, or this Interactable

"}],"name":"resizable","longname":"Interactable#resizable","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000358","___s":true,"attribs":"","id":"resizable","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["#Interactable#"]},{"comment":"/**\n * Reset the options of this Interactable\n *\n * @param {object} options The new settings to apply\n * @return {object} This Interactable\n */","meta":{"range":[9267,9924],"filename":"Interactable.ts","lineno":330,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100008960","name":"Interactable#set","type":"MethodDefinition","paramnames":["options"]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

Reset the options of this Interactable

","params":[{"type":{"names":["object"]},"description":"

The new settings to apply

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

This Interactable

"}],"name":"set","longname":"Interactable#set","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000953","___s":true,"attribs":"","id":"set","signature":"(options) → {object}","ancestors":["#Interactable#"]},{"comment":"/**\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n * @param {boolean} [newValue]\n * @return {boolean | Interactable} The current setting or this Interactable\n */","meta":{"range":[4085,4133],"filename":"InteractableMethods.ts","lineno":146,"columnno":2,"path":"../@interactjs/auto-start","code":{"id":"astnode100007559","name":"Interactable.prototype.styleCursor","type":"Identifier","value":"styleCursor","paramnames":[]},"shortpath":"@interactjs/auto-start/InteractableMethods.ts"},"description":"

Returns or sets whether the the cursor should be changed depending on the\naction that would be performed if the mouse were pressed and dragged.

","params":[{"type":{"names":["boolean"]},"optional":true,"name":"newValue"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

The current setting or this Interactable

"}],"name":"styleCursor","longname":"Interactable#styleCursor","kind":"member","memberof":"Interactable","scope":"instance","___id":"T000002R000827","___s":true,"attribs":"","id":"styleCursor","ancestors":["#Interactable#"],"signature":""},{"comment":"/**\n * Remove this interactable from the list of interactables and remove it's\n * action capabilities and event listeners\n *\n * @return {interact}\n */","meta":{"range":[10092,10773],"filename":"Interactable.ts","lineno":364,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100009077","name":"Interactable#unset","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"@interactjs/core/Interactable.ts"},"description":"

Remove this interactable from the list of interactables and remove it's\naction capabilities and event listeners

","returns":[{"type":{"names":["interact"]}}],"name":"unset","longname":"Interactable#unset","kind":"function","memberof":"Interactable","scope":"instance","params":[],"___id":"T000002R000962","___s":true,"attribs":"","id":"unset","signature":"() → {interact}","ancestors":["#Interactable#"]},{"comment":"/** */","meta":{"range":[310,2646],"filename":"InteractEvent.ts","lineno":10,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100009980","name":"exports.InteractEvent","type":"MethodDefinition","paramnames":["interaction","event","actionName","phase","element","preEnd","type"]},"vars":{"":null},"shortpath":"@interactjs/core/InteractEvent.ts"},"name":"InteractEvent","longname":"InteractEvent#InteractEvent","kind":"class","memberof":"InteractEvent","scope":"instance","params":[],"___id":"T000003R000004","___s":true,"attribs":"","id":"InteractEvent","signature":"()","ancestors":[]},{"comment":"/**\n * Don't call listeners on the remaining targets\n */","meta":{"range":[4437,4540],"filename":"InteractEvent.ts","lineno":190,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100010817","name":"InteractEvent#stopImmediatePropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"@interactjs/core/InteractEvent.ts"},"description":"

Don't call listeners on the remaining targets

","name":"stopImmediatePropagation","longname":"InteractEvent#stopImmediatePropagation","kind":"function","memberof":"InteractEvent","scope":"instance","params":[],"___id":"T000002R001120","___s":true,"attribs":"","id":"stopImmediatePropagation","signature":"()","ancestors":[]},{"comment":"/**\n * Don't call any other listeners (even on the current target)\n */","meta":{"range":[4622,4681],"filename":"InteractEvent.ts","lineno":197,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100010831","name":"InteractEvent#stopPropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"@interactjs/core/InteractEvent.ts"},"description":"

Don't call any other listeners (even on the current target)

","name":"stopPropagation","longname":"InteractEvent#stopPropagation","kind":"function","memberof":"InteractEvent","scope":"instance","params":[],"___id":"T000002R001123","___s":true,"attribs":"","id":"stopPropagation","signature":"()","ancestors":[]},{"comment":"/**\n * ```js\n * interact(target)\n * .draggable(true)\n * .on('move', function (event) {\n * if (event.pageX > 1000) {\n * // end the current action\n * event.interaction.end()\n * // stop all further listeners from being called\n * event.stopImmediatePropagation()\n * }\n * })\n * ```\n *\n * @param {PointerEvent} [event]\n */","meta":{"range":[8865,9215],"filename":"Interaction.ts","lineno":406,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100011835","name":"Interaction#end","type":"MethodDefinition","paramnames":["event"]},"vars":{"":null},"shortpath":"@interactjs/core/Interaction.ts"},"description":"
interact(target)\n  .draggable(true)\n  .on('move', function (event) {\n    if (event.pageX > 1000) {\n      // end the current action\n      event.interaction.end()\n      // stop all further listeners from being called\n      event.stopImmediatePropagation()\n    }\n  })\n
","params":[{"type":{"names":["PointerEvent"]},"optional":true,"name":"event"}],"name":"end","longname":"Interaction#end","kind":"function","memberof":"Interaction","scope":"instance","___id":"T000002R001256","___s":true,"attribs":"","id":"end","signature":"(eventopt)","ancestors":[]},{"comment":"/** */","meta":{"range":[2148,2701],"filename":"Interaction.ts","lineno":83,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100011062","name":"exports.Interaction","type":"MethodDefinition","paramnames":[""]},"vars":{"":null},"shortpath":"@interactjs/core/Interaction.ts"},"name":"Interaction","longname":"Interaction#Interaction","kind":"class","memberof":"Interaction","scope":"instance","params":[],"___id":"T000003R000005","___s":true,"attribs":"","id":"Interaction","signature":"()","ancestors":[]},{"comment":"/**\n * @alias Interaction.prototype.move\n */","meta":{"range":[1521,1673],"filename":"Interaction.ts","lineno":159,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100011007","name":"doMove","type":"ClassProperty"},"shortpath":"@interactjs/core/Interaction.ts"},"alias":"Interaction.prototype.move","name":"move","longname":"Interaction#move","kind":"member","memberof":"Interaction","scope":"instance","___id":"T000002R001168","___s":true,"attribs":"","id":"move","ancestors":[],"signature":""},{"comment":"/**\n * ```js\n * interact(target)\n * .draggable(true)\n * .on('dragmove', function (event) {\n * if (someCondition) {\n * // change the snap settings\n * event.interactable.draggable({ snap: { targets: [] }})\n * // fire another move event with re-calculated snap\n * event.interaction.move()\n * }\n * })\n * ```\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n */","meta":{"range":[7171,7572],"filename":"Interaction.ts","lineno":337,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100011641","name":"Interaction#move","type":"MethodDefinition","paramnames":["signalArg"]},"vars":{"":null},"shortpath":"@interactjs/core/Interaction.ts"},"description":"
interact(target)\n  .draggable(true)\n  .on('dragmove', function (event) {\n    if (someCondition) {\n      // change the snap settings\n      event.interactable.draggable({ snap: { targets: [] }})\n      // fire another move event with re-calculated snap\n      event.interaction.move()\n    }\n  })\n
\n

Force a move of the current action at the same coordinates. Useful if\nsnap/restrict has been changed and you want a movement with the new\nsettings.

","name":"move","longname":"Interaction#move","kind":"function","memberof":"Interaction","scope":"instance","params":[],"___id":"T000002R001232","___s":true,"attribs":"","id":"move","signature":"()","ancestors":[]},{"comment":"/**\n * ```js\n * interact(target)\n * .draggable({\n * // disable the default drag start by down->move\n * manualStart: true\n * })\n * // start dragging after the user holds the pointer down\n * .on('hold', function (event) {\n * var interaction = event.interaction\n *\n * if (!interaction.interacting()) {\n * interaction.start({ name: 'drag' },\n * event.interactable,\n * event.currentTarget)\n * }\n * })\n * ```\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate\n * number of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n * @param {object} action The action to be performed - drag, resize, etc.\n * @param {Interactable} target The Interactable to target\n * @param {Element} element The DOM Element to target\n * @return {object} interact\n */","meta":{"range":[4228,4975],"filename":"Interaction.ts","lineno":225,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100011198","name":"Interaction#start","type":"MethodDefinition","paramnames":["action","interactable","element"]},"vars":{"":null},"shortpath":"@interactjs/core/Interaction.ts"},"description":"
interact(target)\n  .draggable({\n    // disable the default drag start by down->move\n    manualStart: true\n  })\n  // start dragging after the user holds the pointer down\n  .on('hold', function (event) {\n    var interaction = event.interaction\n\n    if (!interaction.interacting()) {\n      interaction.start({ name: 'drag' },\n                        event.interactable,\n                        event.currentTarget)\n    }\n})\n
\n

Start an action with the given Interactable and Element as tartgets. The\naction must be enabled for the target Interactable and an appropriate\nnumber of pointers must be held down - 1 for drag/resize, 2 for gesture.

\n

Use it with interactable.<action>able({ manualStart: false }) to always\nstart actions manually

","params":[{"type":{"names":["object"]},"description":"

The action to be performed - drag, resize, etc.

","name":"action"},{"type":{"names":["Interactable"]},"description":"

The Interactable to target

","name":"target"},{"type":{"names":["Element"]},"description":"

The DOM Element to target

","name":"element"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"start","longname":"Interaction#start","kind":"function","memberof":"Interaction","scope":"instance","___id":"T000002R001198","___s":true,"attribs":"","id":"start","signature":"(action, target, element) → {object}","ancestors":[]},{"comment":"/** */","meta":{"range":[9365,9603],"filename":"Interaction.ts","lineno":353,"columnno":2,"path":"../@interactjs/core","code":{"id":"astnode100011918","name":"Interaction#stop","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"@interactjs/core/Interaction.ts"},"name":"stop","longname":"Interaction#stop","kind":"function","memberof":"Interaction","scope":"instance","params":[],"___id":"T000002R001267","___s":true,"attribs":"","id":"stop","signature":"()","ancestors":[]},{"comment":"/** */","meta":{"range":[163,1146],"filename":"PointerEvent.ts","lineno":5,"columnno":2,"path":"../@interactjs/pointer-events","code":{"id":"astnode100024328","name":"module.exports","type":"MethodDefinition","paramnames":["type","pointer","event","eventTarget","interaction","timeStamp"]},"vars":{"":null},"shortpath":"@interactjs/pointer-events/PointerEvent.ts"},"name":"exports","longname":"module.exports#module.exports","kind":"class","memberof":"module.exports#module","scope":"static","params":[],"___id":"T000003R000006","___s":true,"attribs":"","id":"exports","signature":"()","ancestors":[]},{"comment":"/** @module interact */","meta":{"filename":"index.ts","lineno":1,"columnno":0,"path":"../@interactjs/interact","code":{},"shortpath":"@interactjs/interact/index.ts"},"kind":"module","name":"interact","longname":"module:interact","___id":"T000004R000002","___s":true,"attribs":"","id":"interact","ancestors":[],"modules":[]},{"comment":"/**\n * Check if an element or selector has been set with the {@link interact}\n * function\n *\n * @alias module:interact.isSet\n *\n * @param {Element} element The Element being searched for\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n */","meta":{"range":[1865,1887],"filename":"index.ts","lineno":103,"columnno":0,"path":"../@interactjs/interact","code":{"id":"astnode100016874","name":"interact.isSet","type":"Identifier","value":"isSet","paramnames":[]},"shortpath":"@interactjs/interact/index.ts"},"description":"

Check if an element or selector has been set with the {@link interact}\nfunction

","alias":"module:interact.isSet","params":[{"type":{"names":["Element"]},"description":"

The Element being searched for

","name":"element"}],"returns":[{"type":{"names":["boolean"]},"description":"

Indicates if the element or CSS selector was previously\npassed to interact

"}],"name":"isSet","longname":"module:interact.isSet","kind":"member","memberof":"module:interact","scope":"static","___id":"T000002R001842","___s":true,"attribs":"(static) ","id":".isSet","ancestors":["interact."],"signature":""},{"comment":"/**\n * Returns or sets the maximum number of concurrent interactions allowed. By\n * default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables and\n * elements, you need to enable it in the draggable, resizable and gesturable\n * `'max'` and `'maxPerElement'` options.\n *\n * @alias module:interact.maxInteractions\n *\n * @param {number} [newValue] Any number. newValue <= 0 means no interactions.\n */","meta":{"range":[1106,1177],"filename":"base.ts","lineno":82,"columnno":2,"path":"../@interactjs/auto-start","code":{"id":"astnode100005955","name":"interact.maxInteractions","type":"ArrowFunctionExpression","paramnames":["newValue"]},"shortpath":"@interactjs/auto-start/base.ts"},"description":"

Returns or sets the maximum number of concurrent interactions allowed. By\ndefault only 1 interaction is allowed at a time (for backwards\ncompatibility). To allow multiple interactions on the same Interactables and\nelements, you need to enable it in the draggable, resizable and gesturable\n'max' and 'maxPerElement' options.

","alias":"module:interact.maxInteractions","params":[{"type":{"names":["number"]},"optional":true,"description":"

Any number. newValue <= 0 means no interactions.

","name":"newValue"}],"name":"maxInteractions","longname":"module:interact.maxInteractions","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R000661","___s":true,"attribs":"(static) ","id":".maxInteractions","signature":"(newValueopt)","ancestors":["interact."]},{"comment":"/**\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n * @alias module:interact.off\n *\n * @param {string | array | object} type The types of events that were listened\n * for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} options [options] object or useCapture flag for\n * removeEventListener\n * @return {object} interact\n */","meta":{"range":[3680,3698],"filename":"index.ts","lineno":169,"columnno":0,"path":"../@interactjs/interact","code":{"id":"astnode100017039","name":"interact.off","type":"Identifier","value":"off","paramnames":[]},"shortpath":"@interactjs/interact/index.ts"},"description":"

Removes a global InteractEvent listener or DOM event from document

","alias":"module:interact.off","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events that were listened\nfor

","name":"type"},{"type":{"names":["function"]},"description":"

The listener function to be removed

","name":"listener"},{"type":{"names":["object","boolean"]},"description":"

[options] object or useCapture flag for\nremoveEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"off","longname":"module:interact.off","kind":"member","memberof":"module:interact","scope":"static","___id":"T000002R001851","___s":true,"attribs":"(static) ","id":".off","ancestors":["interact."],"signature":""},{"comment":"/**\n * Add a global listener for an InteractEvent or adds a DOM event to `document`\n *\n * @alias module:interact.on\n *\n * @param {string | array | object} type The types of events to listen for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] object or useCapture flag for\n * addEventListener\n * @return {object} interact\n */","meta":{"range":[2369,2385],"filename":"index.ts","lineno":118,"columnno":0,"path":"../@interactjs/interact","code":{"id":"astnode100016900","name":"interact.on","type":"Identifier","value":"on","paramnames":[]},"shortpath":"@interactjs/interact/index.ts"},"description":"

Add a global listener for an InteractEvent or adds a DOM event to document

","alias":"module:interact.on","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events to listen for

","name":"type"},{"type":{"names":["function"]},"description":"

The function event (s)

","name":"listener"},{"type":{"names":["object","boolean"]},"optional":true,"description":"

object or useCapture flag for\naddEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"on","longname":"module:interact.on","kind":"member","memberof":"module:interact","scope":"static","___id":"T000002R001844","___s":true,"attribs":"(static) ","id":".on","ancestors":["interact."],"signature":""},{"comment":"/**\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n * @alias module:interact.pointerMoveTolerance\n *\n * @param {number} [newValue] The movement from the start position must be greater than this value\n * @return {interact | number}\n */","meta":{"range":[6077,6129],"filename":"index.ts","lineno":270,"columnno":0,"path":"../@interactjs/interact","code":{"id":"astnode100017327","name":"interact.pointerMoveTolerance","type":"Identifier","value":"pointerMoveTolerance","paramnames":[]},"shortpath":"@interactjs/interact/index.ts"},"description":"

Returns or sets the distance the pointer must be moved before an action\nsequence occurs. This also affects tolerance for tap events.

","alias":"module:interact.pointerMoveTolerance","params":[{"type":{"names":["number"]},"optional":true,"description":"

The movement from the start position must be greater than this value

","name":"newValue"}],"returns":[{"type":{"names":["interact","number"]}}],"name":"pointerMoveTolerance","longname":"module:interact.pointerMoveTolerance","kind":"member","memberof":"module:interact","scope":"static","___id":"T000002R001875","___s":true,"attribs":"(static) ","id":".pointerMoveTolerance","ancestors":["interact."],"signature":""},{"comment":"/**\n * Cancels all interactions (end events are not fired)\n *\n * @alias module:interact.stop\n *\n * @return {object} interact\n */","meta":{"range":[5599,5619],"filename":"index.ts","lineno":254,"columnno":0,"path":"../@interactjs/interact","code":{"id":"astnode100017301","name":"interact.stop","type":"Identifier","value":"stop","paramnames":[]},"shortpath":"@interactjs/interact/index.ts"},"description":"

Cancels all interactions (end events are not fired)

","alias":"module:interact.stop","returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"stop","longname":"module:interact.stop","kind":"member","memberof":"module:interact","scope":"static","___id":"T000002R001872","___s":true,"attribs":"(static) ","id":".stop","ancestors":["interact."],"signature":""},{"comment":"/**\n * @alias module:interact.supportsPointerEvent\n *\n * @return {boolean} Whether or not the browser supports PointerEvents\n */","meta":{"range":[5338,5390],"filename":"index.ts","lineno":244,"columnno":0,"path":"../@interactjs/interact","code":{"id":"astnode100017288","name":"interact.supportsPointerEvent","type":"Identifier","value":"supportsPointerEvent","paramnames":[]},"shortpath":"@interactjs/interact/index.ts"},"alias":"module:interact.supportsPointerEvent","returns":[{"type":{"names":["boolean"]},"description":"

Whether or not the browser supports PointerEvents

"}],"name":"supportsPointerEvent","longname":"module:interact.supportsPointerEvent","kind":"member","memberof":"module:interact","scope":"static","___id":"T000002R001870","___s":true,"attribs":"(static) ","id":".supportsPointerEvent","ancestors":["interact."],"signature":""},{"comment":"/**\n * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */","meta":{"range":[5105,5143],"filename":"index.ts","lineno":234,"columnno":0,"path":"../@interactjs/interact","code":{"id":"astnode100017275","name":"interact.supportsTouch","type":"Identifier","value":"supportsTouch","paramnames":[]},"shortpath":"@interactjs/interact/index.ts"},"alias":"module:interact.supportsTouch","returns":[{"type":{"names":["boolean"]},"description":"

Whether or not the browser supports touch input

"}],"name":"supportsTouch","longname":"module:interact.supportsTouch","kind":"member","memberof":"module:interact","scope":"static","___id":"T000002R001868","___s":true,"attribs":"(static) ","id":".supportsTouch","ancestors":["interact."],"signature":""},{"comment":"/**\n * Use a plugin\n *\n * @alias module:interact.use\n *\n * @param {Object} plugin\n * @param {function} plugin.install\n * @return {interact}\n */","meta":{"range":[1463,1481],"filename":"index.ts","lineno":87,"columnno":0,"path":"../@interactjs/interact","code":{"id":"astnode100016854","name":"interact.use","type":"Identifier","value":"use","paramnames":[]},"shortpath":"@interactjs/interact/index.ts"},"description":"

Use a plugin

","alias":"module:interact.use","params":[{"type":{"names":["Object"]},"name":"plugin"},{"type":{"names":["function"]},"name":"plugin.install"}],"returns":[{"type":{"names":["interact"]}}],"name":"use","longname":"module:interact.use","kind":"member","memberof":"module:interact","scope":"static","___id":"T000002R001840","___s":true,"attribs":"(static) ","id":".use","ancestors":["interact."],"signature":""},{"comment":"/**\n * @module modifiers/aspectRatio\n *\n * @description\n * This module forces elements to be resized with a specified dx/dy ratio.\n *\n * @example\n * interact(target).resizable({\n * modifiers: [\n * interact.modifiers.snapSize({\n * targets: [ interact.createSnapGrid({ x: 20, y: 20 }) ],\n * }),\n * interact.aspectRatio({ ratio: 'preserve' }),\n * ],\n * });\n */","meta":{"filename":"aspectRatio.ts","lineno":3,"columnno":0,"path":"../@interactjs/modifiers","code":{},"shortpath":"@interactjs/modifiers/aspectRatio.ts"},"kind":"module","name":"modifiers/aspectRatio","description":"

This module forces elements to be resized with a specified dx/dy ratio.

","examples":[{"caption":"","code":"interact(target).resizable({\n modifiers: [\n interact.modifiers.snapSize({\n targets: [ interact.createSnapGrid({ x: 20, y: 20 }) ],\n }),\n interact.aspectRatio({ ratio: 'preserve' }),\n ],\n});"}],"longname":"module:modifiers/aspectRatio","___id":"T000004R000003","___s":true,"attribs":"","id":"modifiers/aspectRatio","ancestors":[],"modules":[{"comment":"/**\n * @module modifiers/aspectRatio\n *\n * @description\n * This module forces elements to be resized with a specified dx/dy ratio.\n *\n * @example\n * interact(target).resizable({\n * modifiers: [\n * interact.modifiers.snapSize({\n * targets: [ interact.createSnapGrid({ x: 20, y: 20 }) ],\n * }),\n * interact.aspectRatio({ ratio: 'preserve' }),\n * ],\n * });\n */","meta":{"filename":"aspectRatio.ts","lineno":3,"columnno":0,"path":"/home/travis/build/taye/interact.js/@interactjs/modifiers","code":{},"shortpath":"@interactjs/modifiers/aspectRatio.ts"},"kind":"module","name":"modifiers/aspectRatio","description":"

This module forces elements to be resized with a specified dx/dy ratio.

","examples":[{"caption":"","code":"interact(target).resizable({\n modifiers: [\n interact.modifiers.snapSize({\n targets: [ interact.createSnapGrid({ x: 20, y: 20 }) ],\n }),\n interact.aspectRatio({ ratio: 'preserve' }),\n ],\n});"}],"longname":"module:modifiers/aspectRatio","___id":"T000002R001895","___s":true,"attribs":"","id":"modifiers/aspectRatio","ancestors":[]}]},{"comment":"/**\n * @module modifiers/snapEdges\n *\n * @description\n * This module allows snapping of the edges of targets during resize\n * interactions.\n *\n * @example\n * interact(target).resizable({\n * snapEdges: {\n * targets: [interact.snappers.grid({ x: 100, y: 50 })],\n * },\n * })\n *\n * interact(target).resizable({\n * snapEdges: {\n * targets: [\n * interact.snappers.grid({\n * top: 50,\n * left: 50,\n * bottom: 100,\n * right: 100,\n * }),\n * ],\n * },\n * })\n */","meta":{"filename":"edges.ts","lineno":1,"columnno":0,"path":"../@interactjs/modifiers/snap","code":{},"shortpath":"@interactjs/modifiers/snap/edges.ts"},"kind":"module","name":"modifiers/snapEdges","description":"

This module allows snapping of the edges of targets during resize\ninteractions.

","examples":[{"caption":"","code":"interact(target).resizable({\n snapEdges: {\n targets: [interact.snappers.grid({ x: 100, y: 50 })],\n },\n})\n\ninteract(target).resizable({\n snapEdges: {\n targets: [\n interact.snappers.grid({\n top: 50,\n left: 50,\n bottom: 100,\n right: 100,\n }),\n ],\n },\n})"}],"longname":"module:modifiers/snapEdges","___id":"T000004R000004","___s":true,"attribs":"","id":"modifiers/snapEdges","ancestors":[],"modules":[{"comment":"/**\n * @module modifiers/snapEdges\n *\n * @description\n * This module allows snapping of the edges of targets during resize\n * interactions.\n *\n * @example\n * interact(target).resizable({\n * snapEdges: {\n * targets: [interact.snappers.grid({ x: 100, y: 50 })],\n * },\n * })\n *\n * interact(target).resizable({\n * snapEdges: {\n * targets: [\n * interact.snappers.grid({\n * top: 50,\n * left: 50,\n * bottom: 100,\n * right: 100,\n * }),\n * ],\n * },\n * })\n */","meta":{"filename":"edges.ts","lineno":1,"columnno":0,"path":"/home/travis/build/taye/interact.js/@interactjs/modifiers/snap","code":{},"shortpath":"@interactjs/modifiers/snap/edges.ts"},"kind":"module","name":"modifiers/snapEdges","description":"

This module allows snapping of the edges of targets during resize\ninteractions.

","examples":[{"caption":"","code":"interact(target).resizable({\n snapEdges: {\n targets: [interact.snappers.grid({ x: 100, y: 50 })],\n },\n})\n\ninteract(target).resizable({\n snapEdges: {\n targets: [\n interact.snappers.grid({\n top: 50,\n left: 50,\n bottom: 100,\n right: 100,\n }),\n ],\n },\n})"}],"longname":"module:modifiers/snapEdges","___id":"T000002R002375","___s":true,"attribs":"","id":"modifiers/snapEdges","ancestors":[]}]},{"kind":"package","longname":"package:undefined","files":["/home/travis/build/taye/interact.js/@interactjs/actions/drag.ts","/home/travis/build/taye/interact.js/@interactjs/actions/drop/DropEvent.ts","/home/travis/build/taye/interact.js/@interactjs/actions/drop/index.ts","/home/travis/build/taye/interact.js/@interactjs/actions/gesture.ts","/home/travis/build/taye/interact.js/@interactjs/actions/index.ts","/home/travis/build/taye/interact.js/@interactjs/actions/resize.ts","/home/travis/build/taye/interact.js/@interactjs/auto-scroll/index.ts","/home/travis/build/taye/interact.js/@interactjs/auto-start/base.ts","/home/travis/build/taye/interact.js/@interactjs/auto-start/dragAxis.ts","/home/travis/build/taye/interact.js/@interactjs/auto-start/hold.ts","/home/travis/build/taye/interact.js/@interactjs/auto-start/index.ts","/home/travis/build/taye/interact.js/@interactjs/auto-start/InteractableMethods.ts","/home/travis/build/taye/interact.js/@interactjs/core/BaseEvent.ts","/home/travis/build/taye/interact.js/@interactjs/core/defaultOptions.ts","/home/travis/build/taye/interact.js/@interactjs/core/Eventable.ts","/home/travis/build/taye/interact.js/@interactjs/core/Interactable.ts","/home/travis/build/taye/interact.js/@interactjs/core/interactablePreventDefault.ts","/home/travis/build/taye/interact.js/@interactjs/core/InteractableSet.ts","/home/travis/build/taye/interact.js/@interactjs/core/InteractEvent.ts","/home/travis/build/taye/interact.js/@interactjs/core/Interaction.ts","/home/travis/build/taye/interact.js/@interactjs/core/interactionFinder.ts","/home/travis/build/taye/interact.js/@interactjs/core/interactions.ts","/home/travis/build/taye/interact.js/@interactjs/core/PointerInfo.ts","/home/travis/build/taye/interact.js/@interactjs/core/scope.ts","/home/travis/build/taye/interact.js/@interactjs/dev-tools/index.ts","/home/travis/build/taye/interact.js/@interactjs/inertia/index.ts","/home/travis/build/taye/interact.js/@interactjs/interact/index.ts","/home/travis/build/taye/interact.js/@interactjs/interactjs/index.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/all.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/aspectRatio.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/base.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/index.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/Modification.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/restrict/edges.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/restrict/pointer.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/restrict/rect.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/restrict/size.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/snap/edges.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/snap/pointer.ts","/home/travis/build/taye/interact.js/@interactjs/modifiers/snap/size.ts","/home/travis/build/taye/interact.js/@interactjs/offset/index.ts","/home/travis/build/taye/interact.js/@interactjs/pointer-events/base.ts","/home/travis/build/taye/interact.js/@interactjs/pointer-events/holdRepeat.ts","/home/travis/build/taye/interact.js/@interactjs/pointer-events/index.ts","/home/travis/build/taye/interact.js/@interactjs/pointer-events/interactableTargets.ts","/home/travis/build/taye/interact.js/@interactjs/pointer-events/PointerEvent.ts","/home/travis/build/taye/interact.js/@interactjs/reflow/index.ts","/home/travis/build/taye/interact.js/@interactjs/types/index.ts","/home/travis/build/taye/interact.js/@interactjs/types/interactjs-test.ts","/home/travis/build/taye/interact.js/@interactjs/types/NativePointerEventType.ts","/home/travis/build/taye/interact.js/@interactjs/utils/arr.ts","/home/travis/build/taye/interact.js/@interactjs/utils/browser.ts","/home/travis/build/taye/interact.js/@interactjs/utils/clone.ts","/home/travis/build/taye/interact.js/@interactjs/utils/domObjects.ts","/home/travis/build/taye/interact.js/@interactjs/utils/domUtils.ts","/home/travis/build/taye/interact.js/@interactjs/utils/events.ts","/home/travis/build/taye/interact.js/@interactjs/utils/extend.ts","/home/travis/build/taye/interact.js/@interactjs/utils/getOriginXY.ts","/home/travis/build/taye/interact.js/@interactjs/utils/hypot.ts","/home/travis/build/taye/interact.js/@interactjs/utils/index.ts","/home/travis/build/taye/interact.js/@interactjs/utils/is.ts","/home/travis/build/taye/interact.js/@interactjs/utils/isWindow.ts","/home/travis/build/taye/interact.js/@interactjs/utils/normalizeListeners.ts","/home/travis/build/taye/interact.js/@interactjs/utils/pointerExtend.ts","/home/travis/build/taye/interact.js/@interactjs/utils/pointerUtils.ts","/home/travis/build/taye/interact.js/@interactjs/utils/raf.ts","/home/travis/build/taye/interact.js/@interactjs/utils/rect.ts","/home/travis/build/taye/interact.js/@interactjs/utils/snappers/grid.ts","/home/travis/build/taye/interact.js/@interactjs/utils/snappers/index.ts","/home/travis/build/taye/interact.js/@interactjs/utils/window.ts","/home/travis/build/taye/interact.js/interactjs/index.ts","/home/travis/build/taye/interact.js/jsdoc/index.md"],"___id":"T000002R003591","___s":true,"attribs":"","id":"package:","ancestors":[]},{"comment":"/**\n * Prevent the default behaviour of the original Event\n */","meta":{"range":[1599,1662],"filename":"PointerEvent.ts","lineno":76,"columnno":2,"path":"../@interactjs/pointer-events","code":{"id":"astnode100024569","name":"preventDefault","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"@interactjs/pointer-events/PointerEvent.ts"},"description":"

Prevent the default behaviour of the original Event

","name":"preventDefault","longname":"preventDefault","kind":"function","scope":"global","params":[],"___id":"T000002R002844","___s":true,"attribs":"","id":"preventDefault","signature":"()","ancestors":[]}] \ No newline at end of file diff --git a/interactjs/dist/api/fonts/OpenSans-Bold-webfont.eot b/interactjs/dist/api/fonts/OpenSans-Bold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..5d20d916338a5890a033952e2e07ba7380f5a7d3 GIT binary patch literal 19544 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 literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-Bold-webfont.svg b/interactjs/dist/api/fonts/OpenSans-Bold-webfont.svg new file mode 100644 index 000000000..3ed7be4bc --- /dev/null +++ b/interactjs/dist/api/fonts/OpenSans-Bold-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interactjs/dist/api/fonts/OpenSans-Bold-webfont.woff b/interactjs/dist/api/fonts/OpenSans-Bold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..1205787b0ed50db71ebd4f8a7f85d106721ff258 GIT binary patch literal 22432 zcmZsB1B@t5ubU^O|H%}V|IzIVNI zUovCM*w)bDm$Uix&jbJf0&20h={9zAA^05!;@9Ta9)O418En_g!QA$j%|T zg7y+LH+25>h2!|O`Oo%0Aeh^Dn*DMD0007R000ge0Uny~7N&+K0045Wzx^z~U;{Kx zUbpxqf4R$F{l9sTz@vgjSlGIF007AU#s~B}CU7TXuFRs1z45P|qR4N2OTXCll}{hH zHT3wsuJV8Pgy25_69Vzr8QPlua=-Bb&i}^9U_Kjd;b8CV0sx?j@XNjYjt5W_dcEY} zWcur?{$H$r|HFd_(WSeo(QnM^|9*9_|6rl7So13Ze*rMbn?LiP91}v%{ZCFUVQhP> z8ylDy80-QYL4qL|7#V={y9-PL9W(yUI~b4<0Kj9tDn(W%NgQM3r-SAi%{IQ-av{#b zm?Dp*nUWE(`7{EcC}s)ta^1+9Uj`lvS<-m^uZMv8f-v%ehSe}U)}pB5vjGC6Uy~pm zo)<1qh;kgVTrs$D``1)&z8ke|;_(>$1Je!j%!vOnt{S4G>G`aABr9vrN*+4@PrG+q zdH3aZlXjCg-utrN?)PA6A(Aic*r{P)fItNfh`QJTc? z3wgp|$4hT`N(iVlzs(@58kfEk!62o^Q$flqq@=t{xl6XxO=$TCkbN0bkG!jwEbQN4 zG2V(|AGxWwXsuk-^?T%XAZ@~-ovUcv=&a}s0@$uWPKYo9;IKW2M`U||9p*tE=o13y zAO}3UTRRB4eo~B3#8#jJ2h?E$oa*=!uFZf9hm1DKeep&;V=p~b&jPH{5LgBA@Apns zU_VKVVEcdkU^~M2p8z9$y^ucg{gfQAU$62E{9_n|TCq4qgET=@+bg~A5}0o^Z#JVV z0qRI-PMZJEiE6Zg;GOQ;a2q|YsR@`&xDGOhGncu2d?Pj-GduAh$N_@M0V6IXBF<8R zxjfTXUW5hxM5`WGGjy>!(C%ba9^je@u0M9bG`-6VPM;@*UhaZwS{dYJWn~}}ibs}G zwGYxwzK4<->i3DRk}gn0r*b}@NcD5zt|~z4eUPlFFr-kBCng*diUrGxHMPqQK9yIo zB)B7F{t676O}rd4M%_4i?(Wg!N5}Pcv!4?>x{ffiV@XWmaoy{%8Wm5Ska0TN1*tUF4 zR};ELu9o%iR=|sY^G~PFaL86`dKghU?-lE#d&z}pZ+O3EY*1UyOcxQKcc*>kZrR#Zgl0UbrqyO(KU-@)HSW=yLIKuRVv{d z)L3=2Hasz^73ld^tUTeWl^AnXdtrW!p5f0DAcnD2vgr=9S&I~S<@~f7FLK8=U8MLO zub`KNmnLdxsr4ZF!hIad$A;=O|K_Ow$zev}MxzD>j*btIhJU51X~qo|BvFieSwmA2T)~V@&E$JN5n$?FPQ>^cms6; zfC7Mkrh_v7CS3ggk-&2RW`Lg%KtRwCV8EatKtLe706;ea00i21Z!|FQ0gaGB zKz~VrOzxN#89&WgOkm6^4Y-C~qRwK0QUk*SlL9jX69Ur%y91L0ql7wzBKomJi@;%e zG{1kqGe)2ndjLwQA*!PU1qB3!1i{KDkVMgm70?fUYJTv4_#gfEfBJvAe=xqgzdnxp z#=yn#aC{tg`?kS5@NB$l@B0G5ZQ&#FG#fHg>&5qGh z)Rx(r-JaoM<)-PX?XK~%^|txC{k{SJ2=)=?8SWv*E6y?2Io?4=z}Q}8Z6%sdYIjZ!tQ;*e zRIV=l%LF$%S>}_lvdZ#%9eu)fzuxX_O5EF>BcH+N^?ORsyMN{lP02pquKtEZ{wS6+ z{>Nl~eJMO5hr+~wQv+lL0&obKy!YR;5de)ohS3-N=ZXysoB<(?13bWw7`xpATWS8& zW0+`8`TYadZ|-1-3If172LD?bc&ulsTDmWYp(J;b#3s&?LW8Z=#HgW{LQb+<(Vuo-en}s5k&k>}Q!XMicO zVLg=&(uGl9(Oo$-PVIkRw7^8@GMS=KQ@O$qUR{@LG>4z%E!?>(RP5ICNkw(ERwIDN#rrPuiBq|9tPRn(cB5|zN0 z+L9lPC|rbz!sI*m2=9PF9G?=@X;lErA)3sio}aE{WzoYnwr`zLmy*4ZoE5_#dQm=g zC(_*GfX1p4-?zc*sJ1@h3(_jz>ROHG#4Sg0^v}t0&(b7^d1(As^L{`1LYMo-F2HjD zeqT(fv)&@3nD4uRV!95htYU$lM|G7zS!|Ii%P8x;jKaF^F2gA7JuNZyliD^z{KDCJ zK*)a8F)I6k=d{orx7mnKz+NR}w+`mCpeJCb6|>n$E#`U&!2&x!T|yO@YiaT{&{|c= z3Z%(8|5y|;))7v4QGtx>y1Y!~kMgq=L60+96p?*hucL$PZn@QbyLaZMzoo@|9$Gcb z9-9<)$1r~|8$5k)5BJl|?%JW@oT`v42w!TT1OP^14UY70c}YUOf&0zbeJbDwiU zc1g)Mn~}wre&(Y+E)n_0n`et-f_6n$OC-fLX!9TMr*@=_>sLW%QS$j=xa*OLc2g*0 zVSiNq1+}DSY_r<|I;pDKcGSGpn-9{x$%=!p#l$i%j9W0JtY>)GiVCF^d{a`vB|=yW ziYcDMco4K!=wK_HE4-EU;8~s*1~xQdXkKF%LahX)F6vI>xcePmh4uQW$A09k3o&Oz zxV&TX7llW8MS-6SxUF7;U74X&^7$Fxf%4@=v#*L8R@uSj5baVQ>r}g#+|VQPTe`*; zHk{Ur06Z$b?5u?96k|K%I7W=A>{~_v-SD_QMwOOLPuNFUVq>JLJ7S`*^FCgtTZ_JF zPm1%zX#3B4ZcB{LoioXCi|8N!6M@T=%0Mr3CIn+ZPH3!w)&4`c0aqCMi(7vgxt|_b z=%_=@D~rr2W&G;+XsWh}lo4IK`iW4yCeCuV`BiZX8%qzPSX{i=kQ5A@zg7OX{?XpO zx;lRWI9Qx8$@1BBOG~_3+efTyu&0wn0(6}(IdB8;0;FfzN2;HEfDCwFM%$nra&Q81 zognx~!*-dS>;Qe_;QG)H5nx6MS4mIcdV!rF@DhY;#o_vho!9`oNy2uiogj>yAdsBw zfO*Kmb|E=I^b>_|W8y22(|V4C*aEs6PRSIkO2DGn(9+_qk)Qd{Q+y2&*TT@^y-W_@ zgWr>&rN6d`l>BSM7x7~@|0($I_bd4~hcD{W5Iv>c6}gcdCHFaR&-LY88&+BTzRv&w z0Dpb};62u-e603-?>W9ym$SMD!*6Uxk4IhITVfXue^lrzwEI6A4uh1-DI^VaSIDCN!Bx#_}2`m_w3&xgi4^FsaE+qj- zQ4%UsktG=;O@8Za=2(jd)*A!vf(m-OqboU|8Vznb31Ud8!sc#oZ?3j7!OcvF)%kQd zJY`fJu(sy79GVv^6X{(JXHSy*1FTM>DfC(>lL8sfs;P{ML$J2kit`r%xO+G4@@wsp z^;3Fn?HxAefF6z>9p7LaE z{j~1BVfTCvDBEx(47Zd+?M~MEJcD;TDb(+d&pJ@`^XVI1d{>e!ttZy!4)k7$$e4~k zc|wI-l02;t`wad33Pf}K?EIyun1pl~Lso_DR#Tc(B&C#OL97rNB1G%kh4g+$YTPD5 zE<@SzI6!$xXFG5*pbEOx_RqD#Y(;G;!D*zs^(S-r<2Xz!R3GLIox)N53>-ag&qeXg za5CQN?HRYUe3#PCf&9yLLyN;jb>aGPpmxYxMRCms+UP#0cm{uRPFFnsNjEF>%zc4z9w!+P%u^7nX z{c$W-i|4HxWx>n&D3VKLAyNqqNu}jFwg8&3@e>JQHqw1}TU>GMfAVuz?@C5dXM(-H z4;^qua~M^SgZfM)zl6P<4nV2RsWA6Gs1NF9HR1uwY5KhM8 zUV_kZ)IWgU50B%pQ*)sGH@i&-;7UFBNZYH9g6s=3hqCxn#{!R2q8>8%KRz$ycV}1p zyELjVZSvmDOZa}?jX$Fy(n{NX#7IX6RFWci=24s;85AY&Je9ZZprinEDUwcQo)ARy zmReEc`6P*!0<tE_`L^9G#rd~^DcPNZe)+yc zTf8mwN4&_GaC@cpR|Q2$hkY5jY)ua3bk@1djL!A6dp=e4XfvAo!*cU_uOPX3_UF$f zz6*M`I6nRf^vmNjPWRfL^aRuq?`0MeCkfUO`cObP7j%%Smu%NUpb}gGdv{i~Vb6-1 z8A9-;K!Zee(axpW7PRGzI``f)MG)2ZdnK|!SAR&j1W)NJ?veLt9&WebvXTa zxc$!FY2XQF4Tw!qRwb`X$W%~^9+D9hG$17_07T7_0(0<+CDDplB9wUSKn*hs z4H(c5wzAP?n|!XN#rJ=ooM$FqT?UYuP|LcU8%_anv!O$25OyZuJ~JYoMCim2=1Yz` z`Wlq^%!66Pg~AP`QUl8eC=={cpo$Pmz6cpVFapR1ii52RoG^aqcU*>viX9+Y_Q_oh3X z*uG)GfQ#7RF-X>hMK{cP%tOWW@)nn%ME z{;oZQH;LrW+SnCg*>IR{;pEAKse?C$I4|ZPn)%Bia`-@(vPIMZwm6Rsa#y!;}VlCCIS}Xz=8T%q? z3yW-Q9#XDdJPBNVLqCCOM4IO2sJSrUV+p7bu*IKmmVY~-I&##5ffK}W7I_R`ZJ~B8 zDzRGL3&mw|HdZ?CsoZuNZQks*d|(aP`X1Ujj0MzS_?6h{TeSzV5%k^dN1_$~pzj+& zP7)-+g5S*oDhYN>Ra{ge`_eQN5R#B|P@s^sU^Ugs6$?1qtn7_jR}LOboyU&Q{>n={ zn>bL1^Nf@o3;gjQF4j36OErBNR;9l-xoPmv++sc73N69gXtaKxoa%Xh*iCMl*a2E8 z$sJor{T?eB{&5?cTNn_WptQ+!y*RD0F1EW|I|&kZchnz<`plqQ?iYj-dZVH;)q%e5 zq;M)IR>IVTWU`}|L{g&w8=o|57`Sv;yKJ3+;ZUc4*Ubj%tvcSrT8WBO%WjMLDtc0E zM^I|1gGn^GeK9)81Lp?fjg{QcBGW(hA68WDD?Vk~4Dg}uO z0?kB>r--+T*K{JSmu!hh<!R6BTSVNYfECYc{7hM+!$yzZQmgC6~uW zZnb|Cc!)OUTkUIwBgCsN8{e@yl@NlT!0SPkIQ&!=sfdUBDJ*9u7ZUA9xT|eA-EW~+ z#yJO{!@XROpy7Drp-u|pf`cNhxTIXs;I7FONh62E8j7XCz^?Z*c|o4xb!t zMtJ4H4-Ob_A_g#9^IQr105w8Hj~}5!wB|<~@K5)YmbB+Sbkak4{TPRdpyWc1(hAiV zivRkdi7ORE@DcVWP7?y$KNz=G>=KU^=@ec_O&p(L2pn z4GHD$C3yl|LlL-Phh|Zw+e^n|cOa_VZIKed*`65LOG66lZXG zjaF}J(?v;!VdWR@_i)+Ai!^wgU6k;l*XmVtl0F$&i`GF=PrefV95h8Gfw zzk8?5y$aX-b{cp@J~>06@6p?$u@;knBJ36FG?nSq$W6iViWOCFLU}~U-r@@eOc;tG z3=_LFJF$4li3fAUyUPe9xll}Ox;1BGUs@^x7F>P z78>|xSe-A9jUJ6wifg3^EQTr^O%;KHN!3aeXVCYn83TNdoQ$lPyx8=Whw}^z3sJsZ zp}4(d_o=ZBGUAV5^e>11yzs-?2)dTMz+SAk*|h%W=ElpkG41#?`U}mv33HLH z-t#i~d}U-EvAxaK3|dT1YvN51XDM-9uFgnezryUF>m+62c!pea(qso-{0OlDx|FDV z%I1-@7z&mFeN$XFkT$~>zA zpYSh_^tQ0N6v9&$wl82iueaqC0ed1BynCs%m`|hV~9|(NI%33RI)SkS>YL3YZ755sj4KR*1X7uCzQ*QWxOudkw z4nC$X0iLo*y+|aIBf&;LbnNKSoIaE78f9`z_8;d-u`GzRuD(?y-0DGu>Ua|akSGU9 z@m5=c0~B) zk;VpQF0ST}PQDsElr@Kp{R9Yjk%1WTkQl0Z&(o4do3*%?y3|$YS|mGO&%@=W9`47h zZgqQ0gOZ{^HDz~xn$R)^JUl#aLy(VWd~31XL*BQZ77 z>QoR$% zf=;0@rnhUCS@lFpOJoAt)0WVp7&7`>8r|&!>7Gwhw8s)Ma6DT8Jqr>qis4O3ysFjg zfJp9w#{*-GQ55r3wL@Ho+}z8reIjNs0gTX$G%W{Zo}t#{Z2_g|0x#Pu+HP4?|Dg0{ zI?u+Qe8QepC|-)~1VIXn)pjF8ZOSMZR4joA#uc$JraoxMJbdEOYwhlsOOVO`h=QZ{ zx6`I-?vI-nakT0j?A9n>3XNE^NcPO~lpSu+zm>5k^og_BPVYWXOG$2jILNHw17}ST zxELO1)ips39Gp5jn5$Asx<5|gTWelD0v*BAD@J{^>U9TGRih8mH3H{ZE@9R1uY9jM zgVoj6!_}DatH~ZNn&Qa;M%i{z10DiznN?;Rw=-7%V3J?W_lw~5d_m3Xj%qH8$ycS= z;PC=1U(E^6W68Ta0Q3je@HbrIJ2g*0*r>E)y2hluKB>WAV@;v{m06=8>_y;^e1i)|*Puw%qp=B}PseK!q6F)8{W?K;CZfE}9m?!r=Q%Ei@e zLaS$w;y-db|JWMMNVXl2v&ULyZFp&{z3oMWghi$uD5j5SD#SgH#k4c@9(@HzVB8?4rie}u5<)+K#$rzQ+`;DAm7BKvs9f- zP2hVNfLQ2n`gxcQT$YTFESjtFe{EZ7xbET`6Lb~U8fnN`{?r4ySGKv{>_9zyuQ4~2 zlXU1izP*0=WUo=s^Z1wC>3~-g%u4MkG*bHM>Yif7XB*l#Xx>BkTmg(@@b#dYcH!l; zIB$(77Qe@f22*`*$X)7%$=96(OqGqdp6jHYDTc|G>Gw^4$NLU%2L^)sH({aLNDs9? zy!<&yXlydwgP!^JYFMni(XBQN6bd`wiP_wu-`ikCdN|-A9o$9q|0^6KIxk9LR%b&U z6=dYl`k>-0Ay3y-iTSLjwq?#GW6RzzbL1=^uIh1K5PTxM{$v`sk&>&;N0|u5fOg!S z6a?-s3Ks{A7{PvS@O%M$45WF5*?{kQCj9qhq|<|S@^y?#Q4_nmeliG^=!A3haoAYtydfBFgB{4)+H?Y3@?9 z8T98eK)I4VI+PCsMWq%feakD_PkP7ZD@9A&x&PLb>{(ojLQzzDDJ{{h1D12_&py+i zFuDMq;H1fI(=i62@&aRRv?jbl-ojeBDd-dP=uP@Lmkct+_;n~~C2y+^pHjA#U@;KoUP1oIX(P(p zIC(z9j-@DZdb_?8+E)jFj z0e+2f8Pmf#d{st!VAj#Eq!mUw!8E1dOsW3q2c3j$xwu0n9E;gbF^1l0@x4vX$FJ^O zFiUf3PTj?In$HllX6^D;9*mP+I8JVJA6p*CG3HSv(FwJ($Sc2p{J_FT@I|KO;4A1y z;s;?EKAr=wRX{y|Ffw^oV#bSlk#F4Qe1WG^`%VG158*qm=pAK!pm{Zzu%6WMJ)1eS zt>Drw3C7rRTkGHdNC33JS%ADUrj;u;u_19A<ZcSR~zNw^YI(s69dZI!?x? zzuJ25l}3KakVb~@Sr$hOd`eNQ3mV6*q{D?PTY_VM4(uy1NFqna=trpsiH--v3G zIDuP=(4vajEL%7h*AFGXv35vURw6E?Dq|yf87OolrKFfRJ}9h+6~^9(uO=ZMrWlKe zWid~ur5iRnK0$!03)&h~mUGjQS$x-v(KaYSqj51eSVS3{lvoDN@$qx`fl+^1E;j<^|xP`Ol3u2zY-0(J%`T0FuJfXtjod9%f^u-i^ygAtZ?~; z5H#9*B^uYq{infvq!LT%yD;%NNM#h)i)<;5%UwOr$E_?3{w>P+uX*U(#|YuZ{$K<# zXlBf^1j;7!IEP>B`Y^5gzxet;=VLU!vQ7m#im1Qk`IT^9XX#yi`DoTil=Ap9>43Qv z7p+ny>o8K2gcMlQ&>Eu{jG5EN5v<1&Kz#u%y42ZsVhJ2>mYtLEx4N$pR)(3paxuGn zx@QOSJt3MyO^rPse4-yugV8__o)2BU7?=NW6ptFy%oC}BLly*vE?|WFx~*DNij71H>7#=RaGaIuRFGojZB^hK2`W#2GKJG#yKK)98?a4Y z3wpi%S`Oh||B8XdRUVJm&LHlA_+`@aWDcjZpET+_I~!hZgZ&Jj zbNcTRrY4DI{l1K&U8G9>A0XiPJfoDm{-|SeT`8N@e2&iVQBU*}9l>~xJCwYv$cIFk zOCat}%Z2NKndzF+3XD~3nEA~V()rDiit_E%<%7gULtpT-H{E2;Bg@eW8zl)LlLk6W zH~>GV8qE2aBn!#hK%E2{zGQA+tpfhPG3{Bo*X6`uK`ORMWd^hXTCyrjs#u&uO^PT5 zo1+@UV6_tP{((BqKCp2h!e1XK=!fn%p$(I8ufAPOvZtx7Eb&AafD}}|gMa~-h*+}x zKepVUZo(!D56LdUKYLSuOTM~KisGW2yluRESMZ*pynib2uhUkH72a|gTe5lQjPtTU zkL9#~&TSjAaXFp6o=WG4+3XT7a;9;e9%6+P_Ak`#FO}`TpV~&q`Tm_(!iI{On%lL1 z9ktlplX~{<)}aD>!KH>Sv9T_7(_XG!5qq7-o|>{n}-p~FYJ?j+5U96thH#rH2FoXTjltltv>y@ z23+ipAl{9HF9d)kj7S@ntd6TH)4Y%wxAwhw&E9f(fj)@V$4|^3V6&^K+XsK+bk`dk zjbn%EJ54+h!L@HrW&)YPM3Aq9K;`FO)#hq(8W852khC8S4mas{E}&sU_NXHIp^Nm} zmr#j1z^C&%&BhGa1$4fchhs9B@3Y6w5g$#Z*0 zJe8ji^h-tjT`fKQldNG2*P$zVQY_(q{V1Uu^c6Lih&wR8i}C)ihJIgVWX>_ekVM)} z7wCh$;i2whK|=E7+4|eU84%*B{`J_r+z9_n*_BbDj3Zl zhim=!S9PZcN%LZWT^EJx?2BURErCVnd#Qrh20&e`PmEiuj<;rM*0Hvpo~tL{%dhba zGntZ!9ZwmV*pJgs^mUBX34)ME4jpe~+A;NLU} zQr`YJVjdky`rxxH5}tzcL%p1)N0dvx%no6}#T%NSQlNjU@6Lu#c@Hl^vA(A7BLU<_ z_|m=%DPt!;krqS`tU3GFo{x}-|Ls1e-*uuSbSq?B%fP|H@k|Dj>vv~aLO-8js{g~+ z7Y2poYtXUn=4bx{HoKiic9!uC9q<5Kt?*3Pn&=*W-t^X=R@}L7MUIf+EAwDt3$20T zMwWb@2I7PMiJEdm*m+NybiGt$38@6;sbsUIE@IXEK|nY|FW~K0h82aXRa?1oDMWBc zPpYyH^TDCI0d%KIYiA`G>T0Y9luZVi%p)6c;;xgO(kCg1Nm%KJa^ za=12L%{7FW11~SeM)%9O`kiw<2bj&S3&YMBr$c+=FIbFDZ*kmvL4L|q;>~ABmT>o! zu{6jiJtA#D)RMzFNZ%qIR&(q~`qz#^z6IJeIEHy08|+FNSGt`0<1r%Ts22DEIN`uX zsM*ZrCmi9(=1q2G1F;GF@8%s}pmDq-aQ@lY8yBLUDe+%hjaHHuf^B~8Uo=S15iJC? ze%Yy#AQ5DFaw&^&o|x`o>0vlM-F2^Jin#&a%C??q{RXS-$0vQdrHx0MYo6Mn(eJrV z#w}&W=+m_CpFP`t1$KwV!l|2&ulb%`hNmgG*^eoe{f^z6`;-0coa|LTc9Y`W*X(95 zSIP?RsnZvD96dy)6h?Rm=hk3~I|6fFh;iJi=4z}o85OuC-@sIX80%#LF|5)Uo5ZV)GVHRh0NyiP1#th z`Z*(5i<}p;|G36<-=`&n2zxD~4kJ`Kva77Ulu% ziR{FdXGhqPz}Sa)%xh3c0M0q>LzCFi*H$TQ<-*~XB)uwY%*W7m#|l7TXwD?jN{%0f zy|%a4|J&?!HvdnuGxO!>OIW$trk1q1zSE~)#nr|?NLbPMbVN(${T{Jt%4aQ3a=+^9 zc(xXr0xIbwsegac-DY|9@hqwq&!mhy&cMgz8eL95xNupNEW-L6X%mV^$7K;w4dcgc zD4RVpvcgzPy`b-*KLF{CdO0Rcg*Q-gpmeZ16nqG66(4wCu6X$k!{6g-#<8bwKrdun zPli=6bAObl$cqF`FN3x)(Qcx|o(0zk&TgixJ@8HlE(BM~)RH!O|JwR(>Y8m4gGEm} zu%{6hrKoLk`p-HG3TB|g;qg~%{cfGLVkQNiPbBnt!zjOEXd7<3Yx%ak0eL`=i zm&ASW9N4o^k4-Sb;}toTP>1aVmMlpQZMHT1oGup2qwX42s-FwkreP)awal&(T^=w2 zmq)4=fIt-oXn{b=m3f;l8R4v(gO_Z#ThfAt9D3ko7C6!dN@Ns?K3AnMou;6)sN->= z%ua_>@8HwN8-koe*Jgc5)ZW~9`(Sx?CYrZDQ$qSyvoIrR)^Oy2Vj8}(agoNy0$4zF z8D11`T=rg4y zb`C2XPu98jcgtmRqt5b7YsLhcT@;z(iidD%G&zQ+Vgc|LRyKStl{$n{3_}4}*SS=R zs1krVXs|cqrd~*uCsiR<2y0v+$gCPCt6t*@{(Bw;Sp1XAOSdokkCobx#J_d1m6aoG0IeS;zpQC4F z@>_Z@tT(hGZ;Cp^>y+RCI>Ei2A`v__mh z@buXc&0MoY9VgtDTr!_#272N-nldE0tn=hLBh-CqVkmTB9DR6wfl6^hMYE(E(#SiH zkO+$P18U@>Lcr?3+DTWMhS$4(QT*F&p7N?|^^xQEkS+Wz#ce+U&SBf0mG`~5UEg)Y zdf!JQFI$R?j&(f(_wf2jtWHPy=HlJic$eGEH9YK({f+1q4P>eOcOQFU4N>OcUSQ1Q z{!a>)#xMKn_3u2?aW9muN6_= zXa%Ldgb9B>>Vv60HbYAhS!k7rFyMN1e4xP|oa(!>4@Ig~T~p^M8m&aAMNsgrB@u=g z>$i>yJ4q7IIIo--c1EP{d^>HVv>c=txQAZQcU*ruaxytu@6+znXs7H2zcxObQmZ~5 z44dtCh%X3Dx4b0$?07#$+Mg~Lo#$KRX^iw;Bz+5B_aoxED^?dXd?~XHFSfU5*uLKw zqIrA6M0tyE&hQ?w+od_fai0HvgxO4ptu+qkO%CSYfyc+n#C`*?L&wR#)}nNGpeQJ^ zTeV&!yB(Yy0*0#(^mPgp)%oI_u|NeO2=Q1_N``M=J-l{;>C6dyoCR}aLXcC7po4RP zrb|7{J6+S|Y<2D>Lqb#G(@?%W1s73kYQ8)gvLdU^rfhhHnX$`em?fFNXeVUT{zTHp6^ODJZaSNG zcBW_rv%8oLrD(Ek11?Y`(aPd^D_1RG>0q%V(0x^zc`m8OsiKG{kz92Cp(Mgf0(oF! zc6{)%VGD~uN3`mcgk{CPk&HaF^0$f_jY{>OYJTAW4NcWEfS#9%tm)uua@~}-PbkU& zuf@S&Qrw_STJg2iW)+)j%d12)xr>Q zwaDDl^Hq6(u}+bjcO79&PxH^DHNcPR*Nm>PBPW%o)tI!@o$5t15%lF4j3HFi%eCMc3c$;XNVRfqnks*||+K=ajdiSiaXw zS-wNGN!d|pod5X38nCV%;JSOvX2MxKg3#9@!k_mU@A z6PKl=P}{8TNH*=E8Tb97=jm42%Q_t^nxi6U7!NLt3ma;O2~gmz+b;Oc@KzO3t#@ti^BH!e;2RfpHRg!NNzLc1n4-;mumVqQmd`l&At-_*btueY` z8T<-&B)LczCcZb#x~{|XmYz2xKA->Im!$`qNoJ+BJNob4+b*ng#@VQ2o3+^AxIO>2 zkpm}<`^DY<-lqR|%S5|7_7n9pd6Q1%iOez)y?Pc!6NdLa9JC)F5lwZtH@P@eRqNQy zYz5gLYv>x;8xtBBufwCBwbtsN(Vp&y9sOCZ<^0%J#|)H4{Z0@k4tM?xvjN5E_(`Lm z`zmf8okH1NusM&TQyn^bqxga=$I+vMNyrP4rx^Ofh$z9CNHH&n0JaEacp^C7%x)N! zC#l8*6bh((deDn(pXPj;Ha5rG;Yi-GBV)R4?+)ukvn&0q)?)pBk$C9=Ue?!0zOv_T z-Z}D+#S34hZvtE&HKhb^HJPAIb_>oMyiRwD%H>t9Qx9i%s|WC-`rFW$m-f z#bW`{AtR}z`#f^}?;A-i2R4FHfxUI=K8o{nliTj@?DiPIHf`DoRu79U$k=gS4Qqaiz7){j+low z?ntSU$3G#1pria0R_YmIe2LkXzG*6pfL8xOV}WjEa=c8IU?*g~~r3>0WX>x6W* zSl0y&Q;-@os}9X!8F`lUe3DNTtS$2`x*F=QZf#^Ks%jY!C@$4kYjV{Ydd%al+qRs5 zbb)nog^0~ZJe`6!pN*Z1j7u*(qBSv~hI3bJho(s1sY$jmmP<>}hDFBpj69DS7gD!F zTKYdkokO;z^H#i3+K8`B5aIm_hO+R=)3~Z$i_`bGhh?#Tgcrn9?KHomfJUw4MU&$E zO*Dr70S+B?b!4|*zw^?|__{HHA@~}&h|ueFSH2)wG`zOwIgOI=)#+hi3!q}+wDWDt zsSX7KMMMfICX*e4sb;|7dcih2)Ck&CA_^~PxL0nRF=)l8JyyW5Wo#v-JInI8ClGVt znQ#7p#0`8i-{BAxAkNIr#*EQr6qXu_l;^Xhd0+#NpvR2OA}UMSNC}CjPb#(!yY@e& z^s;iP*dqF3GPd@xm~t@w`%4m}WqlR^`Q-{rHD&1I2$ZvuxJ*hqcIC8c%zVI9P^&fI zEjz;9j=W9wr-g(?V5H)YkwA2$mi2i!V|0}9z4wBW=XC+GsUn9Au0!eJ?j_@XD0ml~ z04bJg6Wc3m{$n2iKXTNm@!V(r_j;ea{(~qkW;uRP{&KE4VEUgN%6z=i#STu^7?tL% z#$%*{%F$uREPMiW+&I6E0lcw@;F)Ame3?Q*pjp(}Pg;4V6{_YOx>WV1Zt<$Bo%!7& zm47V)E`z}tB(p6Qvrm^ekJhmiHx77HdpzSP7YuR5`z!EaNLi<{?T->VAvFHzl6hsL z9H3qJi3F$zQmDh0id&TBQsPLC)97}G4R_pV^&)r>i^DlsTF6dH5GH1YB_y0SJls%r z=WHa7ny6nyt@Iw5&C-x}=PZjMW&a(&nXz z$vZuLj^t$vj;mEaz&O)z9DZ>enT9w$as7_F_wL~ZG%O5rh}30RL~|-tV-~qorTh`3 zlw@OwWJ5`L6FqVhr_>gf?VrT^lu%FoQ$s6z~)W@CyzM%+n&1;jT@tz_4-&=!mZ4gU_REi8&ky}`46~!}8 zPSn#+EsF2bVH+g7Zm^&x*Xj3agIa*HOL>4K--c>Xhx-QVB)cI4I z#7eS-sS+>x;9i&ix@>~$NTdh%YWNg|KeHk!{gbACoqk}E5kj|r#NL@siEt9mobMfK83uPWm4 z87eLY$;B0J8LeB_Ebdx9VB^IpDbBX7?)?O~c2fQR04q<44)A|{AzIu^M>EnXAhq*H zrI77+z~9pU`r73P%dE}*K|kQ?^ONosvkl@#kxk4WZxUhN&t#n|^dLP2ahG!=SV)ae zNzXjI&YsOGU~q^0nCFU}%W`0W#G$Z1t$1(}f5Xc4<&oNB7OMg>A=EhJ@Pr*^Ime%+ zyX7btrEqe?aOg#Q?z0*V=`3N`ozxwJYbdBVRUFkF;0wr9eVrkGrG*o;Wj?tVJ91VP zt4Nb!lE|5Lb3XsF5jI|l;qAqCfa76vy873Z%GU}<7n}JxZuhSFS2L8&h=t_+ zFBo0g`>vkGAhshID?8o#1fItMoEP8A$c@{iT@&cvoP2(g%97^DE+<`$KxdZ-3AYyM zbTSfI+Z!UxvYG8O5htZg$_U6^fUuQ4b_oAVt=b!q3OMe$rw2pwR)4fhU=!H>Rooo*V3L1(kTZ~by$HFn(dq{gdM=*)2s0L9p8av zkG$$0<0+LCmNa+lNGy>gEX^6Ma5`AS35C0K8M2PC>&A^MtJF+5UQ-_T49a@?_({qY zrzWqAFb}mtNoJ8|s!h3LsN)G+OC?X{k0f26NOvqda|26SYmK|nK=7NC(=zDG*7}D< z&1LudPRf}4V~Dqf(&Bg^CQW(hG#!9NN+pc3c>miE+J4opI}YeQw4sY3Zlqx9zQp`) z1k<;xB3@QP>6%ZxE$4dVt!ECu(#ytiFVeV+NUNMvI1fdK#i*9B3G$B6abaC(DZC7v z&-(?)xM$i`g!LpnRlk{6!JyD5{aJ?*-`2J-ff?cA&)>Dnye@CI82RgDRc=4Mp_HmJ z%$@i96LatnH(Z_)ro|+6mVED>@v#HCsuXkF_eW73`MIDxuUD_w;|onPpZoa}h&7DJ zDM*EazCVTyx|#pZbSM~t<_NH(oeogHFu{VF8kG}6%c?j^INsZ0x3F+?n043c<4+#| zU)$f>P0jBL5G8^|w%ZL`3XgOWL%B;JvFg8mdglJ3wvxe~Wm$0C4w&9=DCo>orzP~Q zriBanQD!R+L+VO~%z1#K9A`Txm|hW?)bkrr<0E9YL+Hg_X2nT@7ebTJIF*-(3p zZmjnC_i3B|Pd@n{(tuV0X;7Iw8zZNDv}P+q&IBiwWCu>%51N`OQKHG=qX54dDEez0 zV~mM%oM@0_x5$r>YOqB5c)Aiat%l(^T1>Cz-wdt^W%LRHDJ%$H*Xz2TsMUQL>1jN# zVviHIFJ(cNl@}9d2BO=^B4;~petZ&Xm*L$q?cHUN!CPvSyrm}xkKh07Z}xrr&o^p@ zJ-lJUYhQjktK@fgodD9Bt2}z&o4bbZY8^Q9?zQPu%y|m@|Pank36N)h?Vj5xzMy<8EDs>zI@GY;ifL<8m-a&oRIv zJ;%T=xNsOz5}cq)0bi=5kd$za!6I@D5>-`cTvT_Ls*;hKUTfVk$ABZLq&EK4P?2NE z^n22h6ZLDXAfCqSIR??Yr0aGu*TK4ddV!FeLt}mE82cxJA}3*ZCzY5`0x(XO8Y6v8 zh|MZWouiwZjCylZYAOcukm^tMXLv+jEXI&xOhH#pqnbHM?3b(KzH^qqozdlg1Ggvr zKf-;$K*%kj`fP6+;%Y~3Hc&*36KKb-X}n#qBX&~<>|Im4W?qGMOEiAD6aFSU;aSKC z=JpOUzD?9>+-*p-sS{eWj+P@0=H=$_OFFND6l3_O(JA{#r&;)xd&4;lelpcPloQTj zpmWJDQRPaNiekmsaNCK(E0tngHk%U8H?Ba(@-GOF`@buqAl`ZTdL3dofAJF#odP1x z?*W8&`il7-VDIASyioT@?n03%{y>n8k*=mFcy`6k(?V)E7QFl^!d#*AISOWzfSD0W z<59eRG}!@=Pb7fUblrCry&I}moDcK}b#wEgl#=A6M1Bn=Dnt{6h$!%;wNcTUFWZ;P zqqWRHQM`!J?5;TC%^>2^B6m?HMsSh4LHU^hun~hNK6?AfhRx4B!TxsnJNDlopLlPO zp|tt425O%-W$yI5X3TF=+y#Mc1BX7erg1r2`33ue9R&O7FTplmUN`5FXIdMl-naCz zhaXvwYoqsoS;g9{6_i)%UIN<8{ks0{8Say?0Ke%~H-Bc7Gh;R3cm7_pnIEy;GuLRn2_?AWyJltjy`C;9Nr~~f?p)D}qo-CP`)GC4KCaUB*KY`q9Z`qy*pc6M zgmE73Uf$$;)z+Kj7l7 zCsq^*!SmLVYs1b;&T@!p^8`y9Y-=ajZz1gKL#RY$Iif|3=o*L;8OzmSrzH2t%|X`l zla1v3lze|U!_tOB?u4VsBKEv~pB+ZN*J23nEx$jUUy;ZdazZYa59&3%{EjMK+)Q|G zhNw}utqpIlA|@m$!D+Wz463*UK+`W!R|Kk{inh4jfWmQaYIbqz%W9 zpBp-);>JN$6_Pw;Smh0aDl7E<)Vj+%^zP8f0U=mFO*mFHm-Z7maZvV z%{#g7zoTe%??+lLIiO$8fO%8lJqvp$vvA%Nn#bF^awkr1cm|xjv#VFt)R9lKOZ9`{ zxO>C%m3>)$>qsNMtk*KkTtMrYy;^P70yTo@%PQp)Iynn=Q3h$Sz)5Le*b7;1aTmulay`Z{s+?7P7`-OqNZrdzGWaofN2XmiDh_eGG)ny=!nqd)FmtI`qEh*sJ$F;|Ot2mo`FqkHix%1Vbhd8sv1oNpb7AQF=1?QM0C~ zH7Ml#J}cfj<%|TK9lV;{P9w$LPU3y|Xu9)5Ng{~kit8mM1eG$z^-kHmHXF{qFZl4Q)s5yEbmwvVP#aOz&c&8GZ?qVG1m=8uep$>77ge zI{%}~EDj3-3UQw085}6rQ#gGhi##=W$dhR^LwZ>~J7f*S$q4Kp$liJ$DzpB662z%*l=hII= z42Bm`1agNDdxqZ!Vpy=OYj>WwxIWx5zIWE#>CKV)5t&7u@%9a$X4v&JUj5iXT*S;T zE|uik=sTx)$Yi(MHBnOq1YIZgH8Uco5Kf^i_PE0ib|mFkfj`(sFq!ztT%kfdr} zUXR)Z+%9S4uZC4T`Oa&lFfr|^!SaVUS6BWb`L!9n{xB$6=uH?YACt<}?V`@mqxVng z!512U;bBKiA~#&6+E9y%xTNw&X3ThS$;{gxeYUV`*TSAXyA~=3r`~_>ZBrNCKRGuT z%+2l9ORwcTEFY6Csui*2hPsOT4#N?n0+GAuc=xW;9v2&9HmI`1@1fT81~;!LwWfSg zgFI)|ox-8C;+U1@<#%QeA6D)Y?^oQx-zy~rg)7#30_nZP4^O8%|4GMd{r?}ntAZWU zR=VbA{T_iTsSb90_F3dP?PouywLh0A?Sb{;KCUjIWC-8;*8XcIcu5h__;pr}K%u=T zNVR}9eqzD#60fu;z7`xa*>_)cfTQYg+A3Asf6E2GBAS;r>sLg>Dr^2d$FEOQcE;~# zpF!4p|0}A@1$d4 z8lz}!$H8k{5eL6z0Q5`Vpi&7kL*1Hqcv=iN^bMCc$;o@0nIsIPQO-#hj`!K8^^UDy>`%;zm->txFR&-5eHk<8c zyZF@#{Ju=D%Uj?nfS~x*3Pt?4Q_%05&$5NE@JusXsTvDn7toVWKDmYtY<+M2=+X1`JyyRRLO~rGfIv+6GAx%zb8+7!Ucc)(g9N+J$;_CwjfcCR0Q{ax~*We;rg_V8@~SMg=i2TZ58 zy8{K=zJ(B$WSSiAX~O|rU`o}ztMu55ji+NL8PjxY+WwFj)8+j_43K811e zxUgR>oN)c(P3~9oC_x@~X)S-DFTn2-OFBO^ST6M^y;q{G~mE9b6t`ZPTER52e7I^B+@M&|1gG4oY# zP*Wo_HSyFXpC(Uz>GL#LJI*sMKyKvoqO~|Ep3v?jJ>dlGlqws&)b_JB{$Cc#~@_zyK<12Ll0C?JCU}Rum zV3eFS*=-wVJipCX26+w!5IB2P;vS6tSN>0ggO9zKfsuiOfe9oE0AQ93W_a3TU}Rw6 z=>6LOBp3WE|5wSu#{d*T0q+5m+y<@y0C?JMlTT<9K^Vo~&c6*MNDc)FQi_O3kQ$^& z5eb3dAp|KBN)QR9NRTLa2qK}B9(sr%BBAtFp)5hvlX@y^>DeM4L_|d5tp_i`gNTQs zS>LzWLeL(5yxDK&o1J}cM-6Z}1;9)KN~qwT-b2Tp#f(|UHU9#N4ydY==%{V#HVUSW zqRgo(ifRJ|Rc6mTj!nxrI7EMd^Jj3=b^yDC&}PxL1B7OU zH2C}uZ8wcjJr$y+y~=tAq5lw}TO*5H?-DI@u8Bp{L(Zk~!p;KzF88hRJBOr)^W3M) zGpDJuri7HPM88enyJ9|}W-|!P6zbHv*+E@rk>k6ZEg?`XY^YYWYJSDz!0#iFy7?Ke z52Q!;5a-uH1(PPggpBn!%;__jHcfAjT8+I-yyv(}q}C!XUbBzeJlk>i z91Wd8-VBl+dM`DD=s@4$S;fZ`^5l|y3w;P|0WI;{dlL0ouj>=IDE)pK=Mt{d`$Fvd z5%^nFW)bHw;-x4vcth`=Q3LXaS>+FN_!pjQEgmzAaU=`L%)X+3^!+IO8g*)v!#K>~ zG5ues-Y5I9|49!2A^+HDesdhjBF>r`XZaRw|0CDSKhnpJ+42^s@AYf?aF@9ys#XB+ zD=Cb?cj_wj7U$$XBpBWs-mR*)i>#m)P}E&y1#_BXg&XcOvth6L!MjDgiD6szW>#sr zD|U#CS>ib#ASa}P5j;2k0_XDC9(dYgU|`UJ!YGC&hC7TdjL(>Im^zr&F~(9Lo-tU#vc?D_GC58L>@ZJHqydU4-3%J%W85hZRQ&#}Q60P8-e) z&OXjtTr6C2Tz*_NTywbYaSL$=aJO+^;1S`;;OXGm!}E;SfH#4+gLez>72Xeg0(@qC z0emHVFZjdwX9#Er)ClYoED&5JctuD|C`2er=z*}6aE0(Qkt&e~q6VTRqF2P2#Dc_{ z#14tQ6E_hL6JH?yMEr?_fJBSLHAw@>BFRNkd{Pcl2c#{elcXD@=g0)fprnE!pjk1)o zi*lawEad|#Oez*CDJm0G_NjbO6;riRouPV6^^2N{nx9&g+7@*)^%?5FG!itX&upK(st6W(O#l`M*EwNgievpGhHEF2i-i~1-i%d`1JDhZs6xQ7{QIX)xJja>Y~v2#rjAOf!IR zk(q#5joBo#59TiBJ1i6|bO5tMjI#g$00031008d*K>!5+J^%#(0swjdhX8H>00BDz zGXMkt0eIS-Q@c*XKoA_q;U!)Y1wx3z1qB5$CIJc2@kkITf&v5$jpKw6NHDUE5L6VD zd1Hxh4{-(;JG51Z9PHA5h8U~#)OqR(aUi}jbwoyn(#dyP5ei)}v&O0-?@#`| zh(+Ck-k-3~NVsL{pf%5!9dypE`|Q>ICA2PMj_XpEOMiQGU}9ZC4Kn{5m$27! z>8c_#uac|h?@G=Fr&E+}D$gD~s*DO!)ey#f}mn$__ z>8-crjAU}Am#%Ui&|BgSt8)_bg0xlDz9rQ=T#Mq%^6VU!(hIHsCie+l z9H@l=0C?JM&{b^HaS*`q?`>V%xx3>||Npk@hPSN6-JQW!fw7H_0>cTefspV9!Crvi z8uS4OZox_58HWep6}t7u8~5_bU2>PZBZ`*zt-O6H6TNB#=lF z$)u1<8tG(^Nfz1UkV_u<6i`SJ#gtG=D_YZrwzQ)?9q33WI@5)&bfY^KG<2-kuv3PE zaw_OSPkPatKJ=v@PF(b-5;qsKztm7)X`M`R%vxPkz=8(j&nYXNAml(ywHZil28@!iT_Hu+@{Ny(WIL2LW zbDUYsW(U>Wr-nP+<1r6-$Rj?6zxRwMJmmyFez235Jm&>|KJ%4L%pt&B=21%>`>1C= z4FqW29mJ%s7`f8gR{F*6L z7qD0?l@Xm5rOI8p(yFv8E1K2AjY>_aE3HbK(ylC1I+W$gfAgFXH8oe$;=BQ0C|FZn z)##6ubWcRP(qS{WL&5sy#I5%6xFY+6)s7ufE&OT;PRhH2VnIddj2OM1V{s10Zss$|FTK|umAE+ z00+SP{}^I`{(owZ|5OhDDgL*L8^H13xaY^Wba0tuzK3D; z0ErQCzXZeM3TYlbE0TB5=(wu9TEA0F0kV#_O-WHCYTINIaR<$uwQZ0Nxpu)}8+Xo# zK351TFF*2;cWszI0}81#x8Q>{OVh4Si;T2Wv^e2w`sPYKj03-h9dWHnKQyvJen3)F zQ~t5j^`_lSa&+Yq%P4F5DN_8OQT(#@Wew<6RLxDriBt+yG!hL5f7G$dP_2E^!85s{ za-U*IG14NkRvK^dm}bzHW9EgVAg}x$aS{7xe8i zxe7lK)YqKme+>x>K!5r~Qe!D}VTJ_@BO`_h{)KQg4DM8fEUL|RDj1I%u|g%wDCb;$ zUUJN~PePEveHKOjdVJRo^@_-DANoF$_W{}Tb$k|#8<)F8J*nLGDr_Ot7<_~!`Uoln z2)7B;!;APxn4v>PBdeH-_)z-6$Ndp zcG5TnXz3?T(fA#+%(LQ7(dR44wb#cP5jGD}$9XcJsEDsbDPb%(rCSXfa9(cKZ}NUNM!cMtquo3vqA5mV)*Yq^kfT~Z|~ClbvjoKOd#GZ z&ai0seQDaME7-YPDqXASvNO)1aq34?P0vLe`h+OLucG_+j6!ML%sj|P!uO;F&u3j~ zy~*#K^AjF-_x&ilh`aSp2eR#$tE)ySL9RNfy{fZ+g=T#13$MF^i?z{&sga=(F)T`{ z>Z!3TO2#U9lk}6E_~D55v~nbuk9`hA!$X-V^o>93wsrsPf43t@C(lifQI1ejP9Gl{ z3X+E*zT)~GVt%dglSn&yNsS4T-u1RwfIWiokR7gB#RZpC4SXPM<`At zRNpRJV^hs4vS3Td3xZLK6e@h!(EcbyZfZCyWF{(tpEZmO@_k?*E5=7TLOf@g zq3G9kDdYLqP!PJ@B-NRR!8D**rY`O4J!V+^Z>)i)%cPpGrQ=@T-Z)dZy;3K+HTgpl z&7Fp3*$y<=?mx1F7TIZ**`+nvwb$4^oH#%_X$@0lmn*QmZ7ZRpiNc4$z@wDJKFo_> zjIpXJZhPqboJ73)t~+u;!=o9QEa%{9-%inEZw6KVtM)`HuOMxLI#`W%FuM1cmMA zF@Mz=Chin#OFa60HnMn&6IKa_+r+u&;kwI5N5B+_s-N5$c@OTQO7j~OaTN+WJe{d~{Q zAZYbleP*?JjIn&l=rLET33_DibdFnC|0i{r+|AdL&05D9tq|cDSxU8sMn)Mc={Q>R zu0%|cJS=%#j#gLTBhM$`nIgCz*LR_q?~BI09k#xEPNuc@Y7t`EU!XV+{LN72=jr9b z{nt4eR-BM`5)zn8a|G|a0-AKi(a+Ub@YXcx2Q$Sk9y^*vSx5R2&{0ME??+WqE11*0 z9k|F6Ns)A<1%spcm1SsqE5Cp|g|KmTD@o{xu9u>gfD~c|iP!cp7!Cb6l*Hh$Y?pSY z2Ld=3q#|ck4PX|&W3ZwQzz@0)Ez}fZ?eVy9AriS;p%6J3W~n*QpPyLB=Bu}fDpZbN zfpqQ26=}wVW=r5oOgN=0<)FGv$aG;3l-DktOWGT4{NZ4O46#ksO z-rMS7!+@TtHojltg?9NC2b%_`dmOTLUs>Vn_ST;+d`hLKO3Jcs${5F@0rEx&p>2Q3 zKKhNBDq$T3gOrR#v6@cgjMnpgD9W*lgaw3(NHN<9E zO8Yq!9^%*cU;`LEfWSYY$e=K&lGyQ-NR^qh=wpnNCmHhW3gIQaM~Ue7G;C+NEpzY7 zRNzD3+x>=3jCm1LO16SO{<9oPwVP1&$?sn4XAF|(Q)E>P3Nq~^DE3&C#33SA=Posx z_9;!B#%(N#SKg~uX=+Ui(}=l)SFshb0`Ewc$y=(lFE?)Q*@C3-8VRn_*K(vy5H^4; zwoTGN912$G>xR2^=Nx^bECevueQ1;+Hvq8^Ak%Q+#e^SUoNGaxU2S|Pru#B&1k*iR z*XfdUD+Cwgs7<{qMmk!Ui%|{kDau_V=n~7`zT^|-v41BFT4)HQI}#Ty`EnIefH-~& zPzYDc#VhY(qG8L%PJrg=Vs9)o?<3U60)NCfYp*Y|*$lVM{P>YILeKa7;mkpdtOJE% zhQY?yUYL*_*d`(%wI)Yd*TcfSL^J_p0cd9O=%w?`bu`3W3baZSs39`XEiRH2RiWaW zQe;oGNUP3H;@|I$I{{67(ZdTv)#D5ZOAz94{0odOpc@3qj{V3L9mpwM{7@QA0!UN zaYW9Fbwjz8^|M}~cLpf|G1kzp!iO+afWPxwf@ktXSR7!cNd4(-)1aThWd}Dyb;_6Y)$eD}Z!Lis)%1#Fr z7K4r#KJa51W#NHOxbp-&nYZ+%dg^EN5je42Qtv)Ns(77v8o^BVy-g|dRrLrSwPvkn ztxW#=ubRJQ6HjqlKASn3%>cX*tMnH#{y~{}PZVkXEjK)2*p8(=_Nx z#becxK;YMmKj`LvsY5v`1IT8Ynh8){>}o%;vT2MC^H1%1Mp@W@K7IO7Vz^=L61GWMLK=gPB5ogyt-qySy8*Fv zGTZEu6^IhWh)$#1;Cc3kTj_Z1jb#g@1UM*2Yck_+D2_nnvF{Ohe@(zIlQfVYiAr*6 zWOk>X^zekQ(**kPfMG2cW-`^a;24T(CkmT-mslQ6_#+ZKdtQ8znIq?iZyXwlWtT8? zOGnr)RyCNKRrkakhcDgPDZK8_)uhn4jBdD&*wNQmEO0-YA{e=Q3m5A6!u+!nigBQ`@7jBs6e zp*i~_sOD$C0p{yc0-uVtrDIf))Qdyr>3*EBB@sLigUb8}`_SC}`d-0@C!6~<%WND_D6|BHm>Ke>@OE@yOrKR_=7dJ7+Prg9FP3UMwrnH=M+!EJTIkNS zf~a_bbpn87Zj#;111TdA!)d?>a3{UkS@u9tHFO~#(+sv+Df+eqEi$EHW7_)kP}1z| zbo=?wL)w-3*&%j67v@jg`oZuO1Sw3&3*0m(a;Z640PvCZn0JhJOeUNzuy?%xEVgC( z(`U{U$!}NY?iTKxtbrtDw}`ic2ji~aP9~>rHA6e9#XZ7Rq?&BZT4(gHWUQE$&Lt)N zdAUTaC=0@Mu$sZ0KDt1)VmcanBy=zDn#axv%VykIlI>i9yiKBMm-v#Ga?1)}~*7+2gSOdQaWBCN3tJ&k-T(A{2b z9vA_F%>g-;kEItbq`?`3!J@VuBo0an{Ja6KZ#&9kDZYEn^moi$L*Ed?&9l{T&;-i! zilaIV%{@8y4kCPDY#Gt=@gH@x@9g_?0=s^8oZScA#CckOpL}@?$KmJ~ zRa^)@uG1`oE)Yi_Tv)$Zy3xje|0P;2h>2A83*dXy9ik&X3P}6)h5q}3@|fYc@f3|= zjMfsA#yLLs_k-%ghuoyY8Or-#$wnS*D;IcYn)bU0t{tePlfCeN`t_3v#6-d9_n)OE zp)N6u&9+eIm4~j4;-gT_7>lz6szlQ{$qe8CJYzS&nCaU<;#LAT?$KvzL?dL&cHu4> z_^@C{d>OSoN1$x5JD1Mhm3fhR!`rMa7a9SnmJ$(cJWTER7}2T6VIXm7EKne<`D1(t znHGHwHMjH@^Y2}Ay5mFU+(K1&x^csgB(cTnau$C_2yLi6&>&))A<$V(Y56z~i-ssF zb{&oPmXOY(sk!G=J_SVmJ%}rXEXzijl@=}3UBEAcx@m#WH2=&{BPh$EUMdF+mQ=#Q zRV&eJK-uG}sI@L6paV;uhn`w;O^h%Wq7zV&sjopFGiBYVnlp^1DwW->aecPRd8k$W zduGf~++;`yjko4LNYNT5Ae%E=5$}4 z8l|hIHp!yYO7u7Uz6@m+TFJ|;pzN?GWc`5Y7WEx>MHe+yjh{_>MPq=98tO4@>4F;9 z0bAs$n`1Ze#PuFrJ)u5we(y^jLns)TC23PTL3BddyMvV~+e*7erxg#AYz84D;pyGrkT6T zS;#tub~f9DBh3w2vwv(|32_a`FcZ7vr<##|JAw}H5N4ra>fS)&Y$WR=wP<2uao)0i zib|6 zfr62&nW+zo(q{^vgyxRSEB=u(IHP$|yQHsdUrU;+*^<+3X1Cto3doJQjg1RgKZT_+ zPR>WRtqm+$*j!EoswYv6%hJq|MO)>q$YRhdO$Hf~G0qY|3F@;AnJBTyUGScQIi<}X z6->Le{E%OaUIW-PdN{KI0B0t0tNl%Kc|&7ndsN)rd%+?OsztRt2 zU$eK&8UtU!BL*T@s1A>8slKhS7YhDzKB1edY#phVKsMER-DoU@73h13>lC#_Ub}rWuzV&ijCAj5CR+i;|W*t#v&47fTw}FWh8G# zJmDysau2egF# z?8}QHv(_nw&aFsRKY&l!##vq;{*0=|T6yMdb!${h;S*o*YeIQ|k5T$}hAXaG9}EKy z;kKe7y`}+Jg5bX)qFDHdQByc6W9?%w}{O7=%g=R z)^O=cM)huK(SN|?V8J^FtM9GE{ZZ;l#kxXdO}9;&h<3B)y(vgIRzK7O>M@>uKZI}( z(Xnbgxb?{zA6wyaXVL^Y_dyL#jT>9(b8Ta6^Y`Ph7fF1$%6(#Jb<`z=RO-h=F8A4u zx%^0z2g)I6d&26D-g7X1OVzmjlvaFWIxL`26Y?Yq7yX$gjEWjr?j4q#JF7jpi3Fy!V>L_)F4R|z4nO? zH3zXD-J{eOWsd=u=wD~d>;gH`L9gL^NYKOn{k%h4+|b|pr1@Wyb3(9lvA9D;jwTD` zaG=2^q$KDt&7^Bwbo?Ob#@sQhGV2e}nwbBWPYPnb7L?Q#GeLBkMFOc*^E zZq;^ZvFg|0Qi6sOeUP6#O>-ewV#r5!#C>am=h=E<>e7Ty*|II$NDcyY*wv9-t2zr{VOP4`mT6aSNY)_R?_eI*y;5`jLlx$bI+QH42tL;8G6% zJxk_O9bRFXfWUXOJ}Vc5|Ju6fn#93cb-2I2L1hJKlYA!~Z9`N&*&Vh}=e!__u^Yja zo~j~)3gI=hLt4H|Ank$A0FL~S1kOO%0;t0Gli`|kC=-jm$|e4#cyY74oqy;2-p4W4 z{T_PMjYJ~Q#Y3aafS`@enS?afYql8)eTIx_yd0k*HaNK*)V^0;PrhV5mK{2*3=@GahsF3AtAKi; z)&BMO++|4iQDCtswDy>X7j0KMAlZ?|JgSgff_6>+pOM@4*2ZWqZQ$nIKTqsI$-Q2# z*jp=BMZBDOx04jbw`*->tWSSJlv7YsyRr zFwKaYj1K&uG+g|u1KU&;6}oh1#t4E&f9!>`CjnU#DXVNWVf7QOymx9?GOcK?wRUro zu(=V9%TzoWxv-gPeA%i8mp91>>r=L=W3vc`qH z;{yXTBjx1scd0PC(m;$Vo~4;c-BvGbkBq2ZqvG3kquBb7Hh&v7%sg=Dw$M@pU z9QsrIJv6%!=prWn5Rl)&5E^a7sZ?t&r!dhIa)(o)&wn ztqCegFx;>lp%R)Fi%itR#q#~+Q2-B$dDgyfkA1}tvKI;8w2}`MrVIxqh84M=$&Qx! zEFBYUP!B3vM=|-x6r-8+0=xk?)RS2XeqW?NWaPP|u14%grvQzl@u$?F{xIE~=Z_U? zVb6=#_z!ifp45Qi27GTdr;^@@T;RKi-fPuiw72 zSXaZ98WK3})&FA=Q2ZTpXl`CWT07_bhq6GGY-5SVl&ZhL?1^qzxCiW`(o3$!g5}%;6V!w zX=Xs8ei;fchqO3_qbHQO`%e}KPBi*iY9BV)k;qWok9<4I2D4zG7S+aK6g-WS^kw9F zehA^u1Y8JU=IM|8OW0qfRo#elmB*5kieoOXXSlBM4nL&t$7<1X!D$3?vzs@k8V}BSD7dfv%^EBTCI!N3-zqQ?p}+xFb0!>NjN-&C^bRlbdah+k1jgk-RJ5;)YFP5BFni4 zQquq0O>N?Xn?EF(i-LAhBRHV4h|<%ZC32^)i;bEd2A1v;==?O> ztnH24e$o%UE7B!FGWv`Y*WAhN5x^i{7at_SLe%-FLYT=)5@_BX8Db{IomC3zAghW0 z;2e_#*Y?nHtJSd`dg+2MJ4Z@L(#<&ynC*3yPg%vch|O`d$Tv@yex1WpH%Di=UpCN4KBuoLWr^X{f z0G_x8mDdf(Rw(;X7|N6N3e0sVPnom5ZYY!@u1P&3OVuhExD&bK{w_|u(+U?2)9JmN zVBZxRRvTho?tZ`h_h6c$JcP_jU}y(VH*BASLbFlSpqbN2dh{Ik``Z3>qs7FSgaLG7 zeE|Vl>o-O3X294vz%rT4YLq+5qEmk@d1e1~;}_1WMKSonVf@W3{$NjafB?NUG*6ja zv&Cl}*V400&(t7l#!Q{i1=Yfxc#i(h({FrtY9sE<9~XNNP5DWOwk@5S!Te~ySY1;> zeqyB1C(*J|(+1pS#Hu|e_i~~@AvUpDFzVz;vO1a+hwq3*`$5QNZCFO=El>BVu`m;7 z^`x#89tlrL%>M0rt0YDIlKL{AtxmHs78g(k2ID|BG$For+REvxww3_K%X?%UabYD} zF|xPnw=cNb7S#ST5u9q{=Sk}+um=JAYXl>GX|j?;^UlG4a@{wGkW4dTA_6^Jp?+vE z%?Z0??@B;N8%L-fnS&0xLia+qn`$bw-J>xa{M(H{wuc+!hGjwpx_homQ5Dlz@Z!cc zv}$V1>QM}{nPWs!wF}tb(fcm9Qrc9xn}56M5CBcxdLdl5Q^f47-b5ZHHUs|2b0_m4 z0gcMp0KZcbmL8rF(a>GbKv}auWy)SDSzWUwnTlYO8xl#A;YqE{H__SVo zz0`>R=05p8Qbgu*I{7EKPV=1y9s!odIK15H&rTHCwPX5U0GDN5h zOAo*!=cj_+t&q}OjMU+ayiARJ*^3=1CpaTDA%a=Y=&D?#cOspMlDKa7s8^`S$>4}I z_2JWY!d6UOCr+C&0zg1;hoa#j+A`55207p$yy;ZDtF>hH65r^Jx)-E@`J)gGu6`l) z&BgZ!TLssxUjC!y^`#^eD>+jIH)C*i3m^P@R*0&ci8;#Q0e5Cb>C#oal3v>{2D;oy z)4Q~)IAA}v$Ky0o3r;*Fe1Q92bhT&hp}kX70U1>J?G1pjx(Eiuk)$l#tb zx01ZDyl^l{{3XiRPdnfo>;%Lj<^ zbc9rj2qjDg1zvI};j((E20nRzD11>Lzbs)EbZLHhvE63&zJDBU~6Xa&Wh0#}-ToaHi}7}Bo3a#s@R zfKI`FX8LDCK6SPquUu{UN~gh|b~<(018R|<&evi;=9N7Pp+G_>YY`~^Xu(X-$PymH zneQCEtb&v==X|W~L?kv%sikb$#Woyxej?){VY}!V%za^wLG_%}xiwBSy;UYVu30V# z2w+FlT~JCiz4jrn3q@Z|?C4MB=8AFb#L*w{@O4Q>&m2@|CjY)u`+_BTA{MI}2krT1 z2oDo_*4VV7dEh2wWJ{Q4)MJ1LKmLdu^Nc~)5*c`lgU;i-N0EXBwInQQUHc;Q3I*2Y zmngG8Y7(-2fgfe3Pryj&6E%H2K63Erk(>d_d13>`6{`ytgOExh+F)2v@<7r-7P!X>gORv(U?9_(8W@`Y2U19 z1xAoco9KPfV@Oy37paH2sGfXsyUr_&yMs)38(c>kg=B=c?Y(?UUQy&4bUChIkkMd) zDCjHy0p-WEh%u%(eFZTeP>t)|dK-Fe)Z9tU2YyKWGp!VAiy%Jv!2UgD^X^H^5!q2C zH4P$JA$p67mXLOhW1G0NfV$qDG_@r>B?62-TiN8uM@4rjAC1&*<7Q11DR(WN8WRnf zO=r*slqK7wcDzJXhYe6SWre#EACyek*9|V|q9nx$-|<>5%Wo?mIzjmDeswP2&p6@| z@wHUU-pV{g=T3)2hB)W3wjY1>PMXLht)h_>-n5JfIoeQ?IK?;;nl(vDCpOelMCRHb z&qy(PB!EWJ{me`}Dr3NGO=8|Z;TLIO756O@xdK`vWlOugX=vsC2bAu^PO%WzvS;^G3GqIFGBQzeu}A_#V*fF@kP z%9YxC45E|>aQ6z+Km62F1<0wIHhu%v7y3;h)cmTlw4R+{y;F%Yh4ttnm8U_sbv~a; zCcvN2(#=uVjKK8veTjOG>S5wQfZ@rR(1U9UF)ZVS10PwindU8DxZBE%%u(zyG-QG) z0u4%GBgAYY%!9G}etyZF*t?8c!>86(zLc}udk^*T)49i_Wf@VDWVuz|Xrbu<^0v!n zi6H(h6RGSX6$Xpy@RYa=UcJ}T2vPb0yKaVacyq+x%mG{gcs!T4xSW~oFJ@=Q=h>7l zw*|6g11FX;l|d?1fpu9%#aCTtC-K>)TnI=hXt|jQFwNQ1*Efh8CGFUwBg3Nc^XUpt zvCfT|maJ}mY5K#zLB&{zs*JxX8>9J~E*|a#u6ba_-=!8H9lka3q?X;+%#9icL}E*^ z5}xCgK1tjf0K*2}7`p3q??#U=Yw@Vu1Oe5Ra%puAy2=FAbi#JY48D?5(STk8thJeykzRyV3)P-|!xKjBEln5x<3Q^Z~Ef`{^5z zTG%1e=7<|<=ebv2&%6jCIqA=e2wMttHbe;D4?K)B{bfaioR)~455ADx;d4*VMW=y1 z2WpM!wuZJ7tFwwWM)ig>Z`?>5t%k4s~QOWU; z!jL_8sHWF6iXMxNM0?|bABK<_J14;A>7HaJ@P3j zm!}zDWIN`UIa5K0p_yzCy}}-AkM;K_0Zelsv#2>DrkH?4I!p{@7OAt`k@0CHs=C7^YM&YsEi9YPu@Rd~? zlJ?2Lkd1h8le4Kv36Py06g7X)n&DTNz3rtJVPY(?zHbcL#nI!K{3Uwy2lt%w+XZsr zHUh6}N}7V0z;s-Tx?*y8gJ&bP4(JWd&^dtJ5F7UIOA?FboCkjT}<@B^!FeCw|)>3Y$s9q%i4Y>iS1pg*~?9TGanZcch{nkE%+xTct*9BB7q7ajLdqqLC=WD!4+ttCf`~ba^-U`j_diD#<0xTOgt}HR{D)a#|uyYFZ%pcTmxhtmi1QpL=c6{mK zgQ{0sVt__enH+BCAiGw;*X#&z1i$ix%T6p31A^|+5Q?=3?{CW^-a;;5$)O_KVnODo z>NYAi8DTJWy~RNsf%E$f@GoLc*?!B2lEsuA6wsP8&n1WHU5cb_T5EB zRAg*^8_$UwMjt;On@son$Q$n|xEPcDryh-2d$<{`Zeccx^Fu#_=DmE7ESlK#V;8=6 zy57~V7|D-u#gPHuxJF8uFWb_Ar&PdX9mB7?@E~o;>O~P&_D>$APjcAj2Zkhb(`kID z0vdhiO2%PXzkO00u=HY3l?nQp{Qw?%UGMdrJ-B`?^VAw!*{p!rkCB6A9ctR zb1#dDBe_T23W44Z)W9P`&hPt0P4_=NQHuKI%Pf<>%87rgk$TQ25WWPCxd_3Gcb-0| z?!s~_MO^S9V3fQCA0 zV?-~PdN0I^SXQ@8i~FMb!`rXZB@&T);xWaDirCm3MOG3`?qInr69o-Bu=h0oOK9zd z!dbet#DHmb(zIs=NRJM`Q>1Uv$?rTy3W=DorFAIEdPC-W;subH+s=-8FZCbU?6Y5QQeTPOV1ZsrLoNLXH79!C5;p{t z=T&g0dN}a(FL`&@{~Rhwi@GkdM|Ve1PVZFyOmVluGYHR=ICcfq#iRf9J6A~W|KQ{b zi1_eE+WhS&{Z*;H+TM7rYa+%LuIfwvYXXfd77LX*uSTI*rZZNDQ|Zx=G9@bSRQ>$SM=uG>j2Oo8BSl zLHvUXNSy@%WBG@U)9fg2fw`{9us!HfnV=Wou^uM+oEXY|Y* zEDuCce@p#S(wZY82nYYfMK@Yo)D+x5(Qg^Zh7^P^Zh(Da*%f}Da9dGbRL_-@{0(#r z!ZZwDm;SL|Fy~I5?)BG>LKqB%E|5k3a?`|*Zc<~lhm@n@>Q1%OH1{PC9VNfr~tGXxu4I5uj zq-6S>J0;{qE61S8HT|Ty+3;?qT9bA?DqOZ={g*M?i@|L1YpHtv! zpwCJa88(#D{Vj}zS_7v-1+JZ)Ut*3JAEfS%X{>0YBu-sP1gF+Q+Epqe)b@9_en8eF){FDs}D2UdYrn)&Asa z^-=i8YG1o-zeNlUo&LwV2)kaDmNY#*@B1fV@kBkddZNT*?p?EWf%MVW@o&7h(Nh7} z0fDlXUb|8?F?gZ~JE6)DRD3)#B!R;YUDSuSrKP?t#^VE4#XdoDME zHy4ZD4m#4d2}#7qnu_VRCH?#`SOtmhi;dZh0_{610Lh z+kM5}lcrqCegb0{NkB+N2@88)Q-cTT>qQ*_$Qy!5f2==F*GcBU*kDsmk{+w~ZsH!x z)87KIW|@a*W|UiSREewU^NCwk&AcvQbh_XH0~sp|<5)C;DIXOg<}T6?Z^7bt_r=j6 zdFx&gL}mV3ftJcnw@h<;!^_lOx|Gp7-sar3H|D{o`>s-z#yHq7uHO(%ZD1Lj&hJjb zBsM0LoH8~N!>=Qrey#+*FcxQ(hwZwoq81QWp1jA`oLBCP0WpxoIgGdd2IPs6qM_7K zhEpALQvFp&C6p+^d+@&p1^7p;wTQhGpBe0IaelJJcycFvxJ8o=_0BELOACgk@0qk# z4#(>AK30;MqqdZTXGU7>-2o=%uvL6TYCjwYGelWCi?@^{l#Pz7#Y$`6B00gA&o_ZX zKrZcPVmU1C0{OT_uQDWtsc-Mf6j?LWEhjmlS>;3+wtO(*Mj50jsSa zejET=$i0Wp<~kH%{+5O69bbqS%4PqSViwPZkPalZx#3$YO1viB+qd8ID#lS&4$$6VCBm-WCgAy$}R??5reN}ir8amzlZw* z1PiXIqZIH@A-VIPxuMA3chwHt0|AvkaJ`5p#ux_V-#^?%PN&c!niiLhQ=y1H=xgm?H_9XTdC zU~L>zLo>;M3~~;{k>9E81l91dE#^6OkO1kc8c!`xJ7IJ7<-k8%|8-*f^z+3?b9qi7 zMAGJb&bAX9?0en4FrNECVUn?xi>NnV?%Ix1Ki)7!iFf;XT>GHpb&w0*fSD9#M?HIs zC0VUU%$o@%N|^8F61uy?BMZS!F`}wdPWpLq>b02wIfb8+D8yx;ioYYx*`7(Y(Zmn7 zF$YdORXyfQh`KiW7yhuy)uRx_Oni7Lb}OxqjKZF%LHwf~pIIrgk#h_X>Npf%iuOg_ zBX9dDNuHXoNL5Ex%$L3|#j?i`L3SCWhHYyw0Yuuu6HCG^KQ@CU06>!X6)^WWwLVI< zBj_}H3&cot@;_4v9`iVKi&rg1$}wzBd6bd(GWnmkMPd7i3m$mxX z#Q)wv7K36`&bNpc)r-Yz1+_47UfX*SKAqe z|HH?}i@^Y-oCjgsdvRTKy8)aj6Ys}DVOp?sL!Wd^il(Ro4gpS#Bs6O^_{!n~;w)Wm z^&*nlx=7=GEe@C!TG^dHZv$a=f)nLe(~sWK$H$k94iO(t$;D6L|H0i9?up*EZgs+y z0!ma5{x(BJ-I%a6uvgSWEGc3Y#4N}%`HRf9DpDQ`ajT5fgj(g-vPcEOwR~buzgqF5 zEhsZ`@$B#ZK{Q5mmCq;$bL>}&j)=NpYb>`4Zm96v1ECzE`8;sHC@55_38fN-IFSZq z3knI)leRdlA!@>O#@s7|Ru;B}$bA`lZCzMWweOZXMQ$L`p`vDx4?fFXQRh5HRCx7{FKO#DTZfLbU{7)Fu z%%^PCQY><0Au@MBV8rc>n%si?0t&bD6hmKk&LpF9&=^HiCQ;bTd8k$Nh+3g*HdvtTzx9;(^QTRGU(| zNmESw0rlc}0bvF-U&OR8X)()6)i$)|=lO>^vZcypN$KLMUkE&Ks1@8Pyqdta3RrvZ zUYlQM!wmudnO|H2baO0%;6T~+1++AuoZ9`k(UBskdCuahFrb%JZsxK5S~AdRh__m5 z0GYBm7|xGoXa{+hkZnDWtreWxF+hwU%_v#GjIhuURE1kO)5If9<&cWHB*_jHV5(jtcm_i6s~-T zCG4(Df7l&i9yra?vJ-$I;2JByOLZ0@Lj})5Nu?0R{|O-u z-tpQgyTx^j3YN0-^02d^pezyb1IHTe*&YFG0%vo)VAgClK0gh#_M1%o6kI1~?kI1n zgK))gyis^ll<*W~wsR?)oX+VCssPdcddd({`T>JKq)U@Ebv1tYcMa))feI1*B$cxx zY=|vVnOB>j&d4`(>l0nYF=LDllI7M+PfZl-v~HVPYr##qU&mKfmtc?>*jIrLGGU1s zdjLa!B3L|zI9#bPwWvpm)Z!~AVidm=zHhH?Q3q{UU^pigV}yOv=w{oQsCuGVJ!;T9 z@L-G>A}Y z*ZXalv6=0?VHP>Ac7eotV}*huG|Upj@f)Re2h}4v2bd4w!0mUJSR*VOdC68@u$$?9 ztg}&8`c0Eap`wQ50xdUcv1BtupaGc^i8rK`v{Qpk6KeQk!Lb7i@o<;OGSXQnoEdo& zGc`!)s;@}Ku42;z&kUm0np^_nQN{%zJM~notkFV75b%aIY3?>LirC={#FP-+LRDB! zHo&hSxWXbM5>vcA{5{oVZfwtpJW&raAR+**ZN@xlJUTvfw-FY=Ocbwg3ECv`FMgY3 z`$cyG?s6sy76+Vph8oL*D)r4eJk@ZSOWu_}xNMV&5HuQ-g33u{w*}SGCsin|dR4nb zLMPGeFVWWEr3Pa>*>-$0o-SU}gM3x=jJ%puj*eYmk{C(>1R*L~=xj*wZZ631dK2m# zorz{sy(|v_v*=y~Wl(zWBjsfHk+K0# z%(3w6(?FW)(T!;qEV}88PSeyki>A(DmpUl|5OE98Qs@iB&9ILE6&L@u$z0G;Lj*y)*g)rh zpI^9;4j_SMfgZ=n`{c~i&!s&DUjb=y3e_15feUq~k`?K74^*V0L84Q`^l*V(whWq$ znj@NI`;>X-5{9R5sj6|f@>jjOb6bY4rL#ii1;!D*imtQSPTC_V9v5&SHXQo3$0_Ij3B=(I(F(lemD4C5oLqor< zMD(Lt+s`zu=-K-NJDj6i&2>Bwl=@=jon(jb?N)h|`3wNQ#MTvcBV$r8J)l__b7fSt z^hN3YZ)ICLfVoHOfL+EeYcl|8)Em+ek9~X9TV}J!pq&FQ zg5%6-3E=qJ!gU(sKB$I{SAj2zhWWz>OLXQ5@`~AeI~yer#X#2bYY3BGU#@=zM2)iu z;_`FDRG<#xU(KVXbq-&C>7!@s0p0n@!< z*wJ`e1^5oWlOkf||H7~9%EbkrKl;iuBLsZ*Mo6j=&?B^)TrTAd%rEF*#Rt#1L}52Mx3xc_0Bm|v+AM5n=OJdJ}9M_~FZO~H~%W@}U-gemSUQqIlAe6c@ ziMK(&Ropb>l1mbGn*dZr<+)GvP-oFGzMz!%!e0+iZ%GY-GJZ2*)&!Ll+pvijp%gUI zq)Y;LT*5IGH6qOzuu8Fbvb1`(`1iw#0AJ2u2pu&>NpWN+cYa(TdH`n;^FB|TQdFFR zi7^0RUyBq5RVD#j9xyA-rmm6+7*)OpKP|j+AX=duqBF^g77RZjqohWRmV?X+r0i;O zGZ-|<6xq>n{C6WTJxDLt5u#2=duJc2$#)vcyYx~Xk(OGNB+P?uVOGF<7csS04tW}o z!7f9)MOh}Ddon#Cz)ItRnM3F>sPm2leV`BSywZ-bFd!2PL}6}B9|AN38T0F?nkZg2 zyzw}KTvaFWbdpZjFQLqFHmy-y*dudB;Q1UcqST(o=Souq0*g^V#}+I77#l3iNRkaq zAOY)rrg+@pnkI5$c}qZoF)zue~9TD3i5T zC#B4rTa0Jnd^S+3-(OeKfCDcP1^kq=wjxGk3S%jy1ZzALoxY`PynGr(EUI#V(9n>! z78JHfIB!?_sfmFi-9mt((=#BEObAGL5D6~o)&6y|@&(D_H z0HBd;fW$Rs-c8XFl}efU5)6|TvnVdrR2AeU;E#}J@u zt3o(mtB&Lr_wK8Wq(2Hqwif7xx`q{2GXukjQ{W^8)%dOFBp9(&8qxK>|5|4BLg;-D*5V^bLaHha=EZkjz8oCx`BpT8riy5Fi6g2k`cqUu(-s==?WY)jd!r)&g5jC>H=-69rH^iFp&ev0`)UtRJ ztY&Qf7txD5n+2id0o({>6O4VPNzq3+n>U{lOfM%~a`O&dC(s z>WArpk|ru@D{7`Rrra{oAd0wJW~6Jq#gj6gK?rGp`eF@na#nofK*-jF2;uj-?tw2$ zK@);z)?}sn_{&Z8>)IVe!sOn9S(D&#%jRqnH3$fW86=Kl-MY?3U+Nlyy{By zOQxa+yBxB8p{?bi)T?Aag~SA0x#j7=9B-6?w3ok=D^Ui-20~!sxS2usVx}50sK{m^ ig3W + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interactjs/dist/api/fonts/OpenSans-BoldItalic-webfont.woff b/interactjs/dist/api/fonts/OpenSans-BoldItalic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..ed760c0628b6a0026041f5b8bba466a0471fd2e0 GIT binary patch literal 23048 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interactjs/dist/api/fonts/OpenSans-Italic-webfont.woff b/interactjs/dist/api/fonts/OpenSans-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..ff652e64356b538c001423b6aedefcf1ee66cd17 GIT binary patch literal 23188 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 literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-Light-webfont.svg b/interactjs/dist/api/fonts/OpenSans-Light-webfont.svg new file mode 100644 index 000000000..11a472ca8 --- /dev/null +++ b/interactjs/dist/api/fonts/OpenSans-Light-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interactjs/dist/api/fonts/OpenSans-Light-webfont.woff b/interactjs/dist/api/fonts/OpenSans-Light-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e786074813a27d0a7a249047832988d5bf0fe756 GIT binary patch literal 22248 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 literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.eot b/interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..8f445929ffb03b50e98c2a2f7d831a0cb1b276a2 GIT binary patch literal 20535 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 Z%0#`NexefPFV?Xj51H#Y#AC7WXn+Jg($4?@ literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.svg b/interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.svg new file mode 100644 index 000000000..431d7e354 --- /dev/null +++ b/interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.svg @@ -0,0 +1,1835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.woff b/interactjs/dist/api/fonts/OpenSans-LightItalic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..43e8b9e6cc061ff17fd2903075cbde12715512b3 GIT binary patch literal 23400 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 + + + + + + +
+ +
+ +

Global

+ + + + + + + +
+ +
+ +

+ +

+ + +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + +

Members

+ + + +
+

(constant) interact

+ + + + +
+
interact('#draggable').draggable(true)
+
+var rectables = interact('rect')
+rectables
+  .gesturable(true)
+  .on('gesturemove', function (event) {
+      // ...
+  })
+
+

The methods of this variable can be used to set elements as interactables +and also to change various default settings.

+

Calling it as a function and passing an element or a valid CSS selector +string returns an Interactable object which has various methods to configure +it.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + + + +

Methods

+ + + +
+ + + +

preventDefault()

+ + + + + +
+

Prevent the default behaviour of the original Event

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/img/ijs-32.png b/interactjs/dist/api/img/ijs-32.png new file mode 100644 index 0000000000000000000000000000000000000000..63d1259d9edbc7d4401cec3135b76efcd26d2d8e GIT binary patch literal 1337 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 LNkvXXu0mjfMvU^P literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/img/ijs-anim-short.svg b/interactjs/dist/api/img/ijs-anim-short.svg new file mode 100644 index 000000000..56a7ab666 --- /dev/null +++ b/interactjs/dist/api/img/ijs-anim-short.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interactjs/dist/api/img/ijs-anim.svg b/interactjs/dist/api/img/ijs-anim.svg new file mode 100644 index 000000000..4d2703569 --- /dev/null +++ b/interactjs/dist/api/img/ijs-anim.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interactjs/dist/api/img/ijs-icon.svg b/interactjs/dist/api/img/ijs-icon.svg new file mode 100644 index 000000000..9a3fb22d6 --- /dev/null +++ b/interactjs/dist/api/img/ijs-icon.svg @@ -0,0 +1,103 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/interactjs/dist/api/img/ijs.svg b/interactjs/dist/api/img/ijs.svg new file mode 100644 index 000000000..37a883ba4 --- /dev/null +++ b/interactjs/dist/api/img/ijs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interactjs/dist/api/index.html b/interactjs/dist/api/index.html new file mode 100644 index 000000000..b77a51747 --- /dev/null +++ b/interactjs/dist/api/index.html @@ -0,0 +1,53 @@ + + + + + + API Reference - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

API Reference

+ + +
+ +
+

interact.js

+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/jsdoc_index.md.html b/interactjs/dist/api/jsdoc_index.md.html new file mode 100644 index 000000000..523fcbcfb --- /dev/null +++ b/interactjs/dist/api/jsdoc_index.md.html @@ -0,0 +1,62 @@ + + + + + + jsdoc/index.md - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

jsdoc/index.md

+ + + + + + + +
+
+
# API Reference
+
+<img
+  style="background-color: #272822; display: block; margin: auto; max-height: 8em; width: 100%"
+  alt="interact.js"
+  src="img/ijs-anim-short.svg">
+
+
+
+ + + + +
+ + + + + diff --git a/interactjs/dist/api/module-interact.html b/interactjs/dist/api/module-interact.html new file mode 100644 index 000000000..9882f7266 --- /dev/null +++ b/interactjs/dist/api/module-interact.html @@ -0,0 +1,754 @@ + + + + + + interact - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

interact

+ + + + + + + +
+ +
+ + + +
+ +
+
+ + + + + +
+ + + + + + + + + + + + +

Members

+ + + +
+

(static) isSet

+ + + + +
+

Check if an element or selector has been set with the interact +function

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + +
+

(static) off

+ + + + +
+

Removes a global InteractEvent listener or DOM event from document

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + +
+

(static) on

+ + + + +
+

Add a global listener for an InteractEvent or adds a DOM event to document

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + +
+

(static) pointerMoveTolerance

+ + + + +
+

Returns or sets the distance the pointer must be moved before an action +sequence occurs. This also affects tolerance for tap events.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + +
+

(static) stop

+ + + + +
+

Cancels all interactions (end events are not fired)

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + +
+

(static) supportsPointerEvent

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + +
+

(static) supportsTouch

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + +
+

(static) use

+ + + + +
+

Use a plugin

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + +
+ + + + + +

Methods

+ + + +
+ + + +

(static) maxInteractions(newValueopt)

+ + + + + +
+

Returns or sets the maximum number of concurrent interactions allowed. By +default only 1 interaction is allowed at a time (for backwards +compatibility). To allow multiple interactions on the same Interactables and +elements, you need to enable it in the draggable, resizable and gesturable +'max' and 'maxPerElement' options.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
newValue + + +number + + + + + + <optional>
+ + + + + +
+

Any number. newValue <= 0 means no interactions.

+ +
+ + + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/module-modifiers_aspectRatio.html b/interactjs/dist/api/module-modifiers_aspectRatio.html new file mode 100644 index 000000000..44b4a3e8b --- /dev/null +++ b/interactjs/dist/api/module-modifiers_aspectRatio.html @@ -0,0 +1,179 @@ + + + + + + modifiers/aspectRatio - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

modifiers/aspectRatio

+ + + + + + + +
+ +
+ + + + + +
+ +
+
+ + +

This module forces elements to be resized with a specified dx/dy ratio.

+ + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ +
interact(target).resizable({
+  modifiers: [
+    interact.modifiers.snapSize({
+      targets: [ interact.createSnapGrid({ x: 20, y: 20 }) ],
+    }),
+    interact.aspectRatio({ ratio: 'preserve' }),
+  ],
+});
+ +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/module-modifiers_snapEdges.html b/interactjs/dist/api/module-modifiers_snapEdges.html new file mode 100644 index 000000000..38dfb11cc --- /dev/null +++ b/interactjs/dist/api/module-modifiers_snapEdges.html @@ -0,0 +1,190 @@ + + + + + + modifiers/snapEdges - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

modifiers/snapEdges

+ + + + + + + +
+ +
+ + + + + +
+ +
+
+ + +

This module allows snapping of the edges of targets during resize +interactions.

+ + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ +
interact(target).resizable({
+  snapEdges: {
+    targets: [interact.snappers.grid({ x: 100, y: 50 })],
+  },
+})
+
+interact(target).resizable({
+  snapEdges: {
+    targets: [
+      interact.snappers.grid({
+       top: 50,
+       left: 50,
+       bottom: 100,
+       right: 100,
+      }),
+    ],
+  },
+})
+ +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/module.exports_module.exports.html b/interactjs/dist/api/module.exports_module.exports.html new file mode 100644 index 000000000..675d6f3cb --- /dev/null +++ b/interactjs/dist/api/module.exports_module.exports.html @@ -0,0 +1,167 @@ + + + + + + exports - Documentation + + + + + + + + + + + + + + + + + +
+ +
+ +

exports

+ + + + + + + +
+ +
+ +

+ exports +

+ + +
+ +
+
+ + +
+ + + +

new exports()

+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + + \ No newline at end of file diff --git a/interactjs/dist/api/scripts/linenumber.js b/interactjs/dist/api/scripts/linenumber.js new file mode 100644 index 000000000..8d52f7eaf --- /dev/null +++ b/interactjs/dist/api/scripts/linenumber.js @@ -0,0 +1,25 @@ +/*global document */ +(function() { + var source = document.getElementsByClassName('prettyprint source linenums'); + var i = 0; + var lineNumber = 0; + var lineId; + var lines; + var totalLines; + var anchorHash; + + if (source && source[0]) { + anchorHash = document.location.hash.substring(1); + lines = source[0].getElementsByTagName('li'); + totalLines = lines.length; + + for (; i < totalLines; i++) { + lineNumber++; + lineId = 'line' + lineNumber; + lines[i].id = lineId; + if (lineId === anchorHash) { + lines[i].className += ' selected'; + } + } + } +})(); diff --git a/interactjs/dist/api/scripts/prettify/Apache-License-2.0.txt b/interactjs/dist/api/scripts/prettify/Apache-License-2.0.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/interactjs/dist/api/scripts/prettify/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/interactjs/dist/api/scripts/prettify/lang-css.js b/interactjs/dist/api/scripts/prettify/lang-css.js new file mode 100644 index 000000000..041e1f590 --- /dev/null +++ b/interactjs/dist/api/scripts/prettify/lang-css.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", +/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/interactjs/dist/api/scripts/prettify/prettify.js b/interactjs/dist/api/scripts/prettify/prettify.js new file mode 100644 index 000000000..eef5ad7e6 --- /dev/null +++ b/interactjs/dist/api/scripts/prettify/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p * , #main .article > * { + padding-left: 8px; + padding-right: 8px; } + +header { + display: block; } + +section { + display: block; + background-color: #fff; + padding: 0; } + +.variation { + display: none; } + +.signature-attributes { + font-size: 60%; + color: #aaa; + font-style: italic; + font-weight: lighter; } + +/** Readme * */ +.readme { + font-size: 16px; } + .readme h1, .readme h2, .readme h3, .readme h4, .readme h5 { + margin-top: 1em; + margin-bottom: 16px; + font-weight: bold; + padding: 0; } + .readme h1 { + font-size: 2em; + padding-bottom: 0.3em; } + .readme h2 { + font-size: 1.75em; + padding-bottom: 0.3em; } + .readme h3 { + font-size: 1.5em; + background-color: transparent; } + .readme h4 { + font-size: 1.25em; } + .readme h5 { + font-size: 1em; } + .readme img { + max-width: 100%; } + .readme ul, .readme ol { + padding-left: 2em; } + .readme pre > code { + font-size: 0.85em; } + .readme table { + margin-bottom: 1em; + border-collapse: collapse; + border-spacing: 0; } + .readme table tr { + background-color: #fff; + border-top: 1px solid #ccc; } + .readme table th, .readme table td { + padding: 6px 13px; + border: 1px solid #ddd; } + .readme table tr:nth-child(2n) { + background-color: #f8f8f8; } + +/** Nav * */ +nav { + float: left; + display: block; + width: 240px; + background: #333; + color: #eee; + overflow: auto; + position: fixed; + height: 100%; + padding: 10px; + /* box-shadow: 0 0 3px rgba(0,0,0,0.1); */ } + nav li { + list-style: none; + padding: 0; + margin: 0; } + +.nav-heading { + margin-top: 10px; + font-weight: bold; } + .nav-heading a { + color: #eee; + font-size: 14px; + display: inline-block; } + +.nav-item-type { + /* margin-left: 5px; */ + width: 18px; + height: 18px; + display: inline-block; + text-align: center; + border-radius: 0.2em; + margin-right: 5px; + font-weight: bold; + line-height: 20px; + font-size: 13px; } + .nav-item-type.type-article { + display: none; } + +.nav-item { + margin-left: 12px; } + +.nav-item-name a, .nav-item-name a:visited, .nav-item-name a:hover { + color: #eee; } + +.type-function { + background: #B3E5FC; + color: #0288D1; } + +.type-class { + background: #D1C4E9; + color: #4527A0; } + +.type-member { + background: #C8E6C9; + color: #388E3C; } + +.type-module { + background: #E1BEE7; + color: #7B1FA2; } + +/** Footer * */ +footer { + color: #474747; + margin-left: 240px; + display: block; + padding: 30px; + font-style: italic; + font-size: 90%; + border-top: 1px solid #eee; } + +.ancestors { + color: #999; } + .ancestors a { + color: #999 !important; + text-decoration: none; } + +.clear { + clear: both; } + +.important { + font-weight: bold; + color: #950B02; } + +.yes-def { + text-indent: -1000px; } + +.type-signature { + color: #aaa; } + +.name, .signature { + font-family: Consolas, Monaco, "Andale Mono", monospace; } + +.details { + margin-top: 14px; + border-left: 2px solid #DDD; + line-height: 30px; } + .details dt { + width: 120px; + float: left; + padding-left: 10px; } + .details dd { + margin-left: 70px; } + .details ul { + margin: 0; + list-style-type: none; } + .details li { + margin-left: 30px; } + .details pre.prettyprint { + margin: 0; } + .details .object-value { + padding-top: 0; } + +.description { + margin-bottom: 1em; + margin-top: 1em; } + +.code-caption { + font-style: italic; + font-size: 107%; + margin: 0; } + +.prettyprint { + font-size: 13px; + border: 1px solid #ddd; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + overflow: auto; } + .prettyprint.source { + width: inherit; } + .prettyprint code { + font-size: 12px; + line-height: 18px; + display: block; + color: #4D4E53; } + .prettyprint code:empty:before { + content: ''; } + .prettyprint > code { + padding: 15px; } + .prettyprint .linenums code { + padding: 0 15px; } + .prettyprint .linenums li:first-of-type code { + padding-top: 15px; } + .prettyprint code span.line { + display: inline-block; } + .prettyprint.linenums { + padding-left: 70px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .prettyprint.linenums ol { + padding-left: 0; } + .prettyprint.linenums li { + border-left: 2px #444 solid; } + .prettyprint.linenums li.selected { + background-color: #555; } + .prettyprint.linenums li * { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; } + +.params, .props { + border-spacing: 0; + border: 1px solid #ddd; + border-collapse: collapse; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + width: 100%; + font-size: 14px; + /* margin-left: 15px; */ } + +.params .name, .props .name, .name code { + color: #4D4E53; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 100%; } + +.params td, .params th { + margin: 0px; + text-align: left; + vertical-align: top; + padding: 10px; + display: table-cell; } + +.props td, .props th { + margin: 0px; + text-align: left; + vertical-align: top; + padding: 10px; + display: table-cell; } + +.params td { + border-top: 1px solid #eee; } + +.params thead tr { + background-color: #fff; + font-weight: bold; } + +.props thead tr, .params .params thead tr, .props .props thead tr { + background-color: #fff; + font-weight: bold; } + +.params param-description > p:first-child, .props param-description > p:first-child { + margin-top: 0; + padding-top: 0; } + +.params param-description > p:last-child, .props param-description > p:last-child { + margin-bottom: 0; + padding-bottom: 0; } + +dl.param-type { + /* border-bottom: 1px solid hsl(0, 0%, 87%); */ + margin: 0; + padding: 0; + font-size: 16px; } + +.param-type dt { + display: inline-block; } + +.param-type dd { + display: inline-block; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + display: inline-block; + padding: 0; + margin: 0; + font-size: 14px; } + +.disabled { + color: #454545; } + +/* navicon button */ +.navicon-button { + display: none; + position: relative; + padding: 2.0625rem 1.5rem; + cursor: pointer; + user-select: none; + opacity: .8; } + .navicon-button .navicon:before, .navicon-button .navicon:after { + transition: 0.25s; } + .navicon-button:hover { + transition: 0.5s; + opacity: 1; } + .navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after { + transition: 0.25s; } + .navicon-button:hover .navicon:before { + top: .825rem; } + .navicon-button:hover .navicon:after { + top: -.825rem; } + +/* navicon */ +.navicon { + position: relative; + width: 2.5em; + height: .3125rem; + background: #000; + transition: 0.3s; + border-radius: 2.5rem; } + .navicon:before, .navicon:after { + display: block; + content: ""; + height: .3125rem; + width: 2.5rem; + background: #000; + position: absolute; + z-index: -1; + transition: 0.3s 0.25s; + border-radius: 1rem; } + .navicon:before { + top: .625rem; } + .navicon:after { + top: -.625rem; } + +/* open */ +.nav-trigger { + position: fixed; + top: 0; + clip: rect(0, 0, 0, 0); } + .nav-trigger:checked + label { + transform: scale(0.75); } + .nav-trigger:checked + label:not(.steps) .navicon:before, .nav-trigger:checked + label:not(.steps) .navicon:after { + top: 0 !important; } + .nav-trigger:checked + label .navicon:before, .nav-trigger:checked + label .navicon:after { + transition: 0.5s; } + .nav-trigger:checked + label.plus .navicon, .nav-trigger:checked + label.x .navicon { + background: transparent; } + .nav-trigger:checked + label.plus .navicon:before, .nav-trigger:checked + label.x .navicon:before { + transform: rotate(-45deg); + background: #FFF; } + .nav-trigger:checked + label.plus .navicon:after, .nav-trigger:checked + label.x .navicon:after { + transform: rotate(45deg); + background: #FFF; } + .nav-trigger:checked + label.plus { + transform: scale(0.75) rotate(45deg); } + .nav-trigger:checked ~ nav { + transform: none !important; } + .nav-trigger:checked ~ .overlay { + display: block; } + +/* Minus */ +/* × and + */ +.overlay { + display: none; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + z-index: 1; } + +.section-method { + margin-bottom: 30px; + padding-bottom: 30px; + border-bottom: 1px solid #eee; } + +@media only screen and (max-width: 700px) { + body { + overflow-x: hidden; } + nav { + width: 240px; + height: 100%; + transform: translateX(-240px); + z-index: 3; + padding: 0 10px; + transition: transform 0.2s; } + .navicon-button { + display: inline-block; + position: fixed; + top: 1.5em; + right: 0; + z-index: 2; } + #main { + width: 100%; + min-width: 360px; } + #main h1.page-title { + margin: 1em 0; } + #main section { + padding: 0; } + footer { + margin-left: 0; } } + +@media only print { + nav { + display: none; } + #main { + float: none; + width: 100%; } } + +section > header, +.subsection-title, +.section-method > *:not(.params):not(.description):not(.prettyprint):not(ol):not(ul), +.description > *:not(.prettyprint):not(ol):not(ul), +footer { + padding-left: 8px; + padding-right: 8px; + margin: 0; } + +table.params { + width: auto; + margin: 0 10px; } + +.prettyprint.source, #main blockquote { + width: 100%; } + +.prettyprint { + position: relative; + border: none; + border-radius: 0; + width: 100%; + background-color: #292929; + color: #c5c8c6; + border-radius: 0; } + .prettyprint code { + position: relative; + border: none; + border-radius: 0; + width: 100%; + background-color: transparent; + color: #c5c8c6; + border-radius: 0; } + +#main blockquote { + position: relative; + border: none; + border-radius: 0; + background-color: #292929; + color: #c5c8c6; + border-radius: 0; } + +@media only screen and (min-width: 1001px) { + #main > *:not(section), #main .prettyprint:not(.source), .subsection-title, + .section-examples, + .section-method > *:not(.params):not(.description), + .description > *, + .article > *, + footer { + width: calc(50% - 8px); + margin-right: calc(50% + 8px); } + #main .description .prettyprint.source, #main .description blockquote, #main .article > .prettyprint.source, #main .article > blockquote { + width: 50%; + margin: 0 0 10px; + float: right; + clear: right; } + #main > section { + background-color: transparent; } + table.params { + margin: 0 calc(50% + 10px) 0 10px; + min-width: 200px; } + .section-method > h1, .section-method > h2 { + clear: both; } + .prettyprint > code { + white-space: pre-wrap; } + .code-col-bg { + position: fixed; + right: 0; + width: calc(50% - 240px / 2); + height: 100%; + background-color: #333; } + footer { + position: relative; + margin-left: 240px; + margin-right: calc(50% - 240px / 2); + border: none; + clear: right; } } + +/* make comments more legible */ +.prettyprint .com { + color: #7699b2; } diff --git a/interactjs/dist/api/styles/prettify-jsdoc.css b/interactjs/dist/api/styles/prettify-jsdoc.css new file mode 100644 index 000000000..834a866d4 --- /dev/null +++ b/interactjs/dist/api/styles/prettify-jsdoc.css @@ -0,0 +1,111 @@ +/* JSDoc prettify.js theme */ + +/* plain text */ +.pln { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* string content */ +.str { + color: hsl(104, 100%, 24%); + font-weight: normal; + font-style: normal; +} + +/* a keyword */ +.kwd { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a comment */ +.com { + font-weight: normal; + font-style: italic; +} + +/* a type name */ +.typ { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a literal value */ +.lit { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* punctuation */ +.pun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp open bracket */ +.opn { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp close bracket */ +.clo { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a markup tag name */ +.tag { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute name */ +.atn { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute value */ +.atv { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a declaration */ +.dec { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a variable name */ +.var { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a function name */ +.fun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; +} diff --git a/interactjs/dist/api/styles/prettify.css b/interactjs/dist/api/styles/prettify.css new file mode 100644 index 000000000..c9b714eb2 --- /dev/null +++ b/interactjs/dist/api/styles/prettify.css @@ -0,0 +1,119 @@ +/*! Color themes for Google Code Prettify | MIT License | github.com/jmblog/color-themes-for-google-code-prettify */ +.prettyprint { + background: #2f3640; + font-family: Menlo, "Bitstream Vera Sans Mono", "DejaVu Sans Mono", Monaco, Consolas, monospace; + border: 0 !important; +} + +.pln { + color: #e6e9ed; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; + color: #656d78; +} + +li.L0, +li.L1, +li.L2, +li.L3, +li.L4, +li.L5, +li.L6, +li.L7, +li.L8, +li.L9 { + padding-left: 1em; + background-color: #2f3640; + list-style-type: decimal; +} + +@media screen { + + /* string content */ + + .str { + color: #ffce54; + } + + /* keyword */ + + .kwd { + color: #4fc1e9; + } + + /* comment */ + + .com { + color: #656d78; + } + + /* type name */ + + .typ { + color: #4fc1e9; + } + + /* literal value */ + + .lit { + color: #ac92ec; + } + + /* punctuation */ + + .pun { + color: #e6e9ed; + } + + /* lisp open bracket */ + + .opn { + color: #e6e9ed; + } + + /* lisp close bracket */ + + .clo { + color: #e6e9ed; + } + + /* markup tag name */ + + .tag { + color: #ed5565; + } + + /* markup attribute name */ + + .atn { + color: #a0d468; + } + + /* markup attribute value */ + + .atv { + color: #ffce54; + } + + /* declaration */ + + .dec { + color: #ac92ec; + } + + /* variable name */ + + .var { + color: #e6e9ed; + } + + /* function name */ + + .fun { + color: #e6e9ed; + } +} diff --git a/interactjs/dist/interact.js b/interactjs/dist/interact.js new file mode 100644 index 000000000..aa7d5afa2 --- /dev/null +++ b/interactjs/dist/interact.js @@ -0,0 +1,10803 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.interact = f()}})(function(){var define,module,exports; +var createModuleFactory = function createModuleFactory(t){var e;return function(r){return e||t(e={exports:{},parent:r},e.exports),e.exports}}; +var _$Interactable_16 = createModuleFactory(function (module, exports) { +"use strict"; + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = exports.Interactable = void 0; + +var arr = _interopRequireWildcard(_$arr_49); + +var _browser = _interopRequireDefault(_$browser_50); + +var _clone = _interopRequireDefault(_$clone_51); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var _events = _interopRequireDefault(_$events_54); + +var _extend = _interopRequireDefault(_$extend_55); + +var is = _interopRequireWildcard(_$is_59); + +var _normalizeListeners = _interopRequireDefault(_$normalizeListeners_61); + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +var _Eventable = _interopRequireDefault(_$Eventable_14); + +var _scope = _$scope_24({}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/** */ +var Interactable = /*#__PURE__*/function () { + _createClass(Interactable, [{ + key: "_defaults", + get: function get() { + return { + base: {}, + perAction: {}, + actions: {} + }; + } + }]); + + /** */ + function Interactable(target, options, defaultContext) { + _classCallCheck(this, Interactable); + + _defineProperty(this, "options", void 0); + + _defineProperty(this, "_actions", void 0); + + _defineProperty(this, "target", void 0); + + _defineProperty(this, "events", new _Eventable["default"]()); + + _defineProperty(this, "_context", void 0); + + _defineProperty(this, "_win", void 0); + + _defineProperty(this, "_doc", void 0); + + this._actions = options.actions; + this.target = target; + this._context = options.context || defaultContext; + this._win = (0, _$window_68.getWindow)((0, _$domUtils_53.trySelector)(target) ? this._context : target); + this._doc = this._win.document; + this.set(options); + } + + _createClass(Interactable, [{ + key: "setOnEvents", + value: function setOnEvents(actionName, phases) { + if (is.func(phases.onstart)) { + this.on("".concat(actionName, "start"), phases.onstart); + } + + if (is.func(phases.onmove)) { + this.on("".concat(actionName, "move"), phases.onmove); + } + + if (is.func(phases.onend)) { + this.on("".concat(actionName, "end"), phases.onend); + } + + if (is.func(phases.oninertiastart)) { + this.on("".concat(actionName, "inertiastart"), phases.oninertiastart); + } + + return this; + } + }, { + key: "updatePerActionListeners", + value: function updatePerActionListeners(actionName, prev, cur) { + if (is.array(prev) || is.object(prev)) { + this.off(actionName, prev); + } + + if (is.array(cur) || is.object(cur)) { + this.on(actionName, cur); + } + } + }, { + key: "setPerAction", + value: function setPerAction(actionName, options) { + var defaults = this._defaults; // for all the default per-action options + + for (var optionName_ in options) { + var optionName = optionName_; + var actionOptions = this.options[actionName]; + var optionValue = options[optionName]; // remove old event listeners and add new ones + + if (optionName === 'listeners') { + this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue); + } // if the option value is an array + + + if (is.array(optionValue)) { + actionOptions[optionName] = arr.from(optionValue); + } // if the option value is an object + else if (is.plainObject(optionValue)) { + // copy the object + actionOptions[optionName] = (0, _extend["default"])(actionOptions[optionName] || {}, (0, _clone["default"])(optionValue)); // set anabled field to true if it exists in the defaults + + if (is.object(defaults.perAction[optionName]) && 'enabled' in defaults.perAction[optionName]) { + actionOptions[optionName].enabled = optionValue.enabled !== false; + } + } // if the option value is a boolean and the default is an object + else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) { + actionOptions[optionName].enabled = optionValue; + } // if it's anything else, do a plain assignment + else { + actionOptions[optionName] = optionValue; + } + } + } + /** + * The default function to get an Interactables bounding rect. Can be + * overridden using {@link Interactable.rectChecker}. + * + * @param {Element} [element] The element to measure. + * @return {object} The object's bounding rectangle. + */ + + }, { + key: "getRect", + value: function getRect(element) { + element = element || (is.element(this.target) ? this.target : null); + + if (is.string(this.target)) { + element = element || this._context.querySelector(this.target); + } + + return (0, _$domUtils_53.getElementRect)(element); + } + /** + * Returns or sets the function used to calculate the interactable's + * element's rectangle + * + * @param {function} [checker] A function which returns this Interactable's + * bounding rectangle. See {@link Interactable.getRect} + * @return {function | object} The checker function or this Interactable + */ + + }, { + key: "rectChecker", + value: function rectChecker(checker) { + if (is.func(checker)) { + this.getRect = checker; + return this; + } + + if (checker === null) { + delete this.getRect; + return this; + } + + return this.getRect; + } + }, { + key: "_backCompatOption", + value: function _backCompatOption(optionName, newValue) { + if ((0, _$domUtils_53.trySelector)(newValue) || is.object(newValue)) { + this.options[optionName] = newValue; + + for (var action in this._actions.map) { + this.options[action][optionName] = newValue; + } + + return this; + } + + return this.options[optionName]; + } + /** + * Gets or sets the origin of the Interactable's element. The x and y + * of the origin will be subtracted from action event coordinates. + * + * @param {Element | object | string} [origin] An HTML or SVG Element whose + * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self' + * or any CSS selector + * + * @return {object} The current origin or this Interactable + */ + + }, { + key: "origin", + value: function origin(newValue) { + return this._backCompatOption('origin', newValue); + } + /** + * Returns or sets the mouse coordinate types used to calculate the + * movement of the pointer. + * + * @param {string} [newValue] Use 'client' if you will be scrolling while + * interacting; Use 'page' if you want autoScroll to work + * @return {string | object} The current deltaSource or this Interactable + */ + + }, { + key: "deltaSource", + value: function deltaSource(newValue) { + if (newValue === 'page' || newValue === 'client') { + this.options.deltaSource = newValue; + return this; + } + + return this.options.deltaSource; + } + /** + * Gets the selector context Node of the Interactable. The default is + * `window.document`. + * + * @return {Node} The context Node of this Interactable + */ + + }, { + key: "context", + value: function context() { + return this._context; + } + }, { + key: "inContext", + value: function inContext(element) { + return this._context === element.ownerDocument || (0, _$domUtils_53.nodeContains)(this._context, element); + } + }, { + key: "testIgnoreAllow", + value: function testIgnoreAllow(options, targetNode, eventTarget) { + return !this.testIgnore(options.ignoreFrom, targetNode, eventTarget) && this.testAllow(options.allowFrom, targetNode, eventTarget); + } + }, { + key: "testAllow", + value: function testAllow(allowFrom, targetNode, element) { + if (!allowFrom) { + return true; + } + + if (!is.element(element)) { + return false; + } + + if (is.string(allowFrom)) { + return (0, _$domUtils_53.matchesUpTo)(element, allowFrom, targetNode); + } else if (is.element(allowFrom)) { + return (0, _$domUtils_53.nodeContains)(allowFrom, element); + } + + return false; + } + }, { + key: "testIgnore", + value: function testIgnore(ignoreFrom, targetNode, element) { + if (!ignoreFrom || !is.element(element)) { + return false; + } + + if (is.string(ignoreFrom)) { + return (0, _$domUtils_53.matchesUpTo)(element, ignoreFrom, targetNode); + } else if (is.element(ignoreFrom)) { + return (0, _$domUtils_53.nodeContains)(ignoreFrom, element); + } + + return false; + } + /** + * Calls listeners for the given InteractEvent type bound globally + * and directly to this Interactable + * + * @param {InteractEvent} iEvent The InteractEvent object to be fired on this + * Interactable + * @return {Interactable} this Interactable + */ + + }, { + key: "fire", + value: function fire(iEvent) { + this.events.fire(iEvent); + return this; + } + }, { + key: "_onOff", + value: function _onOff(method, typeArg, listenerArg, options) { + if (is.object(typeArg) && !is.array(typeArg)) { + options = listenerArg; + listenerArg = null; + } + + var addRemove = method === 'on' ? 'add' : 'remove'; + var listeners = (0, _normalizeListeners["default"])(typeArg, listenerArg); + + for (var type in listeners) { + if (type === 'wheel') { + type = _browser["default"].wheelEvent; + } + + for (var _i = 0; _i < listeners[type].length; _i++) { + var _ref; + + _ref = listeners[type][_i]; + var listener = _ref; + + // if it is an action event type + if ((0, _scope.isNonNativeEvent)(type, this._actions)) { + this.events[method](type, listener); + } // delegated event + else if (is.string(this.target)) { + _events["default"]["".concat(addRemove, "Delegate")](this.target, this._context, type, listener, options); + } // remove listener from this Interactable's element + else { + _events["default"][addRemove](this.target, type, listener, options); + } + } + } + + return this; + } + /** + * Binds a listener for an InteractEvent, pointerEvent or DOM event. + * + * @param {string | array | object} types The types of events to listen + * for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * addEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "on", + value: function on(types, listener, options) { + return this._onOff('on', types, listener, options); + } + /** + * Removes an InteractEvent, pointerEvent or DOM event listener. + * + * @param {string | array | object} types The types of events that were + * listened for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * removeEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "off", + value: function off(types, listener, options) { + return this._onOff('off', types, listener, options); + } + /** + * Reset the options of this Interactable + * + * @param {object} options The new settings to apply + * @return {object} This Interactable + */ + + }, { + key: "set", + value: function set(options) { + var defaults = this._defaults; + + if (!is.object(options)) { + options = {}; + } + + this.options = (0, _clone["default"])(defaults.base); + + for (var actionName_ in this._actions.methodDict) { + var actionName = actionName_; + var methodName = this._actions.methodDict[actionName]; + this.options[actionName] = {}; + this.setPerAction(actionName, (0, _extend["default"])((0, _extend["default"])({}, defaults.perAction), defaults.actions[actionName])); + this[methodName](options[actionName]); + } + + for (var setting in options) { + if (is.func(this[setting])) { + this[setting](options[setting]); + } + } + + return this; + } + /** + * Remove this interactable from the list of interactables and remove it's + * action capabilities and event listeners + * + * @return {interact} + */ + + }, { + key: "unset", + value: function unset() { + _events["default"].remove(this.target, 'all'); + + if (is.string(this.target)) { + // remove delegated events + for (var type in _events["default"].delegatedEvents) { + var delegated = _events["default"].delegatedEvents[type]; + + if (delegated.selectors[0] === this.target && delegated.contexts[0] === this._context) { + delegated.selectors.splice(0, 1); + delegated.contexts.splice(0, 1); + delegated.listeners.splice(0, 1); + } + + _events["default"].remove(this._context, type, _events["default"].delegateListener); + + _events["default"].remove(this._context, type, _events["default"].delegateUseCapture, true); + } + } else { + _events["default"].remove(this.target, 'all'); + } + } + }]); + + return Interactable; +}(); + +exports.Interactable = Interactable; +var _default = Interactable; +exports["default"] = _default; + +}); +var _$scope_24 = createModuleFactory(function (module, exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +/* common-shake removed: exports.createScope = */ void createScope; +exports.isNonNativeEvent = isNonNativeEvent; +/* common-shake removed: exports.initScope = */ void initScope; +exports.Scope = void 0; + +var _domObjects = _interopRequireDefault(_$domObjects_52); + +var utils = _interopRequireWildcard(_$index_58); + +var _defaultOptions = _interopRequireDefault(_$defaultOptions_20); + +var _Eventable = _interopRequireDefault(_$Eventable_14); + +var _Interactable = _interopRequireDefault(_$Interactable_16({})); + +var _InteractableSet = _interopRequireDefault(_$InteractableSet_17); + +var _InteractEvent = _interopRequireDefault(_$InteractEvent_15); + +var _interactions = _interopRequireDefault(_$interactions_23({})); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var win = utils.win, + browser = utils.browser, + raf = utils.raf, + events = utils.events; // eslint-disable-next-line @typescript-eslint/no-empty-interface + +function createScope() { + return new Scope(); +} + +var Scope = /*#__PURE__*/function () { + // main window + // main document + // main window + // all documents being listened to + function Scope() { + var _this = this; + + _classCallCheck(this, Scope); + + _defineProperty(this, "id", "__interact_scope_".concat(Math.floor(Math.random() * 100))); + + _defineProperty(this, "isInitialized", false); + + _defineProperty(this, "listenerMaps", []); + + _defineProperty(this, "browser", browser); + + _defineProperty(this, "events", events); + + _defineProperty(this, "utils", utils); + + _defineProperty(this, "defaults", utils.clone(_defaultOptions["default"])); + + _defineProperty(this, "Eventable", _Eventable["default"]); + + _defineProperty(this, "actions", { + map: {}, + phases: { + start: true, + move: true, + end: true + }, + methodDict: {}, + phaselessTypes: {} + }); + + _defineProperty(this, "InteractEvent", _InteractEvent["default"]); + + _defineProperty(this, "Interactable", void 0); + + _defineProperty(this, "interactables", new _InteractableSet["default"](this)); + + _defineProperty(this, "_win", void 0); + + _defineProperty(this, "document", void 0); + + _defineProperty(this, "window", void 0); + + _defineProperty(this, "documents", []); + + _defineProperty(this, "_plugins", { + list: [], + map: {} + }); + + _defineProperty(this, "onWindowUnload", function (event) { + return _this.removeDocument(event.target); + }); + + var scope = this; + + this.Interactable = /*#__PURE__*/function (_InteractableBase) { + _inherits(_class, _InteractableBase); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "set", + value: function set(options) { + _get(_getPrototypeOf(_class.prototype), "set", this).call(this, options); + + scope.fire('interactable:set', { + options: options, + interactable: this + }); + return this; + } + }, { + key: "unset", + value: function unset() { + _get(_getPrototypeOf(_class.prototype), "unset", this).call(this); + + scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1); + scope.fire('interactable:unset', { + interactable: this + }); + } + }, { + key: "_defaults", + get: function get() { + return scope.defaults; + } + }]); + + return _class; + }(_Interactable["default"]); + } + + _createClass(Scope, [{ + key: "addListeners", + value: function addListeners(map, id) { + this.listenerMaps.push({ + id: id, + map: map + }); + } + }, { + key: "fire", + value: function fire(name, arg) { + for (var _i = 0; _i < this.listenerMaps.length; _i++) { + var _ref; + + _ref = this.listenerMaps[_i]; + var _ref2 = _ref, + listener = _ref2.map[name]; + + if (!!listener && listener(arg, this, name) === false) { + return false; + } + } + } + }, { + key: "init", + value: function init(window) { + return this.isInitialized ? this : initScope(this, window); + } + }, { + key: "pluginIsInstalled", + value: function pluginIsInstalled(plugin) { + return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1; + } + }, { + key: "usePlugin", + value: function usePlugin(plugin, options) { + if (this.pluginIsInstalled(plugin)) { + return this; + } + + if (plugin.id) { + this._plugins.map[plugin.id] = plugin; + } + + this._plugins.list.push(plugin); + + if (plugin.install) { + plugin.install(this, options); + } + + if (plugin.listeners && plugin.before) { + var _index = 0; + var len = this.listenerMaps.length; + var before = plugin.before.reduce(function (acc, id) { + acc[id] = true; + return acc; + }, {}); + + for (; _index < len; _index++) { + var otherId = this.listenerMaps[_index].id; + + if (before[otherId]) { + break; + } + } + + this.listenerMaps.splice(_index, 0, { + id: plugin.id, + map: plugin.listeners + }); + } else if (plugin.listeners) { + this.listenerMaps.push({ + id: plugin.id, + map: plugin.listeners + }); + } + + return this; + } + }, { + key: "addDocument", + value: function addDocument(doc, options) { + // do nothing if document is already known + if (this.getDocIndex(doc) !== -1) { + return false; + } + + var window = win.getWindow(doc); + options = options ? utils.extend({}, options) : {}; + this.documents.push({ + doc: doc, + options: options + }); + events.documents.push(doc); // don't add an unload event for the main document + // so that the page may be cached in browser history + + if (doc !== this.document) { + events.add(window, 'unload', this.onWindowUnload); + } + + this.fire('scope:add-document', { + doc: doc, + window: window, + scope: this, + options: options + }); + } + }, { + key: "removeDocument", + value: function removeDocument(doc) { + var index = this.getDocIndex(doc); + var window = win.getWindow(doc); + var options = this.documents[index].options; + events.remove(window, 'unload', this.onWindowUnload); + this.documents.splice(index, 1); + events.documents.splice(index, 1); + this.fire('scope:remove-document', { + doc: doc, + window: window, + scope: this, + options: options + }); + } + }, { + key: "getDocIndex", + value: function getDocIndex(doc) { + for (var i = 0; i < this.documents.length; i++) { + if (this.documents[i].doc === doc) { + return i; + } + } + + return -1; + } + }, { + key: "getDocOptions", + value: function getDocOptions(doc) { + var docIndex = this.getDocIndex(doc); + return docIndex === -1 ? null : this.documents[docIndex].options; + } + }, { + key: "now", + value: function now() { + return (this.window.Date || Date).now(); + } + }]); + + return Scope; +}(); + +exports.Scope = Scope; + +function isNonNativeEvent(type, actions) { + if (actions.phaselessTypes[type]) { + return true; + } + + for (var name in actions.map) { + if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) { + return true; + } + } + + return false; +} + +function initScope(scope, window) { + scope.isInitialized = true; + win.init(window); + + _domObjects["default"].init(window); + + browser.init(window); + raf.init(window); + events.init(window); + scope.usePlugin(_interactions["default"]); + scope.document = window.document; + scope.window = window; + return scope; +} + +}); +var _$interactions_23 = createModuleFactory(function (module, exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _browser = _interopRequireDefault(_$browser_50); + +var _domObjects = _interopRequireDefault(_$domObjects_52); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var _events = _interopRequireDefault(_$events_54); + +var pointerUtils = _interopRequireWildcard(_$pointerUtils_63); + +var _Interaction = _interopRequireDefault(_$Interaction_18); + +var _interactionFinder = _interopRequireDefault(_$interactionFinder_22); + +var _scope = _$scope_24({}); + +var _interactablePreventDefault = _interopRequireDefault(_$interactablePreventDefault_21); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +var methodNames = ['pointerDown', 'pointerMove', 'pointerUp', 'updatePointer', 'removePointer', 'windowBlur']; + +function install(scope) { + var listeners = {}; + + for (var _i = 0; _i < methodNames.length; _i++) { + var _ref; + + _ref = methodNames[_i]; + var method = _ref; + listeners[method] = doOnInteractions(method, scope); + } + + var pEventTypes = _browser["default"].pEventTypes; + var docEvents; + + if (_domObjects["default"].PointerEvent) { + docEvents = [{ + type: pEventTypes.down, + listener: releasePointersOnRemovedEls + }, { + type: pEventTypes.down, + listener: listeners.pointerDown + }, { + type: pEventTypes.move, + listener: listeners.pointerMove + }, { + type: pEventTypes.up, + listener: listeners.pointerUp + }, { + type: pEventTypes.cancel, + listener: listeners.pointerUp + }]; + } else { + docEvents = [{ + type: 'mousedown', + listener: listeners.pointerDown + }, { + type: 'mousemove', + listener: listeners.pointerMove + }, { + type: 'mouseup', + listener: listeners.pointerUp + }, { + type: 'touchstart', + listener: releasePointersOnRemovedEls + }, { + type: 'touchstart', + listener: listeners.pointerDown + }, { + type: 'touchmove', + listener: listeners.pointerMove + }, { + type: 'touchend', + listener: listeners.pointerUp + }, { + type: 'touchcancel', + listener: listeners.pointerUp + }]; + } + + docEvents.push({ + type: 'blur', + listener: function listener(event) { + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref2; + + _ref2 = scope.interactions.list[_i2]; + var interaction = _ref2; + interaction.documentBlur(event); + } + } + }); // for ignoring browser's simulated mouse events + + scope.prevTouchTime = 0; + + scope.Interaction = /*#__PURE__*/function (_InteractionBase) { + _inherits(_class, _InteractionBase); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "_now", + value: function _now() { + return scope.now(); + } + }, { + key: "pointerMoveTolerance", + get: function get() { + return scope.interactions.pointerMoveTolerance; + }, + set: function set(value) { + scope.interactions.pointerMoveTolerance = value; + } + }]); + + return _class; + }(_Interaction["default"]); + + scope.interactions = { + // all active and idle interactions + list: [], + "new": function _new(options) { + options.scopeFire = function (name, arg) { + return scope.fire(name, arg); + }; + + var interaction = new scope.Interaction(options); + scope.interactions.list.push(interaction); + return interaction; + }, + listeners: listeners, + docEvents: docEvents, + pointerMoveTolerance: 1 + }; + + function releasePointersOnRemovedEls() { + // for all inactive touch interactions with pointers down + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref3; + + _ref3 = scope.interactions.list[_i3]; + var interaction = _ref3; + + if (!interaction.pointerIsDown || interaction.pointerType !== 'touch' || interaction._interacting) { + continue; + } // if a pointer is down on an element that is no longer in the DOM tree + + + var _loop = function _loop() { + _ref4 = interaction.pointers[_i4]; + var pointer = _ref4; + + if (!scope.documents.some(function (_ref5) { + var doc = _ref5.doc; + return (0, _$domUtils_53.nodeContains)(doc, pointer.downTarget); + })) { + // remove the pointer from the interaction + interaction.removePointer(pointer.pointer, pointer.event); + } + }; + + for (var _i4 = 0; _i4 < interaction.pointers.length; _i4++) { + var _ref4; + + _loop(); + } + } + } + + scope.usePlugin(_interactablePreventDefault["default"]); +} + +function doOnInteractions(method, scope) { + return function (event) { + var interactions = scope.interactions.list; + var pointerType = pointerUtils.getPointerType(event); + + var _pointerUtils$getEven = pointerUtils.getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 2), + eventTarget = _pointerUtils$getEven2[0], + curEventTarget = _pointerUtils$getEven2[1]; + + var matches = []; // [ [pointer, interaction], ...] + + if (/^touch/.test(event.type)) { + scope.prevTouchTime = scope.now(); + + for (var _i5 = 0; _i5 < event.changedTouches.length; _i5++) { + var _ref6; + + _ref6 = event.changedTouches[_i5]; + var changedTouch = _ref6; + var pointer = changedTouch; + var pointerId = pointerUtils.getPointerId(pointer); + var searchDetails = { + pointer: pointer, + pointerId: pointerId, + pointerType: pointerType, + eventType: event.type, + eventTarget: eventTarget, + curEventTarget: curEventTarget, + scope: scope + }; + var interaction = getInteraction(searchDetails); + matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]); + } + } else { + var invalidPointer = false; + + if (!_browser["default"].supportsPointerEvent && /mouse/.test(event.type)) { + // ignore mouse events while touch interactions are active + for (var i = 0; i < interactions.length && !invalidPointer; i++) { + invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown; + } // try to ignore mouse events that are simulated by the browser + // after a touch event + + + invalidPointer = invalidPointer || scope.now() - scope.prevTouchTime < 500 || // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated + event.timeStamp === 0; + } + + if (!invalidPointer) { + var _searchDetails = { + pointer: event, + pointerId: pointerUtils.getPointerId(event), + pointerType: pointerType, + eventType: event.type, + curEventTarget: curEventTarget, + eventTarget: eventTarget, + scope: scope + }; + + var _interaction = getInteraction(_searchDetails); + + matches.push([_searchDetails.pointer, _searchDetails.eventTarget, _searchDetails.curEventTarget, _interaction]); + } + } // eslint-disable-next-line no-shadow + + + for (var _i6 = 0; _i6 < matches.length; _i6++) { + var _matches$_i = _slicedToArray(matches[_i6], 4), + _pointer = _matches$_i[0], + _eventTarget = _matches$_i[1], + _curEventTarget = _matches$_i[2], + _interaction2 = _matches$_i[3]; + + _interaction2[method](_pointer, event, _eventTarget, _curEventTarget); + } + }; +} + +function getInteraction(searchDetails) { + var pointerType = searchDetails.pointerType, + scope = searchDetails.scope; + + var foundInteraction = _interactionFinder["default"].search(searchDetails); + + var signalArg = { + interaction: foundInteraction, + searchDetails: searchDetails + }; + scope.fire('interactions:find', signalArg); + return signalArg.interaction || scope.interactions["new"]({ + pointerType: pointerType + }); +} + +function onDocSignal(_ref7, eventMethodName) { + var doc = _ref7.doc, + scope = _ref7.scope, + options = _ref7.options; + var docEvents = scope.interactions.docEvents; + var eventMethod = _events["default"][eventMethodName]; + + if (scope.browser.isIOS && !options.events) { + options.events = { + passive: false + }; + } // delegate event listener + + + for (var eventType in _events["default"].delegatedEvents) { + eventMethod(doc, eventType, _events["default"].delegateListener); + eventMethod(doc, eventType, _events["default"].delegateUseCapture, true); + } + + var eventOptions = options && options.events; + + for (var _i7 = 0; _i7 < docEvents.length; _i7++) { + var _ref8; + + _ref8 = docEvents[_i7]; + var _ref9 = _ref8, + _type = _ref9.type, + listener = _ref9.listener; + eventMethod(doc, _type, listener, eventOptions); + } +} + +var interactions = { + id: 'core/interactions', + install: install, + listeners: { + 'scope:add-document': function scopeAddDocument(arg) { + return onDocSignal(arg, 'add'); + }, + 'scope:remove-document': function scopeRemoveDocument(arg) { + return onDocSignal(arg, 'remove'); + }, + 'interactable:unset': function interactableUnset(_ref10, scope) { + var interactable = _ref10.interactable; + + // Stop and destroy related interactions when an Interactable is unset + for (var i = scope.interactions.list.length - 1; i >= 0; i--) { + var interaction = scope.interactions.list[i]; + + if (interaction.interactable !== interactable) { + continue; + } + + interaction.stop(); + scope.fire('interactions:destroy', { + interaction: interaction + }); + interaction.destroy(); + + if (scope.interactions.list.length > 2) { + scope.interactions.list.splice(i, 1); + } + } + } + }, + onDocSignal: onDocSignal, + doOnInteractions: doOnInteractions, + methodNames: methodNames +}; +var _default = interactions; +exports["default"] = _default; + +}); +var _$index_48 = {}; +/// +"use strict"; + +var _$isWindow_60 = {}; +"use strict"; + +Object.defineProperty(_$isWindow_60, "__esModule", { + value: true +}); +_$isWindow_60["default"] = void 0; + +var _default = function _default(thing) { + return !!(thing && thing.Window) && thing instanceof thing.Window; +}; + +_$isWindow_60["default"] = _default; + +var _$window_68 = {}; +"use strict"; + +Object.defineProperty(_$window_68, "__esModule", { + value: true +}); +_$window_68.init = init; +_$window_68.getWindow = getWindow; +_$window_68["default"] = void 0; + +var _isWindow = _interopRequireDefault(_$isWindow_60); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var win = { + realWindow: undefined, + window: undefined, + getWindow: getWindow, + init: init +}; + +function init(window) { + // get wrapped window if using Shadow DOM polyfill + win.realWindow = window; // create a TextNode + + var el = window.document.createTextNode(''); // check if it's wrapped by a polyfill + + if (el.ownerDocument !== window.document && typeof window.wrap === 'function' && window.wrap(el) === el) { + // use wrapped window + window = window.wrap(window); + } + + win.window = window; +} + +if (typeof window === 'undefined') { + win.window = undefined; + win.realWindow = undefined; +} else { + init(window); +} + +function getWindow(node) { + if ((0, _isWindow["default"])(node)) { + return node; + } + + var rootNode = node.ownerDocument || node; + return rootNode.defaultView || win.window; +} + +win.init = init; +var ___default_68 = win; +_$window_68["default"] = ___default_68; + +var _$is_59 = {}; +"use strict"; + +Object.defineProperty(_$is_59, "__esModule", { + value: true +}); +_$is_59.array = _$is_59.plainObject = _$is_59.element = _$is_59.string = _$is_59.bool = _$is_59.number = _$is_59.func = _$is_59.object = _$is_59.docFrag = _$is_59.window = void 0; + +var ___isWindow_59 = ___interopRequireDefault_59(_$isWindow_60); + +var _window2 = ___interopRequireDefault_59(_$window_68); + +function ___interopRequireDefault_59(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var __window_59 = function window(thing) { + return thing === _window2["default"].window || (0, ___isWindow_59["default"])(thing); +}; + +_$is_59.window = __window_59; + +var docFrag = function docFrag(thing) { + return object(thing) && thing.nodeType === 11; +}; + +_$is_59.docFrag = docFrag; + +var object = function object(thing) { + return !!thing && _typeof(thing) === 'object'; +}; + +_$is_59.object = object; + +var func = function func(thing) { + return typeof thing === 'function'; +}; + +_$is_59.func = func; + +var number = function number(thing) { + return typeof thing === 'number'; +}; + +_$is_59.number = number; + +var bool = function bool(thing) { + return typeof thing === 'boolean'; +}; + +_$is_59.bool = bool; + +var string = function string(thing) { + return typeof thing === 'string'; +}; + +_$is_59.string = string; + +var element = function element(thing) { + if (!thing || _typeof(thing) !== 'object') { + return false; + } + + var _window = _window2["default"].getWindow(thing) || _window2["default"].window; + + return /object|function/.test(_typeof(_window.Element)) ? thing instanceof _window.Element // DOM2 + : thing.nodeType === 1 && typeof thing.nodeName === 'string'; +}; + +_$is_59.element = element; + +var plainObject = function plainObject(thing) { + return object(thing) && !!thing.constructor && /function Object\b/.test(thing.constructor.toString()); +}; + +_$is_59.plainObject = plainObject; + +var array = function array(thing) { + return object(thing) && typeof thing.length !== 'undefined' && func(thing.splice); +}; + +_$is_59.array = array; + +var _$drag_1 = {}; +"use strict"; + +function ___typeof_1(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_1 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_1 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_1(obj); } + +Object.defineProperty(_$drag_1, "__esModule", { + value: true +}); +_$drag_1["default"] = void 0; + +var is = _interopRequireWildcard(_$is_59); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_1(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function install(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + defaults = scope.defaults; + Interactable.prototype.draggable = drag.draggable; + actions.map.drag = drag; + actions.methodDict.drag = 'draggable'; + defaults.actions.drag = drag.defaults; +} + +function beforeMove(_ref) { + var interaction = _ref.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x') { + interaction.coords.cur.page.y = interaction.coords.start.page.y; + interaction.coords.cur.client.y = interaction.coords.start.client.y; + interaction.coords.velocity.client.y = 0; + interaction.coords.velocity.page.y = 0; + } else if (axis === 'y') { + interaction.coords.cur.page.x = interaction.coords.start.page.x; + interaction.coords.cur.client.x = interaction.coords.start.client.x; + interaction.coords.velocity.client.x = 0; + interaction.coords.velocity.page.x = 0; + } +} + +function move(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x' || axis === 'y') { + var opposite = axis === 'x' ? 'y' : 'x'; + iEvent.page[opposite] = interaction.coords.start.page[opposite]; + iEvent.client[opposite] = interaction.coords.start.client[opposite]; + iEvent.delta[opposite] = 0; + } +} +/** + * ```js + * interact(element).draggable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // the axis in which the first movement must be + * // for the drag sequence to start + * // 'xy' by default - any direction + * startAxis: 'x' || 'y' || 'xy', + * + * // 'xy' by default - don't restrict to one axis (move in any direction) + * // 'x' or 'y' to restrict movement to either axis + * // 'start' to restrict movement to the axis the drag started in + * lockAxis: 'x' || 'y' || 'xy' || 'start', + * + * // max number of drags that can happen concurrently + * // with elements of this Interactable. Infinity by default + * max: Infinity, + * + * // max number of drags that can target the same element+Interactable + * // 1 by default + * maxPerElement: 2 + * }) + * + * var isDraggable = interact('element').draggable(); // true + * ``` + * + * Get or set whether drag actions can be performed on the target + * + * @alias Interactable.prototype.draggable + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on drag events (object makes the Interactable + * draggable) + * @return {boolean | Interactable} boolean indicating if this can be the + * target of drag events, or this Interctable + */ + + +var draggable = function draggable(options) { + if (is.object(options)) { + this.options.drag.enabled = options.enabled !== false; + this.setPerAction('drag', options); + this.setOnEvents('drag', options); + + if (/^(xy|x|y|start)$/.test(options.lockAxis)) { + this.options.drag.lockAxis = options.lockAxis; + } + + if (/^(xy|x|y)$/.test(options.startAxis)) { + this.options.drag.startAxis = options.startAxis; + } + + return this; + } + + if (is.bool(options)) { + this.options.drag.enabled = options; + return this; + } + + return this.options.drag; +}; + +var drag = { + id: 'actions/drag', + install: install, + listeners: { + 'interactions:before-action-move': beforeMove, + 'interactions:action-resume': beforeMove, + // dragmove + 'interactions:action-move': move, + 'auto-start:check': function autoStartCheck(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + buttons = arg.buttons; + var dragOptions = interactable.options.drag; + + if (!(dragOptions && dragOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & interactable.options.drag.mouseButtons) === 0) { + return undefined; + } + + arg.action = { + name: 'drag', + axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis + }; + return false; + } + }, + draggable: draggable, + beforeMove: beforeMove, + move: move, + defaults: { + startAxis: 'xy', + lockAxis: 'xy' + }, + getCursor: function getCursor() { + return 'move'; + } +}; +var ___default_1 = drag; +_$drag_1["default"] = ___default_1; + +var _$arr_49 = {}; +"use strict"; + +Object.defineProperty(_$arr_49, "__esModule", { + value: true +}); +_$arr_49.find = _$arr_49.findIndex = _$arr_49.from = _$arr_49.merge = _$arr_49.remove = _$arr_49.contains = void 0; + +var contains = function contains(array, target) { + return array.indexOf(target) !== -1; +}; + +_$arr_49.contains = contains; + +var remove = function remove(array, target) { + return array.splice(array.indexOf(target), 1); +}; + +_$arr_49.remove = remove; + +var merge = function merge(target, source) { + for (var _i = 0; _i < source.length; _i++) { + var _ref; + + _ref = source[_i]; + var item = _ref; + target.push(item); + } + + return target; +}; + +_$arr_49.merge = merge; + +var from = function from(source) { + return merge([], source); +}; + +_$arr_49.from = from; + +var findIndex = function findIndex(array, func) { + for (var i = 0; i < array.length; i++) { + if (func(array[i], i, array)) { + return i; + } + } + + return -1; +}; + +_$arr_49.findIndex = findIndex; + +var find = function find(array, func) { + return array[findIndex(array, func)]; +}; + +_$arr_49.find = find; + +var _$domObjects_52 = {}; +"use strict"; + +Object.defineProperty(_$domObjects_52, "__esModule", { + value: true +}); +_$domObjects_52["default"] = void 0; +var domObjects = { + init: __init_52, + document: null, + DocumentFragment: null, + SVGElement: null, + SVGSVGElement: null, + SVGElementInstance: null, + Element: null, + HTMLElement: null, + Event: null, + Touch: null, + PointerEvent: null +}; + +function blank() {} + +var ___default_52 = domObjects; +_$domObjects_52["default"] = ___default_52; + +function __init_52(window) { + var win = window; + domObjects.document = win.document; + domObjects.DocumentFragment = win.DocumentFragment || blank; + domObjects.SVGElement = win.SVGElement || blank; + domObjects.SVGSVGElement = win.SVGSVGElement || blank; + domObjects.SVGElementInstance = win.SVGElementInstance || blank; + domObjects.Element = win.Element || blank; + domObjects.HTMLElement = win.HTMLElement || domObjects.Element; + domObjects.Event = win.Event; + domObjects.Touch = win.Touch || blank; + domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent; +} + +var _$browser_50 = {}; +"use strict"; + +function ___typeof_50(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_50 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_50 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_50(obj); } + +Object.defineProperty(_$browser_50, "__esModule", { + value: true +}); +_$browser_50["default"] = void 0; + +var _domObjects = ___interopRequireDefault_50(_$domObjects_52); + +var __is_50 = ___interopRequireWildcard_50(_$is_59); + +var _window = ___interopRequireDefault_50(_$window_68); + +function ___getRequireWildcardCache_50() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_50 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_50(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_50(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_50(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_50(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var browser = { + init: __init_50, + supportsTouch: null, + supportsPointerEvent: null, + isIOS7: null, + isIOS: null, + isIe9: null, + isOperaMobile: null, + prefixedMatchesSelector: null, + pEventTypes: null, + wheelEvent: null +}; + +function __init_50(window) { + var Element = _domObjects["default"].Element; + var navigator = _window["default"].window.navigator; // Does the browser support touch input? + + browser.supportsTouch = 'ontouchstart' in window || __is_50.func(window.DocumentTouch) && _domObjects["default"].document instanceof window.DocumentTouch; // Does the browser support PointerEvents + + browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!_domObjects["default"].PointerEvent; + browser.isIOS = /iP(hone|od|ad)/.test(navigator.platform); // scrolling doesn't change the result of getClientRects on iOS 7 + + browser.isIOS7 = /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\d]/.test(navigator.appVersion); + browser.isIe9 = /MSIE 9/.test(navigator.userAgent); // Opera Mobile must be handled differently + + browser.isOperaMobile = navigator.appName === 'Opera' && browser.supportsTouch && /Presto/.test(navigator.userAgent); // prefix matchesSelector + + browser.prefixedMatchesSelector = 'matches' in Element.prototype ? 'matches' : 'webkitMatchesSelector' in Element.prototype ? 'webkitMatchesSelector' : 'mozMatchesSelector' in Element.prototype ? 'mozMatchesSelector' : 'oMatchesSelector' in Element.prototype ? 'oMatchesSelector' : 'msMatchesSelector'; + browser.pEventTypes = browser.supportsPointerEvent ? _domObjects["default"].PointerEvent === window.MSPointerEvent ? { + up: 'MSPointerUp', + down: 'MSPointerDown', + over: 'mouseover', + out: 'mouseout', + move: 'MSPointerMove', + cancel: 'MSPointerCancel' + } : { + up: 'pointerup', + down: 'pointerdown', + over: 'pointerover', + out: 'pointerout', + move: 'pointermove', + cancel: 'pointercancel' + } : null; // because Webkit and Opera still use 'mousewheel' event type + + browser.wheelEvent = 'onmousewheel' in _domObjects["default"].document ? 'mousewheel' : 'wheel'; +} + +var ___default_50 = browser; +_$browser_50["default"] = ___default_50; + +var _$clone_51 = {}; +"use strict"; + +function ___typeof_51(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_51 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_51 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_51(obj); } + +Object.defineProperty(_$clone_51, "__esModule", { + value: true +}); +_$clone_51["default"] = clone; + +var arr = ___interopRequireWildcard_51(_$arr_49); + +var __is_51 = ___interopRequireWildcard_51(_$is_59); + +function ___getRequireWildcardCache_51() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_51 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_51(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_51(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_51(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +// tslint:disable-next-line ban-types +function clone(source) { + var dest = {}; + + for (var prop in source) { + var value = source[prop]; + + if (__is_51.plainObject(value)) { + dest[prop] = clone(value); + } else if (__is_51.array(value)) { + dest[prop] = arr.from(value); + } else { + dest[prop] = value; + } + } + + return dest; +} + +var _$domUtils_53 = {}; +"use strict"; + +function ___typeof_53(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_53 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_53 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_53(obj); } + +Object.defineProperty(_$domUtils_53, "__esModule", { + value: true +}); +_$domUtils_53.nodeContains = nodeContains; +_$domUtils_53.closest = closest; +_$domUtils_53.parentNode = parentNode; +_$domUtils_53.matchesSelector = matchesSelector; +_$domUtils_53.indexOfDeepestElement = indexOfDeepestElement; +_$domUtils_53.matchesUpTo = matchesUpTo; +_$domUtils_53.getActualElement = getActualElement; +_$domUtils_53.getScrollXY = getScrollXY; +_$domUtils_53.getElementClientRect = getElementClientRect; +_$domUtils_53.getElementRect = getElementRect; +_$domUtils_53.getPath = getPath; +_$domUtils_53.trySelector = trySelector; + +var _browser = ___interopRequireDefault_53(_$browser_50); + +var ___domObjects_53 = ___interopRequireDefault_53(_$domObjects_52); + +var __is_53 = ___interopRequireWildcard_53(_$is_59); + +var ___window_53 = ___interopRequireWildcard_53(_$window_68); + +function ___getRequireWildcardCache_53() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_53 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_53(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_53(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_53(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_53(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function nodeContains(parent, child) { + while (child) { + if (child === parent) { + return true; + } + + child = child.parentNode; + } + + return false; +} + +function closest(element, selector) { + while (__is_53.element(element)) { + if (matchesSelector(element, selector)) { + return element; + } + + element = parentNode(element); + } + + return null; +} + +function parentNode(node) { + var parent = node.parentNode; + + if (__is_53.docFrag(parent)) { + // skip past #shado-root fragments + // tslint:disable-next-line + while ((parent = parent.host) && __is_53.docFrag(parent)) { + continue; + } + + return parent; + } + + return parent; +} + +function matchesSelector(element, selector) { + // remove /deep/ from selectors if shadowDOM polyfill is used + if (___window_53["default"].window !== ___window_53["default"].realWindow) { + selector = selector.replace(/\/deep\//g, ' '); + } + + return element[_browser["default"].prefixedMatchesSelector](selector); +} + +var getParent = function getParent(el) { + return el.parentNode ? el.parentNode : el.host; +}; // Test for the element that's "above" all other qualifiers + + +function indexOfDeepestElement(elements) { + var deepestZoneParents = []; + var deepestZone = elements[0]; + var index = deepestZone ? 0 : -1; + var i; + var n; + + for (i = 1; i < elements.length; i++) { + var dropzone = elements[i]; // an element might belong to multiple selector dropzones + + if (!dropzone || dropzone === deepestZone) { + continue; + } + + if (!deepestZone) { + deepestZone = dropzone; + index = i; + continue; + } // check if the deepest or current are document.documentElement or document.rootElement + // - if the current dropzone is, do nothing and continue + + + if (dropzone.parentNode === dropzone.ownerDocument) { + continue; + } // - if deepest is, update with the current dropzone and continue to next + else if (deepestZone.parentNode === dropzone.ownerDocument) { + deepestZone = dropzone; + index = i; + continue; + } // compare zIndex of siblings + + + if (dropzone.parentNode === deepestZone.parentNode) { + var deepestZIndex = parseInt((0, ___window_53.getWindow)(deepestZone).getComputedStyle(deepestZone).zIndex, 10) || 0; + var dropzoneZIndex = parseInt((0, ___window_53.getWindow)(dropzone).getComputedStyle(dropzone).zIndex, 10) || 0; + + if (dropzoneZIndex >= deepestZIndex) { + deepestZone = dropzone; + index = i; + } + + continue; + } // populate the ancestry array for the latest deepest dropzone + + + if (!deepestZoneParents.length) { + var _parent = deepestZone; + var parentParent = void 0; + + while ((parentParent = getParent(_parent)) && parentParent !== _parent.ownerDocument) { + deepestZoneParents.unshift(_parent); + _parent = parentParent; + } + } + + var parent = void 0; // if this element is an svg element and the current deepest is an + // HTMLElement + + if (deepestZone instanceof ___domObjects_53["default"].HTMLElement && dropzone instanceof ___domObjects_53["default"].SVGElement && !(dropzone instanceof ___domObjects_53["default"].SVGSVGElement)) { + if (dropzone === deepestZone.parentNode) { + continue; + } + + parent = dropzone.ownerSVGElement; + } else { + parent = dropzone; + } + + var dropzoneParents = []; + + while (parent.parentNode !== parent.ownerDocument) { + dropzoneParents.unshift(parent); + parent = getParent(parent); + } + + n = 0; // get (position of last common ancestor) + 1 + + while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) { + n++; + } + + var parents = [dropzoneParents[n - 1], dropzoneParents[n], deepestZoneParents[n]]; + var child = parents[0].lastChild; + + while (child) { + if (child === parents[1]) { + deepestZone = dropzone; + index = i; + deepestZoneParents = dropzoneParents; + break; + } else if (child === parents[2]) { + break; + } + + child = child.previousSibling; + } + } + + return index; +} + +function matchesUpTo(element, selector, limit) { + while (__is_53.element(element)) { + if (matchesSelector(element, selector)) { + return true; + } + + element = parentNode(element); + + if (element === limit) { + return matchesSelector(element, selector); + } + } + + return false; +} + +function getActualElement(element) { + return element instanceof ___domObjects_53["default"].SVGElementInstance ? element.correspondingUseElement : element; +} + +function getScrollXY(relevantWindow) { + relevantWindow = relevantWindow || ___window_53["default"].window; + return { + x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft, + y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop + }; +} + +function getElementClientRect(element) { + var clientRect = element instanceof ___domObjects_53["default"].SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0]; + return clientRect && { + left: clientRect.left, + right: clientRect.right, + top: clientRect.top, + bottom: clientRect.bottom, + width: clientRect.width || clientRect.right - clientRect.left, + height: clientRect.height || clientRect.bottom - clientRect.top + }; +} + +function getElementRect(element) { + var clientRect = getElementClientRect(element); + + if (!_browser["default"].isIOS7 && clientRect) { + var scroll = getScrollXY(___window_53["default"].getWindow(element)); + clientRect.left += scroll.x; + clientRect.right += scroll.x; + clientRect.top += scroll.y; + clientRect.bottom += scroll.y; + } + + return clientRect; +} + +function getPath(node) { + var path = []; + + while (node) { + path.push(node); + node = parentNode(node); + } + + return path; +} + +function trySelector(value) { + if (!__is_53.string(value)) { + return false; + } // an exception will be raised if it is invalid + + + ___domObjects_53["default"].document.querySelector(value); + + return true; +} + +var _$pointerExtend_62 = {}; +"use strict"; + +Object.defineProperty(_$pointerExtend_62, "__esModule", { + value: true +}); +_$pointerExtend_62["default"] = void 0; + +function pointerExtend(dest, source) { + for (var prop in source) { + var prefixedPropREs = pointerExtend.prefixedPropREs; + var deprecated = false; // skip deprecated prefixed properties + + for (var vendor in prefixedPropREs) { + if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) { + deprecated = true; + break; + } + } + + if (!deprecated && typeof source[prop] !== 'function') { + dest[prop] = source[prop]; + } + } + + return dest; +} + +pointerExtend.prefixedPropREs = { + webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/, + moz: /(Pressure)$/ +}; +var ___default_62 = pointerExtend; +_$pointerExtend_62["default"] = ___default_62; + +var _$hypot_57 = {}; +"use strict"; + +Object.defineProperty(_$hypot_57, "__esModule", { + value: true +}); +_$hypot_57["default"] = void 0; + +var ___default_57 = function _default(x, y) { + return Math.sqrt(x * x + y * y); +}; + +_$hypot_57["default"] = ___default_57; + +var _$pointerUtils_63 = {}; +"use strict"; + +function ___typeof_63(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_63 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_63 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_63(obj); } + +Object.defineProperty(_$pointerUtils_63, "__esModule", { + value: true +}); +_$pointerUtils_63.copyCoords = copyCoords; +_$pointerUtils_63.setCoordDeltas = setCoordDeltas; +_$pointerUtils_63.setCoordVelocity = setCoordVelocity; +_$pointerUtils_63.setZeroCoords = setZeroCoords; +_$pointerUtils_63.isNativePointer = isNativePointer; +_$pointerUtils_63.getXY = getXY; +_$pointerUtils_63.getPageXY = getPageXY; +_$pointerUtils_63.getClientXY = getClientXY; +_$pointerUtils_63.getPointerId = getPointerId; +_$pointerUtils_63.setCoords = setCoords; +_$pointerUtils_63.getTouchPair = getTouchPair; +_$pointerUtils_63.pointerAverage = pointerAverage; +_$pointerUtils_63.touchBBox = touchBBox; +_$pointerUtils_63.touchDistance = touchDistance; +_$pointerUtils_63.touchAngle = touchAngle; +_$pointerUtils_63.getPointerType = getPointerType; +_$pointerUtils_63.getEventTargets = getEventTargets; +_$pointerUtils_63.newCoords = newCoords; +_$pointerUtils_63.coordsToEvent = coordsToEvent; +Object.defineProperty(_$pointerUtils_63, "pointerExtend", { + enumerable: true, + get: function get() { + return _pointerExtend["default"]; + } +}); + +var ___browser_63 = ___interopRequireDefault_63(_$browser_50); + +var ___domObjects_63 = ___interopRequireDefault_63(_$domObjects_52); + +var domUtils = ___interopRequireWildcard_63(_$domUtils_53); + +var _hypot = ___interopRequireDefault_63(_$hypot_57); + +var __is_63 = ___interopRequireWildcard_63(_$is_59); + +var _pointerExtend = ___interopRequireDefault_63(_$pointerExtend_62); + +function ___getRequireWildcardCache_63() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_63 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_63(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_63(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_63(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_63(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function copyCoords(dest, src) { + dest.page = dest.page || {}; + dest.page.x = src.page.x; + dest.page.y = src.page.y; + dest.client = dest.client || {}; + dest.client.x = src.client.x; + dest.client.y = src.client.y; + dest.timeStamp = src.timeStamp; +} + +function setCoordDeltas(targetObj, prev, cur) { + targetObj.page.x = cur.page.x - prev.page.x; + targetObj.page.y = cur.page.y - prev.page.y; + targetObj.client.x = cur.client.x - prev.client.x; + targetObj.client.y = cur.client.y - prev.client.y; + targetObj.timeStamp = cur.timeStamp - prev.timeStamp; +} + +function setCoordVelocity(targetObj, delta) { + var dt = Math.max(delta.timeStamp / 1000, 0.001); + targetObj.page.x = delta.page.x / dt; + targetObj.page.y = delta.page.y / dt; + targetObj.client.x = delta.client.x / dt; + targetObj.client.y = delta.client.y / dt; + targetObj.timeStamp = dt; +} + +function setZeroCoords(targetObj) { + targetObj.page.x = 0; + targetObj.page.y = 0; + targetObj.client.x = 0; + targetObj.client.y = 0; +} + +function isNativePointer(pointer) { + return pointer instanceof ___domObjects_63["default"].Event || pointer instanceof ___domObjects_63["default"].Touch; +} // Get specified X/Y coords for mouse or event.touches[0] + + +function getXY(type, pointer, xy) { + xy = xy || {}; + type = type || 'page'; + xy.x = pointer[type + 'X']; + xy.y = pointer[type + 'Y']; + return xy; +} + +function getPageXY(pointer, page) { + page = page || { + x: 0, + y: 0 + }; // Opera Mobile handles the viewport and scrolling oddly + + if (___browser_63["default"].isOperaMobile && isNativePointer(pointer)) { + getXY('screen', pointer, page); + page.x += window.scrollX; + page.y += window.scrollY; + } else { + getXY('page', pointer, page); + } + + return page; +} + +function getClientXY(pointer, client) { + client = client || {}; + + if (___browser_63["default"].isOperaMobile && isNativePointer(pointer)) { + // Opera Mobile handles the viewport and scrolling oddly + getXY('screen', pointer, client); + } else { + getXY('client', pointer, client); + } + + return client; +} + +function getPointerId(pointer) { + return __is_63.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier; +} + +function setCoords(targetObj, pointers, timeStamp) { + var pointer = pointers.length > 1 ? pointerAverage(pointers) : pointers[0]; + var tmpXY = {}; + getPageXY(pointer, tmpXY); + targetObj.page.x = tmpXY.x; + targetObj.page.y = tmpXY.y; + getClientXY(pointer, tmpXY); + targetObj.client.x = tmpXY.x; + targetObj.client.y = tmpXY.y; + targetObj.timeStamp = timeStamp; +} + +function getTouchPair(event) { + var touches = []; // array of touches is supplied + + if (__is_63.array(event)) { + touches[0] = event[0]; + touches[1] = event[1]; + } // an event + else { + if (event.type === 'touchend') { + if (event.touches.length === 1) { + touches[0] = event.touches[0]; + touches[1] = event.changedTouches[0]; + } else if (event.touches.length === 0) { + touches[0] = event.changedTouches[0]; + touches[1] = event.changedTouches[1]; + } + } else { + touches[0] = event.touches[0]; + touches[1] = event.touches[1]; + } + } + + return touches; +} + +function pointerAverage(pointers) { + var average = { + pageX: 0, + pageY: 0, + clientX: 0, + clientY: 0, + screenX: 0, + screenY: 0 + }; + + for (var _i = 0; _i < pointers.length; _i++) { + var _ref; + + _ref = pointers[_i]; + var pointer = _ref; + + for (var _prop in average) { + average[_prop] += pointer[_prop]; + } + } + + for (var prop in average) { + average[prop] /= pointers.length; + } + + return average; +} + +function touchBBox(event) { + if (!event.length && !(event.touches && event.touches.length > 1)) { + return null; + } + + var touches = getTouchPair(event); + var minX = Math.min(touches[0].pageX, touches[1].pageX); + var minY = Math.min(touches[0].pageY, touches[1].pageY); + var maxX = Math.max(touches[0].pageX, touches[1].pageX); + var maxY = Math.max(touches[0].pageY, touches[1].pageY); + return { + x: minX, + y: minY, + left: minX, + top: minY, + right: maxX, + bottom: maxY, + width: maxX - minX, + height: maxY - minY + }; +} + +function touchDistance(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = getTouchPair(event); + var dx = touches[0][sourceX] - touches[1][sourceX]; + var dy = touches[0][sourceY] - touches[1][sourceY]; + return (0, _hypot["default"])(dx, dy); +} + +function touchAngle(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = getTouchPair(event); + var dx = touches[1][sourceX] - touches[0][sourceX]; + var dy = touches[1][sourceY] - touches[0][sourceY]; + var angle = 180 * Math.atan2(dy, dx) / Math.PI; + return angle; +} + +function getPointerType(pointer) { + return __is_63.string(pointer.pointerType) ? pointer.pointerType : __is_63.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof ___domObjects_63["default"].Touch ? 'touch' : 'mouse'; +} // [ event.target, event.currentTarget ] + + +function getEventTargets(event) { + var path = __is_63.func(event.composedPath) ? event.composedPath() : event.path; + return [domUtils.getActualElement(path ? path[0] : event.target), domUtils.getActualElement(event.currentTarget)]; +} + +function newCoords() { + return { + page: { + x: 0, + y: 0 + }, + client: { + x: 0, + y: 0 + }, + timeStamp: 0 + }; +} + +function coordsToEvent(coords) { + var event = { + coords: coords, + + get page() { + return this.coords.page; + }, + + get client() { + return this.coords.client; + }, + + get timeStamp() { + return this.coords.timeStamp; + }, + + get pageX() { + return this.coords.page.x; + }, + + get pageY() { + return this.coords.page.y; + }, + + get clientX() { + return this.coords.client.x; + }, + + get clientY() { + return this.coords.client.y; + }, + + get pointerId() { + return this.coords.pointerId; + }, + + get target() { + return this.coords.target; + }, + + get type() { + return this.coords.type; + }, + + get pointerType() { + return this.coords.pointerType; + }, + + get buttons() { + return this.coords.buttons; + }, + + preventDefault: function preventDefault() {} + }; + return event; +} + +var _$events_54 = {}; +"use strict"; + +function ___typeof_54(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_54 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_54 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_54(obj); } + +Object.defineProperty(_$events_54, "__esModule", { + value: true +}); +_$events_54["default"] = _$events_54.FakeEvent = void 0; + +/* removed: var _$arr_49 = require("./arr"); */; + +var __domUtils_54 = ___interopRequireWildcard_54(_$domUtils_53); + +var __is_54 = ___interopRequireWildcard_54(_$is_59); + +var ___pointerExtend_54 = ___interopRequireDefault_54(_$pointerExtend_62); + +var pointerUtils = ___interopRequireWildcard_54(_$pointerUtils_63); + +function ___interopRequireDefault_54(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_54() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_54 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_54(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_54(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_54(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var elements = []; +var targets = []; +var delegatedEvents = {}; +var documents = []; + +function add(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; + + if (!target) { + target = { + events: {}, + typeCount: 0 + }; + elementIndex = elements.push(element) - 1; + targets.push(target); + } + + if (!target.events[type]) { + target.events[type] = []; + target.typeCount++; + } + + if (element.removeEventListener && !(0, _$arr_49.contains)(target.events[type], listener)) { + element.addEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].push(listener); + } +} + +function __remove_54(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; + + if (!target || !target.events) { + return; + } + + if (type === 'all') { + for (type in target.events) { + if (target.events.hasOwnProperty(type)) { + __remove_54(element, type, 'all'); + } + } + + return; + } + + if (target.events[type]) { + var len = target.events[type].length; + + if (listener === 'all') { + for (var i = 0; i < len; i++) { + __remove_54(element, type, target.events[type][i], options); + } + + return; + } else { + for (var _i = 0; _i < len; _i++) { + if (element.removeEventListener && target.events[type][_i] === listener) { + element.removeEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].splice(_i, 1); + break; + } + } + } + + if (target.events[type] && target.events[type].length === 0) { + target.events[type] = null; + target.typeCount--; + } + } + + if (!target.typeCount) { + targets.splice(elementIndex, 1); + elements.splice(elementIndex, 1); + } +} + +function addDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + + if (!delegatedEvents[type]) { + delegatedEvents[type] = { + contexts: [], + listeners: [], + selectors: [] + }; // add delegate listener functions + + for (var _i2 = 0; _i2 < documents.length; _i2++) { + var _ref; + + _ref = documents[_i2]; + var doc = _ref; + add(doc, type, delegateListener); + add(doc, type, delegateUseCapture, true); + } + } + + var delegated = delegatedEvents[type]; + var index; + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + break; + } + } + + if (index === -1) { + index = delegated.selectors.length; + delegated.selectors.push(selector); + delegated.contexts.push(context); + delegated.listeners.push([]); + } // keep listener and capture and passive flags + + + delegated.listeners[index].push([listener, !!options.capture, options.passive]); +} + +function removeDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var delegated = delegatedEvents[type]; + var matchFound = false; + var index; + + if (!delegated) { + return; + } // count from last index of delegated to 0 + + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + // look for matching selector and context Node + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + var listeners = delegated.listeners[index]; // each item of the listeners array is an array: [function, capture, passive] + + for (var i = listeners.length - 1; i >= 0; i--) { + var _listeners$i = _slicedToArray(listeners[i], 3), + fn = _listeners$i[0], + capture = _listeners$i[1], + passive = _listeners$i[2]; // check if the listener functions and capture and passive flags match + + + if (fn === listener && capture === !!options.capture && passive === options.passive) { + // remove the listener from the array of listeners + listeners.splice(i, 1); // if all listeners for this interactable have been removed + // remove the interactable from the delegated arrays + + if (!listeners.length) { + delegated.selectors.splice(index, 1); + delegated.contexts.splice(index, 1); + delegated.listeners.splice(index, 1); // remove delegate function from context + + __remove_54(context, type, delegateListener); + __remove_54(context, type, delegateUseCapture, true); // remove the arrays if they are empty + + if (!delegated.selectors.length) { + delegatedEvents[type] = null; + } + } // only remove one listener + + + matchFound = true; + break; + } + } + + if (matchFound) { + break; + } + } + } +} // bound to the interactable context when a DOM event +// listener is added to a selector interactable + + +function delegateListener(event, optionalArg) { + var options = getOptions(optionalArg); + var fakeEvent = new FakeEvent(event); + var delegated = delegatedEvents[event.type]; + + var _pointerUtils$getEven = pointerUtils.getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 1), + eventTarget = _pointerUtils$getEven2[0]; + + var element = eventTarget; // climb up document tree looking for selector matches + + while (__is_54.element(element)) { + for (var i = 0; i < delegated.selectors.length; i++) { + var selector = delegated.selectors[i]; + var context = delegated.contexts[i]; + + if (__domUtils_54.matchesSelector(element, selector) && __domUtils_54.nodeContains(context, eventTarget) && __domUtils_54.nodeContains(context, element)) { + var listeners = delegated.listeners[i]; + fakeEvent.currentTarget = element; + + for (var _i3 = 0; _i3 < listeners.length; _i3++) { + var _ref2; + + _ref2 = listeners[_i3]; + + var _ref3 = _ref2, + _ref4 = _slicedToArray(_ref3, 3), + fn = _ref4[0], + capture = _ref4[1], + passive = _ref4[2]; + + if (capture === !!options.capture && passive === options.passive) { + fn(fakeEvent); + } + } + } + } + + element = __domUtils_54.parentNode(element); + } +} + +function delegateUseCapture(event) { + return delegateListener.call(this, event, true); +} + +function getOptions(param) { + return __is_54.object(param) ? param : { + capture: param + }; +} + +var FakeEvent = /*#__PURE__*/function () { + function FakeEvent(originalEvent) { + _classCallCheck(this, FakeEvent); + + this.originalEvent = originalEvent; + + _defineProperty(this, "currentTarget", void 0); + + // duplicate the event so that currentTarget can be changed + (0, ___pointerExtend_54["default"])(this, originalEvent); + } + + _createClass(FakeEvent, [{ + key: "preventOriginalDefault", + value: function preventOriginalDefault() { + this.originalEvent.preventDefault(); + } + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.originalEvent.stopPropagation(); + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.originalEvent.stopImmediatePropagation(); + } + }]); + + return FakeEvent; +}(); + +_$events_54.FakeEvent = FakeEvent; +var events = { + add: add, + remove: __remove_54, + addDelegate: addDelegate, + removeDelegate: removeDelegate, + delegateListener: delegateListener, + delegateUseCapture: delegateUseCapture, + delegatedEvents: delegatedEvents, + documents: documents, + supportsOptions: false, + supportsPassive: false, + _elements: elements, + _targets: targets, + init: function init(window) { + window.document.createElement('div').addEventListener('test', null, { + get capture() { + return events.supportsOptions = true; + }, + + get passive() { + return events.supportsPassive = true; + } + + }); + } +}; +var ___default_54 = events; +_$events_54["default"] = ___default_54; + +var _$extend_55 = {}; +"use strict"; + +Object.defineProperty(_$extend_55, "__esModule", { + value: true +}); +_$extend_55["default"] = extend; + +function extend(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } + + var ret = dest; + return ret; +} + +var _$normalizeListeners_61 = {}; +"use strict"; + +function ___typeof_61(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_61 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_61 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_61(obj); } + +Object.defineProperty(_$normalizeListeners_61, "__esModule", { + value: true +}); +_$normalizeListeners_61["default"] = normalize; + +var _extend = ___interopRequireDefault_61(_$extend_55); + +var __is_61 = ___interopRequireWildcard_61(_$is_59); + +function ___getRequireWildcardCache_61() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_61 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_61(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_61(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_61(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_61(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function normalize(type, listeners, result) { + result = result || {}; + + if (__is_61.string(type) && type.search(' ') !== -1) { + type = split(type); + } + + if (__is_61.array(type)) { + return type.reduce(function (acc, t) { + return (0, _extend["default"])(acc, normalize(t, listeners, result)); + }, result); + } // ({ type: fn }) -> ('', { type: fn }) + + + if (__is_61.object(type)) { + listeners = type; + type = ''; + } + + if (__is_61.func(listeners)) { + result[type] = result[type] || []; + result[type].push(listeners); + } else if (__is_61.array(listeners)) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; + + _ref = listeners[_i]; + var l = _ref; + normalize(type, l, result); + } + } else if (__is_61.object(listeners)) { + for (var prefix in listeners) { + var combinedTypes = split(prefix).map(function (p) { + return "".concat(type).concat(p); + }); + normalize(combinedTypes, listeners[prefix], result); + } + } + + return result; +} + +function split(type) { + return type.trim().split(/ +/); +} + +var _$Eventable_14 = {}; +"use strict"; + +function ___typeof_14(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_14 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_14 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_14(obj); } + +Object.defineProperty(_$Eventable_14, "__esModule", { + value: true +}); +_$Eventable_14["default"] = void 0; + +var __arr_14 = ___interopRequireWildcard_14(_$arr_49); + +var ___extend_14 = ___interopRequireDefault_14(_$extend_55); + +var _normalizeListeners = ___interopRequireDefault_14(_$normalizeListeners_61); + +function ___interopRequireDefault_14(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_14() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_14 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_14(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_14(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_14(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_14(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_14(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_14(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_14(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_14(Constructor, staticProps); return Constructor; } + +function ___defineProperty_14(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function fireUntilImmediateStopped(event, listeners) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; + + _ref = listeners[_i]; + var listener = _ref; + + if (event.immediatePropagationStopped) { + break; + } + + listener(event); + } +} + +var Eventable = /*#__PURE__*/function () { + function Eventable(options) { + ___classCallCheck_14(this, Eventable); + + ___defineProperty_14(this, "options", void 0); + + ___defineProperty_14(this, "types", {}); + + ___defineProperty_14(this, "propagationStopped", false); + + ___defineProperty_14(this, "immediatePropagationStopped", false); + + ___defineProperty_14(this, "global", void 0); + + this.options = (0, ___extend_14["default"])({}, options || {}); + } + + ___createClass_14(Eventable, [{ + key: "fire", + value: function fire(event) { + var listeners; + var global = this.global; // Interactable#on() listeners + // tslint:disable no-conditional-assignment + + if (listeners = this.types[event.type]) { + fireUntilImmediateStopped(event, listeners); + } // interact.on() listeners + + + if (!event.propagationStopped && global && (listeners = global[event.type])) { + fireUntilImmediateStopped(event, listeners); + } + } + }, { + key: "on", + value: function on(type, listener) { + var listeners = (0, _normalizeListeners["default"])(type, listener); + + for (type in listeners) { + this.types[type] = __arr_14.merge(this.types[type] || [], listeners[type]); + } + } + }, { + key: "off", + value: function off(type, listener) { + var listeners = (0, _normalizeListeners["default"])(type, listener); + + for (type in listeners) { + var eventList = this.types[type]; + + if (!eventList || !eventList.length) { + continue; + } + + for (var _i2 = 0; _i2 < listeners[type].length; _i2++) { + var _ref2; + + _ref2 = listeners[type][_i2]; + var subListener = _ref2; + + var _index = eventList.indexOf(subListener); + + if (_index !== -1) { + eventList.splice(_index, 1); + } + } + } + } + }, { + key: "getRect", + value: function getRect(_element) { + return null; + } + }]); + + return Eventable; +}(); + +var ___default_14 = Eventable; +_$Eventable_14["default"] = ___default_14; + +var _$rect_65 = {}; +"use strict"; + +function ___typeof_65(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_65 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_65 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_65(obj); } + +Object.defineProperty(_$rect_65, "__esModule", { + value: true +}); +_$rect_65.getStringOptionResult = getStringOptionResult; +_$rect_65.resolveRectLike = resolveRectLike; +_$rect_65.rectToXY = rectToXY; +_$rect_65.xywhToTlbr = xywhToTlbr; +_$rect_65.tlbrToXywh = tlbrToXywh; +_$rect_65.addEdges = addEdges; + +/* removed: var _$domUtils_53 = require("./domUtils"); */; + +var ___extend_65 = ___interopRequireDefault_65(_$extend_55); + +var __is_65 = ___interopRequireWildcard_65(_$is_59); + +function ___getRequireWildcardCache_65() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_65 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_65(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_65(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_65(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_65(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +function getStringOptionResult(value, target, element) { + if (value === 'parent') { + return (0, _$domUtils_53.parentNode)(element); + } + + if (value === 'self') { + return target.getRect(element); + } + + return (0, _$domUtils_53.closest)(element, value); +} + +function resolveRectLike(value, target, element, functionArgs) { + var returnValue = value; + + if (__is_65.string(returnValue)) { + returnValue = getStringOptionResult(returnValue, target, element); + } else if (__is_65.func(returnValue)) { + returnValue = returnValue.apply(void 0, _toConsumableArray(functionArgs)); + } + + if (__is_65.element(returnValue)) { + returnValue = (0, _$domUtils_53.getElementRect)(returnValue); + } + + return returnValue; +} + +function rectToXY(rect) { + return rect && { + x: 'x' in rect ? rect.x : rect.left, + y: 'y' in rect ? rect.y : rect.top + }; +} + +function xywhToTlbr(rect) { + if (rect && !('left' in rect && 'top' in rect)) { + rect = (0, ___extend_65["default"])({}, rect); + rect.left = rect.x || 0; + rect.top = rect.y || 0; + rect.right = rect.right || rect.left + rect.width; + rect.bottom = rect.bottom || rect.top + rect.height; + } + + return rect; +} + +function tlbrToXywh(rect) { + if (rect && !('x' in rect && 'y' in rect)) { + rect = (0, ___extend_65["default"])({}, rect); + rect.x = rect.left || 0; + rect.y = rect.top || 0; + rect.width = rect.width || rect.right || 0 - rect.x; + rect.height = rect.height || rect.bottom || 0 - rect.y; + } + + return rect; +} + +function addEdges(edges, rect, delta) { + if (edges.left) { + rect.left += delta.x; + } + + if (edges.right) { + rect.right += delta.x; + } + + if (edges.top) { + rect.top += delta.y; + } + + if (edges.bottom) { + rect.bottom += delta.y; + } + + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; +} + +var _$getOriginXY_56 = {}; +"use strict"; + +Object.defineProperty(_$getOriginXY_56, "__esModule", { + value: true +}); +_$getOriginXY_56["default"] = ___default_56; + +/* removed: var _$rect_65 = require("./rect"); */; + +function ___default_56(target, element, actionName) { + var actionOptions = target.options[actionName]; + var actionOrigin = actionOptions && actionOptions.origin; + var origin = actionOrigin || target.options.origin; + var originRect = (0, _$rect_65.resolveRectLike)(origin, target, element, [target && element]); + return (0, _$rect_65.rectToXY)(originRect) || { + x: 0, + y: 0 + }; +} + +var _$raf_64 = {}; +"use strict"; + +Object.defineProperty(_$raf_64, "__esModule", { + value: true +}); +_$raf_64["default"] = void 0; +var lastTime = 0; + +var _request; + +var _cancel; + +function __init_64(window) { + _request = window.requestAnimationFrame; + _cancel = window.cancelAnimationFrame; + + if (!_request) { + var vendors = ['ms', 'moz', 'webkit', 'o']; + + for (var _i = 0; _i < vendors.length; _i++) { + var vendor = vendors[_i]; + _request = window["".concat(vendor, "RequestAnimationFrame")]; + _cancel = window["".concat(vendor, "CancelAnimationFrame")] || window["".concat(vendor, "CancelRequestAnimationFrame")]; + } + } + + if (!_request) { + _request = function request(callback) { + var currTime = Date.now(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); // eslint-disable-next-line standard/no-callback-literal + + var token = setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return token; + }; + + _cancel = function cancel(token) { + return clearTimeout(token); + }; + } +} + +var ___default_64 = { + request: function request(callback) { + return _request(callback); + }, + cancel: function cancel(token) { + return _cancel(token); + }, + init: __init_64 +}; +_$raf_64["default"] = ___default_64; + +var _$index_58 = {}; +"use strict"; + +function ___typeof_58(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_58 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_58 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_58(obj); } + +Object.defineProperty(_$index_58, "__esModule", { + value: true +}); +_$index_58.warnOnce = warnOnce; +_$index_58.copyAction = copyAction; +Object.defineProperty(_$index_58, "win", { + enumerable: true, + get: function get() { + return ___window_58["default"]; + } +}); +Object.defineProperty(_$index_58, "browser", { + enumerable: true, + get: function get() { + return ___browser_58["default"]; + } +}); +Object.defineProperty(_$index_58, "clone", { + enumerable: true, + get: function get() { + return _clone["default"]; + } +}); +Object.defineProperty(_$index_58, "events", { + enumerable: true, + get: function get() { + return _events["default"]; + } +}); +Object.defineProperty(_$index_58, "extend", { + enumerable: true, + get: function get() { + return ___extend_58["default"]; + } +}); +Object.defineProperty(_$index_58, "getOriginXY", { + enumerable: true, + get: function get() { + return _getOriginXY["default"]; + } +}); +Object.defineProperty(_$index_58, "hypot", { + enumerable: true, + get: function get() { + return ___hypot_58["default"]; + } +}); +Object.defineProperty(_$index_58, "normalizeListeners", { + enumerable: true, + get: function get() { + return ___normalizeListeners_58["default"]; + } +}); +Object.defineProperty(_$index_58, "raf", { + enumerable: true, + get: function get() { + return _raf["default"]; + } +}); +_$index_58.rect = _$index_58.pointer = _$index_58.is = _$index_58.dom = _$index_58.arr = void 0; + +var __arr_58 = ___interopRequireWildcard_58(_$arr_49); + +_$index_58.arr = __arr_58; + +var dom = ___interopRequireWildcard_58(_$domUtils_53); + +_$index_58.dom = dom; + +var __is_58 = ___interopRequireWildcard_58(_$is_59); + +_$index_58.is = __is_58; + +var pointer = ___interopRequireWildcard_58(_$pointerUtils_63); + +_$index_58.pointer = pointer; + +var rect = ___interopRequireWildcard_58(_$rect_65); + +_$index_58.rect = rect; + +var ___window_58 = ___interopRequireDefault_58(_$window_68); + +var ___browser_58 = ___interopRequireDefault_58(_$browser_50); + +var _clone = ___interopRequireDefault_58(_$clone_51); + +var _events = ___interopRequireDefault_58(_$events_54); + +var ___extend_58 = ___interopRequireDefault_58(_$extend_55); + +var _getOriginXY = ___interopRequireDefault_58(_$getOriginXY_56); + +var ___hypot_58 = ___interopRequireDefault_58(_$hypot_57); + +var ___normalizeListeners_58 = ___interopRequireDefault_58(_$normalizeListeners_61); + +var _raf = ___interopRequireDefault_58(_$raf_64); + +function ___interopRequireDefault_58(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_58() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_58 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_58(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_58(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_58(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function warnOnce(method, message) { + var warned = false; // eslint-disable-next-line no-shadow + + return function () { + if (!warned) { + ___window_58["default"].window.console.warn(message); + + warned = true; + } + + return method.apply(this, arguments); + }; +} + +function copyAction(dest, src) { + dest.name = src.name; + dest.axis = src.axis; + dest.edges = src.edges; + return dest; +} + +var _$defaultOptions_20 = {}; +"use strict"; + +Object.defineProperty(_$defaultOptions_20, "__esModule", { + value: true +}); +_$defaultOptions_20["default"] = _$defaultOptions_20.defaults = void 0; +// tslint:disable no-empty-interface +// eslint-disable-next-line @typescript-eslint/no-empty-interface +// export interface Options extends BaseDefaults, PerActionDefaults {} +var defaults = { + base: { + preventDefault: 'auto', + deltaSource: 'page' + }, + perAction: { + enabled: false, + origin: { + x: 0, + y: 0 + } + }, + actions: {} +}; +_$defaultOptions_20.defaults = defaults; +var ___default_20 = defaults; +_$defaultOptions_20["default"] = ___default_20; + +var _$InteractableSet_17 = {}; +"use strict"; + +function ___typeof_17(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_17 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_17 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_17(obj); } + +Object.defineProperty(_$InteractableSet_17, "__esModule", { + value: true +}); +_$InteractableSet_17["default"] = void 0; + +var __arr_17 = ___interopRequireWildcard_17(_$arr_49); + +var __domUtils_17 = ___interopRequireWildcard_17(_$domUtils_53); + +var ___extend_17 = ___interopRequireDefault_17(_$extend_55); + +var __is_17 = ___interopRequireWildcard_17(_$is_59); + +function ___interopRequireDefault_17(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_17() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_17 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_17(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_17(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_17(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_17(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_17(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_17(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_17(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_17(Constructor, staticProps); return Constructor; } + +function ___defineProperty_17(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var InteractableSet = /*#__PURE__*/function () { + // all set interactables + function InteractableSet(scope) { + var _this = this; + + ___classCallCheck_17(this, InteractableSet); + + this.scope = scope; + + ___defineProperty_17(this, "list", []); + + ___defineProperty_17(this, "selectorMap", {}); + + scope.addListeners({ + 'interactable:unset': function interactableUnset(_ref) { + var interactable = _ref.interactable; + var target = interactable.target, + context = interactable._context; + var targetMappings = __is_17.string(target) ? _this.selectorMap[target] : target[_this.scope.id]; + var targetIndex = targetMappings.findIndex(function (m) { + return m.context === context; + }); + + if (targetMappings[targetIndex]) { + // Destroying mappingInfo's context and interactable + targetMappings[targetIndex].context = null; + targetMappings[targetIndex].interactable = null; + } + + targetMappings.splice(targetIndex, 1); + } + }); + } + + ___createClass_17(InteractableSet, [{ + key: "new", + value: function _new(target, options) { + options = (0, ___extend_17["default"])(options || {}, { + actions: this.scope.actions + }); + var interactable = new this.scope.Interactable(target, options, this.scope.document); + var mappingInfo = { + context: interactable._context, + interactable: interactable + }; + this.scope.addDocument(interactable._doc); + this.list.push(interactable); + + if (__is_17.string(target)) { + if (!this.selectorMap[target]) { + this.selectorMap[target] = []; + } + + this.selectorMap[target].push(mappingInfo); + } else { + if (!interactable.target[this.scope.id]) { + Object.defineProperty(target, this.scope.id, { + value: [], + configurable: true + }); + } + + target[this.scope.id].push(mappingInfo); + } + + this.scope.fire('interactable:new', { + target: target, + options: options, + interactable: interactable, + win: this.scope._win + }); + return interactable; + } + }, { + key: "get", + value: function get(target, options) { + var context = options && options.context || this.scope.document; + var isSelector = __is_17.string(target); + var targetMappings = isSelector ? this.selectorMap[target] : target[this.scope.id]; + + if (!targetMappings) { + return null; + } + + var found = __arr_17.find(targetMappings, function (m) { + return m.context === context && (isSelector || m.interactable.inContext(target)); + }); + return found && found.interactable; + } + }, { + key: "forEachMatch", + value: function forEachMatch(node, callback) { + for (var _i = 0; _i < this.list.length; _i++) { + var _ref2; + + _ref2 = this.list[_i]; + var _interactable = _ref2; + var ret = void 0; + + if ((__is_17.string(_interactable.target) // target is a selector and the element matches + ? __is_17.element(node) && __domUtils_17.matchesSelector(node, _interactable.target) : // target is the element + node === _interactable.target) && // the element is in context + _interactable.inContext(node)) { + ret = callback(_interactable); + } + + if (ret !== undefined) { + return ret; + } + } + } + }]); + + return InteractableSet; +}(); + +_$InteractableSet_17["default"] = InteractableSet; + +var _$BaseEvent_13 = {}; +"use strict"; + +Object.defineProperty(_$BaseEvent_13, "__esModule", { + value: true +}); +_$BaseEvent_13["default"] = _$BaseEvent_13.BaseEvent = void 0; + +function ___classCallCheck_13(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_13(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_13(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_13(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_13(Constructor, staticProps); return Constructor; } + +function ___defineProperty_13(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var BaseEvent = /*#__PURE__*/function () { + ___createClass_13(BaseEvent, [{ + key: "interaction", + get: function get() { + return this._interaction._proxy; + } + }]); + + function BaseEvent(interaction) { + ___classCallCheck_13(this, BaseEvent); + + ___defineProperty_13(this, "type", void 0); + + ___defineProperty_13(this, "target", void 0); + + ___defineProperty_13(this, "currentTarget", void 0); + + ___defineProperty_13(this, "interactable", void 0); + + ___defineProperty_13(this, "_interaction", void 0); + + ___defineProperty_13(this, "timeStamp", void 0); + + ___defineProperty_13(this, "immediatePropagationStopped", false); + + ___defineProperty_13(this, "propagationStopped", false); + + this._interaction = interaction; + } + + ___createClass_13(BaseEvent, [{ + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call any other listeners (even on the current target) + */ + + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }]); + + return BaseEvent; +}(); + +_$BaseEvent_13.BaseEvent = BaseEvent; +var ___default_13 = BaseEvent; +_$BaseEvent_13["default"] = ___default_13; + +var _$InteractEvent_15 = {}; +"use strict"; + +Object.defineProperty(_$InteractEvent_15, "__esModule", { + value: true +}); +_$InteractEvent_15["default"] = _$InteractEvent_15.InteractEvent = void 0; + +var ___extend_15 = ___interopRequireDefault_15(_$extend_55); + +var ___getOriginXY_15 = ___interopRequireDefault_15(_$getOriginXY_56); + +var ___hypot_15 = ___interopRequireDefault_15(_$hypot_57); + +var _BaseEvent2 = ___interopRequireDefault_15(_$BaseEvent_13); + +var _defaultOptions = ___interopRequireDefault_15(_$defaultOptions_20); + +function ___interopRequireDefault_15(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_15(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_15 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_15 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_15(obj); } + +function ___classCallCheck_15(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_15(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_15(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_15(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_15(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (___typeof_15(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function ___defineProperty_15(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var InteractEvent = /*#__PURE__*/function (_BaseEvent) { + _inherits(InteractEvent, _BaseEvent); + + // drag + // resize + + /** */ + function InteractEvent(interaction, event, actionName, phase, element, preEnd, type) { + var _this; + + ___classCallCheck_15(this, InteractEvent); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(InteractEvent).call(this, interaction)); + + ___defineProperty_15(_assertThisInitialized(_this), "target", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "currentTarget", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "relatedTarget", null); + + ___defineProperty_15(_assertThisInitialized(_this), "screenX", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "screenY", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "button", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "buttons", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "ctrlKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "shiftKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "altKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "metaKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "page", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "client", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "delta", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "rect", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "x0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "y0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "t0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dt", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "duration", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "clientX0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "clientY0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "velocity", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "speed", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "swipe", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "timeStamp", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dragEnter", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dragLeave", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "axes", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "preEnd", void 0); + + element = element || interaction.element; + var target = interaction.interactable; + var deltaSource = (target && target.options || _defaultOptions["default"]).deltaSource; + var origin = (0, ___getOriginXY_15["default"])(target, element, actionName); + var starting = phase === 'start'; + var ending = phase === 'end'; + var prevEvent = starting ? _assertThisInitialized(_this) : interaction.prevEvent; + var coords = starting ? interaction.coords.start : ending ? { + page: prevEvent.page, + client: prevEvent.client, + timeStamp: interaction.coords.cur.timeStamp + } : interaction.coords.cur; + _this.page = (0, ___extend_15["default"])({}, coords.page); + _this.client = (0, ___extend_15["default"])({}, coords.client); + _this.rect = (0, ___extend_15["default"])({}, interaction.rect); + _this.timeStamp = coords.timeStamp; + + if (!ending) { + _this.page.x -= origin.x; + _this.page.y -= origin.y; + _this.client.x -= origin.x; + _this.client.y -= origin.y; + } + + _this.ctrlKey = event.ctrlKey; + _this.altKey = event.altKey; + _this.shiftKey = event.shiftKey; + _this.metaKey = event.metaKey; + _this.button = event.button; + _this.buttons = event.buttons; + _this.target = element; + _this.currentTarget = element; + _this.preEnd = preEnd; + _this.type = type || actionName + (phase || ''); + _this.interactable = target; + _this.t0 = starting ? interaction.pointers[interaction.pointers.length - 1].downTime : prevEvent.t0; + _this.x0 = interaction.coords.start.page.x - origin.x; + _this.y0 = interaction.coords.start.page.y - origin.y; + _this.clientX0 = interaction.coords.start.client.x - origin.x; + _this.clientY0 = interaction.coords.start.client.y - origin.y; + + if (starting || ending) { + _this.delta = { + x: 0, + y: 0 + }; + } else { + _this.delta = { + x: _this[deltaSource].x - prevEvent[deltaSource].x, + y: _this[deltaSource].y - prevEvent[deltaSource].y + }; + } + + _this.dt = interaction.coords.delta.timeStamp; + _this.duration = _this.timeStamp - _this.t0; // velocity and speed in pixels per second + + _this.velocity = (0, ___extend_15["default"])({}, interaction.coords.velocity[deltaSource]); + _this.speed = (0, ___hypot_15["default"])(_this.velocity.x, _this.velocity.y); + _this.swipe = ending || phase === 'inertiastart' ? _this.getSwipe() : null; + return _this; + } + + ___createClass_15(InteractEvent, [{ + key: "getSwipe", + value: function getSwipe() { + var interaction = this._interaction; + + if (interaction.prevEvent.speed < 600 || this.timeStamp - interaction.prevEvent.timeStamp > 150) { + return null; + } + + var angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI; + var overlap = 22.5; + + if (angle < 0) { + angle += 360; + } + + var left = 135 - overlap <= angle && angle < 225 + overlap; + var up = 225 - overlap <= angle && angle < 315 + overlap; + var right = !left && (315 - overlap <= angle || angle < 45 + overlap); + var down = !up && 45 - overlap <= angle && angle < 135 + overlap; + return { + up: up, + down: down, + left: left, + right: right, + angle: angle, + speed: interaction.prevEvent.speed, + velocity: { + x: interaction.prevEvent.velocityX, + y: interaction.prevEvent.velocityY + } + }; + } + }, { + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + /** + * Don't call any other listeners (even on the current target) + */ + + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "pageX", + get: function get() { + return this.page.x; + }, + set: function set(value) { + this.page.x = value; + } + }, { + key: "pageY", + get: function get() { + return this.page.y; + }, + set: function set(value) { + this.page.y = value; + } + }, { + key: "clientX", + get: function get() { + return this.client.x; + }, + set: function set(value) { + this.client.x = value; + } + }, { + key: "clientY", + get: function get() { + return this.client.y; + }, + set: function set(value) { + this.client.y = value; + } + }, { + key: "dx", + get: function get() { + return this.delta.x; + }, + set: function set(value) { + this.delta.x = value; + } + }, { + key: "dy", + get: function get() { + return this.delta.y; + }, + set: function set(value) { + this.delta.y = value; + } + }, { + key: "velocityX", + get: function get() { + return this.velocity.x; + }, + set: function set(value) { + this.velocity.x = value; + } + }, { + key: "velocityY", + get: function get() { + return this.velocity.y; + }, + set: function set(value) { + this.velocity.y = value; + } + }]); + + return InteractEvent; +}(_BaseEvent2["default"]); + +_$InteractEvent_15.InteractEvent = InteractEvent; +var ___default_15 = InteractEvent; +_$InteractEvent_15["default"] = ___default_15; + +var _$PointerInfo_19 = {}; +"use strict"; + +Object.defineProperty(_$PointerInfo_19, "__esModule", { + value: true +}); +_$PointerInfo_19["default"] = _$PointerInfo_19.PointerInfo = void 0; + +function ___classCallCheck_19(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* eslint-disable @typescript-eslint/no-parameter-properties */ +var PointerInfo = function PointerInfo(id, pointer, event, downTime, downTarget) { + ___classCallCheck_19(this, PointerInfo); + + this.id = id; + this.pointer = pointer; + this.event = event; + this.downTime = downTime; + this.downTarget = downTarget; +}; + +_$PointerInfo_19.PointerInfo = PointerInfo; +var ___default_19 = PointerInfo; +_$PointerInfo_19["default"] = ___default_19; + +var _$Interaction_18 = {}; +"use strict"; + +function ___typeof_18(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_18 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_18 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_18(obj); } + +Object.defineProperty(_$Interaction_18, "__esModule", { + value: true +}); +Object.defineProperty(_$Interaction_18, "PointerInfo", { + enumerable: true, + get: function get() { + return _PointerInfo["default"]; + } +}); +_$Interaction_18["default"] = _$Interaction_18.Interaction = _$Interaction_18._ProxyMethods = _$Interaction_18._ProxyValues = void 0; + +var utils = ___interopRequireWildcard_18(_$index_58); + +var _InteractEvent = ___interopRequireDefault_18(_$InteractEvent_15); + +var _PointerInfo = ___interopRequireDefault_18(_$PointerInfo_19); + +function ___interopRequireDefault_18(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_18() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_18 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_18(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_18(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_18(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_18(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_18(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_18(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_18(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_18(Constructor, staticProps); return Constructor; } + +function ___defineProperty_18(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _ProxyValues; + +_$Interaction_18._ProxyValues = _ProxyValues; + +(function (_ProxyValues) { + _ProxyValues["interactable"] = ""; + _ProxyValues["element"] = ""; + _ProxyValues["prepared"] = ""; + _ProxyValues["pointerIsDown"] = ""; + _ProxyValues["pointerWasMoved"] = ""; + _ProxyValues["_proxy"] = ""; +})(_ProxyValues || (_$Interaction_18._ProxyValues = _ProxyValues = {})); + +var _ProxyMethods; + +_$Interaction_18._ProxyMethods = _ProxyMethods; + +(function (_ProxyMethods) { + _ProxyMethods["start"] = ""; + _ProxyMethods["move"] = ""; + _ProxyMethods["end"] = ""; + _ProxyMethods["stop"] = ""; + _ProxyMethods["interacting"] = ""; +})(_ProxyMethods || (_$Interaction_18._ProxyMethods = _ProxyMethods = {})); + +var idCounter = 0; + +var Interaction = /*#__PURE__*/function () { + ___createClass_18(Interaction, [{ + key: "pointerMoveTolerance", + // current interactable being interacted with + // the target element of the interactable + // action that's ready to be fired on next move event + // keep track of added pointers + // pointerdown/mousedown/touchstart event + // previous action event + get: function get() { + return 1; + } + /** + * @alias Interaction.prototype.move + */ + + }]); + + /** */ + function Interaction(_ref) { + var _this = this; + + var pointerType = _ref.pointerType, + scopeFire = _ref.scopeFire; + + ___classCallCheck_18(this, Interaction); + + ___defineProperty_18(this, "interactable", null); + + ___defineProperty_18(this, "element", null); + + ___defineProperty_18(this, "rect", void 0); + + ___defineProperty_18(this, "_rects", void 0); + + ___defineProperty_18(this, "edges", void 0); + + ___defineProperty_18(this, "_scopeFire", void 0); + + ___defineProperty_18(this, "prepared", { + name: null, + axis: null, + edges: null + }); + + ___defineProperty_18(this, "pointerType", void 0); + + ___defineProperty_18(this, "pointers", []); + + ___defineProperty_18(this, "downEvent", null); + + ___defineProperty_18(this, "downPointer", {}); + + ___defineProperty_18(this, "_latestPointer", { + pointer: null, + event: null, + eventTarget: null + }); + + ___defineProperty_18(this, "prevEvent", null); + + ___defineProperty_18(this, "pointerIsDown", false); + + ___defineProperty_18(this, "pointerWasMoved", false); + + ___defineProperty_18(this, "_interacting", false); + + ___defineProperty_18(this, "_ending", false); + + ___defineProperty_18(this, "_stopped", true); + + ___defineProperty_18(this, "_proxy", null); + + ___defineProperty_18(this, "simulation", null); + + ___defineProperty_18(this, "doMove", utils.warnOnce(function (signalArg) { + this.move(signalArg); + }, 'The interaction.doMove() method has been renamed to interaction.move()')); + + ___defineProperty_18(this, "coords", { + // Starting InteractEvent pointer coordinates + start: utils.pointer.newCoords(), + // Previous native pointer move event coordinates + prev: utils.pointer.newCoords(), + // current native pointer move event coordinates + cur: utils.pointer.newCoords(), + // Change in coordinates and time of the pointer + delta: utils.pointer.newCoords(), + // pointer velocity + velocity: utils.pointer.newCoords() + }); + + ___defineProperty_18(this, "_id", idCounter++); + + this._scopeFire = scopeFire; + this.pointerType = pointerType; + var that = this; + this._proxy = {}; + + var _loop = function _loop(key) { + Object.defineProperty(_this._proxy, key, { + get: function get() { + return that[key]; + } + }); + }; + + for (var key in _ProxyValues) { + _loop(key); + } + + var _loop2 = function _loop2(_key) { + Object.defineProperty(_this._proxy, _key, { + value: function value() { + return that[_key].apply(that, arguments); + } + }); + }; + + for (var _key in _ProxyMethods) { + _loop2(_key); + } + + this._scopeFire('interactions:new', { + interaction: this + }); + } + + ___createClass_18(Interaction, [{ + key: "pointerDown", + value: function pointerDown(pointer, event, eventTarget) { + var pointerIndex = this.updatePointer(pointer, event, eventTarget, true); + var pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:down', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + pointerIndex: pointerIndex, + pointerInfo: pointerInfo, + type: 'down', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable({ + * // disable the default drag start by down->move + * manualStart: true + * }) + * // start dragging after the user holds the pointer down + * .on('hold', function (event) { + * var interaction = event.interaction + * + * if (!interaction.interacting()) { + * interaction.start({ name: 'drag' }, + * event.interactable, + * event.currentTarget) + * } + * }) + * ``` + * + * Start an action with the given Interactable and Element as tartgets. The + * action must be enabled for the target Interactable and an appropriate + * number of pointers must be held down - 1 for drag/resize, 2 for gesture. + * + * Use it with `interactable.able({ manualStart: false })` to always + * [start actions manually](https://github.com/taye/interact.js/issues/114) + * + * @param {object} action The action to be performed - drag, resize, etc. + * @param {Interactable} target The Interactable to target + * @param {Element} element The DOM Element to target + * @return {object} interact + */ + + }, { + key: "start", + value: function start(action, interactable, element) { + if (this.interacting() || !this.pointerIsDown || this.pointers.length < (action.name === 'gesture' ? 2 : 1) || !interactable.options[action.name].enabled) { + return false; + } + + utils.copyAction(this.prepared, action); + this.interactable = interactable; + this.element = element; + this.rect = interactable.getRect(element); + this.edges = this.prepared.edges ? utils.extend({}, this.prepared.edges) : { + left: true, + right: true, + top: true, + bottom: true + }; + this._stopped = false; + this._interacting = this._doPhase({ + interaction: this, + event: this.downEvent, + phase: 'start' + }) && !this._stopped; + return this._interacting; + } + }, { + key: "pointerMove", + value: function pointerMove(pointer, event, eventTarget) { + if (!this.simulation && !(this.modification && this.modification.endResult)) { + this.updatePointer(pointer, event, eventTarget, false); + } + + var duplicateMove = this.coords.cur.page.x === this.coords.prev.page.x && this.coords.cur.page.y === this.coords.prev.page.y && this.coords.cur.client.x === this.coords.prev.client.x && this.coords.cur.client.y === this.coords.prev.client.y; + var dx; + var dy; // register movement greater than pointerMoveTolerance + + if (this.pointerIsDown && !this.pointerWasMoved) { + dx = this.coords.cur.client.x - this.coords.start.client.x; + dy = this.coords.cur.client.y - this.coords.start.client.y; + this.pointerWasMoved = utils.hypot(dx, dy) > this.pointerMoveTolerance; + } + + var pointerIndex = this.getPointerIndex(pointer); + var signalArg = { + pointer: pointer, + pointerIndex: pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event: event, + type: 'move', + eventTarget: eventTarget, + dx: dx, + dy: dy, + duplicate: duplicateMove, + interaction: this + }; + + if (!duplicateMove) { + // set pointer coordinate, time changes and velocity + utils.pointer.setCoordVelocity(this.coords.velocity, this.coords.delta); + } + + this._scopeFire('interactions:move', signalArg); + + if (!duplicateMove && !this.simulation) { + // if interacting, fire an 'action-move' signal etc + if (this.interacting()) { + signalArg.type = null; + this.move(signalArg); + } + + if (this.pointerWasMoved) { + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + } + } + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('dragmove', function (event) { + * if (someCondition) { + * // change the snap settings + * event.interactable.draggable({ snap: { targets: [] }}) + * // fire another move event with re-calculated snap + * event.interaction.move() + * } + * }) + * ``` + * + * Force a move of the current action at the same coordinates. Useful if + * snap/restrict has been changed and you want a movement with the new + * settings. + */ + + }, { + key: "move", + value: function move(signalArg) { + if (!signalArg || !signalArg.event) { + utils.pointer.setZeroCoords(this.coords.delta); + } + + signalArg = utils.extend({ + pointer: this._latestPointer.pointer, + event: this._latestPointer.event, + eventTarget: this._latestPointer.eventTarget, + interaction: this + }, signalArg || {}); + signalArg.phase = 'move'; + + this._doPhase(signalArg); + } // End interact move events and stop auto-scroll unless simulation is running + + }, { + key: "pointerUp", + value: function pointerUp(pointer, event, eventTarget, curEventTarget) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + pointerIndex = this.updatePointer(pointer, event, eventTarget, false); + } + + var type = /cancel$/i.test(event.type) ? 'cancel' : 'up'; + + this._scopeFire("interactions:".concat(type), { + pointer: pointer, + pointerIndex: pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event: event, + eventTarget: eventTarget, + type: type, + curEventTarget: curEventTarget, + interaction: this + }); + + if (!this.simulation) { + this.end(event); + } + + this.pointerIsDown = false; + this.removePointer(pointer, event); + } + }, { + key: "documentBlur", + value: function documentBlur(event) { + this.end(event); + + this._scopeFire('interactions:blur', { + event: event, + type: 'blur', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('move', function (event) { + * if (event.pageX > 1000) { + * // end the current action + * event.interaction.end() + * // stop all further listeners from being called + * event.stopImmediatePropagation() + * } + * }) + * ``` + * + * @param {PointerEvent} [event] + */ + + }, { + key: "end", + value: function end(event) { + this._ending = true; + event = event || this._latestPointer.event; + var endPhaseResult; + + if (this.interacting()) { + endPhaseResult = this._doPhase({ + event: event, + interaction: this, + phase: 'end' + }); + } + + this._ending = false; + + if (endPhaseResult === true) { + this.stop(); + } + } + }, { + key: "currentAction", + value: function currentAction() { + return this._interacting ? this.prepared.name : null; + } + }, { + key: "interacting", + value: function interacting() { + return this._interacting; + } + /** */ + + }, { + key: "stop", + value: function stop() { + this._scopeFire('interactions:stop', { + interaction: this + }); + + this.interactable = this.element = null; + this._interacting = false; + this._stopped = true; + this.prepared.name = this.prevEvent = null; + } + }, { + key: "getPointerIndex", + value: function getPointerIndex(pointer) { + var pointerId = utils.pointer.getPointerId(pointer); // mouse and pen interactions may have only one pointer + + return this.pointerType === 'mouse' || this.pointerType === 'pen' ? this.pointers.length - 1 : utils.arr.findIndex(this.pointers, function (curPointer) { + return curPointer.id === pointerId; + }); + } + }, { + key: "getPointerInfo", + value: function getPointerInfo(pointer) { + return this.pointers[this.getPointerIndex(pointer)]; + } + }, { + key: "updatePointer", + value: function updatePointer(pointer, event, eventTarget, down) { + var id = utils.pointer.getPointerId(pointer); + var pointerIndex = this.getPointerIndex(pointer); + var pointerInfo = this.pointers[pointerIndex]; + down = down === false ? false : down || /(down|start)$/i.test(event.type); + + if (!pointerInfo) { + pointerInfo = new _PointerInfo["default"](id, pointer, event, null, null); + pointerIndex = this.pointers.length; + this.pointers.push(pointerInfo); + } else { + pointerInfo.pointer = pointer; + } + + utils.pointer.setCoords(this.coords.cur, this.pointers.map(function (p) { + return p.pointer; + }), this._now()); + utils.pointer.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur); + + if (down) { + this.pointerIsDown = true; + pointerInfo.downTime = this.coords.cur.timeStamp; + pointerInfo.downTarget = eventTarget; + utils.pointer.pointerExtend(this.downPointer, pointer); + + if (!this.interacting()) { + utils.pointer.copyCoords(this.coords.start, this.coords.cur); + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + this.downEvent = event; + this.pointerWasMoved = false; + } + } + + this._updateLatestPointer(pointer, event, eventTarget); + + this._scopeFire('interactions:update-pointer', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + down: down, + pointerInfo: pointerInfo, + pointerIndex: pointerIndex, + interaction: this + }); + + return pointerIndex; + } + }, { + key: "removePointer", + value: function removePointer(pointer, event) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + return; + } + + var pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:remove-pointer', { + pointer: pointer, + event: event, + eventTarget: null, + pointerIndex: pointerIndex, + pointerInfo: pointerInfo, + interaction: this + }); + + this.pointers.splice(pointerIndex, 1); + } + }, { + key: "_updateLatestPointer", + value: function _updateLatestPointer(pointer, event, eventTarget) { + this._latestPointer.pointer = pointer; + this._latestPointer.event = event; + this._latestPointer.eventTarget = eventTarget; + } + }, { + key: "destroy", + value: function destroy() { + this._latestPointer.pointer = null; + this._latestPointer.event = null; + this._latestPointer.eventTarget = null; + } + }, { + key: "_createPreparedEvent", + value: function _createPreparedEvent(event, phase, preEnd, type) { + return new _InteractEvent["default"](this, event, this.prepared.name, phase, this.element, preEnd, type); + } + }, { + key: "_fireEvent", + value: function _fireEvent(iEvent) { + this.interactable.fire(iEvent); + + if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) { + this.prevEvent = iEvent; + } + } + }, { + key: "_doPhase", + value: function _doPhase(signalArg) { + var event = signalArg.event, + phase = signalArg.phase, + preEnd = signalArg.preEnd, + type = signalArg.type; + var rect = this.rect; + + if (rect && phase === 'move') { + // update the rect changes due to pointer move + utils.rect.addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource]); + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + + var beforeResult = this._scopeFire("interactions:before-action-".concat(phase), signalArg); + + if (beforeResult === false) { + return false; + } + + var iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type); + + this._scopeFire("interactions:action-".concat(phase), signalArg); + + if (phase === 'start') { + this.prevEvent = iEvent; + } + + this._fireEvent(iEvent); + + this._scopeFire("interactions:after-action-".concat(phase), signalArg); + + return true; + } + }, { + key: "_now", + value: function _now() { + return Date.now(); + } + }]); + + return Interaction; +}(); + +_$Interaction_18.Interaction = Interaction; +var ___default_18 = Interaction; +_$Interaction_18["default"] = ___default_18; + +var _$interactionFinder_22 = {}; +"use strict"; + +function ___typeof_22(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_22 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_22 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_22(obj); } + +Object.defineProperty(_$interactionFinder_22, "__esModule", { + value: true +}); +_$interactionFinder_22["default"] = void 0; + +var __dom_22 = ___interopRequireWildcard_22(_$domUtils_53); + +function ___getRequireWildcardCache_22() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_22 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_22(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_22(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_22(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +var finder = { + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], + search: function search(details) { + for (var _i = 0; _i < finder.methodOrder.length; _i++) { + var _ref; + + _ref = finder.methodOrder[_i]; + var method = _ref; + var interaction = finder[method](details); + + if (interaction) { + return interaction; + } + } + + return null; + }, + // try to resume simulation with a new pointer + simulationResume: function simulationResume(_ref2) { + var pointerType = _ref2.pointerType, + eventType = _ref2.eventType, + eventTarget = _ref2.eventTarget, + scope = _ref2.scope; + + if (!/down|start/i.test(eventType)) { + return null; + } + + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref3; + + _ref3 = scope.interactions.list[_i2]; + var interaction = _ref3; + var element = eventTarget; + + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { + while (element) { + // if the element is the interaction element + if (element === interaction.element) { + return interaction; + } + + element = __dom_22.parentNode(element); + } + } + } + + return null; + }, + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { + var pointerId = _ref4.pointerId, + pointerType = _ref4.pointerType, + eventType = _ref4.eventType, + scope = _ref4.scope; + + if (pointerType !== 'mouse' && pointerType !== 'pen') { + return null; + } + + var firstNonActive; + + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref5; + + _ref5 = scope.interactions.list[_i3]; + var interaction = _ref5; + + if (interaction.pointerType === pointerType) { + // if it's a down event, skip interactions with running simulations + if (interaction.simulation && !hasPointerId(interaction, pointerId)) { + continue; + } // if the interaction is active, return it immediately + + + if (interaction.interacting()) { + return interaction; + } // otherwise save it and look for another active interaction + else if (!firstNonActive) { + firstNonActive = interaction; + } + } + } // if no active mouse interaction was found use the first inactive mouse + // interaction + + + if (firstNonActive) { + return firstNonActive; + } // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation + // is active + + + for (var _i4 = 0; _i4 < scope.interactions.list.length; _i4++) { + var _ref6; + + _ref6 = scope.interactions.list[_i4]; + var _interaction = _ref6; + + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { + return _interaction; + } + } + + return null; + }, + // get interaction that has this pointer + hasPointer: function hasPointer(_ref7) { + var pointerId = _ref7.pointerId, + scope = _ref7.scope; + + for (var _i5 = 0; _i5 < scope.interactions.list.length; _i5++) { + var _ref8; + + _ref8 = scope.interactions.list[_i5]; + var interaction = _ref8; + + if (hasPointerId(interaction, pointerId)) { + return interaction; + } + } + + return null; + }, + // get first idle interaction with a matching pointerType + idle: function idle(_ref9) { + var pointerType = _ref9.pointerType, + scope = _ref9.scope; + + for (var _i6 = 0; _i6 < scope.interactions.list.length; _i6++) { + var _ref10; + + _ref10 = scope.interactions.list[_i6]; + var interaction = _ref10; + + // if there's already a pointer held down + if (interaction.pointers.length === 1) { + var target = interaction.interactable; // don't add this pointer if there is a target interactable and it + // isn't gesturable + + if (target && !(target.options.gesture && target.options.gesture.enabled)) { + continue; + } + } // maximum of 2 pointers per interaction + else if (interaction.pointers.length >= 2) { + continue; + } + + if (!interaction.interacting() && pointerType === interaction.pointerType) { + return interaction; + } + } + + return null; + } +}; + +function hasPointerId(interaction, pointerId) { + return interaction.pointers.some(function (_ref11) { + var id = _ref11.id; + return id === pointerId; + }); +} + +var ___default_22 = finder; +_$interactionFinder_22["default"] = ___default_22; + +var _$interactablePreventDefault_21 = {}; +"use strict"; + +function ___typeof_21(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_21 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_21 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_21(obj); } + +Object.defineProperty(_$interactablePreventDefault_21, "__esModule", { + value: true +}); +_$interactablePreventDefault_21.install = __install_21; +_$interactablePreventDefault_21["default"] = void 0; + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var ___events_21 = ___interopRequireDefault_21(_$events_54); + +var __is_21 = ___interopRequireWildcard_21(_$is_59); + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +function ___getRequireWildcardCache_21() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_21 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_21(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_21(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_21(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_21(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function preventDefault(newValue) { + if (/^(always|never|auto)$/.test(newValue)) { + this.options.preventDefault = newValue; + return this; + } + + if (__is_21.bool(newValue)) { + this.options.preventDefault = newValue ? 'always' : 'never'; + return this; + } + + return this.options.preventDefault; +} + +function checkAndPreventDefault(interactable, scope, event) { + var setting = interactable.options.preventDefault; + + if (setting === 'never') { + return; + } + + if (setting === 'always') { + event.preventDefault(); + return; + } // setting === 'auto' + // if the browser supports passive event listeners and isn't running on iOS, + // don't preventDefault of touch{start,move} events. CSS touch-action and + // user-select should be used instead of calling event.preventDefault(). + + + if (___events_21["default"].supportsPassive && /^touch(start|move)$/.test(event.type)) { + var doc = (0, _$window_68.getWindow)(event.target).document; + var docOptions = scope.getDocOptions(doc); + + if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) { + return; + } + } // don't preventDefault of pointerdown events + + + if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) { + return; + } // don't preventDefault on editable elements + + + if (__is_21.element(event.target) && (0, _$domUtils_53.matchesSelector)(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) { + return; + } + + event.preventDefault(); +} + +function onInteractionEvent(_ref) { + var interaction = _ref.interaction, + event = _ref.event; + + if (interaction.interactable) { + interaction.interactable.checkAndPreventDefault(event); + } +} + +function __install_21(scope) { + /** @lends Interactable */ + var Interactable = scope.Interactable; + /** + * Returns or sets whether to prevent the browser's default behaviour in + * response to pointer events. Can be set to: + * - `'always'` to always prevent + * - `'never'` to never prevent + * - `'auto'` to let interact.js try to determine what would be best + * + * @param {string} [newValue] `'always'`, `'never'` or `'auto'` + * @return {string | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.preventDefault = preventDefault; + + Interactable.prototype.checkAndPreventDefault = function (event) { + return checkAndPreventDefault(this, scope, event); + }; // prevent native HTML5 drag on interact.js target elements + + + scope.interactions.docEvents.push({ + type: 'dragstart', + listener: function listener(event) { + for (var _i = 0; _i < scope.interactions.list.length; _i++) { + var _ref2; + + _ref2 = scope.interactions.list[_i]; + var interaction = _ref2; + + if (interaction.element && (interaction.element === event.target || (0, _$domUtils_53.nodeContains)(interaction.element, event.target))) { + interaction.interactable.checkAndPreventDefault(event); + return; + } + } + } + }); +} + +var ___default_21 = { + id: 'core/interactablePreventDefault', + install: __install_21, + listeners: ['down', 'move', 'up', 'cancel'].reduce(function (acc, eventType) { + acc["interactions:".concat(eventType)] = onInteractionEvent; + return acc; + }, {}) +}; +_$interactablePreventDefault_21["default"] = ___default_21; + +var _$DropEvent_2 = {}; +"use strict"; + +Object.defineProperty(_$DropEvent_2, "__esModule", { + value: true +}); +_$DropEvent_2["default"] = void 0; + +var ___BaseEvent2_2 = ___interopRequireDefault_2(_$BaseEvent_13); + +var __arr_2 = ___interopRequireWildcard_2(_$arr_49); + +function ___getRequireWildcardCache_2() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_2 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_2(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_2(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_2(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_2(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_2(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_2 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_2 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_2(obj); } + +function ___classCallCheck_2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_2(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_2(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_2(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_2(Constructor, staticProps); return Constructor; } + +function ___possibleConstructorReturn_2(self, call) { if (call && (___typeof_2(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_2(self); } + +function ___getPrototypeOf_2(o) { ___getPrototypeOf_2 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_2(o); } + +function ___assertThisInitialized_2(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ___inherits_2(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_2(subClass, superClass); } + +function ___setPrototypeOf_2(o, p) { ___setPrototypeOf_2 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_2(o, p); } + +function ___defineProperty_2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var DropEvent = /*#__PURE__*/function (_BaseEvent) { + ___inherits_2(DropEvent, _BaseEvent); + + /** + * Class of events fired on dropzones during drags with acceptable targets. + */ + function DropEvent(dropState, dragEvent, type) { + var _this; + + ___classCallCheck_2(this, DropEvent); + + _this = ___possibleConstructorReturn_2(this, ___getPrototypeOf_2(DropEvent).call(this, dragEvent._interaction)); + + ___defineProperty_2(___assertThisInitialized_2(_this), "target", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "dropzone", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "dragEvent", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "relatedTarget", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "draggable", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "timeStamp", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "propagationStopped", false); + + ___defineProperty_2(___assertThisInitialized_2(_this), "immediatePropagationStopped", false); + + var _ref = type === 'dragleave' ? dropState.prev : dropState.cur, + element = _ref.element, + dropzone = _ref.dropzone; + + _this.type = type; + _this.target = element; + _this.currentTarget = element; + _this.dropzone = dropzone; + _this.dragEvent = dragEvent; + _this.relatedTarget = dragEvent.target; + _this.draggable = dragEvent.interactable; + _this.timeStamp = dragEvent.timeStamp; + return _this; + } + /** + * If this is a `dropactivate` event, the dropzone element will be + * deactivated. + * + * If this is a `dragmove` or `dragenter`, a `dragleave` will be fired on the + * dropzone element and more. + */ + + + ___createClass_2(DropEvent, [{ + key: "reject", + value: function reject() { + var _this2 = this; + + var dropState = this._interaction.dropState; + + if (this.type !== 'dropactivate' && (!this.dropzone || dropState.cur.dropzone !== this.dropzone || dropState.cur.element !== this.target)) { + return; + } + + dropState.prev.dropzone = this.dropzone; + dropState.prev.element = this.target; + dropState.rejected = true; + dropState.events.enter = null; + this.stopImmediatePropagation(); + + if (this.type === 'dropactivate') { + var activeDrops = dropState.activeDrops; + var index = __arr_2.findIndex(activeDrops, function (_ref2) { + var dropzone = _ref2.dropzone, + element = _ref2.element; + return dropzone === _this2.dropzone && element === _this2.target; + }); + dropState.activeDrops.splice(index, 1); + var deactivateEvent = new DropEvent(dropState, this.dragEvent, 'dropdeactivate'); + deactivateEvent.dropzone = this.dropzone; + deactivateEvent.target = this.target; + this.dropzone.fire(deactivateEvent); + } else { + this.dropzone.fire(new DropEvent(dropState, this.dragEvent, 'dragleave')); + } + } + }, { + key: "preventDefault", + value: function preventDefault() {} + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }]); + + return DropEvent; +}(___BaseEvent2_2["default"]); + +var ___default_2 = DropEvent; +_$DropEvent_2["default"] = ___default_2; + +var _$index_3 = {}; +"use strict"; + +function ___typeof_3(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_3 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_3 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_3(obj); } + +Object.defineProperty(_$index_3, "__esModule", { + value: true +}); +_$index_3["default"] = void 0; + +var ___Interactable_3 = ___interopRequireDefault_3(_$Interactable_16({})); + +var ___scope_3 = _$scope_24({}); + +var __utils_3 = ___interopRequireWildcard_3(_$index_58); + +var _drag = ___interopRequireDefault_3(_$drag_1); + +var _DropEvent = ___interopRequireDefault_3(_$DropEvent_2); + +function ___getRequireWildcardCache_3() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_3 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_3(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_3(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_3(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_3(scope) { + var actions = scope.actions, + interact = scope.interact, + Interactable = scope.Interactable, + defaults = scope.defaults; + scope.usePlugin(_drag["default"]); + /** + * + * ```js + * interact('.drop').dropzone({ + * accept: '.can-drop' || document.getElementById('single-drop'), + * overlap: 'pointer' || 'center' || zeroToOne + * } + * ``` + * + * Returns or sets whether draggables can be dropped onto this target to + * trigger drop events + * + * Dropzones can receive the following events: + * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends + * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone + * - `dragmove` when a draggable that has entered the dropzone is moved + * - `drop` when a draggable is dropped into this dropzone + * + * Use the `accept` option to allow only elements that match the given CSS + * selector or element. The value can be: + * + * - **an Element** - only that element can be dropped into this dropzone. + * - **a string**, - the element being dragged must match it as a CSS selector. + * - **`null`** - accept options is cleared - it accepts any element. + * + * Use the `overlap` option to set how drops are checked for. The allowed + * values are: + * + * - `'pointer'`, the pointer must be over the dropzone (default) + * - `'center'`, the draggable element's center must be over the dropzone + * - a number from 0-1 which is the `(intersection area) / (draggable area)`. + * e.g. `0.5` for drop to happen when half of the area of the draggable is + * over the dropzone + * + * Use the `checker` option to specify a function to check if a dragged element + * is over this Interactable. + * + * @param {boolean | object | null} [options] The new options to be set. + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.dropzone = function (options) { + return dropzoneMethod(this, options); + }; + /** + * ```js + * interact(target) + * .dropChecker(function(dragEvent, // related dragmove or dragend event + * event, // TouchEvent/PointerEvent/MouseEvent + * dropped, // bool result of the default checker + * dropzone, // dropzone Interactable + * dropElement, // dropzone elemnt + * draggable, // draggable Interactable + * draggableElement) {// draggable element + * + * return dropped && event.target.hasAttribute('allow-drop') + * } + * ``` + */ + + + Interactable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) { + return dropCheckMethod(this, dragEvent, event, draggable, draggableElement, dropElement, rect); + }; + /** + * Returns or sets whether the dimensions of dropzone elements are calculated + * on every dragmove or only on dragstart for the default dropChecker + * + * @param {boolean} [newValue] True to check on each move. False to check only + * before start + * @return {boolean | interact} The current setting or interact + */ + + + interact.dynamicDrop = function (newValue) { + if (__utils_3.is.bool(newValue)) { + // if (dragging && scope.dynamicDrop !== newValue && !newValue) { + // calcRects(dropzones) + // } + scope.dynamicDrop = newValue; + return interact; + } + + return scope.dynamicDrop; + }; + + __utils_3.extend(actions.phaselessTypes, { + dragenter: true, + dragleave: true, + dropactivate: true, + dropdeactivate: true, + dropmove: true, + drop: true + }); + actions.methodDict.drop = 'dropzone'; + scope.dynamicDrop = false; + defaults.actions.drop = drop.defaults; +} + +function collectDrops(_ref, draggableElement) { + var interactables = _ref.interactables; + var drops = []; // collect all dropzones and their elements which qualify for a drop + + for (var _i = 0; _i < interactables.list.length; _i++) { + var _ref2; + + _ref2 = interactables.list[_i]; + var dropzone = _ref2; + + if (!dropzone.options.drop.enabled) { + continue; + } + + var accept = dropzone.options.drop.accept; // test the draggable draggableElement against the dropzone's accept setting + + if (__utils_3.is.element(accept) && accept !== draggableElement || __utils_3.is.string(accept) && !__utils_3.dom.matchesSelector(draggableElement, accept) || __utils_3.is.func(accept) && !accept({ + dropzone: dropzone, + draggableElement: draggableElement + })) { + continue; + } // query for new elements if necessary + + + var dropElements = __utils_3.is.string(dropzone.target) ? dropzone._context.querySelectorAll(dropzone.target) : __utils_3.is.array(dropzone.target) ? dropzone.target : [dropzone.target]; + + for (var _i2 = 0; _i2 < dropElements.length; _i2++) { + var _ref3; + + _ref3 = dropElements[_i2]; + var dropzoneElement = _ref3; + + if (dropzoneElement !== draggableElement) { + drops.push({ + dropzone: dropzone, + element: dropzoneElement + }); + } + } + } + + return drops; +} + +function fireActivationEvents(activeDrops, event) { + // loop through all active dropzones and trigger event + for (var _i3 = 0; _i3 < activeDrops.slice().length; _i3++) { + var _ref4; + + _ref4 = activeDrops.slice()[_i3]; + var _ref5 = _ref4, + dropzone = _ref5.dropzone, + element = _ref5.element; + event.dropzone = dropzone; // set current element as event target + + event.target = element; + dropzone.fire(event); + event.propagationStopped = event.immediatePropagationStopped = false; + } +} // return a new array of possible drops. getActiveDrops should always be +// called when a drag has just started or a drag event happens while +// dynamicDrop is true + + +function getActiveDrops(scope, dragElement) { + // get dropzones and their elements that could receive the draggable + var activeDrops = collectDrops(scope, dragElement); + + for (var _i4 = 0; _i4 < activeDrops.length; _i4++) { + var _ref6; + + _ref6 = activeDrops[_i4]; + var activeDrop = _ref6; + activeDrop.rect = activeDrop.dropzone.getRect(activeDrop.element); + } + + return activeDrops; +} + +function getDrop(_ref7, dragEvent, pointerEvent) { + var dropState = _ref7.dropState, + draggable = _ref7.interactable, + dragElement = _ref7.element; + var validDrops = []; // collect all dropzones and their elements which qualify for a drop + + for (var _i5 = 0; _i5 < dropState.activeDrops.length; _i5++) { + var _ref8; + + _ref8 = dropState.activeDrops[_i5]; + var _ref9 = _ref8, + dropzone = _ref9.dropzone, + dropzoneElement = _ref9.element, + _rect = _ref9.rect; + validDrops.push(dropzone.dropCheck(dragEvent, pointerEvent, draggable, dragElement, dropzoneElement, _rect) ? dropzoneElement : null); + } // get the most appropriate dropzone based on DOM depth and order + + + var dropIndex = __utils_3.dom.indexOfDeepestElement(validDrops); + return dropState.activeDrops[dropIndex] || null; +} + +function getDropEvents(interaction, _pointerEvent, dragEvent) { + var dropState = interaction.dropState; + var dropEvents = { + enter: null, + leave: null, + activate: null, + deactivate: null, + move: null, + drop: null + }; + + if (dragEvent.type === 'dragstart') { + dropEvents.activate = new _DropEvent["default"](dropState, dragEvent, 'dropactivate'); + dropEvents.activate.target = null; + dropEvents.activate.dropzone = null; + } + + if (dragEvent.type === 'dragend') { + dropEvents.deactivate = new _DropEvent["default"](dropState, dragEvent, 'dropdeactivate'); + dropEvents.deactivate.target = null; + dropEvents.deactivate.dropzone = null; + } + + if (dropState.rejected) { + return dropEvents; + } + + if (dropState.cur.element !== dropState.prev.element) { + // if there was a previous dropzone, create a dragleave event + if (dropState.prev.dropzone) { + dropEvents.leave = new _DropEvent["default"](dropState, dragEvent, 'dragleave'); + dragEvent.dragLeave = dropEvents.leave.target = dropState.prev.element; + dragEvent.prevDropzone = dropEvents.leave.dropzone = dropState.prev.dropzone; + } // if dropzone is not null, create a dragenter event + + + if (dropState.cur.dropzone) { + dropEvents.enter = new _DropEvent["default"](dropState, dragEvent, 'dragenter'); + dragEvent.dragEnter = dropState.cur.element; + dragEvent.dropzone = dropState.cur.dropzone; + } + } + + if (dragEvent.type === 'dragend' && dropState.cur.dropzone) { + dropEvents.drop = new _DropEvent["default"](dropState, dragEvent, 'drop'); + dragEvent.dropzone = dropState.cur.dropzone; + dragEvent.relatedTarget = dropState.cur.element; + } + + if (dragEvent.type === 'dragmove' && dropState.cur.dropzone) { + dropEvents.move = new _DropEvent["default"](dropState, dragEvent, 'dropmove'); + dropEvents.move.dragmove = dragEvent; + dragEvent.dropzone = dropState.cur.dropzone; + } + + return dropEvents; +} + +function fireDropEvents(interaction, events) { + var dropState = interaction.dropState; + var activeDrops = dropState.activeDrops, + cur = dropState.cur, + prev = dropState.prev; + + if (events.leave) { + prev.dropzone.fire(events.leave); + } + + if (events.move) { + cur.dropzone.fire(events.move); + } + + if (events.enter) { + cur.dropzone.fire(events.enter); + } + + if (events.drop) { + cur.dropzone.fire(events.drop); + } + + if (events.deactivate) { + fireActivationEvents(activeDrops, events.deactivate); + } + + dropState.prev.dropzone = cur.dropzone; + dropState.prev.element = cur.element; +} + +function onEventCreated(_ref10, scope) { + var interaction = _ref10.interaction, + iEvent = _ref10.iEvent, + event = _ref10.event; + + if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { + return; + } + + var dropState = interaction.dropState; + + if (scope.dynamicDrop) { + dropState.activeDrops = getActiveDrops(scope, interaction.element); + } + + var dragEvent = iEvent; + var dropResult = getDrop(interaction, dragEvent, event); // update rejected status + + dropState.rejected = dropState.rejected && !!dropResult && dropResult.dropzone === dropState.cur.dropzone && dropResult.element === dropState.cur.element; + dropState.cur.dropzone = dropResult && dropResult.dropzone; + dropState.cur.element = dropResult && dropResult.element; + dropState.events = getDropEvents(interaction, event, dragEvent); +} + +function dropzoneMethod(interactable, options) { + if (__utils_3.is.object(options)) { + interactable.options.drop.enabled = options.enabled !== false; + + if (options.listeners) { + var normalized = __utils_3.normalizeListeners(options.listeners); // rename 'drop' to '' as it will be prefixed with 'drop' + + var corrected = Object.keys(normalized).reduce(function (acc, type) { + var correctedType = /^(enter|leave)/.test(type) ? "drag".concat(type) : /^(activate|deactivate|move)/.test(type) ? "drop".concat(type) : type; + acc[correctedType] = normalized[type]; + return acc; + }, {}); + interactable.off(interactable.options.drop.listeners); + interactable.on(corrected); + interactable.options.drop.listeners = corrected; + } + + if (__utils_3.is.func(options.ondrop)) { + interactable.on('drop', options.ondrop); + } + + if (__utils_3.is.func(options.ondropactivate)) { + interactable.on('dropactivate', options.ondropactivate); + } + + if (__utils_3.is.func(options.ondropdeactivate)) { + interactable.on('dropdeactivate', options.ondropdeactivate); + } + + if (__utils_3.is.func(options.ondragenter)) { + interactable.on('dragenter', options.ondragenter); + } + + if (__utils_3.is.func(options.ondragleave)) { + interactable.on('dragleave', options.ondragleave); + } + + if (__utils_3.is.func(options.ondropmove)) { + interactable.on('dropmove', options.ondropmove); + } + + if (/^(pointer|center)$/.test(options.overlap)) { + interactable.options.drop.overlap = options.overlap; + } else if (__utils_3.is.number(options.overlap)) { + interactable.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0); + } + + if ('accept' in options) { + interactable.options.drop.accept = options.accept; + } + + if ('checker' in options) { + interactable.options.drop.checker = options.checker; + } + + return interactable; + } + + if (__utils_3.is.bool(options)) { + interactable.options.drop.enabled = options; + return interactable; + } + + return interactable.options.drop; +} + +function dropCheckMethod(interactable, dragEvent, event, draggable, draggableElement, dropElement, rect) { + var dropped = false; // if the dropzone has no rect (eg. display: none) + // call the custom dropChecker or just return false + + if (!(rect = rect || interactable.getRect(dropElement))) { + return interactable.options.drop.checker ? interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement) : false; + } + + var dropOverlap = interactable.options.drop.overlap; + + if (dropOverlap === 'pointer') { + var origin = __utils_3.getOriginXY(draggable, draggableElement, 'drag'); + var page = __utils_3.pointer.getPageXY(dragEvent); + page.x += origin.x; + page.y += origin.y; + var horizontal = page.x > rect.left && page.x < rect.right; + var vertical = page.y > rect.top && page.y < rect.bottom; + dropped = horizontal && vertical; + } + + var dragRect = draggable.getRect(draggableElement); + + if (dragRect && dropOverlap === 'center') { + var cx = dragRect.left + dragRect.width / 2; + var cy = dragRect.top + dragRect.height / 2; + dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom; + } + + if (dragRect && __utils_3.is.number(dropOverlap)) { + var overlapArea = Math.max(0, Math.min(rect.right, dragRect.right) - Math.max(rect.left, dragRect.left)) * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top, dragRect.top)); + var overlapRatio = overlapArea / (dragRect.width * dragRect.height); + dropped = overlapRatio >= dropOverlap; + } + + if (interactable.options.drop.checker) { + dropped = interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement); + } + + return dropped; +} + +var drop = { + id: 'actions/drop', + install: __install_3, + listeners: { + 'interactions:before-action-start': function interactionsBeforeActionStart(_ref11) { + var interaction = _ref11.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + interaction.dropState = { + cur: { + dropzone: null, + element: null + }, + prev: { + dropzone: null, + element: null + }, + rejected: null, + events: null, + activeDrops: [] + }; + }, + 'interactions:after-action-start': function interactionsAfterActionStart(_ref12, scope) { + var interaction = _ref12.interaction, + event = _ref12.event, + dragEvent = _ref12.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var dropState = interaction.dropState; // reset active dropzones + + dropState.activeDrops = null; + dropState.events = null; + dropState.activeDrops = getActiveDrops(scope, interaction.element); + dropState.events = getDropEvents(interaction, event, dragEvent); + + if (dropState.events.activate) { + fireActivationEvents(dropState.activeDrops, dropState.events.activate); + scope.fire('actions/drop:start', { + interaction: interaction, + dragEvent: dragEvent + }); + } + }, + // FIXME proper signal types + 'interactions:action-move': onEventCreated, + 'interactions:action-end': onEventCreated, + 'interactions:after-action-move': function fireDropAfterMove(_ref13, scope) { + var interaction = _ref13.interaction, + dragEvent = _ref13.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + fireDropEvents(interaction, interaction.dropState.events); + scope.fire('actions/drop:move', { + interaction: interaction, + dragEvent: dragEvent + }); + interaction.dropState.events = {}; + }, + 'interactions:after-action-end': function interactionsAfterActionEnd(_ref14, scope) { + var interaction = _ref14.interaction, + dragEvent = _ref14.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + fireDropEvents(interaction, interaction.dropState.events); + scope.fire('actions/drop:end', { + interaction: interaction, + dragEvent: dragEvent + }); + }, + 'interactions:stop': function interactionsStop(_ref15) { + var interaction = _ref15.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var dropState = interaction.dropState; + + if (dropState) { + dropState.activeDrops = null; + dropState.events = null; + dropState.cur.dropzone = null; + dropState.cur.element = null; + dropState.prev.dropzone = null; + dropState.prev.element = null; + dropState.rejected = false; + } + } + }, + getActiveDrops: getActiveDrops, + getDrop: getDrop, + getDropEvents: getDropEvents, + fireDropEvents: fireDropEvents, + defaults: { + enabled: false, + accept: null, + overlap: 'pointer' + } +}; +var ___default_3 = drop; +_$index_3["default"] = ___default_3; + +var _$gesture_4 = {}; +"use strict"; + +function ___typeof_4(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_4 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_4 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_4(obj); } + +Object.defineProperty(_$gesture_4, "__esModule", { + value: true +}); +_$gesture_4["default"] = void 0; + +var __utils_4 = ___interopRequireWildcard_4(_$index_58); + +function ___getRequireWildcardCache_4() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_4 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_4(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_4(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_4(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_4(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + defaults = scope.defaults; + /** + * ```js + * interact(element).gesturable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // limit multiple gestures. + * // See the explanation in {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isGestureable = interact(element).gesturable() + * ``` + * + * Gets or sets whether multitouch gestures can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on gesture events (makes the Interactable gesturable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of gesture events, or this Interactable + */ + + Interactable.prototype.gesturable = function (options) { + if (__utils_4.is.object(options)) { + this.options.gesture.enabled = options.enabled !== false; + this.setPerAction('gesture', options); + this.setOnEvents('gesture', options); + return this; + } + + if (__utils_4.is.bool(options)) { + this.options.gesture.enabled = options; + return this; + } + + return this.options.gesture; + }; + + actions.map.gesture = gesture; + actions.methodDict.gesture = 'gesturable'; + defaults.actions.gesture = gesture.defaults; +} + +function updateGestureProps(_ref) { + var interaction = _ref.interaction, + iEvent = _ref.iEvent, + phase = _ref.phase; + + if (interaction.prepared.name !== 'gesture') { + return; + } + + var pointers = interaction.pointers.map(function (p) { + return p.pointer; + }); + var starting = phase === 'start'; + var ending = phase === 'end'; + var deltaSource = interaction.interactable.options.deltaSource; + iEvent.touches = [pointers[0], pointers[1]]; + + if (starting) { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = 1; + iEvent.ds = 0; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.da = 0; + interaction.gesture.startDistance = iEvent.distance; + interaction.gesture.startAngle = iEvent.angle; + } else if (ending) { + var prevEvent = interaction.prevEvent; + iEvent.distance = prevEvent.distance; + iEvent.box = prevEvent.box; + iEvent.scale = prevEvent.scale; + iEvent.ds = 0; + iEvent.angle = prevEvent.angle; + iEvent.da = 0; + } else { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = iEvent.distance / interaction.gesture.startDistance; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.ds = iEvent.scale - interaction.gesture.scale; + iEvent.da = iEvent.angle - interaction.gesture.angle; + } + + interaction.gesture.distance = iEvent.distance; + interaction.gesture.angle = iEvent.angle; + + if (__utils_4.is.number(iEvent.scale) && iEvent.scale !== Infinity && !isNaN(iEvent.scale)) { + interaction.gesture.scale = iEvent.scale; + } +} + +var gesture = { + id: 'actions/gesture', + before: ['actions/drag', 'actions/resize'], + install: __install_4, + listeners: { + 'interactions:action-start': updateGestureProps, + 'interactions:action-move': updateGestureProps, + 'interactions:action-end': updateGestureProps, + 'interactions:new': function interactionsNew(_ref2) { + var interaction = _ref2.interaction; + interaction.gesture = { + angle: 0, + distance: 0, + scale: 1, + startAngle: 0, + startDistance: 0 + }; + }, + 'auto-start:check': function autoStartCheck(arg) { + if (arg.interaction.pointers.length < 2) { + return undefined; + } + + var gestureOptions = arg.interactable.options.gesture; + + if (!(gestureOptions && gestureOptions.enabled)) { + return undefined; + } + + arg.action = { + name: 'gesture' + }; + return false; + } + }, + defaults: {}, + getCursor: function getCursor() { + return ''; + } +}; +var ___default_4 = gesture; +_$gesture_4["default"] = ___default_4; + +var _$resize_6 = {}; +"use strict"; + +function ___typeof_6(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_6 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_6 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_6(obj); } + +Object.defineProperty(_$resize_6, "__esModule", { + value: true +}); +_$resize_6["default"] = void 0; + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +var __dom_6 = ___interopRequireWildcard_6(_$domUtils_53); + +var ___extend_6 = ___interopRequireDefault_6(_$extend_55); + +var __is_6 = ___interopRequireWildcard_6(_$is_59); + +function ___interopRequireDefault_6(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_6() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_6 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_6(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_6(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_6(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_6(scope) { + var actions = scope.actions, + browser = scope.browser, + Interactable = scope.Interactable, + defaults = scope.defaults; // Less Precision with touch input + + resize.cursors = initCursors(browser); + resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10; + /** + * ```js + * interact(element).resizable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * edges: { + * top : true, // Use pointer coords to check for resize. + * left : false, // Disable resizing from left edge. + * bottom: '.resize-s',// Resize if pointer target matches selector + * right : handleEl // Resize if pointer target is the given Element + * }, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height are adjusted at a 1:1 ratio. + * square: false, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height maintain the aspect ratio they had when resizing started. + * preserveAspectRatio: false, + * + * // a value of 'none' will limit the resize rect to a minimum of 0x0 + * // 'negate' will allow the rect to have negative width/height + * // 'reposition' will keep the width/height positive by swapping + * // the top and bottom edges and/or swapping the left and right edges + * invert: 'none' || 'negate' || 'reposition' + * + * // limit multiple resizes. + * // See the explanation in the {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isResizeable = interact(element).resizable() + * ``` + * + * Gets or sets whether resize actions can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on resize events (object makes the Interactable + * resizable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of resize elements, or this Interactable + */ + + Interactable.prototype.resizable = function (options) { + return resizable(this, options, scope); + }; + + actions.map.resize = resize; + actions.methodDict.resize = 'resizable'; + defaults.actions.resize = resize.defaults; +} + +function resizeChecker(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + element = arg.element, + rect = arg.rect, + buttons = arg.buttons; + + if (!rect) { + return undefined; + } + + var page = (0, ___extend_6["default"])({}, interaction.coords.cur.page); + var resizeOptions = interactable.options.resize; + + if (!(resizeOptions && resizeOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & resizeOptions.mouseButtons) === 0) { + return undefined; + } // if using resize.edges + + + if (__is_6.object(resizeOptions.edges)) { + var resizeEdges = { + left: false, + right: false, + top: false, + bottom: false + }; + + for (var edge in resizeEdges) { + resizeEdges[edge] = checkResizeEdge(edge, resizeOptions.edges[edge], page, interaction._latestPointer.eventTarget, element, rect, resizeOptions.margin || resize.defaultMargin); + } + + resizeEdges.left = resizeEdges.left && !resizeEdges.right; + resizeEdges.top = resizeEdges.top && !resizeEdges.bottom; + + if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) { + arg.action = { + name: 'resize', + edges: resizeEdges + }; + } + } else { + var right = resizeOptions.axis !== 'y' && page.x > rect.right - resize.defaultMargin; + var bottom = resizeOptions.axis !== 'x' && page.y > rect.bottom - resize.defaultMargin; + + if (right || bottom) { + arg.action = { + name: 'resize', + axes: (right ? 'x' : '') + (bottom ? 'y' : '') + }; + } + } + + return arg.action ? false : undefined; +} + +function resizable(interactable, options, scope) { + if (__is_6.object(options)) { + interactable.options.resize.enabled = options.enabled !== false; + interactable.setPerAction('resize', options); + interactable.setOnEvents('resize', options); + + if (__is_6.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) { + interactable.options.resize.axis = options.axis; + } else if (options.axis === null) { + interactable.options.resize.axis = scope.defaults.actions.resize.axis; + } + + if (__is_6.bool(options.preserveAspectRatio)) { + interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio; + } else if (__is_6.bool(options.square)) { + interactable.options.resize.square = options.square; + } + + return interactable; + } + + if (__is_6.bool(options)) { + interactable.options.resize.enabled = options; + return interactable; + } + + return interactable.options.resize; +} + +function checkResizeEdge(name, value, page, element, interactableElement, rect, margin) { + // false, '', undefined, null + if (!value) { + return false; + } // true value, use pointer coords and element rect + + + if (value === true) { + // if dimensions are negative, "switch" edges + var width = __is_6.number(rect.width) ? rect.width : rect.right - rect.left; + var height = __is_6.number(rect.height) ? rect.height : rect.bottom - rect.top; // don't use margin greater than half the relevent dimension + + margin = Math.min(margin, (name === 'left' || name === 'right' ? width : height) / 2); + + if (width < 0) { + if (name === 'left') { + name = 'right'; + } else if (name === 'right') { + name = 'left'; + } + } + + if (height < 0) { + if (name === 'top') { + name = 'bottom'; + } else if (name === 'bottom') { + name = 'top'; + } + } + + if (name === 'left') { + return page.x < (width >= 0 ? rect.left : rect.right) + margin; + } + + if (name === 'top') { + return page.y < (height >= 0 ? rect.top : rect.bottom) + margin; + } + + if (name === 'right') { + return page.x > (width >= 0 ? rect.right : rect.left) - margin; + } + + if (name === 'bottom') { + return page.y > (height >= 0 ? rect.bottom : rect.top) - margin; + } + } // the remaining checks require an element + + + if (!__is_6.element(element)) { + return false; + } + + return __is_6.element(value) // the value is an element to use as a resize handle + ? value === element // otherwise check if element matches value as selector + : __dom_6.matchesUpTo(element, value, interactableElement); +} + +function initCursors(browser) { + return browser.isIe9 ? { + x: 'e-resize', + y: 's-resize', + xy: 'se-resize', + top: 'n-resize', + left: 'w-resize', + bottom: 's-resize', + right: 'e-resize', + topleft: 'se-resize', + bottomright: 'se-resize', + topright: 'ne-resize', + bottomleft: 'ne-resize' + } : { + x: 'ew-resize', + y: 'ns-resize', + xy: 'nwse-resize', + top: 'ns-resize', + left: 'ew-resize', + bottom: 'ns-resize', + right: 'ew-resize', + topleft: 'nwse-resize', + bottomright: 'nwse-resize', + topright: 'nesw-resize', + bottomleft: 'nesw-resize' + }; +} + +function start(_ref) { + var iEvent = _ref.iEvent, + interaction = _ref.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + var rect = interaction.rect; + interaction._rects = { + start: (0, ___extend_6["default"])({}, rect), + corrected: (0, ___extend_6["default"])({}, rect), + previous: (0, ___extend_6["default"])({}, rect), + delta: { + left: 0, + right: 0, + width: 0, + top: 0, + bottom: 0, + height: 0 + } + }; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function __move_6(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + var resizeOptions = interaction.interactable.options.resize; + var invert = resizeOptions.invert; + var invertible = invert === 'reposition' || invert === 'negate'; // eslint-disable-next-line no-shadow + + var current = interaction.rect; + var _interaction$_rects = interaction._rects, + startRect = _interaction$_rects.start, + corrected = _interaction$_rects.corrected, + deltaRect = _interaction$_rects.delta, + previous = _interaction$_rects.previous; + (0, ___extend_6["default"])(previous, corrected); + + if (invertible) { + // if invertible, copy the current rect + (0, ___extend_6["default"])(corrected, current); + + if (invert === 'reposition') { + // swap edge values if necessary to keep width/height positive + if (corrected.top > corrected.bottom) { + var swap = corrected.top; + corrected.top = corrected.bottom; + corrected.bottom = swap; + } + + if (corrected.left > corrected.right) { + var _swap = corrected.left; + corrected.left = corrected.right; + corrected.right = _swap; + } + } + } else { + // if not invertible, restrict to minimum of 0x0 rect + corrected.top = Math.min(current.top, startRect.bottom); + corrected.bottom = Math.max(current.bottom, startRect.top); + corrected.left = Math.min(current.left, startRect.right); + corrected.right = Math.max(current.right, startRect.left); + } + + corrected.width = corrected.right - corrected.left; + corrected.height = corrected.bottom - corrected.top; + + for (var edge in corrected) { + deltaRect[edge] = corrected[edge] - previous[edge]; + } + + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = corrected; + resizeEvent.deltaRect = deltaRect; +} + +function end(_ref3) { + var iEvent = _ref3.iEvent, + interaction = _ref3.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function updateEventAxes(_ref4) { + var iEvent = _ref4.iEvent, + interaction = _ref4.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) { + return; + } + + var options = interaction.interactable.options; + var resizeEvent = iEvent; + + if (options.resize.square) { + if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = resizeEvent.delta.y; + } else { + resizeEvent.delta.y = resizeEvent.delta.x; + } + + resizeEvent.axes = 'xy'; + } else { + resizeEvent.axes = interaction.resizeAxes; + + if (interaction.resizeAxes === 'x') { + resizeEvent.delta.y = 0; + } else if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = 0; + } + } +} + +var resize = { + id: 'actions/resize', + before: ['actions/drag'], + install: __install_6, + listeners: { + 'interactions:new': function interactionsNew(_ref5) { + var interaction = _ref5.interaction; + interaction.resizeAxes = 'xy'; + }, + 'interactions:action-start': function interactionsActionStart(arg) { + start(arg); + updateEventAxes(arg); + }, + 'interactions:action-move': function interactionsActionMove(arg) { + __move_6(arg); + updateEventAxes(arg); + }, + 'interactions:action-end': end, + 'auto-start:check': resizeChecker + }, + defaults: { + square: false, + preserveAspectRatio: false, + axis: 'xy', + // use default margin + margin: NaN, + // object with props left, right, top, bottom which are + // true/false values to resize when the pointer is over that edge, + // CSS selectors to match the handles for each direction + // or the Elements for each handle + edges: null, + // a value of 'none' will limit the resize rect to a minimum of 0x0 + // 'negate' will alow the rect to have negative width/height + // 'reposition' will keep the width/height positive by swapping + // the top and bottom edges and/or swapping the left and right edges + invert: 'none' + }, + cursors: null, + getCursor: function getCursor(_ref6) { + var edges = _ref6.edges, + axis = _ref6.axis, + name = _ref6.name; + var cursors = resize.cursors; + var result = null; + + if (axis) { + result = cursors[name + axis]; + } else if (edges) { + var cursorKey = ''; + var _arr = ['top', 'bottom', 'left', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (edges[edge]) { + cursorKey += edge; + } + } + + result = cursors[cursorKey]; + } + + return result; + }, + defaultMargin: null +}; +var ___default_6 = resize; +_$resize_6["default"] = ___default_6; + +var _$index_5 = {}; +"use strict"; + +Object.defineProperty(_$index_5, "__esModule", { + value: true +}); +Object.defineProperty(_$index_5, "drag", { + enumerable: true, + get: function get() { + return ___drag_5["default"]; + } +}); +Object.defineProperty(_$index_5, "drop", { + enumerable: true, + get: function get() { + return _index["default"]; + } +}); +Object.defineProperty(_$index_5, "gesture", { + enumerable: true, + get: function get() { + return _gesture["default"]; + } +}); +Object.defineProperty(_$index_5, "resize", { + enumerable: true, + get: function get() { + return _resize["default"]; + } +}); +_$index_5["default"] = void 0; + +var ___drag_5 = ___interopRequireDefault_5(_$drag_1); + +var _index = ___interopRequireDefault_5(_$index_3); + +var _gesture = ___interopRequireDefault_5(_$gesture_4); + +var _resize = ___interopRequireDefault_5(_$resize_6); + +function ___interopRequireDefault_5(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var ___default_5 = { + id: 'actions', + install: function install(scope) { + scope.usePlugin(_gesture["default"]); + scope.usePlugin(_resize["default"]); + scope.usePlugin(___drag_5["default"]); + scope.usePlugin(_index["default"]); + } +}; +_$index_5["default"] = ___default_5; + +var _$index_7 = {}; +"use strict"; + +function ___typeof_7(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_7 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_7 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_7(obj); } + +Object.defineProperty(_$index_7, "__esModule", { + value: true +}); +_$index_7.getContainer = getContainer; +_$index_7.getScroll = getScroll; +_$index_7.getScrollSize = getScrollSize; +_$index_7.getScrollSizeDelta = getScrollSizeDelta; +_$index_7["default"] = void 0; + +var __domUtils_7 = ___interopRequireWildcard_7(_$domUtils_53); + +var __is_7 = ___interopRequireWildcard_7(_$is_59); + +var ___raf_7 = ___interopRequireDefault_7(_$raf_64); + +/* removed: var _$rect_65 = require("@interactjs/utils/rect"); */; + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +function ___interopRequireDefault_7(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_7() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_7 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_7(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_7(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_7(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_7(scope) { + var defaults = scope.defaults, + actions = scope.actions; + scope.autoScroll = autoScroll; + + autoScroll.now = function () { + return scope.now(); + }; + + actions.phaselessTypes.autoscroll = true; + defaults.perAction.autoScroll = autoScroll.defaults; +} + +var autoScroll = { + defaults: { + enabled: false, + margin: 60, + // the item that is scrolled (Window or HTMLElement) + container: null, + // the scroll speed in pixels per second + speed: 300 + }, + now: Date.now, + interaction: null, + i: 0, + // the handle returned by window.setInterval + // Direction each pulse is to scroll in + x: 0, + y: 0, + isScrolling: false, + prevTime: 0, + margin: 0, + speed: 0, + start: function start(interaction) { + autoScroll.isScrolling = true; + + ___raf_7["default"].cancel(autoScroll.i); + + interaction.autoScroll = autoScroll; + autoScroll.interaction = interaction; + autoScroll.prevTime = autoScroll.now(); + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + }, + stop: function stop() { + autoScroll.isScrolling = false; + + if (autoScroll.interaction) { + autoScroll.interaction.autoScroll = null; + } + + ___raf_7["default"].cancel(autoScroll.i); + }, + // scroll the window by the values in scroll.x/y + scroll: function scroll() { + var interaction = autoScroll.interaction; + var interactable = interaction.interactable, + element = interaction.element; + var actionName = interaction.prepared.name; + var options = interactable.options[actionName].autoScroll; + var container = getContainer(options.container, interactable, element); + var now = autoScroll.now(); // change in time in seconds + + var dt = (now - autoScroll.prevTime) / 1000; // displacement + + var s = options.speed * dt; + + if (s >= 1) { + var scrollBy = { + x: autoScroll.x * s, + y: autoScroll.y * s + }; + + if (scrollBy.x || scrollBy.y) { + var prevScroll = getScroll(container); + + if (__is_7.window(container)) { + container.scrollBy(scrollBy.x, scrollBy.y); + } else if (container) { + container.scrollLeft += scrollBy.x; + container.scrollTop += scrollBy.y; + } + + var curScroll = getScroll(container); + var delta = { + x: curScroll.x - prevScroll.x, + y: curScroll.y - prevScroll.y + }; + + if (delta.x || delta.y) { + interactable.fire({ + type: 'autoscroll', + target: element, + interactable: interactable, + delta: delta, + interaction: interaction, + container: container + }); + } + } + + autoScroll.prevTime = now; + } + + if (autoScroll.isScrolling) { + ___raf_7["default"].cancel(autoScroll.i); + + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + } + }, + check: function check(interactable, actionName) { + var options = interactable.options; + return options[actionName].autoScroll && options[actionName].autoScroll.enabled; + }, + onInteractionMove: function onInteractionMove(_ref) { + var interaction = _ref.interaction, + pointer = _ref.pointer; + + if (!(interaction.interacting() && autoScroll.check(interaction.interactable, interaction.prepared.name))) { + return; + } + + if (interaction.simulation) { + autoScroll.x = autoScroll.y = 0; + return; + } + + var top; + var right; + var bottom; + var left; + var interactable = interaction.interactable, + element = interaction.element; + var actionName = interaction.prepared.name; + var options = interactable.options[actionName].autoScroll; + var container = getContainer(options.container, interactable, element); + + if (__is_7.window(container)) { + left = pointer.clientX < autoScroll.margin; + top = pointer.clientY < autoScroll.margin; + right = pointer.clientX > container.innerWidth - autoScroll.margin; + bottom = pointer.clientY > container.innerHeight - autoScroll.margin; + } else { + var rect = __domUtils_7.getElementClientRect(container); + left = pointer.clientX < rect.left + autoScroll.margin; + top = pointer.clientY < rect.top + autoScroll.margin; + right = pointer.clientX > rect.right - autoScroll.margin; + bottom = pointer.clientY > rect.bottom - autoScroll.margin; + } + + autoScroll.x = right ? 1 : left ? -1 : 0; + autoScroll.y = bottom ? 1 : top ? -1 : 0; + + if (!autoScroll.isScrolling) { + // set the autoScroll properties to those of the target + autoScroll.margin = options.margin; + autoScroll.speed = options.speed; + autoScroll.start(interaction); + } + } +}; + +function getContainer(value, interactable, element) { + return (__is_7.string(value) ? (0, _$rect_65.getStringOptionResult)(value, interactable, element) : value) || (0, _$window_68.getWindow)(element); +} + +function getScroll(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollLeft, + y: container.scrollTop + }; +} + +function getScrollSize(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollWidth, + y: container.scrollHeight + }; +} + +function getScrollSizeDelta(_ref2, func) { + var interaction = _ref2.interaction, + element = _ref2.element; + var scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll; + + if (!scrollOptions || !scrollOptions.enabled) { + func(); + return { + x: 0, + y: 0 + }; + } + + var scrollContainer = getContainer(scrollOptions.container, interaction.interactable, element); + var prevSize = getScroll(scrollContainer); + func(); + var curSize = getScroll(scrollContainer); + return { + x: curSize.x - prevSize.x, + y: curSize.y - prevSize.y + }; +} + +var autoScrollPlugin = { + id: 'auto-scroll', + install: __install_7, + listeners: { + 'interactions:new': function interactionsNew(_ref3) { + var interaction = _ref3.interaction; + interaction.autoScroll = null; + }, + 'interactions:destroy': function interactionsDestroy(_ref4) { + var interaction = _ref4.interaction; + interaction.autoScroll = null; + autoScroll.stop(); + + if (autoScroll.interaction) { + autoScroll.interaction = null; + } + }, + 'interactions:stop': autoScroll.stop, + 'interactions:action-move': function interactionsActionMove(arg) { + return autoScroll.onInteractionMove(arg); + } + } +}; +var ___default_7 = autoScrollPlugin; +_$index_7["default"] = ___default_7; + +var _$InteractableMethods_8 = {}; +"use strict"; + +function ___typeof_8(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_8 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_8 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_8(obj); } + +Object.defineProperty(_$InteractableMethods_8, "__esModule", { + value: true +}); +_$InteractableMethods_8["default"] = void 0; + +/* removed: var _$index_58 = require("@interactjs/utils/index"); */; + +var __is_8 = ___interopRequireWildcard_8(_$is_59); + +function ___getRequireWildcardCache_8() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_8 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_8(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_8(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_8(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_8(scope) { + var Interactable = scope.Interactable; + + Interactable.prototype.getAction = function getAction(pointer, event, interaction, element) { + var action = defaultActionChecker(this, event, interaction, element, scope); + + if (this.options.actionChecker) { + return this.options.actionChecker(pointer, event, action, this, element, interaction); + } + + return action; + }; + /** + * ```js + * interact(element, { ignoreFrom: document.getElementById('no-action') }) + * // or + * interact(element).ignoreFrom('input, textarea, a') + * ``` + * @deprecated + * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any + * of it's parents match the given CSS selector or Element, no + * drag/resize/gesture is started. + * + * Don't use this method. Instead set the `ignoreFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .draggable({ + * ignoreFrom: 'input, textarea, a[href]'', + * }) + * .pointerEvents({ + * ignoreFrom: '[no-pointer]', + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to not ignore any elements + * @return {string | Element | object} The current ignoreFrom value or this + * Interactable + */ + + + Interactable.prototype.ignoreFrom = (0, _$index_58.warnOnce)(function (newValue) { + return this._backCompatOption('ignoreFrom', newValue); + }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).'); + /** + * @deprecated + * + * A drag/resize/gesture is started only If the target of the `mousedown`, + * `pointerdown` or `touchstart` event or any of it's parents match the given + * CSS selector or Element. + * + * Don't use this method. Instead set the `allowFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .resizable({ + * allowFrom: '.resize-handle', + * .pointerEvents({ + * allowFrom: '.handle',, + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to allow from any element + * @return {string | Element | object} The current allowFrom value or this + * Interactable + */ + + Interactable.prototype.allowFrom = (0, _$index_58.warnOnce)(function (newValue) { + return this._backCompatOption('allowFrom', newValue); + }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).'); + /** + * ```js + * interact('.resize-drag') + * .resizable(true) + * .draggable(true) + * .actionChecker(function (pointer, event, action, interactable, element, interaction) { + * + * if (interact.matchesSelector(event.target, '.drag-handle')) { + * // force drag with handle target + * action.name = drag + * } + * else { + * // resize from the top and right edges + * action.name = 'resize' + * action.edges = { top: true, right: true } + * } + * + * return action + * }) + * ``` + * + * Returns or sets the function used to check action to be performed on + * pointerDown + * + * @param {function | null} [checker] A function which takes a pointer event, + * defaultAction string, interactable, element and interaction as parameters + * and returns an object with name property 'drag' 'resize' or 'gesture' and + * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right + * props. + * @return {Function | Interactable} The checker function or this Interactable + */ + + Interactable.prototype.actionChecker = actionChecker; + /** + * Returns or sets whether the the cursor should be changed depending on the + * action that would be performed if the mouse were pressed and dragged. + * + * @param {boolean} [newValue] + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.styleCursor = styleCursor; +} + +function defaultActionChecker(interactable, event, interaction, element, scope) { + var rect = interactable.getRect(element); + var buttons = event.buttons || { + 0: 1, + 1: 4, + 3: 8, + 4: 16 + }[event.button]; + var arg = { + action: null, + interactable: interactable, + interaction: interaction, + element: element, + rect: rect, + buttons: buttons + }; + scope.fire('auto-start:check', arg); + return arg.action; +} + +function styleCursor(newValue) { + if (__is_8.bool(newValue)) { + this.options.styleCursor = newValue; + return this; + } + + if (newValue === null) { + delete this.options.styleCursor; + return this; + } + + return this.options.styleCursor; +} + +function actionChecker(checker) { + if (__is_8.func(checker)) { + this.options.actionChecker = checker; + return this; + } + + if (checker === null) { + delete this.options.actionChecker; + return this; + } + + return this.options.actionChecker; +} + +var ___default_8 = { + id: 'auto-start/interactableMethods', + install: __install_8 +}; +_$InteractableMethods_8["default"] = ___default_8; + +var _$base_9 = {}; +"use strict"; + +function ___typeof_9(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_9 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_9 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_9(obj); } + +Object.defineProperty(_$base_9, "__esModule", { + value: true +}); +_$base_9["default"] = void 0; + +var __utils_9 = ___interopRequireWildcard_9(_$index_58); + +var _InteractableMethods = ___interopRequireDefault_9(_$InteractableMethods_8); + +function ___interopRequireDefault_9(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_9() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_9 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_9(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_9(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_9(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_9(scope) { + var interact = scope.interact, + defaults = scope.defaults; + scope.usePlugin(_InteractableMethods["default"]); + defaults.base.actionChecker = null; + defaults.base.styleCursor = true; + __utils_9.extend(defaults.perAction, { + manualStart: false, + max: Infinity, + maxPerElement: 1, + allowFrom: null, + ignoreFrom: null, + // only allow left button by default + // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value + mouseButtons: 1 + }); + /** + * Returns or sets the maximum number of concurrent interactions allowed. By + * default only 1 interaction is allowed at a time (for backwards + * compatibility). To allow multiple interactions on the same Interactables and + * elements, you need to enable it in the draggable, resizable and gesturable + * `'max'` and `'maxPerElement'` options. + * + * @alias module:interact.maxInteractions + * + * @param {number} [newValue] Any number. newValue <= 0 means no interactions. + */ + + interact.maxInteractions = function (newValue) { + return maxInteractions(newValue, scope); + }; + + scope.autoStart = { + // Allow this many interactions to happen simultaneously + maxInteractions: Infinity, + withinInteractionLimit: withinInteractionLimit, + cursorElement: null + }; +} + +function prepareOnDown(_ref, scope) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; + + if (interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function prepareOnMove(_ref2, scope) { + var interaction = _ref2.interaction, + pointer = _ref2.pointer, + event = _ref2.event, + eventTarget = _ref2.eventTarget; + + if (interaction.pointerType !== 'mouse' || interaction.pointerIsDown || interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function startOnMove(arg, scope) { + var interaction = arg.interaction; + + if (!interaction.pointerIsDown || interaction.interacting() || !interaction.pointerWasMoved || !interaction.prepared.name) { + return; + } + + scope.fire('autoStart:before-start', arg); + var interactable = interaction.interactable; + var actionName = interaction.prepared.name; + + if (actionName && interactable) { + // check manualStart and interaction limit + if (interactable.options[actionName].manualStart || !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) { + interaction.stop(); + } else { + interaction.start(interaction.prepared, interactable, interaction.element); + setInteractionCursor(interaction, scope); + } + } +} + +function clearCursorOnStop(_ref3, scope) { + var interaction = _ref3.interaction; + var interactable = interaction.interactable; + + if (interactable && interactable.options.styleCursor) { + setCursor(interaction.element, '', scope); + } +} // Check if the current interactable supports the action. +// If so, return the validated action. Otherwise, return null + + +function validateAction(action, interactable, element, eventTarget, scope) { + if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) && interactable.options[action.name].enabled && withinInteractionLimit(interactable, element, action, scope)) { + return action; + } + + return null; +} + +function validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope) { + for (var i = 0, len = matches.length; i < len; i++) { + var match = matches[i]; + var matchElement = matchElements[i]; + var matchAction = match.getAction(pointer, event, interaction, matchElement); + + if (!matchAction) { + continue; + } + + var action = validateAction(matchAction, match, matchElement, eventTarget, scope); + + if (action) { + return { + action: action, + interactable: match, + element: matchElement + }; + } + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function getActionInfo(interaction, pointer, event, eventTarget, scope) { + var matches = []; + var matchElements = []; + var element = eventTarget; + + function pushMatches(interactable) { + matches.push(interactable); + matchElements.push(element); + } + + while (__utils_9.is.element(element)) { + matches = []; + matchElements = []; + scope.interactables.forEachMatch(element, pushMatches); + var actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope); + + if (actionInfo.action && !actionInfo.interactable.options[actionInfo.action.name].manualStart) { + return actionInfo; + } + + element = __utils_9.dom.parentNode(element); + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function prepare(interaction, _ref4, scope) { + var action = _ref4.action, + interactable = _ref4.interactable, + element = _ref4.element; + action = action || { + name: null + }; + interaction.interactable = interactable; + interaction.element = element; + __utils_9.copyAction(interaction.prepared, action); + interaction.rect = interactable && action.name ? interactable.getRect(element) : null; + setInteractionCursor(interaction, scope); + scope.fire('autoStart:prepared', { + interaction: interaction + }); +} + +function withinInteractionLimit(interactable, element, action, scope) { + var options = interactable.options; + var maxActions = options[action.name].max; + var maxPerElement = options[action.name].maxPerElement; + var autoStartMax = scope.autoStart.maxInteractions; + var activeInteractions = 0; + var interactableCount = 0; + var elementCount = 0; // no actions if any of these values == 0 + + if (!(maxActions && maxPerElement && autoStartMax)) { + return false; + } + + for (var _i = 0; _i < scope.interactions.list.length; _i++) { + var _ref5; + + _ref5 = scope.interactions.list[_i]; + var interaction = _ref5; + var otherAction = interaction.prepared.name; + + if (!interaction.interacting()) { + continue; + } + + activeInteractions++; + + if (activeInteractions >= autoStartMax) { + return false; + } + + if (interaction.interactable !== interactable) { + continue; + } + + interactableCount += otherAction === action.name ? 1 : 0; + + if (interactableCount >= maxActions) { + return false; + } + + if (interaction.element === element) { + elementCount++; + + if (otherAction === action.name && elementCount >= maxPerElement) { + return false; + } + } + } + + return autoStartMax > 0; +} + +function maxInteractions(newValue, scope) { + if (__utils_9.is.number(newValue)) { + scope.autoStart.maxInteractions = newValue; + return this; + } + + return scope.autoStart.maxInteractions; +} + +function setCursor(element, cursor, scope) { + var prevCursorElement = scope.autoStart.cursorElement; + + if (prevCursorElement && prevCursorElement !== element) { + prevCursorElement.style.cursor = ''; + } + + element.ownerDocument.documentElement.style.cursor = cursor; + element.style.cursor = cursor; + scope.autoStart.cursorElement = cursor ? element : null; +} + +function setInteractionCursor(interaction, scope) { + var interactable = interaction.interactable, + element = interaction.element, + prepared = interaction.prepared; + + if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) { + // clear previous target element cursor + if (scope.autoStart.cursorElement) { + setCursor(scope.autoStart.cursorElement, '', scope); + } + + return; + } + + var cursor = ''; + + if (prepared.name) { + var cursorChecker = interactable.options[prepared.name].cursorChecker; + + if (__utils_9.is.func(cursorChecker)) { + cursor = cursorChecker(prepared, interactable, element, interaction._interacting); + } else { + cursor = scope.actions.map[prepared.name].getCursor(prepared); + } + } + + setCursor(interaction.element, cursor || '', scope); +} + +var autoStart = { + id: 'auto-start/base', + before: ['actions', 'actions/drag', 'actions/resize', 'actions/gesture'], + install: __install_9, + listeners: { + 'interactions:down': prepareOnDown, + 'interactions:move': function interactionsMove(arg, scope) { + prepareOnMove(arg, scope); + startOnMove(arg, scope); + }, + 'interactions:stop': clearCursorOnStop + }, + maxInteractions: maxInteractions, + withinInteractionLimit: withinInteractionLimit, + validateAction: validateAction +}; +var ___default_9 = autoStart; +_$base_9["default"] = ___default_9; + +var _$dragAxis_10 = {}; +"use strict"; + +function ___typeof_10(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_10 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_10 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_10(obj); } + +Object.defineProperty(_$dragAxis_10, "__esModule", { + value: true +}); +_$dragAxis_10["default"] = void 0; + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var __is_10 = ___interopRequireWildcard_10(_$is_59); + +var _base = ___interopRequireDefault_10(_$base_9); + +function ___interopRequireDefault_10(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_10() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_10 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_10(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_10(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_10(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function beforeStart(_ref, scope) { + var interaction = _ref.interaction, + eventTarget = _ref.eventTarget, + dx = _ref.dx, + dy = _ref.dy; + + if (interaction.prepared.name !== 'drag') { + return; + } // check if a drag is in the correct axis + + + var absX = Math.abs(dx); + var absY = Math.abs(dy); + var targetOptions = interaction.interactable.options.drag; + var startAxis = targetOptions.startAxis; + var currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy'; + interaction.prepared.axis = targetOptions.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy' + : targetOptions.lockAxis; // if the movement isn't in the startAxis of the interactable + + if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) { + // cancel the prepared action + interaction.prepared.name = null; // then try to get a drag from another ineractable + + var element = eventTarget; + + var getDraggable = function getDraggable(interactable) { + if (interactable === interaction.interactable) { + return; + } + + var options = interaction.interactable.options.drag; + + if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) { + var action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element); + + if (action && action.name === 'drag' && checkStartAxis(currentAxis, interactable) && _base["default"].validateAction(action, interactable, element, eventTarget, scope)) { + return interactable; + } + } + }; // check all interactables + + + while (__is_10.element(element)) { + var interactable = scope.interactables.forEachMatch(element, getDraggable); + + if (interactable) { + interaction.prepared.name = 'drag'; + interaction.interactable = interactable; + interaction.element = element; + break; + } + + element = (0, _$domUtils_53.parentNode)(element); + } + } +} + +function checkStartAxis(startAxis, interactable) { + if (!interactable) { + return false; + } + + var thisAxis = interactable.options.drag.startAxis; + return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis; +} + +var ___default_10 = { + id: 'auto-start/dragAxis', + listeners: { + 'autoStart:before-start': beforeStart + } +}; +_$dragAxis_10["default"] = ___default_10; + +var _$hold_11 = {}; +"use strict"; + +Object.defineProperty(_$hold_11, "__esModule", { + value: true +}); +_$hold_11["default"] = void 0; + +var ___base_11 = ___interopRequireDefault_11(_$base_9); + +function ___interopRequireDefault_11(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_11(scope) { + var defaults = scope.defaults; + scope.usePlugin(___base_11["default"]); + defaults.perAction.hold = 0; + defaults.perAction.delay = 0; +} + +function getHoldDuration(interaction) { + var actionName = interaction.prepared && interaction.prepared.name; + + if (!actionName) { + return null; + } + + var options = interaction.interactable.options; + return options[actionName].hold || options[actionName].delay; +} + +var ___default_11 = { + id: 'auto-start/hold', + install: __install_11, + listeners: { + 'interactions:new': function interactionsNew(_ref) { + var interaction = _ref.interaction; + interaction.autoStartHoldTimer = null; + }, + 'autoStart:prepared': function autoStartPrepared(_ref2) { + var interaction = _ref2.interaction; + var hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.autoStartHoldTimer = setTimeout(function () { + interaction.start(interaction.prepared, interaction.interactable, interaction.element); + }, hold); + } + }, + 'interactions:move': function interactionsMove(_ref3) { + var interaction = _ref3.interaction, + duplicate = _ref3.duplicate; + + if (interaction.pointerWasMoved && !duplicate) { + clearTimeout(interaction.autoStartHoldTimer); + } + }, + // prevent regular down->move autoStart + 'autoStart:before-start': function autoStartBeforeStart(_ref4) { + var interaction = _ref4.interaction; + var hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.prepared.name = null; + } + } + }, + getHoldDuration: getHoldDuration +}; +_$hold_11["default"] = ___default_11; + +var _$index_12 = {}; +"use strict"; + +Object.defineProperty(_$index_12, "__esModule", { + value: true +}); +Object.defineProperty(_$index_12, "autoStart", { + enumerable: true, + get: function get() { + return ___base_12["default"]; + } +}); +Object.defineProperty(_$index_12, "dragAxis", { + enumerable: true, + get: function get() { + return _dragAxis["default"]; + } +}); +Object.defineProperty(_$index_12, "hold", { + enumerable: true, + get: function get() { + return _hold["default"]; + } +}); +_$index_12["default"] = void 0; + +var ___base_12 = ___interopRequireDefault_12(_$base_9); + +var _dragAxis = ___interopRequireDefault_12(_$dragAxis_10); + +var _hold = ___interopRequireDefault_12(_$hold_11); + +function ___interopRequireDefault_12(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var ___default_12 = { + id: 'auto-start', + install: function install(scope) { + scope.usePlugin(___base_12["default"]); + scope.usePlugin(_hold["default"]); + scope.usePlugin(_dragAxis["default"]); + } +}; +_$index_12["default"] = ___default_12; + +var _$index_25 = {}; +"use strict"; + +function ___typeof_25(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_25 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_25 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_25(obj); } + +Object.defineProperty(_$index_25, "__esModule", { + value: true +}); +_$index_25["default"] = void 0; + +var ___domObjects_25 = ___interopRequireDefault_25(_$domObjects_52); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var ___extend_25 = ___interopRequireDefault_25(_$extend_55); + +var __is_25 = ___interopRequireWildcard_25(_$is_59); + +var ___window_25 = ___interopRequireDefault_25(_$window_68); + +function ___getRequireWildcardCache_25() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_25 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_25(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_25(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_25(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_25(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___toConsumableArray_25(arr) { return ___arrayWithoutHoles_25(arr) || ___iterableToArray_25(arr) || ___nonIterableSpread_25(); } + +function ___nonIterableSpread_25() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function ___iterableToArray_25(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function ___arrayWithoutHoles_25(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +var CheckName; + +(function (CheckName) { + CheckName["touchAction"] = "touchAction"; + CheckName["boxSizing"] = "boxSizing"; + CheckName["noListeners"] = "noListeners"; +})(CheckName || (CheckName = {})); + +var prefix = '[interact.js] '; +var links = { + touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action', + boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing' +}; +var isProduction = "production" === 'production'; // eslint-disable-next-line no-restricted-syntax + +function __install_25(scope) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + logger = _ref.logger; + + var Interactable = scope.Interactable, + defaults = scope.defaults; + scope.logger = logger || console; + defaults.base.devTools = { + ignore: {} + }; + + Interactable.prototype.devTools = function (options) { + if (options) { + (0, ___extend_25["default"])(this.options.devTools, options); + return this; + } + + return this.options.devTools; + }; +} + +var checks = [{ + name: CheckName.touchAction, + perform: function perform(_ref2) { + var element = _ref2.element; + return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/); + }, + getInfo: function getInfo(_ref3) { + var element = _ref3.element; + return [element, links.touchAction]; + }, + text: 'Consider adding CSS "touch-action: none" to this element\n' +}, { + name: CheckName.boxSizing, + perform: function perform(interaction) { + var element = interaction.element; + return interaction.prepared.name === 'resize' && element instanceof ___domObjects_25["default"].HTMLElement && !hasStyle(element, 'boxSizing', /border-box/); + }, + text: 'Consider adding CSS "box-sizing: border-box" to this resizable element', + getInfo: function getInfo(_ref4) { + var element = _ref4.element; + return [element, links.boxSizing]; + } +}, { + name: CheckName.noListeners, + perform: function perform(interaction) { + var actionName = interaction.prepared.name; + var moveListeners = interaction.interactable.events.types["".concat(actionName, "move")] || []; + return !moveListeners.length; + }, + getInfo: function getInfo(interaction) { + return [interaction.prepared.name, interaction.interactable]; + }, + text: 'There are no listeners set for this action' +}]; + +function hasStyle(element, prop, styleRe) { + return styleRe.test(element.style[prop] || ___window_25["default"].window.getComputedStyle(element)[prop]); +} + +function parentHasStyle(element, prop, styleRe) { + var parent = element; + + while (__is_25.element(parent)) { + if (hasStyle(parent, prop, styleRe)) { + return true; + } + + parent = (0, _$domUtils_53.parentNode)(parent); + } + + return false; +} + +var id = 'dev-tools'; +var defaultExport = isProduction ? { + id: id, + install: function install() {} +} : { + id: id, + install: __install_25, + listeners: { + 'interactions:action-start': function interactionsActionStart(_ref5, scope) { + var interaction = _ref5.interaction; + + for (var _i = 0; _i < checks.length; _i++) { + var _ref6; + + _ref6 = checks[_i]; + var check = _ref6; + var options = interaction.interactable && interaction.interactable.options; + + if (!(options && options.devTools && options.devTools.ignore[check.name]) && check.perform(interaction)) { + var _scope$logger; + + (_scope$logger = scope.logger).warn.apply(_scope$logger, [prefix + check.text].concat(___toConsumableArray_25(check.getInfo(interaction)))); + } + } + } + }, + checks: checks, + CheckName: CheckName, + links: links, + prefix: prefix +}; +var ___default_25 = defaultExport; +_$index_25["default"] = ___default_25; + +var _$Modification_29 = {}; +"use strict"; + +function ___typeof_29(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_29 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_29 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_29(obj); } + +Object.defineProperty(_$Modification_29, "__esModule", { + value: true +}); +_$Modification_29.getRectOffset = getRectOffset; +_$Modification_29["default"] = void 0; + +var ___clone_29 = ___interopRequireDefault_29(_$clone_51); + +var ___extend_29 = ___interopRequireDefault_29(_$extend_55); + +var rectUtils = ___interopRequireWildcard_29(_$rect_65); + +function ___getRequireWildcardCache_29() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_29 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_29(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_29(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_29(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_29(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_29(arr, i) { return ___arrayWithHoles_29(arr) || ___iterableToArrayLimit_29(arr, i) || ___nonIterableRest_29(); } + +function ___nonIterableRest_29() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_29(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_29(arr) { if (Array.isArray(arr)) return arr; } + +function ___classCallCheck_29(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_29(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_29(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_29(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_29(Constructor, staticProps); return Constructor; } + +function ___defineProperty_29(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Modification = /*#__PURE__*/function () { + function Modification(interaction) { + ___classCallCheck_29(this, Modification); + + this.interaction = interaction; + + ___defineProperty_29(this, "states", []); + + ___defineProperty_29(this, "startOffset", { + left: 0, + right: 0, + top: 0, + bottom: 0 + }); + + ___defineProperty_29(this, "startDelta", null); + + ___defineProperty_29(this, "result", null); + + ___defineProperty_29(this, "endResult", null); + + ___defineProperty_29(this, "edges", void 0); + + this.result = createResult(); + } + + ___createClass_29(Modification, [{ + key: "start", + value: function start(_ref, pageCoords) { + var phase = _ref.phase; + var interaction = this.interaction; + var modifierList = getModifierList(interaction); + this.prepareStates(modifierList); + this.edges = (0, ___extend_29["default"])({}, interaction.edges); + this.startOffset = getRectOffset(interaction.rect, pageCoords); + this.startDelta = { + x: 0, + y: 0 + }; + var arg = { + phase: phase, + pageCoords: pageCoords, + preEnd: false + }; + this.result = createResult(); + this.startAll(arg); + var result = this.result = this.setAll(arg); + return result; + } + }, { + key: "fillArg", + value: function fillArg(arg) { + var interaction = this.interaction; + arg.interaction = interaction; + arg.interactable = interaction.interactable; + arg.element = interaction.element; + arg.rect = arg.rect || interaction.rect; + arg.edges = this.edges; + arg.startOffset = this.startOffset; + } + }, { + key: "startAll", + value: function startAll(arg) { + this.fillArg(arg); + + for (var _i = 0; _i < this.states.length; _i++) { + var _ref2; + + _ref2 = this.states[_i]; + var state = _ref2; + + if (state.methods.start) { + arg.state = state; + state.methods.start(arg); + } + } + } + }, { + key: "setAll", + value: function setAll(arg) { + this.fillArg(arg); + var phase = arg.phase, + preEnd = arg.preEnd, + skipModifiers = arg.skipModifiers, + unmodifiedRect = arg.rect; + arg.coords = (0, ___extend_29["default"])({}, arg.pageCoords); + arg.rect = (0, ___extend_29["default"])({}, unmodifiedRect); + var states = skipModifiers ? this.states.slice(skipModifiers) : this.states; + var newResult = createResult(arg.coords, arg.rect); + + for (var _i2 = 0; _i2 < states.length; _i2++) { + var _ref3; + + _ref3 = states[_i2]; + var state = _ref3; + var options = state.options; + var lastModifierCoords = (0, ___extend_29["default"])({}, arg.coords); + var returnValue = null; + + if (state.methods.set && this.shouldDo(options, preEnd, phase)) { + arg.state = state; + returnValue = state.methods.set(arg); + rectUtils.addEdges(this.interaction.edges, arg.rect, { + x: arg.coords.x - lastModifierCoords.x, + y: arg.coords.y - lastModifierCoords.y + }); + } + + newResult.eventProps.push(returnValue); + } + + newResult.delta.x = arg.coords.x - arg.pageCoords.x; + newResult.delta.y = arg.coords.y - arg.pageCoords.y; + newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left; + newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right; + newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top; + newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom; + var prevCoords = this.result.coords; + var prevRect = this.result.rect; + + if (prevCoords && prevRect) { + var rectChanged = newResult.rect.left !== prevRect.left || newResult.rect.right !== prevRect.right || newResult.rect.top !== prevRect.top || newResult.rect.bottom !== prevRect.bottom; + newResult.changed = rectChanged || prevCoords.x !== newResult.coords.x || prevCoords.y !== newResult.coords.y; + } + + return newResult; + } + }, { + key: "applyToInteraction", + value: function applyToInteraction(arg) { + var interaction = this.interaction; + var phase = arg.phase; + var curCoords = interaction.coords.cur; + var startCoords = interaction.coords.start; + var result = this.result, + startDelta = this.startDelta; + var curDelta = result.delta; + + if (phase === 'start') { + (0, ___extend_29["default"])(this.startDelta, result.delta); + } + + for (var _i3 = 0; _i3 < [[startCoords, startDelta], [curCoords, curDelta]].length; _i3++) { + var _ref4; + + _ref4 = [[startCoords, startDelta], [curCoords, curDelta]][_i3]; + + var _ref5 = _ref4, + _ref6 = ___slicedToArray_29(_ref5, 2), + coordsSet = _ref6[0], + delta = _ref6[1]; + + coordsSet.page.x += delta.x; + coordsSet.page.y += delta.y; + coordsSet.client.x += delta.x; + coordsSet.client.y += delta.y; + } + + var rectDelta = this.result.rectDelta; + var rect = arg.rect || interaction.rect; + rect.left += rectDelta.left; + rect.right += rectDelta.right; + rect.top += rectDelta.top; + rect.bottom += rectDelta.bottom; + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + }, { + key: "setAndApply", + value: function setAndApply(arg) { + var interaction = this.interaction; + var phase = arg.phase, + preEnd = arg.preEnd, + skipModifiers = arg.skipModifiers; + var result = this.setAll({ + preEnd: preEnd, + phase: phase, + pageCoords: arg.modifiedCoords || interaction.coords.cur.page + }); + this.result = result; // don't fire an action move if a modifier would keep the event in the same + // cordinates as before + + if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) { + return false; + } + + if (arg.modifiedCoords) { + var page = interaction.coords.cur.page; + var adjustment = { + x: arg.modifiedCoords.x - page.x, + y: arg.modifiedCoords.y - page.y + }; + result.coords.x += adjustment.x; + result.coords.y += adjustment.y; + result.delta.x += adjustment.x; + result.delta.y += adjustment.y; + } + + this.applyToInteraction(arg); + } + }, { + key: "beforeEnd", + value: function beforeEnd(arg) { + var interaction = arg.interaction, + event = arg.event; + var states = this.states; + + if (!states || !states.length) { + return; + } + + var doPreend = false; + + for (var _i4 = 0; _i4 < states.length; _i4++) { + var _ref7; + + _ref7 = states[_i4]; + var state = _ref7; + arg.state = state; + var options = state.options, + methods = state.methods; + var endPosition = methods.beforeEnd && methods.beforeEnd(arg); + + if (endPosition) { + this.endResult = endPosition; + return false; + } + + doPreend = doPreend || !doPreend && this.shouldDo(options, true, arg.phase, true); + } + + if (doPreend) { + // trigger a final modified move before ending + interaction.move({ + event: event, + preEnd: true + }); + } + } + }, { + key: "stop", + value: function stop(arg) { + var interaction = arg.interaction; + + if (!this.states || !this.states.length) { + return; + } + + var modifierArg = (0, ___extend_29["default"])({ + states: this.states, + interactable: interaction.interactable, + element: interaction.element, + rect: null + }, arg); + this.fillArg(modifierArg); + + for (var _i5 = 0; _i5 < this.states.length; _i5++) { + var _ref8; + + _ref8 = this.states[_i5]; + var state = _ref8; + modifierArg.state = state; + + if (state.methods.stop) { + state.methods.stop(modifierArg); + } + } + + this.states = null; + this.endResult = null; + } + }, { + key: "prepareStates", + value: function prepareStates(modifierList) { + this.states = []; + + for (var index = 0; index < modifierList.length; index++) { + var _modifierList$index = modifierList[index], + options = _modifierList$index.options, + methods = _modifierList$index.methods, + name = _modifierList$index.name; + + if (options && options.enabled === false) { + continue; + } + + this.states.push({ + options: options, + methods: methods, + index: index, + name: name + }); + } + + return this.states; + } + }, { + key: "restoreInteractionCoords", + value: function restoreInteractionCoords(_ref9) { + var _ref9$interaction = _ref9.interaction, + coords = _ref9$interaction.coords, + rect = _ref9$interaction.rect, + modification = _ref9$interaction.modification; + + if (!modification.result) { + return; + } + + var startDelta = modification.startDelta; + var _modification$result = modification.result, + curDelta = _modification$result.delta, + rectDelta = _modification$result.rectDelta; + var coordsAndDeltas = [[coords.start, startDelta], [coords.cur, curDelta]]; + + for (var _i6 = 0; _i6 < coordsAndDeltas.length; _i6++) { + var _ref10; + + _ref10 = coordsAndDeltas[_i6]; + + var _ref11 = _ref10, + _ref12 = ___slicedToArray_29(_ref11, 2), + coordsSet = _ref12[0], + delta = _ref12[1]; + + coordsSet.page.x -= delta.x; + coordsSet.page.y -= delta.y; + coordsSet.client.x -= delta.x; + coordsSet.client.y -= delta.y; + } + + rect.left -= rectDelta.left; + rect.right -= rectDelta.right; + rect.top -= rectDelta.top; + rect.bottom -= rectDelta.bottom; + } + }, { + key: "shouldDo", + value: function shouldDo(options, preEnd, phase, requireEndOnly) { + if ( // ignore disabled modifiers + !options || options.enabled === false || // check if we require endOnly option to fire move before end + requireEndOnly && !options.endOnly || // don't apply endOnly modifiers when not ending + options.endOnly && !preEnd || // check if modifier should run be applied on start + phase === 'start' && !options.setStart) { + return false; + } + + return true; + } + }, { + key: "copyFrom", + value: function copyFrom(other) { + this.startOffset = other.startOffset; + this.startDelta = other.startDelta; + this.edges = other.edges; + this.states = other.states.map(function (s) { + return (0, ___clone_29["default"])(s); + }); + this.result = createResult((0, ___extend_29["default"])({}, other.result.coords), (0, ___extend_29["default"])({}, other.result.rect)); + } + }, { + key: "destroy", + value: function destroy() { + for (var prop in this) { + this[prop] = null; + } + } + }]); + + return Modification; +}(); + +_$Modification_29["default"] = Modification; + +function createResult(coords, rect) { + return { + rect: rect, + coords: coords, + delta: { + x: 0, + y: 0 + }, + rectDelta: { + left: 0, + right: 0, + top: 0, + bottom: 0 + }, + eventProps: [], + changed: true + }; +} + +function getModifierList(interaction) { + var actionOptions = interaction.interactable.options[interaction.prepared.name]; + var actionModifiers = actionOptions.modifiers; + + if (actionModifiers && actionModifiers.length) { + return actionModifiers.filter(function (modifier) { + return !modifier.options || modifier.options.enabled !== false; + }); + } + + return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize'].map(function (type) { + var options = actionOptions[type]; + return options && options.enabled && { + options: options, + methods: options._methods + }; + }).filter(function (m) { + return !!m; + }); +} + +function getRectOffset(rect, coords) { + return rect ? { + left: coords.x - rect.left, + top: coords.y - rect.top, + right: rect.right - coords.x, + bottom: rect.bottom - coords.y + } : { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; +} + +var _$base_32 = {}; +"use strict"; + +Object.defineProperty(_$base_32, "__esModule", { + value: true +}); +_$base_32.makeModifier = makeModifier; +_$base_32.addEventModifiers = addEventModifiers; +_$base_32["default"] = void 0; + +var _Modification = ___interopRequireDefault_32(_$Modification_29); + +function ___interopRequireDefault_32(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function makeModifier(module, name) { + var defaults = module.defaults; + var methods = { + start: module.start, + set: module.set, + beforeEnd: module.beforeEnd, + stop: module.stop + }; + + var modifier = function modifier(_options) { + var options = _options || {}; + options.enabled = options.enabled !== false; // add missing defaults to options + + for (var _prop in defaults) { + if (!(_prop in options)) { + options[_prop] = defaults[_prop]; + } + } + + var m = { + options: options, + methods: methods, + name: name + }; + return m; + }; + + if (name && typeof name === 'string') { + // for backwrads compatibility + modifier._defaults = defaults; + modifier._methods = methods; + } + + return modifier; +} + +function addEventModifiers(_ref) { + var iEvent = _ref.iEvent, + result = _ref.interaction.modification.result; + + if (result) { + iEvent.modifiers = result.eventProps; + } +} + +var modifiersBase = { + id: 'modifiers/base', + install: function install(scope) { + scope.defaults.perAction.modifiers = []; + }, + listeners: { + 'interactions:new': function interactionsNew(_ref2) { + var interaction = _ref2.interaction; + interaction.modification = new _Modification["default"](interaction); + }, + 'interactions:before-action-start': function interactionsBeforeActionStart(arg) { + var modification = arg.interaction.modification; + modification.start(arg, arg.interaction.coords.start.page); + arg.interaction.edges = modification.edges; + modification.applyToInteraction(arg); + }, + 'interactions:before-action-move': function interactionsBeforeActionMove(arg) { + return arg.interaction.modification.setAndApply(arg); + }, + 'interactions:before-action-end': function interactionsBeforeActionEnd(arg) { + return arg.interaction.modification.beforeEnd(arg); + }, + 'interactions:action-start': addEventModifiers, + 'interactions:action-move': addEventModifiers, + 'interactions:action-end': addEventModifiers, + 'interactions:after-action-start': function interactionsAfterActionStart(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:after-action-move': function interactionsAfterActionMove(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:stop': function interactionsStop(arg) { + return arg.interaction.modification.stop(arg); + } + }, + before: ['actions', 'action/drag', 'actions/resize', 'actions/gesture'] +}; +var ___default_32 = modifiersBase; +_$base_32["default"] = ___default_32; + +var _$index_41 = {}; +"use strict"; + +function ___typeof_41(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_41 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_41 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_41(obj); } + +Object.defineProperty(_$index_41, "__esModule", { + value: true +}); +_$index_41.addTotal = addTotal; +_$index_41.applyPending = applyPending; +_$index_41["default"] = void 0; + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +var __rectUtils_41 = ___interopRequireWildcard_41(_$rect_65); + +function ___getRequireWildcardCache_41() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_41 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_41(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_41(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_41(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +_$Interaction_18._ProxyMethods.offsetBy = ''; + +function addTotal(interaction) { + if (!interaction.pointerIsDown) { + return; + } + + addToCoords(interaction.coords.cur, interaction.offset.total); + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +function beforeAction(_ref) { + var interaction = _ref.interaction; + applyPending(interaction); +} + +function beforeEnd(_ref2) { + var interaction = _ref2.interaction; + var hadPending = applyPending(interaction); + + if (!hadPending) { + return; + } + + interaction.move({ + offset: true + }); + interaction.end(); + return false; +} + +function __end_41(_ref3) { + var interaction = _ref3.interaction; + interaction.offset.total.x = 0; + interaction.offset.total.y = 0; + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +function applyPending(interaction) { + if (!hasPending(interaction)) { + return false; + } + + var pending = interaction.offset.pending; + addToCoords(interaction.coords.cur, pending); + addToCoords(interaction.coords.delta, pending); + __rectUtils_41.addEdges(interaction.edges, interaction.rect, pending); + pending.x = 0; + pending.y = 0; + return true; +} + +function offsetBy(_ref4) { + var x = _ref4.x, + y = _ref4.y; + this.offset.pending.x += x; + this.offset.pending.y += y; + this.offset.total.x += x; + this.offset.total.y += y; +} + +function addToCoords(_ref5, _ref6) { + var page = _ref5.page, + client = _ref5.client; + var x = _ref6.x, + y = _ref6.y; + page.x += x; + page.y += y; + client.x += x; + client.y += y; +} + +function hasPending(interaction) { + return !!(interaction.offset.pending.x || interaction.offset.pending.y); +} + +var offset = { + id: 'offset', + install: function install(scope) { + scope.Interaction.prototype.offsetBy = offsetBy; + }, + listeners: { + 'interactions:new': function interactionsNew(_ref7) { + var interaction = _ref7.interaction; + interaction.offset = { + total: { + x: 0, + y: 0 + }, + pending: { + x: 0, + y: 0 + } + }; + }, + 'interactions:update-pointer': function interactionsUpdatePointer(_ref8) { + var interaction = _ref8.interaction; + return addTotal(interaction); + }, + 'interactions:before-action-start': beforeAction, + 'interactions:before-action-move': beforeAction, + 'interactions:before-action-end': beforeEnd, + 'interactions:stop': __end_41 + } +}; +var ___default_41 = offset; +_$index_41["default"] = ___default_41; + +var _$index_26 = {}; +"use strict"; + +function ___typeof_26(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_26 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_26 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_26(obj); } + +Object.defineProperty(_$index_26, "__esModule", { + value: true +}); +_$index_26["default"] = _$index_26.InertiaState = void 0; + +var modifiers = ___interopRequireWildcard_26(_$base_32); + +var ___Modification_26 = ___interopRequireDefault_26(_$Modification_29); + +var ___index_26 = ___interopRequireDefault_26(_$index_41); + +var __dom_26 = ___interopRequireWildcard_26(_$domUtils_53); + +var ___hypot_26 = ___interopRequireDefault_26(_$hypot_57); + +var __is_26 = ___interopRequireWildcard_26(_$is_59); + +/* removed: var _$pointerUtils_63 = require("@interactjs/utils/pointerUtils"); */; + +var ___raf_26 = ___interopRequireDefault_26(_$raf_64); + +function ___interopRequireDefault_26(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_26() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_26 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_26(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_26(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_26(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_26(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_26(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_26(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_26(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_26(Constructor, staticProps); return Constructor; } + +function ___defineProperty_26(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function __install_26(scope) { + var defaults = scope.defaults; + scope.usePlugin(___index_26["default"]); + scope.usePlugin(modifiers["default"]); + scope.actions.phases.inertiastart = true; + scope.actions.phases.resume = true; + defaults.perAction.inertia = { + enabled: false, + resistance: 10, + // the lambda in exponential decay + minSpeed: 100, + // target speed must be above this for inertia to start + endSpeed: 10, + // the speed at which inertia is slow enough to stop + allowResume: true, + // allow resuming an action in inertia phase + smoothEndDuration: 300 // animate to snap/restrict endOnly if there's no inertia + + }; +} + +var InertiaState = /*#__PURE__*/function () { + // eslint-disable-line camelcase + // eslint-disable-line camelcase + function InertiaState(interaction) { + ___classCallCheck_26(this, InertiaState); + + this.interaction = interaction; + + ___defineProperty_26(this, "active", false); + + ___defineProperty_26(this, "isModified", false); + + ___defineProperty_26(this, "smoothEnd", false); + + ___defineProperty_26(this, "allowResume", false); + + ___defineProperty_26(this, "modification", null); + + ___defineProperty_26(this, "modifierCount", 0); + + ___defineProperty_26(this, "modifierArg", null); + + ___defineProperty_26(this, "startCoords", null); + + ___defineProperty_26(this, "t0", 0); + + ___defineProperty_26(this, "v0", 0); + + ___defineProperty_26(this, "te", 0); + + ___defineProperty_26(this, "targetOffset", null); + + ___defineProperty_26(this, "modifiedOffset", null); + + ___defineProperty_26(this, "currentOffset", null); + + ___defineProperty_26(this, "lambda_v0", 0); + + ___defineProperty_26(this, "one_ve_v0", 0); + + ___defineProperty_26(this, "timeout", null); + } + + ___createClass_26(InertiaState, [{ + key: "start", + value: function start(event) { + var interaction = this.interaction; + var options = __getOptions_26(interaction); + + if (!options || !options.enabled) { + return false; + } + + var velocityClient = interaction.coords.velocity.client; + var pointerSpeed = (0, ___hypot_26["default"])(velocityClient.x, velocityClient.y); + var modification = this.modification || (this.modification = new ___Modification_26["default"](interaction)); + modification.copyFrom(interaction.modification); + this.t0 = interaction._now(); + this.allowResume = options.allowResume; + this.v0 = pointerSpeed; + this.currentOffset = { + x: 0, + y: 0 + }; + this.startCoords = interaction.coords.cur.page; + this.modifierArg = { + interaction: interaction, + interactable: interaction.interactable, + element: interaction.element, + rect: interaction.rect, + edges: interaction.edges, + pageCoords: this.startCoords, + preEnd: true, + phase: 'inertiastart' + }; + var thrown = this.t0 - interaction.coords.cur.timeStamp < 50 && pointerSpeed > options.minSpeed && pointerSpeed > options.endSpeed; + + if (thrown) { + this.startInertia(); + } else { + modification.result = modification.setAll(this.modifierArg); + + if (!modification.result.changed) { + return false; + } + + this.startSmoothEnd(); + } // force modification change + + + interaction.modification.result.rect = null; // bring inertiastart event to the target coords + + interaction.offsetBy(this.targetOffset); + + interaction._doPhase({ + interaction: interaction, + event: event, + phase: 'inertiastart' + }); + + interaction.offsetBy({ + x: -this.targetOffset.x, + y: -this.targetOffset.y + }); // force modification change + + interaction.modification.result.rect = null; + this.active = true; + interaction.simulation = this; + return true; + } + }, { + key: "startInertia", + value: function startInertia() { + var _this = this; + + var startVelocity = this.interaction.coords.velocity.client; + var options = __getOptions_26(this.interaction); + var lambda = options.resistance; + var inertiaDur = -Math.log(options.endSpeed / this.v0) / lambda; + this.targetOffset = { + x: (startVelocity.x - inertiaDur) / lambda, + y: (startVelocity.y - inertiaDur) / lambda + }; + this.te = inertiaDur; + this.lambda_v0 = lambda / this.v0; + this.one_ve_v0 = 1 - options.endSpeed / this.v0; + var modification = this.modification, + modifierArg = this.modifierArg; + modifierArg.pageCoords = { + x: this.startCoords.x + this.targetOffset.x, + y: this.startCoords.y + this.targetOffset.y + }; + modification.result = modification.setAll(modifierArg); + + if (modification.result.changed) { + this.isModified = true; + this.modifiedOffset = { + x: this.targetOffset.x + modification.result.delta.x, + y: this.targetOffset.y + modification.result.delta.y + }; + } + + this.timeout = ___raf_26["default"].request(function () { + return _this.inertiaTick(); + }); + } + }, { + key: "startSmoothEnd", + value: function startSmoothEnd() { + var _this2 = this; + + this.smoothEnd = true; + this.isModified = true; + this.targetOffset = { + x: this.modification.result.delta.x, + y: this.modification.result.delta.y + }; + this.timeout = ___raf_26["default"].request(function () { + return _this2.smoothEndTick(); + }); + } + }, { + key: "inertiaTick", + value: function inertiaTick() { + var _this3 = this; + + var interaction = this.interaction; + var options = __getOptions_26(interaction); + var lambda = options.resistance; + var t = (interaction._now() - this.t0) / 1000; + + if (t < this.te) { + var progress = 1 - (Math.exp(-lambda * t) - this.lambda_v0) / this.one_ve_v0; + var newOffset; + + if (this.isModified) { + newOffset = getQuadraticCurvePoint(0, 0, this.targetOffset.x, this.targetOffset.y, this.modifiedOffset.x, this.modifiedOffset.y, progress); + } else { + newOffset = { + x: this.targetOffset.x * progress, + y: this.targetOffset.y * progress + }; + } + + var delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move(); + this.timeout = ___raf_26["default"].request(function () { + return _this3.inertiaTick(); + }); + } else { + interaction.offsetBy({ + x: this.modifiedOffset.x - this.currentOffset.x, + y: this.modifiedOffset.y - this.currentOffset.y + }); + this.end(); + } + } + }, { + key: "smoothEndTick", + value: function smoothEndTick() { + var _this4 = this; + + var interaction = this.interaction; + var t = interaction._now() - this.t0; + + var _getOptions = __getOptions_26(interaction), + duration = _getOptions.smoothEndDuration; + + if (t < duration) { + var newOffset = { + x: easeOutQuad(t, 0, this.targetOffset.x, duration), + y: easeOutQuad(t, 0, this.targetOffset.y, duration) + }; + var delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move({ + skipModifiers: this.modifierCount + }); + this.timeout = ___raf_26["default"].request(function () { + return _this4.smoothEndTick(); + }); + } else { + interaction.offsetBy({ + x: this.targetOffset.x - this.currentOffset.x, + y: this.targetOffset.y - this.currentOffset.y + }); + this.end(); + } + } + }, { + key: "resume", + value: function resume(_ref) { + var pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; + var interaction = this.interaction; // undo inertia changes to interaction coords + + interaction.offsetBy({ + x: -this.currentOffset.x, + y: -this.currentOffset.y + }); // update pointer at pointer down position + + interaction.updatePointer(pointer, event, eventTarget, true); // fire resume signals and event + + interaction._doPhase({ + interaction: interaction, + event: event, + phase: 'resume' + }); + + (0, _$pointerUtils_63.copyCoords)(interaction.coords.prev, interaction.coords.cur); + this.stop(); + } + }, { + key: "end", + value: function end() { + this.interaction.move(); + this.interaction.end(); + this.stop(); + } + }, { + key: "stop", + value: function stop() { + this.active = this.smoothEnd = false; + this.interaction.simulation = null; + + ___raf_26["default"].cancel(this.timeout); + } + }]); + + return InertiaState; +}(); + +_$index_26.InertiaState = InertiaState; + +function __start_26(_ref2) { + var interaction = _ref2.interaction, + event = _ref2.event; + + if (!interaction._interacting || interaction.simulation) { + return null; + } + + var started = interaction.inertia.start(event); // prevent action end if inertia or smoothEnd + + return started ? false : null; +} // Check if the down event hits the current inertia target +// control should be return to the user + + +function resume(arg) { + var interaction = arg.interaction, + eventTarget = arg.eventTarget; + var state = interaction.inertia; + + if (!state.active) { + return; + } + + var element = eventTarget; // climb up the DOM tree from the event target + + while (__is_26.element(element)) { + // if interaction element is the current inertia target element + if (element === interaction.element) { + state.resume(arg); + break; + } + + element = __dom_26.parentNode(element); + } +} + +function stop(_ref3) { + var interaction = _ref3.interaction; + var state = interaction.inertia; + + if (state.active) { + state.stop(); + } +} + +function __getOptions_26(_ref4) { + var interactable = _ref4.interactable, + prepared = _ref4.prepared; + return interactable && interactable.options && prepared.name && interactable.options[prepared.name].inertia; +} + +var inertia = { + id: 'inertia', + before: ['modifiers/base'], + install: __install_26, + listeners: { + 'interactions:new': function interactionsNew(_ref5) { + var interaction = _ref5.interaction; + interaction.inertia = new InertiaState(interaction); + }, + 'interactions:before-action-end': __start_26, + 'interactions:down': resume, + 'interactions:stop': stop, + 'interactions:before-action-resume': function interactionsBeforeActionResume(arg) { + var modification = arg.interaction.modification; + modification.stop(arg); + modification.start(arg, arg.interaction.coords.cur.page); + modification.applyToInteraction(arg); + }, + 'interactions:before-action-inertiastart': function interactionsBeforeActionInertiastart(arg) { + return arg.interaction.modification.setAndApply(arg); + }, + 'interactions:action-resume': modifiers.addEventModifiers, + 'interactions:action-inertiastart': modifiers.addEventModifiers, + 'interactions:after-action-inertiastart': function interactionsAfterActionInertiastart(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:after-action-resume': function interactionsAfterActionResume(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + } + } +}; // http://stackoverflow.com/a/5634528/2280888 + +function _getQBezierValue(t, p1, p2, p3) { + var iT = 1 - t; + return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3; +} + +function getQuadraticCurvePoint(startX, startY, cpX, cpY, endX, endY, position) { + return { + x: _getQBezierValue(position, startX, cpX, endX), + y: _getQBezierValue(position, startY, cpY, endY) + }; +} // http://gizma.com/easing/ + + +function easeOutQuad(t, b, c, d) { + t /= d; + return -c * t * (t - 2) + b; +} + +var ___default_26 = inertia; +_$index_26["default"] = ___default_26; + +var _$aspectRatio_31 = {}; +"use strict"; + +Object.defineProperty(_$aspectRatio_31, "__esModule", { + value: true +}); +_$aspectRatio_31.aspectRatio = _$aspectRatio_31["default"] = void 0; + +var ___extend_31 = ___interopRequireDefault_31(_$extend_55); + +/* removed: var _$rect_65 = require("@interactjs/utils/rect"); */; + +var ___Modification_31 = ___interopRequireDefault_31(_$Modification_29); + +/* removed: var _$base_32 = require("./base"); */; + +function ___interopRequireDefault_31(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { ___defineProperty_31(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function ___defineProperty_31(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var aspectRatio = { + start: function start(arg) { + var state = arg.state, + rect = arg.rect, + originalEdges = arg.edges, + coords = arg.pageCoords; + var ratio = state.options.ratio; + var _state$options = state.options, + equalDelta = _state$options.equalDelta, + modifiers = _state$options.modifiers; + + if (ratio === 'preserve') { + ratio = rect.width / rect.height; + } + + state.startCoords = (0, ___extend_31["default"])({}, coords); + state.startRect = (0, ___extend_31["default"])({}, rect); + state.ratio = ratio; + state.equalDelta = equalDelta; + var linkedEdges = state.linkedEdges = { + top: originalEdges.top || originalEdges.left && !originalEdges.bottom, + left: originalEdges.left || originalEdges.top && !originalEdges.right, + bottom: originalEdges.bottom || originalEdges.right && !originalEdges.top, + right: originalEdges.right || originalEdges.bottom && !originalEdges.left + }; + state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right); + + if (state.equalDelta) { + state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1); + } else { + var negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left; + state.edgeSign = negativeSecondaryEdge ? -1 : 1; + } + + (0, ___extend_31["default"])(arg.edges, linkedEdges); + + if (!modifiers || !modifiers.length) { + return; + } + + var subModification = new ___Modification_31["default"](arg.interaction); + subModification.copyFrom(arg.interaction.modification); + subModification.prepareStates(modifiers); + state.subModification = subModification; + subModification.startAll(_objectSpread({}, arg)); + }, + set: function set(arg) { + var state = arg.state, + rect = arg.rect, + coords = arg.coords; + var initialCoords = (0, ___extend_31["default"])({}, coords); + var aspectMethod = state.equalDelta ? setEqualDelta : setRatio; + aspectMethod(state, state.xIsPrimaryAxis, coords, rect); + + if (!state.subModification) { + return null; + } + + var correctedRect = (0, ___extend_31["default"])({}, rect); + (0, _$rect_65.addEdges)(state.linkedEdges, correctedRect, { + x: coords.x - initialCoords.x, + y: coords.y - initialCoords.y + }); + var result = state.subModification.setAll(_objectSpread({}, arg, { + rect: correctedRect, + edges: state.linkedEdges, + pageCoords: coords, + prevCoords: coords, + prevRect: correctedRect + })); + var delta = result.delta; + + if (result.changed) { + var xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y); // do aspect modification again with critical edge axis as primary + + aspectMethod(state, xIsCriticalAxis, result.coords, result.rect); + (0, ___extend_31["default"])(coords, result.coords); + } + + return result.eventProps; + }, + defaults: { + ratio: 'preserve', + equalDelta: false, + modifiers: [], + enabled: false + } +}; +_$aspectRatio_31.aspectRatio = aspectRatio; + +function setEqualDelta(_ref, xIsPrimaryAxis, coords) { + var startCoords = _ref.startCoords, + edgeSign = _ref.edgeSign; + + if (xIsPrimaryAxis) { + coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign; + } else { + coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign; + } +} + +function setRatio(_ref2, xIsPrimaryAxis, coords, rect) { + var startRect = _ref2.startRect, + startCoords = _ref2.startCoords, + ratio = _ref2.ratio, + edgeSign = _ref2.edgeSign; + + if (xIsPrimaryAxis) { + var newHeight = rect.width / ratio; + coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign; + } else { + var newWidth = rect.height * ratio; + coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign; + } +} + +var ___default_31 = (0, _$base_32.makeModifier)(aspectRatio, 'aspectRatio'); + +_$aspectRatio_31["default"] = ___default_31; + +var _$pointer_35 = {}; +"use strict"; + +function ___typeof_35(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_35 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_35 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_35(obj); } + +Object.defineProperty(_$pointer_35, "__esModule", { + value: true +}); +_$pointer_35.getRestrictionRect = getRestrictionRect; +_$pointer_35.restrict = _$pointer_35["default"] = void 0; + +var ___extend_35 = ___interopRequireDefault_35(_$extend_55); + +var __is_35 = ___interopRequireWildcard_35(_$is_59); + +var __rectUtils_35 = ___interopRequireWildcard_35(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +function ___getRequireWildcardCache_35() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_35 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_35(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_35(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_35(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_35(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __start_35(_ref) { + var rect = _ref.rect, + startOffset = _ref.startOffset, + state = _ref.state, + interaction = _ref.interaction, + pageCoords = _ref.pageCoords; + var options = state.options; + var elementRect = options.elementRect; + var offset = (0, ___extend_35["default"])({ + left: 0, + top: 0, + right: 0, + bottom: 0 + }, options.offset || {}); + + if (rect && elementRect) { + var restriction = getRestrictionRect(options.restriction, interaction, pageCoords); + + if (restriction) { + var widthDiff = restriction.right - restriction.left - rect.width; + var heightDiff = restriction.bottom - restriction.top - rect.height; + + if (widthDiff < 0) { + offset.left += widthDiff; + offset.right += widthDiff; + } + + if (heightDiff < 0) { + offset.top += heightDiff; + offset.bottom += heightDiff; + } + } + + offset.left += startOffset.left - rect.width * elementRect.left; + offset.top += startOffset.top - rect.height * elementRect.top; + offset.right += startOffset.right - rect.width * (1 - elementRect.right); + offset.bottom += startOffset.bottom - rect.height * (1 - elementRect.bottom); + } + + state.offset = offset; +} + +function set(_ref2) { + var coords = _ref2.coords, + interaction = _ref2.interaction, + state = _ref2.state; + var options = state.options, + offset = state.offset; + var restriction = getRestrictionRect(options.restriction, interaction, coords); + + if (!restriction) { + return; + } + + var rect = __rectUtils_35.xywhToTlbr(restriction); + coords.x = Math.max(Math.min(rect.right - offset.right, coords.x), rect.left + offset.left); + coords.y = Math.max(Math.min(rect.bottom - offset.bottom, coords.y), rect.top + offset.top); +} + +function getRestrictionRect(value, interaction, coords) { + if (__is_35.func(value)) { + return __rectUtils_35.resolveRectLike(value, interaction.interactable, interaction.element, [coords.x, coords.y, interaction]); + } else { + return __rectUtils_35.resolveRectLike(value, interaction.interactable, interaction.element); + } +} + +var __defaults_35 = { + restriction: null, + elementRect: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrict = { + start: __start_35, + set: set, + defaults: __defaults_35 +}; +_$pointer_35.restrict = restrict; + +var ___default_35 = (0, _$base_32.makeModifier)(restrict, 'restrict'); + +_$pointer_35["default"] = ___default_35; + +var _$edges_34 = {}; +"use strict"; + +function ___typeof_34(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_34 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_34 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_34(obj); } + +Object.defineProperty(_$edges_34, "__esModule", { + value: true +}); +_$edges_34.restrictEdges = _$edges_34["default"] = void 0; + +var ___extend_34 = ___interopRequireDefault_34(_$extend_55); + +var __rectUtils_34 = ___interopRequireWildcard_34(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$pointer_35 = require("./pointer"); */; + +function ___getRequireWildcardCache_34() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_34 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_34(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_34(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_34(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_34(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +// This module adds the options.resize.restrictEdges setting which sets min and +// max for the top, left, bottom and right edges of the target being resized. +// +// interact(target).resize({ +// edges: { top: true, left: true }, +// restrictEdges: { +// inner: { top: 200, left: 200, right: 400, bottom: 400 }, +// outer: { top: 0, left: 0, right: 600, bottom: 600 }, +// }, +// }) +var noInner = { + top: +Infinity, + left: +Infinity, + bottom: -Infinity, + right: -Infinity +}; +var noOuter = { + top: -Infinity, + left: -Infinity, + bottom: +Infinity, + right: +Infinity +}; + +function __start_34(_ref) { + var interaction = _ref.interaction, + startOffset = _ref.startOffset, + state = _ref.state; + var options = state.options; + var offset; + + if (options) { + var offsetRect = (0, _$pointer_35.getRestrictionRect)(options.offset, interaction, interaction.coords.start.page); + offset = __rectUtils_34.rectToXY(offsetRect); + } + + offset = offset || { + x: 0, + y: 0 + }; + state.offset = { + top: offset.y + startOffset.top, + left: offset.x + startOffset.left, + bottom: offset.y - startOffset.bottom, + right: offset.x - startOffset.right + }; +} + +function __set_34(_ref2) { + var coords = _ref2.coords, + edges = _ref2.edges, + interaction = _ref2.interaction, + state = _ref2.state; + var offset = state.offset, + options = state.options; + + if (!edges) { + return; + } + + var page = (0, ___extend_34["default"])({}, coords); + var inner = (0, _$pointer_35.getRestrictionRect)(options.inner, interaction, page) || {}; + var outer = (0, _$pointer_35.getRestrictionRect)(options.outer, interaction, page) || {}; + fixRect(inner, noInner); + fixRect(outer, noOuter); + + if (edges.top) { + coords.y = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top); + } else if (edges.bottom) { + coords.y = Math.max(Math.min(outer.bottom + offset.bottom, page.y), inner.bottom + offset.bottom); + } + + if (edges.left) { + coords.x = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left); + } else if (edges.right) { + coords.x = Math.max(Math.min(outer.right + offset.right, page.x), inner.right + offset.right); + } +} + +function fixRect(rect, defaults) { + var _arr = ['top', 'left', 'bottom', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (!(edge in rect)) { + rect[edge] = defaults[edge]; + } + } + + return rect; +} + +var __defaults_34 = { + inner: null, + outer: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrictEdges = { + noInner: noInner, + noOuter: noOuter, + start: __start_34, + set: __set_34, + defaults: __defaults_34 +}; +_$edges_34.restrictEdges = restrictEdges; + +var ___default_34 = (0, _$base_32.makeModifier)(restrictEdges, 'restrictEdges'); + +_$edges_34["default"] = ___default_34; + +var _$rect_36 = {}; +"use strict"; + +Object.defineProperty(_$rect_36, "__esModule", { + value: true +}); +_$rect_36.restrictRect = _$rect_36["default"] = void 0; + +var ___extend_36 = ___interopRequireDefault_36(_$extend_55); + +/* removed: var _$pointer_35 = require("./pointer"); */; + +/* removed: var _$base_32 = require("../base"); */; + +function ___interopRequireDefault_36(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __defaults_36 = (0, ___extend_36["default"])({ + get elementRect() { + return { + top: 0, + left: 0, + bottom: 1, + right: 1 + }; + }, + + set elementRect(_) {} + +}, _$pointer_35.restrict.defaults); +var restrictRect = { + start: _$pointer_35.restrict.start, + set: _$pointer_35.restrict.set, + defaults: __defaults_36 +}; +_$rect_36.restrictRect = restrictRect; + +var ___default_36 = (0, _$base_32.makeModifier)(restrictRect, 'restrictRect'); + +_$rect_36["default"] = ___default_36; + +var _$size_37 = {}; +"use strict"; + +function ___typeof_37(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_37 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_37 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_37(obj); } + +Object.defineProperty(_$size_37, "__esModule", { + value: true +}); +_$size_37.restrictSize = _$size_37["default"] = void 0; + +var ___extend_37 = ___interopRequireDefault_37(_$extend_55); + +var __rectUtils_37 = ___interopRequireWildcard_37(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$edges_34 = require("./edges"); */; + +/* removed: var _$pointer_35 = require("./pointer"); */; + +function ___getRequireWildcardCache_37() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_37 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_37(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_37(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_37(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_37(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var noMin = { + width: -Infinity, + height: -Infinity +}; +var noMax = { + width: +Infinity, + height: +Infinity +}; + +function __start_37(arg) { + return _$edges_34.restrictEdges.start(arg); +} + +function __set_37(arg) { + var interaction = arg.interaction, + state = arg.state, + rect = arg.rect, + edges = arg.edges; + var options = state.options; + + if (!edges) { + return; + } + + var minSize = __rectUtils_37.tlbrToXywh((0, _$pointer_35.getRestrictionRect)(options.min, interaction, arg.coords)) || noMin; + var maxSize = __rectUtils_37.tlbrToXywh((0, _$pointer_35.getRestrictionRect)(options.max, interaction, arg.coords)) || noMax; + state.options = { + endOnly: options.endOnly, + inner: (0, ___extend_37["default"])({}, _$edges_34.restrictEdges.noInner), + outer: (0, ___extend_37["default"])({}, _$edges_34.restrictEdges.noOuter) + }; + + if (edges.top) { + state.options.inner.top = rect.bottom - minSize.height; + state.options.outer.top = rect.bottom - maxSize.height; + } else if (edges.bottom) { + state.options.inner.bottom = rect.top + minSize.height; + state.options.outer.bottom = rect.top + maxSize.height; + } + + if (edges.left) { + state.options.inner.left = rect.right - minSize.width; + state.options.outer.left = rect.right - maxSize.width; + } else if (edges.right) { + state.options.inner.right = rect.left + minSize.width; + state.options.outer.right = rect.left + maxSize.width; + } + + _$edges_34.restrictEdges.set(arg); + + state.options = options; +} + +var __defaults_37 = { + min: null, + max: null, + endOnly: false, + enabled: false +}; +var restrictSize = { + start: __start_37, + set: __set_37, + defaults: __defaults_37 +}; +_$size_37.restrictSize = restrictSize; + +var ___default_37 = (0, _$base_32.makeModifier)(restrictSize, 'restrictSize'); + +_$size_37["default"] = ___default_37; + +var _$pointer_39 = {}; +"use strict"; + +function ___typeof_39(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_39 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_39 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_39(obj); } + +Object.defineProperty(_$pointer_39, "__esModule", { + value: true +}); +_$pointer_39.snap = _$pointer_39["default"] = void 0; + +var __utils_39 = ___interopRequireWildcard_39(_$index_58); + +/* removed: var _$base_32 = require("../base"); */; + +function ___getRequireWildcardCache_39() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_39 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_39(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_39(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_39(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __start_39(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + element = arg.element, + rect = arg.rect, + state = arg.state, + startOffset = arg.startOffset; + var options = state.options; + var origin = options.offsetWithOrigin ? getOrigin(arg) : { + x: 0, + y: 0 + }; + var snapOffset; + + if (options.offset === 'startCoords') { + snapOffset = { + x: interaction.coords.start.page.x, + y: interaction.coords.start.page.y + }; + } else { + var offsetRect = __utils_39.rect.resolveRectLike(options.offset, interactable, element, [interaction]); + snapOffset = __utils_39.rect.rectToXY(offsetRect) || { + x: 0, + y: 0 + }; + snapOffset.x += origin.x; + snapOffset.y += origin.y; + } + + var relativePoints = options.relativePoints; + state.offsets = rect && relativePoints && relativePoints.length ? relativePoints.map(function (relativePoint, index) { + return { + index: index, + relativePoint: relativePoint, + x: startOffset.left - rect.width * relativePoint.x + snapOffset.x, + y: startOffset.top - rect.height * relativePoint.y + snapOffset.y + }; + }) : [__utils_39.extend({ + index: 0, + relativePoint: null + }, snapOffset)]; +} + +function __set_39(arg) { + var interaction = arg.interaction, + coords = arg.coords, + state = arg.state; + var options = state.options, + offsets = state.offsets; + var origin = __utils_39.getOriginXY(interaction.interactable, interaction.element, interaction.prepared.name); + var page = __utils_39.extend({}, coords); + var targets = []; + + if (!options.offsetWithOrigin) { + page.x -= origin.x; + page.y -= origin.y; + } + + for (var _i = 0; _i < offsets.length; _i++) { + var _ref; + + _ref = offsets[_i]; + var _offset = _ref; + var relativeX = page.x - _offset.x; + var relativeY = page.y - _offset.y; + + for (var _index = 0, len = options.targets.length; _index < len; _index++) { + var snapTarget = options.targets[_index]; + var target = void 0; + + if (__utils_39.is.func(snapTarget)) { + target = snapTarget(relativeX, relativeY, interaction, _offset, _index); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + targets.push({ + x: (__utils_39.is.number(target.x) ? target.x : relativeX) + _offset.x, + y: (__utils_39.is.number(target.y) ? target.y : relativeY) + _offset.y, + range: __utils_39.is.number(target.range) ? target.range : options.range, + source: snapTarget, + index: _index, + offset: _offset + }); + } + } + + var closest = { + target: null, + inRange: false, + distance: 0, + range: 0, + delta: { + x: 0, + y: 0 + } + }; + + for (var _i2 = 0; _i2 < targets.length; _i2++) { + var _target = targets[_i2]; + var range = _target.range; + var dx = _target.x - page.x; + var dy = _target.y - page.y; + var distance = __utils_39.hypot(dx, dy); + var inRange = distance <= range; // Infinite targets count as being out of range + // compared to non infinite ones that are in range + + if (range === Infinity && closest.inRange && closest.range !== Infinity) { + inRange = false; + } + + if (!closest.target || (inRange // is the closest target in range? + ? closest.inRange && range !== Infinity // the pointer is relatively deeper in this target + ? distance / range < closest.distance / closest.range // this target has Infinite range and the closest doesn't + : range === Infinity && closest.range !== Infinity || // OR this target is closer that the previous closest + distance < closest.distance : // The other is not in range and the pointer is closer to this target + !closest.inRange && distance < closest.distance)) { + closest.target = _target; + closest.distance = distance; + closest.range = range; + closest.inRange = inRange; + closest.delta.x = dx; + closest.delta.y = dy; + } + } + + if (closest.inRange) { + coords.x = closest.target.x; + coords.y = closest.target.y; + } + + state.closest = closest; + return closest; +} + +function getOrigin(arg) { + var element = arg.interaction.element; + var optionsOrigin = __utils_39.rect.rectToXY(__utils_39.rect.resolveRectLike(arg.state.options.origin, null, null, [element])); + var origin = optionsOrigin || __utils_39.getOriginXY(arg.interactable, element, arg.interaction.prepared.name); + return origin; +} + +var __defaults_39 = { + range: Infinity, + targets: null, + offset: null, + offsetWithOrigin: true, + origin: null, + relativePoints: null, + endOnly: false, + enabled: false +}; +var snap = { + start: __start_39, + set: __set_39, + defaults: __defaults_39 +}; +_$pointer_39.snap = snap; + +var ___default_39 = (0, _$base_32.makeModifier)(snap, 'snap'); + +_$pointer_39["default"] = ___default_39; + +var _$size_40 = {}; +"use strict"; + +function ___typeof_40(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_40 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_40 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_40(obj); } + +Object.defineProperty(_$size_40, "__esModule", { + value: true +}); +_$size_40.snapSize = _$size_40["default"] = void 0; + +var ___extend_40 = ___interopRequireDefault_40(_$extend_55); + +var __is_40 = ___interopRequireWildcard_40(_$is_59); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$pointer_39 = require("./pointer"); */; + +function ___getRequireWildcardCache_40() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_40 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_40(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_40(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_40(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_40(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_40(arr, i) { return ___arrayWithHoles_40(arr) || ___iterableToArrayLimit_40(arr, i) || ___nonIterableRest_40(); } + +function ___nonIterableRest_40() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_40(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_40(arr) { if (Array.isArray(arr)) return arr; } + +function __start_40(arg) { + var state = arg.state, + edges = arg.edges; + var options = state.options; + + if (!edges) { + return null; + } + + arg.state = { + options: { + targets: null, + relativePoints: [{ + x: edges.left ? 0 : 1, + y: edges.top ? 0 : 1 + }], + offset: options.offset || 'self', + origin: { + x: 0, + y: 0 + }, + range: options.range + } + }; + state.targetFields = state.targetFields || [['width', 'height'], ['x', 'y']]; + + _$pointer_39.snap.start(arg); + + state.offsets = arg.state.offsets; + arg.state = state; +} + +function __set_40(arg) { + var interaction = arg.interaction, + state = arg.state, + coords = arg.coords; + var options = state.options, + offsets = state.offsets; + var relative = { + x: coords.x - offsets[0].x, + y: coords.y - offsets[0].y + }; + state.options = (0, ___extend_40["default"])({}, options); + state.options.targets = []; + + for (var _i = 0; _i < (options.targets || []).length; _i++) { + var _ref; + + _ref = (options.targets || [])[_i]; + var snapTarget = _ref; + var target = void 0; + + if (__is_40.func(snapTarget)) { + target = snapTarget(relative.x, relative.y, interaction); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + for (var _i2 = 0; _i2 < state.targetFields.length; _i2++) { + var _ref2; + + _ref2 = state.targetFields[_i2]; + + var _ref3 = _ref2, + _ref4 = ___slicedToArray_40(_ref3, 2), + xField = _ref4[0], + yField = _ref4[1]; + + if (xField in target || yField in target) { + target.x = target[xField]; + target.y = target[yField]; + break; + } + } + + state.options.targets.push(target); + } + + var returnValue = _$pointer_39.snap.set(arg); + + state.options = options; + return returnValue; +} + +var __defaults_40 = { + range: Infinity, + targets: null, + offset: null, + endOnly: false, + enabled: false +}; +var snapSize = { + start: __start_40, + set: __set_40, + defaults: __defaults_40 +}; +_$size_40.snapSize = snapSize; + +var ___default_40 = (0, _$base_32.makeModifier)(snapSize, 'snapSize'); + +_$size_40["default"] = ___default_40; + +var _$edges_38 = {}; +"use strict"; + +Object.defineProperty(_$edges_38, "__esModule", { + value: true +}); +_$edges_38.snapEdges = _$edges_38["default"] = void 0; + +var ___clone_38 = ___interopRequireDefault_38(_$clone_51); + +var ___extend_38 = ___interopRequireDefault_38(_$extend_55); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$size_40 = require("./size"); */; + +function ___interopRequireDefault_38(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** + * @module modifiers/snapEdges + * + * @description + * This module allows snapping of the edges of targets during resize + * interactions. + * + * @example + * interact(target).resizable({ + * snapEdges: { + * targets: [interact.snappers.grid({ x: 100, y: 50 })], + * }, + * }) + * + * interact(target).resizable({ + * snapEdges: { + * targets: [ + * interact.snappers.grid({ + * top: 50, + * left: 50, + * bottom: 100, + * right: 100, + * }), + * ], + * }, + * }) + */ +function __start_38(arg) { + var edges = arg.edges; + + if (!edges) { + return null; + } + + arg.state.targetFields = arg.state.targetFields || [[edges.left ? 'left' : 'right', edges.top ? 'top' : 'bottom']]; + return _$size_40.snapSize.start(arg); +} + +var snapEdges = { + start: __start_38, + set: _$size_40.snapSize.set, + defaults: (0, ___extend_38["default"])((0, ___clone_38["default"])(_$size_40.snapSize.defaults), { + targets: null, + range: null, + offset: { + x: 0, + y: 0 + } + }) +}; +_$edges_38.snapEdges = snapEdges; + +var ___default_38 = (0, _$base_32.makeModifier)(snapEdges, 'snapEdges'); + +_$edges_38["default"] = ___default_38; + +var _$all_30 = {}; +"use strict"; + +Object.defineProperty(_$all_30, "__esModule", { + value: true +}); +Object.defineProperty(_$all_30, "aspectRatio", { + enumerable: true, + get: function get() { + return _aspectRatio["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictEdges", { + enumerable: true, + get: function get() { + return ___edges_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrict", { + enumerable: true, + get: function get() { + return ___pointer_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictRect", { + enumerable: true, + get: function get() { + return ___rect_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictSize", { + enumerable: true, + get: function get() { + return ___size_30["default"]; + } +}); +Object.defineProperty(_$all_30, "snapEdges", { + enumerable: true, + get: function get() { + return _edges2["default"]; + } +}); +Object.defineProperty(_$all_30, "snap", { + enumerable: true, + get: function get() { + return _pointer2["default"]; + } +}); +Object.defineProperty(_$all_30, "snapSize", { + enumerable: true, + get: function get() { + return _size2["default"]; + } +}); + +var _aspectRatio = ___interopRequireDefault_30(_$aspectRatio_31); + +var ___edges_30 = ___interopRequireDefault_30(_$edges_34); + +var ___pointer_30 = ___interopRequireDefault_30(_$pointer_35); + +var ___rect_30 = ___interopRequireDefault_30(_$rect_36); + +var ___size_30 = ___interopRequireDefault_30(_$size_37); + +var _edges2 = ___interopRequireDefault_30(_$edges_38); + +var _pointer2 = ___interopRequireDefault_30(_$pointer_39); + +var _size2 = ___interopRequireDefault_30(_$size_40); + +function ___interopRequireDefault_30(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _$grid_66 = {}; +"use strict"; + +Object.defineProperty(_$grid_66, "__esModule", { + value: true +}); +_$grid_66["default"] = void 0; + +function ___slicedToArray_66(arr, i) { return ___arrayWithHoles_66(arr) || ___iterableToArrayLimit_66(arr, i) || ___nonIterableRest_66(); } + +function ___nonIterableRest_66() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_66(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_66(arr) { if (Array.isArray(arr)) return arr; } + +function createGrid(grid) { + var coordFields = [['x', 'y'], ['left', 'top'], ['right', 'bottom'], ['width', 'height']].filter(function (_ref) { + var _ref2 = ___slicedToArray_66(_ref, 2), + xField = _ref2[0], + yField = _ref2[1]; + + return xField in grid || yField in grid; + }); + + var gridFunc = function gridFunc(x, y) { + var range = grid.range, + _grid$limits = grid.limits, + limits = _grid$limits === void 0 ? { + left: -Infinity, + right: Infinity, + top: -Infinity, + bottom: Infinity + } : _grid$limits, + _grid$offset = grid.offset, + offset = _grid$offset === void 0 ? { + x: 0, + y: 0 + } : _grid$offset; + var result = { + range: range, + grid: grid, + x: null, + y: null + }; + + for (var _i2 = 0; _i2 < coordFields.length; _i2++) { + var _ref3; + + _ref3 = coordFields[_i2]; + + var _ref4 = _ref3, + _ref5 = ___slicedToArray_66(_ref4, 2), + xField = _ref5[0], + yField = _ref5[1]; + + var gridx = Math.round((x - offset.x) / grid[xField]); + var gridy = Math.round((y - offset.y) / grid[yField]); + result[xField] = Math.max(limits.left, Math.min(limits.right, gridx * grid[xField] + offset.x)); + result[yField] = Math.max(limits.top, Math.min(limits.bottom, gridy * grid[yField] + offset.y)); + } + + return result; + }; + + gridFunc.grid = grid; + gridFunc.coordFields = coordFields; + return gridFunc; +} + +var ___default_66 = createGrid; +_$grid_66["default"] = ___default_66; + +var _$index_67 = {}; +"use strict"; + +Object.defineProperty(_$index_67, "__esModule", { + value: true +}); +Object.defineProperty(_$index_67, "grid", { + enumerable: true, + get: function get() { + return _grid["default"]; + } +}); + +var _grid = ___interopRequireDefault_67(_$grid_66); + +function ___interopRequireDefault_67(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _$index_33 = {}; +"use strict"; + +function ___typeof_33(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_33 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_33 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_33(obj); } + +Object.defineProperty(_$index_33, "__esModule", { + value: true +}); +_$index_33["default"] = void 0; + +var ___base_33 = ___interopRequireDefault_33(_$base_32); + +var all = ___interopRequireWildcard_33(_$all_30); + +var ___extend_33 = ___interopRequireDefault_33(_$extend_55); + +var snappers = ___interopRequireWildcard_33(_$index_67); + +function ___getRequireWildcardCache_33() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_33 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_33(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_33(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_33(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_33(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __modifiers_33 = { + id: 'modifiers', + install: function install(scope) { + var interact = scope.interact; + scope.usePlugin(___base_33["default"]); + interact.modifiers = (0, ___extend_33["default"])(interact.modifiers || {}, all); + interact.snappers = (0, ___extend_33["default"])(interact.snappers || {}, snappers); + interact.createSnapGrid = interact.snappers.grid; // for backwrads compatibility + + for (var type in all) { + var _all = all[type], + _defaults = _all._defaults, + _methods = _all._methods; + _defaults._methods = _methods; + scope.defaults.perAction[type] = _defaults; + } + } +}; +var ___default_33 = __modifiers_33; +_$index_33["default"] = ___default_33; + +var _$PointerEvent_42 = {}; +"use strict"; + +Object.defineProperty(_$PointerEvent_42, "__esModule", { + value: true +}); +_$PointerEvent_42.PointerEvent = _$PointerEvent_42["default"] = void 0; + +var ___BaseEvent2_42 = ___interopRequireDefault_42(_$BaseEvent_13); + +var __pointerUtils_42 = ___interopRequireWildcard_42(_$pointerUtils_63); + +function ___getRequireWildcardCache_42() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_42 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_42(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_42(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_42(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_42(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_42(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_42 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_42 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_42(obj); } + +function ___classCallCheck_42(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_42(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_42(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_42(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_42(Constructor, staticProps); return Constructor; } + +function ___possibleConstructorReturn_42(self, call) { if (call && (___typeof_42(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_42(self); } + +function ___getPrototypeOf_42(o) { ___getPrototypeOf_42 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_42(o); } + +function ___assertThisInitialized_42(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ___inherits_42(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_42(subClass, superClass); } + +function ___setPrototypeOf_42(o, p) { ___setPrototypeOf_42 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_42(o, p); } + +function ___defineProperty_42(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var PointerEvent = /*#__PURE__*/function (_BaseEvent) { + ___inherits_42(PointerEvent, _BaseEvent); + + /** */ + function PointerEvent(type, pointer, event, eventTarget, interaction, timeStamp) { + var _this; + + ___classCallCheck_42(this, PointerEvent); + + _this = ___possibleConstructorReturn_42(this, ___getPrototypeOf_42(PointerEvent).call(this, interaction)); + + ___defineProperty_42(___assertThisInitialized_42(_this), "type", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "originalEvent", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pointerId", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pointerType", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "double", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pageX", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pageY", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "clientX", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "clientY", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "dt", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "eventable", void 0); + + __pointerUtils_42.pointerExtend(___assertThisInitialized_42(_this), event); + + if (event !== pointer) { + __pointerUtils_42.pointerExtend(___assertThisInitialized_42(_this), pointer); + } + + _this.timeStamp = timeStamp; + _this.originalEvent = event; + _this.type = type; + _this.pointerId = __pointerUtils_42.getPointerId(pointer); + _this.pointerType = __pointerUtils_42.getPointerType(pointer); + _this.target = eventTarget; + _this.currentTarget = null; + + if (type === 'tap') { + var pointerIndex = interaction.getPointerIndex(pointer); + _this.dt = _this.timeStamp - interaction.pointers[pointerIndex].downTime; + var interval = _this.timeStamp - interaction.tapTime; + _this["double"] = !!(interaction.prevTap && interaction.prevTap.type !== 'doubletap' && interaction.prevTap.target === _this.target && interval < 500); + } else if (type === 'doubletap') { + _this.dt = pointer.timeStamp - interaction.tapTime; + } + + return _this; + } + + ___createClass_42(PointerEvent, [{ + key: "_subtractOrigin", + value: function _subtractOrigin(_ref) { + var originX = _ref.x, + originY = _ref.y; + this.pageX -= originX; + this.pageY -= originY; + this.clientX -= originX; + this.clientY -= originY; + return this; + } + }, { + key: "_addOrigin", + value: function _addOrigin(_ref2) { + var originX = _ref2.x, + originY = _ref2.y; + this.pageX += originX; + this.pageY += originY; + this.clientX += originX; + this.clientY += originY; + return this; + } + /** + * Prevent the default behaviour of the original Event + */ + + }, { + key: "preventDefault", + value: function preventDefault() { + this.originalEvent.preventDefault(); + } + }]); + + return PointerEvent; +}(___BaseEvent2_42["default"]); + +_$PointerEvent_42.PointerEvent = _$PointerEvent_42["default"] = PointerEvent; + +var _$base_43 = {}; +"use strict"; + +function ___typeof_43(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_43 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_43 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_43(obj); } + +Object.defineProperty(_$base_43, "__esModule", { + value: true +}); +_$base_43["default"] = void 0; + +var ___Interaction_43 = ___interopRequireDefault_43(_$Interaction_18); + +var ___scope_43 = _$scope_24({}); + +var __utils_43 = ___interopRequireWildcard_43(_$index_58); + +var _PointerEvent = ___interopRequireDefault_43(_$PointerEvent_42); + +function ___getRequireWildcardCache_43() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_43 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_43(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_43(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_43(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_43(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __defaults_43 = { + holdDuration: 600, + ignoreFrom: null, + allowFrom: null, + origin: { + x: 0, + y: 0 + } +}; +var pointerEvents = { + id: 'pointer-events/base', + install: __install_43, + listeners: { + 'interactions:new': addInteractionProps, + 'interactions:update-pointer': addHoldInfo, + 'interactions:move': moveAndClearHold, + 'interactions:down': function interactionsDown(arg, scope) { + downAndStartHold(arg, scope); + fire(arg, scope); + }, + 'interactions:up': function interactionsUp(arg, scope) { + clearHold(arg); + fire(arg, scope); + tapAfterUp(arg, scope); + }, + 'interactions:cancel': function interactionsCancel(arg, scope) { + clearHold(arg); + fire(arg, scope); + } + }, + PointerEvent: _PointerEvent["default"], + fire: fire, + collectEventTargets: collectEventTargets, + defaults: __defaults_43, + types: { + down: true, + move: true, + up: true, + cancel: true, + tap: true, + doubletap: true, + hold: true + } +}; + +function fire(arg, scope) { + var interaction = arg.interaction, + pointer = arg.pointer, + event = arg.event, + eventTarget = arg.eventTarget, + type = arg.type, + _arg$targets = arg.targets, + targets = _arg$targets === void 0 ? collectEventTargets(arg, scope) : _arg$targets; + var pointerEvent = new _PointerEvent["default"](type, pointer, event, eventTarget, interaction, scope.now()); + scope.fire('pointerEvents:new', { + pointerEvent: pointerEvent + }); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + targets: targets, + type: type, + pointerEvent: pointerEvent + }; + + for (var i = 0; i < targets.length; i++) { + var target = targets[i]; + + for (var prop in target.props || {}) { + pointerEvent[prop] = target.props[prop]; + } + + var origin = __utils_43.getOriginXY(target.eventable, target.node); + + pointerEvent._subtractOrigin(origin); + + pointerEvent.eventable = target.eventable; + pointerEvent.currentTarget = target.node; + target.eventable.fire(pointerEvent); + + pointerEvent._addOrigin(origin); + + if (pointerEvent.immediatePropagationStopped || pointerEvent.propagationStopped && i + 1 < targets.length && targets[i + 1].node !== pointerEvent.currentTarget) { + break; + } + } + + scope.fire('pointerEvents:fired', signalArg); + + if (type === 'tap') { + // if pointerEvent should make a double tap, create and fire a doubletap + // PointerEvent and use that as the prevTap + var prevTap = pointerEvent["double"] ? fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'doubletap' + }, scope) : pointerEvent; + interaction.prevTap = prevTap; + interaction.tapTime = prevTap.timeStamp; + } + + return pointerEvent; +} + +function collectEventTargets(_ref, scope) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget, + type = _ref.type; + var pointerIndex = interaction.getPointerIndex(pointer); + var pointerInfo = interaction.pointers[pointerIndex]; // do not fire a tap event if the pointer was moved before being lifted + + if (type === 'tap' && (interaction.pointerWasMoved || // or if the pointerup target is different to the pointerdown target + !(pointerInfo && pointerInfo.downTarget === eventTarget))) { + return []; + } + + var path = __utils_43.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: type, + path: path, + targets: [], + node: null + }; + + for (var _i = 0; _i < path.length; _i++) { + var _ref2; + + _ref2 = path[_i]; + var node = _ref2; + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (type === 'hold') { + signalArg.targets = signalArg.targets.filter(function (target) { + return target.eventable.options.holdDuration === interaction.pointers[pointerIndex].hold.duration; + }); + } + + return signalArg.targets; +} + +function addInteractionProps(_ref3) { + var interaction = _ref3.interaction; + interaction.prevTap = null; // the most recent tap event on this interaction + + interaction.tapTime = 0; // time of the most recent tap event +} + +function addHoldInfo(_ref4) { + var down = _ref4.down, + pointerInfo = _ref4.pointerInfo; + + if (!down && pointerInfo.hold) { + return; + } + + pointerInfo.hold = { + duration: Infinity, + timeout: null + }; +} + +function clearHold(_ref5) { + var interaction = _ref5.interaction, + pointerIndex = _ref5.pointerIndex; + + if (interaction.pointers[pointerIndex].hold) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } +} + +function moveAndClearHold(_ref6, scope) { + var interaction = _ref6.interaction, + pointer = _ref6.pointer, + event = _ref6.event, + eventTarget = _ref6.eventTarget, + duplicate = _ref6.duplicate; + var pointerIndex = interaction.getPointerIndex(pointer); + + if (!duplicate && (!interaction.pointerIsDown || interaction.pointerWasMoved)) { + if (interaction.pointerIsDown) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } + + fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'move' + }, scope); + } +} + +function downAndStartHold(_ref7, scope) { + var interaction = _ref7.interaction, + pointer = _ref7.pointer, + event = _ref7.event, + eventTarget = _ref7.eventTarget, + pointerIndex = _ref7.pointerIndex; + var timer = interaction.pointers[pointerIndex].hold; + var path = __utils_43.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'hold', + targets: [], + path: path, + node: null + }; + + for (var _i2 = 0; _i2 < path.length; _i2++) { + var _ref8; + + _ref8 = path[_i2]; + var node = _ref8; + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (!signalArg.targets.length) { + return; + } + + var minDuration = Infinity; + + for (var _i3 = 0; _i3 < signalArg.targets.length; _i3++) { + var _ref9; + + _ref9 = signalArg.targets[_i3]; + var target = _ref9; + var holdDuration = target.eventable.options.holdDuration; + + if (holdDuration < minDuration) { + minDuration = holdDuration; + } + } + + timer.duration = minDuration; + timer.timeout = setTimeout(function () { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'hold' + }, scope); + }, minDuration); +} + +function tapAfterUp(_ref10, scope) { + var interaction = _ref10.interaction, + pointer = _ref10.pointer, + event = _ref10.event, + eventTarget = _ref10.eventTarget; + + if (!interaction.pointerWasMoved) { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'tap' + }, scope); + } +} + +function __install_43(scope) { + scope.pointerEvents = pointerEvents; + scope.defaults.actions.pointerEvents = pointerEvents.defaults; + __utils_43.extend(scope.actions.phaselessTypes, pointerEvents.types); +} + +var ___default_43 = pointerEvents; +_$base_43["default"] = ___default_43; + +var _$holdRepeat_44 = {}; +"use strict"; + +Object.defineProperty(_$holdRepeat_44, "__esModule", { + value: true +}); +_$holdRepeat_44["default"] = void 0; + +var ___base_44 = ___interopRequireDefault_44(_$base_43); + +var ___PointerEvent_44 = ___interopRequireDefault_44(_$PointerEvent_42); + +function ___interopRequireDefault_44(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_44(scope) { + scope.usePlugin(___base_44["default"]); + var pointerEvents = scope.pointerEvents; // don't repeat by default + + pointerEvents.defaults.holdRepeatInterval = 0; + pointerEvents.types.holdrepeat = scope.actions.phaselessTypes.holdrepeat = true; +} + +function onNew(_ref) { + var pointerEvent = _ref.pointerEvent; + + if (pointerEvent.type !== 'hold') { + return; + } + + pointerEvent.count = (pointerEvent.count || 0) + 1; +} + +function onFired(_ref2, scope) { + var interaction = _ref2.interaction, + pointerEvent = _ref2.pointerEvent, + eventTarget = _ref2.eventTarget, + targets = _ref2.targets; + + if (pointerEvent.type !== 'hold' || !targets.length) { + return; + } // get the repeat interval from the first eventable + + + var interval = targets[0].eventable.options.holdRepeatInterval; // don't repeat if the interval is 0 or less + + if (interval <= 0) { + return; + } // set a timeout to fire the holdrepeat event + + + interaction.holdIntervalHandle = setTimeout(function () { + scope.pointerEvents.fire({ + interaction: interaction, + eventTarget: eventTarget, + type: 'hold', + pointer: pointerEvent, + event: pointerEvent + }, scope); + }, interval); +} + +function endHoldRepeat(_ref3) { + var interaction = _ref3.interaction; + + // set the interaction's holdStopTime property + // to stop further holdRepeat events + if (interaction.holdIntervalHandle) { + clearInterval(interaction.holdIntervalHandle); + interaction.holdIntervalHandle = null; + } +} + +var holdRepeat = { + id: 'pointer-events/holdRepeat', + install: __install_44, + listeners: ['move', 'up', 'cancel', 'endall'].reduce(function (acc, enderTypes) { + acc["pointerEvents:".concat(enderTypes)] = endHoldRepeat; + return acc; + }, { + 'pointerEvents:new': onNew, + 'pointerEvents:fired': onFired + }) +}; +var ___default_44 = holdRepeat; +_$holdRepeat_44["default"] = ___default_44; + +var _$interactableTargets_46 = {}; +"use strict"; + +Object.defineProperty(_$interactableTargets_46, "__esModule", { + value: true +}); +_$interactableTargets_46["default"] = void 0; + +var ___extend_46 = ___interopRequireDefault_46(_$extend_55); + +function ___interopRequireDefault_46(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_46(scope) { + var Interactable = scope.Interactable; + Interactable.prototype.pointerEvents = pointerEventsMethod; + var __backCompatOption = Interactable.prototype._backCompatOption; + + Interactable.prototype._backCompatOption = function (optionName, newValue) { + var ret = __backCompatOption.call(this, optionName, newValue); + + if (ret === this) { + this.events.options[optionName] = newValue; + } + + return ret; + }; +} + +function pointerEventsMethod(options) { + (0, ___extend_46["default"])(this.events.options, options); + return this; +} + +var plugin = { + id: 'pointer-events/interactableTargets', + install: __install_46, + listeners: { + 'pointerEvents:collect-targets': function pointerEventsCollectTargets(_ref, scope) { + var targets = _ref.targets, + node = _ref.node, + type = _ref.type, + eventTarget = _ref.eventTarget; + scope.interactables.forEachMatch(node, function (interactable) { + var eventable = interactable.events; + var options = eventable.options; + + if (eventable.types[type] && eventable.types[type].length && interactable.testIgnoreAllow(options, node, eventTarget)) { + targets.push({ + node: node, + eventable: eventable, + props: { + interactable: interactable + } + }); + } + }); + }, + 'interactable:new': function interactableNew(_ref2) { + var interactable = _ref2.interactable; + + interactable.events.getRect = function (element) { + return interactable.getRect(element); + }; + }, + 'interactable:set': function interactableSet(_ref3, scope) { + var interactable = _ref3.interactable, + options = _ref3.options; + (0, ___extend_46["default"])(interactable.events.options, scope.pointerEvents.defaults); + (0, ___extend_46["default"])(interactable.events.options, options.pointerEvents || {}); + } + } +}; +var ___default_46 = plugin; +_$interactableTargets_46["default"] = ___default_46; + +var _$index_45 = {}; +"use strict"; + +function ___typeof_45(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_45 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_45 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_45(obj); } + +Object.defineProperty(_$index_45, "__esModule", { + value: true +}); +Object.defineProperty(_$index_45, "holdRepeat", { + enumerable: true, + get: function get() { + return _holdRepeat["default"]; + } +}); +Object.defineProperty(_$index_45, "interactableTargets", { + enumerable: true, + get: function get() { + return _interactableTargets["default"]; + } +}); +_$index_45.pointerEvents = _$index_45["default"] = void 0; + +var __pointerEvents_45 = ___interopRequireWildcard_45(_$base_43); + +_$index_45.pointerEvents = __pointerEvents_45; + +var _holdRepeat = ___interopRequireDefault_45(_$holdRepeat_44); + +var _interactableTargets = ___interopRequireDefault_45(_$interactableTargets_46); + +function ___interopRequireDefault_45(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_45() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_45 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_45(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_45(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_45(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +var ___default_45 = { + id: 'pointer-events', + install: function install(scope) { + scope.usePlugin(__pointerEvents_45); + scope.usePlugin(_holdRepeat["default"]); + scope.usePlugin(_interactableTargets["default"]); + } +}; +_$index_45["default"] = ___default_45; + +var _$index_47 = {}; +"use strict"; + +Object.defineProperty(_$index_47, "__esModule", { + value: true +}); +_$index_47.install = __install_47; +_$index_47["default"] = void 0; + +var ___Interactable_47 = ___interopRequireDefault_47(_$Interactable_16({})); + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +/* removed: var _$index_58 = require("@interactjs/utils/index"); */; + +function ___interopRequireDefault_47(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_47(scope) { + var Interactable = scope.Interactable; + scope.actions.phases.reflow = true; + /** + * ```js + * const interactable = interact(target) + * const drag = { name: drag, axis: 'x' } + * const resize = { name: resize, edges: { left: true, bottom: true } + * + * interactable.reflow(drag) + * interactable.reflow(resize) + * ``` + * + * Start an action sequence to re-apply modifiers, check drops, etc. + * + * @param { Object } action The action to begin + * @param { string } action.name The name of the action + * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended + */ + + Interactable.prototype.reflow = function (action) { + return reflow(this, action, scope); + }; +} + +function reflow(interactable, action, scope) { + var elements = _$index_58.is.string(interactable.target) ? _$index_58.arr.from(interactable._context.querySelectorAll(interactable.target)) : [interactable.target]; // tslint:disable-next-line variable-name + + var Promise = _$index_58.win.window.Promise; + var promises = Promise ? [] : null; + + var _loop = function _loop() { + _ref = elements[_i]; + var element = _ref; + var rect = interactable.getRect(element); + + if (!rect) { + return "break"; + } + + var runningInteraction = _$index_58.arr.find(scope.interactions.list, function (interaction) { + return interaction.interacting() && interaction.interactable === interactable && interaction.element === element && interaction.prepared.name === action.name; + }); + + var reflowPromise = void 0; + + if (runningInteraction) { + runningInteraction.move(); + + if (promises) { + reflowPromise = runningInteraction._reflowPromise || new Promise(function (resolve) { + runningInteraction._reflowResolve = resolve; + }); + } + } else { + var xywh = _$index_58.rect.tlbrToXywh(rect); + + var coords = { + page: { + x: xywh.x, + y: xywh.y + }, + client: { + x: xywh.x, + y: xywh.y + }, + timeStamp: scope.now() + }; + + var event = _$index_58.pointer.coordsToEvent(coords); + + reflowPromise = startReflow(scope, interactable, element, action, event); + } + + if (promises) { + promises.push(reflowPromise); + } + }; + + for (var _i = 0; _i < elements.length; _i++) { + var _ref; + + var _ret = _loop(); + + if (_ret === "break") break; + } + + return promises && Promise.all(promises).then(function () { + return interactable; + }); +} + +function startReflow(scope, interactable, element, action, event) { + var interaction = scope.interactions["new"]({ + pointerType: 'reflow' + }); + var signalArg = { + interaction: interaction, + event: event, + pointer: event, + eventTarget: element, + phase: 'reflow' + }; + interaction.interactable = interactable; + interaction.element = element; + interaction.prepared = (0, _$index_58.extend)({}, action); + interaction.prevEvent = event; + interaction.updatePointer(event, event, element, true); + + interaction._doPhase(signalArg); + + var reflowPromise = _$index_58.win.window.Promise ? new _$index_58.win.window.Promise(function (resolve) { + interaction._reflowResolve = resolve; + }) : null; + interaction._reflowPromise = reflowPromise; + interaction.start(action, interactable, element); + + if (interaction._interacting) { + interaction.move(signalArg); + interaction.end(event); + } else { + interaction.stop(); + } + + interaction.removePointer(event, event); + interaction.pointerIsDown = false; + return reflowPromise; +} + +var ___default_47 = { + id: 'reflow', + install: __install_47, + listeners: { + // remove completed reflow interactions + 'interactions:stop': function interactionsStop(_ref2, scope) { + var interaction = _ref2.interaction; + + if (interaction.pointerType === 'reflow') { + if (interaction._reflowResolve) { + interaction._reflowResolve(); + } + + _$index_58.arr.remove(scope.interactions.list, interaction); + } + } + } +}; +_$index_47["default"] = ___default_47; + +var _$index_27 = {}; +"use strict"; + +function ___typeof_27(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_27 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_27 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_27(obj); } + +Object.defineProperty(_$index_27, "__esModule", { + value: true +}); +_$index_27.init = __init_27; +_$index_27["default"] = _$index_27.scope = _$index_27.interact = void 0; + +_$index_48; + +var ___scope_27 = _$scope_24({}); + +var ___browser_27 = ___interopRequireDefault_27(_$browser_50); + +var ___events_27 = ___interopRequireDefault_27(_$events_54); + +var __utils_27 = ___interopRequireWildcard_27(_$index_58); + +function ___getRequireWildcardCache_27() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_27 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_27(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_27(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_27(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_27(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** @module interact */ +var globalEvents = {}; +var scope = new ___scope_27.Scope(); +_$index_27.scope = scope; + +function __init_27(win) { + scope.init(win); + return interact; +} +/** + * ```js + * interact('#draggable').draggable(true) + * + * var rectables = interact('rect') + * rectables + * .gesturable(true) + * .on('gesturemove', function (event) { + * // ... + * }) + * ``` + * + * The methods of this variable can be used to set elements as interactables + * and also to change various default settings. + * + * Calling it as a function and passing an element or a valid CSS selector + * string returns an Interactable object which has various methods to configure + * it. + * + * @global + * + * @param {Element | string} target The HTML or SVG Element to interact with + * or CSS selector + * @return {Interactable} + */ + + +var interact = function interact(target, options) { + var interactable = scope.interactables.get(target, options); + + if (!interactable) { + interactable = scope.interactables["new"](target, options); + interactable.events.global = globalEvents; + } + + return interactable; +}; +/** + * Use a plugin + * + * @alias module:interact.use + * + * @param {Object} plugin + * @param {function} plugin.install + * @return {interact} + */ + + +_$index_27.interact = interact; +interact.use = use; + +function use(plugin, options) { + scope.usePlugin(plugin, options); + return interact; +} +/** + * Check if an element or selector has been set with the {@link interact} + * function + * + * @alias module:interact.isSet + * + * @param {Element} element The Element being searched for + * @return {boolean} Indicates if the element or CSS selector was previously + * passed to interact + */ + + +interact.isSet = isSet; + +function isSet(target, options) { + return !!scope.interactables.get(target, options && options.context); +} +/** + * Add a global listener for an InteractEvent or adds a DOM event to `document` + * + * @alias module:interact.on + * + * @param {string | array | object} type The types of events to listen for + * @param {function} listener The function event (s) + * @param {object | boolean} [options] object or useCapture flag for + * addEventListener + * @return {object} interact + */ + + +interact.on = on; + +function on(type, listener, options) { + if (__utils_27.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_27.is.array(type)) { + for (var _i = 0; _i < type.length; _i++) { + var _ref; + + _ref = type[_i]; + var eventType = _ref; + interact.on(eventType, listener, options); + } + + return interact; + } + + if (__utils_27.is.object(type)) { + for (var prop in type) { + interact.on(prop, type[prop], listener); + } + + return interact; + } // if it is an InteractEvent type, add listener to globalEvents + + + if ((0, ___scope_27.isNonNativeEvent)(type, scope.actions)) { + // if this type of event was never bound + if (!globalEvents[type]) { + globalEvents[type] = [listener]; + } else { + globalEvents[type].push(listener); + } + } // If non InteractEvent type, addEventListener to document + else { + ___events_27["default"].add(scope.document, type, listener, { + options: options + }); + } + + return interact; +} +/** + * Removes a global InteractEvent listener or DOM event from `document` + * + * @alias module:interact.off + * + * @param {string | array | object} type The types of events that were listened + * for + * @param {function} listener The listener function to be removed + * @param {object | boolean} options [options] object or useCapture flag for + * removeEventListener + * @return {object} interact + */ + + +interact.off = off; + +function off(type, listener, options) { + if (__utils_27.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_27.is.array(type)) { + for (var _i2 = 0; _i2 < type.length; _i2++) { + var _ref2; + + _ref2 = type[_i2]; + var eventType = _ref2; + interact.off(eventType, listener, options); + } + + return interact; + } + + if (__utils_27.is.object(type)) { + for (var prop in type) { + interact.off(prop, type[prop], listener); + } + + return interact; + } + + if ((0, ___scope_27.isNonNativeEvent)(type, scope.actions)) { + var index; + + if (type in globalEvents && (index = globalEvents[type].indexOf(listener)) !== -1) { + globalEvents[type].splice(index, 1); + } + } else { + ___events_27["default"].remove(scope.document, type, listener, options); + } + + return interact; +} + +interact.debug = debug; + +function debug() { + return scope; +} // expose the functions used to calculate multi-touch properties + + +interact.getPointerAverage = __utils_27.pointer.pointerAverage; +interact.getTouchBBox = __utils_27.pointer.touchBBox; +interact.getTouchDistance = __utils_27.pointer.touchDistance; +interact.getTouchAngle = __utils_27.pointer.touchAngle; +interact.getElementRect = __utils_27.dom.getElementRect; +interact.getElementClientRect = __utils_27.dom.getElementClientRect; +interact.matchesSelector = __utils_27.dom.matchesSelector; +interact.closest = __utils_27.dom.closest; +/** + * @alias module:interact.supportsTouch + * + * @return {boolean} Whether or not the browser supports touch input + */ + +interact.supportsTouch = supportsTouch; + +function supportsTouch() { + return ___browser_27["default"].supportsTouch; +} +/** + * @alias module:interact.supportsPointerEvent + * + * @return {boolean} Whether or not the browser supports PointerEvents + */ + + +interact.supportsPointerEvent = supportsPointerEvent; + +function supportsPointerEvent() { + return ___browser_27["default"].supportsPointerEvent; +} +/** + * Cancels all interactions (end events are not fired) + * + * @alias module:interact.stop + * + * @return {object} interact + */ + + +interact.stop = __stop_27; + +function __stop_27() { + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref3; + + _ref3 = scope.interactions.list[_i3]; + var interaction = _ref3; + interaction.stop(); + } + + return interact; +} +/** + * Returns or sets the distance the pointer must be moved before an action + * sequence occurs. This also affects tolerance for tap events. + * + * @alias module:interact.pointerMoveTolerance + * + * @param {number} [newValue] The movement from the start position must be greater than this value + * @return {interact | number} + */ + + +interact.pointerMoveTolerance = pointerMoveTolerance; + +function pointerMoveTolerance(newValue) { + if (__utils_27.is.number(newValue)) { + scope.interactions.pointerMoveTolerance = newValue; + return interact; + } + + return scope.interactions.pointerMoveTolerance; +} + +interact.addDocument = function (doc, options) { + return scope.addDocument(doc, options); +}; + +interact.removeDocument = function (doc) { + return scope.removeDocument(doc); +}; // eslint-disable-next-line no-undef + + +interact.version = "1.9.4"; +scope.interact = interact; +var ___default_27 = interact; +_$index_27["default"] = ___default_27; + +var _$index_28 = {}; +"use strict"; + +Object.defineProperty(_$index_28, "__esModule", { + value: true +}); +_$index_28.init = __init_28; +_$index_28["default"] = void 0; + +_$index_48; + +var _index2 = ___interopRequireDefault_28(_$index_5); + +var _index3 = ___interopRequireDefault_28(_$index_7); + +var _index4 = ___interopRequireDefault_28(_$index_12); + +var _index5 = ___interopRequireDefault_28(_$index_25); + +var _index6 = ___interopRequireDefault_28(_$index_26); + +var _index7 = ___interopRequireDefault_28(_$index_33); + +var _offset = ___interopRequireDefault_28(_$index_41); + +var _index8 = ___interopRequireDefault_28(_$index_45); + +var _index9 = ___interopRequireDefault_28(_$index_47); + +var _index10 = ___interopRequireWildcard_28(_$index_27); + +function ___getRequireWildcardCache_28() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_28 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_28(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_28(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_28(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_28(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_28(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_28 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_28 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_28(obj); } + +if ((typeof window === "undefined" ? "undefined" : ___typeof_28(window)) === 'object' && !!window) { + __init_28(window); +} + +var ___default_28 = _index10["default"]; +_$index_28["default"] = ___default_28; + +function __init_28(win) { + (0, _index10.init)(win); + + _index10["default"].use(_offset["default"]); // pointerEvents + + + _index10["default"].use(_index8["default"]); // inertia + + + _index10["default"].use(_index6["default"]); // snap, resize, etc. + + + _index10["default"].use(_index7["default"]); // autoStart, hold + + + _index10["default"].use(_index4["default"]); // drag and drop, resize, gesture + + + _index10["default"].use(_index2["default"]); // autoScroll + + + _index10["default"].use(_index3["default"]); // reflow + + + _index10["default"].use(_index9["default"]); // eslint-disable-next-line no-undef + + + if ("production" !== 'production') { + _index10["default"].use(_index5["default"]); + } + + return _index10["default"]; +} + +var _$index_69 = { exports: {} }; +"use strict"; + +Object.defineProperty(_$index_69.exports, "__esModule", { + value: true +}); +Object.defineProperty(_$index_69.exports, "init", { + enumerable: true, + get: function get() { + return ___index_69.init; + } +}); +_$index_69.exports["default"] = void 0; + +var ___index_69 = ___interopRequireWildcard_69(_$index_28); + +function ___getRequireWildcardCache_69() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_69 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_69(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_69(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_69(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___typeof_69(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_69 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_69 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_69(obj); } + +if (("object" === "undefined" ? "undefined" : ___typeof_69(_$index_69)) === 'object' && !!_$index_69) { + try { + _$index_69.exports = ___index_69["default"]; + } catch (_unused) {} +} + +___index_69["default"]["default"] = ___index_69["default"]; +___index_69["default"].init = ___index_69.init; +var ___default_69 = ___index_69["default"]; +_$index_69.exports["default"] = ___default_69; + +_$index_69 = _$index_69.exports +return _$index_69; + +}); + +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2stZmxhdC9fcHJlbHVkZSIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9zY29wZS50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvaW50ZXJhY3Rpb25zLnRzIiwiLi4vQGludGVyYWN0anMvdHlwZXMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9pc1dpbmRvdy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL3dpbmRvdy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2lzLnRzIiwiLi4vQGludGVyYWN0anMvYWN0aW9ucy9kcmFnLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvYXJyLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZG9tT2JqZWN0cy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2Jyb3dzZXIudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9jbG9uZS50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvcG9pbnRlckV4dGVuZC50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2h5cG90LnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvcG9pbnRlclV0aWxzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZXZlbnRzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvbm9ybWFsaXplTGlzdGVuZXJzLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9FdmVudGFibGUudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9yZWN0LnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZ2V0T3JpZ2luWFkudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9yYWYudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMudHMiLCIuLi9AaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZVNldC50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvQmFzZUV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9Qb2ludGVySW5mby50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24udHMiLCIuLi9AaW50ZXJhY3Rqcy9jb3JlL2ludGVyYWN0aW9uRmluZGVyLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9pbnRlcmFjdGFibGVQcmV2ZW50RGVmYXVsdC50cyIsIi4uL0BpbnRlcmFjdGpzL2FjdGlvbnMvZHJvcC9Ecm9wRXZlbnQudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL2Ryb3AvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL2dlc3R1cmUudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL3Jlc2l6ZS50cyIsIi4uL0BpbnRlcmFjdGpzL2FjdGlvbnMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXNjcm9sbC9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvSW50ZXJhY3RhYmxlTWV0aG9kcy50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvYmFzZS50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvZHJhZ0F4aXMudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXN0YXJ0L2hvbGQudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXN0YXJ0L2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvZGV2LXRvb2xzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL01vZGlmaWNhdGlvbi50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9iYXNlLnRzIiwiLi4vQGludGVyYWN0anMvb2Zmc2V0L2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvaW5lcnRpYS9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9hc3BlY3RSYXRpby50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9yZXN0cmljdC9wb2ludGVyLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3Jlc3RyaWN0L2VkZ2VzLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3Jlc3RyaWN0L3JlY3QudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvcmVzdHJpY3Qvc2l6ZS50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9zbmFwL3BvaW50ZXIudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvc25hcC9zaXplLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3NuYXAvZWRnZXMudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvYWxsLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvc25hcHBlcnMvZ3JpZC50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL3NuYXBwZXJzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvUG9pbnRlckV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvYmFzZS50cyIsIi4uL0BpbnRlcmFjdGpzL3BvaW50ZXItZXZlbnRzL2hvbGRSZXBlYXQudHMiLCIuLi9AaW50ZXJhY3Rqcy9wb2ludGVyLWV2ZW50cy9pbnRlcmFjdGFibGVUYXJnZXRzLnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9yZWZsb3cvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9pbnRlcmFjdC9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2ludGVyYWN0anMvaW5kZXgudHMiLCJpbmRleC50cyIsIi4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2stZmxh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QSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsZUFBQSxFQXhDb0IsSUF3Q3BCLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsU0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsU0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxVQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLE9BQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLElBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxJQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxVQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsVUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxPQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsT0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFdBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxXQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsV0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLE1BQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFHQSxPQUFPLEdBQUcsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFqQyxDQUFBO0lBRUEsSUFBTSxNQUFNLEdBQVEsV0FBVyxDQUFDLFlBQWhDLENBQUE7SUFDQSxJQUFNLFdBQVcsR0FBRyxDQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBbEIsSUFBOEIsZUFBQSxDQUFBLFNBQUEsQ0FBaEMsRUFBa0QsV0FBdEUsQ0FBQTtJQUNBLElBQU0sTUFBTSxHQUFRLENBQUEsQ0FBQSxFQUFBLGlCQUFBLENBQUEsU0FBQSxDQUFBLEVBQVksTUFBWixFQUFvQixPQUFwQixFQUE2QixVQUE3QixDQUFwQixDQUFBO0lBQ0EsSUFBTSxRQUFRLEdBQU0sS0FBSyxLQUFLLE9BQTlCLENBQUE7SUFDQSxJQUFNLE1BQU0sR0FBUSxLQUFLLEtBQUssS0FBOUIsQ0FBQTtJQUNBLElBQU0sU0FBUyxHQUFLLFFBQVEsR0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxHQUFVLFdBQVcsQ0FBQyxTQUFsRCxDQUFBO0lBQ0EsSUFBTSxNQUFNLEdBQVEsUUFBUSxHQUN4QixXQUFXLENBQUMsTUFBWixDQUFtQixLQURLLEdBRXhCLE1BQU0sR0FDSjtNQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBbEI7TUFBd0IsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUExQztNQUFrRCxTQUFTLEVBQUUsV0FBVyxDQUFDLE1BQVosQ0FBbUIsR0FBbkIsQ0FBdUIsU0FBQTtLQURoRixHQUVKLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEdBSnpCLENBQUE7SUFNQSxLQUFBLENBQUssSUFBTCxHQUFpQixDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sRUFBUCxFQUFXLE1BQU0sQ0FBQyxJQUFsQixDQUFqQixDQUFBO0lBQ0EsS0FBQSxDQUFLLE1BQUwsR0FBaUIsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLEVBQVAsRUFBVyxNQUFNLENBQUMsTUFBbEIsQ0FBakIsQ0FBQTtJQUNBLEtBQUEsQ0FBSyxJQUFMLEdBQWlCLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxFQUFQLEVBQVcsV0FBVyxDQUFDLElBQXZCLENBQWpCLENBQUE7SUFDQSxLQUFBLENBQUssU0FBTCxHQUFpQixNQUFNLENBQUMsU0FBeEIsQ0FBQTs7SUFFQSxJQUFJLENBQUMsTUFBTCxFQUFhO01BQ1gsS0FBQSxDQUFLLElBQUwsQ0FBVSxDQUFWLElBQWUsTUFBTSxDQUFDLENBQXRCLENBQUE7TUFDQSxLQUFBLENBQUssSUFBTCxDQUFVLENBQVYsSUFBZSxNQUFNLENBQUMsQ0FBdEIsQ0FBQTtNQUVBLEtBQUEsQ0FBSyxNQUFMLENBQVksQ0FBWixJQUFpQixNQUFNLENBQUMsQ0FBeEIsQ0FBQTtNQUNBLEtBQUEsQ0FBSyxNQUFMLENBQVksQ0FBWixJQUFpQixNQUFNLENBQUMsQ0FBeEIsQ0FBQTtLQUNEOztJQUVELEtBQUEsQ0FBSyxPQUFMLEdBQXFCLEtBQUssQ0FBQyxPQUEzQixDQUFBO0lBQ0EsS0FBQSxDQUFLLE1BQUwsR0FBcUIsS0FBSyxDQUFDLE1BQTNCLENBQUE7SUFDQSxLQUFBLENBQUssUUFBTCxHQUFxQixLQUFLLENBQUMsUUFBM0IsQ0FBQTtJQUNBLEtBQUEsQ0FBSyxPQUFMLEdBQXFCLEtBQUssQ0FBQyxPQUEzQixDQUFBO0lBQ0EsS0FBQSxDQUFLLE1BQUwsR0FBc0IsS0FBRCxDQUFzQixNQUEzQyxDQUFBO0lBQ0EsS0FBQSxDQUFLLE9BQUwsR0FBc0IsS0FBRCxDQUFzQixPQUEzQyxDQUFBO0lBQ0EsS0FBQSxDQUFLLE1BQUwsR0FBcUIsT0FBckIsQ0FBQTtJQUNBLEtBQUEsQ0FBSyxhQUFMLEdBQXFCLE9BQXJCLENBQUE7SUFDQSxLQUFBLENBQUssTUFBTCxHQUFxQixNQUFyQixDQUFBO0lBQ0EsS0FBQSxDQUFLLElBQUwsR0FBcUIsSUFBSSxJQUFLLFVBQVUsSUFBSSxLQUFLLElBQUksRUFBYixDQUF4QyxDQUFBO0lBQ0EsS0FBQSxDQUFLLFlBQUwsR0FBcUIsTUFBckIsQ0FBQTtJQUVBLEtBQUEsQ0FBSyxFQUFMLEdBQVUsUUFBUSxHQUNkLFdBQVcsQ0FBQyxRQUFaLENBQXFCLFdBQVcsQ0FBQyxRQUFaLENBQXFCLE1BQXJCLEdBQThCLENBQW5ELENBQUEsQ0FBc0QsUUFEeEMsR0FFZCxTQUFTLENBQUMsRUFGZCxDQUFBO0lBSUEsS0FBQSxDQUFLLEVBQUwsR0FBZ0IsV0FBVyxDQUFDLE1BQVosQ0FBbUIsS0FBbkIsQ0FBeUIsSUFBekIsQ0FBOEIsQ0FBOUIsR0FBa0MsTUFBTSxDQUFDLENBQXpELENBQUE7SUFDQSxLQUFBLENBQUssRUFBTCxHQUFnQixXQUFXLENBQUMsTUFBWixDQUFtQixLQUFuQixDQUF5QixJQUF6QixDQUE4QixDQUE5QixHQUFrQyxNQUFNLENBQUMsQ0FBekQsQ0FBQTtJQUNBLEtBQUEsQ0FBSyxRQUFMLEdBQWdCLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEtBQW5CLENBQXlCLE1BQXpCLENBQWdDLENBQWhDLEdBQW9DLE1BQU0sQ0FBQyxDQUEzRCxDQUFBO0lBQ0EsS0FBQSxDQUFLLFFBQUwsR0FBZ0IsV0FBVyxDQUFDLE1BQVosQ0FBbUIsS0FBbkIsQ0FBeUIsTUFBekIsQ0FBZ0MsQ0FBaEMsR0FBb0MsTUFBTSxDQUFDLENBQTNELENBQUE7O0lBRUEsSUFBSSxRQUFRLElBQUksTUFBaEIsRUFBd0I7TUFDdEIsS0FBQSxDQUFLLEtBQUwsR0FBYTtRQUFFLENBQUMsRUFBRSxDQUFMO1FBQVEsQ0FBQyxFQUFFLENBQUE7T0FBeEIsQ0FBQTtLQURGLE1BR0s7TUFDSCxLQUFBLENBQUssS0FBTCxHQUFhO1FBQ1gsQ0FBQyxFQUFFLEtBQUEsQ0FBSyxXQUFMLENBQUEsQ0FBa0IsQ0FBbEIsR0FBc0IsU0FBUyxDQUFDLFdBQUQsQ0FBVCxDQUF1QixDQURyQztRQUVYLENBQUMsRUFBRSxLQUFBLENBQUssV0FBTCxDQUFBLENBQWtCLENBQWxCLEdBQXNCLFNBQVMsQ0FBQyxXQUFELENBQVQsQ0FBdUIsQ0FBQTtPQUZsRCxDQUFBO0tBSUQ7O0lBRUQsS0FBQSxDQUFLLEVBQUwsR0FBaUIsV0FBVyxDQUFDLE1BQVosQ0FBbUIsS0FBbkIsQ0FBeUIsU0FBMUMsQ0FBQTtJQUNBLEtBQUEsQ0FBSyxRQUFMLEdBQWlCLEtBQUEsQ0FBSyxTQUFMLEdBQWlCLEtBQUEsQ0FBSyxFQUF2QyxDQTlEQTs7SUFpRUEsS0FBQSxDQUFLLFFBQUwsR0FBZ0IsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLEVBQVAsRUFBVyxXQUFXLENBQUMsTUFBWixDQUFtQixRQUFuQixDQUE0QixXQUE1QixDQUFYLENBQWhCLENBQUE7SUFDQSxLQUFBLENBQUssS0FBTCxHQUFhLENBQUEsQ0FBQSxFQUFBLFdBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTSxLQUFBLENBQUssUUFBTCxDQUFjLENBQXBCLEVBQXVCLEtBQUEsQ0FBSyxRQUFMLENBQWMsQ0FBckMsQ0FBYixDQUFBO0lBRUEsS0FBQSxDQUFLLEtBQUwsR0FBYyxNQUFNLElBQUksS0FBSyxLQUFLLGNBQXJCLEdBQXVDLEtBQUEsQ0FBSyxRQUFMLEVBQXZDLEdBQXlELElBQXRFLENBQUE7SUFwRUEsT0FBQSxLQUFBLENBQUE7R0FxRUQ7Ozs7K0JBc0JXO01BQ1YsSUFBTSxXQUFXLEdBQUcsSUFBQSxDQUFLLFlBQXpCLENBQUE7O01BRUEsSUFBSSxXQUFXLENBQUMsU0FBWixDQUFzQixLQUF0QixHQUE4QixHQUE5QixJQUNBLElBQUEsQ0FBSyxTQUFMLEdBQWlCLFdBQVcsQ0FBQyxTQUFaLENBQXNCLFNBQXZDLEdBQW1ELEdBRHZELEVBQzREO1FBQzFELE9BQU8sSUFBUCxDQUFBO09BQ0Q7O01BRUQsSUFBSSxLQUFLLEdBQUcsR0FBQSxHQUFNLElBQUksQ0FBQyxLQUFMLENBQVcsV0FBVyxDQUFDLFNBQVosQ0FBc0IsU0FBakMsRUFBNEMsV0FBVyxDQUFDLFNBQVosQ0FBc0IsU0FBbEUsQ0FBTixHQUFxRixJQUFJLENBQUMsRUFBdEcsQ0FBQTtNQUNBLElBQU0sT0FBTyxHQUFHLElBQWhCLENBQUE7O01BRUEsSUFBSSxLQUFLLEdBQUcsQ0FBWixFQUFlO1FBQ2IsS0FBSyxJQUFJLEdBQVQsQ0FBQTtPQUNEOztNQUVELElBQU0sSUFBSSxHQUFHLEdBQUEsR0FBTSxPQUFOLElBQWlCLEtBQWpCLElBQTBCLEtBQUssR0FBRyxHQUFBLEdBQU0sT0FBckQsQ0FBQTtNQUNBLElBQU0sRUFBRSxHQUFLLEdBQUEsR0FBTSxPQUFOLElBQWlCLEtBQWpCLElBQTBCLEtBQUssR0FBRyxHQUFBLEdBQU0sT0FBckQsQ0FBQTtNQUVBLElBQU0sS0FBSyxHQUFHLENBQUMsSUFBRCxLQUFVLEdBQUEsR0FBTSxPQUFOLElBQWlCLEtBQWpCLElBQTBCLEtBQUssR0FBSSxFQUFBLEdBQUssT0FBbEQsQ0FBZCxDQUFBO01BQ0EsSUFBTSxJQUFJLEdBQUksQ0FBQyxFQUFELElBQVcsRUFBQSxHQUFLLE9BQUwsSUFBZ0IsS0FBM0IsSUFBb0MsS0FBSyxHQUFHLEdBQUEsR0FBTSxPQUFoRSxDQUFBO01BRUEsT0FBTztRQUNMLEVBQUUsRUFBRixFQURLO1FBRUwsSUFBSSxFQUFKLElBRks7UUFHTCxJQUFJLEVBQUosSUFISztRQUlMLEtBQUssRUFBTCxLQUpLO1FBS0wsS0FBSyxFQUFMLEtBTEs7UUFNTCxLQUFLLEVBQUUsV0FBVyxDQUFDLFNBQVosQ0FBc0IsS0FOeEI7UUFPTCxRQUFRLEVBQUU7VUFDUixDQUFDLEVBQUUsV0FBVyxDQUFDLFNBQVosQ0FBc0IsU0FEakI7VUFFUixDQUFDLEVBQUUsV0FBVyxDQUFDLFNBQVosQ0FBc0IsU0FBQTtTQUZqQjtPQVBaLENBQUE7S0FZRDs7O3FDQUVpQixFQUFFOzs7Ozs7OytDQUtRO01BQzFCLElBQUEsQ0FBSywyQkFBTCxHQUFtQyxJQUFBLENBQUssa0JBQUwsR0FBMEIsSUFBN0QsQ0FBQTtLQUNEOzs7Ozs7O3NDQUtrQjtNQUNqQixJQUFBLENBQUssa0JBQUwsR0FBMEIsSUFBMUIsQ0FBQTtLQUNEOzs7d0JBckVZO01BQUUsT0FBTyxJQUFBLENBQUssSUFBTCxDQUFVLENBQWpCLENBQUE7O3NCQUNKLE9BQU87TUFBRSxJQUFBLENBQUssSUFBTCxDQUFVLENBQVYsR0FBYyxLQUFkLENBQUE7S0FBcUI7Ozt3QkFDNUI7TUFBRSxPQUFPLElBQUEsQ0FBSyxJQUFMLENBQVUsQ0FBakIsQ0FBQTs7c0JBQ0osT0FBTztNQUFFLElBQUEsQ0FBSyxJQUFMLENBQVUsQ0FBVixHQUFjLEtBQWQsQ0FBQTtLQUFxQjs7O3dCQUUxQjtNQUFFLE9BQU8sSUFBQSxDQUFLLE1BQUwsQ0FBWSxDQUFuQixDQUFBOztzQkFDSixPQUFPO01BQUUsSUFBQSxDQUFLLE1BQUwsQ0FBWSxDQUFaLEdBQWdCLEtBQWhCLENBQUE7S0FBdUI7Ozt3QkFDOUI7TUFBRSxPQUFPLElBQUEsQ0FBSyxNQUFMLENBQVksQ0FBbkIsQ0FBQTs7c0JBQ0osT0FBTztNQUFFLElBQUEsQ0FBSyxNQUFMLENBQVksQ0FBWixHQUFnQixLQUFoQixDQUFBO0tBQXVCOzs7d0JBRW5DO01BQUUsT0FBTyxJQUFBLENBQUssS0FBTCxDQUFXLENBQWxCLENBQUE7O3NCQUNKLE9BQU87TUFBRSxJQUFBLENBQUssS0FBTCxDQUFXLENBQVgsR0FBZSxLQUFmLENBQUE7S0FBc0I7Ozt3QkFDN0I7TUFBRSxPQUFPLElBQUEsQ0FBSyxLQUFMLENBQVcsQ0FBbEIsQ0FBQTs7c0JBQ0osT0FBTztNQUFFLElBQUEsQ0FBSyxLQUFMLENBQVcsQ0FBWCxHQUFlLEtBQWYsQ0FBQTtLQUFzQjs7O3dCQUV0QjtNQUFFLE9BQU8sSUFBQSxDQUFLLFFBQUwsQ0FBYyxDQUFyQixDQUFBOztzQkFDSixPQUFPO01BQUUsSUFBQSxDQUFLLFFBQUwsQ0FBYyxDQUFkLEdBQWtCLEtBQWxCLENBQUE7S0FBeUI7Ozt3QkFDaEM7TUFBRSxPQUFPLElBQUEsQ0FBSyxRQUFMLENBQWMsQ0FBckIsQ0FBQTs7c0JBQ0osT0FBTztNQUFFLElBQUEsQ0FBSyxRQUFMLENBQWMsQ0FBZCxHQUFrQixLQUFsQixDQUFBO0tBQXlCOzs7O0VBcEl6QyxXQUFBLENBQUEsU0FBQTs7O29CQTBMSzs7Ozs7Ozs7Ozs7Ozs7SUMzTUYsY0FDWCxTQUFBLFdBQUEsQ0FDUyxFQURULEVBRVMsT0FGVCxFQUdTLEtBSFQsRUFJUyxRQUpULEVBS1MsVUFMVCxFQU1FO0VBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsV0FBQSxDQUFBLENBQUE7O0VBQUEsSUFBQSxDQUxPLEVBS1AsR0FMTyxFQUtQLENBQUE7RUFBQSxJQUFBLENBSk8sT0FJUCxHQUpPLE9BSVAsQ0FBQTtFQUFBLElBQUEsQ0FITyxLQUdQLEdBSE8sS0FHUCxDQUFBO0VBQUEsSUFBQSxDQUZPLFFBRVAsR0FGTyxRQUVQLENBQUE7RUFBQSxJQUFBLENBRE8sVUFDUCxHQURPLFVBQ1AsQ0FBQTs7OztvQkFHVzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1hmLElBQUEsS0FBQSxHQUFBLDRCQUFBLENBQUEsVUFBQSxDQUFBLENBQUE7O0FBRUEsSUFBQSxjQUFBLEdBQUEsMkJBQUEsQ0FBQSxrQkFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxZQUFBLEdBQUEsMkJBQUEsQ0FBQSxnQkFBQSxDQUFBLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7SUFhWTs7OztXQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0dBQUEsaURBQUE7O0lBU0E7Ozs7V0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7R0FBQSxtREFBQTs7QUF1RVosSUFBSSxTQUFTLEdBQUcsQ0FBaEIsQ0FBQTs7SUFFYTs7Ozs7Ozs7O3dCQXdEaUI7TUFDMUIsT0FBTyxDQUFQLENBQUE7S0FDRDs7Ozs7Ozs7RUEyQkQsU0FBQSxXQUFBLENBQUEsSUFBQSxFQUdHO0lBQUEsSUFBQSxLQUFBLEdBQUEsSUFBQSxDQUFBOztJQUFBLElBSFksV0FHWixHQUFBLElBQUEsQ0FIWSxXQUdaO1FBSHlCLFNBR3pCLEdBQUEsSUFBQSxDQUh5QixTQUd6QixDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLFdBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLGNBQUEsRUF0RjBCLElBc0YxQixDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsU0FBQSxFQW5GeUIsSUFtRnpCLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxPQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxZQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxVQUFBLEVBdEV3QjtNQUN6QixJQUFJLEVBQUcsSUFEa0I7TUFFekIsSUFBSSxFQUFHLElBRmtCO01BR3pCLEtBQUssRUFBRSxJQUFBO0tBbUVOLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxhQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxVQUFBLEVBN0R1QixFQTZEdkIsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLFdBQUEsRUExRG9DLElBMERwQyxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsYUFBQSxFQXhEaUMsRUF3RGpDLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxnQkFBQSxFQWxEQztNQUNGLE9BQU8sRUFBRSxJQURQO01BRUYsS0FBSyxFQUFFLElBRkw7TUFHRixXQUFXLEVBQUUsSUFBQTtLQStDWixDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsV0FBQSxFQTNDdUMsSUEyQ3ZDLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxlQUFBLEVBekNhLEtBeUNiLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxpQkFBQSxFQXhDZSxLQXdDZixDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsY0FBQSxFQXZDWSxLQXVDWixDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsU0FBQSxFQXRDTyxLQXNDUCxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsVUFBQSxFQXJDUSxJQXFDUixDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsUUFBQSxFQXBDMkIsSUFvQzNCLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxZQUFBLEVBbENVLElBa0NWLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxRQUFBLEVBekJNLEtBQUssQ0FBQyxRQUFOLENBQ1AsVUFBNkIsU0FBN0IsRUFBNkM7TUFDM0MsSUFBQSxDQUFLLElBQUwsQ0FBVSxTQUFWLENBQUEsQ0FBQTtLQUZLLEVBSVAsd0VBSk8sQ0F5Qk4sQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLFFBQUEsRUFuQjBCOztNQUUzQixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU4sQ0FBYyxTQUFkLEVBRm9COztNQUkzQixJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU4sQ0FBYyxTQUFkLEVBSnFCOztNQU0zQixHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU4sQ0FBYyxTQUFkLEVBTnNCOztNQVEzQixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU4sQ0FBYyxTQUFkLEVBUm9COztNQVUzQixRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU4sQ0FBYyxTQUFkLEVBQUE7S0FTVCxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsS0FBQSxFQU5vQixTQUFTLEVBTTdCLENBQUEsQ0FBQTs7SUFDRCxJQUFBLENBQUssVUFBTCxHQUFrQixTQUFsQixDQUFBO0lBQ0EsSUFBQSxDQUFLLFdBQUwsR0FBbUIsV0FBbkIsQ0FBQTtJQUVBLElBQU0sSUFBSSxHQUFHLElBQWIsQ0FBQTtJQUVBLElBQUEsQ0FBSyxNQUFMLEdBQWMsRUFBZCxDQUFBOztJQU5DLElBQUEsS0FBQSxHQUFBLFNBQUEsS0FBQSxDQVFVLEdBUlYsRUFBQTtNQVNDLE1BQU0sQ0FBQyxjQUFQLENBQXNCLEtBQUksQ0FBQyxNQUEzQixFQUFtQyxHQUFuQyxFQUF3QztRQUN0QyxHQURzQyxFQUFBLFNBQUEsR0FBQSxHQUMvQjtVQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUQsQ0FBWCxDQUFBO1NBQWtCO09BRDdCLENBQUEsQ0FBQTtLQVRELENBQUE7O0lBUUQsS0FBSyxJQUFNLEdBQVgsSUFBa0IsWUFBbEIsRUFBZ0M7TUFBQSxLQUFBLENBQXJCLEdBQXFCLENBQUEsQ0FBQTtLQUkvQjs7SUFaQSxJQUFBLE1BQUEsR0FBQSxTQUFBLE1BQUEsQ0FjVSxJQWRWLEVBQUE7TUFlQyxNQUFNLENBQUMsY0FBUCxDQUFzQixLQUFJLENBQUMsTUFBM0IsRUFBbUMsSUFBbkMsRUFBd0M7UUFDdEMsS0FBSyxFQUFFLFNBQUEsS0FBQSxHQUFBO1VBQUEsT0FBYSxJQUFJLENBQUMsSUFBRCxDQUFKLENBQUEsS0FBQSxDQUFBLElBQUksRUFBQSxTQUFBLENBQWpCLENBQUE7U0FBQTtPQURULENBQUEsQ0FBQTtLQWZELENBQUE7O0lBY0QsS0FBSyxJQUFNLElBQVgsSUFBa0IsYUFBbEIsRUFBaUM7TUFBQSxNQUFBLENBQXRCLElBQXNCLENBQUEsQ0FBQTtLQUloQzs7SUFFRCxJQUFBLENBQUssVUFBTCxDQUFnQixrQkFBaEIsRUFBb0M7TUFBRSxXQUFXLEVBQUUsSUFBQTtLQUFuRCxDQUFBLENBQUE7R0FDRDs7OztnQ0FFWSxTQUErQixPQUFrQyxhQUFtQztNQUMvRyxJQUFNLFlBQVksR0FBRyxJQUFBLENBQUssYUFBTCxDQUFtQixPQUFuQixFQUE0QixLQUE1QixFQUFtQyxXQUFuQyxFQUFnRCxJQUFoRCxDQUFyQixDQUFBO01BQ0EsSUFBTSxXQUFXLEdBQUcsSUFBQSxDQUFLLFFBQUwsQ0FBYyxZQUFkLENBQXBCLENBQUE7O01BRUEsSUFBQSxDQUFLLFVBQUwsQ0FBZ0IsbUJBQWhCLEVBQXFDO1FBQ25DLE9BQU8sRUFBUCxPQURtQztRQUVuQyxLQUFLLEVBQUwsS0FGbUM7UUFHbkMsV0FBVyxFQUFYLFdBSG1DO1FBSW5DLFlBQVksRUFBWixZQUptQztRQUtuQyxXQUFXLEVBQVgsV0FMbUM7UUFNbkMsSUFBSSxFQUFFLE1BTjZCO1FBT25DLFdBQVcsRUFBRSxJQUFBO09BUGYsQ0FBQSxDQUFBO0tBU0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQWlDTSxRQUFxQixjQUE0QixTQUEyQjtNQUNqRixJQUFJLElBQUEsQ0FBSyxXQUFMLEVBQUEsSUFDQSxDQUFDLElBQUEsQ0FBSyxhQUROLElBRUEsSUFBQSxDQUFLLFFBQUwsQ0FBYyxNQUFkLElBQXdCLE1BQU0sQ0FBQyxJQUFQLEtBQWdCLFNBQWhCLEdBQTRCLENBQTVCLEdBQWdDLENBQXhELENBRkEsSUFHQSxDQUFDLFlBQVksQ0FBQyxPQUFiLENBQXFCLE1BQU0sQ0FBQyxJQUE1QixDQUFBLENBQWtDLE9BSHZDLEVBR2dEO1FBQzlDLE9BQU8sS0FBUCxDQUFBO09BQ0Q7O01BRUQsS0FBSyxDQUFDLFVBQU4sQ0FBaUIsSUFBQSxDQUFLLFFBQXRCLEVBQWdDLE1BQWhDLENBQUEsQ0FBQTtNQUVBLElBQUEsQ0FBSyxZQUFMLEdBQW9CLFlBQXBCLENBQUE7TUFDQSxJQUFBLENBQUssT0FBTCxHQUFvQixPQUFwQixDQUFBO01BQ0EsSUFBQSxDQUFLLElBQUwsR0FBb0IsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsT0FBckIsQ0FBcEIsQ0FBQTtNQUNBLElBQUEsQ0FBSyxLQUFMLEdBQW9CLElBQUEsQ0FBSyxRQUFMLENBQWMsS0FBZCxHQUNoQixLQUFLLENBQUMsTUFBTixDQUFhLEVBQWIsRUFBaUIsSUFBQSxDQUFLLFFBQUwsQ0FBYyxLQUEvQixDQURnQixHQUVoQjtRQUFFLElBQUksRUFBRSxJQUFSO1FBQWMsS0FBSyxFQUFFLElBQXJCO1FBQTJCLEdBQUcsRUFBRSxJQUFoQztRQUFzQyxNQUFNLEVBQUUsSUFBQTtPQUZsRCxDQUFBO01BR0EsSUFBQSxDQUFLLFFBQUwsR0FBb0IsS0FBcEIsQ0FBQTtNQUNBLElBQUEsQ0FBSyxZQUFMLEdBQW9CLElBQUEsQ0FBSyxRQUFMLENBQWM7UUFDaEMsV0FBVyxFQUFFLElBRG1CO1FBRWhDLEtBQUssRUFBRSxJQUFBLENBQUssU0FGb0I7UUFHaEMsS0FBSyxFQUFFLE9BQUE7T0FIVyxDQUFBLElBSWQsQ0FBQyxJQUFBLENBQUssUUFKWixDQUFBO01BTUEsT0FBTyxJQUFBLENBQUssWUFBWixDQUFBO0tBQ0Q7OztnQ0FFWSxTQUErQixPQUFrQyxhQUFtQztNQUMvRyxJQUFJLENBQUMsSUFBQSxDQUFLLFVBQU4sSUFBb0IsRUFBRSxJQUFBLENBQUssWUFBTCxJQUFxQixJQUFBLENBQUssWUFBTCxDQUFrQixTQUF6QyxDQUF4QixFQUE2RTtRQUMzRSxJQUFBLENBQUssYUFBTCxDQUFtQixPQUFuQixFQUE0QixLQUE1QixFQUFtQyxXQUFuQyxFQUFnRCxLQUFoRCxDQUFBLENBQUE7T0FDRDs7TUFFRCxJQUFNLGFBQWEsR0FBSSxJQUFBLENBQUssTUFBTCxDQUFZLEdBQVosQ0FBZ0IsSUFBaEIsQ0FBcUIsQ0FBckIsS0FBMkIsSUFBQSxDQUFLLE1BQUwsQ0FBWSxJQUFaLENBQWlCLElBQWpCLENBQXNCLENBQWpELElBQ0EsSUFBQSxDQUFLLE1BQUwsQ0FBWSxHQUFaLENBQWdCLElBQWhCLENBQXFCLENBQXJCLEtBQTJCLElBQUEsQ0FBSyxNQUFMLENBQVksSUFBWixDQUFpQixJQUFqQixDQUFzQixDQURqRCxJQUVBLElBQUEsQ0FBSyxNQUFMLENBQVksR0FBWixDQUFnQixNQUFoQixDQUF1QixDQUF2QixLQUE2QixJQUFBLENBQUssTUFBTCxDQUFZLElBQVosQ0FBaUIsTUFBakIsQ0FBd0IsQ0FGckQsSUFHQSxJQUFBLENBQUssTUFBTCxDQUFZLEdBQVosQ0FBZ0IsTUFBaEIsQ0FBdUIsQ0FBdkIsS0FBNkIsSUFBQSxDQUFLLE1BQUwsQ0FBWSxJQUFaLENBQWlCLE1BQWpCLENBQXdCLENBSDVFLENBQUE7TUFLQSxJQUFJLEVBQUosQ0FBQTtNQUNBLElBQUksRUFBSixDQVgrRzs7TUFjL0csSUFBSSxJQUFBLENBQUssYUFBTCxJQUFzQixDQUFDLElBQUEsQ0FBSyxlQUFoQyxFQUFpRDtRQUMvQyxFQUFFLEdBQUcsSUFBQSxDQUFLLE1BQUwsQ0FBWSxHQUFaLENBQWdCLE1BQWhCLENBQXVCLENBQXZCLEdBQTJCLElBQUEsQ0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixNQUFsQixDQUF5QixDQUF6RCxDQUFBO1FBQ0EsRUFBRSxHQUFHLElBQUEsQ0FBSyxNQUFMLENBQVksR0FBWixDQUFnQixNQUFoQixDQUF1QixDQUF2QixHQUEyQixJQUFBLENBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsTUFBbEIsQ0FBeUIsQ0FBekQsQ0FBQTtRQUVBLElBQUEsQ0FBSyxlQUFMLEdBQXVCLEtBQUssQ0FBQyxLQUFOLENBQVksRUFBWixFQUFnQixFQUFoQixDQUFBLEdBQXNCLElBQUEsQ0FBSyxvQkFBbEQsQ0FBQTtPQUNEOztNQUVELElBQU0sWUFBWSxHQUFHLElBQUEsQ0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQXJCLENBQUE7TUFDQSxJQUFNLFNBQVMsR0FBRztRQUNoQixPQUFPLEVBQVAsT0FEZ0I7UUFFaEIsWUFBWSxFQUFaLFlBRmdCO1FBR2hCLFdBQVcsRUFBRSxJQUFBLENBQUssUUFBTCxDQUFjLFlBQWQsQ0FIRztRQUloQixLQUFLLEVBQUwsS0FKZ0I7UUFLaEIsSUFBSSxFQUFFLE1BTFU7UUFNaEIsV0FBVyxFQUFYLFdBTmdCO1FBT2hCLEVBQUUsRUFBRixFQVBnQjtRQVFoQixFQUFFLEVBQUYsRUFSZ0I7UUFTaEIsU0FBUyxFQUFFLGFBVEs7UUFVaEIsV0FBVyxFQUFFLElBQUE7T0FWZixDQUFBOztNQWFBLElBQUksQ0FBQyxhQUFMLEVBQW9COztRQUVsQixLQUFLLENBQUMsT0FBTixDQUFjLGdCQUFkLENBQStCLElBQUEsQ0FBSyxNQUFMLENBQVksUUFBM0MsRUFBcUQsSUFBQSxDQUFLLE1BQUwsQ0FBWSxLQUFqRSxDQUFBLENBQUE7T0FDRDs7TUFFRCxJQUFBLENBQUssVUFBTCxDQUFnQixtQkFBaEIsRUFBcUMsU0FBckMsQ0FBQSxDQUFBOztNQUVBLElBQUksQ0FBQyxhQUFELElBQWtCLENBQUMsSUFBQSxDQUFLLFVBQTVCLEVBQXdDOztRQUV0QyxJQUFJLElBQUEsQ0FBSyxXQUFMLEVBQUosRUFBd0I7VUFDdEIsU0FBUyxDQUFDLElBQVYsR0FBaUIsSUFBakIsQ0FBQTtVQUNBLElBQUEsQ0FBSyxJQUFMLENBQVUsU0FBVixDQUFBLENBQUE7U0FDRDs7UUFFRCxJQUFJLElBQUEsQ0FBSyxlQUFULEVBQTBCO1VBQ3hCLEtBQUssQ0FBQyxPQUFOLENBQWMsVUFBZCxDQUF5QixJQUFBLENBQUssTUFBTCxDQUFZLElBQXJDLEVBQTJDLElBQUEsQ0FBSyxNQUFMLENBQVksR0FBdkQsQ0FBQSxDQUFBO1NBQ0Q7T0FDRjtLQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3lCQW9CSyxXQUFZO01BQ2hCLElBQUksQ0FBQyxTQUFELElBQWMsQ0FBQyxTQUFTLENBQUMsS0FBN0IsRUFBb0M7UUFDbEMsS0FBSyxDQUFDLE9BQU4sQ0FBYyxhQUFkLENBQTRCLElBQUEsQ0FBSyxNQUFMLENBQVksS0FBeEMsQ0FBQSxDQUFBO09BQ0Q7O01BRUQsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFOLENBQWE7UUFDdkIsT0FBTyxFQUFFLElBQUEsQ0FBSyxjQUFMLENBQW9CLE9BRE47UUFFdkIsS0FBSyxFQUFFLElBQUEsQ0FBSyxjQUFMLENBQW9CLEtBRko7UUFHdkIsV0FBVyxFQUFFLElBQUEsQ0FBSyxjQUFMLENBQW9CLFdBSFY7UUFJdkIsV0FBVyxFQUFFLElBQUE7T0FKSCxFQUtULFNBQVMsSUFBSSxFQUxKLENBQVosQ0FBQTtNQU9BLFNBQVMsQ0FBQyxLQUFWLEdBQWtCLE1BQWxCLENBQUE7O01BRUEsSUFBQSxDQUFLLFFBQUwsQ0FBYyxTQUFkLENBQUEsQ0FBQTs7Ozs7OEJBSVMsU0FBK0IsT0FBa0MsYUFBbUMsZ0JBQXNDO01BQ25KLElBQUksWUFBWSxHQUFHLElBQUEsQ0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQW5CLENBQUE7O01BRUEsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUF0QixFQUF5QjtRQUN2QixZQUFZLEdBQUcsSUFBQSxDQUFLLGFBQUwsQ0FBbUIsT0FBbkIsRUFBNEIsS0FBNUIsRUFBbUMsV0FBbkMsRUFBZ0QsS0FBaEQsQ0FBZixDQUFBO09BQ0Q7O01BRUQsSUFBTSxJQUFJLEdBQUcsVUFBQSxDQUFXLElBQVgsQ0FBZ0IsS0FBSyxDQUFDLElBQXRCLENBQUEsR0FBOEIsUUFBOUIsR0FBeUMsSUFBdEQsQ0FBQTs7TUFFQSxJQUFBLENBQUssVUFBTCxDQUFBLGVBQUEsQ0FBQSxNQUFBLENBQWdDLElBQWhDLENBQUEsRUFBcUY7UUFDbkYsT0FBTyxFQUFQLE9BRG1GO1FBRW5GLFlBQVksRUFBWixZQUZtRjtRQUduRixXQUFXLEVBQUUsSUFBQSxDQUFLLFFBQUwsQ0FBYyxZQUFkLENBSHNFO1FBSW5GLEtBQUssRUFBTCxLQUptRjtRQUtuRixXQUFXLEVBQVgsV0FMbUY7UUFNbkYsSUFBSSxFQUFFLElBTjZFO1FBT25GLGNBQWMsRUFBZCxjQVBtRjtRQVFuRixXQUFXLEVBQUUsSUFBQTtPQVJmLENBQUEsQ0FBQTs7TUFXQSxJQUFJLENBQUMsSUFBQSxDQUFLLFVBQVYsRUFBc0I7UUFDcEIsSUFBQSxDQUFLLEdBQUwsQ0FBUyxLQUFULENBQUEsQ0FBQTtPQUNEOztNQUVELElBQUEsQ0FBSyxhQUFMLEdBQXFCLEtBQXJCLENBQUE7TUFDQSxJQUFBLENBQUssYUFBTCxDQUFtQixPQUFuQixFQUE0QixLQUE1QixDQUFBLENBQUE7S0FDRDs7O2lDQUVhLE9BQU87TUFDbkIsSUFBQSxDQUFLLEdBQUwsQ0FBUyxLQUFULENBQUEsQ0FBQTs7TUFDQSxJQUFBLENBQUssVUFBTCxDQUFnQixtQkFBaEIsRUFBcUM7UUFBRSxLQUFLLEVBQUwsS0FBRjtRQUFTLElBQUksRUFBRSxNQUFmO1FBQXVCLFdBQVcsRUFBRSxJQUFBO09BQXpFLENBQUEsQ0FBQTtLQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt3QkFrQkksT0FBbUM7TUFDdEMsSUFBQSxDQUFLLE9BQUwsR0FBZSxJQUFmLENBQUE7TUFDQSxLQUFLLEdBQUcsS0FBSyxJQUFJLElBQUEsQ0FBSyxjQUFMLENBQW9CLEtBQXJDLENBQUE7TUFDQSxJQUFJLGNBQUosQ0FBQTs7TUFFQSxJQUFJLElBQUEsQ0FBSyxXQUFMLEVBQUosRUFBd0I7UUFDdEIsY0FBYyxHQUFHLElBQUEsQ0FBSyxRQUFMLENBQWM7VUFDN0IsS0FBSyxFQUFMLEtBRDZCO1VBRTdCLFdBQVcsRUFBRSxJQUZnQjtVQUc3QixLQUFLLEVBQUUsS0FBQTtTQUhRLENBQWpCLENBQUE7T0FLRDs7TUFFRCxJQUFBLENBQUssT0FBTCxHQUFlLEtBQWYsQ0FBQTs7TUFFQSxJQUFJLGNBQWMsS0FBSyxJQUF2QixFQUE2QjtRQUMzQixJQUFBLENBQUssSUFBTCxFQUFBLENBQUE7T0FDRDtLQUNGOzs7b0NBRWdCO01BQ2YsT0FBTyxJQUFBLENBQUssWUFBTCxHQUFvQixJQUFBLENBQUssUUFBTCxDQUFjLElBQWxDLEdBQXlDLElBQWhELENBQUE7S0FDRDs7O2tDQUVjO01BQ2IsT0FBTyxJQUFBLENBQUssWUFBWixDQUFBO0tBQ0Q7Ozs7OzJCQUdPO01BQ04sSUFBQSxDQUFLLFVBQUwsQ0FBZ0IsbUJBQWhCLEVBQXFDO1FBQUUsV0FBVyxFQUFFLElBQUE7T0FBcEQsQ0FBQSxDQUFBOztNQUVBLElBQUEsQ0FBSyxZQUFMLEdBQW9CLElBQUEsQ0FBSyxPQUFMLEdBQWUsSUFBbkMsQ0FBQTtNQUVBLElBQUEsQ0FBSyxZQUFMLEdBQW9CLEtBQXBCLENBQUE7TUFDQSxJQUFBLENBQUssUUFBTCxHQUFnQixJQUFoQixDQUFBO01BQ0EsSUFBQSxDQUFLLFFBQUwsQ0FBYyxJQUFkLEdBQXFCLElBQUEsQ0FBSyxTQUFMLEdBQWlCLElBQXRDLENBQUE7S0FDRDs7O29DQUVnQixTQUFTO01BQ3hCLElBQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFOLENBQWMsWUFBZCxDQUEyQixPQUEzQixDQUFsQixDQUR3Qjs7TUFJeEIsT0FBUSxJQUFBLENBQUssV0FBTCxLQUFxQixPQUFyQixJQUFnQyxJQUFBLENBQUssV0FBTCxLQUFxQixLQUF0RCxHQUNILElBQUEsQ0FBSyxRQUFMLENBQWMsTUFBZCxHQUF1QixDQURwQixHQUVILEtBQUssQ0FBQyxHQUFOLENBQVUsU0FBVixDQUFvQixJQUFBLENBQUssUUFBekIsRUFBbUMsVUFBQSxVQUFVLEVBQUE7UUFBQSxPQUFJLFVBQVUsQ0FBQyxFQUFYLEtBQWtCLFNBQXRCLENBQUE7T0FBN0MsQ0FGSixDQUFBO0tBR0Q7OzttQ0FFZSxTQUFTO01BQ3ZCLE9BQU8sSUFBQSxDQUFLLFFBQUwsQ0FBYyxJQUFBLENBQUssZUFBTCxDQUFxQixPQUFyQixDQUFkLENBQVAsQ0FBQTtLQUNEOzs7a0NBRWMsU0FBK0IsT0FBa0MsYUFBbUMsTUFBZ0I7TUFDakksSUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU4sQ0FBYyxZQUFkLENBQTJCLE9BQTNCLENBQVgsQ0FBQTtNQUNBLElBQUksWUFBWSxHQUFHLElBQUEsQ0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQW5CLENBQUE7TUFDQSxJQUFJLFdBQVcsR0FBRyxJQUFBLENBQUssUUFBTCxDQUFjLFlBQWQsQ0FBbEIsQ0FBQTtNQUVBLElBQUksR0FBRyxJQUFJLEtBQUssS0FBVCxHQUNILEtBREcsR0FFSCxJQUFJLElBQUksZ0JBQUEsQ0FBaUIsSUFBakIsQ0FBc0IsS0FBSyxDQUFDLElBQTVCLENBRlosQ0FBQTs7TUFJQSxJQUFJLENBQUMsV0FBTCxFQUFrQjtRQUNoQixXQUFXLEdBQUcsSUFBSSxZQUFBLENBQUEsU0FBQSxDQUFKLENBQ1osRUFEWSxFQUVaLE9BRlksRUFHWixLQUhZLEVBSVosSUFKWSxFQUtaLElBTFksQ0FBZCxDQUFBO1FBUUEsWUFBWSxHQUFHLElBQUEsQ0FBSyxRQUFMLENBQWMsTUFBN0IsQ0FBQTtRQUNBLElBQUEsQ0FBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixXQUFuQixDQUFBLENBQUE7T0FWRixNQVlLO1FBQ0gsV0FBVyxDQUFDLE9BQVosR0FBc0IsT0FBdEIsQ0FBQTtPQUNEOztNQUVELEtBQUssQ0FBQyxPQUFOLENBQWMsU0FBZCxDQUF3QixJQUFBLENBQUssTUFBTCxDQUFZLEdBQXBDLEVBQXlDLElBQUEsQ0FBSyxRQUFMLENBQWMsR0FBZCxDQUFrQixVQUFBLENBQUMsRUFBQTtRQUFBLE9BQUksQ0FBQyxDQUFDLE9BQU4sQ0FBQTtPQUFuQixDQUF6QyxFQUE0RSxJQUFBLENBQUssSUFBTCxFQUE1RSxDQUFBLENBQUE7TUFDQSxLQUFLLENBQUMsT0FBTixDQUFjLGNBQWQsQ0FBNkIsSUFBQSxDQUFLLE1BQUwsQ0FBWSxLQUF6QyxFQUFnRCxJQUFBLENBQUssTUFBTCxDQUFZLElBQTVELEVBQWtFLElBQUEsQ0FBSyxNQUFMLENBQVksR0FBOUUsQ0FBQSxDQUFBOztNQUVBLElBQUksSUFBSixFQUFVO1FBQ1IsSUFBQSxDQUFLLGFBQUwsR0FBcUIsSUFBckIsQ0FBQTtRQUVBLFdBQVcsQ0FBQyxRQUFaLEdBQXVCLElBQUEsQ0FBSyxNQUFMLENBQVksR0FBWixDQUFnQixTQUF2QyxDQUFBO1FBQ0EsV0FBVyxDQUFDLFVBQVosR0FBeUIsV0FBekIsQ0FBQTtRQUNBLEtBQUssQ0FBQyxPQUFOLENBQWMsYUFBZCxDQUE0QixJQUFBLENBQUssV0FBakMsRUFBOEMsT0FBOUMsQ0FBQSxDQUFBOztRQUVBLElBQUksQ0FBQyxJQUFBLENBQUssV0FBTCxFQUFMLEVBQXlCO1VBQ3ZCLEtBQUssQ0FBQyxPQUFOLENBQWMsVUFBZCxDQUF5QixJQUFBLENBQUssTUFBTCxDQUFZLEtBQXJDLEVBQTRDLElBQUEsQ0FBSyxNQUFMLENBQVksR0FBeEQsQ0FBQSxDQUFBO1VBQ0EsS0FBSyxDQUFDLE9BQU4sQ0FBYyxVQUFkLENBQXlCLElBQUEsQ0FBSyxNQUFMLENBQVksSUFBckMsRUFBMkMsSUFBQSxDQUFLLE1BQUwsQ0FBWSxHQUF2RCxDQUFBLENBQUE7VUFFQSxJQUFBLENBQUssU0FBTCxHQUFpQixLQUFqQixDQUFBO1VBQ0EsSUFBQSxDQUFLLGVBQUwsR0FBdUIsS0FBdkIsQ0FBQTtTQUNEO09BQ0Y7O01BRUQsSUFBQSxDQUFLLG9CQUFMLENBQTBCLE9BQTFCLEVBQW1DLEtBQW5DLEVBQTBDLFdBQTFDLENBQUEsQ0FBQTs7TUFFQSxJQUFBLENBQUssVUFBTCxDQUFnQiw2QkFBaEIsRUFBK0M7UUFDN0MsT0FBTyxFQUFQLE9BRDZDO1FBRTdDLEtBQUssRUFBTCxLQUY2QztRQUc3QyxXQUFXLEVBQVgsV0FINkM7UUFJN0MsSUFBSSxFQUFKLElBSjZDO1FBSzdDLFdBQVcsRUFBWCxXQUw2QztRQU03QyxZQUFZLEVBQVosWUFONkM7UUFPN0MsV0FBVyxFQUFFLElBQUE7T0FQZixDQUFBLENBQUE7O01BVUEsT0FBTyxZQUFQLENBQUE7S0FDRDs7O2tDQUVjLFNBQStCLE9BQWtDO01BQzlFLElBQU0sWUFBWSxHQUFHLElBQUEsQ0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQXJCLENBQUE7O01BRUEsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUF0QixFQUF5QjtRQUFFLE9BQUE7T0FBUTs7TUFFbkMsSUFBTSxXQUFXLEdBQUcsSUFBQSxDQUFLLFFBQUwsQ0FBYyxZQUFkLENBQXBCLENBQUE7O01BRUEsSUFBQSxDQUFLLFVBQUwsQ0FBZ0IsNkJBQWhCLEVBQStDO1FBQzdDLE9BQU8sRUFBUCxPQUQ2QztRQUU3QyxLQUFLLEVBQUwsS0FGNkM7UUFHN0MsV0FBVyxFQUFFLElBSGdDO1FBSTdDLFlBQVksRUFBWixZQUo2QztRQUs3QyxXQUFXLEVBQVgsV0FMNkM7UUFNN0MsV0FBVyxFQUFFLElBQUE7T0FOZixDQUFBLENBQUE7O01BU0EsSUFBQSxDQUFLLFFBQUwsQ0FBYyxNQUFkLENBQXFCLFlBQXJCLEVBQW1DLENBQW5DLENBQUEsQ0FBQTtLQUNEOzs7eUNBRXFCLFNBQVMsT0FBTyxhQUFhO01BQ2pELElBQUEsQ0FBSyxjQUFMLENBQW9CLE9BQXBCLEdBQThCLE9BQTlCLENBQUE7TUFDQSxJQUFBLENBQUssY0FBTCxDQUFvQixLQUFwQixHQUE0QixLQUE1QixDQUFBO01BQ0EsSUFBQSxDQUFLLGNBQUwsQ0FBb0IsV0FBcEIsR0FBa0MsV0FBbEMsQ0FBQTtLQUNEOzs7OEJBRVU7TUFDVCxJQUFBLENBQUssY0FBTCxDQUFvQixPQUFwQixHQUE4QixJQUE5QixDQUFBO01BQ0EsSUFBQSxDQUFLLGNBQUwsQ0FBb0IsS0FBcEIsR0FBNEIsSUFBNUIsQ0FBQTtNQUNBLElBQUEsQ0FBSyxjQUFMLENBQW9CLFdBQXBCLEdBQWtDLElBQWxDLENBQUE7S0FDRDs7O3lDQUUyQyxPQUFrQyxPQUFVLFFBQWtCLE1BQWU7TUFDdkgsT0FBTyxJQUFJLGNBQUEsQ0FBQSxTQUFBLENBQUosQ0FBd0IsSUFBeEIsRUFBOEIsS0FBOUIsRUFBcUMsSUFBQSxDQUFLLFFBQUwsQ0FBYyxJQUFuRCxFQUF5RCxLQUF6RCxFQUFnRSxJQUFBLENBQUssT0FBckUsRUFBOEUsTUFBOUUsRUFBc0YsSUFBdEYsQ0FBUCxDQUFBO0tBQ0Q7OzsrQkFFaUMsUUFBNkI7TUFDN0QsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsSUFBbEIsQ0FBdUIsTUFBdkIsQ0FBQSxDQUFBOztNQUVBLElBQUksQ0FBQyxJQUFBLENBQUssU0FBTixJQUFtQixNQUFNLENBQUMsU0FBUCxJQUFvQixJQUFBLENBQUssU0FBTCxDQUFlLFNBQTFELEVBQXFFO1FBQ25FLElBQUEsQ0FBSyxTQUFMLEdBQWlCLE1BQWpCLENBQUE7T0FDRDtLQUNGOzs7NkJBRStCLFdBQWdGO01BQUEsSUFDdEcsS0FEc0csR0FDdkUsU0FEdUUsQ0FDdEcsS0FEc0c7VUFDL0YsS0FEK0YsR0FDdkUsU0FEdUUsQ0FDL0YsS0FEK0Y7VUFDeEYsTUFEd0YsR0FDdkUsU0FEdUUsQ0FDeEYsTUFEd0Y7VUFDaEYsSUFEZ0YsR0FDdkUsU0FEdUUsQ0FDaEYsSUFEZ0YsQ0FBQTtNQUFBLElBRXRHLElBRnNHLEdBRTdGLElBRjZGLENBRXRHLElBRnNHLENBQUE7O01BSTlHLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxNQUF0QixFQUE4Qjs7UUFFNUIsS0FBSyxDQUFDLElBQU4sQ0FBVyxRQUFYLENBQW9CLElBQUEsQ0FBSyxLQUF6QixFQUFnQyxJQUFoQyxFQUFzQyxJQUFBLENBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsT0FBbEIsQ0FBMEIsV0FBNUMsQ0FBdEMsQ0FBQSxDQUFBO1FBRUEsSUFBSSxDQUFDLEtBQUwsR0FBYSxJQUFJLENBQUMsS0FBTCxHQUFhLElBQUksQ0FBQyxJQUEvQixDQUFBO1FBQ0EsSUFBSSxDQUFDLE1BQUwsR0FBYyxJQUFJLENBQUMsTUFBTCxHQUFjLElBQUksQ0FBQyxHQUFqQyxDQUFBO09BQ0Q7O01BRUQsSUFBTSxZQUFZLEdBQUcsSUFBQSxDQUFLLFVBQUwsQ0FBQSw2QkFBQSxDQUFBLE1BQUEsQ0FBOEMsS0FBOUMsQ0FBQSxFQUE4RCxTQUE5RCxDQUFyQixDQUFBOztNQUVBLElBQUksWUFBWSxLQUFLLEtBQXJCLEVBQTRCO1FBQzFCLE9BQU8sS0FBUCxDQUFBO09BQ0Q7O01BRUQsSUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQVYsR0FBbUIsSUFBQSxDQUFLLG9CQUFMLENBQTBCLEtBQTFCLEVBQWlDLEtBQWpDLEVBQXdDLE1BQXhDLEVBQWdELElBQWhELENBQWxDLENBQUE7O01BRUEsSUFBQSxDQUFLLFVBQUwsQ0FBQSxzQkFBQSxDQUFBLE1BQUEsQ0FBdUMsS0FBdkMsQ0FBQSxFQUF1RCxTQUF2RCxDQUFBLENBQUE7O01BRUEsSUFBSSxLQUFLLEtBQUssT0FBZCxFQUF1QjtRQUFFLElBQUEsQ0FBSyxTQUFMLEdBQWlCLE1BQWpCLENBQUE7T0FBeUI7O01BRWxELElBQUEsQ0FBSyxVQUFMLENBQWdCLE1BQWhCLENBQUEsQ0FBQTs7TUFFQSxJQUFBLENBQUssVUFBTCxDQUFBLDRCQUFBLENBQUEsTUFBQSxDQUE2QyxLQUE3QyxDQUFBLEVBQTZELFNBQTdELENBQUEsQ0FBQTs7TUFFQSxPQUFPLElBQVAsQ0FBQTtLQUNEOzs7MkJBRU87TUFBRSxPQUFPLElBQUksQ0FBQyxHQUFMLEVBQVAsQ0FBQTtLQUFtQjs7Ozs7OztvQkFHaEI7Ozs7Ozs7Ozs7Ozs7QUNqbUJmLElBQUEsUUFBQSxHQUFBLDRCQUFBLENBQUEsYUFBQSxDQUFBLENBQUE7Ozs7OztBQVlBLElBQU0sTUFBTSxHQUFHO0VBQ2IsV0FBVyxFQUFFLENBQUMsa0JBQUQsRUFBcUIsWUFBckIsRUFBbUMsWUFBbkMsRUFBaUQsTUFBakQsQ0FEQTtFQUdiLE1BSGEsRUFBQSxTQUFBLE1BQUEsQ0FHTCxPQUhLLEVBR21CO0lBQzlCLEtBQUEsSUFBQSxFQUFBLEdBQUEsQ0FBQSxFQUFBLEVBQUEsR0FBcUIsTUFBTSxDQUFDLFdBQTVCLENBQUEsTUFBQSxFQUFBLEVBQUEsRUFBQSxFQUF5QztNQUFBLElBQUEsSUFBQSxDQUFBOztNQUFBLElBQUEsR0FBcEIsTUFBTSxDQUFDLFdBQWEsQ0FBQSxFQUFBLENBQUEsQ0FBQTtNQUFBLElBQTlCLE1BQThCLEdBQUEsSUFBQSxDQUFBO01BQ3ZDLElBQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFELENBQU4sQ0FBZSxPQUFmLENBQXBCLENBQUE7O01BRUEsSUFBSSxXQUFKLEVBQWlCO1FBQ2YsT0FBTyxXQUFQLENBQUE7T0FDRDtLQUNGOztJQUVELE9BQU8sSUFBUCxDQUFBO0dBWlc7O0VBZ0JiLGdCQWhCYSxFQUFBLFNBQUEsZ0JBQUEsQ0FBQSxLQUFBLEVBZ0JvRTtJQUFBLElBQTdELFdBQTZELEdBQUEsS0FBQSxDQUE3RCxXQUE2RDtRQUFoRCxTQUFnRCxHQUFBLEtBQUEsQ0FBaEQsU0FBZ0Q7UUFBckMsV0FBcUMsR0FBQSxLQUFBLENBQXJDLFdBQXFDO1FBQXhCLEtBQXdCLEdBQUEsS0FBQSxDQUF4QixLQUF3QixDQUFBOztJQUMvRSxJQUFJLENBQUMsYUFBQSxDQUFjLElBQWQsQ0FBbUIsU0FBbkIsQ0FBTCxFQUFvQztNQUNsQyxPQUFPLElBQVAsQ0FBQTtLQUNEOztJQUVELEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBMEIsS0FBSyxDQUFDLFlBQU4sQ0FBbUIsSUFBN0MsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQW1EO01BQUEsSUFBQSxLQUFBLENBQUE7O01BQUEsS0FBQSxHQUF6QixLQUFLLENBQUMsWUFBTixDQUFtQixJQUFNLENBQUEsR0FBQSxDQUFBLENBQUE7TUFBQSxJQUF4QyxXQUF3QyxHQUFBLEtBQUEsQ0FBQTtNQUNqRCxJQUFJLE9BQU8sR0FBRyxXQUFkLENBQUE7O01BRUEsSUFBSSxXQUFXLENBQUMsVUFBWixJQUEwQixXQUFXLENBQUMsVUFBWixDQUF1QixXQUFqRCxJQUNDLFdBQVcsQ0FBQyxXQUFaLEtBQTRCLFdBRGpDLEVBQytDO1FBQzdDLE9BQU8sT0FBUCxFQUFnQjs7VUFFZCxJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsT0FBNUIsRUFBcUM7WUFDbkMsT0FBTyxXQUFQLENBQUE7V0FDRDs7VUFDRCxPQUFPLEdBQUcsUUFBRyxDQUFDLFVBQUosQ0FBZSxPQUFmLENBQVYsQ0FBQTtTQUNEO09BQ0Y7S0FDRjs7SUFFRCxPQUFPLElBQVAsQ0FBQTtHQXBDVzs7RUF3Q2IsVUF4Q2EsRUFBQSxTQUFBLFVBQUEsQ0FBQSxLQUFBLEVBd0M0RDtJQUFBLElBQTNELFNBQTJELEdBQUEsS0FBQSxDQUEzRCxTQUEyRDtRQUFoRCxXQUFnRCxHQUFBLEtBQUEsQ0FBaEQsV0FBZ0Q7UUFBbkMsU0FBbUMsR0FBQSxLQUFBLENBQW5DLFNBQW1DO1FBQXhCLEtBQXdCLEdBQUEsS0FBQSxDQUF4QixLQUF3QixDQUFBOztJQUN2RSxJQUFJLFdBQVcsS0FBSyxPQUFoQixJQUEyQixXQUFXLEtBQUssS0FBL0MsRUFBc0Q7TUFDcEQsT0FBTyxJQUFQLENBQUE7S0FDRDs7SUFFRCxJQUFJLGNBQUosQ0FBQTs7SUFFQSxLQUFBLElBQUEsR0FBQSxHQUFBLENBQUEsRUFBQSxHQUFBLEdBQTBCLEtBQUssQ0FBQyxZQUFOLENBQW1CLElBQTdDLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFtRDtNQUFBLElBQUEsS0FBQSxDQUFBOztNQUFBLEtBQUEsR0FBekIsS0FBSyxDQUFDLFlBQU4sQ0FBbUIsSUFBTSxDQUFBLEdBQUEsQ0FBQSxDQUFBO01BQUEsSUFBeEMsV0FBd0MsR0FBQSxLQUFBLENBQUE7O01BQ2pELElBQUksV0FBVyxDQUFDLFdBQVosS0FBNEIsV0FBaEMsRUFBNkM7O1FBRTNDLElBQUksV0FBVyxDQUFDLFVBQVosSUFBMEIsQ0FBQyxZQUFZLENBQUMsV0FBRCxFQUFjLFNBQWQsQ0FBM0MsRUFBcUU7VUFBRSxTQUFBO1NBRjVCOzs7UUFLM0MsSUFBSSxXQUFXLENBQUMsV0FBWixFQUFKLEVBQStCO1VBQzdCLE9BQU8sV0FBUCxDQUFBO1NBREY7YUFJSyxJQUFJLENBQUMsY0FBTCxFQUFxQjtZQUN4QixjQUFjLEdBQUcsV0FBakIsQ0FBQTtXQUNEO09BQ0Y7S0FwQm9FOzs7O0lBeUJ2RSxJQUFJLGNBQUosRUFBb0I7TUFDbEIsT0FBTyxjQUFQLENBQUE7S0ExQnFFOzs7OztJQWdDdkUsS0FBQSxJQUFBLEdBQUEsR0FBQSxDQUFBLEVBQUEsR0FBQSxHQUEwQixLQUFLLENBQUMsWUFBTixDQUFtQixJQUE3QyxDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsRUFBbUQ7TUFBQSxJQUFBLEtBQUEsQ0FBQTs7TUFBQSxLQUFBLEdBQXpCLEtBQUssQ0FBQyxZQUFOLENBQW1CLElBQU0sQ0FBQSxHQUFBLENBQUEsQ0FBQTtNQUFBLElBQXhDLFlBQXdDLEdBQUEsS0FBQSxDQUFBOztNQUNqRCxJQUFJLFlBQVcsQ0FBQyxXQUFaLEtBQTRCLFdBQTVCLElBQTJDLEVBQUUsT0FBQSxDQUFRLElBQVIsQ0FBYSxTQUFiLENBQUEsSUFBMkIsWUFBVyxDQUFDLFVBQXpDLENBQS9DLEVBQXFHO1FBQ25HLE9BQU8sWUFBUCxDQUFBO09BQ0Q7S0FDRjs7SUFFRCxPQUFPLElBQVAsQ0FBQTtHQTlFVzs7RUFrRmIsVUFsRmEsRUFBQSxTQUFBLFVBQUEsQ0FBQSxLQUFBLEVBa0ZvQztJQUFBLElBQW5DLFNBQW1DLEdBQUEsS0FBQSxDQUFuQyxTQUFtQztRQUF4QixLQUF3QixHQUFBLEtBQUEsQ0FBeEIsS0FBd0IsQ0FBQTs7SUFDL0MsS0FBQSxJQUFBLEdBQUEsR0FBQSxDQUFBLEVBQUEsR0FBQSxHQUEwQixLQUFLLENBQUMsWUFBTixDQUFtQixJQUE3QyxDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsRUFBbUQ7TUFBQSxJQUFBLEtBQUEsQ0FBQTs7TUFBQSxLQUFBLEdBQXpCLEtBQUssQ0FBQyxZQUFOLENBQW1CLElBQU0sQ0FBQSxHQUFBLENBQUEsQ0FBQTtNQUFBLElBQXhDLFdBQXdDLEdBQUEsS0FBQSxDQUFBOztNQUNqRCxJQUFJLFlBQVksQ0FBQyxXQUFELEVBQWMsU0FBZCxDQUFoQixFQUEwQztRQUN4QyxPQUFPLFdBQVAsQ0FBQTtPQUNEO0tBQ0Y7O0lBRUQsT0FBTyxJQUFQLENBQUE7R0F6Rlc7O0VBNkZiLElBN0ZhLEVBQUEsU0FBQSxJQUFBLENBQUEsS0FBQSxFQTZGZ0M7SUFBQSxJQUFyQyxXQUFxQyxHQUFBLEtBQUEsQ0FBckMsV0FBcUM7UUFBeEIsS0FBd0IsR0FBQSxLQUFBLENBQXhCLEtBQXdCLENBQUE7O0lBQzNDLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBMEIsS0FBSyxDQUFDLFlBQU4sQ0FBbUIsSUFBN0MsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQW1EO01BQUEsSUFBQSxNQUFBLENBQUE7O01BQUEsTUFBQSxHQUF6QixLQUFLLENBQUMsWUFBTixDQUFtQixJQUFNLENBQUEsR0FBQSxDQUFBLENBQUE7TUFBQSxJQUF4QyxXQUF3QyxHQUFBLE1BQUEsQ0FBQTs7O01BRWpELElBQUksV0FBVyxDQUFDLFFBQVosQ0FBcUIsTUFBckIsS0FBZ0MsQ0FBcEMsRUFBdUM7UUFDckMsSUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFlBQTNCLENBRHFDOzs7UUFJckMsSUFBSSxNQUFNLElBQUksRUFBRSxNQUFNLENBQUMsT0FBUCxDQUFlLE9BQWYsSUFBMEIsTUFBTSxDQUFDLE9BQVAsQ0FBZSxPQUFmLENBQXVCLE9BQW5ELENBQWQsRUFBMkU7VUFDekUsU0FBQTtTQUNEO09BTkg7V0FTSyxJQUFJLFdBQVcsQ0FBQyxRQUFaLENBQXFCLE1BQXJCLElBQStCLENBQW5DLEVBQXNDO1VBQ3pDLFNBQUE7U0FDRDs7TUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVosRUFBRCxJQUErQixXQUFXLEtBQUssV0FBVyxDQUFDLFdBQS9ELEVBQTZFO1FBQzNFLE9BQU8sV0FBUCxDQUFBO09BQ0Q7S0FDRjs7SUFFRCxPQUFPLElBQVAsQ0FBQTtHQUNEO0NBbkhILENBQUE7O0FBc0hBLFNBQVMsWUFBVCxDQUF1QixXQUF2QixFQUEwRCxTQUExRCxFQUE2RTtFQUMzRSxPQUFPLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXJCLENBQTBCLFVBQUEsTUFBQSxFQUFBO0lBQUEsSUFBRyxFQUFILEdBQUEsTUFBQSxDQUFHLEVBQUgsQ0FBQTtJQUFBLE9BQVksRUFBRSxLQUFLLFNBQW5CLENBQUE7R0FBMUIsQ0FBUCxDQUFBO0NBQ0Q7O29CQUVjOzs7Ozs7Ozs7Ozs7OztBQ3RJZiwwRUFBQTs7QUFDQSxJQUFBLFlBQUEsR0FBQSwyQkFBQSxDQUFBLFdBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsT0FBQSxHQUFBLDRCQUFBLENBQUEsT0FBQSxDQUFBLENBQUE7O0FBQ0Esc0VBQUE7Ozs7Ozs7O0FBWUEsU0FBUyxjQUFULENBQXNELFFBQXRELEVBQXNGO0VBQ3BGLElBQUksdUJBQUEsQ0FBd0IsSUFBeEIsQ0FBNkIsUUFBN0IsQ0FBSixFQUE0QztJQUMxQyxJQUFBLENBQUssT0FBTCxDQUFhLGNBQWIsR0FBOEIsUUFBOUIsQ0FBQTtJQUNBLE9BQU8sSUFBUCxDQUFBO0dBQ0Q7O0VBRUQsSUFBSSxPQUFFLENBQUMsSUFBSCxDQUFRLFFBQVIsQ0FBSixFQUF1QjtJQUNyQixJQUFBLENBQUssT0FBTCxDQUFhLGNBQWIsR0FBOEIsUUFBUSxHQUFHLFFBQUgsR0FBYyxPQUFwRCxDQUFBO0lBQ0EsT0FBTyxJQUFQLENBQUE7R0FDRDs7RUFFRCxPQUFPLElBQUEsQ0FBSyxPQUFMLENBQWEsY0FBcEIsQ0FBQTtDQUNEOztBQUVELFNBQVMsc0JBQVQsQ0FBaUMsWUFBakMsRUFBc0UsS0FBdEUsRUFBNkYsS0FBN0YsRUFBMkc7RUFDekcsSUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsY0FBckMsQ0FBQTs7RUFFQSxJQUFJLE9BQU8sS0FBSyxPQUFoQixFQUF5QjtJQUFFLE9BQUE7R0FBUTs7RUFFbkMsSUFBSSxPQUFPLEtBQUssUUFBaEIsRUFBMEI7SUFDeEIsS0FBSyxDQUFDLGNBQU4sRUFBQSxDQUFBO0lBQ0EsT0FBQTtHQVB1Rzs7Ozs7O0VBZXpHLElBQUksWUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFPLGVBQVAsSUFBMEIscUJBQUEsQ0FBc0IsSUFBdEIsQ0FBMkIsS0FBSyxDQUFDLElBQWpDLENBQTlCLEVBQXNFO0lBQ3BFLElBQU0sR0FBRyxHQUFHLENBQUEsQ0FBQSxFQUFBLFdBQUEsQ0FBQSxTQUFBLEVBQVUsS0FBSyxDQUFDLE1BQWhCLENBQUEsQ0FBd0IsUUFBcEMsQ0FBQTtJQUNBLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxhQUFOLENBQW9CLEdBQXBCLENBQW5CLENBQUE7O0lBRUEsSUFBSSxFQUFFLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBM0IsQ0FBQSxJQUFzQyxVQUFVLENBQUMsTUFBWCxDQUFrQixPQUFsQixLQUE4QixLQUF4RSxFQUErRTtNQUM3RSxPQUFBO0tBQ0Q7R0FyQnNHOzs7RUF5QnpHLElBQUksc0NBQUEsQ0FBdUMsSUFBdkMsQ0FBNEMsS0FBSyxDQUFDLElBQWxELENBQUosRUFBNkQ7SUFDM0QsT0FBQTtHQTFCdUc7OztFQThCekcsSUFBSSxPQUFFLENBQUMsT0FBSCxDQUFXLEtBQUssQ0FBQyxNQUFqQixDQUFBLElBQ0EsQ0FBQSxDQUFBLEVBQUEsYUFBQSxDQUFBLGVBQUEsRUFBZ0IsS0FBSyxDQUFDLE1BQXRCLEVBQThCLHVFQUE5QixDQURKLEVBQzRHO0lBQzFHLE9BQUE7R0FDRDs7RUFFRCxLQUFLLENBQUMsY0FBTixFQUFBLENBQUE7Q0FDRDs7QUFFRCxTQUFTLGtCQUFULENBQUEsSUFBQSxFQUE4SDtFQUFBLElBQS9GLFdBQStGLEdBQUEsSUFBQSxDQUEvRixXQUErRjtNQUFsRixLQUFrRixHQUFBLElBQUEsQ0FBbEYsS0FBa0YsQ0FBQTs7RUFDNUgsSUFBSSxXQUFXLENBQUMsWUFBaEIsRUFBOEI7SUFDNUIsV0FBVyxDQUFDLFlBQVosQ0FBeUIsc0JBQXpCLENBQWdELEtBQWhELENBQUEsQ0FBQTtHQUNEO0NBQ0Y7O0FBRU0sU0FBUyxZQUFULENBQWtCLEtBQWxCLEVBQXlDOztFQUFBLElBRXRDLFlBRnNDLEdBRXJCLEtBRnFCLENBRXRDLFlBRnNDLENBQUE7Ozs7Ozs7Ozs7OztFQWM5QyxZQUFZLENBQUMsU0FBYixDQUF1QixjQUF2QixHQUF3QyxjQUF4QyxDQUFBOztFQUVBLFlBQVksQ0FBQyxTQUFiLENBQXVCLHNCQUF2QixHQUFnRCxVQUFVLEtBQVYsRUFBaUI7SUFDL0QsT0FBTyxzQkFBc0IsQ0FBQyxJQUFELEVBQU8sS0FBUCxFQUFjLEtBQWQsQ0FBN0IsQ0FBQTtHQURGLENBaEI4Qzs7O0VBcUI5QyxLQUFLLENBQUMsWUFBTixDQUFtQixTQUFuQixDQUE2QixJQUE3QixDQUFrQztJQUNoQyxJQUFJLEVBQUUsV0FEMEI7SUFFaEMsUUFGZ0MsRUFBQSxTQUFBLFFBQUEsQ0FFdEIsS0FGc0IsRUFFZjtNQUNmLEtBQUEsSUFBQSxFQUFBLEdBQUEsQ0FBQSxFQUFBLEVBQUEsR0FBMEIsS0FBSyxDQUFDLFlBQU4sQ0FBbUIsSUFBN0MsQ0FBQSxNQUFBLEVBQUEsRUFBQSxFQUFBLEVBQW1EO1FBQUEsSUFBQSxLQUFBLENBQUE7O1FBQUEsS0FBQSxHQUF6QixLQUFLLENBQUMsWUFBTixDQUFtQixJQUFNLENBQUEsRUFBQSxDQUFBLENBQUE7UUFBQSxJQUF4QyxXQUF3QyxHQUFBLEtBQUEsQ0FBQTs7UUFDakQsSUFBSSxXQUFXLENBQUMsT0FBWixLQUNELFdBQVcsQ0FBQyxPQUFaLEtBQXdCLEtBQUssQ0FBQyxNQUE5QixJQUNBLENBQUEsQ0FBQSxFQUFBLGFBQUEsQ0FBQSxZQUFBLEVBQWEsV0FBVyxDQUFDLE9BQXpCLEVBQWtDLEtBQUssQ0FBQyxNQUF4QyxDQUZDLENBQUosRUFFcUQ7VUFDbkQsV0FBVyxDQUFDLFlBQVosQ0FBeUIsc0JBQXpCLENBQWdELEtBQWhELENBQUEsQ0FBQTtVQUNBLE9BQUE7U0FDRDtPQUNGO0tBQ0Y7R0FYSCxDQUFBLENBQUE7Q0FhRDs7b0JBRWM7RUFDYixFQUFFLEVBQUUsaUNBRFM7RUFFYixPQUFPLEVBQVAsWUFGYTtFQUdiLFNBQVMsRUFBRSxDQUFDLE1BQUQsRUFBUyxNQUFULEVBQWlCLElBQWpCLEVBQXVCLFFBQXZCLENBQUEsQ0FBaUMsTUFBakMsQ0FBd0MsVUFBQyxHQUFELEVBQU0sU0FBTixFQUFvQjtJQUNyRSxHQUFHLENBQUEsZUFBQSxDQUFBLE1BQUEsQ0FBaUIsU0FBakIsQ0FBQSxDQUFILEdBQW1DLGtCQUFuQyxDQUFBO0lBQ0EsT0FBTyxHQUFQLENBQUE7R0FGUyxFQUdSLEVBSFEsQ0FBQTs7Ozs7Ozs7Ozs7O0FDaEhiLElBQUEsZUFBQSxHQUFBLDBCQUFBLENBQUEsY0FBQSxDQUFBLENBQUE7O0FBR0EsSUFBQSxPQUFBLEdBQUEsMkJBQUEsQ0FBQSxRQUFBLENBQUEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUVNOzs7Ozs7RUFhSixTQUFBLFNBQUEsQ0FBYSxTQUFiLEVBQWdELFNBQWhELEVBQWtGLElBQWxGLEVBQWdHO0lBQUEsSUFBQSxLQUFBLENBQUE7O0lBQUEsbUJBQUEsQ0FBQSxJQUFBLEVBQUEsU0FBQSxDQUFBLENBQUE7O0lBQzlGLEtBQUEsR0FBQSw4QkFBQSxDQUFBLElBQUEsRUFBQSxtQkFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQU0sU0FBUyxDQUFDLFlBQWhCLENBQUEsQ0FBQSxDQUFBOztJQUQ4RixtQkFBQSxDQUFBLDBCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsbUJBQUEsQ0FBQSwwQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG1CQUFBLENBQUEsMEJBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxXQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxtQkFBQSxDQUFBLDBCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsZUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsbUJBQUEsQ0FBQSwwQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFdBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG1CQUFBLENBQUEsMEJBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxXQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxtQkFBQSxDQUFBLDBCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsb0JBQUEsRUFOM0UsS0FNMkUsQ0FBQSxDQUFBOztJQUFBLG1CQUFBLENBQUEsMEJBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSw2QkFBQSxFQUxsRSxLQUtrRSxDQUFBLENBQUE7O0lBQUEsSUFBQSxJQUFBLEdBR2hFLElBQUksS0FBSyxXQUFULEdBQzFCLFNBQVMsQ0FBQyxJQURnQixHQUUxQixTQUFTLENBQUMsR0FMZ0Y7UUFHdEYsT0FIc0YsR0FBQSxJQUFBLENBR3RGLE9BSHNGO1FBRzdFLFFBSDZFLEdBQUEsSUFBQSxDQUc3RSxRQUg2RSxDQUFBOztJQU85RixLQUFBLENBQUssSUFBTCxHQUFxQixJQUFyQixDQUFBO0lBQ0EsS0FBQSxDQUFLLE1BQUwsR0FBcUIsT0FBckIsQ0FBQTtJQUNBLEtBQUEsQ0FBSyxhQUFMLEdBQXFCLE9BQXJCLENBQUE7SUFDQSxLQUFBLENBQUssUUFBTCxHQUFxQixRQUFyQixDQUFBO0lBQ0EsS0FBQSxDQUFLLFNBQUwsR0FBcUIsU0FBckIsQ0FBQTtJQUNBLEtBQUEsQ0FBSyxhQUFMLEdBQXFCLFNBQVMsQ0FBQyxNQUEvQixDQUFBO0lBQ0EsS0FBQSxDQUFLLFNBQUwsR0FBcUIsU0FBUyxDQUFDLFlBQS9CLENBQUE7SUFDQSxLQUFBLENBQUssU0FBTCxHQUFxQixTQUFTLENBQUMsU0FBL0IsQ0FBQTtJQWQ4RixPQUFBLEtBQUEsQ0FBQTtHQWUvRjs7Ozs7Ozs7Ozs7OzZCQVNTO01BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztNQUFBLElBQ0EsU0FEQSxHQUNjLElBQUEsQ0FBSyxZQURuQixDQUNBLFNBREEsQ0FBQTs7TUFHUixJQUNHLElBQUEsQ0FBSyxJQUFMLEtBQWMsY0FBZixLQUNFLENBQUMsSUFBQSxDQUFLLFFBQU4sSUFDQSxTQUFTLENBQUMsR0FBVixDQUFjLFFBQWQsS0FBMkIsSUFBQSxDQUFLLFFBRGhDLElBRUEsU0FBUyxDQUFDLEdBQVYsQ0FBYyxPQUFkLEtBQTBCLElBQUEsQ0FBSyxNQUhqQyxDQURGLEVBSTRDO1FBQzFDLE9BQUE7T0FDRDs7TUFFRCxTQUFTLENBQUMsSUFBVixDQUFlLFFBQWYsR0FBMEIsSUFBQSxDQUFLLFFBQS9CLENBQUE7TUFDQSxTQUFTLENBQUMsSUFBVixDQUFlLE9BQWYsR0FBeUIsSUFBQSxDQUFLLE1BQTlCLENBQUE7TUFFQSxTQUFTLENBQUMsUUFBVixHQUFxQixJQUFyQixDQUFBO01BQ0EsU0FBUyxDQUFDLE1BQVYsQ0FBaUIsS0FBakIsR0FBeUIsSUFBekIsQ0FBQTtNQUVBLElBQUEsQ0FBSyx3QkFBTCxFQUFBLENBQUE7O01BRUEsSUFBSSxJQUFBLENBQUssSUFBTCxLQUFjLGNBQWxCLEVBQWtDO1FBQ2hDLElBQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUE5QixDQUFBO1FBQ0EsSUFBTSxLQUFLLEdBQUcsT0FBRyxDQUFDLFNBQUosQ0FBYyxXQUFkLEVBQTJCLFVBQUEsS0FBQSxFQUFBO1VBQUEsSUFBRyxRQUFILEdBQUEsS0FBQSxDQUFHLFFBQUg7Y0FBYSxPQUFiLEdBQUEsS0FBQSxDQUFhLE9BQWIsQ0FBQTtVQUFBLE9BQ3ZDLFFBQVEsS0FBSyxNQUFJLENBQUMsUUFBbEIsSUFBOEIsT0FBTyxLQUFLLE1BQUksQ0FBQyxNQURSLENBQUE7U0FBM0IsQ0FBZCxDQUFBO1FBR0EsU0FBUyxDQUFDLFdBQVYsQ0FBc0IsTUFBdEIsQ0FBNkIsS0FBN0IsRUFBb0MsQ0FBcEMsQ0FBQSxDQUFBO1FBRUEsSUFBTSxlQUFlLEdBQUcsSUFBSSxTQUFKLENBQWMsU0FBZCxFQUF5QixJQUFBLENBQUssU0FBOUIsRUFBeUMsZ0JBQXpDLENBQXhCLENBQUE7UUFFQSxlQUFlLENBQUMsUUFBaEIsR0FBMkIsSUFBQSxDQUFLLFFBQWhDLENBQUE7UUFDQSxlQUFlLENBQUMsTUFBaEIsR0FBeUIsSUFBQSxDQUFLLE1BQTlCLENBQUE7UUFFQSxJQUFBLENBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsZUFBbkIsQ0FBQSxDQUFBO09BWkYsTUFjSztRQUNILElBQUEsQ0FBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixJQUFJLFNBQUosQ0FBYyxTQUFkLEVBQXlCLElBQUEsQ0FBSyxTQUE5QixFQUF5QyxXQUF6QyxDQUFuQixDQUFBLENBQUE7T0FDRDtLQUNGOzs7cUNBRWlCLEVBQUU7OztzQ0FFRDtNQUNqQixJQUFBLENBQUssa0JBQUwsR0FBMEIsSUFBMUIsQ0FBQTtLQUNEOzs7K0NBRTJCO01BQzFCLElBQUEsQ0FBSywyQkFBTCxHQUFtQyxJQUFBLENBQUssa0JBQUwsR0FBMEIsSUFBN0QsQ0FBQTtLQUNEOzs7O0VBbkZxQixlQUFBLENBQUEsU0FBQTs7bUJBc0ZUOzs7Ozs7Ozs7Ozs7O0FDM0ZmLElBQUEsaUJBQUEsR0FBQSwwQkFBQSxDQUFBLHFCQUFBLENBQUEsQ0FBQTs7QUFFQSxJQUFBLFVBQUEsR0FBQSxjQUFBLENBQUE7O0FBQ0EsSUFBQSxTQUFBLEdBQUEsMkJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLEtBQUEsR0FBQSwwQkFBQSxDQUFBLFFBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsVUFBQSxHQUFBLDBCQUFBLENBQUEsYUFBQSxDQUFBLENBQUE7Ozs7Ozs7O0FBd0VBLFNBQVMsV0FBVCxDQUFrQixLQUFsQixFQUFnQztFQUFBLElBRTVCLE9BRjRCLEdBUTFCLEtBUjBCLENBRTVCLE9BRjRCO01BSTVCLFFBSjRCLEdBUTFCLEtBUjBCLENBSTVCLFFBSjRCO01BTTVCLFlBTjRCLEdBUTFCLEtBUjBCLENBTTVCLFlBTjRCO01BTzVCLFFBUDRCLEdBUTFCLEtBUjBCLENBTzVCLFFBUDRCLENBQUE7RUFVOUIsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsS0FBQSxDQUFBLFNBQUEsQ0FBaEIsQ0FBQSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwQ0EsWUFBWSxDQUFDLFNBQWIsQ0FBdUIsUUFBdkIsR0FBa0MsVUFBdUMsT0FBdkMsRUFBcUY7SUFDckgsT0FBTyxjQUFjLENBQUMsSUFBRCxFQUFPLE9BQVAsQ0FBckIsQ0FBQTtHQURGLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1CQSxZQUFZLENBQUMsU0FBYixDQUF1QixTQUF2QixHQUFtQyxVQUF1QyxTQUF2QyxFQUFrRCxLQUFsRCxFQUF5RCxTQUF6RCxFQUFvRSxnQkFBcEUsRUFBc0YsV0FBdEYsRUFBbUcsSUFBbkcsRUFBeUc7SUFDMUksT0FBTyxlQUFlLENBQUMsSUFBRCxFQUFPLFNBQVAsRUFBa0IsS0FBbEIsRUFBeUIsU0FBekIsRUFBb0MsZ0JBQXBDLEVBQXNELFdBQXRELEVBQW1FLElBQW5FLENBQXRCLENBQUE7R0FERixDQUFBOzs7Ozs7Ozs7OztFQVlBLFFBQVEsQ0FBQyxXQUFULEdBQXVCLFVBQVUsUUFBVixFQUE4QjtJQUNuRCxJQUFJLFNBQUssQ0FBQyxFQUFOLENBQVMsSUFBVCxDQUFjLFFBQWQsQ0FBSixFQUE2Qjs7OztNQUszQixLQUFLLENBQUMsV0FBTixHQUFvQixRQUFwQixDQUFBO01BRUEsT0FBTyxRQUFQLENBQUE7S0FDRDs7SUFDRCxPQUFPLEtBQUssQ0FBQyxXQUFiLENBQUE7R0FWRixDQUFBOztFQWFBLFNBQUssQ0FBQyxNQUFOLENBQWEsT0FBTyxDQUFDLGNBQXJCLEVBQXFDO0lBQ25DLFNBQVMsRUFBRSxJQUR3QjtJQUVuQyxTQUFTLEVBQUUsSUFGd0I7SUFHbkMsWUFBWSxFQUFFLElBSHFCO0lBSW5DLGNBQWMsRUFBRSxJQUptQjtJQUtuQyxRQUFRLEVBQUUsSUFMeUI7SUFNbkMsSUFBSSxFQUFFLElBQUE7R0FOUixDQUFBLENBQUE7RUFRQSxPQUFPLENBQUMsVUFBUixDQUFtQixJQUFuQixHQUEwQixVQUExQixDQUFBO0VBRUEsS0FBSyxDQUFDLFdBQU4sR0FBb0IsS0FBcEIsQ0FBQTtFQUVBLFFBQVEsQ0FBQyxPQUFULENBQWlCLElBQWpCLEdBQXdCLElBQUksQ0FBQyxRQUE3QixDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxZQUFULENBQUEsSUFBQSxFQUEwQyxnQkFBMUMsRUFBNEQ7RUFBQSxJQUFuQyxhQUFtQyxHQUFBLElBQUEsQ0FBbkMsYUFBbUMsQ0FBQTtFQUMxRCxJQUFNLEtBQUssR0FBRyxFQUFkLENBRDBEOztFQUkxRCxLQUFBLElBQUEsRUFBQSxHQUFBLENBQUEsRUFBQSxFQUFBLEdBQXVCLGFBQWEsQ0FBQyxJQUFyQyxDQUFBLE1BQUEsRUFBQSxFQUFBLEVBQUEsRUFBMkM7SUFBQSxJQUFBLEtBQUEsQ0FBQTs7SUFBQSxLQUFBLEdBQXBCLGFBQWEsQ0FBQyxJQUFNLENBQUEsRUFBQSxDQUFBLENBQUE7SUFBQSxJQUFoQyxRQUFnQyxHQUFBLEtBQUEsQ0FBQTs7SUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFULENBQWlCLElBQWpCLENBQXNCLE9BQTNCLEVBQW9DO01BQUUsU0FBQTtLQUFVOztJQUVoRCxJQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBVCxDQUFpQixJQUFqQixDQUFzQixNQUFyQyxDQUh5Qzs7SUFNekMsSUFBSyxTQUFLLENBQUMsRUFBTixDQUFTLE9BQVQsQ0FBaUIsTUFBakIsQ0FBQSxJQUE0QixNQUFNLEtBQUssZ0JBQXhDLElBQ0MsU0FBSyxDQUFDLEVBQU4sQ0FBUyxNQUFULENBQWdCLE1BQWhCLENBQUEsSUFDRCxDQUFDLFNBQUssQ0FBQyxHQUFOLENBQVUsZUFBVixDQUEwQixnQkFBMUIsRUFBNEMsTUFBNUMsQ0FGRCxJQUdDLFNBQUssQ0FBQyxFQUFOLENBQVMsSUFBVCxDQUFjLE1BQWQsQ0FBQSxJQUF5QixDQUFDLE1BQU0sQ0FBQztNQUFFLFFBQVEsRUFBUixRQUFGO01BQVksZ0JBQWdCLEVBQWhCLGdCQUFBO0tBQWIsQ0FIckMsRUFHd0U7TUFDdEUsU0FBQTtLQVZ1Qzs7O0lBY3pDLElBQU0sWUFBWSxHQUFHLFNBQUssQ0FBQyxFQUFOLENBQVMsTUFBVCxDQUFnQixRQUFRLENBQUMsTUFBekIsQ0FBQSxHQUNqQixRQUFRLENBQUMsUUFBVCxDQUFrQixnQkFBbEIsQ0FBbUMsUUFBUSxDQUFDLE1BQTVDLENBRGlCLEdBRWpCLFNBQUssQ0FBQyxFQUFOLENBQVMsS0FBVCxDQUFlLFFBQVEsQ0FBQyxNQUF4QixDQUFBLEdBQWtDLFFBQVEsQ0FBQyxNQUEzQyxHQUFvRCxDQUFDLFFBQVEsQ0FBQyxNQUFWLENBRnhELENBQUE7O0lBSUEsS0FBQSxJQUFBLEdBQUEsR0FBQSxDQUFBLEVBQUEsR0FBQSxHQUE4QixZQUE5QixDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsRUFBNEM7TUFBQSxJQUFBLEtBQUEsQ0FBQTs7TUFBQSxLQUFBLEdBQWQsWUFBYyxDQUFBLEdBQUEsQ0FBQSxDQUFBO01BQUEsSUFBakMsZUFBaUMsR0FBQSxLQUFBLENBQUE7O01BQzFDLElBQUksZUFBZSxLQUFLLGdCQUF4QixFQUEwQztRQUN4QyxLQUFLLENBQUMsSUFBTixDQUFXO1VBQ1QsUUFBUSxFQUFSLFFBRFM7VUFFVCxPQUFPLEVBQUUsZUFBQTtTQUZYLENBQUEsQ0FBQTtPQUlEO0tBQ0Y7R0FDRjs7RUFFRCxPQUFPLEtBQVAsQ0FBQTtDQUNEOztBQUVELFNBQVMsb0JBQVQsQ0FBK0IsV0FBL0IsRUFBNEMsS0FBNUMsRUFBbUQ7O0VBRWpELEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBb0MsV0FBVyxDQUFDLEtBQVosRUFBcEMsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQXlEO0lBQUEsSUFBQSxLQUFBLENBQUE7O0lBQUEsS0FBQSxHQUFyQixXQUFXLENBQUMsS0FBWixFQUFxQixDQUFBLEdBQUEsQ0FBQSxDQUFBO0lBQUEsSUFBQSxLQUFBLEdBQUEsS0FBQTtRQUE1QyxRQUE0QyxHQUFBLEtBQUEsQ0FBNUMsUUFBNEM7UUFBbEMsT0FBa0MsR0FBQSxLQUFBLENBQWxDLE9BQWtDLENBQUE7SUFDdkQsS0FBSyxDQUFDLFFBQU4sR0FBaUIsUUFBakIsQ0FEdUQ7O0lBSXZELEtBQUssQ0FBQyxNQUFOLEdBQWUsT0FBZixDQUFBO0lBQ0EsUUFBUSxDQUFDLElBQVQsQ0FBYyxLQUFkLENBQUEsQ0FBQTtJQUNBLEtBQUssQ0FBQyxrQkFBTixHQUEyQixLQUFLLENBQUMsMkJBQU4sR0FBb0MsS0FBL0QsQ0FBQTtHQUNEOzs7Ozs7QUFNSCxTQUFTLGNBQVQsQ0FBeUIsS0FBekIsRUFBdUMsV0FBdkMsRUFBc0U7O0VBRXBFLElBQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFELEVBQVEsV0FBUixDQUFoQyxDQUFBOztFQUVBLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBeUIsV0FBekIsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQXNDO0lBQUEsSUFBQSxLQUFBLENBQUE7O0lBQUEsS0FBQSxHQUFiLFdBQWEsQ0FBQSxHQUFBLENBQUEsQ0FBQTtJQUFBLElBQTNCLFVBQTJCLEdBQUEsS0FBQSxDQUFBO0lBQ3BDLFVBQVUsQ0FBQyxJQUFYLEdBQWtCLFVBQVUsQ0FBQyxRQUFYLENBQW9CLE9BQXBCLENBQTRCLFVBQVUsQ0FBQyxPQUF2QyxDQUFsQixDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxXQUFQLENBQUE7Q0FDRDs7QUFFRCxTQUFTLE9BQVQsQ0FBQSxLQUFBLEVBQStHLFNBQS9HLEVBQTBILFlBQTFILEVBQXdJO0VBQUEsSUFBcEgsU0FBb0gsR0FBQSxLQUFBLENBQXBILFNBQW9IO01BQTNGLFNBQTJGLEdBQUEsS0FBQSxDQUF6RyxZQUF5RztNQUF2RSxXQUF1RSxHQUFBLEtBQUEsQ0FBaEYsT0FBZ0YsQ0FBQTtFQUN0SSxJQUFNLFVBQVUsR0FBRyxFQUFuQixDQURzSTs7RUFJdEksS0FBQSxJQUFBLEdBQUEsR0FBQSxDQUFBLEVBQUEsR0FBQSxHQUEyRCxTQUFTLENBQUMsV0FBckUsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQWtGO0lBQUEsSUFBQSxLQUFBLENBQUE7O0lBQUEsS0FBQSxHQUF2QixTQUFTLENBQUMsV0FBYSxDQUFBLEdBQUEsQ0FBQSxDQUFBO0lBQUEsSUFBQSxLQUFBLEdBQUEsS0FBQTtRQUFyRSxRQUFxRSxHQUFBLEtBQUEsQ0FBckUsUUFBcUU7UUFBbEQsZUFBa0QsR0FBQSxLQUFBLENBQTNELE9BQTJEO1FBQWpDLEtBQWlDLEdBQUEsS0FBQSxDQUFqQyxJQUFpQyxDQUFBO0lBQ2hGLFVBQVUsQ0FBQyxJQUFYLENBQWdCLFFBQVEsQ0FBQyxTQUFULENBQW1CLFNBQW5CLEVBQThCLFlBQTlCLEVBQTRDLFNBQTVDLEVBQXVELFdBQXZELEVBQW9FLGVBQXBFLEVBQXFGLEtBQXJGLENBQUEsR0FDWixlQURZLEdBRVosSUFGSixDQUFBLENBQUE7R0FMb0k7OztFQVd0SSxJQUFNLFNBQVMsR0FBRyxTQUFLLENBQUMsR0FBTixDQUFVLHFCQUFWLENBQWdDLFVBQWhDLENBQWxCLENBQUE7RUFFQSxPQUFPLFNBQVMsQ0FBQyxXQUFWLENBQXNCLFNBQXRCLENBQUEsSUFBb0MsSUFBM0MsQ0FBQTtDQUNEOztBQUVELFNBQVMsYUFBVCxDQUF3QixXQUF4QixFQUEyRCxhQUEzRCxFQUEwRSxTQUExRSxFQUFxRjtFQUFBLElBQzNFLFNBRDJFLEdBQzdELFdBRDZELENBQzNFLFNBRDJFLENBQUE7RUFFbkYsSUFBTSxVQUFVLEdBQUc7SUFDakIsS0FBSyxFQUFPLElBREs7SUFFakIsS0FBSyxFQUFPLElBRks7SUFHakIsUUFBUSxFQUFJLElBSEs7SUFJakIsVUFBVSxFQUFFLElBSks7SUFLakIsSUFBSSxFQUFRLElBTEs7SUFNakIsSUFBSSxFQUFRLElBQUE7R0FOZCxDQUFBOztFQVNBLElBQUksU0FBUyxDQUFDLElBQVYsS0FBbUIsV0FBdkIsRUFBb0M7SUFDbEMsVUFBVSxDQUFDLFFBQVgsR0FBc0IsSUFBSSxVQUFBLENBQUEsU0FBQSxDQUFKLENBQWMsU0FBZCxFQUF5QixTQUF6QixFQUFvQyxjQUFwQyxDQUF0QixDQUFBO0lBRUEsVUFBVSxDQUFDLFFBQVgsQ0FBb0IsTUFBcEIsR0FBK0IsSUFBL0IsQ0FBQTtJQUNBLFVBQVUsQ0FBQyxRQUFYLENBQW9CLFFBQXBCLEdBQStCLElBQS9CLENBQUE7R0FDRDs7RUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFWLEtBQW1CLFNBQXZCLEVBQWtDO0lBQ2hDLFVBQVUsQ0FBQyxVQUFYLEdBQXdCLElBQUksVUFBQSxDQUFBLFNBQUEsQ0FBSixDQUFjLFNBQWQsRUFBeUIsU0FBekIsRUFBb0MsZ0JBQXBDLENBQXhCLENBQUE7SUFFQSxVQUFVLENBQUMsVUFBWCxDQUFzQixNQUF0QixHQUFpQyxJQUFqQyxDQUFBO0lBQ0EsVUFBVSxDQUFDLFVBQVgsQ0FBc0IsUUFBdEIsR0FBaUMsSUFBakMsQ0FBQTtHQUNEOztFQUVELElBQUksU0FBUyxDQUFDLFFBQWQsRUFBd0I7SUFDdEIsT0FBTyxVQUFQLENBQUE7R0FDRDs7RUFFRCxJQUFJLFNBQVMsQ0FBQyxHQUFWLENBQWMsT0FBZCxLQUEwQixTQUFTLENBQUMsSUFBVixDQUFlLE9BQTdDLEVBQXNEOztJQUVwRCxJQUFJLFNBQVMsQ0FBQyxJQUFWLENBQWUsUUFBbkIsRUFBNkI7TUFDM0IsVUFBVSxDQUFDLEtBQVgsR0FBbUIsSUFBSSxVQUFBLENBQUEsU0FBQSxDQUFKLENBQWMsU0FBZCxFQUF5QixTQUF6QixFQUFvQyxXQUFwQyxDQUFuQixDQUFBO01BRUEsU0FBUyxDQUFDLFNBQVYsR0FBeUIsVUFBVSxDQUFDLEtBQVgsQ0FBaUIsTUFBakIsR0FBNEIsU0FBUyxDQUFDLElBQVYsQ0FBZSxPQUFwRSxDQUFBO01BQ0EsU0FBUyxDQUFDLFlBQVYsR0FBeUIsVUFBVSxDQUFDLEtBQVgsQ0FBaUIsUUFBakIsR0FBNEIsU0FBUyxDQUFDLElBQVYsQ0FBZSxRQUFwRSxDQUFBO0tBTmtEOzs7SUFTcEQsSUFBSSxTQUFTLENBQUMsR0FBVixDQUFjLFFBQWxCLEVBQTRCO01BQzFCLFVBQVUsQ0FBQyxLQUFYLEdBQW1CLElBQUksVUFBQSxDQUFBLFNBQUEsQ0FBSixDQUFjLFNBQWQsRUFBeUIsU0FBekIsRUFBb0MsV0FBcEMsQ0FBbkIsQ0FBQTtNQUVBLFNBQVMsQ0FBQyxTQUFWLEdBQXNCLFNBQVMsQ0FBQyxHQUFWLENBQWMsT0FBcEMsQ0FBQTtNQUNBLFNBQVMsQ0FBQyxRQUFWLEdBQXFCLFNBQVMsQ0FBQyxHQUFWLENBQWMsUUFBbkMsQ0FBQTtLQUNEO0dBQ0Y7O0VBRUQsSUFBSSxTQUFTLENBQUMsSUFBVixLQUFtQixTQUFuQixJQUFnQyxTQUFTLENBQUMsR0FBVixDQUFjLFFBQWxELEVBQTREO0lBQzFELFVBQVUsQ0FBQyxJQUFYLEdBQWtCLElBQUksVUFBQSxDQUFBLFNBQUEsQ0FBSixDQUFjLFNBQWQsRUFBeUIsU0FBekIsRUFBb0MsTUFBcEMsQ0FBbEIsQ0FBQTtJQUVBLFNBQVMsQ0FBQyxRQUFWLEdBQXFCLFNBQVMsQ0FBQyxHQUFWLENBQWMsUUFBbkMsQ0FBQTtJQUNBLFNBQVMsQ0FBQyxhQUFWLEdBQTBCLFNBQVMsQ0FBQyxHQUFWLENBQWMsT0FBeEMsQ0FBQTtHQUNEOztFQUNELElBQUksU0FBUyxDQUFDLElBQVYsS0FBbUIsVUFBbkIsSUFBaUMsU0FBUyxDQUFDLEdBQVYsQ0FBYyxRQUFuRCxFQUE2RDtJQUMzRCxVQUFVLENBQUMsSUFBWCxHQUFrQixJQUFJLFVBQUEsQ0FBQSxTQUFBLENBQUosQ0FBYyxTQUFkLEVBQXlCLFNBQXpCLEVBQW9DLFVBQXBDLENBQWxCLENBQUE7SUFFQSxVQUFVLENBQUMsSUFBWCxDQUFnQixRQUFoQixHQUEyQixTQUEzQixDQUFBO0lBQ0EsU0FBUyxDQUFDLFFBQVYsR0FBcUIsU0FBUyxDQUFDLEdBQVYsQ0FBYyxRQUFuQyxDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxVQUFQLENBQUE7Q0FDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBeUIsV0FBekIsRUFBNEQsTUFBNUQsRUFBb0U7RUFBQSxJQUMxRCxTQUQwRCxHQUM1QyxXQUQ0QyxDQUMxRCxTQUQwRCxDQUFBO0VBQUEsSUFHaEUsV0FIZ0UsR0FNOUQsU0FOOEQsQ0FHaEUsV0FIZ0U7TUFJaEUsR0FKZ0UsR0FNOUQsU0FOOEQsQ0FJaEUsR0FKZ0U7TUFLaEUsSUFMZ0UsR0FNOUQsU0FOOEQsQ0FLaEUsSUFMZ0UsQ0FBQTs7RUFRbEUsSUFBSSxNQUFNLENBQUMsS0FBWCxFQUFrQjtJQUFFLElBQUksQ0FBQyxRQUFMLENBQWMsSUFBZCxDQUFtQixNQUFNLENBQUMsS0FBMUIsQ0FBQSxDQUFBO0dBQWtDOztFQUN0RCxJQUFJLE1BQU0sQ0FBQyxJQUFYLEVBQWlCO0lBQUUsR0FBRyxDQUFDLFFBQUosQ0FBYSxJQUFiLENBQWtCLE1BQU0sQ0FBQyxJQUF6QixDQUFBLENBQUE7R0FBZ0M7O0VBQ25ELElBQUksTUFBTSxDQUFDLEtBQVgsRUFBa0I7SUFBRSxHQUFHLENBQUMsUUFBSixDQUFhLElBQWIsQ0FBa0IsTUFBTSxDQUFDLEtBQXpCLENBQUEsQ0FBQTtHQUFpQzs7RUFDckQsSUFBSSxNQUFNLENBQUMsSUFBWCxFQUFpQjtJQUFFLEdBQUcsQ0FBQyxRQUFKLENBQWEsSUFBYixDQUFrQixNQUFNLENBQUMsSUFBekIsQ0FBQSxDQUFBO0dBQWdDOztFQUVuRCxJQUFJLE1BQU0sQ0FBQyxVQUFYLEVBQXVCO0lBQ3JCLG9CQUFvQixDQUFDLFdBQUQsRUFBYyxNQUFNLENBQUMsVUFBckIsQ0FBcEIsQ0FBQTtHQUNEOztFQUVELFNBQVMsQ0FBQyxJQUFWLENBQWUsUUFBZixHQUEyQixHQUFHLENBQUMsUUFBL0IsQ0FBQTtFQUNBLFNBQVMsQ0FBQyxJQUFWLENBQWUsT0FBZixHQUF5QixHQUFHLENBQUMsT0FBN0IsQ0FBQTtDQUNEOztBQUVELFNBQVMsY0FBVCxDQUFBLE1BQUEsRUFBMkcsS0FBM0csRUFBa0g7RUFBQSxJQUF2RixXQUF1RixHQUFBLE1BQUEsQ0FBdkYsV0FBdUY7TUFBMUUsTUFBMEUsR0FBQSxNQUFBLENBQTFFLE1BQTBFO01BQWxFLEtBQWtFLEdBQUEsTUFBQSxDQUFsRSxLQUFrRSxDQUFBOztFQUNoSCxJQUFJLE1BQU0sQ0FBQyxJQUFQLEtBQWdCLFVBQWhCLElBQThCLE1BQU0sQ0FBQyxJQUFQLEtBQWdCLFNBQWxELEVBQTZEO0lBQUUsT0FBQTtHQUFROztFQUR5QyxJQUd4RyxTQUh3RyxHQUcxRixXQUgwRixDQUd4RyxTQUh3RyxDQUFBOztFQUtoSCxJQUFJLEtBQUssQ0FBQyxXQUFWLEVBQXVCO0lBQ3JCLFNBQVMsQ0FBQyxXQUFWLEdBQXdCLGNBQWMsQ0FBQyxLQUFELEVBQVEsV0FBVyxDQUFDLE9BQXBCLENBQXRDLENBQUE7R0FDRDs7RUFFRCxJQUFNLFNBQVMsR0FBRyxNQUFsQixDQUFBO0VBQ0EsSUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFdBQUQsRUFBYyxTQUFkLEVBQXlCLEtBQXpCLENBQTFCLENBVmdIOztFQWFoSCxTQUFTLENBQUMsUUFBVixHQUFxQixTQUFTLENBQUMsUUFBVixJQUNuQixDQUFDLENBQUMsVUFEaUIsSUFFbkIsVUFBVSxDQUFDLFFBQVgsS0FBd0IsU0FBUyxDQUFDLEdBQVYsQ0FBYyxRQUZuQixJQUduQixVQUFVLENBQUMsT0FBWCxLQUF1QixTQUFTLENBQUMsR0FBVixDQUFjLE9BSHZDLENBQUE7RUFLQSxTQUFTLENBQUMsR0FBVixDQUFjLFFBQWQsR0FBMEIsVUFBVSxJQUFJLFVBQVUsQ0FBQyxRQUFuRCxDQUFBO0VBQ0EsU0FBUyxDQUFDLEdBQVYsQ0FBYyxPQUFkLEdBQXdCLFVBQVUsSUFBSSxVQUFVLENBQUMsT0FBakQsQ0FBQTtFQUVBLFNBQVMsQ0FBQyxNQUFWLEdBQW1CLGFBQWEsQ0FBQyxXQUFELEVBQWMsS0FBZCxFQUFxQixTQUFyQixDQUFoQyxDQUFBO0NBQ0Q7O0FBSUQsU0FBUyxjQUFULENBQXlCLFlBQXpCLEVBQThELE9BQTlELEVBQTRHO0VBQzFHLElBQUksU0FBSyxDQUFDLEVBQU4sQ0FBUyxNQUFULENBQWdCLE9BQWhCLENBQUosRUFBOEI7SUFDNUIsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsSUFBckIsQ0FBMEIsT0FBMUIsR0FBb0MsT0FBTyxDQUFDLE9BQVIsS0FBb0IsS0FBeEQsQ0FBQTs7SUFFQSxJQUFJLE9BQU8sQ0FBQyxTQUFaLEVBQXVCO01BQ3JCLElBQU0sVUFBVSxHQUFHLFNBQUssQ0FBQyxrQkFBTixDQUF5QixPQUFPLENBQUMsU0FBakMsQ0FBbkIsQ0FEcUI7O01BR3JCLElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFQLENBQVksVUFBWixDQUFBLENBQXdCLE1BQXhCLENBQStCLFVBQUMsR0FBRCxFQUFNLElBQU4sRUFBZTtRQUM5RCxJQUFNLGFBQWEsR0FBRyxnQkFBQSxDQUFpQixJQUFqQixDQUFzQixJQUF0QixDQUFBLEdBQUEsTUFBQSxDQUFBLE1BQUEsQ0FDWCxJQURXLENBQUEsR0FFbEIsNkJBQUEsQ0FBOEIsSUFBOUIsQ0FBbUMsSUFBbkMsQ0FBQSxHQUFBLE1BQUEsQ0FBQSxNQUFBLENBQ1MsSUFEVCxDQUFBLEdBRUUsSUFKTixDQUFBO1FBTUEsR0FBRyxDQUFDLGFBQUQsQ0FBSCxHQUFxQixVQUFVLENBQUMsSUFBRCxDQUEvQixDQUFBO1FBRUEsT0FBTyxHQUFQLENBQUE7T0FUZ0IsRUFVZixFQVZlLENBQWxCLENBQUE7TUFZQSxZQUFZLENBQUMsR0FBYixDQUFpQixZQUFZLENBQUMsT0FBYixDQUFxQixJQUFyQixDQUEwQixTQUEzQyxDQUFBLENBQUE7TUFDQSxZQUFZLENBQUMsRUFBYixDQUFnQixTQUFoQixDQUFBLENBQUE7TUFDQSxZQUFZLENBQUMsT0FBYixDQUFxQixJQUFyQixDQUEwQixTQUExQixHQUFzQyxTQUF0QyxDQUFBO0tBQ0Q7O0lBRUQsSUFBSSxTQUFLLENBQUMsRUFBTixDQUFTLElBQVQsQ0FBYyxPQUFPLENBQUMsTUFBdEIsQ0FBSixFQUFtQztNQUFFLFlBQVksQ0FBQyxFQUFiLENBQWdCLE1BQWhCLEVBQXdCLE9BQU8sQ0FBQyxNQUFoQyxDQUFBLENBQUE7S0FBeUM7O0lBQzlFLElBQUksU0FBSyxDQUFDLEVBQU4sQ0FBUyxJQUFULENBQWMsT0FBTyxDQUFDLGNBQXRCLENBQUosRUFBMkM7TUFBRSxZQUFZLENBQUMsRUFBYixDQUFnQixjQUFoQixFQUFnQyxPQUFPLENBQUMsY0FBeEMsQ0FBQSxDQUFBO0tBQXlEOztJQUN0RyxJQUFJLFNBQUssQ0FBQyxFQUFOLENBQVMsSUFBVCxDQUFjLE9BQU8sQ0FBQyxnQkFBdEIsQ0FBSixFQUE2QztNQUFFLFlBQVksQ0FBQyxFQUFiLENBQWdCLGdCQUFoQixFQUFrQyxPQUFPLENBQUMsZ0JBQTFDLENBQUEsQ0FBQTtLQUE2RDs7SUFDNUcsSUFBSSxTQUFLLENBQUMsRUFBTixDQUFTLElBQVQsQ0FBYyxPQUFPLENBQUMsV0FBdEIsQ0FBSixFQUF3QztNQUFFLFlBQVksQ0FBQyxFQUFiLENBQWdCLFdBQWhCLEVBQTZCLE9BQU8sQ0FBQyxXQUFyQyxDQUFBLENBQUE7S0FBbUQ7O0lBQzdGLElBQUksU0FBSyxDQUFDLEVBQU4sQ0FBUyxJQUFULENBQWMsT0FBTyxDQUFDLFdBQXRCLENBQUosRUFBd0M7TUFBRSxZQUFZLENBQUMsRUFBYixDQUFnQixXQUFoQixFQUE2QixPQUFPLENBQUMsV0FBckMsQ0FBQSxDQUFBO0tBQW1EOztJQUM3RixJQUFJLFNBQUssQ0FBQyxFQUFOLENBQVMsSUFBVCxDQUFjLE9BQU8sQ0FBQyxVQUF0QixDQUFKLEVBQXVDO01BQUUsWUFBWSxDQUFDLEVBQWIsQ0FBZ0IsVUFBaEIsRUFBNEIsT0FBTyxDQUFDLFVBQXBDLENBQUEsQ0FBQTtLQUFpRDs7SUFFMUYsSUFBSSxvQkFBQSxDQUFxQixJQUFyQixDQUEwQixPQUFPLENBQUMsT0FBbEMsQ0FBSixFQUEwRDtNQUN4RCxZQUFZLENBQUMsT0FBYixDQUFxQixJQUFyQixDQUEwQixPQUExQixHQUFvQyxPQUFPLENBQUMsT0FBNUMsQ0FBQTtLQURGLE1BR0ssSUFBSSxTQUFLLENBQUMsRUFBTixDQUFTLE1BQVQsQ0FBZ0IsT0FBTyxDQUFDLE9BQXhCLENBQUosRUFBc0M7TUFDekMsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsSUFBckIsQ0FBMEIsT0FBMUIsR0FBb0MsSUFBSSxDQUFDLEdBQUwsQ0FBUyxJQUFJLENBQUMsR0FBTCxDQUFTLENBQVQsRUFBWSxPQUFPLENBQUMsT0FBcEIsQ0FBVCxFQUF1QyxDQUF2QyxDQUFwQyxDQUFBO0tBQ0Q7O0lBQ0QsSUFBSSxRQUFBLElBQVksT0FBaEIsRUFBeUI7TUFDdkIsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsSUFBckIsQ0FBMEIsTUFBMUIsR0FBbUMsT0FBTyxDQUFDLE1BQTNDLENBQUE7S0FDRDs7SUFDRCxJQUFJLFNBQUEsSUFBYSxPQUFqQixFQUEwQjtNQUN4QixZQUFZLENBQUMsT0FBYixDQUFxQixJQUFyQixDQUEwQixPQUExQixHQUFvQyxPQUFPLENBQUMsT0FBNUMsQ0FBQTtLQUNEOztJQUVELE9BQU8sWUFBUCxDQUFBO0dBQ0Q7O0VBRUQsSUFBSSxTQUFLLENBQUMsRUFBTixDQUFTLElBQVQsQ0FBYyxPQUFkLENBQUosRUFBNEI7SUFDMUIsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsSUFBckIsQ0FBMEIsT0FBMUIsR0FBb0MsT0FBcEMsQ0FBQTtJQUVBLE9BQU8sWUFBUCxDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxZQUFZLENBQUMsT0FBYixDQUFxQixJQUE1QixDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxlQUFULENBQ0UsWUFERixFQUVFLFNBRkYsRUFHRSxLQUhGLEVBSUUsU0FKRixFQUtFLGdCQUxGLEVBTUUsV0FORixFQU9FLElBUEYsRUFRRTtFQUNBLElBQUksT0FBTyxHQUFHLEtBQWQsQ0FEQTs7O0VBS0EsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLElBQUksWUFBWSxDQUFDLE9BQWIsQ0FBcUIsV0FBckIsQ0FBakIsQ0FBSixFQUF5RDtJQUN2RCxPQUFRLFlBQVksQ0FBQyxPQUFiLENBQXFCLElBQXJCLENBQTBCLE9BQTFCLEdBQ0osWUFBWSxDQUFDLE9BQWIsQ0FBcUIsSUFBckIsQ0FBMEIsT0FBMUIsQ0FBa0MsU0FBbEMsRUFBNkMsS0FBN0MsRUFBb0QsT0FBcEQsRUFBNkQsWUFBN0QsRUFBMkUsV0FBM0UsRUFBd0YsU0FBeEYsRUFBbUcsZ0JBQW5HLENBREksR0FFSixLQUZKLENBQUE7R0FHRDs7RUFFRCxJQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBYixDQUFxQixJQUFyQixDQUEwQixPQUE5QyxDQUFBOztFQUVBLElBQUksV0FBVyxLQUFLLFNBQXBCLEVBQStCO0lBQzdCLElBQU0sTUFBTSxHQUFHLFNBQUssQ0FBQyxXQUFOLENBQWtCLFNBQWxCLEVBQTZCLGdCQUE3QixFQUErQyxNQUEvQyxDQUFmLENBQUE7SUFDQSxJQUFNLElBQUksR0FBRyxTQUFLLENBQUMsT0FBTixDQUFjLFNBQWQsQ0FBd0IsU0FBeEIsQ0FBYixDQUFBO0lBRUEsSUFBSSxDQUFDLENBQUwsSUFBVSxNQUFNLENBQUMsQ0FBakIsQ0FBQTtJQUNBLElBQUksQ0FBQyxDQUFMLElBQVUsTUFBTSxDQUFDLENBQWpCLENBQUE7SUFFQSxJQUFNLFVBQVUsR0FBSSxJQUFJLENBQUMsQ0FBTCxHQUFTLElBQUksQ0FBQyxJQUFmLElBQXlCLElBQUksQ0FBQyxDQUFMLEdBQVMsSUFBSSxDQUFDLEtBQTFELENBQUE7SUFDQSxJQUFNLFFBQVEsR0FBTSxJQUFJLENBQUMsQ0FBTCxHQUFTLElBQUksQ0FBQyxHQUFmLElBQXdCLElBQUksQ0FBQyxDQUFMLEdBQVMsSUFBSSxDQUFDLE1BQXpELENBQUE7SUFFQSxPQUFPLEdBQUcsVUFBVSxJQUFJLFFBQXhCLENBQUE7R0FDRDs7RUFFRCxJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBVixDQUFrQixnQkFBbEIsQ0FBakIsQ0FBQTs7RUFFQSxJQUFJLFFBQVEsSUFBSSxXQUFXLEtBQUssUUFBaEMsRUFBMEM7SUFDeEMsSUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQVQsR0FBZ0IsUUFBUSxDQUFDLEtBQVQsR0FBa0IsQ0FBN0MsQ0FBQTtJQUNBLElBQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFULEdBQWdCLFFBQVEsQ0FBQyxNQUFULEdBQWtCLENBQTdDLENBQUE7SUFFQSxPQUFPLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFYLElBQW1CLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBOUIsSUFBdUMsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFsRCxJQUF5RCxFQUFFLElBQUksSUFBSSxDQUFDLE1BQTlFLENBQUE7R0FDRDs7RUFFRCxJQUFJLFFBQVEsSUFBSSxTQUFLLENBQUMsRUFBTixDQUFTLE1BQVQsQ0FBZ0IsV0FBaEIsQ0FBaEIsRUFBOEM7SUFDNUMsSUFBTSxXQUFXLEdBQUssSUFBSSxDQUFDLEdBQUwsQ0FBUyxDQUFULEVBQVksSUFBSSxDQUFDLEdBQUwsQ0FBUyxJQUFJLENBQUMsS0FBZCxFQUFxQixRQUFRLENBQUMsS0FBOUIsQ0FBQSxHQUF1QyxJQUFJLENBQUMsR0FBTCxDQUFTLElBQUksQ0FBQyxJQUFkLEVBQW9CLFFBQVEsQ0FBQyxJQUE3QixDQUFuRCxDQUFBLEdBQ0EsSUFBSSxDQUFDLEdBQUwsQ0FBUyxDQUFULEVBQVksSUFBSSxDQUFDLEdBQUwsQ0FBUyxJQUFJLENBQUMsTUFBZCxFQUFzQixRQUFRLENBQUMsTUFBL0IsQ0FBQSxHQUF5QyxJQUFJLENBQUMsR0FBTCxDQUFTLElBQUksQ0FBQyxHQUFkLEVBQW1CLFFBQVEsQ0FBQyxHQUE1QixDQUFyRCxDQUR0QixDQUFBO0lBR0EsSUFBTSxZQUFZLEdBQUcsV0FBVyxJQUFJLFFBQVEsQ0FBQyxLQUFULEdBQWlCLFFBQVEsQ0FBQyxNQUE5QixDQUFoQyxDQUFBO0lBRUEsT0FBTyxHQUFHLFlBQVksSUFBSSxXQUExQixDQUFBO0dBQ0Q7O0VBRUQsSUFBSSxZQUFZLENBQUMsT0FBYixDQUFxQixJQUFyQixDQUEwQixPQUE5QixFQUF1QztJQUNyQyxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsSUFBckIsQ0FBMEIsT0FBMUIsQ0FBa0MsU0FBbEMsRUFBNkMsS0FBN0MsRUFBb0QsT0FBcEQsRUFBNkQsWUFBN0QsRUFBMkUsV0FBM0UsRUFBd0YsU0FBeEYsRUFBbUcsZ0JBQW5HLENBQVYsQ0FBQTtHQUNEOztFQUVELE9BQU8sT0FBUCxDQUFBO0NBQ0Q7O0FBRUQsSUFBTSxJQUFxQixHQUFHO0VBQzVCLEVBQUUsRUFBRSxjQUR3QjtFQUU1QixPQUFPLEVBQVAsV0FGNEI7RUFHNUIsU0FBUyxFQUFFO0lBQ1Qsa0NBQUEsRUFBb0MsU0FBQSw2QkFBQSxDQUFBLE1BQUEsRUFBcUI7TUFBQSxJQUFsQixXQUFrQixHQUFBLE1BQUEsQ0FBbEIsV0FBa0IsQ0FBQTs7TUFDdkQsSUFBSSxXQUFXLENBQUMsUUFBWixDQUFxQixJQUFyQixLQUE4QixNQUFsQyxFQUEwQztRQUFFLE9BQUE7T0FBUTs7TUFFcEQsV0FBVyxDQUFDLFNBQVosR0FBd0I7UUFDdEIsR0FBRyxFQUFFO1VBQ0gsUUFBUSxFQUFFLElBRFA7VUFFSCxPQUFPLEVBQUUsSUFBQTtTQUhXO1FBS3RCLElBQUksRUFBRTtVQUNKLFFBQVEsRUFBRSxJQUROO1VBRUosT0FBTyxFQUFFLElBQUE7U0FQVztRQVN0QixRQUFRLEVBQUUsSUFUWTtRQVV0QixNQUFNLEVBQUUsSUFWYztRQVd0QixXQUFXLEVBQUUsRUFBQTtPQVhmLENBQUE7S0FKTztJQW1CVCxpQ0FBQSxFQUFtQyxTQUFBLDRCQUFBLENBQUEsTUFBQSxFQUE4RixLQUE5RixFQUF3RztNQUFBLElBQXJHLFdBQXFHLEdBQUEsTUFBQSxDQUFyRyxXQUFxRztVQUF4RixLQUF3RixHQUFBLE1BQUEsQ0FBeEYsS0FBd0Y7VUFBekUsU0FBeUUsR0FBQSxNQUFBLENBQWpGLE1BQWlGLENBQUE7O01BQ3pJLElBQUksV0FBVyxDQUFDLFFBQVosQ0FBcUIsSUFBckIsS0FBOEIsTUFBbEMsRUFBMEM7UUFBRSxPQUFBO09BQVE7O01BRHFGLElBR2pJLFNBSGlJLEdBR25ILFdBSG1ILENBR2pJLFNBSGlJLENBQUE7O01BTXpJLFNBQVMsQ0FBQyxXQUFWLEdBQXdCLElBQXhCLENBQUE7TUFDQSxTQUFTLENBQUMsTUFBVixHQUFtQixJQUFuQixDQUFBO01BQ0EsU0FBUyxDQUFDLFdBQVYsR0FBd0IsY0FBYyxDQUFDLEtBQUQsRUFBUSxXQUFXLENBQUMsT0FBcEIsQ0FBdEMsQ0FBQTtNQUNBLFNBQVMsQ0FBQyxNQUFWLEdBQW1CLGFBQWEsQ0FBQyxXQUFELEVBQWMsS0FBZCxFQUFxQixTQUFyQixDQUFoQyxDQUFBOztNQUVBLElBQUksU0FBUyxDQUFDLE1BQVYsQ0FBaUIsUUFBckIsRUFBK0I7UUFDN0Isb0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVgsRUFBd0IsU0FBUyxDQUFDLE1BQVYsQ0FBaUIsUUFBekMsQ0FBcEIsQ0FBQTtRQUNBLEtBQUssQ0FBQyxJQUFOLENBQVcsb0JBQVgsRUFBaUM7VUFBRSxXQUFXLEVBQVgsV0FBRjtVQUFlLFNBQVMsRUFBVCxTQUFBO1NBQWhELENBQUEsQ0FBQTtPQUNEO0tBakNNOztJQXFDVCwwQkFBQSxFQUE0QixjQXJDbkI7SUFzQ1QseUJBQUEsRUFBMkIsY0F0Q2xCO0lBd0NULGdDQUFBLEVBQWtDLFNBQVMsaUJBQVQsQ0FBQSxNQUFBLEVBQWtILEtBQWxILEVBQXlIO01BQUEsSUFBM0YsV0FBMkYsR0FBQSxNQUFBLENBQTNGLFdBQTJGO1VBQXRFLFNBQXNFLEdBQUEsTUFBQSxDQUE5RSxNQUE4RSxDQUFBOztNQUN6SixJQUFJLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXJCLEtBQThCLE1BQWxDLEVBQTBDO1FBQUUsT0FBQTtPQUFROztNQUVwRCxjQUFjLENBQUMsV0FBRCxFQUFjLFdBQVcsQ0FBQyxTQUFaLENBQXNCLE1BQXBDLENBQWQsQ0FBQTtNQUVBLEtBQUssQ0FBQyxJQUFOLENBQVcsbUJBQVgsRUFBZ0M7UUFBRSxXQUFXLEVBQVgsV0FBRjtRQUFlLFNBQVMsRUFBVCxTQUFBO09BQS9DLENBQUEsQ0FBQTtNQUNBLFdBQVcsQ0FBQyxTQUFaLENBQXNCLE1BQXRCLEdBQStCLEVBQS9CLENBQUE7S0E5Q087SUFpRFQsK0JBQUEsRUFBaUMsU0FBQSwwQkFBQSxDQUFBLE1BQUEsRUFBdUYsS0FBdkYsRUFBaUc7TUFBQSxJQUE5RixXQUE4RixHQUFBLE1BQUEsQ0FBOUYsV0FBOEY7VUFBekUsU0FBeUUsR0FBQSxNQUFBLENBQWpGLE1BQWlGLENBQUE7O01BQ2hJLElBQUksV0FBVyxDQUFDLFFBQVosQ0FBcUIsSUFBckIsS0FBOEIsTUFBbEMsRUFBMEM7UUFBRSxPQUFBO09BQVE7O01BRXBELGNBQWMsQ0FBQyxXQUFELEVBQWMsV0FBVyxDQUFDLFNBQVosQ0FBc0IsTUFBcEMsQ0FBZCxDQUFBO01BQ0EsS0FBSyxDQUFDLElBQU4sQ0FBVyxrQkFBWCxFQUErQjtRQUFFLFdBQVcsRUFBWCxXQUFGO1FBQWUsU0FBUyxFQUFULFNBQUE7T0FBOUMsQ0FBQSxDQUFBO0tBckRPO0lBd0RULG1CQUFBLEVBQXFCLFNBQUEsZ0JBQUEsQ0FBQSxNQUFBLEVBQXFCO01BQUEsSUFBbEIsV0FBa0IsR0FBQSxNQUFBLENBQWxCLFdBQWtCLENBQUE7O01BQ3hDLElBQUksV0FBVyxDQUFDLFFBQVosQ0FBcUIsSUFBckIsS0FBOEIsTUFBbEMsRUFBMEM7UUFBRSxPQUFBO09BQVE7O01BRFosSUFHaEMsU0FIZ0MsR0FHbEIsV0FIa0IsQ0FHaEMsU0FIZ0MsQ0FBQTs7TUFLeEMsSUFBSSxTQUFKLEVBQWU7UUFDYixTQUFTLENBQUMsV0FBVixHQUF3QixJQUF4QixDQUFBO1FBQ0EsU0FBUyxDQUFDLE1BQVYsR0FBbUIsSUFBbkIsQ0FBQTtRQUNBLFNBQVMsQ0FBQyxHQUFWLENBQWMsUUFBZCxHQUF5QixJQUF6QixDQUFBO1FBQ0EsU0FBUyxDQUFDLEdBQVYsQ0FBYyxPQUFkLEdBQXdCLElBQXhCLENBQUE7UUFDQSxTQUFTLENBQUMsSUFBVixDQUFlLFFBQWYsR0FBMEIsSUFBMUIsQ0FBQTtRQUNBLFNBQVMsQ0FBQyxJQUFWLENBQWUsT0FBZixHQUF5QixJQUF6QixDQUFBO1FBQ0EsU0FBUyxDQUFDLFFBQVYsR0FBcUIsS0FBckIsQ0FBQTtPQUNEO0tBQ0Y7R0F6RXlCO0VBMkU1QixjQUFjLEVBQWQsY0EzRTRCO0VBNEU1QixPQUFPLEVBQVAsT0E1RTRCO0VBNkU1QixhQUFhLEVBQWIsYUE3RTRCO0VBOEU1QixjQUFjLEVBQWQsY0E5RTRCO0VBK0U1QixRQUFRLEVBQUU7SUFDUixPQUFPLEVBQUUsS0FERDtJQUVSLE1BQU0sRUFBRyxJQUZEO0lBR1IsT0FBTyxFQUFFLFNBQUE7R0FIRDtDQS9FWixDQUFBO21CQXNGZTs7Ozs7Ozs7Ozs7OztBQzlqQmYsSUFBQSxTQUFBLEdBQUEsMkJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7Ozs7O0FBaURBLFNBQVMsV0FBVCxDQUFrQixLQUFsQixFQUF5QztFQUFBLElBRXJDLE9BRnFDLEdBS25DLEtBTG1DLENBRXJDLE9BRnFDO01BR3JDLFlBSHFDLEdBS25DLEtBTG1DLENBR3JDLFlBSHFDO01BSXJDLFFBSnFDLEdBS25DLEtBTG1DLENBSXJDLFFBSnFDLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUE4QnZDLFlBQVksQ0FBQyxTQUFiLENBQXVCLFVBQXZCLEdBQW9DLFVBQXVDLE9BQXZDLEVBQXNGO0lBQ3hILElBQUksU0FBSyxDQUFDLEVBQU4sQ0FBUyxNQUFULENBQWdCLE9BQWhCLENBQUosRUFBOEI7TUFDNUIsSUFBQSxDQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLE9BQXJCLEdBQStCLE9BQU8sQ0FBQyxPQUFSLEtBQW9CLEtBQW5ELENBQUE7TUFDQSxJQUFBLENBQUssWUFBTCxDQUFrQixTQUFsQixFQUE2QixPQUE3QixDQUFBLENBQUE7TUFDQSxJQUFBLENBQUssV0FBTCxDQUFpQixTQUFqQixFQUE0QixPQUE1QixDQUFBLENBQUE7TUFFQSxPQUFPLElBQVAsQ0FBQTtLQUNEOztJQUVELElBQUksU0FBSyxDQUFDLEVBQU4sQ0FBUyxJQUFULENBQWMsT0FBZCxDQUFKLEVBQTRCO01BQzFCLElBQUEsQ0FBSyxPQUFMLENBQWEsT0FBYixDQUFxQixPQUFyQixHQUErQixPQUEvQixDQUFBO01BRUEsT0FBTyxJQUFQLENBQUE7S0FDRDs7SUFFRCxPQUFPLElBQUEsQ0FBSyxPQUFMLENBQWEsT0FBcEIsQ0FBQTtHQWZGLENBQUE7O0VBa0JBLE9BQU8sQ0FBQyxHQUFSLENBQVksT0FBWixHQUFzQixPQUF0QixDQUFBO0VBQ0EsT0FBTyxDQUFDLFVBQVIsQ0FBbUIsT0FBbkIsR0FBNkIsWUFBN0IsQ0FBQTtFQUVBLFFBQVEsQ0FBQyxPQUFULENBQWlCLE9BQWpCLEdBQTJCLE9BQU8sQ0FBQyxRQUFuQyxDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxrQkFBVCxDQUFBLElBQUEsRUFBK0U7RUFBQSxJQUFoRCxXQUFnRCxHQUFBLElBQUEsQ0FBaEQsV0FBZ0Q7TUFBbkMsTUFBbUMsR0FBQSxJQUFBLENBQW5DLE1BQW1DO01BQTNCLEtBQTJCLEdBQUEsSUFBQSxDQUEzQixLQUEyQixDQUFBOztFQUM3RSxJQUFJLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXJCLEtBQThCLFNBQWxDLEVBQTZDO0lBQUUsT0FBQTtHQUFROztFQUV2RCxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBWixDQUFxQixHQUFyQixDQUF5QixVQUFBLENBQUMsRUFBQTtJQUFBLE9BQUksQ0FBQyxDQUFDLE9BQU4sQ0FBQTtHQUExQixDQUFqQixDQUFBO0VBQ0EsSUFBTSxRQUFRLEdBQUcsS0FBSyxLQUFLLE9BQTNCLENBQUE7RUFDQSxJQUFNLE1BQU0sR0FBRyxLQUFLLEtBQUssS0FBekIsQ0FBQTtFQUNBLElBQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxZQUFaLENBQXlCLE9BQXpCLENBQWlDLFdBQXJELENBQUE7RUFFQSxNQUFNLENBQUMsT0FBUCxHQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFELENBQVQsRUFBYyxRQUFRLENBQUMsQ0FBRCxDQUF0QixDQUFqQixDQUFBOztFQUVBLElBQUksUUFBSixFQUFjO0lBQ1osTUFBTSxDQUFDLFFBQVAsR0FBa0IsU0FBSyxDQUFDLE9BQU4sQ0FBYyxhQUFkLENBQTRCLFFBQTVCLEVBQXNDLFdBQXRDLENBQWxCLENBQUE7SUFDQSxNQUFNLENBQUMsR0FBUCxHQUFrQixTQUFLLENBQUMsT0FBTixDQUFjLFNBQWQsQ0FBd0IsUUFBeEIsQ0FBbEIsQ0FBQTtJQUNBLE1BQU0sQ0FBQyxLQUFQLEdBQWtCLENBQWxCLENBQUE7SUFDQSxNQUFNLENBQUMsRUFBUCxHQUFrQixDQUFsQixDQUFBO0lBQ0EsTUFBTSxDQUFDLEtBQVAsR0FBa0IsU0FBSyxDQUFDLE9BQU4sQ0FBYyxVQUFkLENBQXlCLFFBQXpCLEVBQW1DLFdBQW5DLENBQWxCLENBQUE7SUFDQSxNQUFNLENBQUMsRUFBUCxHQUFrQixDQUFsQixDQUFBO0lBRUEsV0FBVyxDQUFDLE9BQVosQ0FBb0IsYUFBcEIsR0FBb0MsTUFBTSxDQUFDLFFBQTNDLENBQUE7SUFDQSxXQUFXLENBQUMsT0FBWixDQUFvQixVQUFwQixHQUFpQyxNQUFNLENBQUMsS0FBeEMsQ0FBQTtHQVRGLE1BV0ssSUFBSSxNQUFKLEVBQVk7SUFDZixJQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBOUIsQ0FBQTtJQUVBLE1BQU0sQ0FBQyxRQUFQLEdBQWtCLFNBQVMsQ0FBQyxRQUE1QixDQUFBO0lBQ0EsTUFBTSxDQUFDLEdBQVAsR0FBa0IsU0FBUyxDQUFDLEdBQTVCLENBQUE7SUFDQSxNQUFNLENBQUMsS0FBUCxHQUFrQixTQUFTLENBQUMsS0FBNUIsQ0FBQTtJQUNBLE1BQU0sQ0FBQyxFQUFQLEdBQWtCLENBQWxCLENBQUE7SUFDQSxNQUFNLENBQUMsS0FBUCxHQUFrQixTQUFTLENBQUMsS0FBNUIsQ0FBQTtJQUNBLE1BQU0sQ0FBQyxFQUFQLEdBQWtCLENBQWxCLENBQUE7R0FSRyxNQVVBO0lBQ0gsTUFBTSxDQUFDLFFBQVAsR0FBa0IsU0FBSyxDQUFDLE9BQU4sQ0FBYyxhQUFkLENBQTRCLFFBQTVCLEVBQXNDLFdBQXRDLENBQWxCLENBQUE7SUFDQSxNQUFNLENBQUMsR0FBUCxHQUFrQixTQUFLLENBQUMsT0FBTixDQUFjLFNBQWQsQ0FBd0IsUUFBeEIsQ0FBbEIsQ0FBQTtJQUNBLE1BQU0sQ0FBQyxLQUFQLEdBQWtCLE1BQU0sQ0FBQyxRQUFQLEdBQWtCLFdBQVcsQ0FBQyxPQUFaLENBQW9CLGFBQXhELENBQUE7SUFDQSxNQUFNLENBQUMsS0FBUCxHQUFrQixTQUFLLENBQUMsT0FBTixDQUFjLFVBQWQsQ0FBeUIsUUFBekIsRUFBbUMsV0FBbkMsQ0FBbEIsQ0FBQTtJQUVBLE1BQU0sQ0FBQyxFQUFQLEdBQVksTUFBTSxDQUFDLEtBQVAsR0FBZSxXQUFXLENBQUMsT0FBWixDQUFvQixLQUEvQyxDQUFBO0lBQ0EsTUFBTSxDQUFDLEVBQVAsR0FBWSxNQUFNLENBQUMsS0FBUCxHQUFlLFdBQVcsQ0FBQyxPQUFaLENBQW9CLEtBQS9DLENBQUE7R0FDRDs7RUFFRCxXQUFXLENBQUMsT0FBWixDQUFvQixRQUFwQixHQUErQixNQUFNLENBQUMsUUFBdEMsQ0FBQTtFQUNBLFdBQVcsQ0FBQyxPQUFaLENBQW9CLEtBQXBCLEdBQTRCLE1BQU0sQ0FBQyxLQUFuQyxDQUFBOztFQUVBLElBQUksU0FBSyxDQUFDLEVBQU4sQ0FBUyxNQUFULENBQWdCLE1BQU0sQ0FBQyxLQUF2QixDQUFBLElBQ0EsTUFBTSxDQUFDLEtBQVAsS0FBaUIsUUFEakIsSUFFQSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBUixDQUZWLEVBRTBCO0lBQ3hCLFdBQVcsQ0FBQyxPQUFaLENBQW9CLEtBQXBCLEdBQTRCLE1BQU0sQ0FBQyxLQUFuQyxDQUFBO0dBQ0Q7Q0FDRjs7QUFFRCxJQUFNLE9BQXdCLEdBQUc7RUFDL0IsRUFBRSxFQUFFLGlCQUQyQjtFQUUvQixNQUFNLEVBQUUsQ0FBQyxjQUFELEVBQWlCLGdCQUFqQixDQUZ1QjtFQUcvQixPQUFPLEVBQVAsV0FIK0I7RUFJL0IsU0FBUyxFQUFFO0lBQ1QsMkJBQUEsRUFBNkIsa0JBRHBCO0lBRVQsMEJBQUEsRUFBNEIsa0JBRm5CO0lBR1QseUJBQUEsRUFBMkIsa0JBSGxCO0lBS1Qsa0JBQUEsRUFBb0IsU0FBQSxlQUFBLENBQUEsS0FBQSxFQUFxQjtNQUFBLElBQWxCLFdBQWtCLEdBQUEsS0FBQSxDQUFsQixXQUFrQixDQUFBO01BQ3ZDLFdBQVcsQ0FBQyxPQUFaLEdBQXNCO1FBQ3BCLEtBQUssRUFBRSxDQURhO1FBRXBCLFFBQVEsRUFBRSxDQUZVO1FBR3BCLEtBQUssRUFBRSxDQUhhO1FBSXBCLFVBQVUsRUFBRSxDQUpRO1FBS3BCLGFBQWEsRUFBRSxDQUFBO09BTGpCLENBQUE7S0FOTztJQWVULGtCQUFBLEVBQW9CLFNBQUEsY0FBQSxDQUFBLEdBQUcsRUFBSTtNQUN6QixJQUFJLEdBQUcsQ0FBQyxXQUFKLENBQWdCLFFBQWhCLENBQXlCLE1BQXpCLEdBQWtDLENBQXRDLEVBQXlDO1FBQ3ZDLE9BQU8sU0FBUCxDQUFBO09BQ0Q7O01BRUQsSUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLFlBQUosQ0FBaUIsT0FBakIsQ0FBeUIsT0FBaEQsQ0FBQTs7TUFFQSxJQUFJLEVBQUUsY0FBYyxJQUFJLGNBQWMsQ0FBQyxPQUFuQyxDQUFKLEVBQWlEO1FBQy9DLE9BQU8sU0FBUCxDQUFBO09BQ0Q7O01BRUQsR0FBRyxDQUFDLE1BQUosR0FBYTtRQUFFLElBQUksRUFBRSxTQUFBO09BQXJCLENBQUE7TUFFQSxPQUFPLEtBQVAsQ0FBQTtLQUNEO0dBakM0QjtFQW9DL0IsUUFBUSxFQUFFLEVBcENxQjtFQXVDL0IsU0F2QytCLEVBQUEsU0FBQSxTQUFBLEdBdUNsQjtJQUNYLE9BQU8sRUFBUCxDQUFBO0dBQ0Q7Q0F6Q0gsQ0FBQTttQkE0Q2U7Ozs7Ozs7Ozs7Ozs7QUN0TWYsK0VBQUE7O0FBRUEsSUFBQSxPQUFBLEdBQUEsMkJBQUEsQ0FBQSxhQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLFdBQUEsR0FBQSwwQkFBQSxDQUFBLFdBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsTUFBQSxHQUFBLDJCQUFBLENBQUEsT0FBQSxDQUFBLENBQUE7Ozs7Ozs7O0FBb0NBLFNBQVMsV0FBVCxDQUFrQixLQUFsQixFQUFnQztFQUFBLElBRTVCLE9BRjRCLEdBTzFCLEtBUDBCLENBRTVCLE9BRjRCO01BRzVCLE9BSDRCLEdBTzFCLEtBUDBCLENBRzVCLE9BSDRCO01BSzVCLFlBTDRCLEdBTzFCLEtBUDBCLENBSzVCLFlBTDRCO01BTTVCLFFBTjRCLEdBTzFCLEtBUDBCLENBTTVCLFFBTjRCLENBQUE7O0VBVzlCLE1BQU0sQ0FBQyxPQUFQLEdBQWlCLFdBQVcsQ0FBQyxPQUFELENBQTVCLENBQUE7RUFDQSxNQUFNLENBQUMsYUFBUCxHQUF1QixPQUFPLENBQUMsYUFBUixJQUF5QixPQUFPLENBQUMsb0JBQWpDLEdBQXdELEVBQXhELEdBQTZELEVBQXBGLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBK0NBLFlBQVksQ0FBQyxTQUFiLENBQXVCLFNBQXZCLEdBQW1DLFVBQXVDLE9BQXZDLEVBQXFGO0lBQ3RILE9BQU8sU0FBUyxDQUFDLElBQUQsRUFBTyxPQUFQLEVBQWdCLEtBQWhCLENBQWhCLENBQUE7R0FERixDQUFBOztFQUlBLE9BQU8sQ0FBQyxHQUFSLENBQVksTUFBWixHQUFxQixNQUFyQixDQUFBO0VBQ0EsT0FBTyxDQUFDLFVBQVIsQ0FBbUIsTUFBbkIsR0FBNEIsV0FBNUIsQ0FBQTtFQUVBLFFBQVEsQ0FBQyxPQUFULENBQWlCLE1BQWpCLEdBQTBCLE1BQU0sQ0FBQyxRQUFqQyxDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxhQUFULENBQXdCLEdBQXhCLEVBQTZCO0VBQUEsSUFDbkIsV0FEbUIsR0FDbUMsR0FEbkMsQ0FDbkIsV0FEbUI7TUFDTixZQURNLEdBQ21DLEdBRG5DLENBQ04sWUFETTtNQUNRLE9BRFIsR0FDbUMsR0FEbkMsQ0FDUSxPQURSO01BQ2lCLElBRGpCLEdBQ21DLEdBRG5DLENBQ2lCLElBRGpCO01BQ3VCLE9BRHZCLEdBQ21DLEdBRG5DLENBQ3VCLE9BRHZCLENBQUE7O0VBRzNCLElBQUksQ0FBQyxJQUFMLEVBQVc7SUFBRSxPQUFPLFNBQVAsQ0FBQTtHQUFrQjs7RUFFL0IsSUFBTSxJQUFJLEdBQUcsQ0FBQSxDQUFBLEVBQUEsV0FBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLEVBQVAsRUFBVyxXQUFXLENBQUMsTUFBWixDQUFtQixHQUFuQixDQUF1QixJQUFsQyxDQUFiLENBQUE7RUFDQSxJQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsT0FBYixDQUFxQixNQUEzQyxDQUFBOztFQUVBLElBQ0UsRUFBRSxhQUFhLElBQUksYUFBYSxDQUFDLE9BQWpDLENBQUE7RUFFQyxXQUFXLENBQUMsYUFBWixJQUNBLGVBQUEsQ0FBZ0IsSUFBaEIsQ0FBcUIsV0FBVyxDQUFDLFdBQWpDLENBREEsSUFFRixDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsWUFBekIsTUFBMkMsQ0FMNUMsRUFNRTtJQUNBLE9BQU8sU0FBUCxDQUFBO0dBZnlCOzs7RUFtQjNCLElBQUksTUFBRSxDQUFDLE1BQUgsQ0FBVSxhQUFhLENBQUMsS0FBeEIsQ0FBSixFQUFvQztJQUNsQyxJQUFNLFdBQVcsR0FBRztNQUNsQixJQUFJLEVBQUUsS0FEWTtNQUVsQixLQUFLLEVBQUUsS0FGVztNQUdsQixHQUFHLEVBQUUsS0FIYTtNQUlsQixNQUFNLEVBQUUsS0FBQTtLQUpWLENBQUE7O0lBT0EsS0FBSyxJQUFNLElBQVgsSUFBbUIsV0FBbkIsRUFBZ0M7TUFDOUIsV0FBVyxDQUFDLElBQUQsQ0FBWCxHQUFvQixlQUFlLENBQUMsSUFBRCxFQUNqQyxhQUFhLENBQUMsS0FBZCxDQUFvQixJQUFwQixDQURpQyxFQUVqQyxJQUZpQyxFQUdqQyxXQUFXLENBQUMsY0FBWixDQUEyQixXQUhNLEVBSWpDLE9BSmlDLEVBS2pDLElBTGlDLEVBTWpDLGFBQWEsQ0FBQyxNQUFkLElBQXdCLE1BQU0sQ0FBQyxhQU5FLENBQW5DLENBQUE7S0FPRDs7SUFFRCxXQUFXLENBQUMsSUFBWixHQUFtQixXQUFXLENBQUMsSUFBWixJQUFvQixDQUFDLFdBQVcsQ0FBQyxLQUFwRCxDQUFBO0lBQ0EsV0FBVyxDQUFDLEdBQVosR0FBbUIsV0FBVyxDQUFDLEdBQVosSUFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBcEQsQ0FBQTs7SUFFQSxJQUFJLFdBQVcsQ0FBQyxJQUFaLElBQW9CLFdBQVcsQ0FBQyxLQUFoQyxJQUF5QyxXQUFXLENBQUMsR0FBckQsSUFBNEQsV0FBVyxDQUFDLE1BQTVFLEVBQW9GO01BQ2xGLEdBQUcsQ0FBQyxNQUFKLEdBQWE7UUFDWCxJQUFJLEVBQUUsUUFESztRQUVYLEtBQUssRUFBRSxXQUFBO09BRlQsQ0FBQTtLQUlEO0dBMUJILE1BNEJLO0lBQ0gsSUFBTSxLQUFLLEdBQUksYUFBYSxDQUFDLElBQWQsS0FBdUIsR0FBdkIsSUFBOEIsSUFBSSxDQUFDLENBQUwsR0FBVSxJQUFJLENBQUMsS0FBTCxHQUFjLE1BQU0sQ0FBQyxhQUE1RSxDQUFBO0lBQ0EsSUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLElBQWQsS0FBdUIsR0FBdkIsSUFBOEIsSUFBSSxDQUFDLENBQUwsR0FBVSxJQUFJLENBQUMsTUFBTCxHQUFjLE1BQU0sQ0FBQyxhQUE1RSxDQUFBOztJQUVBLElBQUksS0FBSyxJQUFJLE1BQWIsRUFBcUI7TUFDbkIsR0FBRyxDQUFDLE1BQUosR0FBYTtRQUNYLElBQUksRUFBRSxRQURLO1FBRVgsSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLEdBQUgsR0FBUyxFQUFmLEtBQXNCLE1BQU0sR0FBRyxHQUFILEdBQVMsRUFBckMsQ0FBQTtPQUZSLENBQUE7S0FJRDtHQUNGOztFQUVELE9BQU8sR0FBRyxDQUFDLE1BQUosR0FBYSxLQUFiLEdBQXFCLFNBQTVCLENBQUE7Q0FDRDs7QUFFRCxTQUFTLFNBQVQsQ0FBb0IsWUFBcEIsRUFBeUQsT0FBekQsRUFBMkgsS0FBM0gsRUFBeUk7RUFDdkksSUFBSSxNQUFFLENBQUMsTUFBSCxDQUFVLE9BQVYsQ0FBSixFQUF3QjtJQUN0QixZQUFZLENBQUMsT0FBYixDQUFxQixNQUFyQixDQUE0QixPQUE1QixHQUFzQyxPQUFPLENBQUMsT0FBUixLQUFvQixLQUExRCxDQUFBO0lBQ0EsWUFBWSxDQUFDLFlBQWIsQ0FBMEIsUUFBMUIsRUFBb0MsT0FBcEMsQ0FBQSxDQUFBO0lBQ0EsWUFBWSxDQUFDLFdBQWIsQ0FBeUIsUUFBekIsRUFBbUMsT0FBbkMsQ0FBQSxDQUFBOztJQUVBLElBQUksTUFBRSxDQUFDLE1BQUgsQ0FBVSxPQUFPLENBQUMsSUFBbEIsQ0FBQSxJQUEyQixjQUFBLENBQWUsSUFBZixDQUFvQixPQUFPLENBQUMsSUFBNUIsQ0FBL0IsRUFBa0U7TUFDaEUsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsTUFBckIsQ0FBNEIsSUFBNUIsR0FBbUMsT0FBTyxDQUFDLElBQTNDLENBQUE7S0FERixNQUdLLElBQUksT0FBTyxDQUFDLElBQVIsS0FBaUIsSUFBckIsRUFBMkI7TUFDOUIsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsTUFBckIsQ0FBNEIsSUFBNUIsR0FBbUMsS0FBSyxDQUFDLFFBQU4sQ0FBZSxPQUFmLENBQXVCLE1BQXZCLENBQThCLElBQWpFLENBQUE7S0FDRDs7SUFFRCxJQUFJLE1BQUUsQ0FBQyxJQUFILENBQVEsT0FBTyxDQUFDLG1CQUFoQixDQUFKLEVBQTBDO01BQ3hDLFlBQVksQ0FBQyxPQUFiLENBQXFCLE1BQXJCLENBQTRCLG1CQUE1QixHQUFrRCxPQUFPLENBQUMsbUJBQTFELENBQUE7S0FERixNQUdLLElBQUksTUFBRSxDQUFDLElBQUgsQ0FBUSxPQUFPLENBQUMsTUFBaEIsQ0FBSixFQUE2QjtNQUNoQyxZQUFZLENBQUMsT0FBYixDQUFxQixNQUFyQixDQUE0QixNQUE1QixHQUFxQyxPQUFPLENBQUMsTUFBN0MsQ0FBQTtLQUNEOztJQUVELE9BQU8sWUFBUCxDQUFBO0dBQ0Q7O0VBQ0QsSUFBSSxNQUFFLENBQUMsSUFBSCxDQUFRLE9BQVIsQ0FBSixFQUFzQjtJQUNwQixZQUFZLENBQUMsT0FBYixDQUFxQixNQUFyQixDQUE0QixPQUE1QixHQUFzQyxPQUF0QyxDQUFBO0lBRUEsT0FBTyxZQUFQLENBQUE7R0FDRDs7RUFDRCxPQUFPLFlBQVksQ0FBQyxPQUFiLENBQXFCLE1BQTVCLENBQUE7Q0FDRDs7QUFFRCxTQUFTLGVBQVQsQ0FDRSxJQURGLEVBRUUsS0FGRixFQUdFLElBSEYsRUFJRSxPQUpGLEVBS0UsbUJBTEYsRUFNRSxJQU5GLEVBT0UsTUFQRixFQVFFOztFQUVBLElBQUksQ0FBQyxLQUFMLEVBQVk7SUFBRSxPQUFPLEtBQVAsQ0FBQTtHQUZkOzs7RUFLQSxJQUFJLEtBQUssS0FBSyxJQUFkLEVBQW9COztJQUVsQixJQUFNLEtBQUssR0FBSSxNQUFFLENBQUMsTUFBSCxDQUFVLElBQUksQ0FBQyxLQUFmLENBQUEsR0FBd0IsSUFBSSxDQUFDLEtBQTdCLEdBQXNDLElBQUksQ0FBQyxLQUFMLEdBQWMsSUFBSSxDQUFDLElBQXhFLENBQUE7SUFDQSxJQUFNLE1BQU0sR0FBRyxNQUFFLENBQUMsTUFBSCxDQUFVLElBQUksQ0FBQyxNQUFmLENBQUEsR0FBeUIsSUFBSSxDQUFDLE1BQTlCLEdBQXVDLElBQUksQ0FBQyxNQUFMLEdBQWMsSUFBSSxDQUFDLEdBQXpFLENBSGtCOztJQU1sQixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUwsQ0FBUyxNQUFULEVBQWlCLENBQUMsSUFBSSxLQUFLLE1BQVQsSUFBbUIsSUFBSSxLQUFLLE9BQTVCLEdBQXNDLEtBQXRDLEdBQThDLE1BQS9DLElBQXlELENBQTFFLENBQVQsQ0FBQTs7SUFFQSxJQUFJLEtBQUssR0FBRyxDQUFaLEVBQWU7TUFDYixJQUFTLElBQUksS0FBSyxNQUFsQixFQUEyQjtRQUFFLElBQUksR0FBRyxPQUFQLENBQUE7T0FBN0IsTUFDSyxJQUFJLElBQUksS0FBSyxPQUFiLEVBQXNCO1FBQUUsSUFBSSxHQUFHLE1BQVAsQ0FBQTtPQUFnQjtLQUM5Qzs7SUFDRCxJQUFJLE1BQU0sR0FBRyxDQUFiLEVBQWdCO01BQ2QsSUFBUyxJQUFJLEtBQUssS0FBbEIsRUFBNEI7UUFBRSxJQUFJLEdBQUcsUUFBUCxDQUFBO09BQTlCLE1BQ0ssSUFBSSxJQUFJLEtBQUssUUFBYixFQUF1QjtRQUFFLElBQUksR0FBRyxLQUFQLENBQUE7T0FBaUI7S0FDaEQ7O0lBRUQsSUFBSSxJQUFJLEtBQUssTUFBYixFQUFxQjtNQUFFLE9BQU8sSUFBSSxDQUFDLENBQUwsR0FBVSxDQUFDLEtBQUssSUFBSyxDQUFWLEdBQWMsSUFBSSxDQUFDLElBQW5CLEdBQTBCLElBQUksQ0FBQyxLQUFoQyxJQUF5QyxNQUExRCxDQUFBO0tBQW1FOztJQUMxRixJQUFJLElBQUksS0FBSyxLQUFiLEVBQW9CO01BQUUsT0FBTyxJQUFJLENBQUMsQ0FBTCxHQUFVLENBQUMsTUFBTSxJQUFJLENBQVYsR0FBYyxJQUFJLENBQUMsR0FBbkIsR0FBeUIsSUFBSSxDQUFDLE1BQS9CLElBQXlDLE1BQTFELENBQUE7S0FBbUU7O0lBRXpGLElBQUksSUFBSSxLQUFLLE9BQWIsRUFBc0I7TUFBRSxPQUFPLElBQUksQ0FBQyxDQUFMLEdBQVUsQ0FBQyxLQUFLLElBQUssQ0FBVixHQUFjLElBQUksQ0FBQyxLQUFuQixHQUEyQixJQUFJLENBQUMsSUFBakMsSUFBeUMsTUFBMUQsQ0FBQTtLQUFtRTs7SUFDM0YsSUFBSSxJQUFJLEtBQUssUUFBYixFQUF1QjtNQUFFLE9BQU8sSUFBSSxDQUFDLENBQUwsR0FBVSxDQUFDLE1BQU0sSUFBSSxDQUFWLEdBQWMsSUFBSSxDQUFDLE1BQW5CLEdBQTRCLElBQUksQ0FBQyxHQUFsQyxJQUF5QyxNQUExRCxDQUFBO0tBQW1FO0dBMUI5Rjs7O0VBOEJBLElBQUksQ0FBQyxNQUFFLENBQUMsT0FBSCxDQUFXLE9BQVgsQ0FBTCxFQUEwQjtJQUFFLE9BQU8sS0FBUCxDQUFBO0dBQWM7O0VBRTFDLE9BQU8sTUFBRSxDQUFDLE9BQUgsQ0FBVyxLQUFYLENBQUE7SUFFSCxLQUFLLEtBQUssT0FGUDtJQUlILE9BQUcsQ0FBQyxXQUFKLENBQWdCLE9BQWhCLEVBQXlCLEtBQXpCLEVBQWdDLG1CQUFoQyxDQUpKLENBQUE7Q0FLRDs7QUFFRCxTQUFTLFdBQVQsQ0FBc0IsT0FBdEIsRUFBb0Y7RUFDbEYsT0FBUSxPQUFPLENBQUMsS0FBUixHQUFnQjtJQUN0QixDQUFDLEVBQUcsVUFEa0I7SUFFdEIsQ0FBQyxFQUFHLFVBRmtCO0lBR3RCLEVBQUUsRUFBRSxXQUhrQjtJQUt0QixHQUFHLEVBQVUsVUFMUztJQU10QixJQUFJLEVBQVMsVUFOUztJQU90QixNQUFNLEVBQU8sVUFQUztJQVF0QixLQUFLLEVBQVEsVUFSUztJQVN0QixPQUFPLEVBQU0sV0FUUztJQVV0QixXQUFXLEVBQUUsV0FWUztJQVd0QixRQUFRLEVBQUssV0FYUztJQVl0QixVQUFVLEVBQUcsV0FBQTtHQVpQLEdBYUo7SUFDRixDQUFDLEVBQUcsV0FERjtJQUVGLENBQUMsRUFBRyxXQUZGO0lBR0YsRUFBRSxFQUFFLGFBSEY7SUFLRixHQUFHLEVBQVUsV0FMWDtJQU1GLElBQUksRUFBUyxXQU5YO0lBT0YsTUFBTSxFQUFPLFdBUFg7SUFRRixLQUFLLEVBQVEsV0FSWDtJQVNGLE9BQU8sRUFBTSxhQVRYO0lBVUYsV0FBVyxFQUFFLGFBVlg7SUFXRixRQUFRLEVBQUssYUFYWDtJQVlGLFVBQVUsRUFBRyxhQUFBO0dBekJmLENBQUE7Q0EyQkQ7O0FBRUQsU0FBUyxLQUFULENBQUEsSUFBQSxFQUFpSDtFQUFBLElBQS9GLE1BQStGLEdBQUEsSUFBQSxDQUEvRixNQUErRjtNQUF2RixXQUF1RixHQUFBLElBQUEsQ0FBdkYsV0FBdUYsQ0FBQTs7RUFDL0csSUFBSSxXQUFXLENBQUMsUUFBWixDQUFxQixJQUFyQixLQUE4QixRQUE5QixJQUEwQyxDQUFDLFdBQVcsQ0FBQyxRQUFaLENBQXFCLEtBQXBFLEVBQTJFO0lBQ3pFLE9BQUE7R0FDRDs7RUFFRCxJQUFNLFdBQVcsR0FBRyxNQUFwQixDQUFBO0VBQ0EsSUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQXpCLENBQUE7RUFFQSxXQUFXLENBQUMsTUFBWixHQUFxQjtJQUNuQixLQUFLLEVBQUUsQ0FBQSxDQUFBLEVBQUEsV0FBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLEVBQVAsRUFBVyxJQUFYLENBRFk7SUFFbkIsU0FBUyxFQUFFLENBQUEsQ0FBQSxFQUFBLFdBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxFQUFQLEVBQVcsSUFBWCxDQUZRO0lBR25CLFFBQVEsRUFBRSxDQUFBLENBQUEsRUFBQSxXQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sRUFBUCxFQUFXLElBQVgsQ0FIUztJQUluQixLQUFLLEVBQUU7TUFDTCxJQUFJLEVBQUUsQ0FERDtNQUVMLEtBQUssRUFBRyxDQUZIO01BR0wsS0FBSyxFQUFHLENBSEg7TUFJTCxHQUFHLEVBQUcsQ0FKRDtNQUtMLE1BQU0sRUFBRSxDQUxIO01BTUwsTUFBTSxFQUFFLENBQUE7S0FOSDtHQUpULENBQUE7RUFjQSxXQUFXLENBQUMsS0FBWixHQUFvQixXQUFXLENBQUMsUUFBWixDQUFxQixLQUF6QyxDQUFBO0VBQ0EsV0FBVyxDQUFDLElBQVosR0FBbUIsV0FBVyxDQUFDLE1BQVosQ0FBbUIsU0FBdEMsQ0FBQTtFQUNBLFdBQVcsQ0FBQyxTQUFaLEdBQXdCLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEtBQTNDLENBQUE7Q0FDRDs7QUFFRCxTQUFTLFFBQVQsQ0FBQSxLQUFBLEVBQWdIO0VBQUEsSUFBL0YsTUFBK0YsR0FBQSxLQUFBLENBQS9GLE1BQStGO01BQXZGLFdBQXVGLEdBQUEsS0FBQSxDQUF2RixXQUF1RixDQUFBOztFQUM5RyxJQUFJLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXJCLEtBQThCLFFBQTlCLElBQTBDLENBQUMsV0FBVyxDQUFDLFFBQVosQ0FBcUIsS0FBcEUsRUFBMkU7SUFBRSxPQUFBO0dBQVE7O0VBRXJGLElBQU0sV0FBVyxHQUFHLE1BQXBCLENBQUE7RUFDQSxJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsWUFBWixDQUF5QixPQUF6QixDQUFpQyxNQUF2RCxDQUFBO0VBQ0EsSUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQTdCLENBQUE7RUFDQSxJQUFNLFVBQVUsR0FBRyxNQUFNLEtBQUssWUFBWCxJQUEyQixNQUFNLEtBQUssUUFBekQsQ0FOOEc7O0VBUzlHLElBQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUE1QixDQUFBO0VBVDhHLElBQUEsbUJBQUEsR0FVMUMsV0FBVyxDQUFDLE1BVjhCO01BVS9GLFNBVitGLEdBQUEsbUJBQUEsQ0FVdEcsS0FWc0c7TUFVcEYsU0FWb0YsR0FBQSxtQkFBQSxDQVVwRixTQVZvRjtNQVVsRSxTQVZrRSxHQUFBLG1CQUFBLENBVXpFLEtBVnlFO01BVXZELFFBVnVELEdBQUEsbUJBQUEsQ0FVdkQsUUFWdUQsQ0FBQTtFQVk5RyxDQUFBLENBQUEsRUFBQSxXQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sUUFBUCxFQUFpQixTQUFqQixDQUFBLENBQUE7O0VBRUEsSUFBSSxVQUFKLEVBQWdCOztJQUVkLENBQUEsQ0FBQSxFQUFBLFdBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxTQUFQLEVBQWtCLE9BQWxCLENBQUEsQ0FBQTs7SUFFQSxJQUFJLE1BQU0sS0FBSyxZQUFmLEVBQTZCOztNQUUzQixJQUFJLFNBQVMsQ0FBQyxHQUFWLEdBQWdCLFNBQVMsQ0FBQyxNQUE5QixFQUFzQztRQUNwQyxJQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBdkIsQ0FBQTtRQUVBLFNBQVMsQ0FBQyxHQUFWLEdBQWdCLFNBQVMsQ0FBQyxNQUExQixDQUFBO1FBQ0EsU0FBUyxDQUFDLE1BQVYsR0FBbUIsSUFBbkIsQ0FBQTtPQUNEOztNQUNELElBQUksU0FBUyxDQUFDLElBQVYsR0FBaUIsU0FBUyxDQUFDLEtBQS9CLEVBQXNDO1FBQ3BDLElBQU0sS0FBSSxHQUFHLFNBQVMsQ0FBQyxJQUF2QixDQUFBO1FBRUEsU0FBUyxDQUFDLElBQVYsR0FBaUIsU0FBUyxDQUFDLEtBQTNCLENBQUE7UUFDQSxTQUFTLENBQUMsS0FBVixHQUFrQixLQUFsQixDQUFBO09BQ0Q7S0FDRjtHQWxCSCxNQW9CSzs7SUFFSCxTQUFTLENBQUMsR0FBVixHQUFtQixJQUFJLENBQUMsR0FBTCxDQUFTLE9BQU8sQ0FBQyxHQUFqQixFQUFzQixTQUFTLENBQUMsTUFBaEMsQ0FBbkIsQ0FBQTtJQUNBLFNBQVMsQ0FBQyxNQUFWLEdBQW1CLElBQUksQ0FBQyxHQUFMLENBQVMsT0FBTyxDQUFDLE1BQWpCLEVBQXlCLFNBQVMsQ0FBQyxHQUFuQyxDQUFuQixDQUFBO0lBQ0EsU0FBUyxDQUFDLElBQVYsR0FBbUIsSUFBSSxDQUFDLEdBQUwsQ0FBUyxPQUFPLENBQUMsSUFBakIsRUFBdUIsU0FBUyxDQUFDLEtBQWpDLENBQW5CLENBQUE7SUFDQSxTQUFTLENBQUMsS0FBVixHQUFtQixJQUFJLENBQUMsR0FBTCxDQUFTLE9BQU8sQ0FBQyxLQUFqQixFQUF3QixTQUFTLENBQUMsSUFBbEMsQ0FBbkIsQ0FBQTtHQUNEOztFQUVELFNBQVMsQ0FBQyxLQUFWLEdBQW1CLFNBQVMsQ0FBQyxLQUFWLEdBQW1CLFNBQVMsQ0FBQyxJQUFoRCxDQUFBO0VBQ0EsU0FBUyxDQUFDLE1BQVYsR0FBbUIsU0FBUyxDQUFDLE1BQVYsR0FBbUIsU0FBUyxDQUFDLEdBQWhELENBQUE7O0VBRUEsS0FBSyxJQUFNLElBQVgsSUFBbUIsU0FBbkIsRUFBOEI7SUFDNUIsU0FBUyxDQUFDLElBQUQsQ0FBVCxHQUFrQixTQUFTLENBQUMsSUFBRCxDQUFULEdBQWtCLFFBQVEsQ0FBQyxJQUFELENBQTVDLENBQUE7R0FDRDs7RUFFRCxXQUFXLENBQUMsS0FBWixHQUFvQixXQUFXLENBQUMsUUFBWixDQUFxQixLQUF6QyxDQUFBO0VBQ0EsV0FBVyxDQUFDLElBQVosR0FBbUIsU0FBbkIsQ0FBQTtFQUNBLFdBQVcsQ0FBQyxTQUFaLEdBQXdCLFNBQXhCLENBQUE7Q0FDRDs7QUFFRCxTQUFTLEdBQVQsQ0FBQSxLQUFBLEVBQStHO0VBQUEsSUFBL0YsTUFBK0YsR0FBQSxLQUFBLENBQS9GLE1BQStGO01BQXZGLFdBQXVGLEdBQUEsS0FBQSxDQUF2RixXQUF1RixDQUFBOztFQUM3RyxJQUFJLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXJCLEtBQThCLFFBQTlCLElBQTBDLENBQUMsV0FBVyxDQUFDLFFBQVosQ0FBcUIsS0FBcEUsRUFBMkU7SUFBRSxPQUFBO0dBQVE7O0VBRXJGLElBQU0sV0FBVyxHQUFHLE1BQXBCLENBQUE7RUFFQSxXQUFXLENBQUMsS0FBWixHQUFvQixXQUFXLENBQUMsUUFBWixDQUFxQixLQUF6QyxDQUFBO0VBQ0EsV0FBVyxDQUFDLElBQVosR0FBbUIsV0FBVyxDQUFDLE1BQVosQ0FBbUIsU0FBdEMsQ0FBQTtFQUNBLFdBQVcsQ0FBQyxTQUFaLEdBQXdCLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEtBQTNDLENBQUE7Q0FDRDs7QUFFRCxTQUFTLGVBQVQsQ0FBQSxLQUFBLEVBQTJIO0VBQUEsSUFBL0YsTUFBK0YsR0FBQSxLQUFBLENBQS9GLE1BQStGO01BQXZGLFdBQXVGLEdBQUEsS0FBQSxDQUF2RixXQUF1RixDQUFBOztFQUN6SCxJQUFJLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXJCLEtBQThCLFFBQTlCLElBQTBDLENBQUMsV0FBVyxDQUFDLFVBQTNELEVBQXVFO0lBQUUsT0FBQTtHQUFROztFQUVqRixJQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWixDQUF5QixPQUF6QyxDQUFBO0VBQ0EsSUFBTSxXQUFXLEdBQUcsTUFBcEIsQ0FBQTs7RUFFQSxJQUFJLE9BQU8sQ0FBQyxNQUFSLENBQWUsTUFBbkIsRUFBMkI7SUFDekIsSUFBSSxXQUFXLENBQUMsVUFBWixLQUEyQixHQUEvQixFQUFvQztNQUNsQyxXQUFXLENBQUMsS0FBWixDQUFrQixDQUFsQixHQUFzQixXQUFXLENBQUMsS0FBWixDQUFrQixDQUF4QyxDQUFBO0tBREYsTUFHSztNQUNILFdBQVcsQ0FBQyxLQUFaLENBQWtCLENBQWxCLEdBQXNCLFdBQVcsQ0FBQyxLQUFaLENBQWtCLENBQXhDLENBQUE7S0FDRDs7SUFDRCxXQUFXLENBQUMsSUFBWixHQUFtQixJQUFuQixDQUFBO0dBUEYsTUFTSztJQUNILFdBQVcsQ0FBQyxJQUFaLEdBQW1CLFdBQVcsQ0FBQyxVQUEvQixDQUFBOztJQUVBLElBQUksV0FBVyxDQUFDLFVBQVosS0FBMkIsR0FBL0IsRUFBb0M7TUFDbEMsV0FBVyxDQUFDLEtBQVosQ0FBa0IsQ0FBbEIsR0FBc0IsQ0FBdEIsQ0FBQTtLQURGLE1BR0ssSUFBSSxXQUFXLENBQUMsVUFBWixLQUEyQixHQUEvQixFQUFvQztNQUN2QyxXQUFXLENBQUMsS0FBWixDQUFrQixDQUFsQixHQUFzQixDQUF0QixDQUFBO0tBQ0Q7R0FDRjtDQUNGOztBQUVELElBQU0sTUFBdUIsR0FBRztFQUM5QixFQUFFLEVBQUUsZ0JBRDBCO0VBRTlCLE1BQU0sRUFBRSxDQUFDLGNBQUQsQ0FGc0I7RUFHOUIsT0FBTyxFQUFQLFdBSDhCO0VBSTlCLFNBQVMsRUFBRTtJQUNULGtCQUFBLEVBQW9CLFNBQUEsZUFBQSxDQUFBLEtBQUEsRUFBcUI7TUFBQSxJQUFsQixXQUFrQixHQUFBLEtBQUEsQ0FBbEIsV0FBa0IsQ0FBQTtNQUN2QyxXQUFXLENBQUMsVUFBWixHQUF5QixJQUF6QixDQUFBO0tBRk87SUFLVCwyQkFBQSxFQUE2QixTQUFBLHVCQUFBLENBQUEsR0FBRyxFQUFJO01BQ2xDLEtBQUssQ0FBQyxHQUFELENBQUwsQ0FBQTtNQUNBLGVBQWUsQ0FBQyxHQUFELENBQWYsQ0FBQTtLQVBPO0lBU1QsMEJBQUEsRUFBNEIsU0FBQSxzQkFBQSxDQUFBLEdBQUcsRUFBSTtNQUNqQyxRQUFJLENBQUMsR0FBRCxDQUFKLENBQUE7TUFDQSxlQUFlLENBQUMsR0FBRCxDQUFmLENBQUE7S0FYTztJQWFULHlCQUFBLEVBQTJCLEdBYmxCO0lBY1Qsa0JBQUEsRUFBb0IsYUFBQTtHQWxCUTtFQXFCOUIsUUFBUSxFQUFFO0lBQ1IsTUFBTSxFQUFFLEtBREE7SUFFUixtQkFBbUIsRUFBRSxLQUZiO0lBR1IsSUFBSSxFQUFFLElBSEU7O0lBTVIsTUFBTSxFQUFFLEdBTkE7Ozs7O0lBWVIsS0FBSyxFQUFFLElBWkM7Ozs7O0lBa0JSLE1BQU0sRUFBRSxNQUFBO0dBdkNvQjtFQTBDOUIsT0FBTyxFQUFFLElBMUNxQjtFQTRDOUIsU0E1QzhCLEVBQUEsU0FBQSxTQUFBLENBQUEsS0FBQSxFQTRDMEI7SUFBQSxJQUEzQyxLQUEyQyxHQUFBLEtBQUEsQ0FBM0MsS0FBMkM7UUFBcEMsSUFBb0MsR0FBQSxLQUFBLENBQXBDLElBQW9DO1FBQTlCLElBQThCLEdBQUEsS0FBQSxDQUE5QixJQUE4QixDQUFBO0lBQ3RELElBQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUF2QixDQUFBO0lBQ0EsSUFBSSxNQUFjLEdBQUcsSUFBckIsQ0FBQTs7SUFFQSxJQUFJLElBQUosRUFBVTtNQUNSLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQVIsQ0FBaEIsQ0FBQTtLQURGLE1BR0ssSUFBSSxLQUFKLEVBQVc7TUFDZCxJQUFJLFNBQVMsR0FBRyxFQUFoQixDQUFBO01BRGMsSUFBQSxJQUFBLEdBR0ssQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixPQUExQixDQUhMLENBQUE7O01BR2QsS0FBQSxJQUFBLEVBQUEsR0FBQSxDQUFBLEVBQUEsRUFBQSxHQUFBLElBQUEsQ0FBQSxNQUFBLEVBQUEsRUFBQSxFQUFBLEVBQXVEO1FBQWxELElBQU0sSUFBSSxHQUFBLElBQUEsQ0FBQSxFQUFBLENBQVYsQ0FBQTs7UUFDSCxJQUFJLEtBQUssQ0FBQyxJQUFELENBQVQsRUFBaUI7VUFDZixTQUFTLElBQUksSUFBYixDQUFBO1NBQ0Q7T0FDRjs7TUFFRCxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQUQsQ0FBaEIsQ0FBQTtLQUNEOztJQUVELE9BQU8sTUFBUCxDQUFBO0dBL0Q0QjtFQWtFOUIsYUFBYSxFQUFFLElBQUE7Q0FsRWpCLENBQUE7bUJBcUVlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hkZixJQUFBLFNBQUEsR0FBQSwwQkFBQSxDQUFBLFFBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsTUFBQSxHQUFBLDBCQUFBLENBQUEsU0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxRQUFBLEdBQUEsMEJBQUEsQ0FBQSxXQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLE9BQUEsR0FBQSwwQkFBQSxDQUFBLFVBQUEsQ0FBQSxDQUFBOzs7O21CQUVlO0VBQ2IsRUFBRSxFQUFFLFNBRFM7RUFFYixPQUZhLEVBQUEsU0FBQSxPQUFBLENBRUosS0FGSSxFQUVVO0lBQ3JCLEtBQUssQ0FBQyxTQUFOLENBQWdCLFFBQUEsQ0FBQSxTQUFBLENBQWhCLENBQUEsQ0FBQTtJQUNBLEtBQUssQ0FBQyxTQUFOLENBQWdCLE9BQUEsQ0FBQSxTQUFBLENBQWhCLENBQUEsQ0FBQTtJQUNBLEtBQUssQ0FBQyxTQUFOLENBQWdCLFNBQUEsQ0FBQSxTQUFBLENBQWhCLENBQUEsQ0FBQTtJQUNBLEtBQUssQ0FBQyxTQUFOLENBQWdCLE1BQUEsQ0FBQSxTQUFBLENBQWhCLENBQUEsQ0FBQTtHQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiSCxJQUFBLFlBQUEsR0FBQSwyQkFBQSxDQUFBLGFBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsTUFBQSxHQUFBLDJCQUFBLENBQUEsT0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxRQUFBLEdBQUEsMEJBQUEsQ0FBQSxRQUFBLENBQUEsQ0FBQTs7QUFDQSxrRUFBQTs7QUFDQSxzRUFBQTs7Ozs7Ozs7QUErQkEsU0FBUyxXQUFULENBQWtCLEtBQWxCLEVBQWdDO0VBQUEsSUFFNUIsUUFGNEIsR0FJMUIsS0FKMEIsQ0FFNUIsUUFGNEI7TUFHNUIsT0FINEIsR0FJMUIsS0FKMEIsQ0FHNUIsT0FINEIsQ0FBQTtFQU05QixLQUFLLENBQUMsVUFBTixHQUFtQixVQUFuQixDQUFBOztFQUNBLFVBQVUsQ0FBQyxHQUFYLEdBQWlCLFlBQUE7SUFBQSxPQUFNLEtBQUssQ0FBQyxHQUFOLEVBQU4sQ0FBQTtHQUFqQixDQUFBOztFQUVBLE9BQU8sQ0FBQyxjQUFSLENBQXVCLFVBQXZCLEdBQW9DLElBQXBDLENBQUE7RUFDQSxRQUFRLENBQUMsU0FBVCxDQUFtQixVQUFuQixHQUFnQyxVQUFVLENBQUMsUUFBM0MsQ0FBQTtDQUNEOztBQUVELElBQU0sVUFBVSxHQUFHO0VBQ2pCLFFBQVEsRUFBRTtJQUNSLE9BQU8sRUFBSSxLQURIO0lBRVIsTUFBTSxFQUFLLEVBRkg7O0lBS1IsU0FBUyxFQUFFLElBTEg7O0lBUVIsS0FBSyxFQUFNLEdBQUE7R0FUSTtFQVlqQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBWk87RUFjakIsV0FBVyxFQUFFLElBZEk7RUFlakIsQ0FBQyxFQUFFLENBZmM7OztFQWtCakIsQ0FBQyxFQUFFLENBbEJjO0VBbUJqQixDQUFDLEVBQUUsQ0FuQmM7RUFxQmpCLFdBQVcsRUFBRSxLQXJCSTtFQXNCakIsUUFBUSxFQUFFLENBdEJPO0VBdUJqQixNQUFNLEVBQUUsQ0F2QlM7RUF3QmpCLEtBQUssRUFBRSxDQXhCVTtFQTBCakIsS0ExQmlCLEVBQUEsU0FBQSxLQUFBLENBMEJWLFdBMUJVLEVBMEJ5QjtJQUN4QyxVQUFVLENBQUMsV0FBWCxHQUF5QixJQUF6QixDQUFBOztJQUNBLFFBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBSSxNQUFKLENBQVcsVUFBVSxDQUFDLENBQXRCLENBQUEsQ0FBQTs7SUFFQSxXQUFXLENBQUMsVUFBWixHQUF5QixVQUF6QixDQUFBO0lBQ0EsVUFBVSxDQUFDLFdBQVgsR0FBeUIsV0FBekIsQ0FBQTtJQUNBLFVBQVUsQ0FBQyxRQUFYLEdBQXNCLFVBQVUsQ0FBQyxHQUFYLEVBQXRCLENBQUE7SUFDQSxVQUFVLENBQUMsQ0FBWCxHQUFlLFFBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBSSxPQUFKLENBQVksVUFBVSxDQUFDLE1BQXZCLENBQWYsQ0FBQTtHQWpDZTtFQW9DakIsSUFwQ2lCLEVBQUEsU0FBQSxJQUFBLEdBb0NUO0lBQ04sVUFBVSxDQUFDLFdBQVgsR0FBeUIsS0FBekIsQ0FBQTs7SUFDQSxJQUFJLFVBQVUsQ0FBQyxXQUFmLEVBQTRCO01BQzFCLFVBQVUsQ0FBQyxXQUFYLENBQXVCLFVBQXZCLEdBQW9DLElBQXBDLENBQUE7S0FDRDs7SUFDRCxRQUFBLENBQUEsU0FBQSxDQUFBLENBQUksTUFBSixDQUFXLFVBQVUsQ0FBQyxDQUF0QixDQUFBLENBQUE7R0F6Q2U7O0VBNkNqQixNQTdDaUIsRUFBQSxTQUFBLE1BQUEsR0E2Q1A7SUFBQSxJQUNBLFdBREEsR0FDZ0IsVUFEaEIsQ0FDQSxXQURBLENBQUE7SUFBQSxJQUVBLFlBRkEsR0FFMEIsV0FGMUIsQ0FFQSxZQUZBO1FBRWMsT0FGZCxHQUUwQixXQUYxQixDQUVjLE9BRmQsQ0FBQTtJQUdSLElBQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXhDLENBQUE7SUFDQSxJQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBYixDQUFxQixVQUFyQixDQUFBLENBQWlDLFVBQWpELENBQUE7SUFDQSxJQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVQsRUFBb0IsWUFBcEIsRUFBa0MsT0FBbEMsQ0FBOUIsQ0FBQTtJQUNBLElBQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFYLEVBQVosQ0FOUTs7SUFRUixJQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsUUFBbEIsSUFBOEIsSUFBekMsQ0FSUTs7SUFVUixJQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBUixHQUFnQixFQUExQixDQUFBOztJQUVBLElBQUksQ0FBQyxJQUFJLENBQVQsRUFBWTtNQUNWLElBQU0sUUFBUSxHQUFHO1FBQ2YsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFYLEdBQWUsQ0FESDtRQUVmLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBWCxHQUFlLENBQUE7T0FGcEIsQ0FBQTs7TUFLQSxJQUFJLFFBQVEsQ0FBQyxDQUFULElBQWMsUUFBUSxDQUFDLENBQTNCLEVBQThCO1FBQzVCLElBQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFELENBQTVCLENBQUE7O1FBRUEsSUFBSSxNQUFFLENBQUMsTUFBSCxDQUFVLFNBQVYsQ0FBSixFQUEwQjtVQUN4QixTQUFTLENBQUMsUUFBVixDQUFtQixRQUFRLENBQUMsQ0FBNUIsRUFBK0IsUUFBUSxDQUFDLENBQXhDLENBQUEsQ0FBQTtTQURGLE1BR0ssSUFBSSxTQUFKLEVBQWU7VUFDbEIsU0FBUyxDQUFDLFVBQVYsSUFBd0IsUUFBUSxDQUFDLENBQWpDLENBQUE7VUFDQSxTQUFTLENBQUMsU0FBVixJQUF3QixRQUFRLENBQUMsQ0FBakMsQ0FBQTtTQUNEOztRQUVELElBQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFELENBQTNCLENBQUE7UUFDQSxJQUFNLEtBQUssR0FBRztVQUNaLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBVixHQUFjLFVBQVUsQ0FBQyxDQURoQjtVQUVaLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBVixHQUFjLFVBQVUsQ0FBQyxDQUFBO1NBRjlCLENBQUE7O1FBS0EsSUFBSSxLQUFLLENBQUMsQ0FBTixJQUFXLEtBQUssQ0FBQyxDQUFyQixFQUF3QjtVQUN0QixZQUFZLENBQUMsSUFBYixDQUFrQjtZQUNoQixJQUFJLEVBQUUsWUFEVTtZQUVoQixNQUFNLEVBQUUsT0FGUTtZQUdoQixZQUFZLEVBQVosWUFIZ0I7WUFJaEIsS0FBSyxFQUFMLEtBSmdCO1lBS2hCLFdBQVcsRUFBWCxXQUxnQjtZQU1oQixTQUFTLEVBQVQsU0FBQTtXQU5GLENBQUEsQ0FBQTtTQVFEO09BQ0Y7O01BRUQsVUFBVSxDQUFDLFFBQVgsR0FBc0IsR0FBdEIsQ0FBQTtLQUNEOztJQUVELElBQUksVUFBVSxDQUFDLFdBQWYsRUFBNEI7TUFDMUIsUUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFJLE1BQUosQ0FBVyxVQUFVLENBQUMsQ0FBdEIsQ0FBQSxDQUFBOztNQUNBLFVBQVUsQ0FBQyxDQUFYLEdBQWUsUUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFJLE9BQUosQ0FBWSxVQUFVLENBQUMsTUFBdkIsQ0FBZixDQUFBO0tBQ0Q7R0FsR2M7RUFvR2pCLEtBcEdpQixFQUFBLFNBQUEsS0FBQSxDQW9HVixZQXBHVSxFQW9HMkIsVUFwRzNCLEVBb0c0RDtJQUMzRSxJQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBN0IsQ0FBQTtJQUVBLE9BQU8sT0FBTyxDQUFDLFVBQUQsQ0FBUCxDQUFvQixVQUFwQixJQUFrQyxPQUFPLENBQUMsVUFBRCxDQUFQLENBQW9CLFVBQXBCLENBQStCLE9BQXhFLENBQUE7R0F2R2U7RUF5R2pCLGlCQXpHaUIsRUFBQSxTQUFBLGlCQUFBLENBQUEsSUFBQSxFQXlHb0k7SUFBQSxJQUFqRyxXQUFpRyxHQUFBLElBQUEsQ0FBakcsV0FBaUc7UUFBcEYsT0FBb0YsR0FBQSxJQUFBLENBQXBGLE9BQW9GLENBQUE7O0lBQ25KLElBQUksRUFBRSxXQUFXLENBQUMsV0FBWixFQUFBLElBQ0EsVUFBVSxDQUFDLEtBQVgsQ0FBaUIsV0FBVyxDQUFDLFlBQTdCLEVBQTJDLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQWhFLENBREYsQ0FBSixFQUM4RTtNQUM1RSxPQUFBO0tBQ0Q7O0lBRUQsSUFBSSxXQUFXLENBQUMsVUFBaEIsRUFBNEI7TUFDMUIsVUFBVSxDQUFDLENBQVgsR0FBZSxVQUFVLENBQUMsQ0FBWCxHQUFlLENBQTlCLENBQUE7TUFDQSxPQUFBO0tBQ0Q7O0lBRUQsSUFBSSxHQUFKLENBQUE7SUFDQSxJQUFJLEtBQUosQ0FBQTtJQUNBLElBQUksTUFBSixDQUFBO0lBQ0EsSUFBSSxJQUFKLENBQUE7SUFkbUosSUFnQjNJLFlBaEIySSxHQWdCakgsV0FoQmlILENBZ0IzSSxZQWhCMkk7UUFnQjdILE9BaEI2SCxHQWdCakgsV0FoQmlILENBZ0I3SCxPQWhCNkgsQ0FBQTtJQWlCbkosSUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFFBQVosQ0FBcUIsSUFBeEMsQ0FBQTtJQUNBLElBQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFiLENBQXFCLFVBQXJCLENBQUEsQ0FBaUMsVUFBakQsQ0FBQTtJQUNBLElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBVCxFQUFvQixZQUFwQixFQUFrQyxPQUFsQyxDQUE5QixDQUFBOztJQUVBLElBQUksTUFBRSxDQUFDLE1BQUgsQ0FBVSxTQUFWLENBQUosRUFBMEI7TUFDeEIsSUFBSSxHQUFLLE9BQU8sQ0FBQyxPQUFSLEdBQWtCLFVBQVUsQ0FBQyxNQUF0QyxDQUFBO01BQ0EsR0FBRyxHQUFNLE9BQU8sQ0FBQyxPQUFSLEdBQWtCLFVBQVUsQ0FBQyxNQUF0QyxDQUFBO01BQ0EsS0FBSyxHQUFJLE9BQU8sQ0FBQyxPQUFSLEdBQWtCLFNBQVMsQ0FBQyxVQUFWLEdBQXdCLFVBQVUsQ0FBQyxNQUE5RCxDQUFBO01BQ0EsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFSLEdBQWtCLFNBQVMsQ0FBQyxXQUFWLEdBQXdCLFVBQVUsQ0FBQyxNQUE5RCxDQUFBO0tBSkYsTUFNSztNQUNILElBQU0sSUFBSSxHQUFHLFlBQVEsQ0FBQyxvQkFBVCxDQUE4QixTQUE5QixDQUFiLENBQUE7TUFFQSxJQUFJLEdBQUssT0FBTyxDQUFDLE9BQVIsR0FBa0IsSUFBSSxDQUFDLElBQUwsR0FBYyxVQUFVLENBQUMsTUFBcEQsQ0FBQTtNQUNBLEdBQUcsR0FBTSxPQUFPLENBQUMsT0FBUixHQUFrQixJQUFJLENBQUMsR0FBTCxHQUFjLFVBQVUsQ0FBQyxNQUFwRCxDQUFBO01BQ0EsS0FBSyxHQUFJLE9BQU8sQ0FBQyxPQUFSLEdBQWtCLElBQUksQ0FBQyxLQUFMLEdBQWMsVUFBVSxDQUFDLE1BQXBELENBQUE7TUFDQSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQVIsR0FBa0IsSUFBSSxDQUFDLE1BQUwsR0FBYyxVQUFVLENBQUMsTUFBcEQsQ0FBQTtLQUNEOztJQUVELFVBQVUsQ0FBQyxDQUFYLEdBQWdCLEtBQUssR0FBRyxDQUFILEdBQU8sSUFBSSxHQUFHLENBQUMsQ0FBSixHQUFRLENBQXhDLENBQUE7SUFDQSxVQUFVLENBQUMsQ0FBWCxHQUFnQixNQUFNLEdBQUcsQ0FBSCxHQUFRLEdBQUcsR0FBRyxDQUFDLENBQUosR0FBUSxDQUF6QyxDQUFBOztJQUVBLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBaEIsRUFBNkI7O01BRTNCLFVBQVUsQ0FBQyxNQUFYLEdBQW9CLE9BQU8sQ0FBQyxNQUE1QixDQUFBO01BQ0EsVUFBVSxDQUFDLEtBQVgsR0FBb0IsT0FBTyxDQUFDLEtBQTVCLENBQUE7TUFFQSxVQUFVLENBQUMsS0FBWCxDQUFpQixXQUFqQixDQUFBLENBQUE7S0FDRDtHQUNGO0NBdkpILENBQUE7O0FBMEpPLFNBQVMsWUFBVCxDQUF1QixLQUF2QixFQUFtQyxZQUFuQyxFQUF3RSxPQUF4RSxFQUFtRztFQUN4RyxPQUFPLENBQUMsTUFBRSxDQUFDLE1BQUgsQ0FBVSxLQUFWLENBQUEsR0FBbUIsQ0FBQSxDQUFBLEVBQUEsU0FBQSxDQUFBLHFCQUFBLEVBQXNCLEtBQXRCLEVBQTZCLFlBQTdCLEVBQTJDLE9BQTNDLENBQW5CLEdBQXlFLEtBQTFFLEtBQW9GLENBQUEsQ0FBQSxFQUFBLFdBQUEsQ0FBQSxTQUFBLEVBQVUsT0FBVixDQUEzRixDQUFBO0NBQ0Q7O0FBRU0sU0FBUyxTQUFULENBQW9CLFNBQXBCLEVBQW9DO0VBQ3pDLElBQUksTUFBRSxDQUFDLE1BQUgsQ0FBVSxTQUFWLENBQUosRUFBMEI7SUFBRSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVAsQ0FBZ0IsSUFBNUIsQ0FBQTtHQUFrQzs7RUFFOUQsT0FBTztJQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsVUFBZjtJQUEyQixDQUFDLEVBQUUsU0FBUyxDQUFDLFNBQUE7R0FBL0MsQ0FBQTtDQUNEOztBQUVNLFNBQVMsYUFBVCxDQUF3QixTQUF4QixFQUF3QztFQUM3QyxJQUFJLE1BQUUsQ0FBQyxNQUFILENBQVUsU0FBVixDQUFKLEVBQTBCO0lBQUUsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFQLENBQWdCLElBQTVCLENBQUE7R0FBa0M7O0VBRTlELE9BQU87SUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLFdBQWY7SUFBNEIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxZQUFBO0dBQWhELENBQUE7Q0FDRDs7QUFFTSxTQUFTLGtCQUFULENBQUEsS0FBQSxFQUdKLElBSEksRUFHTztFQUFBLElBSHVELFdBR3ZELEdBQUEsS0FBQSxDQUh1RCxXQUd2RDtNQUhvRSxPQUdwRSxHQUFBLEtBQUEsQ0FIb0UsT0FHcEUsQ0FBQTtFQUNaLElBQU0sYUFBYSxHQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsWUFBWixDQUF5QixPQUF6QixDQUFpQyxXQUFXLENBQUMsUUFBWixDQUFxQixJQUF0RCxDQUFBLENBQTRELFVBQWpHLENBQUE7O0VBRUEsSUFBSSxDQUFDLGFBQUQsSUFBa0IsQ0FBQyxhQUFhLENBQUMsT0FBckMsRUFBOEM7SUFDNUMsSUFBSSxFQUFBLENBQUE7SUFDSixPQUFPO01BQUUsQ0FBQyxFQUFFLENBQUw7TUFBUSxDQUFDLEVBQUUsQ0FBQTtLQUFsQixDQUFBO0dBQ0Q7O0VBRUQsSUFBTSxlQUFlLEdBQUcsWUFBWSxDQUNsQyxhQUFhLENBQUMsU0FEb0IsRUFFbEMsV0FBVyxDQUFDLFlBRnNCLEVBR2xDLE9BSGtDLENBQXBDLENBQUE7RUFNQSxJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsZUFBRCxDQUExQixDQUFBO0VBQ0EsSUFBSSxFQUFBLENBQUE7RUFDSixJQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsZUFBRCxDQUF6QixDQUFBO0VBRUEsT0FBTztJQUNMLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBUixHQUFZLFFBQVEsQ0FBQyxDQURuQjtJQUVMLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBUixHQUFZLFFBQVEsQ0FBQyxDQUFBO0dBRjFCLENBQUE7Q0FJRDs7QUFFRCxJQUFNLGdCQUFpQyxHQUFHO0VBQ3hDLEVBQUUsRUFBRSxhQURvQztFQUV4QyxPQUFPLEVBQVAsV0FGd0M7RUFHeEMsU0FBUyxFQUFFO0lBQ1Qsa0JBQUEsRUFBb0IsU0FBQSxlQUFBLENBQUEsS0FBQSxFQUFxQjtNQUFBLElBQWxCLFdBQWtCLEdBQUEsS0FBQSxDQUFsQixXQUFrQixDQUFBO01BQ3ZDLFdBQVcsQ0FBQyxVQUFaLEdBQXlCLElBQXpCLENBQUE7S0FGTztJQUtULHNCQUFBLEVBQXdCLFNBQUEsbUJBQUEsQ0FBQSxLQUFBLEVBQXFCO01BQUEsSUFBbEIsV0FBa0IsR0FBQSxLQUFBLENBQWxCLFdBQWtCLENBQUE7TUFDM0MsV0FBVyxDQUFDLFVBQVosR0FBeUIsSUFBekIsQ0FBQTtNQUNBLFVBQVUsQ0FBQyxJQUFYLEVBQUEsQ0FBQTs7TUFDQSxJQUFJLFVBQVUsQ0FBQyxXQUFmLEVBQTRCO1FBQzFCLFVBQVUsQ0FBQyxXQUFYLEdBQXlCLElBQXpCLENBQUE7T0FDRDtLQVZNO0lBYVQsbUJBQUEsRUFBcUIsVUFBVSxDQUFDLElBYnZCO0lBZVQsMEJBQUEsRUFBNEIsU0FBQSxzQkFBQSxDQUFDLEdBQUQsRUFBQTtNQUFBLE9BQWMsVUFBVSxDQUFDLGlCQUFYLENBQTZCLEdBQTdCLENBQWQsQ0FBQTtLQUFBO0dBZm5CO0NBSGIsQ0FBQTttQkFzQmU7Ozs7Ozs7Ozs7Ozs7QUMzUWYsb0VBQUE7O0FBQ0EsSUFBQSxNQUFBLEdBQUEsMkJBQUEsQ0FBQSxPQUFBLENBQUEsQ0FBQTs7Ozs7O0FBOEJBLFNBQVMsV0FBVCxDQUFrQixLQUFsQixFQUF5QztFQUFBLElBR3JDLFlBSHFDLEdBSW5DLEtBSm1DLENBR3JDLFlBSHFDLENBQUE7O0VBTXZDLFlBQVksQ0FBQyxTQUFiLENBQXVCLFNBQXZCLEdBQW1DLFNBQVMsU0FBVCxDQUVqQyxPQUZpQyxFQUdqQyxLQUhpQyxFQUlqQyxXQUppQyxFQUtqQyxPQUxpQyxFQU1YO0lBQ3RCLElBQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLElBQUQsRUFBTyxLQUFQLEVBQWMsV0FBZCxFQUEyQixPQUEzQixFQUFvQyxLQUFwQyxDQUFuQyxDQUFBOztJQUVBLElBQUksSUFBQSxDQUFLLE9BQUwsQ0FBYSxhQUFqQixFQUFnQztNQUM5QixPQUFPLElBQUEsQ0FBSyxPQUFMLENBQWEsYUFBYixDQUEyQixPQUEzQixFQUFvQyxLQUFwQyxFQUEyQyxNQUEzQyxFQUFtRCxJQUFuRCxFQUF5RCxPQUF6RCxFQUFrRSxXQUFsRSxDQUFQLENBQUE7S0FDRDs7SUFFRCxPQUFPLE1BQVAsQ0FBQTtHQWJGLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUE0Q0EsWUFBWSxDQUFDLFNBQWIsQ0FBdUIsVUFBdkIsR0FBb0MsQ0FBQSxDQUFBLEVBQUEsVUFBQSxDQUFBLFFBQUEsRUFBUyxVQUF1QyxRQUF2QyxFQUFpRDtJQUM1RixPQUFPLElBQUEsQ0FBSyxpQkFBTCxDQUF1QixZQUF2QixFQUFxQyxRQUFyQyxDQUFQLENBQUE7R0FEa0MsRUFFakMsbUdBRmlDLENBQXBDLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEyQkEsWUFBWSxDQUFDLFNBQWIsQ0FBdUIsU0FBdkIsR0FBbUMsQ0FBQSxDQUFBLEVBQUEsVUFBQSxDQUFBLFFBQUEsRUFBUyxVQUF1QyxRQUF2QyxFQUFpRDtJQUMzRixPQUFPLElBQUEsQ0FBSyxpQkFBTCxDQUF1QixXQUF2QixFQUFvQyxRQUFwQyxDQUFQLENBQUE7R0FEaUMsRUFFaEMsaUdBRmdDLENBQW5DLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1DQSxZQUFZLENBQUMsU0FBYixDQUF1QixhQUF2QixHQUF1QyxhQUF2QyxDQUFBOzs7Ozs7Ozs7RUFTQSxZQUFZLENBQUMsU0FBYixDQUF1QixXQUF2QixHQUFxQyxXQUFyQyxDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxvQkFBVCxDQUNFLFlBREYsRUFFRSxLQUZGLEVBR0UsV0FIRixFQUlFLE9BSkYsRUFLRSxLQUxGLEVBTUU7RUFDQSxJQUFNLElBQUksR0FBRyxZQUFZLENBQUMsT0FBYixDQUFxQixPQUFyQixDQUFiLENBQUE7RUFDQSxJQUFNLE9BQU8sR0FBSSxLQUFELENBQXNCLE9BQXRCLElBQWtDO0lBQ2hELENBQUEsRUFBRyxDQUQ2QztJQUVoRCxDQUFBLEVBQUcsQ0FGNkM7SUFHaEQsQ0FBQSxFQUFHLENBSDZDO0lBSWhELENBQUEsRUFBRyxFQUFBO0dBSjRDLENBSzdDLEtBQUQsQ0FBc0IsTUFMd0IsQ0FBakQsQ0FBQTtFQU1BLElBQU0sR0FBRyxHQUFHO0lBQ1YsTUFBTSxFQUFFLElBREU7SUFFVixZQUFZLEVBQVosWUFGVTtJQUdWLFdBQVcsRUFBWCxXQUhVO0lBSVYsT0FBTyxFQUFQLE9BSlU7SUFLVixJQUFJLEVBQUosSUFMVTtJQU1WLE9BQU8sRUFBUCxPQUFBO0dBTkYsQ0FBQTtFQVNBLEtBQUssQ0FBQyxJQUFOLENBQVcsa0JBQVgsRUFBK0IsR0FBL0IsQ0FBQSxDQUFBO0VBRUEsT0FBTyxHQUFHLENBQUMsTUFBWCxDQUFBO0NBQ0Q7O0FBSUQsU0FBUyxXQUFULENBQW1ELFFBQW5ELEVBQXVFO0VBQ3JFLElBQUksTUFBRSxDQUFDLElBQUgsQ0FBUSxRQUFSLENBQUosRUFBdUI7SUFDckIsSUFBQSxDQUFLLE9BQUwsQ0FBYSxXQUFiLEdBQTJCLFFBQTNCLENBQUE7SUFFQSxPQUFPLElBQVAsQ0FBQTtHQUNEOztFQUVELElBQUksUUFBUSxLQUFLLElBQWpCLEVBQXVCO0lBQ3JCLE9BQU8sSUFBQSxDQUFLLE9BQUwsQ0FBYSxXQUFwQixDQUFBO0lBRUEsT0FBTyxJQUFQLENBQUE7R0FDRDs7RUFFRCxPQUFPLElBQUEsQ0FBSyxPQUFMLENBQWEsV0FBcEIsQ0FBQTtDQUNEOztBQUVELFNBQVMsYUFBVCxDQUFxRCxPQUFyRCxFQUFtRTtFQUNqRSxJQUFJLE1BQUUsQ0FBQyxJQUFILENBQVEsT0FBUixDQUFKLEVBQXNCO0lBQ3BCLElBQUEsQ0FBSyxPQUFMLENBQWEsYUFBYixHQUE2QixPQUE3QixDQUFBO0lBRUEsT0FBTyxJQUFQLENBQUE7R0FDRDs7RUFFRCxJQUFJLE9BQU8sS0FBSyxJQUFoQixFQUFzQjtJQUNwQixPQUFPLElBQUEsQ0FBSyxPQUFMLENBQWEsYUFBcEIsQ0FBQTtJQUVBLE9BQU8sSUFBUCxDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxJQUFBLENBQUssT0FBTCxDQUFhLGFBQXBCLENBQUE7Q0FDRDs7bUJBRWM7RUFDYixFQUFFLEVBQUUsZ0NBRFM7RUFFYixPQUFPLEVBQVAsV0FBQTs7Ozs7Ozs7Ozs7Ozs7QUMzTkYsSUFBQSxTQUFBLEdBQUEsMkJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLG9CQUFBLEdBQUEsMEJBQUEsQ0FBQSx1QkFBQSxDQUFBLENBQUE7Ozs7Ozs7O0FBeURBLFNBQVMsV0FBVCxDQUFrQixLQUFsQixFQUF5QztFQUFBLElBRXJDLFFBRnFDLEdBSW5DLEtBSm1DLENBRXJDLFFBRnFDO01BR3JDLFFBSHFDLEdBSW5DLEtBSm1DLENBR3JDLFFBSHFDLENBQUE7RUFNdkMsS0FBSyxDQUFDLFNBQU4sQ0FBZ0Isb0JBQUEsQ0FBQSxTQUFBLENBQWhCLENBQUEsQ0FBQTtFQUVBLFFBQVEsQ0FBQyxJQUFULENBQWMsYUFBZCxHQUE4QixJQUE5QixDQUFBO0VBQ0EsUUFBUSxDQUFDLElBQVQsQ0FBYyxXQUFkLEdBQTRCLElBQTVCLENBQUE7RUFFQSxTQUFLLENBQUMsTUFBTixDQUFhLFFBQVEsQ0FBQyxTQUF0QixFQUFpQztJQUMvQixXQUFXLEVBQUUsS0FEa0I7SUFFL0IsR0FBRyxFQUFFLFFBRjBCO0lBRy9CLGFBQWEsRUFBRSxDQUhnQjtJQUkvQixTQUFTLEVBQUcsSUFKbUI7SUFLL0IsVUFBVSxFQUFFLElBTG1COzs7SUFTL0IsWUFBWSxFQUFFLENBQUE7R0FUaEIsQ0FBQSxDQUFBOzs7Ozs7Ozs7Ozs7O0VBdUJBLFFBQVEsQ0FBQyxlQUFULEdBQTJCLFVBQUEsUUFBUSxFQUFBO0lBQUEsT0FBSSxlQUFlLENBQUMsUUFBRCxFQUFXLEtBQVgsQ0FBbkIsQ0FBQTtHQUFuQyxDQUFBOztFQUVBLEtBQUssQ0FBQyxTQUFOLEdBQWtCOztJQUVoQixlQUFlLEVBQUUsUUFGRDtJQUdoQixzQkFBc0IsRUFBdEIsc0JBSGdCO0lBSWhCLGFBQWEsRUFBRSxJQUFBO0dBSmpCLENBQUE7Q0FNRDs7QUFFRCxTQUFTLGFBQVQsQ0FBQSxJQUFBLEVBQWdILEtBQWhILEVBQXVJO0VBQUEsSUFBN0csV0FBNkcsR0FBQSxJQUFBLENBQTdHLFdBQTZHO01BQWhHLE9BQWdHLEdBQUEsSUFBQSxDQUFoRyxPQUFnRztNQUF2RixLQUF1RixHQUFBLElBQUEsQ0FBdkYsS0FBdUY7TUFBaEYsV0FBZ0YsR0FBQSxJQUFBLENBQWhGLFdBQWdGLENBQUE7O0VBQ3JJLElBQUksV0FBVyxDQUFDLFdBQVosRUFBSixFQUErQjtJQUFFLE9BQUE7R0FBUTs7RUFFekMsSUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQUQsRUFBYyxPQUFkLEVBQXVCLEtBQXZCLEVBQThCLFdBQTlCLEVBQTJDLEtBQTNDLENBQWhDLENBQUE7RUFDQSxPQUFPLENBQUMsV0FBRCxFQUFjLFVBQWQsRUFBMEIsS0FBMUIsQ0FBUCxDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxhQUFULENBQUEsS0FBQSxFQUFnSCxLQUFoSCxFQUF1STtFQUFBLElBQTdHLFdBQTZHLEdBQUEsS0FBQSxDQUE3RyxXQUE2RztNQUFoRyxPQUFnRyxHQUFBLEtBQUEsQ0FBaEcsT0FBZ0c7TUFBdkYsS0FBdUYsR0FBQSxLQUFBLENBQXZGLEtBQXVGO01BQWhGLFdBQWdGLEdBQUEsS0FBQSxDQUFoRixXQUFnRixDQUFBOztFQUNySSxJQUFJLFdBQVcsQ0FBQyxXQUFaLEtBQTRCLE9BQTVCLElBQ0EsV0FBVyxDQUFDLGFBRFosSUFFQSxXQUFXLENBQUMsV0FBWixFQUZKLEVBRStCO0lBQUUsT0FBQTtHQUFROztFQUV6QyxJQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsV0FBRCxFQUFjLE9BQWQsRUFBdUIsS0FBdkIsRUFBOEIsV0FBOUIsRUFBK0QsS0FBL0QsQ0FBaEMsQ0FBQTtFQUNBLE9BQU8sQ0FBQyxXQUFELEVBQWMsVUFBZCxFQUEwQixLQUExQixDQUFQLENBQUE7Q0FDRDs7QUFFRCxTQUFTLFdBQVQsQ0FBc0IsR0FBdEIsRUFBcUUsS0FBckUsRUFBNEY7RUFBQSxJQUNsRixXQURrRixHQUNsRSxHQURrRSxDQUNsRixXQURrRixDQUFBOztFQUcxRixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWIsSUFDQSxXQUFXLENBQUMsV0FBWixFQURBLElBRUEsQ0FBQyxXQUFXLENBQUMsZUFGYixJQUdBLENBQUMsV0FBVyxDQUFDLFFBQVosQ0FBcUIsSUFIMUIsRUFHZ0M7SUFDOUIsT0FBQTtHQUNEOztFQUVELEtBQUssQ0FBQyxJQUFOLENBQVcsd0JBQVgsRUFBcUMsR0FBckMsQ0FBQSxDQUFBO0VBVjBGLElBWWxGLFlBWmtGLEdBWWpFLFdBWmlFLENBWWxGLFlBWmtGLENBQUE7RUFhMUYsSUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFFBQVosQ0FBcUIsSUFBeEMsQ0FBQTs7RUFFQSxJQUFJLFVBQVUsSUFBSSxZQUFsQixFQUFnQzs7SUFFOUIsSUFBSSxZQUFZLENBQUMsT0FBYixDQUFxQixVQUFyQixDQUFBLENBQWlDLFdBQWpDLElBQ0EsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFELEVBQWUsV0FBVyxDQUFDLE9BQTNCLEVBQW9DLFdBQVcsQ0FBQyxRQUFoRCxFQUEwRCxLQUExRCxDQUQzQixFQUM2RjtNQUMzRixXQUFXLENBQUMsSUFBWixFQUFBLENBQUE7S0FGRixNQUlLO01BQ0gsV0FBVyxDQUFDLEtBQVosQ0FBa0IsV0FBVyxDQUFDLFFBQTlCLEVBQXdDLFlBQXhDLEVBQXNELFdBQVcsQ0FBQyxPQUFsRSxDQUFBLENBQUE7TUFDQSxvQkFBb0IsQ0FBQyxXQUFELEVBQWMsS0FBZCxDQUFwQixDQUFBO0tBQ0Q7R0FDRjtDQUNGOztBQUVELFNBQVMsaUJBQVQsQ0FBQSxLQUFBLEVBQW9GLEtBQXBGLEVBQTJHO0VBQUEsSUFBN0UsV0FBNkUsR0FBQSxLQUFBLENBQTdFLFdBQTZFLENBQUE7RUFBQSxJQUNqRyxZQURpRyxHQUNoRixXQURnRixDQUNqRyxZQURpRyxDQUFBOztFQUd6RyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsT0FBYixDQUFxQixXQUF6QyxFQUFzRDtJQUNwRCxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQWIsRUFBc0IsRUFBdEIsRUFBMEIsS0FBMUIsQ0FBVCxDQUFBO0dBQ0Q7Ozs7O0FBS0gsU0FBUyxjQUFULENBQ0UsTUFERixFQUVFLFlBRkYsRUFHRSxPQUhGLEVBSUUsV0FKRixFQUtFLEtBTEYsRUFNRTtFQUNBLElBQUksWUFBWSxDQUFDLGVBQWIsQ0FBNkIsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsTUFBTSxDQUFDLElBQTVCLENBQTdCLEVBQWdFLE9BQWhFLEVBQXlFLFdBQXpFLENBQUEsSUFDQSxZQUFZLENBQUMsT0FBYixDQUFxQixNQUFNLENBQUMsSUFBNUIsQ0FBQSxDQUFrQyxPQURsQyxJQUVBLHNCQUFzQixDQUFDLFlBQUQsRUFBZSxPQUFmLEVBQXdCLE1BQXhCLEVBQWdDLEtBQWhDLENBRjFCLEVBRWtFO0lBQ2hFLE9BQU8sTUFBUCxDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxJQUFQLENBQUE7Q0FDRDs7QUFFRCxTQUFTLGVBQVQsQ0FDRSxXQURGLEVBRUUsT0FGRixFQUdFLEtBSEYsRUFJRSxPQUpGLEVBS0UsYUFMRixFQU1FLFdBTkYsRUFPRSxLQVBGLEVBUUU7RUFDQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQVIsRUFBVyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQTlCLEVBQXNDLENBQUMsR0FBRyxHQUExQyxFQUErQyxDQUFDLEVBQWhELEVBQW9EO0lBQ2xELElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFELENBQXJCLENBQUE7SUFDQSxJQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsQ0FBRCxDQUFsQyxDQUFBO0lBQ0EsSUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsT0FBaEIsRUFBeUIsS0FBekIsRUFBZ0MsV0FBaEMsRUFBNkMsWUFBN0MsQ0FBcEIsQ0FBQTs7SUFFQSxJQUFJLENBQUMsV0FBTCxFQUFrQjtNQUFFLFNBQUE7S0FBVTs7SUFFOUIsSUFBTSxNQUFNLEdBQUcsY0FBYyxDQUMzQixXQUQyQixFQUUzQixLQUYyQixFQUczQixZQUgyQixFQUkzQixXQUoyQixFQUszQixLQUwyQixDQUE3QixDQUFBOztJQU9BLElBQUksTUFBSixFQUFZO01BQ1YsT0FBTztRQUNMLE1BQU0sRUFBTixNQURLO1FBRUwsWUFBWSxFQUFFLEtBRlQ7UUFHTCxPQUFPLEVBQUUsWUFBQTtPQUhYLENBQUE7S0FLRDtHQUNGOztFQUVELE9BQU87SUFBRSxNQUFNLEVBQUUsSUFBVjtJQUFnQixZQUFZLEVBQUUsSUFBOUI7SUFBb0MsT0FBTyxFQUFFLElBQUE7R0FBcEQsQ0FBQTtDQUNEOztBQUVELFNBQVMsYUFBVCxDQUNFLFdBREYsRUFFRSxPQUZGLEVBR0UsS0FIRixFQUlFLFdBSkYsRUFLRSxLQUxGLEVBTUU7RUFDQSxJQUFJLE9BQWdDLEdBQUcsRUFBdkMsQ0FBQTtFQUNBLElBQUksYUFBaUMsR0FBRyxFQUF4QyxDQUFBO0VBRUEsSUFBSSxPQUFPLEdBQUcsV0FBZCxDQUFBOztFQUVBLFNBQVMsV0FBVCxDQUFzQixZQUF0QixFQUEyRDtJQUN6RCxPQUFPLENBQUMsSUFBUixDQUFhLFlBQWIsQ0FBQSxDQUFBO0lBQ0EsYUFBYSxDQUFDLElBQWQsQ0FBbUIsT0FBbkIsQ0FBQSxDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxTQUFLLENBQUMsRUFBTixDQUFTLE9BQVQsQ0FBaUIsT0FBakIsQ0FBUCxFQUFrQztJQUNoQyxPQUFPLEdBQUcsRUFBVixDQUFBO0lBQ0EsYUFBYSxHQUFHLEVBQWhCLENBQUE7SUFFQSxLQUFLLENBQUMsYUFBTixDQUFvQixZQUFwQixDQUFpQyxPQUFqQyxFQUEwQyxXQUExQyxDQUFBLENBQUE7SUFFQSxJQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsV0FBRCxFQUFjLE9BQWQsRUFBdUIsS0FBdkIsRUFBOEIsT0FBOUIsRUFBdUMsYUFBdkMsRUFBc0QsV0FBdEQsRUFBbUUsS0FBbkUsQ0FBbEMsQ0FBQTs7SUFFQSxJQUFJLFVBQVUsQ0FBQyxNQUFYLElBQ0YsQ0FBQyxVQUFVLENBQUMsWUFBWCxDQUF3QixPQUF4QixDQUFnQyxVQUFVLENBQUMsTUFBWCxDQUFrQixJQUFsRCxDQUFBLENBQXdELFdBRDNELEVBQ3dFO01BQ3RFLE9BQU8sVUFBUCxDQUFBO0tBQ0Q7O0lBRUQsT0FBTyxHQUFHLFNBQUssQ0FBQyxHQUFOLENBQVUsVUFBVixDQUFxQixPQUFyQixDQUFWLENBQUE7R0FDRDs7RUFFRCxPQUFPO0lBQUUsTUFBTSxFQUFFLElBQVY7SUFBZ0IsWUFBWSxFQUFFLElBQTlCO0lBQW9DLE9BQU8sRUFBRSxJQUFBO0dBQXBELENBQUE7Q0FDRDs7QUFFRCxTQUFTLE9BQVQsQ0FDRSxXQURGLEVBQUEsS0FBQSxFQU9FLEtBUEYsRUFRRTtFQUFBLElBTkUsTUFNRixHQUFBLEtBQUEsQ0FORSxNQU1GO01BTlUsWUFNVixHQUFBLEtBQUEsQ0FOVSxZQU1WO01BTndCLE9BTXhCLEdBQUEsS0FBQSxDQU53QixPQU14QixDQUFBO0VBQ0EsTUFBTSxHQUFHLE1BQU0sSUFBSTtJQUFFLElBQUksRUFBRSxJQUFBO0dBQTNCLENBQUE7RUFFQSxXQUFXLENBQUMsWUFBWixHQUEyQixZQUEzQixDQUFBO0VBQ0EsV0FBVyxDQUFDLE9BQVosR0FBc0IsT0FBdEIsQ0FBQTtFQUNBLFNBQUssQ0FBQyxVQUFOLENBQWlCLFdBQVcsQ0FBQyxRQUE3QixFQUF1QyxNQUF2QyxDQUFBLENBQUE7RUFFQSxXQUFXLENBQUMsSUFBWixHQUFtQixZQUFZLElBQUksTUFBTSxDQUFDLElBQXZCLEdBQ2YsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsT0FBckIsQ0FEZSxHQUVmLElBRkosQ0FBQTtFQUlBLG9CQUFvQixDQUFDLFdBQUQsRUFBYyxLQUFkLENBQXBCLENBQUE7RUFFQSxLQUFLLENBQUMsSUFBTixDQUFXLG9CQUFYLEVBQWlDO0lBQUUsV0FBVyxFQUFYLFdBQUE7R0FBbkMsQ0FBQSxDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxzQkFBVCxDQUNFLFlBREYsRUFFRSxPQUZGLEVBR0UsTUFIRixFQUlFLEtBSkYsRUFLRTtFQUNBLElBQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUE3QixDQUFBO0VBQ0EsSUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFSLENBQVAsQ0FBcUIsR0FBeEMsQ0FBQTtFQUNBLElBQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBUixDQUFQLENBQXFCLGFBQTNDLENBQUE7RUFDQSxJQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsU0FBTixDQUFnQixlQUFyQyxDQUFBO0VBQ0EsSUFBSSxrQkFBa0IsR0FBRyxDQUF6QixDQUFBO0VBQ0EsSUFBSSxpQkFBaUIsR0FBRyxDQUF4QixDQUFBO0VBQ0EsSUFBSSxZQUFZLEdBQUcsQ0FBbkIsQ0FQQTs7RUFVQSxJQUFJLEVBQUUsVUFBVSxJQUFJLGFBQWQsSUFBK0IsWUFBakMsQ0FBSixFQUFvRDtJQUFFLE9BQU8sS0FBUCxDQUFBO0dBQWM7O0VBRXBFLEtBQUEsSUFBQSxFQUFBLEdBQUEsQ0FBQSxFQUFBLEVBQUEsR0FBMEIsS0FBSyxDQUFDLFlBQU4sQ0FBbUIsSUFBN0MsQ0FBQSxNQUFBLEVBQUEsRUFBQSxFQUFBLEVBQW1EO0lBQUEsSUFBQSxLQUFBLENBQUE7O0lBQUEsS0FBQSxHQUF6QixLQUFLLENBQUMsWUFBTixDQUFtQixJQUFNLENBQUEsRUFBQSxDQUFBLENBQUE7SUFBQSxJQUF4QyxXQUF3QyxHQUFBLEtBQUEsQ0FBQTtJQUNqRCxJQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsUUFBWixDQUFxQixJQUF6QyxDQUFBOztJQUVBLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBWixFQUFMLEVBQWdDO01BQUUsU0FBQTtLQUFVOztJQUU1QyxrQkFBa0IsRUFBQSxDQUFBOztJQUVsQixJQUFJLGtCQUFrQixJQUFJLFlBQTFCLEVBQXdDO01BQ3RDLE9BQU8sS0FBUCxDQUFBO0tBQ0Q7O0lBRUQsSUFBSSxXQUFXLENBQUMsWUFBWixLQUE2QixZQUFqQyxFQUErQztNQUFFLFNBQUE7S0FBVTs7SUFFM0QsaUJBQWlCLElBQUksV0FBVyxLQUFLLE1BQU0sQ0FBQyxJQUF2QixHQUE4QixDQUE5QixHQUFrQyxDQUF2RCxDQUFBOztJQUVBLElBQUksaUJBQWlCLElBQUksVUFBekIsRUFBcUM7TUFDbkMsT0FBTyxLQUFQLENBQUE7S0FDRDs7SUFFRCxJQUFJLFdBQVcsQ0FBQyxPQUFaLEtBQXdCLE9BQTVCLEVBQXFDO01BQ25DLFlBQVksRUFBQSxDQUFBOztNQUVaLElBQUksV0FBVyxLQUFLLE1BQU0sQ0FBQyxJQUF2QixJQUErQixZQUFZLElBQUksYUFBbkQsRUFBa0U7UUFDaEUsT0FBTyxLQUFQLENBQUE7T0FDRDtLQUNGO0dBQ0Y7O0VBRUQsT0FBTyxZQUFZLEdBQUcsQ0FBdEIsQ0FBQTtDQUNEOztBQUVELFNBQVMsZUFBVCxDQUEwQixRQUExQixFQUF5QyxLQUF6QyxFQUFnRTtFQUM5RCxJQUFJLFNBQUssQ0FBQyxFQUFOLENBQVMsTUFBVCxDQUFnQixRQUFoQixDQUFKLEVBQStCO0lBQzdCLEtBQUssQ0FBQyxTQUFOLENBQWdCLGVBQWhCLEdBQWtDLFFBQWxDLENBQUE7SUFFQSxPQUFPLElBQVAsQ0FBQTtHQUNEOztFQUVELE9BQU8sS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsZUFBdkIsQ0FBQTtDQUNEOztBQUVELFNBQVMsU0FBVCxDQUFvQixPQUFwQixFQUErQyxNQUEvQyxFQUErRCxLQUEvRCxFQUFzRjtFQUFBLElBQzdELGlCQUQ2RCxHQUN2QyxLQUFLLENBQUMsU0FEaUMsQ0FDNUUsYUFENEUsQ0FBQTs7RUFHcEYsSUFBSSxpQkFBaUIsSUFBSSxpQkFBaUIsS0FBSyxPQUEvQyxFQUF3RDtJQUN0RCxpQkFBaUIsQ0FBQyxLQUFsQixDQUF3QixNQUF4QixHQUFpQyxFQUFqQyxDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxDQUFDLGFBQVIsQ0FBc0IsZUFBdEIsQ0FBc0MsS0FBdEMsQ0FBNEMsTUFBNUMsR0FBcUQsTUFBckQsQ0FBQTtFQUNBLE9BQU8sQ0FBQyxLQUFSLENBQWMsTUFBZCxHQUF1QixNQUF2QixDQUFBO0VBQ0EsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsYUFBaEIsR0FBZ0MsTUFBTSxHQUFHLE9BQUgsR0FBYSxJQUFuRCxDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxvQkFBVCxDQUE4RCxXQUE5RCxFQUFvRyxLQUFwRyxFQUEySDtFQUFBLElBQ2pILFlBRGlILEdBQzdFLFdBRDZFLENBQ2pILFlBRGlIO01BQ25HLE9BRG1HLEdBQzdFLFdBRDZFLENBQ25HLE9BRG1HO01BQzFGLFFBRDBGLEdBQzdFLFdBRDZFLENBQzFGLFFBRDBGLENBQUE7O0VBR3pILElBQUksRUFBRSxXQUFXLENBQUMsV0FBWixLQUE0QixPQUE1QixJQUF1QyxZQUF2QyxJQUF1RCxZQUFZLENBQUMsT0FBYixDQUFxQixXQUE5RSxDQUFKLEVBQWdHOztJQUU5RixJQUFJLEtBQUssQ0FBQyxTQUFOLENBQWdCLGFBQXBCLEVBQW1DO01BQ2pDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBTixDQUFnQixhQUFqQixFQUFnQyxFQUFoQyxFQUFvQyxLQUFwQyxDQUFULENBQUE7S0FDRDs7SUFFRCxPQUFBO0dBQ0Q7O0VBRUQsSUFBSSxNQUFNLEdBQUcsRUFBYixDQUFBOztFQUVBLElBQUksUUFBUSxDQUFDLElBQWIsRUFBbUI7SUFDakIsSUFBTSxhQUFxQyxHQUFHLFlBQVksQ0FBQyxPQUFiLENBQXFCLFFBQVEsQ0FBQyxJQUE5QixDQUFBLENBQW9DLGFBQWxGLENBQUE7O0lBRUEsSUFBSSxTQUFLLENBQUMsRUFBTixDQUFTLElBQVQsQ0FBYyxhQUFkLENBQUosRUFBa0M7TUFDaEMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxRQUFELEVBQVcsWUFBWCxFQUF5QixPQUF6QixFQUFrQyxXQUFXLENBQUMsWUFBOUMsQ0FBdEIsQ0FBQTtLQURGLE1BR0s7TUFDSCxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU4sQ0FBYyxHQUFkLENBQWtCLFFBQVEsQ0FBQyxJQUEzQixDQUFBLENBQWlDLFNBQWpDLENBQTJDLFFBQTNDLENBQVQsQ0FBQTtLQUNEO0dBQ0Y7O0VBRUQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFiLEVBQXNCLE1BQU0sSUFBSSxFQUFoQyxFQUFvQyxLQUFwQyxDQUFULENBQUE7Q0FDRDs7QUFFRCxJQUFNLFNBQTBCLEdBQUc7RUFDakMsRUFBRSxFQUFFLGlCQUQ2QjtFQUVqQyxNQUFNLEVBQUUsQ0FBQyxTQUFELEVBQVksY0FBWixFQUE0QixnQkFBNUIsRUFBOEMsaUJBQTlDLENBRnlCO0VBR2pDLE9BQU8sRUFBUCxXQUhpQztFQUlqQyxTQUFTLEVBQUU7SUFDVCxtQkFBQSxFQUFxQixhQURaO0lBRVQsbUJBQUEsRUFBcUIsU0FBQSxnQkFBQSxDQUFDLEdBQUQsRUFBTSxLQUFOLEVBQWdCO01BQ25DLGFBQWEsQ0FBQyxHQUFELEVBQU0sS0FBTixDQUFiLENBQUE7TUFDQSxXQUFXLENBQUMsR0FBRCxFQUFNLEtBQU4sQ0FBWCxDQUFBO0tBSk87SUFNVCxtQkFBQSxFQUFxQixpQkFBQTtHQVZVO0VBWWpDLGVBQWUsRUFBZixlQVppQztFQWFqQyxzQkFBc0IsRUFBdEIsc0JBYmlDO0VBY2pDLGNBQWMsRUFBZCxjQUFBO0NBZEYsQ0FBQTttQkFpQmU7Ozs7Ozs7Ozs7Ozs7QUM5WGYsMEVBQUE7O0FBQ0EsSUFBQSxPQUFBLEdBQUEsNEJBQUEsQ0FBQSxPQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLEtBQUEsR0FBQSwyQkFBQSxDQUFBLFFBQUEsQ0FBQSxDQUFBOzs7Ozs7OztBQUVBLFNBQVMsV0FBVCxDQUFBLElBQUEsRUFBc0csS0FBdEcsRUFBNkg7RUFBQSxJQUFyRyxXQUFxRyxHQUFBLElBQUEsQ0FBckcsV0FBcUc7TUFBeEYsV0FBd0YsR0FBQSxJQUFBLENBQXhGLFdBQXdGO01BQTNFLEVBQTJFLEdBQUEsSUFBQSxDQUEzRSxFQUEyRTtNQUF2RSxFQUF1RSxHQUFBLElBQUEsQ0FBdkUsRUFBdUUsQ0FBQTs7RUFDM0gsSUFBSSxXQUFXLENBQUMsUUFBWixDQUFxQixJQUFyQixLQUE4QixNQUFsQyxFQUEwQztJQUFFLE9BQUE7R0FEK0U7OztFQUkzSCxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBTCxDQUFTLEVBQVQsQ0FBYixDQUFBO0VBQ0EsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUwsQ0FBUyxFQUFULENBQWIsQ0FBQTtFQUNBLElBQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxZQUFaLENBQXlCLE9BQXpCLENBQWlDLElBQXZELENBQUE7RUFDQSxJQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBaEMsQ0FBQTtFQUNBLElBQU0sV0FBVyxHQUFJLElBQUksR0FBRyxJQUFQLEdBQWMsR0FBZCxHQUFvQixJQUFJLEdBQUcsSUFBUCxHQUFjLEdBQWQsR0FBb0IsSUFBN0QsQ0FBQTtFQUVBLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXJCLEdBQTRCLGFBQWEsQ0FBQyxRQUFkLEtBQTJCLE9BQTNCLEdBQ3hCLFdBQVcsQ0FBQyxDQUFELENBRGE7SUFFeEIsYUFBYSxDQUFDLFFBRmxCLENBVjJIOztFQWUzSCxJQUFJLFdBQVcsS0FBSyxJQUFoQixJQUF3QixTQUFTLEtBQUssSUFBdEMsSUFBOEMsU0FBUyxLQUFLLFdBQWhFLEVBQTZFOztJQUUzRSxXQUFXLENBQUMsUUFBWixDQUFxQixJQUFyQixHQUE0QixJQUE1QixDQUYyRTs7SUFLM0UsSUFBSSxPQUFPLEdBQUcsV0FBZCxDQUFBOztJQUVBLElBQU0sWUFBWSxHQUFHLFNBQWYsWUFBZSxDQUFVLFlBQVYsRUFBNkU7TUFDaEcsSUFBSSxZQUFZLEtBQUssV0FBVyxDQUFDLFlBQWpDLEVBQStDO1FBQUUsT0FBQTtPQUFROztNQUV6RCxJQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWixDQUF5QixPQUF6QixDQUFpQyxJQUFqRCxDQUFBOztNQUVBLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVCxJQUNBLFlBQVksQ0FBQyxlQUFiLENBQTZCLE9BQTdCLEVBQXNDLE9BQXRDLEVBQStDLFdBQS9DLENBREosRUFDaUU7UUFDL0QsSUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFNBQWIsQ0FDYixXQUFXLENBQUMsV0FEQyxFQUNZLFdBQVcsQ0FBQyxTQUR4QixFQUNtQyxXQURuQyxFQUNnRCxPQURoRCxDQUFmLENBQUE7O1FBR0EsSUFBSSxNQUFNLElBQ04sTUFBTSxDQUFDLElBQVAsS0FBZ0IsTUFEaEIsSUFFQSxjQUFjLENBQUMsV0FBRCxFQUFjLFlBQWQsQ0FGZCxJQUdBLEtBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBVSxjQUFWLENBQXlCLE1BQXpCLEVBQWlDLFlBQWpDLEVBQStDLE9BQS9DLEVBQXdELFdBQXhELEVBQXFFLEtBQXJFLENBSEosRUFHaUY7VUFDL0UsT0FBTyxZQUFQLENBQUE7U0FDRDtPQUNGO0tBaEJILENBUDJFOzs7SUEyQjNFLE9BQU8sT0FBRSxDQUFDLE9BQUgsQ0FBVyxPQUFYLENBQVAsRUFBNEI7TUFDMUIsSUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLGFBQU4sQ0FBb0IsWUFBcEIsQ0FBaUMsT0FBakMsRUFBMEMsWUFBMUMsQ0FBckIsQ0FBQTs7TUFFQSxJQUFJLFlBQUosRUFBa0I7UUFDaEIsV0FBVyxDQUFDLFFBQVosQ0FBcUIsSUFBckIsR0FBNEIsTUFBNUIsQ0FBQTtRQUNBLFdBQVcsQ0FBQyxZQUFaLEdBQTJCLFlBQTNCLENBQUE7UUFDQSxXQUFXLENBQUMsT0FBWixHQUFzQixPQUF0QixDQUFBO1FBQ0EsTUFBQTtPQUNEOztNQUVELE9BQU8sR0FBRyxDQUFBLENBQUEsRUFBQSxhQUFBLENBQUEsVUFBQSxFQUFXLE9BQVgsQ0FBVixDQUFBO0tBQ0Q7R0FDRjtDQUNGOztBQUVELFNBQVMsY0FBVCxDQUF5QixTQUF6QixFQUE0QyxZQUE1QyxFQUFpRjtFQUMvRSxJQUFJLENBQUMsWUFBTCxFQUFtQjtJQUFFLE9BQU8sS0FBUCxDQUFBO0dBQWM7O0VBRW5DLElBQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFiLENBQXFCLElBQXJCLENBQTBCLFNBQTNDLENBQUE7RUFFQSxPQUFRLFNBQVMsS0FBSyxJQUFkLElBQXNCLFFBQVEsS0FBSyxJQUFuQyxJQUEyQyxRQUFRLEtBQUssU0FBaEUsQ0FBQTtDQUNEOztvQkFFYztFQUNiLEVBQUUsRUFBRSxxQkFEUztFQUViLFNBQVMsRUFBRTtJQUFFLHdCQUFBLEVBQTBCLFdBQUE7R0FBNUI7Ozs7Ozs7Ozs7OztBQ3ZFYixJQUFBLFVBQUEsR0FBQSwyQkFBQSxDQUFBLFFBQUEsQ0FBQSxDQUFBOzs7O0FBZUEsU0FBUyxZQUFULENBQWtCLEtBQWxCLEVBQXlDO0VBQUEsSUFFckMsUUFGcUMsR0FHbkMsS0FIbUMsQ0FFckMsUUFGcUMsQ0FBQTtFQUt2QyxLQUFLLENBQUMsU0FBTixDQUFnQixVQUFBLENBQUEsU0FBQSxDQUFoQixDQUFBLENBQUE7RUFFQSxRQUFRLENBQUMsU0FBVCxDQUFtQixJQUFuQixHQUEwQixDQUExQixDQUFBO0VBQ0EsUUFBUSxDQUFDLFNBQVQsQ0FBbUIsS0FBbkIsR0FBMkIsQ0FBM0IsQ0FBQTtDQUNEOztBQUVELFNBQVMsZUFBVCxDQUEwQixXQUExQixFQUF1QztFQUNyQyxJQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsUUFBWixJQUF3QixXQUFXLENBQUMsUUFBWixDQUFxQixJQUFoRSxDQUFBOztFQUVBLElBQUksQ0FBQyxVQUFMLEVBQWlCO0lBQUUsT0FBTyxJQUFQLENBQUE7R0FBYTs7RUFFaEMsSUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFlBQVosQ0FBeUIsT0FBekMsQ0FBQTtFQUVBLE9BQU8sT0FBTyxDQUFDLFVBQUQsQ0FBUCxDQUFvQixJQUFwQixJQUE0QixPQUFPLENBQUMsVUFBRCxDQUFQLENBQW9CLEtBQXZELENBQUE7Q0FDRDs7b0JBRWM7RUFDYixFQUFFLEVBQUUsaUJBRFM7RUFFYixPQUFPLEVBQVAsWUFGYTtFQUdiLFNBQVMsRUFBRTtJQUNULGtCQUFBLEVBQW9CLFNBQUEsZUFBQSxDQUFBLElBQUEsRUFBcUI7TUFBQSxJQUFsQixXQUFrQixHQUFBLElBQUEsQ0FBbEIsV0FBa0IsQ0FBQTtNQUN2QyxXQUFXLENBQUMsa0JBQVosR0FBaUMsSUFBakMsQ0FBQTtLQUZPO0lBS1Qsb0JBQUEsRUFBc0IsU0FBQSxpQkFBQSxDQUFBLEtBQUEsRUFBcUI7TUFBQSxJQUFsQixXQUFrQixHQUFBLEtBQUEsQ0FBbEIsV0FBa0IsQ0FBQTtNQUN6QyxJQUFNLElBQUksR0FBRyxlQUFlLENBQUMsV0FBRCxDQUE1QixDQUFBOztNQUVBLElBQUksSUFBSSxHQUFHLENBQVgsRUFBYztRQUNaLFdBQVcsQ0FBQyxrQkFBWixHQUFpQyxVQUFVLENBQUMsWUFBTTtVQUNoRCxXQUFXLENBQUMsS0FBWixDQUFrQixXQUFXLENBQUMsUUFBOUIsRUFBd0MsV0FBVyxDQUFDLFlBQXBELEVBQWtFLFdBQVcsQ0FBQyxPQUE5RSxDQUFBLENBQUE7U0FEeUMsRUFFeEMsSUFGd0MsQ0FBM0MsQ0FBQTtPQUdEO0tBWk07SUFlVCxtQkFBQSxFQUFxQixTQUFBLGdCQUFBLENBQUEsS0FBQSxFQUFnQztNQUFBLElBQTdCLFdBQTZCLEdBQUEsS0FBQSxDQUE3QixXQUE2QjtVQUFoQixTQUFnQixHQUFBLEtBQUEsQ0FBaEIsU0FBZ0IsQ0FBQTs7TUFDbkQsSUFBSSxXQUFXLENBQUMsZUFBWixJQUErQixDQUFDLFNBQXBDLEVBQStDO1FBQzdDLFlBQVksQ0FBQyxXQUFXLENBQUMsa0JBQWIsQ0FBWixDQUFBO09BQ0Q7S0FsQk07O0lBc0JULHdCQUFBLEVBQTBCLFNBQUEsb0JBQUEsQ0FBQSxLQUFBLEVBQXFCO01BQUEsSUFBbEIsV0FBa0IsR0FBQSxLQUFBLENBQWxCLFdBQWtCLENBQUE7TUFDN0MsSUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLFdBQUQsQ0FBNUIsQ0FBQTs7TUFFQSxJQUFJLElBQUksR0FBRyxDQUFYLEVBQWM7UUFDWixXQUFXLENBQUMsUUFBWixDQUFxQixJQUFyQixHQUE0QixJQUE1QixDQUFBO09BQ0Q7S0FDRjtHQS9CVTtFQWlDYixlQUFlLEVBQWYsZUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckVGLElBQUEsVUFBQSxHQUFBLDJCQUFBLENBQUEsUUFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxTQUFBLEdBQUEsMkJBQUEsQ0FBQSxhQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLEtBQUEsR0FBQSwyQkFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFBOzs7O29CQUVlO0VBQ2IsRUFBRSxFQUFFLFlBRFM7RUFFYixPQUZhLEVBQUEsU0FBQSxPQUFBLENBRUosS0FGSSxFQUVHO0lBQ2QsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsVUFBQSxDQUFBLFNBQUEsQ0FBaEIsQ0FBQSxDQUFBO0lBQ0EsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsS0FBQSxDQUFBLFNBQUEsQ0FBaEIsQ0FBQSxDQUFBO0lBQ0EsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsU0FBQSxDQUFBLFNBQUEsQ0FBaEIsQ0FBQSxDQUFBO0dBQ0Q7Ozs7Ozs7Ozs7Ozs7O0FDUkgsSUFBQSxnQkFBQSxHQUFBLDJCQUFBLENBQUEsZUFBQSxDQUFBLENBQUE7O0FBQ0EsMEVBQUE7O0FBQ0EsSUFBQSxZQUFBLEdBQUEsMkJBQUEsQ0FBQSxXQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLE9BQUEsR0FBQSw0QkFBQSxDQUFBLE9BQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsWUFBQSxHQUFBLDJCQUFBLENBQUEsV0FBQSxDQUFBLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7SUFxQ0s7O1dBQUE7RUFBQTtFQUFBO0VBQUE7R0FBQSxjQUFBOztBQU1MLElBQU0sTUFBTSxHQUFJLGdCQUFoQixDQUFBO0FBQ0EsSUFBTSxLQUFLLEdBQUc7RUFDWixXQUFXLEVBQUUsK0RBREQ7RUFFWixTQUFTLEVBQUUsNkRBQUE7Q0FGYixDQUFBO0FBS0EsSUFBTSxZQUFZLEdBQUcsWUFBQSxLQUF5QixZQUE5Qzs7QUFHQSxTQUFTLFlBQVQsQ0FBa0IsS0FBbEIsRUFBK0U7RUFBQSxJQUFBLElBQUEsR0FBQSxTQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsU0FBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsR0FBSixFQUFJO01BQXBDLE1BQW9DLEdBQUEsSUFBQSxDQUFwQyxNQUFvQyxDQUFBOztFQUFBLElBRTNFLFlBRjJFLEdBSXpFLEtBSnlFLENBRTNFLFlBRjJFO01BRzNFLFFBSDJFLEdBSXpFLEtBSnlFLENBRzNFLFFBSDJFLENBQUE7RUFNN0UsS0FBSyxDQUFDLE1BQU4sR0FBZSxNQUFNLElBQUksT0FBekIsQ0FBQTtFQUVBLFFBQVEsQ0FBQyxJQUFULENBQWMsUUFBZCxHQUF5QjtJQUN2QixNQUFNLEVBQUUsRUFBQTtHQURWLENBQUE7O0VBSUEsWUFBWSxDQUFDLFNBQWIsQ0FBdUIsUUFBdkIsR0FBa0MsVUFBVSxPQUFWLEVBQTRCO0lBQzVELElBQUksT0FBSixFQUFhO01BQ1gsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLElBQUEsQ0FBSyxPQUFMLENBQWEsUUFBcEIsRUFBOEIsT0FBOUIsQ0FBQSxDQUFBO01BQ0EsT0FBTyxJQUFQLENBQUE7S0FDRDs7SUFFRCxPQUFPLElBQUEsQ0FBSyxPQUFMLENBQWEsUUFBcEIsQ0FBQTtHQU5GLENBQUE7Q0FRRDs7QUFFRCxJQUFNLE1BQWUsR0FBRyxDQUN0QjtFQUNFLElBQUksRUFBRSxTQUFTLENBQUMsV0FEbEI7RUFFRSxPQUZGLEVBQUEsU0FBQSxPQUFBLENBQUEsS0FBQSxFQUV3QjtJQUFBLElBQVgsT0FBVyxHQUFBLEtBQUEsQ0FBWCxPQUFXLENBQUE7SUFDcEIsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFELEVBQVUsYUFBVixFQUF5QixpQkFBekIsQ0FBdEIsQ0FBQTtHQUhKO0VBS0UsT0FMRixFQUFBLFNBQUEsT0FBQSxDQUFBLEtBQUEsRUFLd0I7SUFBQSxJQUFYLE9BQVcsR0FBQSxLQUFBLENBQVgsT0FBVyxDQUFBO0lBQ3BCLE9BQU8sQ0FDTCxPQURLLEVBRUwsS0FBSyxDQUFDLFdBRkQsQ0FBUCxDQUFBO0dBTko7RUFXRSxJQUFJLEVBQUUsNERBQUE7Q0FaYyxFQWV0QjtFQUNFLElBQUksRUFBRSxTQUFTLENBQUMsU0FEbEI7RUFFRSxPQUZGLEVBQUEsU0FBQSxPQUFBLENBRVcsV0FGWCxFQUV3QjtJQUFBLElBQ1osT0FEWSxHQUNBLFdBREEsQ0FDWixPQURZLENBQUE7SUFHcEIsT0FBTyxXQUFXLENBQUMsUUFBWixDQUFxQixJQUFyQixLQUE4QixRQUE5QixJQUNMLE9BQU8sWUFBWSxnQkFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFXLFdBRHpCLElBRUwsQ0FBQyxRQUFRLENBQUMsT0FBRCxFQUFVLFdBQVYsRUFBdUIsWUFBdkIsQ0FGWCxDQUFBO0dBTEo7RUFTRSxJQUFJLEVBQUUsd0VBVFI7RUFVRSxPQVZGLEVBQUEsU0FBQSxPQUFBLENBQUEsS0FBQSxFQVV3QjtJQUFBLElBQVgsT0FBVyxHQUFBLEtBQUEsQ0FBWCxPQUFXLENBQUE7SUFDcEIsT0FBTyxDQUNMLE9BREssRUFFTCxLQUFLLENBQUMsU0FGRCxDQUFQLENBQUE7R0FJRDtDQTlCbUIsRUFpQ3RCO0VBQ0UsSUFBSSxFQUFFLFNBQVMsQ0FBQyxXQURsQjtFQUVFLE9BRkYsRUFBQSxTQUFBLE9BQUEsQ0FFVyxXQUZYLEVBRXdCO0lBQ3BCLElBQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXhDLENBQUE7SUFDQSxJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsWUFBWixDQUF5QixNQUF6QixDQUFnQyxLQUFoQyxDQUFBLEVBQUEsQ0FBQSxNQUFBLENBQXlDLFVBQXpDLEVBQUEsTUFBQSxDQUFBLENBQUEsSUFBOEQsRUFBcEYsQ0FBQTtJQUVBLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBdEIsQ0FBQTtHQU5KO0VBUUUsT0FSRixFQUFBLFNBQUEsT0FBQSxDQVFXLFdBUlgsRUFRd0I7SUFDcEIsT0FBTyxDQUNMLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBRGhCLEVBRUwsV0FBVyxDQUFDLFlBRlAsQ0FBUCxDQUFBO0dBVEo7RUFjRSxJQUFJLEVBQUUsNENBQUE7Q0EvQ2MsQ0FBeEIsQ0FBQTs7QUFtREEsU0FBUyxRQUFULENBQW1CLE9BQW5CLEVBQXlDLElBQXpDLEVBQTBFLE9BQTFFLEVBQTJGO0VBQ3pGLE9BQU8sT0FBTyxDQUFDLElBQVIsQ0FBYSxPQUFPLENBQUMsS0FBUixDQUFjLElBQWQsQ0FBQSxJQUF1QixZQUFBLENBQUEsU0FBQSxDQUFBLENBQUksTUFBSixDQUFXLGdCQUFYLENBQTRCLE9BQTVCLENBQUEsQ0FBcUMsSUFBckMsQ0FBcEMsQ0FBUCxDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxjQUFULENBQXlCLE9BQXpCLEVBQW9ELElBQXBELEVBQXFGLE9BQXJGLEVBQXNHO0VBQ3BHLElBQUksTUFBTSxHQUFHLE9BQWIsQ0FBQTs7RUFFQSxPQUFPLE9BQUUsQ0FBQyxPQUFILENBQVcsTUFBWCxDQUFQLEVBQTJCO0lBQ3pCLElBQUksUUFBUSxDQUFDLE1BQUQsRUFBUyxJQUFULEVBQWUsT0FBZixDQUFaLEVBQXFDO01BQ25DLE9BQU8sSUFBUCxDQUFBO0tBQ0Q7O0lBRUQsTUFBTSxHQUFHLENBQUEsQ0FBQSxFQUFBLGFBQUEsQ0FBQSxVQUFBLEVBQVcsTUFBWCxDQUFULENBQUE7R0FDRDs7RUFFRCxPQUFPLEtBQVAsQ0FBQTtDQUNEOztBQUVELElBQU0sRUFBRSxHQUFHLFdBQVgsQ0FBQTtBQUNBLElBQU0sYUFBOEIsR0FBRyxZQUFZLEdBQy9DO0VBQUUsRUFBRSxFQUFGLEVBQUY7RUFBTSxPQUFPLEVBQUUsU0FBQSxPQUFBLEdBQU0sRUFBRTtDQUR3QixHQUUvQztFQUNBLEVBQUUsRUFBRixFQURBO0VBRUEsT0FBTyxFQUFQLFlBRkE7RUFHQSxTQUFTLEVBQUU7SUFDVCwyQkFBQSxFQUE2QixTQUFBLHVCQUFBLENBQUEsS0FBQSxFQUFrQixLQUFsQixFQUE0QjtNQUFBLElBQXpCLFdBQXlCLEdBQUEsS0FBQSxDQUF6QixXQUF5QixDQUFBOztNQUN2RCxLQUFBLElBQUEsRUFBQSxHQUFBLENBQUEsRUFBQSxFQUFBLEdBQW9CLE1BQXBCLENBQUEsTUFBQSxFQUFBLEVBQUEsRUFBQSxFQUE0QjtRQUFBLElBQUEsS0FBQSxDQUFBOztRQUFBLEtBQUEsR0FBUixNQUFRLENBQUEsRUFBQSxDQUFBLENBQUE7UUFBQSxJQUFqQixLQUFpQixHQUFBLEtBQUEsQ0FBQTtRQUMxQixJQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWixJQUE0QixXQUFXLENBQUMsWUFBWixDQUF5QixPQUFyRSxDQUFBOztRQUVBLElBQ0UsRUFBRSxPQUFPLElBQUksT0FBTyxDQUFDLFFBQW5CLElBQStCLE9BQU8sQ0FBQyxRQUFSLENBQWlCLE1BQWpCLENBQXdCLEtBQUssQ0FBQyxJQUE5QixDQUFqQyxDQUFBLElBQ0EsS0FBSyxDQUFDLE9BQU4sQ0FBYyxXQUFkLENBRkYsRUFHRTtVQUFBLElBQUEsYUFBQSxDQUFBOztVQUNBLENBQUEsYUFBQSxHQUFBLEtBQUssQ0FBQyxNQUFOLEVBQWEsSUFBYixDQUFBLEtBQUEsQ0FBQSxhQUFBLEVBQUEsQ0FBa0IsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFqQyxDQUFBLENBQUEsTUFBQSxDQUFBLHVCQUFBLENBQTBDLEtBQUssQ0FBQyxPQUFOLENBQWMsV0FBZCxDQUExQyxDQUFBLENBQUEsQ0FBQSxDQUFBO1NBQ0Q7T0FDRjtLQUNGO0dBZkg7RUFpQkEsTUFBTSxFQUFOLE1BakJBO0VBa0JBLFNBQVMsRUFBVCxTQWxCQTtFQW1CQSxLQUFLLEVBQUwsS0FuQkE7RUFvQkEsTUFBTSxFQUFOLE1BQUE7Q0F0QkosQ0FBQTtvQkF5QmU7Ozs7Ozs7Ozs7Ozs7O0FDL0tmLElBQUEsV0FBQSxHQUFBLDJCQUFBLENBQUEsVUFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxZQUFBLEdBQUEsMkJBQUEsQ0FBQSxXQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLFNBQUEsR0FBQSw0QkFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFxQnFCO0VBUW5CLFNBQUEsWUFBQSxDQUFzQixXQUF0QixFQUFtRTtJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLFlBQUEsQ0FBQSxDQUFBOztJQUFBLElBQUEsQ0FBN0MsV0FBNkMsR0FBN0MsV0FBNkMsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxRQUFBLEVBUHpDLEVBT3lDLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxhQUFBLEVBTnRDO01BQUUsSUFBSSxFQUFFLENBQVI7TUFBVyxLQUFLLEVBQUUsQ0FBbEI7TUFBcUIsR0FBRyxFQUFFLENBQTFCO01BQTZCLE1BQU0sRUFBRSxDQUFBO0tBTUMsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLFlBQUEsRUFMdEMsSUFLc0MsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLFFBQUEsRUFKckMsSUFJcUMsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLFdBQUEsRUFIdEMsSUFHc0MsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLE9BQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUNqRSxJQUFBLENBQUssTUFBTCxHQUFjLFlBQVksRUFBMUIsQ0FBQTtHQUNEOzs7O2dDQUlDLFlBQ0E7TUFBQSxJQUZFLEtBRUYsR0FBQSxJQUFBLENBRkUsS0FFRixDQUFBO01BQUEsSUFDUSxXQURSLEdBQ3dCLElBRHhCLENBQ1EsV0FEUixDQUFBO01BRUEsSUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLFdBQUQsQ0FBcEMsQ0FBQTtNQUNBLElBQUEsQ0FBSyxhQUFMLENBQW1CLFlBQW5CLENBQUEsQ0FBQTtNQUVBLElBQUEsQ0FBSyxLQUFMLEdBQWEsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLEVBQVAsRUFBVyxXQUFXLENBQUMsS0FBdkIsQ0FBYixDQUFBO01BQ0EsSUFBQSxDQUFLLFdBQUwsR0FBbUIsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFiLEVBQW1CLFVBQW5CLENBQWhDLENBQUE7TUFDQSxJQUFBLENBQUssVUFBTCxHQUFrQjtRQUFFLENBQUMsRUFBRSxDQUFMO1FBQVEsQ0FBQyxFQUFFLENBQUE7T0FBN0IsQ0FBQTtNQUVBLElBQU0sR0FBYyxHQUFHO1FBQ3JCLEtBQUssRUFBTCxLQURxQjtRQUVyQixVQUFVLEVBQVYsVUFGcUI7UUFHckIsTUFBTSxFQUFFLEtBQUE7T0FIVixDQUFBO01BTUEsSUFBQSxDQUFLLE1BQUwsR0FBYyxZQUFZLEVBQTFCLENBQUE7TUFDQSxJQUFBLENBQUssUUFBTCxDQUFjLEdBQWQsQ0FBQSxDQUFBO01BRUEsSUFBTSxNQUFNLEdBQUcsSUFBQSxDQUFLLE1BQUwsR0FBYyxJQUFBLENBQUssTUFBTCxDQUFZLEdBQVosQ0FBN0IsQ0FBQTtNQUVBLE9BQU8sTUFBUCxDQUFBO0tBQ0Q7Ozs0QkFFUSxLQUEyQjtNQUFBLElBQzFCLFdBRDBCLEdBQ1YsSUFEVSxDQUMxQixXQUQwQixDQUFBO01BR2xDLEdBQUcsQ0FBQyxXQUFKLEdBQWtCLFdBQWxCLENBQUE7TUFDQSxHQUFHLENBQUMsWUFBSixHQUFtQixXQUFXLENBQUMsWUFBL0IsQ0FBQTtNQUNBLEdBQUcsQ0FBQyxPQUFKLEdBQWMsV0FBVyxDQUFDLE9BQTFCLENBQUE7TUFDQSxHQUFHLENBQUMsSUFBSixHQUFXLEdBQUcsQ0FBQyxJQUFKLElBQVksV0FBVyxDQUFDLElBQW5DLENBQUE7TUFDQSxHQUFHLENBQUMsS0FBSixHQUFZLElBQUEsQ0FBSyxLQUFqQixDQUFBO01BQ0EsR0FBRyxDQUFDLFdBQUosR0FBa0IsSUFBQSxDQUFLLFdBQXZCLENBQUE7S0FDRDs7OzZCQUVTLEtBQXVDO01BQy9DLElBQUEsQ0FBSyxPQUFMLENBQWEsR0FBYixDQUFBLENBQUE7O01BRUEsS0FBQSxJQUFBLEVBQUEsR0FBQSxDQUFBLEVBQUEsRUFBQSxHQUFvQixJQUFBLENBQUssTUFBekIsQ0FBQSxNQUFBLEVBQUEsRUFBQSxFQUFBLEVBQWlDO1FBQUEsSUFBQSxLQUFBLENBQUE7O1FBQUEsS0FBQSxHQUFiLElBQUEsQ0FBSyxNQUFRLENBQUEsRUFBQSxDQUFBLENBQUE7UUFBQSxJQUF0QixLQUFzQixHQUFBLEtBQUEsQ0FBQTs7UUFDL0IsSUFBSSxLQUFLLENBQUMsT0FBTixDQUFjLEtBQWxCLEVBQXlCO1VBQ3ZCLEdBQUcsQ0FBQyxLQUFKLEdBQVksS0FBWixDQUFBO1VBQ0EsS0FBSyxDQUFDLE9BQU4sQ0FBYyxLQUFkLENBQW9CLEdBQXBCLENBQUEsQ0FBQTtTQUNEO09BQ0Y7S0FDRjs7OzJCQUVPLEtBQTJEO01BQ2pFLElBQUEsQ0FBSyxPQUFMLENBQWEsR0FBYixDQUFBLENBQUE7TUFEaUUsSUFJL0QsS0FKK0QsR0FRN0QsR0FSNkQsQ0FJL0QsS0FKK0Q7VUFLL0QsTUFMK0QsR0FRN0QsR0FSNkQsQ0FLL0QsTUFMK0Q7VUFNL0QsYUFOK0QsR0FRN0QsR0FSNkQsQ0FNL0QsYUFOK0Q7VUFPekQsY0FQeUQsR0FRN0QsR0FSNkQsQ0FPL0QsSUFQK0QsQ0FBQTtNQVVqRSxHQUFHLENBQUMsTUFBSixHQUFhLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxFQUFQLEVBQVcsR0FBRyxDQUFDLFVBQWYsQ0FBYixDQUFBO01BQ0EsR0FBRyxDQUFDLElBQUosR0FBVyxDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sRUFBUCxFQUFXLGNBQVgsQ0FBWCxDQUFBO01BRUEsSUFBTSxNQUFNLEdBQUcsYUFBYSxHQUN4QixJQUFBLENBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsYUFBbEIsQ0FEd0IsR0FFeEIsSUFBQSxDQUFLLE1BRlQsQ0FBQTtNQUlBLElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTCxFQUFhLEdBQUcsQ0FBQyxJQUFqQixDQUE5QixDQUFBOztNQUVBLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBb0IsTUFBcEIsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQTRCO1FBQUEsSUFBQSxLQUFBLENBQUE7O1FBQUEsS0FBQSxHQUFSLE1BQVEsQ0FBQSxHQUFBLENBQUEsQ0FBQTtRQUFBLElBQWpCLEtBQWlCLEdBQUEsS0FBQSxDQUFBO1FBQUEsSUFDbEIsT0FEa0IsR0FDTixLQURNLENBQ2xCLE9BRGtCLENBQUE7UUFFMUIsSUFBTSxrQkFBa0IsR0FBRyxDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sRUFBUCxFQUFXLEdBQUcsQ0FBQyxNQUFmLENBQTNCLENBQUE7UUFDQSxJQUFJLFdBQVcsR0FBRyxJQUFsQixDQUFBOztRQUVBLElBQUksS0FBSyxDQUFDLE9BQU4sQ0FBYyxHQUFkLElBQXFCLElBQUEsQ0FBSyxRQUFMLENBQWMsT0FBZCxFQUF1QixNQUF2QixFQUErQixLQUEvQixDQUF6QixFQUFnRTtVQUM5RCxHQUFHLENBQUMsS0FBSixHQUFZLEtBQVosQ0FBQTtVQUNBLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTixDQUFjLEdBQWQsQ0FBa0IsR0FBbEIsQ0FBZCxDQUFBO1VBRUEsU0FBUyxDQUFDLFFBQVYsQ0FBbUIsSUFBQSxDQUFLLFdBQUwsQ0FBaUIsS0FBcEMsRUFBMkMsR0FBRyxDQUFDLElBQS9DLEVBQXFEO1lBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFKLENBQVcsQ0FBWCxHQUFlLGtCQUFrQixDQUFDLENBQXZDO1lBQTBDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBSixDQUFXLENBQVgsR0FBZSxrQkFBa0IsQ0FBQyxDQUFBO1dBQXBJLENBQUEsQ0FBQTtTQUNEOztRQUVELFNBQVMsQ0FBQyxVQUFWLENBQXFCLElBQXJCLENBQTBCLFdBQTFCLENBQUEsQ0FBQTtPQUNEOztNQUVELFNBQVMsQ0FBQyxLQUFWLENBQWdCLENBQWhCLEdBQW9CLEdBQUcsQ0FBQyxNQUFKLENBQVcsQ0FBWCxHQUFlLEdBQUcsQ0FBQyxVQUFKLENBQWUsQ0FBbEQsQ0FBQTtNQUNBLFNBQVMsQ0FBQyxLQUFWLENBQWdCLENBQWhCLEdBQW9CLEdBQUcsQ0FBQyxNQUFKLENBQVcsQ0FBWCxHQUFlLEdBQUcsQ0FBQyxVQUFKLENBQWUsQ0FBbEQsQ0FBQTtNQUVBLFNBQVMsQ0FBQyxTQUFWLENBQW9CLElBQXBCLEdBQTZCLEdBQUcsQ0FBQyxJQUFKLENBQVMsSUFBVCxHQUFnQixjQUFjLENBQUMsSUFBNUQsQ0FBQTtNQUNBLFNBQVMsQ0FBQyxTQUFWLENBQW9CLEtBQXBCLEdBQTZCLEdBQUcsQ0FBQyxJQUFKLENBQVMsS0FBVCxHQUFpQixjQUFjLENBQUMsS0FBN0QsQ0FBQTtNQUNBLFNBQVMsQ0FBQyxTQUFWLENBQW9CLEdBQXBCLEdBQTZCLEdBQUcsQ0FBQyxJQUFKLENBQVMsR0FBVCxHQUFlLGNBQWMsQ0FBQyxHQUEzRCxDQUFBO01BQ0EsU0FBUyxDQUFDLFNBQVYsQ0FBb0IsTUFBcEIsR0FBNkIsR0FBRyxDQUFDLElBQUosQ0FBUyxNQUFULEdBQWtCLGNBQWMsQ0FBQyxNQUE5RCxDQUFBO01BRUEsSUFBTSxVQUFVLEdBQUcsSUFBQSxDQUFLLE1BQUwsQ0FBWSxNQUEvQixDQUFBO01BQ0EsSUFBTSxRQUFRLEdBQUcsSUFBQSxDQUFLLE1BQUwsQ0FBWSxJQUE3QixDQUFBOztNQUVBLElBQUksVUFBVSxJQUFJLFFBQWxCLEVBQTRCO1FBQzFCLElBQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxJQUFWLENBQWUsSUFBZixLQUF3QixRQUFRLENBQUMsSUFBakMsSUFDbEIsU0FBUyxDQUFDLElBQVYsQ0FBZSxLQUFmLEtBQXlCLFFBQVEsQ0FBQyxLQURoQixJQUVsQixTQUFTLENBQUMsSUFBVixDQUFlLEdBQWYsS0FBdUIsUUFBUSxDQUFDLEdBRmQsSUFHbEIsU0FBUyxDQUFDLElBQVYsQ0FBZSxNQUFmLEtBQTBCLFFBQVEsQ0FBQyxNQUhyQyxDQUFBO1FBS0EsU0FBUyxDQUFDLE9BQVYsR0FBb0IsV0FBVyxJQUM3QixVQUFVLENBQUMsQ0FBWCxLQUFpQixTQUFTLENBQUMsTUFBVixDQUFpQixDQURoQixJQUVsQixVQUFVLENBQUMsQ0FBWCxLQUFpQixTQUFTLENBQUMsTUFBVixDQUFpQixDQUZwQyxDQUFBO09BR0Q7O01BRUQsT0FBTyxTQUFQLENBQUE7S0FDRDs7O3VDQUVtQixLQUEyRDtNQUFBLElBQ3JFLFdBRHFFLEdBQ3JELElBRHFELENBQ3JFLFdBRHFFLENBQUE7TUFBQSxJQUVyRSxLQUZxRSxHQUUzRCxHQUYyRCxDQUVyRSxLQUZxRSxDQUFBO01BRzdFLElBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEdBQXJDLENBQUE7TUFDQSxJQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBWixDQUFtQixLQUF2QyxDQUFBO01BSjZFLElBS3JFLE1BTHFFLEdBSzlDLElBTDhDLENBS3JFLE1BTHFFO1VBSzdELFVBTDZELEdBSzlDLElBTDhDLENBSzdELFVBTDZELENBQUE7TUFNN0UsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQXhCLENBQUE7O01BRUEsSUFBSSxLQUFLLEtBQUssT0FBZCxFQUF1QjtRQUNyQixDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sSUFBQSxDQUFLLFVBQVosRUFBd0IsTUFBTSxDQUFDLEtBQS9CLENBQUEsQ0FBQTtPQUNEOztNQUVELEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBaUMsQ0FBQyxDQUFDLFdBQUQsRUFBYyxVQUFkLENBQUQsRUFBNEIsQ0FBQyxTQUFELEVBQVksUUFBWixDQUE1QixDQUFqQyxDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsRUFBOEY7UUFBQSxJQUFBLEtBQUEsQ0FBQTs7UUFBQSxLQUFBLEdBQTdELENBQUMsQ0FBQyxXQUFELEVBQWMsVUFBZCxDQUFELEVBQTRCLENBQUMsU0FBRCxFQUFZLFFBQVosQ0FBNUIsQ0FBNkQsQ0FBQSxHQUFBLENBQUEsQ0FBQTs7UUFBQSxJQUFBLEtBQUEsR0FBQSxLQUFBO1lBQUEsS0FBQSxHQUFBLG1CQUFBLENBQUEsS0FBQSxFQUFBLENBQUEsQ0FBQTtZQUFsRixTQUFrRixHQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7WUFBdkUsS0FBdUUsR0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBLENBQUE7O1FBQzVGLFNBQVMsQ0FBQyxJQUFWLENBQWUsQ0FBZixJQUFzQixLQUFLLENBQUMsQ0FBNUIsQ0FBQTtRQUNBLFNBQVMsQ0FBQyxJQUFWLENBQWUsQ0FBZixJQUFzQixLQUFLLENBQUMsQ0FBNUIsQ0FBQTtRQUNBLFNBQVMsQ0FBQyxNQUFWLENBQWlCLENBQWpCLElBQXNCLEtBQUssQ0FBQyxDQUE1QixDQUFBO1FBQ0EsU0FBUyxDQUFDLE1BQVYsQ0FBaUIsQ0FBakIsSUFBc0IsS0FBSyxDQUFDLENBQTVCLENBQUE7T0FDRDs7TUFqQjRFLElBbUJyRSxTQW5CcUUsR0FtQnZELElBQUEsQ0FBSyxNQW5Ca0QsQ0FtQnJFLFNBbkJxRSxDQUFBO01Bb0I3RSxJQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSixJQUFZLFdBQVcsQ0FBQyxJQUFyQyxDQUFBO01BRUEsSUFBSSxDQUFDLElBQUwsSUFBZSxTQUFTLENBQUMsSUFBekIsQ0FBQTtNQUNBLElBQUksQ0FBQyxLQUFMLElBQWUsU0FBUyxDQUFDLEtBQXpCLENBQUE7TUFDQSxJQUFJLENBQUMsR0FBTCxJQUFlLFNBQVMsQ0FBQyxHQUF6QixDQUFBO01BQ0EsSUFBSSxDQUFDLE1BQUwsSUFBZSxTQUFTLENBQUMsTUFBekIsQ0FBQTtNQUVBLElBQUksQ0FBQyxLQUFMLEdBQWEsSUFBSSxDQUFDLEtBQUwsR0FBYSxJQUFJLENBQUMsSUFBL0IsQ0FBQTtNQUNBLElBQUksQ0FBQyxNQUFMLEdBQWMsSUFBSSxDQUFDLE1BQUwsR0FBYyxJQUFJLENBQUMsR0FBakMsQ0FBQTtLQUNEOzs7Z0NBRVksS0FLSTtNQUFBLElBQ1AsV0FETyxHQUNTLElBRFQsQ0FDUCxXQURPLENBQUE7TUFBQSxJQUVQLEtBRk8sR0FFMEIsR0FGMUIsQ0FFUCxLQUZPO1VBRUEsTUFGQSxHQUUwQixHQUYxQixDQUVBLE1BRkE7VUFFUSxhQUZSLEdBRTBCLEdBRjFCLENBRVEsYUFGUixDQUFBO01BSWYsSUFBTSxNQUFNLEdBQUcsSUFBQSxDQUFLLE1BQUwsQ0FBWTtRQUN6QixNQUFNLEVBQU4sTUFEeUI7UUFFekIsS0FBSyxFQUFMLEtBRnlCO1FBR3pCLFVBQVUsRUFBRSxHQUFHLENBQUMsY0FBSixJQUFzQixXQUFXLENBQUMsTUFBWixDQUFtQixHQUFuQixDQUF1QixJQUFBO09BSDVDLENBQWYsQ0FBQTtNQU1BLElBQUEsQ0FBSyxNQUFMLEdBQWMsTUFBZCxDQVZlOzs7TUFjZixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVIsS0FBb0IsQ0FBQyxhQUFELElBQWtCLGFBQWEsR0FBRyxJQUFBLENBQUssTUFBTCxDQUFZLE1BQWxFLENBQUEsSUFBNkUsV0FBVyxDQUFDLFdBQVosRUFBakYsRUFBNEc7UUFDMUcsT0FBTyxLQUFQLENBQUE7T0FDRDs7TUFFRCxJQUFJLEdBQUcsQ0FBQyxjQUFSLEVBQXdCO1FBQUEsSUFDZCxJQURjLEdBQ0wsV0FBVyxDQUFDLE1BQVosQ0FBbUIsR0FEZCxDQUNkLElBRGMsQ0FBQTtRQUV0QixJQUFNLFVBQVUsR0FBRztVQUNqQixDQUFDLEVBQUUsR0FBRyxDQUFDLGNBQUosQ0FBbUIsQ0FBbkIsR0FBdUIsSUFBSSxDQUFDLENBRGQ7VUFFakIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxjQUFKLENBQW1CLENBQW5CLEdBQXVCLElBQUksQ0FBQyxDQUFBO1NBRmpDLENBQUE7UUFLQSxNQUFNLENBQUMsTUFBUCxDQUFjLENBQWQsSUFBbUIsVUFBVSxDQUFDLENBQTlCLENBQUE7UUFDQSxNQUFNLENBQUMsTUFBUCxDQUFjLENBQWQsSUFBbUIsVUFBVSxDQUFDLENBQTlCLENBQUE7UUFDQSxNQUFNLENBQUMsS0FBUCxDQUFhLENBQWIsSUFBa0IsVUFBVSxDQUFDLENBQTdCLENBQUE7UUFDQSxNQUFNLENBQUMsS0FBUCxDQUFhLENBQWIsSUFBa0IsVUFBVSxDQUFDLENBQTdCLENBQUE7T0FDRDs7TUFFRCxJQUFBLENBQUssa0JBQUwsQ0FBd0IsR0FBeEIsQ0FBQSxDQUFBO0tBQ0Q7Ozs4QkFFVSxLQUF1RjtNQUFBLElBQ3hGLFdBRHdGLEdBQ2pFLEdBRGlFLENBQ3hGLFdBRHdGO1VBQzNFLEtBRDJFLEdBQ2pFLEdBRGlFLENBQzNFLEtBRDJFLENBQUE7TUFFaEcsSUFBTSxNQUFNLEdBQUcsSUFBQSxDQUFLLE1BQXBCLENBQUE7O01BRUEsSUFBSSxDQUFDLE1BQUQsSUFBVyxDQUFDLE1BQU0sQ0FBQyxNQUF2QixFQUErQjtRQUM3QixPQUFBO09BQ0Q7O01BRUQsSUFBSSxRQUFRLEdBQUcsS0FBZixDQUFBOztNQUVBLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBb0IsTUFBcEIsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQTRCO1FBQUEsSUFBQSxLQUFBLENBQUE7O1FBQUEsS0FBQSxHQUFSLE1BQVEsQ0FBQSxHQUFBLENBQUEsQ0FBQTtRQUFBLElBQWpCLEtBQWlCLEdBQUEsS0FBQSxDQUFBO1FBQzFCLEdBQUcsQ0FBQyxLQUFKLEdBQVksS0FBWixDQUFBO1FBRDBCLElBRWxCLE9BRmtCLEdBRUcsS0FGSCxDQUVsQixPQUZrQjtZQUVULE9BRlMsR0FFRyxLQUZILENBRVQsT0FGUyxDQUFBO1FBSTFCLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFSLElBQXFCLE9BQU8sQ0FBQyxTQUFSLENBQWtCLEdBQWxCLENBQXpDLENBQUE7O1FBRUEsSUFBSSxXQUFKLEVBQWlCO1VBQ2YsSUFBQSxDQUFLLFNBQUwsR0FBaUIsV0FBakIsQ0FBQTtVQUNBLE9BQU8sS0FBUCxDQUFBO1NBQ0Q7O1FBRUQsUUFBUSxHQUFHLFFBQVEsSUFBSyxDQUFDLFFBQUQsSUFBYSxJQUFBLENBQUssUUFBTCxDQUFjLE9BQWQsRUFBdUIsSUFBdkIsRUFBNkIsR0FBRyxDQUFDLEtBQWpDLEVBQXdDLElBQXhDLENBQXJDLENBQUE7T0FDRDs7TUFFRCxJQUFJLFFBQUosRUFBYzs7UUFFWixXQUFXLENBQUMsSUFBWixDQUFpQjtVQUFFLEtBQUssRUFBTCxLQUFGO1VBQVMsTUFBTSxFQUFFLElBQUE7U0FBbEMsQ0FBQSxDQUFBO09BQ0Q7S0FDRjs7O3lCQUVLLEtBQTRDO01BQUEsSUFDeEMsV0FEd0MsR0FDeEIsR0FEd0IsQ0FDeEMsV0FEd0MsQ0FBQTs7TUFHaEQsSUFBSSxDQUFDLElBQUEsQ0FBSyxNQUFOLElBQWdCLENBQUMsSUFBQSxDQUFLLE1BQUwsQ0FBWSxNQUFqQyxFQUF5QztRQUN2QyxPQUFBO09BQ0Q7O01BRUQsSUFBTSxXQUFpQyxHQUFHLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTztRQUMvQyxNQUFNLEVBQUUsSUFBQSxDQUFLLE1BRGtDO1FBRS9DLFlBQVksRUFBRSxXQUFXLENBQUMsWUFGcUI7UUFHL0MsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUgwQjtRQUkvQyxJQUFJLEVBQUUsSUFBQTtPQUprQyxFQUt2QyxHQUx1QyxDQUExQyxDQUFBO01BT0EsSUFBQSxDQUFLLE9BQUwsQ0FBYSxXQUFiLENBQUEsQ0FBQTs7TUFFQSxLQUFBLElBQUEsR0FBQSxHQUFBLENBQUEsRUFBQSxHQUFBLEdBQW9CLElBQUEsQ0FBSyxNQUF6QixDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsRUFBaUM7UUFBQSxJQUFBLEtBQUEsQ0FBQTs7UUFBQSxLQUFBLEdBQWIsSUFBQSxDQUFLLE1BQVEsQ0FBQSxHQUFBLENBQUEsQ0FBQTtRQUFBLElBQXRCLEtBQXNCLEdBQUEsS0FBQSxDQUFBO1FBQy9CLFdBQVcsQ0FBQyxLQUFaLEdBQW9CLEtBQXBCLENBQUE7O1FBRUEsSUFBSSxLQUFLLENBQUMsT0FBTixDQUFjLElBQWxCLEVBQXdCO1VBQUUsS0FBSyxDQUFDLE9BQU4sQ0FBYyxJQUFkLENBQW1CLFdBQW5CLENBQUEsQ0FBQTtTQUFnRDtPQUMzRTs7TUFFRCxJQUFBLENBQUssTUFBTCxHQUFjLElBQWQsQ0FBQTtNQUNBLElBQUEsQ0FBSyxTQUFMLEdBQWlCLElBQWpCLENBQUE7S0FDRDs7O2tDQUVjLGNBQTBCO01BQ3ZDLElBQUEsQ0FBSyxNQUFMLEdBQWMsRUFBZCxDQUFBOztNQUVBLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBakIsRUFBb0IsS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUF6QyxFQUFpRCxLQUFLLEVBQXRELEVBQTBEO1FBQUEsSUFBQSxtQkFBQSxHQUNyQixZQUFZLENBQUMsS0FBRCxDQURTO1lBQ2hELE9BRGdELEdBQUEsbUJBQUEsQ0FDaEQsT0FEZ0Q7WUFDdkMsT0FEdUMsR0FBQSxtQkFBQSxDQUN2QyxPQUR1QztZQUM5QixJQUQ4QixHQUFBLG1CQUFBLENBQzlCLElBRDhCLENBQUE7O1FBR3hELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFSLEtBQW9CLEtBQW5DLEVBQTBDO1VBQUUsU0FBQTtTQUFVOztRQUV0RCxJQUFBLENBQUssTUFBTCxDQUFZLElBQVosQ0FBaUI7VUFDZixPQUFPLEVBQVAsT0FEZTtVQUVmLE9BQU8sRUFBUCxPQUZlO1VBR2YsS0FBSyxFQUFMLEtBSGU7VUFJZixJQUFJLEVBQUosSUFBQTtTQUpGLENBQUEsQ0FBQTtPQU1EOztNQUVELE9BQU8sSUFBQSxDQUFLLE1BQVosQ0FBQTtLQUNEOzs7b0RBRWlIO01BQUEsSUFBQSxpQkFBQSxHQUFBLEtBQUEsQ0FBdEYsV0FBc0Y7VUFBdkUsTUFBdUUsR0FBQSxpQkFBQSxDQUF2RSxNQUF1RTtVQUEvRCxJQUErRCxHQUFBLGlCQUFBLENBQS9ELElBQStEO1VBQXpELFlBQXlELEdBQUEsaUJBQUEsQ0FBekQsWUFBeUQsQ0FBQTs7TUFDaEgsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFsQixFQUEwQjtRQUFFLE9BQUE7T0FBUTs7TUFENEUsSUFHeEcsVUFId0csR0FHekYsWUFIeUYsQ0FHeEcsVUFId0csQ0FBQTtNQUFBLElBQUEsb0JBQUEsR0FJekUsWUFBWSxDQUFDLE1BSjREO1VBSWpHLFFBSmlHLEdBQUEsb0JBQUEsQ0FJeEcsS0FKd0c7VUFJdkYsU0FKdUYsR0FBQSxvQkFBQSxDQUl2RixTQUp1RixDQUFBO01BTWhILElBQU0sZUFBZSxHQUFHLENBQ3RCLENBQUMsTUFBTSxDQUFDLEtBQVIsRUFBZSxVQUFmLENBRHNCLEVBRXRCLENBQUMsTUFBTSxDQUFDLEdBQVIsRUFBYSxRQUFiLENBRnNCLENBQXhCLENBQUE7O01BS0EsS0FBQSxJQUFBLEdBQUEsR0FBQSxDQUFBLEVBQUEsR0FBQSxHQUFpQyxlQUFqQyxDQUFBLE1BQUEsRUFBQSxHQUFBLEVBQUEsRUFBeUQ7UUFBQSxJQUFBLE1BQUEsQ0FBQTs7UUFBQSxNQUFBLEdBQXhCLGVBQXdCLENBQUEsR0FBQSxDQUFBLENBQUE7O1FBQUEsSUFBQSxNQUFBLEdBQUEsTUFBQTtZQUFBLE1BQUEsR0FBQSxtQkFBQSxDQUFBLE1BQUEsRUFBQSxDQUFBLENBQUE7WUFBN0MsU0FBNkMsR0FBQSxNQUFBLENBQUEsQ0FBQSxDQUFBO1lBQWxDLEtBQWtDLEdBQUEsTUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBOztRQUN2RCxTQUFTLENBQUMsSUFBVixDQUFlLENBQWYsSUFBb0IsS0FBSyxDQUFDLENBQTFCLENBQUE7UUFDQSxTQUFTLENBQUMsSUFBVixDQUFlLENBQWYsSUFBb0IsS0FBSyxDQUFDLENBQTFCLENBQUE7UUFDQSxTQUFTLENBQUMsTUFBVixDQUFpQixDQUFqQixJQUFzQixLQUFLLENBQUMsQ0FBNUIsQ0FBQTtRQUNBLFNBQVMsQ0FBQyxNQUFWLENBQWlCLENBQWpCLElBQXNCLEtBQUssQ0FBQyxDQUE1QixDQUFBO09BQ0Q7O01BRUQsSUFBSSxDQUFDLElBQUwsSUFBYSxTQUFTLENBQUMsSUFBdkIsQ0FBQTtNQUNBLElBQUksQ0FBQyxLQUFMLElBQWMsU0FBUyxDQUFDLEtBQXhCLENBQUE7TUFDQSxJQUFJLENBQUMsR0FBTCxJQUFZLFNBQVMsQ0FBQyxHQUF0QixDQUFBO01BQ0EsSUFBSSxDQUFDLE1BQUwsSUFBZSxTQUFTLENBQUMsTUFBekIsQ0FBQTtLQUNEOzs7NkJBRVMsU0FBUyxRQUFrQixPQUFnQixnQkFBMEI7TUFDN0U7TUFFRyxDQUFDLE9BQUQsSUFBWSxPQUFPLENBQUMsT0FBUixLQUFvQixLQUFqQztNQUVDLGNBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUY1QjtNQUlDLE9BQU8sQ0FBQyxPQUFSLElBQW1CLENBQUMsTUFKckI7TUFNQyxLQUFLLEtBQUssT0FBVixJQUFxQixDQUFDLE9BQU8sQ0FBQyxRQVJqQyxFQVNFO1FBQ0EsT0FBTyxLQUFQLENBQUE7T0FDRDs7TUFFRCxPQUFPLElBQVAsQ0FBQTtLQUNEOzs7NkJBRVMsT0FBcUI7TUFDN0IsSUFBQSxDQUFLLFdBQUwsR0FBbUIsS0FBSyxDQUFDLFdBQXpCLENBQUE7TUFDQSxJQUFBLENBQUssVUFBTCxHQUFrQixLQUFLLENBQUMsVUFBeEIsQ0FBQTtNQUNBLElBQUEsQ0FBSyxLQUFMLEdBQWEsS0FBSyxDQUFDLEtBQW5CLENBQUE7TUFDQSxJQUFBLENBQUssTUFBTCxHQUFjLEtBQUssQ0FBQyxNQUFOLENBQWEsR0FBYixDQUFpQixVQUFBLENBQUMsRUFBQTtRQUFBLE9BQUksQ0FBQSxDQUFBLEVBQUEsV0FBQSxDQUFBLFNBQUEsQ0FBQSxFQUFNLENBQU4sQ0FBSixDQUFBO09BQWxCLENBQWQsQ0FBQTtNQUNBLElBQUEsQ0FBSyxNQUFMLEdBQWMsWUFBWSxDQUFDLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxFQUFQLEVBQVcsS0FBSyxDQUFDLE1BQU4sQ0FBYSxNQUF4QixDQUFELEVBQWtDLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxFQUFQLEVBQVcsS0FBSyxDQUFDLE1BQU4sQ0FBYSxJQUF4QixDQUFsQyxDQUExQixDQUFBO0tBQ0Q7Ozs4QkFFVTtNQUNULEtBQUssSUFBTSxJQUFYLElBQW1CLElBQW5CLEVBQXlCO1FBQ3ZCLElBQUEsQ0FBSyxJQUFMLENBQUEsR0FBYSxJQUFiLENBQUE7T0FDRDtLQUNGOzs7Ozs7OztBQUdILFNBQVMsWUFBVCxDQUF1QixNQUF2QixFQUFnRCxJQUFoRCxFQUE4RjtFQUM1RixPQUFPO0lBQ0wsSUFBSSxFQUFKLElBREs7SUFFTCxNQUFNLEVBQU4sTUFGSztJQUdMLEtBQUssRUFBRTtNQUFFLENBQUMsRUFBRSxDQUFMO01BQVEsQ0FBQyxFQUFFLENBQUE7S0FIYjtJQUlMLFNBQVMsRUFBRTtNQUNULElBQUksRUFBSSxDQURDO01BRVQsS0FBSyxFQUFHLENBRkM7TUFHVCxHQUFHLEVBQUssQ0FIQztNQUlULE1BQU0sRUFBRSxDQUFBO0tBUkw7SUFVTCxVQUFVLEVBQUUsRUFWUDtJQVdMLE9BQU8sRUFBRSxJQUFBO0dBWFgsQ0FBQTtDQWFEOztBQUVELFNBQVMsZUFBVCxDQUEwQixXQUExQixFQUF1QztFQUNyQyxJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsWUFBWixDQUF5QixPQUF6QixDQUFpQyxXQUFXLENBQUMsUUFBWixDQUFxQixJQUF0RCxDQUF0QixDQUFBO0VBQ0EsSUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLFNBQXRDLENBQUE7O0VBRUEsSUFBSSxlQUFlLElBQUksZUFBZSxDQUFDLE1BQXZDLEVBQStDO0lBQzdDLE9BQU8sZUFBZSxDQUFDLE1BQWhCLENBQ0wsVUFBQSxRQUFRLEVBQUE7TUFBQSxPQUFJLENBQUMsUUFBUSxDQUFDLE9BQVYsSUFBcUIsUUFBUSxDQUFDLE9BQVQsQ0FBaUIsT0FBakIsS0FBNkIsS0FBdEQsQ0FBQTtLQURILENBQVAsQ0FBQTtHQUdEOztFQUVELE9BQU8sQ0FBQyxNQUFELEVBQVMsVUFBVCxFQUFxQixXQUFyQixFQUFrQyxVQUFsQyxFQUE4QyxlQUE5QyxFQUErRCxjQUEvRCxDQUFBLENBQ0osR0FESSxDQUNBLFVBQUEsSUFBSSxFQUFJO0lBQ1gsSUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLElBQUQsQ0FBN0IsQ0FBQTtJQUVBLE9BQU8sT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFuQixJQUE4QjtNQUNuQyxPQUFPLEVBQVAsT0FEbUM7TUFFbkMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFBO0tBRm5CLENBQUE7R0FKRyxDQUFBLENBU0osTUFUSSxDQVNHLFVBQUEsQ0FBQyxFQUFBO0lBQUEsT0FBSSxDQUFDLENBQUMsQ0FBTixDQUFBO0dBVEosQ0FBUCxDQUFBO0NBVUQ7O0FBRU0sU0FBUyxhQUFULENBQXdCLElBQXhCLEVBQThCLE1BQTlCLEVBQXNDO0VBQzNDLE9BQU8sSUFBSSxHQUNQO0lBQ0EsSUFBSSxFQUFJLE1BQU0sQ0FBQyxDQUFQLEdBQVcsSUFBSSxDQUFDLElBRHhCO0lBRUEsR0FBRyxFQUFLLE1BQU0sQ0FBQyxDQUFQLEdBQVcsSUFBSSxDQUFDLEdBRnhCO0lBR0EsS0FBSyxFQUFHLElBQUksQ0FBQyxLQUFMLEdBQWMsTUFBTSxDQUFDLENBSDdCO0lBSUEsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFMLEdBQWMsTUFBTSxDQUFDLENBQUE7R0FMdEIsR0FPUDtJQUNBLElBQUksRUFBSSxDQURSO0lBRUEsR0FBRyxFQUFLLENBRlI7SUFHQSxLQUFLLEVBQUcsQ0FIUjtJQUlBLE1BQU0sRUFBRSxDQUFBO0dBWFosQ0FBQTtDQWFEOzs7Ozs7Ozs7Ozs7QUMzWUQsSUFBQSxhQUFBLEdBQUEsMkJBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUE7Ozs7QUE0RU8sU0FBUyxZQUFULENBS0wsTUFMSyxFQU1MLElBTkssRUFPTDtFQUFBLElBQ1EsUUFEUixHQUNxQixNQURyQixDQUNRLFFBRFIsQ0FBQTtFQUVBLElBQU0sT0FBTyxHQUFHO0lBQ2QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQURBO0lBRWQsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUZFO0lBR2QsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUhKO0lBSWQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFBO0dBSmYsQ0FBQTs7RUFPQSxJQUFNLFFBQVEsR0FBRyxTQUFYLFFBQVcsQ0FBQyxRQUFELEVBQWtDO0lBQ2pELElBQU0sT0FBaUIsR0FBSSxRQUFRLElBQUksRUFBdkMsQ0FBQTtJQUVBLE9BQU8sQ0FBQyxPQUFSLEdBQWtCLE9BQU8sQ0FBQyxPQUFSLEtBQW9CLEtBQXRDLENBSGlEOztJQU1qRCxLQUFLLElBQU0sS0FBWCxJQUFtQixRQUFuQixFQUE2QjtNQUMzQixJQUFJLEVBQUUsS0FBSSxJQUFJLE9BQVYsQ0FBSixFQUF3QjtRQUN0QixPQUFPLENBQUMsS0FBRCxDQUFQLEdBQWdCLFFBQVEsQ0FBQyxLQUFELENBQXhCLENBQUE7T0FDRDtLQUNGOztJQUVELElBQU0sQ0FBa0MsR0FBRztNQUFFLE9BQU8sRUFBUCxPQUFGO01BQVcsT0FBTyxFQUFQLE9BQVg7TUFBb0IsSUFBSSxFQUFKLElBQUE7S0FBL0QsQ0FBQTtJQUVBLE9BQU8sQ0FBUCxDQUFBO0dBZEYsQ0FBQTs7RUFpQkEsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFQLEtBQWdCLFFBQTVCLEVBQXNDOztJQUVwQyxRQUFRLENBQUMsU0FBVCxHQUFxQixRQUFyQixDQUFBO0lBQ0EsUUFBUSxDQUFDLFFBQVQsR0FBb0IsT0FBcEIsQ0FBQTtHQUNEOztFQUVELE9BQU8sUUFBUCxDQUFBO0NBQ0Q7O0FBRU0sU0FBUyxpQkFBVCxDQUFBLElBQUEsRUFHSjtFQUFBLElBSGtDLE1BR2xDLEdBQUEsSUFBQSxDQUhrQyxNQUdsQztNQUh5RSxNQUd6RSxHQUFBLElBQUEsQ0FIMEMsV0FHMUMsQ0FIeUQsWUFHekQsQ0FIeUUsTUFHekUsQ0FBQTs7RUFDRCxJQUFJLE1BQUosRUFBWTtJQUNWLE1BQU0sQ0FBQyxTQUFQLEdBQW1CLE1BQU0sQ0FBQyxVQUExQixDQUFBO0dBQ0Q7Q0FDRjs7QUFFRCxJQUFNLGFBQThCLEdBQUc7RUFDckMsRUFBRSxFQUFFLGdCQURpQztFQUVyQyxPQUFPLEVBQUUsU0FBQSxPQUFBLENBQUEsS0FBSyxFQUFJO0lBQ2hCLEtBQUssQ0FBQyxRQUFOLENBQWUsU0FBZixDQUF5QixTQUF6QixHQUFxQyxFQUFyQyxDQUFBO0dBSG1DO0VBS3JDLFNBQVMsRUFBRTtJQUNULGtCQUFBLEVBQW9CLFNBQUEsZUFBQSxDQUFBLEtBQUEsRUFBcUI7TUFBQSxJQUFsQixXQUFrQixHQUFBLEtBQUEsQ0FBbEIsV0FBa0IsQ0FBQTtNQUN2QyxXQUFXLENBQUMsWUFBWixHQUEyQixJQUFJLGFBQUEsQ0FBQSxTQUFBLENBQUosQ0FBaUIsV0FBakIsQ0FBM0IsQ0FBQTtLQUZPO0lBS1Qsa0NBQUEsRUFBb0MsU0FBQSw2QkFBQSxDQUFBLEdBQUcsRUFBSTtNQUFBLElBQ2pDLFlBRGlDLEdBQ2hCLEdBQUcsQ0FBQyxXQURZLENBQ2pDLFlBRGlDLENBQUE7TUFHekMsWUFBWSxDQUFDLEtBQWIsQ0FBbUIsR0FBbkIsRUFBd0IsR0FBRyxDQUFDLFdBQUosQ0FBZ0IsTUFBaEIsQ0FBdUIsS0FBdkIsQ0FBNkIsSUFBckQsQ0FBQSxDQUFBO01BQ0EsR0FBRyxDQUFDLFdBQUosQ0FBZ0IsS0FBaEIsR0FBd0IsWUFBWSxDQUFDLEtBQXJDLENBQUE7TUFDQSxZQUFZLENBQUMsa0JBQWIsQ0FBZ0MsR0FBaEMsQ0FBQSxDQUFBO0tBVk87SUFhVCxpQ0FBQSxFQUFtQyxTQUFBLDRCQUFBLENBQUEsR0FBRyxFQUFBO01BQUEsT0FBSSxHQUFHLENBQUMsV0FBSixDQUFnQixZQUFoQixDQUE2QixXQUE3QixDQUF5QyxHQUF6QyxDQUFKLENBQUE7S0FiN0I7SUFlVCxnQ0FBQSxFQUFrQyxTQUFBLDJCQUFBLENBQUEsR0FBRyxFQUFBO01BQUEsT0FBSSxHQUFHLENBQUMsV0FBSixDQUFnQixZQUFoQixDQUE2QixTQUE3QixDQUF1QyxHQUF2QyxDQUFKLENBQUE7S0FmNUI7SUFpQlQsMkJBQUEsRUFBNkIsaUJBakJwQjtJQWtCVCwwQkFBQSxFQUE0QixpQkFsQm5CO0lBbUJULHlCQUFBLEVBQTJCLGlCQW5CbEI7SUFxQlQsaUNBQUEsRUFBbUMsU0FBQSw0QkFBQSxDQUFBLEdBQUcsRUFBQTtNQUFBLE9BQUksR0FBRyxDQUFDLFdBQUosQ0FBZ0IsWUFBaEIsQ0FBNkIsd0JBQTdCLENBQXNELEdBQXRELENBQUosQ0FBQTtLQXJCN0I7SUFzQlQsZ0NBQUEsRUFBa0MsU0FBQSwyQkFBQSxDQUFBLEdBQUcsRUFBQTtNQUFBLE9BQUksR0FBRyxDQUFDLFdBQUosQ0FBZ0IsWUFBaEIsQ0FBNkIsd0JBQTdCLENBQXNELEdBQXRELENBQUosQ0FBQTtLQXRCNUI7SUF3QlQsbUJBQUEsRUFBcUIsU0FBQSxnQkFBQSxDQUFBLEdBQUcsRUFBQTtNQUFBLE9BQUksR0FBRyxDQUFDLFdBQUosQ0FBZ0IsWUFBaEIsQ0FBNkIsSUFBN0IsQ0FBa0MsR0FBbEMsQ0FBSixDQUFBO0tBQUE7R0E3Qlc7RUErQnJDLE1BQU0sRUFBRSxDQUFDLFNBQUQsRUFBWSxhQUFaLEVBQTJCLGdCQUEzQixFQUE2QyxpQkFBN0MsQ0FBQTtDQS9CVixDQUFBO29CQWtDZTs7Ozs7Ozs7Ozs7Ozs7O0FDaktmLCtFQUFBOztBQUNBLElBQUEsY0FBQSxHQUFBLDRCQUFBLENBQUEsU0FBQSxDQUFBLENBQUE7Ozs7OztBQWtCQyxnQkFBQSxDQUFBLGFBQUQsQ0FBdUIsUUFBdkIsR0FBa0MsRUFBbEMsQ0FBQTs7QUFFTyxTQUFTLFFBQVQsQ0FBbUIsV0FBbkIsRUFBc0Q7RUFDM0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFqQixFQUFnQztJQUFFLE9BQUE7R0FBUTs7RUFFMUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEdBQXBCLEVBQXlCLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEtBQTVDLENBQVgsQ0FBQTtFQUVBLFdBQVcsQ0FBQyxNQUFaLENBQW1CLE9BQW5CLENBQTJCLENBQTNCLEdBQStCLENBQS9CLENBQUE7RUFDQSxXQUFXLENBQUMsTUFBWixDQUFtQixPQUFuQixDQUEyQixDQUEzQixHQUErQixDQUEvQixDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxZQUFULENBQUEsSUFBQSxFQUErRTtFQUFBLElBQXRELFdBQXNELEdBQUEsSUFBQSxDQUF0RCxXQUFzRCxDQUFBO0VBQzdFLFlBQVksQ0FBQyxXQUFELENBQVosQ0FBQTtDQUNEOztBQUVELFNBQVMsU0FBVCxDQUFBLEtBQUEsRUFBNEY7RUFBQSxJQUF0RSxXQUFzRSxHQUFBLEtBQUEsQ0FBdEUsV0FBc0UsQ0FBQTtFQUMxRixJQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsV0FBRCxDQUEvQixDQUFBOztFQUVBLElBQUksQ0FBQyxVQUFMLEVBQWlCO0lBQUUsT0FBQTtHQUFROztFQUUzQixXQUFXLENBQUMsSUFBWixDQUFpQjtJQUFFLE1BQU0sRUFBRSxJQUFBO0dBQTNCLENBQUEsQ0FBQTtFQUNBLFdBQVcsQ0FBQyxHQUFaLEVBQUEsQ0FBQTtFQUVBLE9BQU8sS0FBUCxDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxRQUFULENBQUEsS0FBQSxFQUFzRTtFQUFBLElBQXRELFdBQXNELEdBQUEsS0FBQSxDQUF0RCxXQUFzRCxDQUFBO0VBQ3BFLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEtBQW5CLENBQXlCLENBQXpCLEdBQTZCLENBQTdCLENBQUE7RUFDQSxXQUFXLENBQUMsTUFBWixDQUFtQixLQUFuQixDQUF5QixDQUF6QixHQUE2QixDQUE3QixDQUFBO0VBQ0EsV0FBVyxDQUFDLE1BQVosQ0FBbUIsT0FBbkIsQ0FBMkIsQ0FBM0IsR0FBK0IsQ0FBL0IsQ0FBQTtFQUNBLFdBQVcsQ0FBQyxNQUFaLENBQW1CLE9BQW5CLENBQTJCLENBQTNCLEdBQStCLENBQS9CLENBQUE7Q0FDRDs7QUFFTSxTQUFTLFlBQVQsQ0FBdUIsV0FBdkIsRUFBMEQ7RUFDL0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFELENBQWYsRUFBOEI7SUFDNUIsT0FBTyxLQUFQLENBQUE7R0FDRDs7RUFIOEQsSUFLdkQsT0FMdUQsR0FLM0MsV0FBVyxDQUFDLE1BTCtCLENBS3ZELE9BTHVELENBQUE7RUFPL0QsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEdBQXBCLEVBQXlCLE9BQXpCLENBQVgsQ0FBQTtFQUNBLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBWixDQUFtQixLQUFwQixFQUEyQixPQUEzQixDQUFYLENBQUE7RUFDQSxjQUFTLENBQUMsUUFBVixDQUFtQixXQUFXLENBQUMsS0FBL0IsRUFBc0MsV0FBVyxDQUFDLElBQWxELEVBQXdELE9BQXhELENBQUEsQ0FBQTtFQUVBLE9BQU8sQ0FBQyxDQUFSLEdBQVksQ0FBWixDQUFBO0VBQ0EsT0FBTyxDQUFDLENBQVIsR0FBWSxDQUFaLENBQUE7RUFFQSxPQUFPLElBQVAsQ0FBQTtDQUNEOztBQUVELFNBQVMsUUFBVCxDQUFBLEtBQUEsRUFBeUU7RUFBQSxJQUF4QixDQUF3QixHQUFBLEtBQUEsQ0FBeEIsQ0FBd0I7TUFBckIsQ0FBcUIsR0FBQSxLQUFBLENBQXJCLENBQXFCLENBQUE7RUFDdkUsSUFBQSxDQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLENBQXBCLElBQXlCLENBQXpCLENBQUE7RUFDQSxJQUFBLENBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsQ0FBcEIsSUFBeUIsQ0FBekIsQ0FBQTtFQUVBLElBQUEsQ0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixDQUFsQixJQUF1QixDQUF2QixDQUFBO0VBQ0EsSUFBQSxDQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLENBQWxCLElBQXVCLENBQXZCLENBQUE7Q0FDRDs7QUFFRCxTQUFTLFdBQVQsQ0FBQSxLQUFBLEVBQUEsS0FBQSxFQUFrRTtFQUFBLElBQTFDLElBQTBDLEdBQUEsS0FBQSxDQUExQyxJQUEwQztNQUFwQyxNQUFvQyxHQUFBLEtBQUEsQ0FBcEMsTUFBb0MsQ0FBQTtFQUFBLElBQXhCLENBQXdCLEdBQUEsS0FBQSxDQUF4QixDQUF3QjtNQUFyQixDQUFxQixHQUFBLEtBQUEsQ0FBckIsQ0FBcUIsQ0FBQTtFQUNoRSxJQUFJLENBQUMsQ0FBTCxJQUFVLENBQVYsQ0FBQTtFQUNBLElBQUksQ0FBQyxDQUFMLElBQVUsQ0FBVixDQUFBO0VBQ0EsTUFBTSxDQUFDLENBQVAsSUFBWSxDQUFaLENBQUE7RUFDQSxNQUFNLENBQUMsQ0FBUCxJQUFZLENBQVosQ0FBQTtDQUNEOztBQUVELFNBQVMsVUFBVCxDQUFxQixXQUFyQixFQUFrQztFQUNoQyxPQUFPLENBQUMsRUFBRSxXQUFXLENBQUMsTUFBWixDQUFtQixPQUFuQixDQUEyQixDQUEzQixJQUFnQyxXQUFXLENBQUMsTUFBWixDQUFtQixPQUFuQixDQUEyQixDQUE3RCxDQUFSLENBQUE7Q0FDRDs7QUFFRCxJQUFNLE1BQXVCLEdBQUc7RUFDOUIsRUFBRSxFQUFFLFFBRDBCO0VBRTlCLE9BRjhCLEVBQUEsU0FBQSxPQUFBLENBRXJCLEtBRnFCLEVBRWQ7SUFDZCxLQUFLLENBQUMsV0FBTixDQUFrQixTQUFsQixDQUE0QixRQUE1QixHQUF1QyxRQUF2QyxDQUFBO0dBSDRCO0VBSzlCLFNBQVMsRUFBRTtJQUNULGtCQUFBLEVBQW9CLFNBQUEsZUFBQSxDQUFBLEtBQUEsRUFBcUI7TUFBQSxJQUFsQixXQUFrQixHQUFBLEtBQUEsQ0FBbEIsV0FBa0IsQ0FBQTtNQUN2QyxXQUFXLENBQUMsTUFBWixHQUFxQjtRQUNuQixLQUFLLEVBQUU7VUFBRSxDQUFDLEVBQUUsQ0FBTDtVQUFRLENBQUMsRUFBRSxDQUFBO1NBREM7UUFFbkIsT0FBTyxFQUFFO1VBQUUsQ0FBQyxFQUFFLENBQUw7VUFBUSxDQUFDLEVBQUUsQ0FBQTtTQUFYO09BRlgsQ0FBQTtLQUZPO0lBT1QsNkJBQUEsRUFBK0IsU0FBQSx5QkFBQSxDQUFBLEtBQUEsRUFBQTtNQUFBLElBQUcsV0FBSCxHQUFBLEtBQUEsQ0FBRyxXQUFILENBQUE7TUFBQSxPQUFxQixRQUFRLENBQUMsV0FBRCxDQUE3QixDQUFBO0tBUHRCO0lBUVQsa0NBQUEsRUFBb0MsWUFSM0I7SUFTVCxpQ0FBQSxFQUFtQyxZQVQxQjtJQVVULGdDQUFBLEVBQWtDLFNBVnpCO0lBV1QsbUJBQUEsRUFBcUIsUUFBQTtHQVhaO0NBTGIsQ0FBQTtvQkFvQmU7Ozs7Ozs7Ozs7Ozs7QUM1R2YsSUFBQSxTQUFBLEdBQUEsNEJBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLGtCQUFBLEdBQUEsMkJBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxXQUFBLEdBQUEsMkJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLFFBQUEsR0FBQSw0QkFBQSxDQUFBLGFBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsV0FBQSxHQUFBLDJCQUFBLENBQUEsVUFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxPQUFBLEdBQUEsNEJBQUEsQ0FBQSxPQUFBLENBQUEsQ0FBQTs7QUFDQSxrRkFBQTs7QUFDQSxJQUFBLFNBQUEsR0FBQSwyQkFBQSxDQUFBLFFBQUEsQ0FBQSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0FBd0NBLFNBQVMsWUFBVCxDQUFrQixLQUFsQixFQUF5QztFQUFBLElBRXJDLFFBRnFDLEdBR25DLEtBSG1DLENBRXJDLFFBRnFDLENBQUE7RUFLdkMsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsV0FBQSxDQUFBLFNBQUEsQ0FBaEIsQ0FBQSxDQUFBO0VBQ0EsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsU0FBUyxDQUFBLFNBQUEsQ0FBekIsQ0FBQSxDQUFBO0VBQ0EsS0FBSyxDQUFDLE9BQU4sQ0FBYyxNQUFkLENBQXFCLFlBQXJCLEdBQW9DLElBQXBDLENBQUE7RUFDQSxLQUFLLENBQUMsT0FBTixDQUFjLE1BQWQsQ0FBcUIsTUFBckIsR0FBOEIsSUFBOUIsQ0FBQTtFQUVBLFFBQVEsQ0FBQyxTQUFULENBQW1CLE9BQW5CLEdBQTZCO0lBQzNCLE9BQU8sRUFBWSxLQURRO0lBRTNCLFVBQVUsRUFBUyxFQUZROztJQUczQixRQUFRLEVBQVcsR0FIUTs7SUFJM0IsUUFBUSxFQUFXLEVBSlE7O0lBSzNCLFdBQVcsRUFBUSxJQUxROztJQU0zQixpQkFBaUIsRUFBRSxHQU5ROztHQUE3QixDQUFBO0NBUUQ7O0lBRVk7OztFQXVCWCxTQUFBLFlBQUEsQ0FDbUIsV0FEbkIsRUFFRTtJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLFlBQUEsQ0FBQSxDQUFBOztJQUFBLElBQUEsQ0FEaUIsV0FDakIsR0FEaUIsV0FDakIsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxRQUFBLEVBeEJPLEtBd0JQLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxZQUFBLEVBdkJXLEtBdUJYLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxXQUFBLEVBdEJVLEtBc0JWLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxhQUFBLEVBckJZLEtBcUJaLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxjQUFBLEVBbkIyQixJQW1CM0IsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLGVBQUEsRUFsQmMsQ0FrQmQsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLGFBQUEsRUFqQm1DLElBaUJuQyxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsYUFBQSxFQWY0QixJQWU1QixDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsSUFBQSxFQWRHLENBY0gsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLElBQUEsRUFiRyxDQWFILENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxJQUFBLEVBWEcsQ0FXSCxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsY0FBQSxFQVY2QixJQVU3QixDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsZ0JBQUEsRUFUK0IsSUFTL0IsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLGVBQUEsRUFSOEIsSUFROUIsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLFdBQUEsRUFOVyxDQU1YLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLElBQUEsRUFBQSxXQUFBLEVBTFcsQ0FLWCxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsU0FBQSxFQUpnQixJQUloQixDQUFBLENBQUE7R0FBRTs7OzswQkFFRyxPQUFrQztNQUFBLElBQy9CLFdBRCtCLEdBQ2YsSUFEZSxDQUMvQixXQUQrQixDQUFBO01BRXZDLElBQU0sT0FBTyxHQUFHLGVBQVUsQ0FBQyxXQUFELENBQTFCLENBQUE7O01BRUEsSUFBSSxDQUFDLE9BQUQsSUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUF6QixFQUFrQztRQUNoQyxPQUFPLEtBQVAsQ0FBQTtPQUNEOztNQU5zQyxJQVF2QixjQVJ1QixHQVFKLFdBQVcsQ0FBQyxNQUFaLENBQW1CLFFBUmYsQ0FRL0IsTUFSK0IsQ0FBQTtNQVN2QyxJQUFNLFlBQVksR0FBRyxDQUFBLENBQUEsRUFBQSxXQUFBLENBQUEsU0FBQSxDQUFBLEVBQU0sY0FBYyxDQUFDLENBQXJCLEVBQXdCLGNBQWMsQ0FBQyxDQUF2QyxDQUFyQixDQUFBO01BQ0EsSUFBTSxZQUFZLEdBQUcsSUFBQSxDQUFLLFlBQUwsS0FBc0IsSUFBQSxDQUFLLFlBQUwsR0FBb0IsSUFBSSxrQkFBQSxDQUFBLFNBQUEsQ0FBSixDQUFpQixXQUFqQixDQUExQyxDQUFyQixDQUFBO01BRUEsWUFBWSxDQUFDLFFBQWIsQ0FBc0IsV0FBVyxDQUFDLFlBQWxDLENBQUEsQ0FBQTtNQUVBLElBQUEsQ0FBSyxFQUFMLEdBQVUsV0FBVyxDQUFDLElBQVosRUFBVixDQUFBO01BQ0EsSUFBQSxDQUFLLFdBQUwsR0FBbUIsT0FBTyxDQUFDLFdBQTNCLENBQUE7TUFDQSxJQUFBLENBQUssRUFBTCxHQUFVLFlBQVYsQ0FBQTtNQUNBLElBQUEsQ0FBSyxhQUFMLEdBQXFCO1FBQUUsQ0FBQyxFQUFFLENBQUw7UUFBUSxDQUFDLEVBQUUsQ0FBQTtPQUFoQyxDQUFBO01BQ0EsSUFBQSxDQUFLLFdBQUwsR0FBbUIsV0FBVyxDQUFDLE1BQVosQ0FBbUIsR0FBbkIsQ0FBdUIsSUFBMUMsQ0FBQTtNQUVBLElBQUEsQ0FBSyxXQUFMLEdBQW1CO1FBQ2pCLFdBQVcsRUFBWCxXQURpQjtRQUVqQixZQUFZLEVBQUUsV0FBVyxDQUFDLFlBRlQ7UUFHakIsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUhKO1FBSWpCLElBQUksRUFBRSxXQUFXLENBQUMsSUFKRDtRQUtqQixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBTEY7UUFNakIsVUFBVSxFQUFFLElBQUEsQ0FBSyxXQU5BO1FBT2pCLE1BQU0sRUFBRSxJQVBTO1FBUWpCLEtBQUssRUFBRSxjQUFBO09BUlQsQ0FBQTtNQVdBLElBQU0sTUFBTSxHQUNULElBQUEsQ0FBSyxFQUFMLEdBQVUsV0FBVyxDQUFDLE1BQVosQ0FBbUIsR0FBbkIsQ0FBdUIsU0FBbEMsR0FBK0MsRUFBL0MsSUFDQSxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBRHZCLElBRUEsWUFBWSxHQUFHLE9BQU8sQ0FBQyxRQUh6QixDQUFBOztNQU1BLElBQUksTUFBSixFQUFZO1FBQ1YsSUFBQSxDQUFLLFlBQUwsRUFBQSxDQUFBO09BREYsTUFFTztRQUNMLFlBQVksQ0FBQyxNQUFiLEdBQXNCLFlBQVksQ0FBQyxNQUFiLENBQW9CLElBQUEsQ0FBSyxXQUF6QixDQUF0QixDQUFBOztRQUVBLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBYixDQUFvQixPQUF6QixFQUFrQztVQUNoQyxPQUFPLEtBQVAsQ0FBQTtTQUNEOztRQUVELElBQUEsQ0FBSyxjQUFMLEVBQUEsQ0FBQTtPQTlDcUM7OztNQWtEdkMsV0FBVyxDQUFDLFlBQVosQ0FBeUIsTUFBekIsQ0FBZ0MsSUFBaEMsR0FBdUMsSUFBdkMsQ0FsRHVDOztNQXFEdkMsV0FBVyxDQUFDLFFBQVosQ0FBcUIsSUFBQSxDQUFLLFlBQTFCLENBQUEsQ0FBQTs7TUFDQSxXQUFXLENBQUMsUUFBWixDQUFxQjtRQUNuQixXQUFXLEVBQVgsV0FEbUI7UUFFbkIsS0FBSyxFQUFMLEtBRm1CO1FBR25CLEtBQUssRUFBRSxjQUFBO09BSFQsQ0FBQSxDQUFBOztNQUtBLFdBQVcsQ0FBQyxRQUFaLENBQXFCO1FBQUUsQ0FBQyxFQUFFLENBQUMsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsQ0FBeEI7UUFBMkIsQ0FBQyxFQUFFLENBQUMsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsQ0FBQTtPQUF0RSxDQUFBLENBM0R1Qzs7TUE2RHZDLFdBQVcsQ0FBQyxZQUFaLENBQXlCLE1BQXpCLENBQWdDLElBQWhDLEdBQXVDLElBQXZDLENBQUE7TUFFQSxJQUFBLENBQUssTUFBTCxHQUFjLElBQWQsQ0FBQTtNQUNBLFdBQVcsQ0FBQyxVQUFaLEdBQXlCLElBQXpCLENBQUE7TUFFQSxPQUFPLElBQVAsQ0FBQTtLQUNEOzs7bUNBRWU7TUFBQSxJQUFBLEtBQUEsR0FBQSxJQUFBLENBQUE7O01BQ2QsSUFBTSxhQUFhLEdBQUcsSUFBQSxDQUFLLFdBQUwsQ0FBaUIsTUFBakIsQ0FBd0IsUUFBeEIsQ0FBaUMsTUFBdkQsQ0FBQTtNQUNBLElBQU0sT0FBTyxHQUFHLGVBQVUsQ0FBQyxJQUFBLENBQUssV0FBTixDQUExQixDQUFBO01BQ0EsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQXZCLENBQUE7TUFDQSxJQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFMLENBQVMsT0FBTyxDQUFDLFFBQVIsR0FBbUIsSUFBQSxDQUFLLEVBQWpDLENBQUQsR0FBd0MsTUFBM0QsQ0FBQTtNQUVBLElBQUEsQ0FBSyxZQUFMLEdBQW9CO1FBQ2xCLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFkLEdBQWtCLFVBQW5CLElBQWlDLE1BRGxCO1FBRWxCLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFkLEdBQWtCLFVBQW5CLElBQWlDLE1BQUE7T0FGdEMsQ0FBQTtNQUtBLElBQUEsQ0FBSyxFQUFMLEdBQVUsVUFBVixDQUFBO01BQ0EsSUFBQSxDQUFLLFNBQUwsR0FBaUIsTUFBTSxHQUFHLElBQUEsQ0FBSyxFQUEvQixDQUFBO01BQ0EsSUFBQSxDQUFLLFNBQUwsR0FBaUIsQ0FBQSxHQUFJLE9BQU8sQ0FBQyxRQUFSLEdBQW1CLElBQUEsQ0FBSyxFQUE3QyxDQUFBO01BYmMsSUFlTixZQWZNLEdBZXdCLElBZnhCLENBZU4sWUFmTTtVQWVRLFdBZlIsR0Fld0IsSUFmeEIsQ0FlUSxXQWZSLENBQUE7TUFpQmQsV0FBVyxDQUFDLFVBQVosR0FBeUI7UUFDdkIsQ0FBQyxFQUFFLElBQUEsQ0FBSyxXQUFMLENBQWlCLENBQWpCLEdBQXFCLElBQUEsQ0FBSyxZQUFMLENBQWtCLENBRG5CO1FBRXZCLENBQUMsRUFBRSxJQUFBLENBQUssV0FBTCxDQUFpQixDQUFqQixHQUFxQixJQUFBLENBQUssWUFBTCxDQUFrQixDQUFBO09BRjVDLENBQUE7TUFLQSxZQUFZLENBQUMsTUFBYixHQUFzQixZQUFZLENBQUMsTUFBYixDQUFvQixXQUFwQixDQUF0QixDQUFBOztNQUVBLElBQUksWUFBWSxDQUFDLE1BQWIsQ0FBb0IsT0FBeEIsRUFBaUM7UUFDL0IsSUFBQSxDQUFLLFVBQUwsR0FBa0IsSUFBbEIsQ0FBQTtRQUNBLElBQUEsQ0FBSyxjQUFMLEdBQXNCO1VBQ3BCLENBQUMsRUFBRSxJQUFBLENBQUssWUFBTCxDQUFrQixDQUFsQixHQUFzQixZQUFZLENBQUMsTUFBYixDQUFvQixLQUFwQixDQUEwQixDQUQvQjtVQUVwQixDQUFDLEVBQUUsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsQ0FBbEIsR0FBc0IsWUFBWSxDQUFDLE1BQWIsQ0FBb0IsS0FBcEIsQ0FBMEIsQ0FBQTtTQUZyRCxDQUFBO09BSUQ7O01BRUQsSUFBQSxDQUFLLE9BQUwsR0FBZSxTQUFBLENBQUEsU0FBQSxDQUFBLENBQUksT0FBSixDQUFZLFlBQUE7UUFBQSxPQUFNLEtBQUksQ0FBQyxXQUFMLEVBQU4sQ0FBQTtPQUFaLENBQWYsQ0FBQTtLQUNEOzs7cUNBRWlCO01BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztNQUNoQixJQUFBLENBQUssU0FBTCxHQUFpQixJQUFqQixDQUFBO01BQ0EsSUFBQSxDQUFLLFVBQUwsR0FBa0IsSUFBbEIsQ0FBQTtNQUNBLElBQUEsQ0FBSyxZQUFMLEdBQW9CO1FBQ2xCLENBQUMsRUFBRSxJQUFBLENBQUssWUFBTCxDQUFrQixNQUFsQixDQUF5QixLQUF6QixDQUErQixDQURoQjtRQUVsQixDQUFDLEVBQUUsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsTUFBbEIsQ0FBeUIsS0FBekIsQ0FBK0IsQ0FBQTtPQUZwQyxDQUFBO01BS0EsSUFBQSxDQUFLLE9BQUwsR0FBZSxTQUFBLENBQUEsU0FBQSxDQUFBLENBQUksT0FBSixDQUFZLFlBQUE7UUFBQSxPQUFNLE1BQUksQ0FBQyxhQUFMLEVBQU4sQ0FBQTtPQUFaLENBQWYsQ0FBQTtLQUNEOzs7a0NBRWM7TUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O01BQUEsSUFDTCxXQURLLEdBQ1csSUFEWCxDQUNMLFdBREssQ0FBQTtNQUViLElBQU0sT0FBTyxHQUFHLGVBQVUsQ0FBQyxXQUFELENBQTFCLENBQUE7TUFDQSxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBdkIsQ0FBQTtNQUNBLElBQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQVosRUFBQSxHQUFxQixJQUFBLENBQUssRUFBM0IsSUFBaUMsSUFBM0MsQ0FBQTs7TUFFQSxJQUFJLENBQUMsR0FBRyxJQUFBLENBQUssRUFBYixFQUFpQjtRQUNmLElBQU0sUUFBUSxHQUFJLENBQUEsR0FBSSxDQUFDLElBQUksQ0FBQyxHQUFMLENBQVMsQ0FBQyxNQUFELEdBQVUsQ0FBbkIsQ0FBQSxHQUF3QixJQUFBLENBQUssU0FBOUIsSUFBMkMsSUFBQSxDQUFLLFNBQXRFLENBQUE7UUFDQSxJQUFJLFNBQUosQ0FBQTs7UUFFQSxJQUFJLElBQUEsQ0FBSyxVQUFULEVBQXFCO1VBQ25CLFNBQVMsR0FBRyxzQkFBc0IsQ0FDaEMsQ0FEZ0MsRUFDN0IsQ0FENkIsRUFFaEMsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsQ0FGYyxFQUVYLElBQUEsQ0FBSyxZQUFMLENBQWtCLENBRlAsRUFHaEMsSUFBQSxDQUFLLGNBQUwsQ0FBb0IsQ0FIWSxFQUdULElBQUEsQ0FBSyxjQUFMLENBQW9CLENBSFgsRUFJaEMsUUFKZ0MsQ0FBbEMsQ0FBQTtTQURGLE1BUUs7VUFDSCxTQUFTLEdBQUc7WUFDVixDQUFDLEVBQUUsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsQ0FBbEIsR0FBc0IsUUFEZjtZQUVWLENBQUMsRUFBRSxJQUFBLENBQUssWUFBTCxDQUFrQixDQUFsQixHQUFzQixRQUFBO1dBRjNCLENBQUE7U0FJRDs7UUFFRCxJQUFNLEtBQUssR0FBRztVQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBVixHQUFjLElBQUEsQ0FBSyxhQUFMLENBQW1CLENBQXRDO1VBQXlDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBVixHQUFjLElBQUEsQ0FBSyxhQUFMLENBQW1CLENBQUE7U0FBM0YsQ0FBQTtRQUVBLElBQUEsQ0FBSyxhQUFMLENBQW1CLENBQW5CLElBQXdCLEtBQUssQ0FBQyxDQUE5QixDQUFBO1FBQ0EsSUFBQSxDQUFLLGFBQUwsQ0FBbUIsQ0FBbkIsSUFBd0IsS0FBSyxDQUFDLENBQTlCLENBQUE7UUFFQSxXQUFXLENBQUMsUUFBWixDQUFxQixLQUFyQixDQUFBLENBQUE7UUFDQSxXQUFXLENBQUMsSUFBWixFQUFBLENBQUE7UUFFQSxJQUFBLENBQUssT0FBTCxHQUFlLFNBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBSSxPQUFKLENBQVksWUFBQTtVQUFBLE9BQU0sTUFBSSxDQUFDLFdBQUwsRUFBTixDQUFBO1NBQVosQ0FBZixDQUFBO09BM0JGLE1BNkJLO1FBQ0gsV0FBVyxDQUFDLFFBQVosQ0FBcUI7VUFDbkIsQ0FBQyxFQUFFLElBQUEsQ0FBSyxjQUFMLENBQW9CLENBQXBCLEdBQXdCLElBQUEsQ0FBSyxhQUFMLENBQW1CLENBRDNCO1VBRW5CLENBQUMsRUFBRSxJQUFBLENBQUssY0FBTCxDQUFvQixDQUFwQixHQUF3QixJQUFBLENBQUssYUFBTCxDQUFtQixDQUFBO1NBRmhELENBQUEsQ0FBQTtRQUtBLElBQUEsQ0FBSyxHQUFMLEVBQUEsQ0FBQTtPQUNEO0tBQ0Y7OztvQ0FFZ0I7TUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O01BQUEsSUFDUCxXQURPLEdBQ1MsSUFEVCxDQUNQLFdBRE8sQ0FBQTtNQUVmLElBQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFaLEVBQUEsR0FBcUIsSUFBQSxDQUFLLEVBQXBDLENBQUE7O01BRmUsSUFBQSxXQUFBLEdBR3lCLGVBQVUsQ0FBQyxXQUFELENBSG5DO1VBR1ksUUFIWixHQUFBLFdBQUEsQ0FHUCxpQkFITyxDQUFBOztNQUtmLElBQUksQ0FBQyxHQUFHLFFBQVIsRUFBa0I7UUFDaEIsSUFBTSxTQUFTLEdBQUc7VUFDaEIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLElBQUEsQ0FBSyxZQUFMLENBQWtCLENBQXpCLEVBQTRCLFFBQTVCLENBREU7VUFFaEIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLElBQUEsQ0FBSyxZQUFMLENBQWtCLENBQXpCLEVBQTRCLFFBQTVCLENBQUE7U0FGaEIsQ0FBQTtRQUlBLElBQU0sS0FBSyxHQUFHO1VBQ1osQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFWLEdBQWMsSUFBQSxDQUFLLGFBQUwsQ0FBbUIsQ0FEeEI7VUFFWixDQUFDLEVBQUUsU0FBUyxDQUFDLENBQVYsR0FBYyxJQUFBLENBQUssYUFBTCxDQUFtQixDQUFBO1NBRnRDLENBQUE7UUFLQSxJQUFBLENBQUssYUFBTCxDQUFtQixDQUFuQixJQUF3QixLQUFLLENBQUMsQ0FBOUIsQ0FBQTtRQUNBLElBQUEsQ0FBSyxhQUFMLENBQW1CLENBQW5CLElBQXdCLEtBQUssQ0FBQyxDQUE5QixDQUFBO1FBRUEsV0FBVyxDQUFDLFFBQVosQ0FBcUIsS0FBckIsQ0FBQSxDQUFBO1FBQ0EsV0FBVyxDQUFDLElBQVosQ0FBaUI7VUFBRSxhQUFhLEVBQUUsSUFBQSxDQUFLLGFBQUE7U0FBdkMsQ0FBQSxDQUFBO1FBRUEsSUFBQSxDQUFLLE9BQUwsR0FBZSxTQUFBLENBQUEsU0FBQSxDQUFBLENBQUksT0FBSixDQUFZLFlBQUE7VUFBQSxPQUFNLE1BQUksQ0FBQyxhQUFMLEVBQU4sQ0FBQTtTQUFaLENBQWYsQ0FBQTtPQWhCRixNQWtCSztRQUNILFdBQVcsQ0FBQyxRQUFaLENBQXFCO1VBQ25CLENBQUMsRUFBRSxJQUFBLENBQUssWUFBTCxDQUFrQixDQUFsQixHQUFzQixJQUFBLENBQUssYUFBTCxDQUFtQixDQUR6QjtVQUVuQixDQUFDLEVBQUUsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsQ0FBbEIsR0FBc0IsSUFBQSxDQUFLLGFBQUwsQ0FBbUIsQ0FBQTtTQUY5QyxDQUFBLENBQUE7UUFLQSxJQUFBLENBQUssR0FBTCxFQUFBLENBQUE7T0FDRDtLQUNGOzs7aUNBRWtGO01BQUEsSUFBekUsT0FBeUUsR0FBQSxJQUFBLENBQXpFLE9BQXlFO1VBQWhFLEtBQWdFLEdBQUEsSUFBQSxDQUFoRSxLQUFnRTtVQUF6RCxXQUF5RCxHQUFBLElBQUEsQ0FBekQsV0FBeUQsQ0FBQTtNQUFBLElBQ3pFLFdBRHlFLEdBQ3pELElBRHlELENBQ3pFLFdBRHlFLENBQUE7O01BSWpGLFdBQVcsQ0FBQyxRQUFaLENBQXFCO1FBQ25CLENBQUMsRUFBRSxDQUFDLElBQUEsQ0FBSyxhQUFMLENBQW1CLENBREo7UUFFbkIsQ0FBQyxFQUFFLENBQUMsSUFBQSxDQUFLLGFBQUwsQ0FBbUIsQ0FBQTtPQUZ6QixDQUFBLENBSmlGOztNQVVqRixXQUFXLENBQUMsYUFBWixDQUEwQixPQUExQixFQUFtQyxLQUFuQyxFQUEwQyxXQUExQyxFQUF1RCxJQUF2RCxDQUFBLENBVmlGOztNQWFqRixXQUFXLENBQUMsUUFBWixDQUFxQjtRQUNuQixXQUFXLEVBQVgsV0FEbUI7UUFFbkIsS0FBSyxFQUFMLEtBRm1CO1FBR25CLEtBQUssRUFBRSxRQUFBO09BSFQsQ0FBQSxDQUFBOztNQUtBLENBQUEsQ0FBQSxFQUFBLGlCQUFBLENBQUEsVUFBQSxFQUFXLFdBQVcsQ0FBQyxNQUFaLENBQW1CLElBQTlCLEVBQW9DLFdBQVcsQ0FBQyxNQUFaLENBQW1CLEdBQXZELENBQUEsQ0FBQTtNQUVBLElBQUEsQ0FBSyxJQUFMLEVBQUEsQ0FBQTtLQUNEOzs7MEJBRU07TUFDTCxJQUFBLENBQUssV0FBTCxDQUFpQixJQUFqQixFQUFBLENBQUE7TUFDQSxJQUFBLENBQUssV0FBTCxDQUFpQixHQUFqQixFQUFBLENBQUE7TUFDQSxJQUFBLENBQUssSUFBTCxFQUFBLENBQUE7S0FDRDs7OzJCQUVPO01BQ04sSUFBQSxDQUFLLE1BQUwsR0FBYyxJQUFBLENBQUssU0FBTCxHQUFpQixLQUEvQixDQUFBO01BQ0EsSUFBQSxDQUFLLFdBQUwsQ0FBaUIsVUFBakIsR0FBOEIsSUFBOUIsQ0FBQTs7TUFDQSxTQUFBLENBQUEsU0FBQSxDQUFBLENBQUksTUFBSixDQUFXLElBQUEsQ0FBSyxPQUFoQixDQUFBLENBQUE7S0FDRDs7Ozs7Ozs7QUFHSCxTQUFTLFVBQVQsQ0FBQSxLQUFBLEVBQXlGO0VBQUEsSUFBdkUsV0FBdUUsR0FBQSxLQUFBLENBQXZFLFdBQXVFO01BQTFELEtBQTBELEdBQUEsS0FBQSxDQUExRCxLQUEwRCxDQUFBOztFQUN2RixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQWIsSUFBNkIsV0FBVyxDQUFDLFVBQTdDLEVBQXlEO0lBQ3ZELE9BQU8sSUFBUCxDQUFBO0dBQ0Q7O0VBRUQsSUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQVosQ0FBb0IsS0FBcEIsQ0FBMEIsS0FBMUIsQ0FBaEIsQ0FMdUY7O0VBUXZGLE9BQU8sT0FBTyxHQUFHLEtBQUgsR0FBVyxJQUF6QixDQUFBOzs7OztBQUtGLFNBQVMsTUFBVCxDQUFpQixHQUFqQixFQUFnRTtFQUFBLElBQ3RELFdBRHNELEdBQ3pCLEdBRHlCLENBQ3RELFdBRHNEO01BQ3pDLFdBRHlDLEdBQ3pCLEdBRHlCLENBQ3pDLFdBRHlDLENBQUE7RUFFOUQsSUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQTFCLENBQUE7O0VBRUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFYLEVBQW1CO0lBQUUsT0FBQTtHQUFROztFQUU3QixJQUFJLE9BQU8sR0FBRyxXQUFkLENBTjhEOztFQVM5RCxPQUFPLE9BQUUsQ0FBQyxPQUFILENBQVcsT0FBWCxDQUFQLEVBQTRCOztJQUUxQixJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsT0FBNUIsRUFBcUM7TUFDbkMsS0FBSyxDQUFDLE1BQU4sQ0FBYSxHQUFiLENBQUEsQ0FBQTtNQUNBLE1BQUE7S0FDRDs7SUFFRCxPQUFPLEdBQUcsUUFBRyxDQUFDLFVBQUosQ0FBZSxPQUFmLENBQVYsQ0FBQTtHQUNEO0NBQ0Y7O0FBRUQsU0FBUyxJQUFULENBQUEsS0FBQSxFQUF1RTtFQUFBLElBQXRELFdBQXNELEdBQUEsS0FBQSxDQUF0RCxXQUFzRCxDQUFBO0VBQ3JFLElBQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUExQixDQUFBOztFQUVBLElBQUksS0FBSyxDQUFDLE1BQVYsRUFBa0I7SUFDaEIsS0FBSyxDQUFDLElBQU4sRUFBQSxDQUFBO0dBQ0Q7Q0FDRjs7QUFFRCxTQUFTLGVBQVQsQ0FBQSxLQUFBLEVBQXVFO0VBQUEsSUFBaEQsWUFBZ0QsR0FBQSxLQUFBLENBQWhELFlBQWdEO01BQWxDLFFBQWtDLEdBQUEsS0FBQSxDQUFsQyxRQUFrQyxDQUFBO0VBQ3JFLE9BQU8sWUFBWSxJQUNqQixZQUFZLENBQUMsT0FEUixJQUVMLFFBQVEsQ0FBQyxJQUZKLElBR0wsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsUUFBUSxDQUFDLElBQTlCLENBQUEsQ0FBb0MsT0FIdEMsQ0FBQTtDQUlEOztBQUVELElBQU0sT0FBd0IsR0FBRztFQUMvQixFQUFFLEVBQUUsU0FEMkI7RUFFL0IsTUFBTSxFQUFFLENBQUMsZ0JBQUQsQ0FGdUI7RUFHL0IsT0FBTyxFQUFQLFlBSCtCO0VBSS9CLFNBQVMsRUFBRTtJQUNULGtCQUFBLEVBQW9CLFNBQUEsZUFBQSxDQUFBLEtBQUEsRUFBcUI7TUFBQSxJQUFsQixXQUFrQixHQUFBLEtBQUEsQ0FBbEIsV0FBa0IsQ0FBQTtNQUN2QyxXQUFXLENBQUMsT0FBWixHQUFzQixJQUFJLFlBQUosQ0FBaUIsV0FBakIsQ0FBdEIsQ0FBQTtLQUZPO0lBS1QsZ0NBQUEsRUFBa0MsVUFMekI7SUFNVCxtQkFBQSxFQUFxQixNQU5aO0lBT1QsbUJBQUEsRUFBcUIsSUFQWjtJQVNULG1DQUFBLEVBQXFDLFNBQUEsOEJBQUEsQ0FBQSxHQUFHLEVBQUk7TUFBQSxJQUNsQyxZQURrQyxHQUNqQixHQUFHLENBQUMsV0FEYSxDQUNsQyxZQURrQyxDQUFBO01BRzFDLFlBQVksQ0FBQyxJQUFiLENBQWtCLEdBQWxCLENBQUEsQ0FBQTtNQUNBLFlBQVksQ0FBQyxLQUFiLENBQW1CLEdBQW5CLEVBQXdCLEdBQUcsQ0FBQyxXQUFKLENBQWdCLE1BQWhCLENBQXVCLEdBQXZCLENBQTJCLElBQW5ELENBQUEsQ0FBQTtNQUNBLFlBQVksQ0FBQyxrQkFBYixDQUFnQyxHQUFoQyxDQUFBLENBQUE7S0FkTztJQWlCVCx5Q0FBQSxFQUEyQyxTQUFBLG9DQUFBLENBQUEsR0FBRyxFQUFBO01BQUEsT0FBSSxHQUFHLENBQUMsV0FBSixDQUFnQixZQUFoQixDQUE2QixXQUE3QixDQUF5QyxHQUF6QyxDQUFKLENBQUE7S0FqQnJDO0lBa0JULDRCQUFBLEVBQThCLFNBQVMsQ0FBQyxpQkFsQi9CO0lBbUJULGtDQUFBLEVBQW9DLFNBQVMsQ0FBQyxpQkFuQnJDO0lBb0JULHdDQUFBLEVBQTBDLFNBQUEsbUNBQUEsQ0FBQSxHQUFHLEVBQUE7TUFBQSxPQUFJLEdBQUcsQ0FBQyxXQUFKLENBQWdCLFlBQWhCLENBQTZCLHdCQUE3QixDQUFzRCxHQUF0RCxDQUFKLENBQUE7S0FwQnBDO0lBcUJULGtDQUFBLEVBQW9DLFNBQUEsNkJBQUEsQ0FBQSxHQUFHLEVBQUE7TUFBQSxPQUFJLEdBQUcsQ0FBQyxXQUFKLENBQWdCLFlBQWhCLENBQTZCLHdCQUE3QixDQUFzRCxHQUF0RCxDQUFKLENBQUE7S0FBQTtHQXJCOUI7Q0FKYjs7QUE4QkEsU0FBUyxnQkFBVCxDQUEyQixDQUEzQixFQUFzQyxFQUF0QyxFQUFrRCxFQUFsRCxFQUE4RCxFQUE5RCxFQUEwRTtFQUN4RSxJQUFNLEVBQUUsR0FBRyxDQUFBLEdBQUksQ0FBZixDQUFBO0VBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBTCxHQUFVLEVBQVYsR0FBZSxDQUFBLEdBQUksRUFBSixHQUFTLENBQVQsR0FBYSxFQUE1QixHQUFpQyxDQUFDLEdBQUcsQ0FBSixHQUFRLEVBQWhELENBQUE7Q0FDRDs7QUFFRCxTQUFTLHNCQUFULENBQ0UsTUFERixFQUNrQixNQURsQixFQUNrQyxHQURsQyxFQUMrQyxHQUQvQyxFQUM0RCxJQUQ1RCxFQUMwRSxJQUQxRSxFQUN3RixRQUR4RixFQUMwRztFQUN4RyxPQUFPO0lBQ0wsQ0FBQyxFQUFHLGdCQUFnQixDQUFDLFFBQUQsRUFBVyxNQUFYLEVBQW1CLEdBQW5CLEVBQXdCLElBQXhCLENBRGY7SUFFTCxDQUFDLEVBQUcsZ0JBQWdCLENBQUMsUUFBRCxFQUFXLE1BQVgsRUFBbUIsR0FBbkIsRUFBd0IsSUFBeEIsQ0FBQTtHQUZ0QixDQUFBOzs7O0FBT0YsU0FBUyxXQUFULENBQXNCLENBQXRCLEVBQWlDLENBQWpDLEVBQTRDLENBQTVDLEVBQXVELENBQXZELEVBQWtFO0VBQ2hFLENBQUMsSUFBSSxDQUFMLENBQUE7RUFDQSxPQUFPLENBQUMsQ0FBRCxHQUFLLENBQUwsSUFBVSxDQUFDLEdBQUcsQ0FBZCxDQUFBLEdBQW1CLENBQTFCLENBQUE7Q0FDRDs7b0JBRWM7Ozs7Ozs7Ozs7O0FDalpmLElBQUEsWUFBQSxHQUFBLDJCQUFBLENBQUEsV0FBQSxDQUFBLENBQUE7O0FBQ0Esa0VBQUE7O0FBRUEsSUFBQSxrQkFBQSxHQUFBLDJCQUFBLENBQUEsaUJBQUEsQ0FBQSxDQUFBOztBQUNBLGtEQUFBOzs7Ozs7Ozs7O0FBb0JBLElBQU0sV0FBaUUsR0FBRztFQUN4RSxLQUR3RSxFQUFBLFNBQUEsS0FBQSxDQUNqRSxHQURpRSxFQUM1RDtJQUFBLElBQ0YsS0FERSxHQUN3RCxHQUR4RCxDQUNGLEtBREU7UUFDSyxJQURMLEdBQ3dELEdBRHhELENBQ0ssSUFETDtRQUNrQixhQURsQixHQUN3RCxHQUR4RCxDQUNXLEtBRFg7UUFDNkMsTUFEN0MsR0FDd0QsR0FEeEQsQ0FDaUMsVUFEakMsQ0FBQTtJQUFBLElBRUosS0FGSSxHQUVNLEtBQUssQ0FBQyxPQUZaLENBRUosS0FGSSxDQUFBO0lBQUEsSUFBQSxjQUFBLEdBR3dCLEtBQUssQ0FBQyxPQUg5QjtRQUdGLFVBSEUsR0FBQSxjQUFBLENBR0YsVUFIRTtRQUdVLFNBSFYsR0FBQSxjQUFBLENBR1UsU0FIVixDQUFBOztJQUtWLElBQUksS0FBSyxLQUFLLFVBQWQsRUFBMEI7TUFDeEIsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFMLEdBQWEsSUFBSSxDQUFDLE1BQTFCLENBQUE7S0FDRDs7SUFFRCxLQUFLLENBQUMsV0FBTixHQUFvQixDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sRUFBUCxFQUFXLE1BQVgsQ0FBcEIsQ0FBQTtJQUNBLEtBQUssQ0FBQyxTQUFOLEdBQWtCLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxFQUFQLEVBQVcsSUFBWCxDQUFsQixDQUFBO0lBQ0EsS0FBSyxDQUFDLEtBQU4sR0FBYyxLQUFkLENBQUE7SUFDQSxLQUFLLENBQUMsVUFBTixHQUFtQixVQUFuQixDQUFBO0lBRUEsSUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQU4sR0FBb0I7TUFDdEMsR0FBRyxFQUFLLGFBQWEsQ0FBQyxHQUFkLElBQXlCLGFBQWEsQ0FBQyxJQUFkLElBQXdCLENBQUMsYUFBYSxDQUFDLE1BRGxDO01BRXRDLElBQUksRUFBSSxhQUFhLENBQUMsSUFBZCxJQUF5QixhQUFhLENBQUMsR0FBZCxJQUF3QixDQUFDLGFBQWEsQ0FBQyxLQUZsQztNQUd0QyxNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQWQsSUFBeUIsYUFBYSxDQUFDLEtBQWQsSUFBd0IsQ0FBQyxhQUFhLENBQUMsR0FIbEM7TUFJdEMsS0FBSyxFQUFHLGFBQWEsQ0FBQyxLQUFkLElBQXlCLGFBQWEsQ0FBQyxNQUFkLElBQXdCLENBQUMsYUFBYSxDQUFDLElBQUE7S0FKMUUsQ0FBQTtJQU9BLEtBQUssQ0FBQyxjQUFOLEdBQXVCLENBQUMsRUFBRSxhQUFhLENBQUMsSUFBZCxJQUFzQixhQUFhLENBQUMsS0FBdEMsQ0FBeEIsQ0FBQTs7SUFFQSxJQUFJLEtBQUssQ0FBQyxVQUFWLEVBQXNCO01BQ3BCLEtBQUssQ0FBQyxRQUFOLEdBQWlCLENBQUMsV0FBVyxDQUFDLElBQVosR0FBbUIsQ0FBbkIsR0FBdUIsQ0FBQyxDQUF6QixLQUErQixXQUFXLENBQUMsR0FBWixHQUFrQixDQUFsQixHQUFzQixDQUFDLENBQXRELENBQWpCLENBQUE7S0FERixNQUdLO01BQ0gsSUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsY0FBTixHQUF1QixXQUFXLENBQUMsR0FBbkMsR0FBeUMsV0FBVyxDQUFDLElBQW5GLENBQUE7TUFDQSxLQUFLLENBQUMsUUFBTixHQUFpQixxQkFBcUIsR0FBRyxDQUFDLENBQUosR0FBUSxDQUE5QyxDQUFBO0tBQ0Q7O0lBRUQsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLEdBQUcsQ0FBQyxLQUFYLEVBQWtCLFdBQWxCLENBQUEsQ0FBQTs7SUFFQSxJQUFJLENBQUMsU0FBRCxJQUFjLENBQUMsU0FBUyxDQUFDLE1BQTdCLEVBQXFDO01BQUUsT0FBQTtLQUFROztJQUUvQyxJQUFNLGVBQWUsR0FBRyxJQUFJLGtCQUFBLENBQUEsU0FBQSxDQUFKLENBQWlCLEdBQUcsQ0FBQyxXQUFyQixDQUF4QixDQUFBO0lBRUEsZUFBZSxDQUFDLFFBQWhCLENBQXlCLEdBQUcsQ0FBQyxXQUFKLENBQWdCLFlBQXpDLENBQUEsQ0FBQTtJQUNBLGVBQWUsQ0FBQyxhQUFoQixDQUE4QixTQUE5QixDQUFBLENBQUE7SUFFQSxLQUFLLENBQUMsZUFBTixHQUF3QixlQUF4QixDQUFBO0lBQ0EsZUFBZSxDQUFDLFFBQWhCLENBQUEsYUFBQSxDQUFBLEVBQUEsRUFBOEIsR0FBOUIsQ0FBQSxDQUFBLENBQUE7R0ExQ3NFO0VBNkN4RSxHQTdDd0UsRUFBQSxTQUFBLEdBQUEsQ0E2Q25FLEdBN0NtRSxFQTZDOUQ7SUFBQSxJQUNBLEtBREEsR0FDd0IsR0FEeEIsQ0FDQSxLQURBO1FBQ08sSUFEUCxHQUN3QixHQUR4QixDQUNPLElBRFA7UUFDYSxNQURiLEdBQ3dCLEdBRHhCLENBQ2EsTUFEYixDQUFBO0lBRVIsSUFBTSxhQUFhLEdBQUcsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLEVBQVAsRUFBVyxNQUFYLENBQXRCLENBQUE7SUFDQSxJQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBTixHQUFtQixhQUFuQixHQUFtQyxRQUF4RCxDQUFBO0lBRUEsWUFBWSxDQUFDLEtBQUQsRUFBUSxLQUFLLENBQUMsY0FBZCxFQUE4QixNQUE5QixFQUFzQyxJQUF0QyxDQUFaLENBQUE7O0lBRUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFYLEVBQTRCO01BQUUsT0FBTyxJQUFQLENBQUE7S0FBYTs7SUFFM0MsSUFBTSxhQUFhLEdBQUcsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLEVBQVAsRUFBVyxJQUFYLENBQXRCLENBQUE7SUFFQSxDQUFBLENBQUEsRUFBQSxTQUFBLENBQUEsUUFBQSxFQUFTLEtBQUssQ0FBQyxXQUFmLEVBQTRCLGFBQTVCLEVBQTJDO01BQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFQLEdBQVcsYUFBYSxDQUFDLENBQTlCO01BQWlDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBUCxHQUFXLGFBQWEsQ0FBQyxDQUFBO0tBQXhHLENBQUEsQ0FBQTtJQUVBLElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxlQUFOLENBQXNCLE1BQXRCLENBQUEsYUFBQSxDQUFBLEVBQUEsRUFDVixHQURVLEVBQUE7TUFFYixJQUFJLEVBQUUsYUFGTztNQUdiLEtBQUssRUFBRSxLQUFLLENBQUMsV0FIQTtNQUliLFVBQVUsRUFBRSxNQUpDO01BS2IsVUFBVSxFQUFFLE1BTEM7TUFNYixRQUFRLEVBQUUsYUFBQTtLQU5HLENBQUEsQ0FBZixDQUFBO0lBYlEsSUFzQkEsS0F0QkEsR0FzQlUsTUF0QlYsQ0FzQkEsS0F0QkEsQ0FBQTs7SUF3QlIsSUFBSSxNQUFNLENBQUMsT0FBWCxFQUFvQjtNQUNsQixJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBTCxDQUFTLEtBQUssQ0FBQyxDQUFmLENBQUEsR0FBb0IsSUFBSSxDQUFDLEdBQUwsQ0FBUyxLQUFLLENBQUMsQ0FBZixDQUE1QyxDQURrQjs7TUFJbEIsWUFBWSxDQUFDLEtBQUQsRUFBUSxlQUFSLEVBQXlCLE1BQU0sQ0FBQyxNQUFoQyxFQUF3QyxNQUFNLENBQUMsSUFBL0MsQ0FBWixDQUFBO01BQ0EsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLE1BQVAsRUFBZSxNQUFNLENBQUMsTUFBdEIsQ0FBQSxDQUFBO0tBQ0Q7O0lBRUQsT0FBTyxNQUFNLENBQUMsVUFBZCxDQUFBO0dBN0VzRTtFQWdGeEUsUUFBUSxFQUFFO0lBQ1IsS0FBSyxFQUFFLFVBREM7SUFFUixVQUFVLEVBQUUsS0FGSjtJQUdSLFNBQVMsRUFBRSxFQUhIO0lBSVIsT0FBTyxFQUFFLEtBQUE7R0FKRDtDQWhGWixDQUFBOzs7QUF3RkEsU0FBUyxhQUFULENBQUEsSUFBQSxFQUFxRSxjQUFyRSxFQUE4RixNQUE5RixFQUFzSDtFQUFBLElBQTVGLFdBQTRGLEdBQUEsSUFBQSxDQUE1RixXQUE0RjtNQUEvRSxRQUErRSxHQUFBLElBQUEsQ0FBL0UsUUFBK0UsQ0FBQTs7RUFDcEgsSUFBSSxjQUFKLEVBQW9CO0lBQ2xCLE1BQU0sQ0FBQyxDQUFQLEdBQVcsV0FBVyxDQUFDLENBQVosR0FBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBUCxHQUFXLFdBQVcsQ0FBQyxDQUF4QixJQUE2QixRQUF4RCxDQUFBO0dBREYsTUFHSztJQUNILE1BQU0sQ0FBQyxDQUFQLEdBQVcsV0FBVyxDQUFDLENBQVosR0FBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBUCxHQUFXLFdBQVcsQ0FBQyxDQUF4QixJQUE2QixRQUF4RCxDQUFBO0dBQ0Q7Q0FDRjs7QUFFRCxTQUFTLFFBQVQsQ0FBQSxLQUFBLEVBQWtGLGNBQWxGLEVBQTJHLE1BQTNHLEVBQW1JLElBQW5JLEVBQXdKO0VBQUEsSUFBbkksU0FBbUksR0FBQSxLQUFBLENBQW5JLFNBQW1JO01BQXhILFdBQXdILEdBQUEsS0FBQSxDQUF4SCxXQUF3SDtNQUEzRyxLQUEyRyxHQUFBLEtBQUEsQ0FBM0csS0FBMkc7TUFBcEcsUUFBb0csR0FBQSxLQUFBLENBQXBHLFFBQW9HLENBQUE7O0VBQ3RKLElBQUksY0FBSixFQUFvQjtJQUNsQixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBTCxHQUFhLEtBQS9CLENBQUE7SUFFQSxNQUFNLENBQUMsQ0FBUCxHQUFXLFdBQVcsQ0FBQyxDQUFaLEdBQWdCLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUF2QixJQUFpQyxRQUE1RCxDQUFBO0dBSEYsTUFLSztJQUNILElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFMLEdBQWMsS0FBL0IsQ0FBQTtJQUVBLE1BQU0sQ0FBQyxDQUFQLEdBQVcsV0FBVyxDQUFDLENBQVosR0FBZ0IsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQXRCLElBQStCLFFBQTFELENBQUE7R0FDRDtDQUNGOztvQkFFYyxDQUFBLENBQUEsRUFBQSxTQUFBLENBQUEsWUFBQSxFQUFhLFdBQWIsRUFBMEIsYUFBMUI7Ozs7Ozs7Ozs7Ozs7OztBQ3pKZixJQUFBLFlBQUEsR0FBQSwyQkFBQSxDQUFBLFdBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsT0FBQSxHQUFBLDRCQUFBLENBQUEsT0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxjQUFBLEdBQUEsNEJBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBQTs7QUFDQSxtREFBQTs7Ozs7Ozs7QUFpQkEsU0FBUyxVQUFULENBQUEsSUFBQSxFQUFtRztFQUFBLElBQWpGLElBQWlGLEdBQUEsSUFBQSxDQUFqRixJQUFpRjtNQUEzRSxXQUEyRSxHQUFBLElBQUEsQ0FBM0UsV0FBMkU7TUFBOUQsS0FBOEQsR0FBQSxJQUFBLENBQTlELEtBQThEO01BQXZELFdBQXVELEdBQUEsSUFBQSxDQUF2RCxXQUF1RDtNQUExQyxVQUEwQyxHQUFBLElBQUEsQ0FBMUMsVUFBMEMsQ0FBQTtFQUFBLElBQ3pGLE9BRHlGLEdBQzdFLEtBRDZFLENBQ3pGLE9BRHlGLENBQUE7RUFBQSxJQUV6RixXQUZ5RixHQUV6RSxPQUZ5RSxDQUV6RixXQUZ5RixDQUFBO0VBR2pHLElBQU0sTUFBcUIsR0FBRyxDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU87SUFDbkMsSUFBSSxFQUFFLENBRDZCO0lBRW5DLEdBQUcsRUFBRSxDQUY4QjtJQUduQyxLQUFLLEVBQUUsQ0FINEI7SUFJbkMsTUFBTSxFQUFFLENBQUE7R0FKb0IsRUFLM0IsT0FBTyxDQUFDLE1BQVIsSUFBa0IsRUFMUyxDQUE5QixDQUFBOztFQU9BLElBQUksSUFBSSxJQUFJLFdBQVosRUFBeUI7SUFDdkIsSUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFdBQVQsRUFBc0IsV0FBdEIsRUFBbUMsVUFBbkMsQ0FBdEMsQ0FBQTs7SUFFQSxJQUFJLFdBQUosRUFBaUI7TUFDZixJQUFNLFNBQVMsR0FBSSxXQUFXLENBQUMsS0FBWixHQUFvQixXQUFXLENBQUMsSUFBakMsR0FBeUMsSUFBSSxDQUFDLEtBQWhFLENBQUE7TUFDQSxJQUFNLFVBQVUsR0FBSSxXQUFXLENBQUMsTUFBWixHQUFxQixXQUFXLENBQUMsR0FBbEMsR0FBeUMsSUFBSSxDQUFDLE1BQWpFLENBQUE7O01BRUEsSUFBSSxTQUFTLEdBQUcsQ0FBaEIsRUFBbUI7UUFDakIsTUFBTSxDQUFDLElBQVAsSUFBZSxTQUFmLENBQUE7UUFDQSxNQUFNLENBQUMsS0FBUCxJQUFnQixTQUFoQixDQUFBO09BQ0Q7O01BQ0QsSUFBSSxVQUFVLEdBQUcsQ0FBakIsRUFBb0I7UUFDbEIsTUFBTSxDQUFDLEdBQVAsSUFBYyxVQUFkLENBQUE7UUFDQSxNQUFNLENBQUMsTUFBUCxJQUFpQixVQUFqQixDQUFBO09BQ0Q7S0FDRjs7SUFFRCxNQUFNLENBQUMsSUFBUCxJQUFlLFdBQVcsQ0FBQyxJQUFaLEdBQW9CLElBQUksQ0FBQyxLQUFMLEdBQWMsV0FBVyxDQUFDLElBQTdELENBQUE7SUFDQSxNQUFNLENBQUMsR0FBUCxJQUFlLFdBQVcsQ0FBQyxHQUFaLEdBQW9CLElBQUksQ0FBQyxNQUFMLEdBQWMsV0FBVyxDQUFDLEdBQTdELENBQUE7SUFFQSxNQUFNLENBQUMsS0FBUCxJQUFpQixXQUFXLENBQUMsS0FBWixHQUFzQixJQUFJLENBQUMsS0FBTCxJQUFlLENBQUEsR0FBSSxXQUFXLENBQUMsS0FBL0IsQ0FBdkMsQ0FBQTtJQUNBLE1BQU0sQ0FBQyxNQUFQLElBQWlCLFdBQVcsQ0FBQyxNQUFaLEdBQXNCLElBQUksQ0FBQyxNQUFMLElBQWUsQ0FBQSxHQUFJLFdBQVcsQ0FBQyxNQUEvQixDQUF2QyxDQUFBO0dBQ0Q7O0VBRUQsS0FBSyxDQUFDLE1BQU4sR0FBZSxNQUFmLENBQUE7Q0FDRDs7QUFFRCxTQUFTLEdBQVQsQ0FBQSxLQUFBLEVBQTBFO0VBQUEsSUFBMUQsTUFBMEQsR0FBQSxLQUFBLENBQTFELE1BQTBEO01BQWxELFdBQWtELEdBQUEsS0FBQSxDQUFsRCxXQUFrRDtNQUFyQyxLQUFxQyxHQUFBLEtBQUEsQ0FBckMsS0FBcUMsQ0FBQTtFQUFBLElBQ2hFLE9BRGdFLEdBQzVDLEtBRDRDLENBQ2hFLE9BRGdFO01BQ3ZELE1BRHVELEdBQzVDLEtBRDRDLENBQ3ZELE1BRHVELENBQUE7RUFHeEUsSUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFdBQVQsRUFBc0IsV0FBdEIsRUFBbUMsTUFBbkMsQ0FBdEMsQ0FBQTs7RUFFQSxJQUFJLENBQUMsV0FBTCxFQUFrQjtJQUFFLE9BQUE7R0FBUTs7RUFFNUIsSUFBTSxJQUFJLEdBQUcsY0FBUyxDQUFDLFVBQVYsQ0FBcUIsV0FBckIsQ0FBYixDQUFBO0VBRUEsTUFBTSxDQUFDLENBQVAsR0FBVyxJQUFJLENBQUMsR0FBTCxDQUFTLElBQUksQ0FBQyxHQUFMLENBQVMsSUFBSSxDQUFDLEtBQUwsR0FBYyxNQUFNLENBQUMsS0FBOUIsRUFBcUMsTUFBTSxDQUFDLENBQTVDLENBQVQsRUFBeUQsSUFBSSxDQUFDLElBQUwsR0FBWSxNQUFNLENBQUMsSUFBNUUsQ0FBWCxDQUFBO0VBQ0EsTUFBTSxDQUFDLENBQVAsR0FBVyxJQUFJLENBQUMsR0FBTCxDQUFTLElBQUksQ0FBQyxHQUFMLENBQVMsSUFBSSxDQUFDLE1BQUwsR0FBYyxNQUFNLENBQUMsTUFBOUIsRUFBc0MsTUFBTSxDQUFDLENBQTdDLENBQVQsRUFBMEQsSUFBSSxDQUFDLEdBQUwsR0FBWSxNQUFNLENBQUMsR0FBN0UsQ0FBWCxDQUFBO0NBQ0Q7O0FBRU0sU0FBUyxrQkFBVCxDQUNMLEtBREssRUFFTCxXQUZLLEVBR0wsTUFISyxFQUlMO0VBQ0EsSUFBSSxPQUFFLENBQUMsSUFBSCxDQUFRLEtBQVIsQ0FBSixFQUFvQjtJQUNsQixPQUFPLGNBQVMsQ0FBQyxlQUFWLENBQTBCLEtBQTFCLEVBQWlDLFdBQVcsQ0FBQyxZQUE3QyxFQUEyRCxXQUFXLENBQUMsT0FBdkUsRUFBZ0YsQ0FBQyxNQUFNLENBQUMsQ0FBUixFQUFXLE1BQU0sQ0FBQyxDQUFsQixFQUFxQixXQUFyQixDQUFoRixDQUFQLENBQUE7R0FERixNQUVPO0lBQ0wsT0FBTyxjQUFTLENBQUMsZUFBVixDQUEwQixLQUExQixFQUFpQyxXQUFXLENBQUMsWUFBN0MsRUFBMkQsV0FBVyxDQUFDLE9BQXZFLENBQVAsQ0FBQTtHQUNEO0NBQ0Y7O0FBRUQsSUFBTSxhQUF5QixHQUFHO0VBQ2hDLFdBQVcsRUFBRSxJQURtQjtFQUVoQyxXQUFXLEVBQUUsSUFGbUI7RUFHaEMsTUFBTSxFQUFFLElBSHdCO0VBSWhDLE9BQU8sRUFBRSxLQUp1QjtFQUtoQyxPQUFPLEVBQUUsS0FBQTtDQUxYLENBQUE7QUFRQSxJQUFNLFFBQXdELEdBQUc7RUFDL0QsS0FBSyxFQUFMLFVBRCtEO0VBRS9ELEdBQUcsRUFBSCxHQUYrRDtFQUcvRCxRQUFRLEVBQVIsYUFBQTtDQUhGLENBQUE7OztvQkFNZSxDQUFBLENBQUEsRUFBQSxTQUFBLENBQUEsWUFBQSxFQUFhLFFBQWIsRUFBdUIsVUFBdkI7Ozs7Ozs7Ozs7Ozs7O0FDckZmLElBQUEsWUFBQSxHQUFBLDJCQUFBLENBQUEsV0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxjQUFBLEdBQUEsNEJBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBQTs7QUFDQSxtREFBQTs7QUFDQSx3REFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLElBQU0sT0FBTyxHQUFHO0VBQUUsR0FBRyxFQUFFLENBQUMsUUFBUjtFQUFrQixJQUFJLEVBQUUsQ0FBQyxRQUF6QjtFQUFtQyxNQUFNLEVBQUUsQ0FBQyxRQUE1QztFQUFzRCxLQUFLLEVBQUUsQ0FBQyxRQUFBO0NBQTlFLENBQUE7QUFDQSxJQUFNLE9BQU8sR0FBRztFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVI7RUFBa0IsSUFBSSxFQUFFLENBQUMsUUFBekI7RUFBbUMsTUFBTSxFQUFFLENBQUMsUUFBNUM7RUFBc0QsS0FBSyxFQUFFLENBQUMsUUFBQTtDQUE5RSxDQUFBOztBQUVBLFNBQVMsVUFBVCxDQUFBLElBQUEsRUFBc0Y7RUFBQSxJQUFwRSxXQUFvRSxHQUFBLElBQUEsQ0FBcEUsV0FBb0U7TUFBdkQsV0FBdUQsR0FBQSxJQUFBLENBQXZELFdBQXVEO01BQTFDLEtBQTBDLEdBQUEsSUFBQSxDQUExQyxLQUEwQyxDQUFBO0VBQUEsSUFDNUUsT0FENEUsR0FDaEUsS0FEZ0UsQ0FDNUUsT0FENEUsQ0FBQTtFQUVwRixJQUFJLE1BQUosQ0FBQTs7RUFFQSxJQUFJLE9BQUosRUFBYTtJQUNYLElBQU0sVUFBVSxHQUFHLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxrQkFBQSxFQUFtQixPQUFPLENBQUMsTUFBM0IsRUFBbUMsV0FBbkMsRUFBZ0QsV0FBVyxDQUFDLE1BQVosQ0FBbUIsS0FBbkIsQ0FBeUIsSUFBekUsQ0FBbkIsQ0FBQTtJQUVBLE1BQU0sR0FBRyxjQUFTLENBQUMsUUFBVixDQUFtQixVQUFuQixDQUFULENBQUE7R0FDRDs7RUFFRCxNQUFNLEdBQUcsTUFBTSxJQUFJO0lBQUUsQ0FBQyxFQUFFLENBQUw7SUFBUSxDQUFDLEVBQUUsQ0FBQTtHQUE5QixDQUFBO0VBRUEsS0FBSyxDQUFDLE1BQU4sR0FBZTtJQUNiLEdBQUcsRUFBSyxNQUFNLENBQUMsQ0FBUCxHQUFXLFdBQVcsQ0FBQyxHQURsQjtJQUViLElBQUksRUFBSSxNQUFNLENBQUMsQ0FBUCxHQUFXLFdBQVcsQ0FBQyxJQUZsQjtJQUdiLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBUCxHQUFXLFdBQVcsQ0FBQyxNQUhsQjtJQUliLEtBQUssRUFBRyxNQUFNLENBQUMsQ0FBUCxHQUFXLFdBQVcsQ0FBQyxLQUFBO0dBSmpDLENBQUE7Q0FNRDs7QUFFRCxTQUFTLFFBQVQsQ0FBQSxLQUFBLEVBQXNGO0VBQUEsSUFBdEUsTUFBc0UsR0FBQSxLQUFBLENBQXRFLE1BQXNFO01BQTlELEtBQThELEdBQUEsS0FBQSxDQUE5RCxLQUE4RDtNQUF2RCxXQUF1RCxHQUFBLEtBQUEsQ0FBdkQsV0FBdUQ7TUFBMUMsS0FBMEMsR0FBQSxLQUFBLENBQTFDLEtBQTBDLENBQUE7RUFBQSxJQUM1RSxNQUQ0RSxHQUN4RCxLQUR3RCxDQUM1RSxNQUQ0RTtNQUNwRSxPQURvRSxHQUN4RCxLQUR3RCxDQUNwRSxPQURvRSxDQUFBOztFQUdwRixJQUFJLENBQUMsS0FBTCxFQUFZO0lBQ1YsT0FBQTtHQUNEOztFQUVELElBQU0sSUFBSSxHQUFHLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxFQUFQLEVBQVcsTUFBWCxDQUFiLENBQUE7RUFDQSxJQUFNLEtBQUssR0FBRyxDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsa0JBQUEsRUFBbUIsT0FBTyxDQUFDLEtBQTNCLEVBQWtDLFdBQWxDLEVBQStDLElBQS9DLENBQUEsSUFBd0QsRUFBdEUsQ0FBQTtFQUNBLElBQU0sS0FBSyxHQUFHLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxrQkFBQSxFQUFtQixPQUFPLENBQUMsS0FBM0IsRUFBa0MsV0FBbEMsRUFBK0MsSUFBL0MsQ0FBQSxJQUF3RCxFQUF0RSxDQUFBO0VBRUEsT0FBTyxDQUFDLEtBQUQsRUFBUSxPQUFSLENBQVAsQ0FBQTtFQUNBLE9BQU8sQ0FBQyxLQUFELEVBQVEsT0FBUixDQUFQLENBQUE7O0VBRUEsSUFBSSxLQUFLLENBQUMsR0FBVixFQUFlO0lBQ2IsTUFBTSxDQUFDLENBQVAsR0FBVyxJQUFJLENBQUMsR0FBTCxDQUFTLElBQUksQ0FBQyxHQUFMLENBQVMsS0FBSyxDQUFDLEdBQU4sR0FBZSxNQUFNLENBQUMsR0FBL0IsRUFBdUMsSUFBSSxDQUFDLENBQTVDLENBQVQsRUFBeUQsS0FBSyxDQUFDLEdBQU4sR0FBZSxNQUFNLENBQUMsR0FBL0UsQ0FBWCxDQUFBO0dBREYsTUFHSyxJQUFJLEtBQUssQ0FBQyxNQUFWLEVBQWtCO0lBQ3JCLE1BQU0sQ0FBQyxDQUFQLEdBQVcsSUFBSSxDQUFDLEdBQUwsQ0FBUyxJQUFJLENBQUMsR0FBTCxDQUFTLEtBQUssQ0FBQyxNQUFOLEdBQWUsTUFBTSxDQUFDLE1BQS9CLEVBQXVDLElBQUksQ0FBQyxDQUE1QyxDQUFULEVBQXlELEtBQUssQ0FBQyxNQUFOLEdBQWUsTUFBTSxDQUFDLE1BQS9FLENBQVgsQ0FBQTtHQUNEOztFQUNELElBQUksS0FBSyxDQUFDLElBQVYsRUFBZ0I7SUFDZCxNQUFNLENBQUMsQ0FBUCxHQUFXLElBQUksQ0FBQyxHQUFMLENBQVMsSUFBSSxDQUFDLEdBQUwsQ0FBUyxLQUFLLENBQUMsSUFBTixHQUFlLE1BQU0sQ0FBQyxJQUEvQixFQUF1QyxJQUFJLENBQUMsQ0FBNUMsQ0FBVCxFQUF5RCxLQUFLLENBQUMsSUFBTixHQUFlLE1BQU0sQ0FBQyxJQUEvRSxDQUFYLENBQUE7R0FERixNQUdLLElBQUksS0FBSyxDQUFDLEtBQVYsRUFBaUI7SUFDcEIsTUFBTSxDQUFDLENBQVAsR0FBVyxJQUFJLENBQUMsR0FBTCxDQUFTLElBQUksQ0FBQyxHQUFMLENBQVMsS0FBSyxDQUFDLEtBQU4sR0FBZSxNQUFNLENBQUMsS0FBL0IsRUFBdUMsSUFBSSxDQUFDLENBQTVDLENBQVQsRUFBeUQsS0FBSyxDQUFDLEtBQU4sR0FBZSxNQUFNLENBQUMsS0FBL0UsQ0FBWCxDQUFBO0dBQ0Q7Q0FDRjs7QUFFRCxTQUFTLE9BQVQsQ0FBa0IsSUFBbEIsRUFBd0IsUUFBeEIsRUFBa0M7RUFBQSxJQUFBLElBQUEsR0FDYixDQUFDLEtBQUQsRUFBUSxNQUFSLEVBQWdCLFFBQWhCLEVBQTBCLE9BQTFCLENBRGEsQ0FBQTs7RUFDaEMsS0FBQSxJQUFBLEVBQUEsR0FBQSxDQUFBLEVBQUEsRUFBQSxHQUFBLElBQUEsQ0FBQSxNQUFBLEVBQUEsRUFBQSxFQUFBLEVBQXVEO0lBQWxELElBQU0sSUFBSSxHQUFBLElBQUEsQ0FBQSxFQUFBLENBQVYsQ0FBQTs7SUFDSCxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQVYsQ0FBSixFQUFxQjtNQUNuQixJQUFJLENBQUMsSUFBRCxDQUFKLEdBQWEsUUFBUSxDQUFDLElBQUQsQ0FBckIsQ0FBQTtLQUNEO0dBQ0Y7O0VBRUQsT0FBTyxJQUFQLENBQUE7Q0FDRDs7QUFFRCxJQUFNLGFBQThCLEdBQUc7RUFDckMsS0FBSyxFQUFFLElBRDhCO0VBRXJDLEtBQUssRUFBRSxJQUY4QjtFQUdyQyxNQUFNLEVBQUUsSUFINkI7RUFJckMsT0FBTyxFQUFFLEtBSjRCO0VBS3JDLE9BQU8sRUFBRSxLQUFBO0NBTFgsQ0FBQTtBQVFBLElBQU0sYUFBYSxHQUFHO0VBQ3BCLE9BQU8sRUFBUCxPQURvQjtFQUVwQixPQUFPLEVBQVAsT0FGb0I7RUFHcEIsS0FBSyxFQUFMLFVBSG9CO0VBSXBCLEdBQUcsRUFBSCxRQUpvQjtFQUtwQixRQUFRLEVBQVIsYUFBQTtDQUxGLENBQUE7OztvQkFRZSxDQUFBLENBQUEsRUFBQSxTQUFBLENBQUEsWUFBQSxFQUFhLGFBQWIsRUFBNEIsZUFBNUI7Ozs7Ozs7Ozs7OztBQzNHZixJQUFBLFlBQUEsR0FBQSwyQkFBQSxDQUFBLFdBQUEsQ0FBQSxDQUFBOztBQUNBLHdEQUFBOztBQUNBLG1EQUFBOzs7O0FBRUEsSUFBTSxhQUFRLEdBQUcsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPO0VBQ3RCLElBQUksV0FBSixHQUFtQjtJQUNqQixPQUFPO01BQUUsR0FBRyxFQUFFLENBQVA7TUFBVSxJQUFJLEVBQUUsQ0FBaEI7TUFBbUIsTUFBTSxFQUFFLENBQTNCO01BQThCLEtBQUssRUFBRSxDQUFBO0tBQTVDLENBQUE7R0FGb0I7O0VBSXRCLElBQUksV0FBSixDQUFpQixDQUFqQixFQUFvQixFQUFFOztDQUpQLEVBS2QsWUFBQSxDQUFBLFFBQUEsQ0FBUyxRQUxLLENBQWpCLENBQUE7QUFPQSxJQUFNLFlBQVksR0FBRztFQUNuQixLQUFLLEVBQUUsWUFBQSxDQUFBLFFBQUEsQ0FBUyxLQURHO0VBRW5CLEdBQUcsRUFBRSxZQUFBLENBQUEsUUFBQSxDQUFTLEdBRks7RUFHbkIsUUFBUSxFQUFSLGFBQUE7Q0FIRixDQUFBOzs7b0JBTWUsQ0FBQSxDQUFBLEVBQUEsU0FBQSxDQUFBLFlBQUEsRUFBYSxZQUFiLEVBQTJCLGNBQTNCOzs7Ozs7Ozs7Ozs7OztBQ2pCZixJQUFBLFlBQUEsR0FBQSwyQkFBQSxDQUFBLFdBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsY0FBQSxHQUFBLDRCQUFBLENBQUEsU0FBQSxDQUFBLENBQUE7O0FBQ0EsbURBQUE7O0FBQ0Esb0RBQUE7O0FBQ0Esd0RBQUE7Ozs7Ozs7O0FBRUEsSUFBTSxLQUFLLEdBQUc7RUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFWO0VBQW9CLE1BQU0sRUFBRSxDQUFDLFFBQUE7Q0FBM0MsQ0FBQTtBQUNBLElBQU0sS0FBSyxHQUFHO0VBQUUsS0FBSyxFQUFFLENBQUMsUUFBVjtFQUFvQixNQUFNLEVBQUUsQ0FBQyxRQUFBO0NBQTNDLENBQUE7O0FBU0EsU0FBUyxVQUFULENBQWdCLEdBQWhCLEVBQXNEO0VBQ3BELE9BQU8sVUFBQSxDQUFBLGFBQUEsQ0FBYyxLQUFkLENBQW9CLEdBQXBCLENBQVAsQ0FBQTtDQUNEOztBQVFELFNBQVMsUUFBVCxDQUFjLEdBQWQsRUFBbUQ7RUFBQSxJQUN6QyxXQUR5QyxHQUNMLEdBREssQ0FDekMsV0FEeUM7TUFDNUIsS0FENEIsR0FDTCxHQURLLENBQzVCLEtBRDRCO01BQ3JCLElBRHFCLEdBQ0wsR0FESyxDQUNyQixJQURxQjtNQUNmLEtBRGUsR0FDTCxHQURLLENBQ2YsS0FEZSxDQUFBO0VBQUEsSUFFekMsT0FGeUMsR0FFN0IsS0FGNkIsQ0FFekMsT0FGeUMsQ0FBQTs7RUFJakQsSUFBSSxDQUFDLEtBQUwsRUFBWTtJQUNWLE9BQUE7R0FDRDs7RUFFRCxJQUFNLE9BQU8sR0FBRyxjQUFTLENBQUMsVUFBVixDQUFxQixDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsa0JBQUEsRUFBbUIsT0FBTyxDQUFDLEdBQTNCLEVBQXVDLFdBQXZDLEVBQW9ELEdBQUcsQ0FBQyxNQUF4RCxDQUFyQixDQUFBLElBQXlGLEtBQXpHLENBQUE7RUFDQSxJQUFNLE9BQU8sR0FBRyxjQUFTLENBQUMsVUFBVixDQUFxQixDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsa0JBQUEsRUFBbUIsT0FBTyxDQUFDLEdBQTNCLEVBQXVDLFdBQXZDLEVBQW9ELEdBQUcsQ0FBQyxNQUF4RCxDQUFyQixDQUFBLElBQXlGLEtBQXpHLENBQUE7RUFFQSxLQUFLLENBQUMsT0FBTixHQUFnQjtJQUNkLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FESDtJQUVkLEtBQUssRUFBRSxDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sRUFBUCxFQUFXLFVBQUEsQ0FBQSxhQUFBLENBQWMsT0FBekIsQ0FGTztJQUdkLEtBQUssRUFBRSxDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sRUFBUCxFQUFXLFVBQUEsQ0FBQSxhQUFBLENBQWMsT0FBekIsQ0FBQTtHQUhULENBQUE7O0VBTUEsSUFBSSxLQUFLLENBQUMsR0FBVixFQUFlO0lBQ2IsS0FBSyxDQUFDLE9BQU4sQ0FBYyxLQUFkLENBQW9CLEdBQXBCLEdBQTBCLElBQUksQ0FBQyxNQUFMLEdBQWMsT0FBTyxDQUFDLE1BQWhELENBQUE7SUFDQSxLQUFLLENBQUMsT0FBTixDQUFjLEtBQWQsQ0FBb0IsR0FBcEIsR0FBMEIsSUFBSSxDQUFDLE1BQUwsR0FBYyxPQUFPLENBQUMsTUFBaEQsQ0FBQTtHQUZGLE1BSUssSUFBSSxLQUFLLENBQUMsTUFBVixFQUFrQjtJQUNyQixLQUFLLENBQUMsT0FBTixDQUFjLEtBQWQsQ0FBb0IsTUFBcEIsR0FBNkIsSUFBSSxDQUFDLEdBQUwsR0FBVyxPQUFPLENBQUMsTUFBaEQsQ0FBQTtJQUNBLEtBQUssQ0FBQyxPQUFOLENBQWMsS0FBZCxDQUFvQixNQUFwQixHQUE2QixJQUFJLENBQUMsR0FBTCxHQUFXLE9BQU8sQ0FBQyxNQUFoRCxDQUFBO0dBQ0Q7O0VBQ0QsSUFBSSxLQUFLLENBQUMsSUFBVixFQUFnQjtJQUNkLEtBQUssQ0FBQyxPQUFOLENBQWMsS0FBZCxDQUFvQixJQUFwQixHQUEyQixJQUFJLENBQUMsS0FBTCxHQUFhLE9BQU8sQ0FBQyxLQUFoRCxDQUFBO0lBQ0EsS0FBSyxDQUFDLE9BQU4sQ0FBYyxLQUFkLENBQW9CLElBQXBCLEdBQTJCLElBQUksQ0FBQyxLQUFMLEdBQWEsT0FBTyxDQUFDLEtBQWhELENBQUE7R0FGRixNQUlLLElBQUksS0FBSyxDQUFDLEtBQVYsRUFBaUI7SUFDcEIsS0FBSyxDQUFDLE9BQU4sQ0FBYyxLQUFkLENBQW9CLEtBQXBCLEdBQTRCLElBQUksQ0FBQyxJQUFMLEdBQVksT0FBTyxDQUFDLEtBQWhELENBQUE7SUFDQSxLQUFLLENBQUMsT0FBTixDQUFjLEtBQWQsQ0FBb0IsS0FBcEIsR0FBNEIsSUFBSSxDQUFDLElBQUwsR0FBWSxPQUFPLENBQUMsS0FBaEQsQ0FBQTtHQUNEOztFQUVELFVBQUEsQ0FBQSxhQUFBLENBQWMsR0FBZCxDQUFrQixHQUFsQixDQUFBLENBQUE7O0VBRUEsS0FBSyxDQUFDLE9BQU4sR0FBZ0IsT0FBaEIsQ0FBQTtDQUNEOztBQUVELElBQU0sYUFBNkIsR0FBRztFQUNwQyxHQUFHLEVBQUUsSUFEK0I7RUFFcEMsR0FBRyxFQUFFLElBRitCO0VBR3BDLE9BQU8sRUFBRSxLQUgyQjtFQUlwQyxPQUFPLEVBQUUsS0FBQTtDQUpYLENBQUE7QUFPQSxJQUFNLFlBQVksR0FBRztFQUNuQixLQUFLLEVBQUwsVUFEbUI7RUFFbkIsR0FBRyxFQUFILFFBRm1CO0VBR25CLFFBQVEsRUFBUixhQUFBO0NBSEYsQ0FBQTs7O29CQU1lLENBQUEsQ0FBQSxFQUFBLFNBQUEsQ0FBQSxZQUFBLEVBQWEsWUFBYixFQUEyQixjQUEzQjs7Ozs7Ozs7Ozs7Ozs7QUM5RWYsSUFBQSxVQUFBLEdBQUEsNEJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7QUFDQSxtREFBQTs7Ozs7O0FBNkNBLFNBQVMsVUFBVCxDQUFnQixHQUFoQixFQUE2QztFQUFBLElBQ25DLFdBRG1DLEdBQzhCLEdBRDlCLENBQ25DLFdBRG1DO01BQ3RCLFlBRHNCLEdBQzhCLEdBRDlCLENBQ3RCLFlBRHNCO01BQ1IsT0FEUSxHQUM4QixHQUQ5QixDQUNSLE9BRFE7TUFDQyxJQURELEdBQzhCLEdBRDlCLENBQ0MsSUFERDtNQUNPLEtBRFAsR0FDOEIsR0FEOUIsQ0FDTyxLQURQO01BQ2MsV0FEZCxHQUM4QixHQUQ5QixDQUNjLFdBRGQsQ0FBQTtFQUFBLElBRW5DLE9BRm1DLEdBRXZCLEtBRnVCLENBRW5DLE9BRm1DLENBQUE7RUFHM0MsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGdCQUFSLEdBQ1gsU0FBUyxDQUFDLEdBQUQsQ0FERSxHQUVYO0lBQUUsQ0FBQyxFQUFFLENBQUw7SUFBUSxDQUFDLEVBQUUsQ0FBQTtHQUZmLENBQUE7RUFJQSxJQUFJLFVBQUosQ0FBQTs7RUFFQSxJQUFJLE9BQU8sQ0FBQyxNQUFSLEtBQW1CLGFBQXZCLEVBQXNDO0lBQ3BDLFVBQVUsR0FBRztNQUNYLENBQUMsRUFBRSxXQUFXLENBQUMsTUFBWixDQUFtQixLQUFuQixDQUF5QixJQUF6QixDQUE4QixDQUR0QjtNQUVYLENBQUMsRUFBRSxXQUFXLENBQUMsTUFBWixDQUFtQixLQUFuQixDQUF5QixJQUF6QixDQUE4QixDQUFBO0tBRm5DLENBQUE7R0FERixNQU1NO0lBQ0osSUFBTSxVQUFVLEdBQUcsVUFBSyxDQUFDLElBQU4sQ0FBVyxlQUFYLENBQTJCLE9BQU8sQ0FBQyxNQUFuQyxFQUFrRCxZQUFsRCxFQUFnRSxPQUFoRSxFQUF5RSxDQUFDLFdBQUQsQ0FBekUsQ0FBbkIsQ0FBQTtJQUVBLFVBQVUsR0FBRyxVQUFLLENBQUMsSUFBTixDQUFXLFFBQVgsQ0FBb0IsVUFBcEIsQ0FBQSxJQUFtQztNQUFFLENBQUMsRUFBRSxDQUFMO01BQVEsQ0FBQyxFQUFFLENBQUE7S0FBM0QsQ0FBQTtJQUNBLFVBQVUsQ0FBQyxDQUFYLElBQWdCLE1BQU0sQ0FBQyxDQUF2QixDQUFBO0lBQ0EsVUFBVSxDQUFDLENBQVgsSUFBZ0IsTUFBTSxDQUFDLENBQXZCLENBQUE7R0FDRDs7RUFyQjBDLElBdUJuQyxjQXZCbUMsR0F1QmhCLE9BdkJnQixDQXVCbkMsY0F2Qm1DLENBQUE7RUF5QjNDLEtBQUssQ0FBQyxPQUFOLEdBQWdCLElBQUksSUFBSSxjQUFSLElBQTBCLGNBQWMsQ0FBQyxNQUF6QyxHQUNYLGNBQWMsQ0FBQyxHQUFmLENBQW1CLFVBQUMsYUFBRCxFQUFnQixLQUFoQixFQUFBO0lBQUEsT0FBMkI7TUFDL0MsS0FBSyxFQUFMLEtBRCtDO01BRS9DLGFBQWEsRUFBYixhQUYrQztNQUcvQyxDQUFDLEVBQUUsV0FBVyxDQUFDLElBQVosR0FBb0IsSUFBSSxDQUFDLEtBQUwsR0FBYyxhQUFhLENBQUMsQ0FBaEQsR0FBcUQsVUFBVSxDQUFDLENBSHBCO01BSS9DLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBWixHQUFvQixJQUFJLENBQUMsTUFBTCxHQUFjLGFBQWEsQ0FBQyxDQUFoRCxHQUFxRCxVQUFVLENBQUMsQ0FBQTtLQUovQyxDQUFBO0dBQW5CLENBRFcsR0FPWixDQUFDLFVBQUssQ0FBQyxNQUFOLENBQWE7SUFDZCxLQUFLLEVBQUUsQ0FETztJQUVkLGFBQWEsRUFBRSxJQUFBO0dBRmQsRUFHQSxVQUhBLENBQUQsQ0FQSixDQUFBO0NBV0Q7O0FBRUQsU0FBUyxRQUFULENBQWMsR0FBZCxFQUEyQztFQUFBLElBQ2pDLFdBRGlDLEdBQ0YsR0FERSxDQUNqQyxXQURpQztNQUNwQixNQURvQixHQUNGLEdBREUsQ0FDcEIsTUFEb0I7TUFDWixLQURZLEdBQ0YsR0FERSxDQUNaLEtBRFksQ0FBQTtFQUFBLElBRWpDLE9BRmlDLEdBRVosS0FGWSxDQUVqQyxPQUZpQztNQUV4QixPQUZ3QixHQUVaLEtBRlksQ0FFeEIsT0FGd0IsQ0FBQTtFQUl6QyxJQUFNLE1BQU0sR0FBRyxVQUFLLENBQUMsV0FBTixDQUFrQixXQUFXLENBQUMsWUFBOUIsRUFBNEMsV0FBVyxDQUFDLE9BQXhELEVBQWlFLFdBQVcsQ0FBQyxRQUFaLENBQXFCLElBQXRGLENBQWYsQ0FBQTtFQUNBLElBQU0sSUFBSSxHQUFHLFVBQUssQ0FBQyxNQUFOLENBQWEsRUFBYixFQUFpQixNQUFqQixDQUFiLENBQUE7RUFDQSxJQUFNLE9BQU8sR0FBRyxFQUFoQixDQUFBOztFQUVBLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWIsRUFBK0I7SUFDN0IsSUFBSSxDQUFDLENBQUwsSUFBVSxNQUFNLENBQUMsQ0FBakIsQ0FBQTtJQUNBLElBQUksQ0FBQyxDQUFMLElBQVUsTUFBTSxDQUFDLENBQWpCLENBQUE7R0FDRDs7RUFFRCxLQUFBLElBQUEsRUFBQSxHQUFBLENBQUEsRUFBQSxFQUFBLEdBQXFCLE9BQXJCLENBQUEsTUFBQSxFQUFBLEVBQUEsRUFBQSxFQUE4QjtJQUFBLElBQUEsSUFBQSxDQUFBOztJQUFBLElBQUEsR0FBVCxPQUFTLENBQUEsRUFBQSxDQUFBLENBQUE7SUFBQSxJQUFuQixPQUFtQixHQUFBLElBQUEsQ0FBQTtJQUM1QixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBTCxHQUFTLE9BQU0sQ0FBQyxDQUFsQyxDQUFBO0lBQ0EsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUwsR0FBUyxPQUFNLENBQUMsQ0FBbEMsQ0FBQTs7SUFFQSxLQUFLLElBQUksTUFBSyxHQUFHLENBQVosRUFBZSxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQVIsQ0FBZ0IsTUFBMUMsRUFBa0QsTUFBSyxHQUFHLEdBQTFELEVBQStELE1BQUssRUFBcEUsRUFBd0U7TUFDdEUsSUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQVIsQ0FBZ0IsTUFBaEIsQ0FBbkIsQ0FBQTtNQUNBLElBQUksTUFBTSxHQUFBLEtBQUEsQ0FBVixDQUFBOztNQUVBLElBQUksVUFBSyxDQUFDLEVBQU4sQ0FBUyxJQUFULENBQWMsVUFBZCxDQUFKLEVBQStCO1FBQzdCLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBRCxFQUFZLFNBQVosRUFBdUIsV0FBdkIsRUFBb0MsT0FBcEMsRUFBNEMsTUFBNUMsQ0FBbkIsQ0FBQTtPQURGLE1BR0s7UUFDSCxNQUFNLEdBQUcsVUFBVCxDQUFBO09BQ0Q7O01BRUQsSUFBSSxDQUFDLE1BQUwsRUFBYTtRQUFFLFNBQUE7T0FBVTs7TUFFekIsT0FBTyxDQUFDLElBQVIsQ0FBYTtRQUNYLENBQUMsRUFBRSxDQUFDLFVBQUssQ0FBQyxFQUFOLENBQVMsTUFBVCxDQUFnQixNQUFNLENBQUMsQ0FBdkIsQ0FBQSxHQUE0QixNQUFNLENBQUMsQ0FBbkMsR0FBdUMsU0FBeEMsSUFBcUQsT0FBTSxDQUFDLENBRHBEO1FBRVgsQ0FBQyxFQUFFLENBQUMsVUFBSyxDQUFDLEVBQU4sQ0FBUyxNQUFULENBQWdCLE1BQU0sQ0FBQyxDQUF2QixDQUFBLEdBQTRCLE1BQU0sQ0FBQyxDQUFuQyxHQUF1QyxTQUF4QyxJQUFxRCxPQUFNLENBQUMsQ0FGcEQ7UUFJWCxLQUFLLEVBQUUsVUFBSyxDQUFDLEVBQU4sQ0FBUyxNQUFULENBQWdCLE1BQU0sQ0FBQyxLQUF2QixDQUFBLEdBQWdDLE1BQU0sQ0FBQyxLQUF2QyxHQUErQyxPQUFPLENBQUMsS0FKbkQ7UUFLWCxNQUFNLEVBQUUsVUFMRztRQU1YLEtBQUssRUFBTCxNQU5XO1FBT1gsTUFBTSxFQUFOLE9BQUE7T0FQRixDQUFBLENBQUE7S0FTRDtHQUNGOztFQUVELElBQU0sT0FBTyxHQUFHO0lBQ2QsTUFBTSxFQUFFLElBRE07SUFFZCxPQUFPLEVBQUUsS0FGSztJQUdkLFFBQVEsRUFBRSxDQUhJO0lBSWQsS0FBSyxFQUFFLENBSk87SUFLZCxLQUFLLEVBQUU7TUFBRSxDQUFDLEVBQUUsQ0FBTDtNQUFRLENBQUMsRUFBRSxDQUFBO0tBQVg7R0FMVCxDQUFBOztFQVFBLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBcUIsT0FBckIsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQThCO0lBQXpCLElBQU0sT0FBTSxHQUFJLE9BQUosQ0FBQSxHQUFBLENBQVosQ0FBQTtJQUNILElBQU0sS0FBSyxHQUFHLE9BQU0sQ0FBQyxLQUFyQixDQUFBO0lBQ0EsSUFBTSxFQUFFLEdBQUcsT0FBTSxDQUFDLENBQVAsR0FBVyxJQUFJLENBQUMsQ0FBM0IsQ0FBQTtJQUNBLElBQU0sRUFBRSxHQUFHLE9BQU0sQ0FBQyxDQUFQLEdBQVcsSUFBSSxDQUFDLENBQTNCLENBQUE7SUFDQSxJQUFNLFFBQVEsR0FBRyxVQUFLLENBQUMsS0FBTixDQUFZLEVBQVosRUFBZ0IsRUFBaEIsQ0FBakIsQ0FBQTtJQUNBLElBQUksT0FBTyxHQUFHLFFBQVEsSUFBSSxLQUExQixDQUw0Qjs7O0lBUzVCLElBQUksS0FBSyxLQUFLLFFBQVYsSUFBc0IsT0FBTyxDQUFDLE9BQTlCLElBQXlDLE9BQU8sQ0FBQyxLQUFSLEtBQWtCLFFBQS9ELEVBQXlFO01BQ3ZFLE9BQU8sR0FBRyxLQUFWLENBQUE7S0FDRDs7SUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQVQsS0FBb0IsT0FBTztNQUUxQixPQUFPLENBQUMsT0FBUixJQUFtQixLQUFLLEtBQUssUUFBN0I7TUFFQyxRQUFRLEdBQUcsS0FBWCxHQUFtQixPQUFPLENBQUMsUUFBUixHQUFtQixPQUFPLENBQUMsS0FGL0M7TUFJRSxLQUFLLEtBQUssUUFBVixJQUFzQixPQUFPLENBQUMsS0FBUixLQUFrQixRQUF6QztJQUVBLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFSTTtJQVUxQixDQUFDLE9BQU8sQ0FBQyxPQUFULElBQW9CLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFWeEMsQ0FBSixFQVV3RDtNQUN0RCxPQUFPLENBQUMsTUFBUixHQUFpQixPQUFqQixDQUFBO01BQ0EsT0FBTyxDQUFDLFFBQVIsR0FBbUIsUUFBbkIsQ0FBQTtNQUNBLE9BQU8sQ0FBQyxLQUFSLEdBQWdCLEtBQWhCLENBQUE7TUFDQSxPQUFPLENBQUMsT0FBUixHQUFrQixPQUFsQixDQUFBO01BQ0EsT0FBTyxDQUFDLEtBQVIsQ0FBYyxDQUFkLEdBQWtCLEVBQWxCLENBQUE7TUFDQSxPQUFPLENBQUMsS0FBUixDQUFjLENBQWQsR0FBa0IsRUFBbEIsQ0FBQTtLQUNEO0dBQ0Y7O0VBRUQsSUFBSSxPQUFPLENBQUMsT0FBWixFQUFxQjtJQUNuQixNQUFNLENBQUMsQ0FBUCxHQUFXLE9BQU8sQ0FBQyxNQUFSLENBQWUsQ0FBMUIsQ0FBQTtJQUNBLE1BQU0sQ0FBQyxDQUFQLEdBQVcsT0FBTyxDQUFDLE1BQVIsQ0FBZSxDQUExQixDQUFBO0dBQ0Q7O0VBRUQsS0FBSyxDQUFDLE9BQU4sR0FBZ0IsT0FBaEIsQ0FBQTtFQUNBLE9BQU8sT0FBUCxDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxTQUFULENBQW9CLEdBQXBCLEVBQTBEO0VBQUEsSUFDaEQsT0FEZ0QsR0FDcEMsR0FBRyxDQUFDLFdBRGdDLENBQ2hELE9BRGdELENBQUE7RUFFeEQsSUFBTSxhQUFhLEdBQUcsVUFBSyxDQUFDLElBQU4sQ0FBVyxRQUFYLENBQ3BCLFVBQUssQ0FBQyxJQUFOLENBQVcsZUFBWCxDQUEyQixHQUFHLENBQUMsS0FBSixDQUFVLE9BQVYsQ0FBa0IsTUFBN0MsRUFBNEQsSUFBNUQsRUFBa0UsSUFBbEUsRUFBd0UsQ0FBQyxPQUFELENBQXhFLENBRG9CLENBQXRCLENBQUE7RUFHQSxJQUFNLE1BQU0sR0FBRyxhQUFhLElBQUksVUFBSyxDQUFDLFdBQU4sQ0FDOUIsR0FBRyxDQUFDLFlBRDBCLEVBRTlCLE9BRjhCLEVBRzlCLEdBQUcsQ0FBQyxXQUFKLENBQWdCLFFBQWhCLENBQXlCLElBSEssQ0FBaEMsQ0FBQTtFQU1BLE9BQU8sTUFBUCxDQUFBO0NBQ0Q7O0FBRUQsSUFBTSxhQUFxQixHQUFHO0VBQzVCLEtBQUssRUFBSSxRQURtQjtFQUU1QixPQUFPLEVBQUUsSUFGbUI7RUFHNUIsTUFBTSxFQUFFLElBSG9CO0VBSTVCLGdCQUFnQixFQUFFLElBSlU7RUFLNUIsTUFBTSxFQUFFLElBTG9CO0VBTTVCLGNBQWMsRUFBRSxJQU5ZO0VBTzVCLE9BQU8sRUFBRSxLQVBtQjtFQVE1QixPQUFPLEVBQUUsS0FBQTtDQVJYLENBQUE7QUFVQSxJQUFNLElBQUksR0FBRztFQUNYLEtBQUssRUFBTCxVQURXO0VBRVgsR0FBRyxFQUFILFFBRlc7RUFHWCxRQUFRLEVBQVIsYUFBQTtDQUhGLENBQUE7OztvQkFNZSxDQUFBLENBQUEsRUFBQSxTQUFBLENBQUEsWUFBQSxFQUFhLElBQWIsRUFBbUIsTUFBbkI7Ozs7Ozs7Ozs7Ozs7O0FDM01mLElBQUEsWUFBQSxHQUFBLDJCQUFBLENBQUEsV0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxPQUFBLEdBQUEsNEJBQUEsQ0FBQSxPQUFBLENBQUEsQ0FBQTs7QUFDQSxtREFBQTs7QUFDQSx3REFBQTs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLFNBQVMsVUFBVCxDQUFnQixHQUFoQixFQUE2QztFQUFBLElBQ25DLEtBRG1DLEdBQ2xCLEdBRGtCLENBQ25DLEtBRG1DO01BQzVCLEtBRDRCLEdBQ2xCLEdBRGtCLENBQzVCLEtBRDRCLENBQUE7RUFBQSxJQUVuQyxPQUZtQyxHQUV2QixLQUZ1QixDQUVuQyxPQUZtQyxDQUFBOztFQUkzQyxJQUFJLENBQUMsS0FBTCxFQUFZO0lBQUUsT0FBTyxJQUFQLENBQUE7R0FBYTs7RUFFM0IsR0FBRyxDQUFDLEtBQUosR0FBWTtJQUNWLE9BQU8sRUFBRTtNQUNQLE9BQU8sRUFBRSxJQURGO01BRVAsY0FBYyxFQUFFLENBQUM7UUFDZixDQUFDLEVBQUUsS0FBSyxDQUFDLElBQU4sR0FBYSxDQUFiLEdBQWlCLENBREw7UUFFZixDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQU4sR0FBWSxDQUFaLEdBQWdCLENBQUE7T0FGTCxDQUZUO01BTVAsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFSLElBQWtCLE1BTm5CO01BT1AsTUFBTSxFQUFFO1FBQUUsQ0FBQyxFQUFFLENBQUw7UUFBUSxDQUFDLEVBQUUsQ0FBQTtPQVBaO01BUVAsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFBO0tBUlI7R0FEWCxDQUFBO0VBYUEsS0FBSyxDQUFDLFlBQU4sR0FBcUIsS0FBSyxDQUFDLFlBQU4sSUFBc0IsQ0FDekMsQ0FBQyxPQUFELEVBQVUsUUFBVixDQUR5QyxFQUV6QyxDQUFDLEdBQUQsRUFBTSxHQUFOLENBRnlDLENBQTNDLENBQUE7O0VBS0EsWUFBQSxDQUFBLElBQUEsQ0FBSyxLQUFMLENBQVcsR0FBWCxDQUFBLENBQUE7O0VBQ0EsS0FBSyxDQUFDLE9BQU4sR0FBZ0IsR0FBRyxDQUFDLEtBQUosQ0FBVSxPQUExQixDQUFBO0VBRUEsR0FBRyxDQUFDLEtBQUosR0FBWSxLQUFaLENBQUE7Q0FDRDs7QUFFRCxTQUFTLFFBQVQsQ0FBYyxHQUFkLEVBQW1CO0VBQUEsSUFDVCxXQURTLEdBQ3NCLEdBRHRCLENBQ1QsV0FEUztNQUNJLEtBREosR0FDc0IsR0FEdEIsQ0FDSSxLQURKO01BQ1csTUFEWCxHQUNzQixHQUR0QixDQUNXLE1BRFgsQ0FBQTtFQUFBLElBRVQsT0FGUyxHQUVZLEtBRlosQ0FFVCxPQUZTO01BRUEsT0FGQSxHQUVZLEtBRlosQ0FFQSxPQUZBLENBQUE7RUFHakIsSUFBTSxRQUFRLEdBQUc7SUFDZixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQVAsR0FBVyxPQUFPLENBQUMsQ0FBRCxDQUFQLENBQVcsQ0FEVjtJQUVmLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBUCxHQUFXLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBVyxDQUFBO0dBRjNCLENBQUE7RUFLQSxLQUFLLENBQUMsT0FBTixHQUFnQixDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sRUFBUCxFQUFXLE9BQVgsQ0FBaEIsQ0FBQTtFQUNBLEtBQUssQ0FBQyxPQUFOLENBQWMsT0FBZCxHQUF3QixFQUF4QixDQUFBOztFQUVBLEtBQUEsSUFBQSxFQUFBLEdBQUEsQ0FBQSxFQUFBLEVBQUEsR0FBQSxDQUEwQixPQUFPLENBQUMsT0FBUixJQUFtQixFQUE3QyxFQUFBLE1BQUEsRUFBQSxFQUFBLEVBQUEsRUFBa0Q7SUFBQSxJQUFBLElBQUEsQ0FBQTs7SUFBQSxJQUFBLEdBQUEsQ0FBeEIsT0FBTyxDQUFDLE9BQVIsSUFBbUIsRUFBSyxFQUFBLEVBQUEsQ0FBQSxDQUFBO0lBQUEsSUFBdkMsVUFBdUMsR0FBQSxJQUFBLENBQUE7SUFDaEQsSUFBSSxNQUFNLEdBQUEsS0FBQSxDQUFWLENBQUE7O0lBRUEsSUFBSSxPQUFFLENBQUMsSUFBSCxDQUFRLFVBQVIsQ0FBSixFQUF5QjtNQUN2QixNQUFNLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFWLEVBQWEsUUFBUSxDQUFDLENBQXRCLEVBQXlCLFdBQXpCLENBQW5CLENBQUE7S0FERixNQUdLO01BQ0gsTUFBTSxHQUFHLFVBQVQsQ0FBQTtLQUNEOztJQUVELElBQUksQ0FBQyxNQUFMLEVBQWE7TUFBRSxTQUFBO0tBQVU7O0lBRXpCLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBK0IsS0FBSyxDQUFDLFlBQXJDLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFtRDtNQUFBLElBQUEsS0FBQSxDQUFBOztNQUFBLEtBQUEsR0FBcEIsS0FBSyxDQUFDLFlBQWMsQ0FBQSxHQUFBLENBQUEsQ0FBQTs7TUFBQSxJQUFBLEtBQUEsR0FBQSxLQUFBO1VBQUEsS0FBQSxHQUFBLG1CQUFBLENBQUEsS0FBQSxFQUFBLENBQUEsQ0FBQTtVQUF2QyxNQUF1QyxHQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7VUFBL0IsTUFBK0IsR0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBLENBQUE7O01BQ2pELElBQUksTUFBTSxJQUFJLE1BQVYsSUFBb0IsTUFBTSxJQUFJLE1BQWxDLEVBQTBDO1FBQ3hDLE1BQU0sQ0FBQyxDQUFQLEdBQVcsTUFBTSxDQUFDLE1BQUQsQ0FBakIsQ0FBQTtRQUNBLE1BQU0sQ0FBQyxDQUFQLEdBQVcsTUFBTSxDQUFDLE1BQUQsQ0FBakIsQ0FBQTtRQUVBLE1BQUE7T0FDRDtLQUNGOztJQUVELEtBQUssQ0FBQyxPQUFOLENBQWMsT0FBZCxDQUFzQixJQUF0QixDQUEyQixNQUEzQixDQUFBLENBQUE7R0FDRDs7RUFFRCxJQUFNLFdBQVcsR0FBRyxZQUFBLENBQUEsSUFBQSxDQUFLLEdBQUwsQ0FBUyxHQUFULENBQXBCLENBQUE7O0VBRUEsS0FBSyxDQUFDLE9BQU4sR0FBZ0IsT0FBaEIsQ0FBQTtFQUVBLE9BQU8sV0FBUCxDQUFBO0NBQ0Q7O0FBRUQsSUFBTSxhQUF5QixHQUFHO0VBQ2hDLEtBQUssRUFBRSxRQUR5QjtFQUVoQyxPQUFPLEVBQUUsSUFGdUI7RUFHaEMsTUFBTSxFQUFFLElBSHdCO0VBSWhDLE9BQU8sRUFBRSxLQUp1QjtFQUtoQyxPQUFPLEVBQUUsS0FBQTtDQUxYLENBQUE7QUFRQSxJQUFNLFFBQVEsR0FBRztFQUNmLEtBQUssRUFBTCxVQURlO0VBRWYsR0FBRyxFQUFILFFBRmU7RUFHZixRQUFRLEVBQVIsYUFBQTtDQUhGLENBQUE7OztvQkFNZSxDQUFBLENBQUEsRUFBQSxTQUFBLENBQUEsWUFBQSxFQUFhLFFBQWIsRUFBdUIsVUFBdkI7Ozs7Ozs7Ozs7OztBQ3ZFZixJQUFBLFdBQUEsR0FBQSwyQkFBQSxDQUFBLFVBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsWUFBQSxHQUFBLDJCQUFBLENBQUEsV0FBQSxDQUFBLENBQUE7O0FBQ0EsbURBQUE7O0FBRUEsa0RBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQSxTQUFTLFVBQVQsQ0FBZ0IsR0FBaEIsRUFBNkM7RUFBQSxJQUNuQyxLQURtQyxHQUN6QixHQUR5QixDQUNuQyxLQURtQyxDQUFBOztFQUczQyxJQUFJLENBQUMsS0FBTCxFQUFZO0lBQUUsT0FBTyxJQUFQLENBQUE7R0FBYTs7RUFFM0IsR0FBRyxDQUFDLEtBQUosQ0FBVSxZQUFWLEdBQXlCLEdBQUcsQ0FBQyxLQUFKLENBQVUsWUFBVixJQUEwQixDQUNqRCxDQUFDLEtBQUssQ0FBQyxJQUFOLEdBQWEsTUFBYixHQUFzQixPQUF2QixFQUFnQyxLQUFLLENBQUMsR0FBTixHQUFZLEtBQVosR0FBb0IsUUFBcEQsQ0FEaUQsQ0FBbkQsQ0FBQTtFQUlBLE9BQU8sU0FBQSxDQUFBLFFBQUEsQ0FBUyxLQUFULENBQWUsR0FBZixDQUFQLENBQUE7Q0FDRDs7QUFFRCxJQUFNLFNBQXNELEdBQUc7RUFDN0QsS0FBSyxFQUFMLFVBRDZEO0VBRTdELEdBQUcsRUFBRSxTQUFBLENBQUEsUUFBQSxDQUFTLEdBRitDO0VBRzdELFFBQVEsRUFBRSxDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQ1IsQ0FBQSxDQUFBLEVBQUEsV0FBQSxDQUFBLFNBQUEsQ0FBQSxFQUFNLFNBQUEsQ0FBQSxRQUFBLENBQVMsUUFBZixDQURRLEVBRVI7SUFDRSxPQUFPLEVBQUUsSUFEWDtJQUVFLEtBQUssRUFBRSxJQUZUO0lBR0UsTUFBTSxFQUFFO01BQUUsQ0FBQyxFQUFFLENBQUw7TUFBUSxDQUFDLEVBQUUsQ0FBQTtLQUFYO0dBTEYsQ0FBQTtDQUhaLENBQUE7OztvQkFhZSxDQUFBLENBQUEsRUFBQSxTQUFBLENBQUEsWUFBQSxFQUFhLFNBQWIsRUFBd0IsV0FBeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0RmLElBQUEsWUFBQSxHQUFBLDJCQUFBLENBQUEsZ0JBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsV0FBQSxHQUFBLDJCQUFBLENBQUEsVUFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxhQUFBLEdBQUEsMkJBQUEsQ0FBQSxZQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLFVBQUEsR0FBQSwyQkFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsVUFBQSxHQUFBLDJCQUFBLENBQUEsU0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxPQUFBLEdBQUEsMkJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLFNBQUEsR0FBQSwyQkFBQSxDQUFBLFlBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsTUFBQSxHQUFBLDJCQUFBLENBQUEsU0FBQSxDQUFBLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUEEsU0FBUyxVQUFULENBQXFCLElBQXJCLEVBQTRJO0VBQzFJLElBQU0sV0FBVyxHQUFJLENBQ25CLENBQUMsR0FBRCxFQUFNLEdBQU4sQ0FEbUIsRUFFbkIsQ0FBQyxNQUFELEVBQVMsS0FBVCxDQUZtQixFQUduQixDQUFDLE9BQUQsRUFBVSxRQUFWLENBSG1CLEVBSW5CLENBQUMsT0FBRCxFQUFVLFFBQVYsQ0FKbUIsQ0FBRCxDQUtSLE1BTFEsQ0FLRCxVQUFBLElBQUEsRUFBQTtJQUFBLElBQUEsS0FBQSxHQUFBLG1CQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsQ0FBQTtRQUFFLE1BQUYsR0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBO1FBQVUsTUFBVixHQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxPQUFzQixNQUFNLElBQUksSUFBVixJQUFrQixNQUFNLElBQUksSUFBbEQsQ0FBQTtHQUxDLENBQXBCLENBQUE7O0VBT0EsSUFBTSxRQUdMLEdBQUcsU0FIRSxRQUdGLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBVTtJQUFBLElBRVYsS0FGVSxHQVVSLElBVlEsQ0FFVixLQUZVO1FBQUEsWUFBQSxHQVVSLElBVlEsQ0FHVixNQUhVO1FBR1YsTUFIVSxHQUFBLFlBQUEsS0FBQSxLQUFBLENBQUEsR0FHRDtNQUNQLElBQUksRUFBSSxDQUFDLFFBREY7TUFFUCxLQUFLLEVBQUksUUFGRjtNQUdQLEdBQUcsRUFBSyxDQUFDLFFBSEY7TUFJUCxNQUFNLEVBQUcsUUFBQTtLQVBELEdBQUEsWUFBQTtRQUFBLFlBQUEsR0FVUixJQVZRLENBU1YsTUFUVTtRQVNWLE1BVFUsR0FBQSxZQUFBLEtBQUEsS0FBQSxDQUFBLEdBU0Q7TUFBRSxDQUFDLEVBQUUsQ0FBTDtNQUFRLENBQUMsRUFBRSxDQUFBO0tBVFYsR0FBQSxZQUFBLENBQUE7SUFZWixJQUFNLE1BRUwsR0FBRztNQUFFLEtBQUssRUFBTCxLQUFGO01BQVMsSUFBSSxFQUFKLElBQVQ7TUFBZSxDQUFDLEVBQUUsSUFBbEI7TUFBa0MsQ0FBQyxFQUFFLElBQUE7S0FGekMsQ0FBQTs7SUFJQSxLQUFBLElBQUEsR0FBQSxHQUFBLENBQUEsRUFBQSxHQUFBLEdBQStCLFdBQS9CLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxFQUE0QztNQUFBLElBQUEsS0FBQSxDQUFBOztNQUFBLEtBQUEsR0FBYixXQUFhLENBQUEsR0FBQSxDQUFBLENBQUE7O01BQUEsSUFBQSxLQUFBLEdBQUEsS0FBQTtVQUFBLEtBQUEsR0FBQSxtQkFBQSxDQUFBLEtBQUEsRUFBQSxDQUFBLENBQUE7VUFBaEMsTUFBZ0MsR0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBO1VBQXhCLE1BQXdCLEdBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBOztNQUMxQyxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBTCxDQUFXLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFaLElBQWtCLElBQUQsQ0FBYyxNQUFkLENBQTVCLENBQWQsQ0FBQTtNQUNBLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFMLENBQVcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQVosSUFBa0IsSUFBRCxDQUFjLE1BQWQsQ0FBNUIsQ0FBZCxDQUFBO01BRUEsTUFBTSxDQUFDLE1BQUQsQ0FBTixHQUFpQixJQUFJLENBQUMsR0FBTCxDQUFTLE1BQU0sQ0FBQyxJQUFoQixFQUFzQixJQUFJLENBQUMsR0FBTCxDQUFTLE1BQU0sQ0FBQyxLQUFoQixFQUF1QixLQUFLLEdBQUksSUFBRCxDQUFjLE1BQWQsQ0FBUixHQUFnQyxNQUFNLENBQUMsQ0FBOUQsQ0FBdEIsQ0FBakIsQ0FBQTtNQUNBLE1BQU0sQ0FBQyxNQUFELENBQU4sR0FBaUIsSUFBSSxDQUFDLEdBQUwsQ0FBUyxNQUFNLENBQUMsR0FBaEIsRUFBcUIsSUFBSSxDQUFDLEdBQUwsQ0FBUyxNQUFNLENBQUMsTUFBaEIsRUFBd0IsS0FBSyxHQUFJLElBQUQsQ0FBYyxNQUFkLENBQVIsR0FBZ0MsTUFBTSxDQUFDLENBQS9ELENBQXJCLENBQWpCLENBQUE7S0FDRDs7SUFFRCxPQUFPLE1BQVAsQ0FBQTtHQTNCRixDQUFBOztFQThCQSxRQUFRLENBQUMsSUFBVCxHQUFnQixJQUFoQixDQUFBO0VBQ0EsUUFBUSxDQUFDLFdBQVQsR0FBdUIsV0FBdkIsQ0FBQTtFQUVBLE9BQU8sUUFBUCxDQUFBO0NBQ0Q7O29CQUVjOzs7Ozs7Ozs7Ozs7Ozs7O0FDNUNmLElBQUEsS0FBQSxHQUFBLDJCQUFBLENBQUEsU0FBQSxDQUFBLENBQUE7Ozs7Ozs7Ozs7Ozs7O0FDQUEsSUFBQSxVQUFBLEdBQUEsMkJBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBQTs7QUFFQSxJQUFBLEdBQUEsR0FBQSw0QkFBQSxDQUFBLFFBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsWUFBQSxHQUFBLDJCQUFBLENBQUEsV0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxRQUFBLEdBQUEsNEJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7Ozs7Ozs7QUFVQSxJQUFNLGNBQTBCLEdBQUc7RUFDakMsRUFBRSxFQUFFLFdBRDZCO0VBRWpDLE9BRmlDLEVBQUEsU0FBQSxPQUFBLENBRXhCLEtBRndCLEVBRWpCO0lBQUEsSUFDTixRQURNLEdBQ08sS0FEUCxDQUNOLFFBRE0sQ0FBQTtJQUdkLEtBQUssQ0FBQyxTQUFOLENBQWdCLFVBQUEsQ0FBQSxTQUFBLENBQWhCLENBQUEsQ0FBQTtJQUVBLFFBQVEsQ0FBQyxTQUFULEdBQXFCLENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxRQUFRLENBQUMsU0FBVCxJQUFzQixFQUE3QixFQUFpQyxHQUFqQyxDQUFyQixDQUFBO0lBQ0EsUUFBUSxDQUFDLFFBQVQsR0FBb0IsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFPLFFBQVEsQ0FBQyxRQUFULElBQXFCLEVBQTVCLEVBQWdDLFFBQWhDLENBQXBCLENBQUE7SUFDQSxRQUFRLENBQUMsY0FBVCxHQUEwQixRQUFRLENBQUMsUUFBVCxDQUFrQixJQUE1QyxDQVBjOztJQVVkLEtBQUssSUFBTSxJQUFYLElBQW1CLEdBQW5CLEVBQXdCO01BQUEsSUFBQSxJQUFBLEdBQ1UsR0FBRyxDQUFDLElBQUQsQ0FEYjtVQUNkLFNBRGMsR0FBQSxJQUFBLENBQ2QsU0FEYztVQUNILFFBREcsR0FBQSxJQUFBLENBQ0gsUUFERyxDQUFBO01BR3BCLFNBQUQsQ0FBbUIsUUFBbkIsR0FBOEIsUUFBOUIsQ0FBQTtNQUNDLEtBQUssQ0FBQyxRQUFOLENBQWUsU0FBaEIsQ0FBa0MsSUFBbEMsQ0FBQSxHQUEwQyxTQUExQyxDQUFBO0tBQ0Y7R0FDRjtDQWxCSCxDQUFBO29CQXFCZTs7Ozs7Ozs7Ozs7QUNuQ2YsSUFBQSxnQkFBQSxHQUFBLDJCQUFBLENBQUEsY0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxpQkFBQSxHQUFBLDRCQUFBLENBQUEsaUJBQUEsQ0FBQSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRXFCOzs7O0VBZW5CLFNBQUEsWUFBQSxDQUNFLElBREYsRUFFRSxPQUZGLEVBR0UsS0FIRixFQUlFLFdBSkYsRUFLRSxXQUxGLEVBTUUsU0FORixFQU9FO0lBQUEsSUFBQSxLQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxJQUFBLEVBQUEsWUFBQSxDQUFBLENBQUE7O0lBQ0EsS0FBQSxHQUFBLCtCQUFBLENBQUEsSUFBQSxFQUFBLG9CQUFBLENBQUEsWUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBTSxXQUFOLENBQUEsQ0FBQSxDQUFBOztJQURBLG9CQUFBLENBQUEsMkJBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLDJCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsZUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSwyQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFdBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsMkJBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxhQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLDJCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSwyQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLE9BQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsMkJBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxPQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLDJCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsU0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSwyQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsMkJBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxJQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLDJCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsV0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBRUEsaUJBQVksQ0FBQyxhQUFiLENBQUEsMkJBQUEsQ0FBQSxLQUFBLENBQUEsRUFBaUMsS0FBakMsQ0FBQSxDQUFBOztJQUVBLElBQUksS0FBSyxLQUFLLE9BQWQsRUFBdUI7TUFDckIsaUJBQVksQ0FBQyxhQUFiLENBQUEsMkJBQUEsQ0FBQSxLQUFBLENBQUEsRUFBaUMsT0FBakMsQ0FBQSxDQUFBO0tBQ0Q7O0lBRUQsS0FBQSxDQUFLLFNBQUwsR0FBcUIsU0FBckIsQ0FBQTtJQUNBLEtBQUEsQ0FBSyxhQUFMLEdBQXFCLEtBQXJCLENBQUE7SUFDQSxLQUFBLENBQUssSUFBTCxHQUFxQixJQUFyQixDQUFBO0lBQ0EsS0FBQSxDQUFLLFNBQUwsR0FBcUIsaUJBQVksQ0FBQyxZQUFiLENBQTBCLE9BQTFCLENBQXJCLENBQUE7SUFDQSxLQUFBLENBQUssV0FBTCxHQUFxQixpQkFBWSxDQUFDLGNBQWIsQ0FBNEIsT0FBNUIsQ0FBckIsQ0FBQTtJQUNBLEtBQUEsQ0FBSyxNQUFMLEdBQXFCLFdBQXJCLENBQUE7SUFDQSxLQUFBLENBQUssYUFBTCxHQUFxQixJQUFyQixDQUFBOztJQUVBLElBQUksSUFBSSxLQUFLLEtBQWIsRUFBb0I7TUFDbEIsSUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLGVBQVosQ0FBNEIsT0FBNUIsQ0FBckIsQ0FBQTtNQUNBLEtBQUEsQ0FBSyxFQUFMLEdBQVUsS0FBQSxDQUFLLFNBQUwsR0FBaUIsV0FBVyxDQUFDLFFBQVosQ0FBcUIsWUFBckIsQ0FBQSxDQUFtQyxRQUE5RCxDQUFBO01BRUEsSUFBTSxRQUFRLEdBQUcsS0FBQSxDQUFLLFNBQUwsR0FBaUIsV0FBVyxDQUFDLE9BQTlDLENBQUE7TUFFQSxLQUFBLENBQUEsUUFBQSxDQUFBLEdBQWMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxPQUFaLElBQ2YsV0FBVyxDQUFDLE9BQVosQ0FBb0IsSUFBcEIsS0FBNkIsV0FEZCxJQUVmLFdBQVcsQ0FBQyxPQUFaLENBQW9CLE1BQXBCLEtBQStCLEtBQUEsQ0FBSyxNQUZyQixJQUdmLFFBQVEsR0FBRyxHQUhFLENBQWYsQ0FBQTtLQU5GLE1BV0ssSUFBSSxJQUFJLEtBQUssV0FBYixFQUEwQjtNQUM3QixLQUFBLENBQUssRUFBTCxHQUFXLE9BQUQsQ0FBaUMsU0FBakMsR0FBNkMsV0FBVyxDQUFDLE9BQW5FLENBQUE7S0FDRDs7SUE3QkQsT0FBQSxLQUFBLENBQUE7R0E4QkQ7Ozs7MENBRTREO01BQUEsSUFBdkMsT0FBdUMsR0FBQSxJQUFBLENBQTFDLENBQTBDO1VBQTNCLE9BQTJCLEdBQUEsSUFBQSxDQUE5QixDQUE4QixDQUFBO01BQzNELElBQUEsQ0FBSyxLQUFMLElBQWdCLE9BQWhCLENBQUE7TUFDQSxJQUFBLENBQUssS0FBTCxJQUFnQixPQUFoQixDQUFBO01BQ0EsSUFBQSxDQUFLLE9BQUwsSUFBZ0IsT0FBaEIsQ0FBQTtNQUNBLElBQUEsQ0FBSyxPQUFMLElBQWdCLE9BQWhCLENBQUE7TUFFQSxPQUFPLElBQVAsQ0FBQTtLQUNEOzs7c0NBRXVEO01BQUEsSUFBdkMsT0FBdUMsR0FBQSxLQUFBLENBQTFDLENBQTBDO1VBQTNCLE9BQTJCLEdBQUEsS0FBQSxDQUE5QixDQUE4QixDQUFBO01BQ3RELElBQUEsQ0FBSyxLQUFMLElBQWdCLE9BQWhCLENBQUE7TUFDQSxJQUFBLENBQUssS0FBTCxJQUFnQixPQUFoQixDQUFBO01BQ0EsSUFBQSxDQUFLLE9BQUwsSUFBZ0IsT0FBaEIsQ0FBQTtNQUNBLElBQUEsQ0FBSyxPQUFMLElBQWdCLE9BQWhCLENBQUE7TUFFQSxPQUFPLElBQVAsQ0FBQTtLQUNEOzs7Ozs7O3FDQUtpQjtNQUNoQixJQUFBLENBQUssYUFBTCxDQUFtQixjQUFuQixFQUFBLENBQUE7S0FDRDs7OztFQTdFK0QsZ0JBQUEsQ0FBQSxTQUFBOzs7Ozs7Ozs7Ozs7OztBQ0RsRSxJQUFBLGlCQUFBLEdBQUEsMkJBQUEsQ0FBQSxnQkFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxXQUFBLEdBQUEsY0FBQSxDQUFBOztBQUNBLElBQUEsVUFBQSxHQUFBLDRCQUFBLENBQUEsVUFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxhQUFBLEdBQUEsMkJBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUE7Ozs7Ozs7O0FBcUVBLElBQU0sYUFBNkIsR0FBRztFQUNwQyxZQUFZLEVBQUUsR0FEc0I7RUFFcEMsVUFBVSxFQUFJLElBRnNCO0VBR3BDLFNBQVMsRUFBSyxJQUhzQjtFQUlwQyxNQUFNLEVBQVE7SUFBRSxDQUFDLEVBQUUsQ0FBTDtJQUFRLENBQUMsRUFBRSxDQUFBO0dBQVg7Q0FKaEIsQ0FBQTtBQU9BLElBQU0sYUFBYSxHQUFHO0VBQ3BCLEVBQUUsRUFBRSxxQkFEZ0I7RUFFcEIsT0FBTyxFQUFQLFlBRm9CO0VBR3BCLFNBQVMsRUFBRTtJQUNULGtCQUFBLEVBQW9CLG1CQURYO0lBRVQsNkJBQUEsRUFBK0IsV0FGdEI7SUFHVCxtQkFBQSxFQUFxQixnQkFIWjtJQUlULG1CQUFBLEVBQXFCLFNBQUEsZ0JBQUEsQ0FBQyxHQUFELEVBQU0sS0FBTixFQUFnQjtNQUNuQyxnQkFBZ0IsQ0FBQyxHQUFELEVBQU0sS0FBTixDQUFoQixDQUFBO01BQ0EsSUFBSSxDQUFDLEdBQUQsRUFBTSxLQUFOLENBQUosQ0FBQTtLQU5PO0lBUVQsaUJBQUEsRUFBbUIsU0FBQSxjQUFBLENBQUMsR0FBRCxFQUFNLEtBQU4sRUFBZ0I7TUFDakMsU0FBUyxDQUFDLEdBQUQsQ0FBVCxDQUFBO01BQ0EsSUFBSSxDQUFDLEdBQUQsRUFBTSxLQUFOLENBQUosQ0FBQTtNQUNBLFVBQVUsQ0FBQyxHQUFELEVBQU0sS0FBTixDQUFWLENBQUE7S0FYTztJQWFULHFCQUFBLEVBQXVCLFNBQUEsa0JBQUEsQ0FBQyxHQUFELEVBQU0sS0FBTixFQUFnQjtNQUNyQyxTQUFTLENBQUMsR0FBRCxDQUFULENBQUE7TUFDQSxJQUFJLENBQUMsR0FBRCxFQUFNLEtBQU4sQ0FBSixDQUFBO0tBQ0Q7R0FuQmlCO0VBcUJwQixZQUFZLEVBQVosYUFBQSxDQUFBLFNBQUEsQ0FyQm9CO0VBc0JwQixJQUFJLEVBQUosSUF0Qm9CO0VBdUJwQixtQkFBbUIsRUFBbkIsbUJBdkJvQjtFQXdCcEIsUUFBUSxFQUFSLGFBeEJvQjtFQXlCcEIsS0FBSyxFQUFFO0lBQ0wsSUFBSSxFQUFFLElBREQ7SUFFTCxJQUFJLEVBQUUsSUFGRDtJQUdMLEVBQUUsRUFBRSxJQUhDO0lBSUwsTUFBTSxFQUFFLElBSkg7SUFLTCxHQUFHLEVBQUUsSUFMQTtJQU1MLFNBQVMsRUFBRSxJQU5OO0lBT0wsSUFBSSxFQUFFLElBQUE7R0FQRDtDQXpCVCxDQUFBOztBQW9DQSxTQUFTLElBQVQsQ0FDRSxHQURGLEVBU0UsS0FURixFQVVFO0VBQUEsSUFFRSxXQUZGLEdBUUksR0FSSixDQUVFLFdBRkY7TUFHRSxPQUhGLEdBUUksR0FSSixDQUdFLE9BSEY7TUFJRSxLQUpGLEdBUUksR0FSSixDQUlFLEtBSkY7TUFLRSxXQUxGLEdBUUksR0FSSixDQUtFLFdBTEY7TUFNRSxJQU5GLEdBUUksR0FSSixDQU1FLElBTkY7TUFBQSxZQUFBLEdBUUksR0FSSixDQU9FLE9BUEY7TUFPRSxPQVBGLEdBQUEsWUFBQSxLQUFBLEtBQUEsQ0FBQSxHQU9ZLG1CQUFtQixDQUFDLEdBQUQsRUFBTSxLQUFOLENBUC9CLEdBQUEsWUFBQSxDQUFBO0VBVUEsSUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFBLENBQUEsU0FBQSxDQUFKLENBQWlCLElBQWpCLEVBQXVCLE9BQXZCLEVBQWdDLEtBQWhDLEVBQXVDLFdBQXZDLEVBQW9ELFdBQXBELEVBQWlFLEtBQUssQ0FBQyxHQUFOLEVBQWpFLENBQXJCLENBQUE7RUFFQSxLQUFLLENBQUMsSUFBTixDQUFXLG1CQUFYLEVBQWdDO0lBQUUsWUFBWSxFQUFaLFlBQUE7R0FBbEMsQ0FBQSxDQUFBO0VBRUEsSUFBTSxTQUFTLEdBQUc7SUFDaEIsV0FBVyxFQUFYLFdBRGdCO0lBRWhCLE9BQU8sRUFBUCxPQUZnQjtJQUdoQixLQUFLLEVBQUwsS0FIZ0I7SUFJaEIsV0FBVyxFQUFYLFdBSmdCO0lBS2hCLE9BQU8sRUFBUCxPQUxnQjtJQU1oQixJQUFJLEVBQUosSUFOZ0I7SUFPaEIsWUFBWSxFQUFaLFlBQUE7R0FQRixDQUFBOztFQVVBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBYixFQUFnQixDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQTVCLEVBQW9DLENBQUMsRUFBckMsRUFBeUM7SUFDdkMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUQsQ0FBdEIsQ0FBQTs7SUFFQSxLQUFLLElBQU0sSUFBWCxJQUFtQixNQUFNLENBQUMsS0FBUCxJQUFnQixFQUFuQyxFQUF1QztNQUNwQyxZQUFELENBQXNCLElBQXRCLENBQUEsR0FBOEIsTUFBTSxDQUFDLEtBQVAsQ0FBYSxJQUFiLENBQTlCLENBQUE7S0FDRDs7SUFFRCxJQUFNLE1BQU0sR0FBRyxVQUFLLENBQUMsV0FBTixDQUFrQixNQUFNLENBQUMsU0FBekIsRUFBb0MsTUFBTSxDQUFDLElBQTNDLENBQWYsQ0FBQTs7SUFFQSxZQUFZLENBQUMsZUFBYixDQUE2QixNQUE3QixDQUFBLENBQUE7O0lBQ0EsWUFBWSxDQUFDLFNBQWIsR0FBeUIsTUFBTSxDQUFDLFNBQWhDLENBQUE7SUFDQSxZQUFZLENBQUMsYUFBYixHQUE2QixNQUFNLENBQUMsSUFBcEMsQ0FBQTtJQUVBLE1BQU0sQ0FBQyxTQUFQLENBQWlCLElBQWpCLENBQXNCLFlBQXRCLENBQUEsQ0FBQTs7SUFFQSxZQUFZLENBQUMsVUFBYixDQUF3QixNQUF4QixDQUFBLENBQUE7O0lBRUEsSUFBSSxZQUFZLENBQUMsMkJBQWIsSUFDQyxZQUFZLENBQUMsa0JBQWIsSUFDSSxDQUFDLEdBQUcsQ0FBTCxHQUFVLE9BQU8sQ0FBQyxNQURyQixJQUMrQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUwsQ0FBUCxDQUFlLElBQWYsS0FBd0IsWUFBWSxDQUFDLGFBRnpFLEVBRXlGO01BQ3ZGLE1BQUE7S0FDRDtHQUNGOztFQUVELEtBQUssQ0FBQyxJQUFOLENBQVcscUJBQVgsRUFBa0MsU0FBbEMsQ0FBQSxDQUFBOztFQUVBLElBQUksSUFBSSxLQUFLLEtBQWIsRUFBb0I7OztJQUdsQixJQUFNLE9BQU8sR0FBRyxZQUFZLENBQUEsUUFBQSxDQUFaLEdBQ1osSUFBSSxDQUFDO01BQ0wsV0FBVyxFQUFYLFdBREs7TUFFTCxPQUFPLEVBQVAsT0FGSztNQUdMLEtBQUssRUFBTCxLQUhLO01BSUwsV0FBVyxFQUFYLFdBSks7TUFLTCxJQUFJLEVBQUUsV0FBQTtLQUxGLEVBTUgsS0FORyxDQURRLEdBUVosWUFSSixDQUFBO0lBVUEsV0FBVyxDQUFDLE9BQVosR0FBc0IsT0FBdEIsQ0FBQTtJQUNBLFdBQVcsQ0FBQyxPQUFaLEdBQXNCLE9BQU8sQ0FBQyxTQUE5QixDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxZQUFQLENBQUE7Q0FDRDs7QUFFRCxTQUFTLG1CQUFULENBQUEsSUFBQSxFQU1HLEtBTkgsRUFNMEI7RUFBQSxJQU53QixXQU14QixHQUFBLElBQUEsQ0FOd0IsV0FNeEI7TUFOcUMsT0FNckMsR0FBQSxJQUFBLENBTnFDLE9BTXJDO01BTjhDLEtBTTlDLEdBQUEsSUFBQSxDQU44QyxLQU05QztNQU5xRCxXQU1yRCxHQUFBLElBQUEsQ0FOcUQsV0FNckQ7TUFOa0UsSUFNbEUsR0FBQSxJQUFBLENBTmtFLElBTWxFLENBQUE7RUFDeEIsSUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLGVBQVosQ0FBNEIsT0FBNUIsQ0FBckIsQ0FBQTtFQUNBLElBQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxRQUFaLENBQXFCLFlBQXJCLENBQXBCLENBRndCOztFQUt4QixJQUFJLElBQUksS0FBSyxLQUFULEtBQW1CLFdBQVcsQ0FBQyxlQUFaO0VBRW5CLEVBQUUsV0FBVyxJQUFJLFdBQVcsQ0FBQyxVQUFaLEtBQTJCLFdBQTVDLENBRkEsQ0FBSixFQUUrRDtJQUM3RCxPQUFPLEVBQVAsQ0FBQTtHQUNEOztFQUVELElBQU0sSUFBSSxHQUFHLFVBQUssQ0FBQyxHQUFOLENBQVUsT0FBVixDQUFrQixXQUFsQixDQUFiLENBQUE7RUFDQSxJQUFNLFNBQVMsR0FBRztJQUNoQixXQUFXLEVBQVgsV0FEZ0I7SUFFaEIsT0FBTyxFQUFQLE9BRmdCO0lBR2hCLEtBQUssRUFBTCxLQUhnQjtJQUloQixXQUFXLEVBQVgsV0FKZ0I7SUFLaEIsSUFBSSxFQUFKLElBTGdCO0lBTWhCLElBQUksRUFBSixJQU5nQjtJQU9oQixPQUFPLEVBQUUsRUFQTztJQVFoQixJQUFJLEVBQUUsSUFBQTtHQVJSLENBQUE7O0VBV0EsS0FBQSxJQUFBLEVBQUEsR0FBQSxDQUFBLEVBQUEsRUFBQSxHQUFtQixJQUFuQixDQUFBLE1BQUEsRUFBQSxFQUFBLEVBQUEsRUFBeUI7SUFBQSxJQUFBLEtBQUEsQ0FBQTs7SUFBQSxLQUFBLEdBQU4sSUFBTSxDQUFBLEVBQUEsQ0FBQSxDQUFBO0lBQUEsSUFBZCxJQUFjLEdBQUEsS0FBQSxDQUFBO0lBQ3ZCLFNBQVMsQ0FBQyxJQUFWLEdBQWlCLElBQWpCLENBQUE7SUFFQSxLQUFLLENBQUMsSUFBTixDQUFXLCtCQUFYLEVBQTRDLFNBQTVDLENBQUEsQ0FBQTtHQUNEOztFQUVELElBQUksSUFBSSxLQUFLLE1BQWIsRUFBcUI7SUFDbkIsU0FBUyxDQUFDLE9BQVYsR0FBb0IsU0FBUyxDQUFDLE9BQVYsQ0FBa0IsTUFBbEIsQ0FBeUIsVUFBQSxNQUFNLEVBQUE7TUFBQSxPQUNqRCxNQUFNLENBQUMsU0FBUCxDQUFpQixPQUFqQixDQUF5QixZQUF6QixLQUEwQyxXQUFXLENBQUMsUUFBWixDQUFxQixZQUFyQixDQUFBLENBQW1DLElBQW5DLENBQXdDLFFBRGpDLENBQUE7S0FBL0IsQ0FBcEIsQ0FBQTtHQUVEOztFQUVELE9BQU8sU0FBUyxDQUFDLE9BQWpCLENBQUE7Q0FDRDs7QUFFRCxTQUFTLG1CQUFULENBQUEsS0FBQSxFQUErQztFQUFBLElBQWYsV0FBZSxHQUFBLEtBQUEsQ0FBZixXQUFlLENBQUE7RUFDN0MsV0FBVyxDQUFDLE9BQVosR0FBc0IsSUFBdEIsQ0FENkM7O0VBRTdDLFdBQVcsQ0FBQyxPQUFaLEdBQXNCLENBQXRCLENBRjZDO0NBRzlDOztBQUVELFNBQVMsV0FBVCxDQUFBLEtBQUEsRUFBaUc7RUFBQSxJQUF6RSxJQUF5RSxHQUFBLEtBQUEsQ0FBekUsSUFBeUU7TUFBbkUsV0FBbUUsR0FBQSxLQUFBLENBQW5FLFdBQW1FLENBQUE7O0VBQy9GLElBQUksQ0FBQyxJQUFELElBQVMsV0FBVyxDQUFDLElBQXpCLEVBQStCO0lBQzdCLE9BQUE7R0FDRDs7RUFFRCxXQUFXLENBQUMsSUFBWixHQUFtQjtJQUFFLFFBQVEsRUFBRSxRQUFaO0lBQXNCLE9BQU8sRUFBRSxJQUFBO0dBQWxELENBQUE7Q0FDRDs7QUFFRCxTQUFTLFNBQVQsQ0FBQSxLQUFBLEVBQW1EO0VBQUEsSUFBN0IsV0FBNkIsR0FBQSxLQUFBLENBQTdCLFdBQTZCO01BQWhCLFlBQWdCLEdBQUEsS0FBQSxDQUFoQixZQUFnQixDQUFBOztFQUNqRCxJQUFJLFdBQVcsQ0FBQyxRQUFaLENBQXFCLFlBQXJCLENBQUEsQ0FBbUMsSUFBdkMsRUFBNkM7SUFDM0MsWUFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFaLENBQXFCLFlBQXJCLENBQUEsQ0FBbUMsSUFBbkMsQ0FBd0MsT0FBekMsQ0FBWixDQUFBO0dBQ0Q7Q0FDRjs7QUFFRCxTQUFTLGdCQUFULENBQUEsS0FBQSxFQUVFLEtBRkYsRUFHRTtFQUFBLElBRkUsV0FFRixHQUFBLEtBQUEsQ0FGRSxXQUVGO01BRmUsT0FFZixHQUFBLEtBQUEsQ0FGZSxPQUVmO01BRndCLEtBRXhCLEdBQUEsS0FBQSxDQUZ3QixLQUV4QjtNQUYrQixXQUUvQixHQUFBLEtBQUEsQ0FGK0IsV0FFL0I7TUFGNEMsU0FFNUMsR0FBQSxLQUFBLENBRjRDLFNBRTVDLENBQUE7RUFDQSxJQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsZUFBWixDQUE0QixPQUE1QixDQUFyQixDQUFBOztFQUVBLElBQUksQ0FBQyxTQUFELEtBQWUsQ0FBQyxXQUFXLENBQUMsYUFBYixJQUE4QixXQUFXLENBQUMsZUFBekQsQ0FBSixFQUErRTtJQUM3RSxJQUFJLFdBQVcsQ0FBQyxhQUFoQixFQUErQjtNQUM3QixZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVosQ0FBcUIsWUFBckIsQ0FBQSxDQUFtQyxJQUFuQyxDQUF3QyxPQUF6QyxDQUFaLENBQUE7S0FDRDs7SUFFRCxJQUFJLENBQUM7TUFDSCxXQUFXLEVBQVgsV0FERztNQUVILE9BQU8sRUFBUCxPQUZHO01BR0gsS0FBSyxFQUFMLEtBSEc7TUFJSCxXQUFXLEVBQUUsV0FKVjtNQUtILElBQUksRUFBRSxNQUFBO0tBTEosRUFNRCxLQU5DLENBQUosQ0FBQTtHQU9EO0NBQ0Y7O0FBRUQsU0FBUyxnQkFBVCxDQUFBLEtBQUEsRUFBaUksS0FBakksRUFBd0o7RUFBQSxJQUEzSCxXQUEySCxHQUFBLEtBQUEsQ0FBM0gsV0FBMkg7TUFBOUcsT0FBOEcsR0FBQSxLQUFBLENBQTlHLE9BQThHO01BQXJHLEtBQXFHLEdBQUEsS0FBQSxDQUFyRyxLQUFxRztNQUE5RixXQUE4RixHQUFBLEtBQUEsQ0FBOUYsV0FBOEY7TUFBakYsWUFBaUYsR0FBQSxLQUFBLENBQWpGLFlBQWlGLENBQUE7RUFDdEosSUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFFBQVosQ0FBcUIsWUFBckIsQ0FBQSxDQUFtQyxJQUFqRCxDQUFBO0VBQ0EsSUFBTSxJQUFJLEdBQUcsVUFBSyxDQUFDLEdBQU4sQ0FBVSxPQUFWLENBQWtCLFdBQWxCLENBQWIsQ0FBQTtFQUNBLElBQU0sU0FBUyxHQUFHO0lBQ2hCLFdBQVcsRUFBWCxXQURnQjtJQUVoQixPQUFPLEVBQVAsT0FGZ0I7SUFHaEIsS0FBSyxFQUFMLEtBSGdCO0lBSWhCLFdBQVcsRUFBWCxXQUpnQjtJQUtoQixJQUFJLEVBQUUsTUFMVTtJQU1oQixPQUFPLEVBQUUsRUFOTztJQU9oQixJQUFJLEVBQUosSUFQZ0I7SUFRaEIsSUFBSSxFQUFFLElBQUE7R0FSUixDQUFBOztFQVdBLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBbUIsSUFBbkIsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQXlCO0lBQUEsSUFBQSxLQUFBLENBQUE7O0lBQUEsS0FBQSxHQUFOLElBQU0sQ0FBQSxHQUFBLENBQUEsQ0FBQTtJQUFBLElBQWQsSUFBYyxHQUFBLEtBQUEsQ0FBQTtJQUN2QixTQUFTLENBQUMsSUFBVixHQUFpQixJQUFqQixDQUFBO0lBRUEsS0FBSyxDQUFDLElBQU4sQ0FBVywrQkFBWCxFQUE0QyxTQUE1QyxDQUFBLENBQUE7R0FDRDs7RUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQVYsQ0FBa0IsTUFBdkIsRUFBK0I7SUFBRSxPQUFBO0dBQVE7O0VBRXpDLElBQUksV0FBVyxHQUFHLFFBQWxCLENBQUE7O0VBRUEsS0FBQSxJQUFBLEdBQUEsR0FBQSxDQUFBLEVBQUEsR0FBQSxHQUFxQixTQUFTLENBQUMsT0FBL0IsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQXdDO0lBQUEsSUFBQSxLQUFBLENBQUE7O0lBQUEsS0FBQSxHQUFuQixTQUFTLENBQUMsT0FBUyxDQUFBLEdBQUEsQ0FBQSxDQUFBO0lBQUEsSUFBN0IsTUFBNkIsR0FBQSxLQUFBLENBQUE7SUFDdEMsSUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVAsQ0FBaUIsT0FBakIsQ0FBeUIsWUFBOUMsQ0FBQTs7SUFFQSxJQUFJLFlBQVksR0FBRyxXQUFuQixFQUFnQztNQUM5QixXQUFXLEdBQUcsWUFBZCxDQUFBO0tBQ0Q7R0FDRjs7RUFFRCxLQUFLLENBQUMsUUFBTixHQUFpQixXQUFqQixDQUFBO0VBQ0EsS0FBSyxDQUFDLE9BQU4sR0FBZ0IsVUFBVSxDQUFDLFlBQU07SUFDL0IsSUFBSSxDQUFDO01BQ0gsV0FBVyxFQUFYLFdBREc7TUFFSCxXQUFXLEVBQVgsV0FGRztNQUdILE9BQU8sRUFBUCxPQUhHO01BSUgsS0FBSyxFQUFMLEtBSkc7TUFLSCxJQUFJLEVBQUUsTUFBQTtLQUxKLEVBTUQsS0FOQyxDQUFKLENBQUE7R0FEd0IsRUFRdkIsV0FSdUIsQ0FBMUIsQ0FBQTtDQVNEOztBQUVELFNBQVMsVUFBVCxDQUFBLE1BQUEsRUFBMkcsS0FBM0csRUFBa0k7RUFBQSxJQUEzRyxXQUEyRyxHQUFBLE1BQUEsQ0FBM0csV0FBMkc7TUFBOUYsT0FBOEYsR0FBQSxNQUFBLENBQTlGLE9BQThGO01BQXJGLEtBQXFGLEdBQUEsTUFBQSxDQUFyRixLQUFxRjtNQUE5RSxXQUE4RSxHQUFBLE1BQUEsQ0FBOUUsV0FBOEUsQ0FBQTs7RUFDaEksSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFqQixFQUFrQztJQUNoQyxJQUFJLENBQUM7TUFBRSxXQUFXLEVBQVgsV0FBRjtNQUFlLFdBQVcsRUFBWCxXQUFmO01BQTRCLE9BQU8sRUFBUCxPQUE1QjtNQUFxQyxLQUFLLEVBQUwsS0FBckM7TUFBNEMsSUFBSSxFQUFFLEtBQUE7S0FBbkQsRUFBNEQsS0FBNUQsQ0FBSixDQUFBO0dBQ0Q7Q0FDRjs7QUFFRCxTQUFTLFlBQVQsQ0FBa0IsS0FBbEIsRUFBZ0M7RUFDOUIsS0FBSyxDQUFDLGFBQU4sR0FBc0IsYUFBdEIsQ0FBQTtFQUNBLEtBQUssQ0FBQyxRQUFOLENBQWUsT0FBZixDQUF1QixhQUF2QixHQUF1QyxhQUFhLENBQUMsUUFBckQsQ0FBQTtFQUNBLFVBQUssQ0FBQyxNQUFOLENBQWEsS0FBSyxDQUFDLE9BQU4sQ0FBYyxjQUEzQixFQUEyQyxhQUFhLENBQUMsS0FBekQsQ0FBQSxDQUFBO0NBQ0Q7O29CQUVjOzs7Ozs7Ozs7OztBQy9VZixJQUFBLFVBQUEsR0FBQSwyQkFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsa0JBQUEsR0FBQSwyQkFBQSxDQUFBLGlCQUFBLENBQUEsQ0FBQTs7OztBQW9CQSxTQUFTLFlBQVQsQ0FBa0IsS0FBbEIsRUFBeUM7RUFDdkMsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsVUFBQSxDQUFBLFNBQUEsQ0FBaEIsQ0FBQSxDQUFBO0VBRHVDLElBSXJDLGFBSnFDLEdBS25DLEtBTG1DLENBSXJDLGFBSnFDLENBQUE7O0VBUXZDLGFBQWEsQ0FBQyxRQUFkLENBQXVCLGtCQUF2QixHQUE0QyxDQUE1QyxDQUFBO0VBQ0EsYUFBYSxDQUFDLEtBQWQsQ0FBb0IsVUFBcEIsR0FBaUMsS0FBSyxDQUFDLE9BQU4sQ0FBYyxjQUFkLENBQTZCLFVBQTdCLEdBQTBDLElBQTNFLENBQUE7Q0FDRDs7QUFFRCxTQUFTLEtBQVQsQ0FBQSxJQUFBLEVBQXVFO0VBQUEsSUFBckQsWUFBcUQsR0FBQSxJQUFBLENBQXJELFlBQXFELENBQUE7O0VBQ3JFLElBQUksWUFBWSxDQUFDLElBQWIsS0FBc0IsTUFBMUIsRUFBa0M7SUFBRSxPQUFBO0dBQVE7O0VBRTVDLFlBQVksQ0FBQyxLQUFiLEdBQXFCLENBQUMsWUFBWSxDQUFDLEtBQWIsSUFBc0IsQ0FBdkIsSUFBNEIsQ0FBakQsQ0FBQTtDQUNEOztBQUVELFNBQVMsT0FBVCxDQUFBLEtBQUEsRUFFRSxLQUZGLEVBR0U7RUFBQSxJQUZFLFdBRUYsR0FBQSxLQUFBLENBRkUsV0FFRjtNQUZlLFlBRWYsR0FBQSxLQUFBLENBRmUsWUFFZjtNQUY2QixXQUU3QixHQUFBLEtBQUEsQ0FGNkIsV0FFN0I7TUFGMEMsT0FFMUMsR0FBQSxLQUFBLENBRjBDLE9BRTFDLENBQUE7O0VBQ0EsSUFBSSxZQUFZLENBQUMsSUFBYixLQUFzQixNQUF0QixJQUFnQyxDQUFDLE9BQU8sQ0FBQyxNQUE3QyxFQUFxRDtJQUFFLE9BQUE7R0FEdkQ7OztFQUlBLElBQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBVyxTQUFYLENBQXFCLE9BQXJCLENBQTZCLGtCQUE5QyxDQUpBOztFQU9BLElBQUksUUFBUSxJQUFJLENBQWhCLEVBQW1CO0lBQUUsT0FBQTtHQVByQjs7O0VBVUEsV0FBVyxDQUFDLGtCQUFaLEdBQWlDLFVBQVUsQ0FBQyxZQUFNO0lBQ2hELEtBQUssQ0FBQyxhQUFOLENBQW9CLElBQXBCLENBQXlCO01BQ3ZCLFdBQVcsRUFBWCxXQUR1QjtNQUV2QixXQUFXLEVBQVgsV0FGdUI7TUFHdkIsSUFBSSxFQUFFLE1BSGlCO01BSXZCLE9BQU8sRUFBRSxZQUpjO01BS3ZCLEtBQUssRUFBRSxZQUFBO0tBTFQsRUFNRyxLQU5ILENBQUEsQ0FBQTtHQUR5QyxFQVF4QyxRQVJ3QyxDQUEzQyxDQUFBO0NBU0Q7O0FBRUQsU0FBUyxhQUFULENBQUEsS0FBQSxFQUFnRjtFQUFBLElBQXRELFdBQXNELEdBQUEsS0FBQSxDQUF0RCxXQUFzRCxDQUFBOzs7O0VBRzlFLElBQUksV0FBVyxDQUFDLGtCQUFoQixFQUFvQztJQUNsQyxhQUFhLENBQUMsV0FBVyxDQUFDLGtCQUFiLENBQWIsQ0FBQTtJQUNBLFdBQVcsQ0FBQyxrQkFBWixHQUFpQyxJQUFqQyxDQUFBO0dBQ0Q7Q0FDRjs7QUFFRCxJQUFNLFVBQTJCLEdBQUc7RUFDbEMsRUFBRSxFQUFFLDJCQUQ4QjtFQUVsQyxPQUFPLEVBQVAsWUFGa0M7RUFHbEMsU0FBUyxFQUFFLENBQUMsTUFBRCxFQUFTLElBQVQsRUFBZSxRQUFmLEVBQXlCLFFBQXpCLENBQUEsQ0FBbUMsTUFBbkMsQ0FDVCxVQUFDLEdBQUQsRUFBTSxVQUFOLEVBQXFCO0lBQ2xCLEdBQUQsQ0FBQSxnQkFBQSxDQUFBLE1BQUEsQ0FBOEIsVUFBOUIsQ0FBQSxDQUFBLEdBQThDLGFBQTlDLENBQUE7SUFDQSxPQUFPLEdBQVAsQ0FBQTtHQUhPLEVBS1Q7SUFDRSxtQkFBQSxFQUFxQixLQUR2QjtJQUVFLHFCQUFBLEVBQXVCLE9BQUE7R0FQaEIsQ0FBQTtDQUhiLENBQUE7b0JBZWU7Ozs7Ozs7Ozs7O0FDdkZmLElBQUEsWUFBQSxHQUFBLDJCQUFBLENBQUEsV0FBQSxDQUFBLENBQUE7Ozs7QUFXQSxTQUFTLFlBQVQsQ0FBa0IsS0FBbEIsRUFBZ0M7RUFBQSxJQUN0QixZQURzQixHQUNMLEtBREssQ0FDdEIsWUFEc0IsQ0FBQTtFQUc5QixZQUFZLENBQUMsU0FBYixDQUF1QixhQUF2QixHQUF1QyxtQkFBdkMsQ0FBQTtFQUVBLElBQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLFNBQWIsQ0FBdUIsaUJBQWxELENBQUE7O0VBRUEsWUFBWSxDQUFDLFNBQWIsQ0FBdUIsaUJBQXZCLEdBQTJDLFVBQVUsVUFBVixFQUFzQixRQUF0QixFQUFnQztJQUN6RSxJQUFNLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxJQUFuQixDQUF3QixJQUF4QixFQUE4QixVQUE5QixFQUEwQyxRQUExQyxDQUFaLENBQUE7O0lBRUEsSUFBSSxHQUFHLEtBQUssSUFBWixFQUFrQjtNQUNoQixJQUFBLENBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsVUFBcEIsQ0FBQSxHQUFrQyxRQUFsQyxDQUFBO0tBQ0Q7O0lBRUQsT0FBTyxHQUFQLENBQUE7R0FQRixDQUFBO0NBU0Q7O0FBRUQsU0FBUyxtQkFBVCxDQUEyRCxPQUEzRCxFQUF5RTtFQUN2RSxDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sSUFBQSxDQUFLLE1BQUwsQ0FBWSxPQUFuQixFQUE0QixPQUE1QixDQUFBLENBQUE7RUFFQSxPQUFPLElBQVAsQ0FBQTtDQUNEOztBQUVELElBQU0sTUFBdUIsR0FBRztFQUM5QixFQUFFLEVBQUUsb0NBRDBCO0VBRTlCLE9BQU8sRUFBUCxZQUY4QjtFQUc5QixTQUFTLEVBQUU7SUFDVCwrQkFBQSxFQUFpQyxTQUFBLDJCQUFBLENBQUEsSUFBQSxFQUs5QixLQUw4QixFQUtwQjtNQUFBLElBSlgsT0FJVyxHQUFBLElBQUEsQ0FKWCxPQUlXO1VBSFgsSUFHVyxHQUFBLElBQUEsQ0FIWCxJQUdXO1VBRlgsSUFFVyxHQUFBLElBQUEsQ0FGWCxJQUVXO1VBRFgsV0FDVyxHQUFBLElBQUEsQ0FEWCxXQUNXLENBQUE7TUFDWCxLQUFLLENBQUMsYUFBTixDQUFvQixZQUFwQixDQUFpQyxJQUFqQyxFQUF1QyxVQUFDLFlBQUQsRUFBZ0M7UUFDckUsSUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQS9CLENBQUE7UUFDQSxJQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBMUIsQ0FBQTs7UUFFQSxJQUNFLFNBQVMsQ0FBQyxLQUFWLENBQWdCLElBQWhCLENBQUEsSUFDQSxTQUFTLENBQUMsS0FBVixDQUFnQixJQUFoQixDQUFBLENBQXNCLE1BRHRCLElBRUYsWUFBWSxDQUFDLGVBQWIsQ0FBNkIsT0FBN0IsRUFBc0MsSUFBdEMsRUFBNEMsV0FBNUMsQ0FIQSxFQUcwRDtVQUN4RCxPQUFPLENBQUMsSUFBUixDQUFhO1lBQ1gsSUFBSSxFQUFKLElBRFc7WUFFWCxTQUFTLEVBQVQsU0FGVztZQUdYLEtBQUssRUFBRTtjQUFFLFlBQVksRUFBWixZQUFBO2FBQUY7V0FIVCxDQUFBLENBQUE7U0FLRDtPQWJILENBQUEsQ0FBQTtLQVBPO0lBd0JULGtCQUFBLEVBQW9CLFNBQUEsZUFBQSxDQUFBLEtBQUEsRUFBc0I7TUFBQSxJQUFuQixZQUFtQixHQUFBLEtBQUEsQ0FBbkIsWUFBbUIsQ0FBQTs7TUFDeEMsWUFBWSxDQUFDLE1BQWIsQ0FBb0IsT0FBcEIsR0FBOEIsVUFBVSxPQUFWLEVBQXFDO1FBQ2pFLE9BQU8sWUFBWSxDQUFDLE9BQWIsQ0FBcUIsT0FBckIsQ0FBUCxDQUFBO09BREYsQ0FBQTtLQXpCTztJQThCVCxrQkFBQSxFQUFvQixTQUFBLGVBQUEsQ0FBQSxLQUFBLEVBQTRCLEtBQTVCLEVBQXNDO01BQUEsSUFBbkMsWUFBbUMsR0FBQSxLQUFBLENBQW5DLFlBQW1DO1VBQXJCLE9BQXFCLEdBQUEsS0FBQSxDQUFyQixPQUFxQixDQUFBO01BQ3hELENBQUEsQ0FBQSxFQUFBLFlBQUEsQ0FBQSxTQUFBLENBQUEsRUFBTyxZQUFZLENBQUMsTUFBYixDQUFvQixPQUEzQixFQUFvQyxLQUFLLENBQUMsYUFBTixDQUFvQixRQUF4RCxDQUFBLENBQUE7TUFDQSxDQUFBLENBQUEsRUFBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQU8sWUFBWSxDQUFDLE1BQWIsQ0FBb0IsT0FBM0IsRUFBb0MsT0FBTyxDQUFDLGFBQVIsSUFBeUIsRUFBN0QsQ0FBQSxDQUFBO0tBQ0Q7R0FqQ1E7Q0FIYixDQUFBO29CQXdDZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVFZixJQUFBLGtCQUFBLEdBQUEsNEJBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBQTs7OztBQUNBLElBQUEsV0FBQSxHQUFBLDJCQUFBLENBQUEsZUFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxvQkFBQSxHQUFBLDJCQUFBLENBQUEsd0JBQUEsQ0FBQSxDQUFBOzs7Ozs7OztvQkFFZTtFQUNiLEVBQUUsRUFBRSxnQkFEUztFQUViLE9BRmEsRUFBQSxTQUFBLE9BQUEsQ0FFSixLQUZJLEVBRW1CO0lBQzlCLEtBQUssQ0FBQyxTQUFOLENBQWdCLGtCQUFoQixDQUFBLENBQUE7SUFDQSxLQUFLLENBQUMsU0FBTixDQUFnQixXQUFBLENBQUEsU0FBQSxDQUFoQixDQUFBLENBQUE7SUFDQSxLQUFLLENBQUMsU0FBTixDQUFnQixvQkFBQSxDQUFBLFNBQUEsQ0FBaEIsQ0FBQSxDQUFBO0dBQ0Q7Ozs7Ozs7Ozs7Ozs7QUNWSCxJQUFBLGtCQUFBLEdBQUEsMkJBQUEsQ0FBQSxxQkFBQSxDQUFBLENBQUE7O0FBQ0EsK0VBQUE7O0FBRUEsb0VBQUE7Ozs7QUFzQk8sU0FBUyxZQUFULENBQWtCLEtBQWxCLEVBQWdDO0VBQUEsSUFJbkMsWUFKbUMsR0FLakMsS0FMaUMsQ0FJbkMsWUFKbUMsQ0FBQTtFQU9yQyxLQUFLLENBQUMsT0FBTixDQUFjLE1BQWQsQ0FBcUIsTUFBckIsR0FBOEIsSUFBOUIsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa0JBLFlBQVksQ0FBQyxTQUFiLENBQXVCLE1BQXZCLEdBQWdDLFVBQVUsTUFBVixFQUFrQjtJQUNoRCxPQUFPLE1BQU0sQ0FBQyxJQUFELEVBQU8sTUFBUCxFQUFlLEtBQWYsQ0FBYixDQUFBO0dBREYsQ0FBQTtDQUdEOztBQUVELFNBQVMsTUFBVCxDQUFnRCxZQUFoRCxFQUE0RSxNQUE1RSxFQUFvRyxLQUFwRyxFQUF5STtFQUN2SSxJQUFNLFFBQVEsR0FBSSxVQUFBLENBQUEsRUFBQSxDQUFHLE1BQUgsQ0FBVSxZQUFZLENBQUMsTUFBdkIsQ0FBQSxHQUNkLFVBQUEsQ0FBQSxHQUFBLENBQUksSUFBSixDQUFTLFlBQVksQ0FBQyxRQUFiLENBQXNCLGdCQUF0QixDQUF1QyxZQUFZLENBQUMsTUFBcEQsQ0FBVCxDQURjLEdBRWQsQ0FBQyxZQUFZLENBQUMsTUFBZCxDQUZKLENBRHVJOztFQU12SSxJQUFNLE9BQU8sR0FBSSxVQUFBLENBQUEsR0FBQSxDQUFJLE1BQUwsQ0FBb0IsT0FBcEMsQ0FBQTtFQUNBLElBQU0sUUFBcUMsR0FBRyxPQUFPLEdBQUcsRUFBSCxHQUFRLElBQTdELENBQUE7O0VBUHVJLElBQUEsS0FBQSxHQUFBLFNBQUEsS0FBQSxHQUFBO0lBQUEsSUFBQSxHQVNqSCxRQVRpSCxDQUFBLEVBQUEsQ0FBQSxDQUFBO0lBQUEsSUFTNUgsT0FUNEgsR0FBQSxJQUFBLENBQUE7SUFVckksSUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsT0FBckIsQ0FBYixDQUFBOztJQUVBLElBQUksQ0FBQyxJQUFMLEVBQVc7TUFBRSxPQUFBLE9BQUEsQ0FBQTtLQUFPOztJQUVwQixJQUFNLGtCQUFrQixHQUFHLFVBQUEsQ0FBQSxHQUFBLENBQUksSUFBSixDQUN6QixLQUFLLENBQUMsWUFBTixDQUFtQixJQURNLEVBRXpCLFVBQUMsV0FBRCxFQUE4QjtNQUM1QixPQUFPLFdBQVcsQ0FBQyxXQUFaLEVBQUEsSUFDTCxXQUFXLENBQUMsWUFBWixLQUE2QixZQUR4QixJQUVMLFdBQVcsQ0FBQyxPQUFaLEtBQXdCLE9BRm5CLElBR0wsV0FBVyxDQUFDLFFBQVosQ0FBcUIsSUFBckIsS0FBOEIsTUFBTSxDQUFDLElBSHZDLENBQUE7S0FIdUIsQ0FBM0IsQ0FBQTs7SUFRQSxJQUFJLGFBQTRCLEdBQUEsS0FBQSxDQUFoQyxDQUFBOztJQUVBLElBQUksa0JBQUosRUFBd0I7TUFDdEIsa0JBQWtCLENBQUMsSUFBbkIsRUFBQSxDQUFBOztNQUVBLElBQUksUUFBSixFQUFjO1FBQ1osYUFBYSxHQUFHLGtCQUFrQixDQUFDLGNBQW5CLElBQXFDLElBQUksT0FBSixDQUFZLFVBQUMsT0FBRCxFQUFrQjtVQUNqRixrQkFBa0IsQ0FBQyxjQUFuQixHQUFvQyxPQUFwQyxDQUFBO1NBRG1ELENBQXJELENBQUE7T0FHRDtLQVBILE1BU0s7TUFDSCxJQUFNLElBQUksR0FBRyxVQUFBLENBQUEsSUFBQSxDQUFVLFVBQVYsQ0FBcUIsSUFBckIsQ0FBYixDQUFBOztNQUNBLElBQU0sTUFBTSxHQUFHO1FBQ2IsSUFBSSxFQUFPO1VBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFWO1VBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO1NBRG5CO1FBRWIsTUFBTSxFQUFLO1VBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFWO1VBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO1NBRm5CO1FBR2IsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFOLEVBQUE7T0FIYixDQUFBOztNQU1BLElBQU0sS0FBSyxHQUFHLFVBQUEsQ0FBQSxPQUFBLENBQWEsYUFBYixDQUEyQixNQUEzQixDQUFkLENBQUE7O01BQ0EsYUFBYSxHQUFHLFdBQVcsQ0FBSSxLQUFKLEVBQVcsWUFBWCxFQUF5QixPQUF6QixFQUFrQyxNQUFsQyxFQUEwQyxLQUExQyxDQUEzQixDQUFBO0tBQ0Q7O0lBRUQsSUFBSSxRQUFKLEVBQWM7TUFDWixRQUFRLENBQUMsSUFBVCxDQUFjLGFBQWQsQ0FBQSxDQUFBO0tBQ0Q7R0EvQ29JLENBQUE7O0VBU3ZJLEtBQUEsSUFBQSxFQUFBLEdBQUEsQ0FBQSxFQUFBLEVBQUEsR0FBc0IsUUFBdEIsQ0FBQSxNQUFBLEVBQUEsRUFBQSxFQUFBLEVBQWdDO0lBQUEsSUFBQSxJQUFBLENBQUE7O0lBQUEsSUFBQSxJQUFBLEdBQUEsS0FBQSxFQUFBLENBQUE7O0lBQUEsSUFBQSxJQUFBLEtBQUEsT0FBQSxFQUdqQixNQUFBO0dBb0NkOztFQUVELE9BQU8sUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFSLENBQVksUUFBWixDQUFBLENBQXNCLElBQXRCLENBQTJCLFlBQUE7SUFBQSxPQUFNLFlBQU4sQ0FBQTtHQUEzQixDQUFuQixDQUFBO0NBQ0Q7O0FBRUQsU0FBUyxXQUFULENBQXFELEtBQXJELEVBQW1FLFlBQW5FLEVBQStGLE9BQS9GLEVBQTBILE1BQTFILEVBQWtKLEtBQWxKLEVBQThKO0VBQzVKLElBQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFOLENBQUEsS0FBQSxDQUFBLENBQXVCO0lBQUUsV0FBVyxFQUFFLFFBQUE7R0FBdEMsQ0FBcEIsQ0FBQTtFQUNBLElBQU0sU0FBUyxHQUFHO0lBQ2hCLFdBQVcsRUFBWCxXQURnQjtJQUVoQixLQUFLLEVBQUwsS0FGZ0I7SUFHaEIsT0FBTyxFQUFFLEtBSE87SUFJaEIsV0FBVyxFQUFFLE9BSkc7SUFLaEIsS0FBSyxFQUFFLFFBQUE7R0FMVCxDQUFBO0VBUUEsV0FBVyxDQUFDLFlBQVosR0FBMkIsWUFBM0IsQ0FBQTtFQUNBLFdBQVcsQ0FBQyxPQUFaLEdBQXNCLE9BQXRCLENBQUE7RUFDQSxXQUFXLENBQUMsUUFBWixHQUF1QixDQUFBLENBQUEsRUFBQSxVQUFBLENBQUEsTUFBQSxFQUFPLEVBQVAsRUFBVyxNQUFYLENBQXZCLENBQUE7RUFDQSxXQUFXLENBQUMsU0FBWixHQUF3QixLQUF4QixDQUFBO0VBQ0EsV0FBVyxDQUFDLGFBQVosQ0FBMEIsS0FBMUIsRUFBaUMsS0FBakMsRUFBd0MsT0FBeEMsRUFBaUQsSUFBakQsQ0FBQSxDQUFBOztFQUVBLFdBQVcsQ0FBQyxRQUFaLENBQXFCLFNBQXJCLENBQUEsQ0FBQTs7RUFFQSxJQUFNLGFBQWEsR0FBSSxVQUFBLENBQUEsR0FBQSxDQUFJLE1BQUwsQ0FBK0IsT0FBL0IsR0FDbEIsSUFBSyxVQUFBLENBQUEsR0FBQSxDQUFJLE1BQUwsQ0FBK0IsT0FBbkMsQ0FBMkMsVUFBQyxPQUFELEVBQWtCO0lBQzdELFdBQVcsQ0FBQyxjQUFaLEdBQTZCLE9BQTdCLENBQUE7R0FEQSxDQURrQixHQUlsQixJQUpKLENBQUE7RUFNQSxXQUFXLENBQUMsY0FBWixHQUE2QixhQUE3QixDQUFBO0VBQ0EsV0FBVyxDQUFDLEtBQVosQ0FBa0IsTUFBbEIsRUFBMEIsWUFBMUIsRUFBd0MsT0FBeEMsQ0FBQSxDQUFBOztFQUVBLElBQUksV0FBVyxDQUFDLFlBQWhCLEVBQThCO0lBQzVCLFdBQVcsQ0FBQyxJQUFaLENBQWlCLFNBQWpCLENBQUEsQ0FBQTtJQUNBLFdBQVcsQ0FBQyxHQUFaLENBQWdCLEtBQWhCLENBQUEsQ0FBQTtHQUZGLE1BSUs7SUFDSCxXQUFXLENBQUMsSUFBWixFQUFBLENBQUE7R0FDRDs7RUFFRCxXQUFXLENBQUMsYUFBWixDQUEwQixLQUExQixFQUFpQyxLQUFqQyxDQUFBLENBQUE7RUFDQSxXQUFXLENBQUMsYUFBWixHQUE0QixLQUE1QixDQUFBO0VBRUEsT0FBTyxhQUFQLENBQUE7Q0FDRDs7b0JBRWM7RUFDYixFQUFFLEVBQUUsUUFEUztFQUViLE9BQU8sRUFBUCxZQUZhO0VBR2IsU0FBUyxFQUFFOztJQUVULG1CQUFBLEVBQXFCLFNBQUEsZ0JBQUEsQ0FBQSxLQUFBLEVBQWtCLEtBQWxCLEVBQTRCO01BQUEsSUFBekIsV0FBeUIsR0FBQSxLQUFBLENBQXpCLFdBQXlCLENBQUE7O01BQy9DLElBQUksV0FBVyxDQUFDLFdBQVosS0FBNEIsUUFBaEMsRUFBMEM7UUFDeEMsSUFBSSxXQUFXLENBQUMsY0FBaEIsRUFBZ0M7VUFDOUIsV0FBVyxDQUFDLGNBQVosRUFBQSxDQUFBO1NBQ0Q7O1FBRUQsVUFBQSxDQUFBLEdBQUEsQ0FBSSxNQUFKLENBQVcsS0FBSyxDQUFDLFlBQU4sQ0FBbUIsSUFBOUIsRUFBb0MsV0FBcEMsQ0FBQSxDQUFBO09BQ0Q7S0FDRjtHQVZROzs7Ozs7Ozs7Ozs7Ozs7QUN0SmIsVUFBQSxDQUFBOztBQUdBLElBQUEsV0FBQSxHQUFBLGNBQUEsQ0FBQTs7QUFDQSxJQUFBLGFBQUEsR0FBQSwyQkFBQSxDQUFBLFlBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsWUFBQSxHQUFBLDJCQUFBLENBQUEsV0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxVQUFBLEdBQUEsNEJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7Ozs7Ozs7O0FBaUNBLElBQU0sWUFBaUIsR0FBRyxFQUExQixDQUFBO0FBQ0EsSUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFBLENBQUEsS0FBSixFQUFkLENBQUE7OztBQUVPLFNBQVMsU0FBVCxDQUFlLEdBQWYsRUFBNEI7RUFDakMsS0FBSyxDQUFDLElBQU4sQ0FBVyxHQUFYLENBQUEsQ0FBQTtFQUVBLE9BQU8sUUFBUCxDQUFBO0NBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQk0sSUFBTSxRQUF3QixHQUFHLFNBQVMsUUFBVCxDQUFtQixNQUFuQixFQUE0QyxPQUE1QyxFQUEyRDtFQUNqRyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBTixDQUFvQixHQUFwQixDQUF3QixNQUF4QixFQUFnQyxPQUFoQyxDQUFuQixDQUFBOztFQUVBLElBQUksQ0FBQyxZQUFMLEVBQW1CO0lBQ2pCLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBTixDQUFBLEtBQUEsQ0FBQSxDQUF3QixNQUF4QixFQUFnQyxPQUFoQyxDQUFmLENBQUE7SUFDQSxZQUFZLENBQUMsTUFBYixDQUFvQixNQUFwQixHQUE2QixZQUE3QixDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxZQUFQLENBQUE7Q0FSSyxDQUFBOzs7Ozs7Ozs7Ozs7O0FBb0JQLFFBQVEsQ0FBQyxHQUFULEdBQWUsR0FBZixDQUFBOztBQUNBLFNBQVMsR0FBVCxDQUFjLE1BQWQsRUFBdUMsT0FBdkMsRUFBeUU7RUFDdkUsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsTUFBaEIsRUFBd0IsT0FBeEIsQ0FBQSxDQUFBO0VBRUEsT0FBTyxRQUFQLENBQUE7Q0FDRDs7Ozs7Ozs7Ozs7OztBQVlELFFBQVEsQ0FBQyxLQUFULEdBQWlCLEtBQWpCLENBQUE7O0FBQ0EsU0FBUyxLQUFULENBQWdCLE1BQWhCLEVBQTBDLE9BQTFDLEVBQXlEO0VBQ3ZELE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFOLENBQW9CLEdBQXBCLENBQXdCLE1BQXhCLEVBQWdDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBbkQsQ0FBVCxDQUFBO0NBQ0Q7Ozs7Ozs7Ozs7Ozs7O0FBYUQsUUFBUSxDQUFDLEVBQVQsR0FBYyxFQUFkLENBQUE7O0FBQ0EsU0FBUyxFQUFULENBQWEsSUFBYixFQUFpRCxRQUFqRCxFQUFrRixPQUFsRixFQUFvRztFQUNsRyxJQUFJLFVBQUssQ0FBQyxFQUFOLENBQVMsTUFBVCxDQUFnQixJQUFoQixDQUFBLElBQXlCLElBQUksQ0FBQyxNQUFMLENBQVksR0FBWixDQUFBLEtBQXFCLENBQUMsQ0FBbkQsRUFBc0Q7SUFDcEQsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFMLEVBQUEsQ0FBWSxLQUFaLENBQWtCLElBQWxCLENBQVAsQ0FBQTtHQUNEOztFQUVELElBQUksVUFBSyxDQUFDLEVBQU4sQ0FBUyxLQUFULENBQWUsSUFBZixDQUFKLEVBQTBCO0lBQ3hCLEtBQUEsSUFBQSxFQUFBLEdBQUEsQ0FBQSxFQUFBLEVBQUEsR0FBeUIsSUFBekIsQ0FBQSxNQUFBLEVBQUEsRUFBQSxFQUFBLEVBQXlDO01BQUEsSUFBQSxJQUFBLENBQUE7O01BQUEsSUFBQSxHQUFoQixJQUFnQixDQUFBLEVBQUEsQ0FBQSxDQUFBO01BQUEsSUFBOUIsU0FBOEIsR0FBQSxJQUFBLENBQUE7TUFDdkMsUUFBUSxDQUFDLEVBQVQsQ0FBWSxTQUFaLEVBQXVCLFFBQXZCLEVBQWlDLE9BQWpDLENBQUEsQ0FBQTtLQUNEOztJQUVELE9BQU8sUUFBUCxDQUFBO0dBQ0Q7O0VBRUQsSUFBSSxVQUFLLENBQUMsRUFBTixDQUFTLE1BQVQsQ0FBZ0IsSUFBaEIsQ0FBSixFQUEyQjtJQUN6QixLQUFLLElBQU0sSUFBWCxJQUFtQixJQUFuQixFQUF5QjtNQUN2QixRQUFRLENBQUMsRUFBVCxDQUFZLElBQVosRUFBbUIsSUFBRCxDQUFjLElBQWQsQ0FBbEIsRUFBdUMsUUFBdkMsQ0FBQSxDQUFBO0tBQ0Q7O0lBRUQsT0FBTyxRQUFQLENBQUE7R0FsQmdHOzs7RUFzQmxHLElBQUksQ0FBQSxDQUFBLEVBQUEsV0FBQSxDQUFBLGdCQUFBLEVBQWlCLElBQWpCLEVBQXVCLEtBQUssQ0FBQyxPQUE3QixDQUFKLEVBQTJDOztJQUV6QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUQsQ0FBakIsRUFBeUI7TUFDdkIsWUFBWSxDQUFDLElBQUQsQ0FBWixHQUFxQixDQUFDLFFBQUQsQ0FBckIsQ0FBQTtLQURGLE1BR0s7TUFDSCxZQUFZLENBQUMsSUFBRCxDQUFaLENBQW1CLElBQW5CLENBQXdCLFFBQXhCLENBQUEsQ0FBQTtLQUNEO0dBUEg7T0FVSztNQUNILFlBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBTyxHQUFQLENBQVcsS0FBSyxDQUFDLFFBQWpCLEVBQTJCLElBQTNCLEVBQWlDLFFBQWpDLEVBQWdFO1FBQUUsT0FBTyxFQUFQLE9BQUE7T0FBbEUsQ0FBQSxDQUFBO0tBQ0Q7O0VBRUQsT0FBTyxRQUFQLENBQUE7Q0FDRDs7Ozs7Ozs7Ozs7Ozs7O0FBY0QsUUFBUSxDQUFDLEdBQVQsR0FBZSxHQUFmLENBQUE7O0FBQ0EsU0FBUyxHQUFULENBQWMsSUFBZCxFQUF5QyxRQUF6QyxFQUF3RCxPQUF4RCxFQUEwRTtFQUN4RSxJQUFJLFVBQUssQ0FBQyxFQUFOLENBQVMsTUFBVCxDQUFnQixJQUFoQixDQUFBLElBQXlCLElBQUksQ0FBQyxNQUFMLENBQVksR0FBWixDQUFBLEtBQXFCLENBQUMsQ0FBbkQsRUFBc0Q7SUFDcEQsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFMLEVBQUEsQ0FBWSxLQUFaLENBQWtCLElBQWxCLENBQVAsQ0FBQTtHQUNEOztFQUVELElBQUksVUFBSyxDQUFDLEVBQU4sQ0FBUyxLQUFULENBQWUsSUFBZixDQUFKLEVBQTBCO0lBQ3hCLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBd0IsSUFBeEIsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQThCO01BQUEsSUFBQSxLQUFBLENBQUE7O01BQUEsS0FBQSxHQUFOLElBQU0sQ0FBQSxHQUFBLENBQUEsQ0FBQTtNQUFBLElBQW5CLFNBQW1CLEdBQUEsS0FBQSxDQUFBO01BQzVCLFFBQVEsQ0FBQyxHQUFULENBQWEsU0FBYixFQUF3QixRQUF4QixFQUFrQyxPQUFsQyxDQUFBLENBQUE7S0FDRDs7SUFFRCxPQUFPLFFBQVAsQ0FBQTtHQUNEOztFQUVELElBQUksVUFBSyxDQUFDLEVBQU4sQ0FBUyxNQUFULENBQWdCLElBQWhCLENBQUosRUFBMkI7SUFDekIsS0FBSyxJQUFNLElBQVgsSUFBbUIsSUFBbkIsRUFBeUI7TUFDdkIsUUFBUSxDQUFDLEdBQVQsQ0FBYSxJQUFiLEVBQW1CLElBQUksQ0FBQyxJQUFELENBQXZCLEVBQStCLFFBQS9CLENBQUEsQ0FBQTtLQUNEOztJQUVELE9BQU8sUUFBUCxDQUFBO0dBQ0Q7O0VBRUQsSUFBSSxDQUFBLENBQUEsRUFBQSxXQUFBLENBQUEsZ0JBQUEsRUFBaUIsSUFBakIsRUFBdUIsS0FBSyxDQUFDLE9BQTdCLENBQUosRUFBMkM7SUFDekMsSUFBSSxLQUFKLENBQUE7O0lBRUEsSUFBSSxJQUFJLElBQUksWUFBUixJQUNBLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFELENBQVosQ0FBbUIsT0FBbkIsQ0FBMkIsUUFBM0IsQ0FBVCxNQUFtRCxDQUFDLENBRHhELEVBQzJEO01BQ3pELFlBQVksQ0FBQyxJQUFELENBQVosQ0FBbUIsTUFBbkIsQ0FBMEIsS0FBMUIsRUFBaUMsQ0FBakMsQ0FBQSxDQUFBO0tBQ0Q7R0FOSCxNQVFLO0lBQ0gsWUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFPLE1BQVAsQ0FBYyxLQUFLLENBQUMsUUFBcEIsRUFBOEIsSUFBOUIsRUFBb0MsUUFBcEMsRUFBOEMsT0FBOUMsQ0FBQSxDQUFBO0dBQ0Q7O0VBRUQsT0FBTyxRQUFQLENBQUE7Q0FDRDs7QUFFRCxRQUFRLENBQUMsS0FBVCxHQUFpQixLQUFqQixDQUFBOztBQUNBLFNBQVMsS0FBVCxHQUFrQjtFQUNoQixPQUFPLEtBQVAsQ0FBQTs7OztBQUlGLFFBQVEsQ0FBQyxpQkFBVCxHQUE4QixVQUFLLENBQUMsT0FBTixDQUFjLGNBQTVDLENBQUE7QUFDQSxRQUFRLENBQUMsWUFBVCxHQUE4QixVQUFLLENBQUMsT0FBTixDQUFjLFNBQTVDLENBQUE7QUFDQSxRQUFRLENBQUMsZ0JBQVQsR0FBOEIsVUFBSyxDQUFDLE9BQU4sQ0FBYyxhQUE1QyxDQUFBO0FBQ0EsUUFBUSxDQUFDLGFBQVQsR0FBOEIsVUFBSyxDQUFDLE9BQU4sQ0FBYyxVQUE1QyxDQUFBO0FBRUEsUUFBUSxDQUFDLGNBQVQsR0FBZ0MsVUFBSyxDQUFDLEdBQU4sQ0FBVSxjQUExQyxDQUFBO0FBQ0EsUUFBUSxDQUFDLG9CQUFULEdBQWdDLFVBQUssQ0FBQyxHQUFOLENBQVUsb0JBQTFDLENBQUE7QUFDQSxRQUFRLENBQUMsZUFBVCxHQUFnQyxVQUFLLENBQUMsR0FBTixDQUFVLGVBQTFDLENBQUE7QUFDQSxRQUFRLENBQUMsT0FBVCxHQUFnQyxVQUFLLENBQUMsR0FBTixDQUFVLE9BQTFDLENBQUE7Ozs7Ozs7QUFPQSxRQUFRLENBQUMsYUFBVCxHQUF5QixhQUF6QixDQUFBOztBQUNBLFNBQVMsYUFBVCxHQUEwQjtFQUN4QixPQUFPLGFBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBUSxhQUFmLENBQUE7Q0FDRDs7Ozs7Ozs7QUFPRCxRQUFRLENBQUMsb0JBQVQsR0FBZ0Msb0JBQWhDLENBQUE7O0FBQ0EsU0FBUyxvQkFBVCxHQUFpQztFQUMvQixPQUFPLGFBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBUSxvQkFBZixDQUFBO0NBQ0Q7Ozs7Ozs7Ozs7QUFTRCxRQUFRLENBQUMsSUFBVCxHQUFnQixTQUFoQixDQUFBOztBQUNBLFNBQVMsU0FBVCxHQUFpQjtFQUNmLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBLEdBQUEsR0FBMEIsS0FBSyxDQUFDLFlBQU4sQ0FBbUIsSUFBN0MsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLEVBQW1EO0lBQUEsSUFBQSxLQUFBLENBQUE7O0lBQUEsS0FBQSxHQUF6QixLQUFLLENBQUMsWUFBTixDQUFtQixJQUFNLENBQUEsR0FBQSxDQUFBLENBQUE7SUFBQSxJQUF4QyxXQUF3QyxHQUFBLEtBQUEsQ0FBQTtJQUNqRCxXQUFXLENBQUMsSUFBWixFQUFBLENBQUE7R0FDRDs7RUFFRCxPQUFPLFFBQVAsQ0FBQTtDQUNEOzs7Ozs7Ozs7Ozs7QUFXRCxRQUFRLENBQUMsb0JBQVQsR0FBZ0Msb0JBQWhDLENBQUE7O0FBQ0EsU0FBUyxvQkFBVCxDQUErQixRQUEvQixFQUFrRDtFQUNoRCxJQUFJLFVBQUssQ0FBQyxFQUFOLENBQVMsTUFBVCxDQUFnQixRQUFoQixDQUFKLEVBQStCO0lBQzdCLEtBQUssQ0FBQyxZQUFOLENBQW1CLG9CQUFuQixHQUEwQyxRQUExQyxDQUFBO0lBRUEsT0FBTyxRQUFQLENBQUE7R0FDRDs7RUFFRCxPQUFPLEtBQUssQ0FBQyxZQUFOLENBQW1CLG9CQUExQixDQUFBO0NBQ0Q7O0FBRUQsUUFBUSxDQUFDLFdBQVQsR0FBdUIsVUFBQyxHQUFELEVBQU0sT0FBTixFQUFBO0VBQUEsT0FBa0IsS0FBSyxDQUFDLFdBQU4sQ0FBa0IsR0FBbEIsRUFBdUIsT0FBdkIsQ0FBbEIsQ0FBQTtDQUF2QixDQUFBOztBQUNBLFFBQVEsQ0FBQyxjQUFULEdBQTBCLFVBQUEsR0FBRyxFQUFBO0VBQUEsT0FBSSxLQUFLLENBQUMsY0FBTixDQUFxQixHQUFyQixDQUFKLENBQUE7Q0FBN0I7OztBQUdBLFFBQVEsQ0FBQyxPQUFULEdBQUEsT0FBQSxDQUFBO0FBRUEsS0FBSyxDQUFDLFFBQU4sR0FBaUIsUUFBakIsQ0FBQTtvQkFHZTs7Ozs7Ozs7Ozs7O0FDMVNmLFVBQUEsQ0FBQTs7QUFDQSxJQUFBLE9BQUEsR0FBQSwyQkFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsT0FBQSxHQUFBLDJCQUFBLENBQUEsU0FBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxPQUFBLEdBQUEsMkJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLE9BQUEsR0FBQSwyQkFBQSxDQUFBLFVBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsT0FBQSxHQUFBLDJCQUFBLENBQUEsVUFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxPQUFBLEdBQUEsMkJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLE9BQUEsR0FBQSwyQkFBQSxDQUFBLFVBQUEsQ0FBQSxDQUFBOztBQUNBLElBQUEsT0FBQSxHQUFBLDJCQUFBLENBQUEsVUFBQSxDQUFBLENBQUE7O0FBQ0EsSUFBQSxPQUFBLEdBQUEsMkJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7QUFDQSxJQUFBLFFBQUEsR0FBQSw0QkFBQSxDQUFBLFVBQUEsQ0FBQSxDQUFBOzs7Ozs7Ozs7O0FBRUEsSUFBSSxDQUFBLE9BQU8sTUFBUCxLQUFBLFdBQUEsR0FBQSxXQUFBLEdBQUEsWUFBQSxDQUFPLE1BQVAsQ0FBQSxNQUFrQixRQUFsQixJQUE4QixDQUFDLENBQUMsTUFBcEMsRUFBNEM7RUFDMUMsU0FBSSxDQUFDLE1BQUQsQ0FBSixDQUFBO0NBQ0Q7O29CQUVjLFFBQUEsQ0FBQSxTQUFBOzs7QUFFUixTQUFTLFNBQVQsQ0FBZSxHQUFmLEVBQTRCO0VBQ2pDLENBQUEsQ0FBQSxFQUFBLFFBQUEsQ0FBQSxJQUFBLEVBQWEsR0FBYixDQUFBLENBQUE7O0VBRUEsUUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFTLEdBQVQsQ0FBYSxPQUFBLENBQUEsU0FBQSxDQUFiLENBQUEsQ0FIaUM7OztFQU1qQyxRQUFBLENBQUEsU0FBQSxDQUFBLENBQVMsR0FBVCxDQUFhLE9BQUEsQ0FBQSxTQUFBLENBQWIsQ0FBQSxDQU5pQzs7O0VBU2pDLFFBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBUyxHQUFULENBQWEsT0FBQSxDQUFBLFNBQUEsQ0FBYixDQUFBLENBVGlDOzs7RUFZakMsUUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFTLEdBQVQsQ0FBYSxPQUFBLENBQUEsU0FBQSxDQUFiLENBQUEsQ0FaaUM7OztFQWVqQyxRQUFBLENBQUEsU0FBQSxDQUFBLENBQVMsR0FBVCxDQUFhLE9BQUEsQ0FBQSxTQUFBLENBQWIsQ0FBQSxDQWZpQzs7O0VBa0JqQyxRQUFBLENBQUEsU0FBQSxDQUFBLENBQVMsR0FBVCxDQUFhLE9BQUEsQ0FBQSxTQUFBLENBQWIsQ0FBQSxDQWxCaUM7OztFQXFCakMsUUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFTLEdBQVQsQ0FBYSxPQUFBLENBQUEsU0FBQSxDQUFiLENBQUEsQ0FyQmlDOzs7RUF3QmpDLFFBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBUyxHQUFULENBQWEsT0FBQSxDQUFBLFNBQUEsQ0FBYixDQUFBLENBeEJpQzs7O0VBMkJqQyxJQUFJLFlBQUEsS0FBeUIsWUFBN0IsRUFBMkM7SUFDekMsUUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFTLEdBQVQsQ0FBYSxPQUFBLENBQUEsU0FBQSxDQUFiLENBQUEsQ0FBQTtHQUNEOztFQUVELE9BQU8sUUFBQSxDQUFBLFNBQUEsQ0FBUCxDQUFBO0NBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsREQsSUFBQSxXQUFBLEdBQUEsNEJBQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7Ozs7Ozs7QUFFQSxJQUFJLENBQUEsUUFBQSxLQUFBLFdBQUEsR0FBQSxXQUFBLEdBQUEsWUFBQSxDQUFPLFVBQVAsQ0FBQSxNQUFrQixRQUFsQixJQUE4QixDQUFDLENBQUMsVUFBcEMsRUFBNEM7RUFDMUMsSUFBSTtJQUFFLGtCQUFBLEdBQWlCLFdBQUEsQ0FBQSxTQUFBLENBQWpCLENBQUE7R0FBTixDQUNBLE9BQUEsT0FBQSxFQUFNLEVBQUU7Q0FDVDs7QUFFQSxXQUFBLENBQUEsU0FBQSxDQUFELENBQUEsU0FBQSxDQUFBLEdBQTRCLFdBQUEsQ0FBQSxTQUFBLENBQTVCLENBQUE7QUFDRSxXQUFBLENBQUEsU0FBQSxDQUFELENBQWtCLElBQWxCLEdBQXlCLFdBQUEsQ0FBQSxJQUF6QixDQUFBO29CQUVjLFdBQUEsQ0FBQSxTQUFBOzs7QUNWZjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5pbnRlcmFjdCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7XG52YXIgY3JlYXRlTW9kdWxlRmFjdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZU1vZHVsZUZhY3RvcnkodCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBlfHx0KGU9e2V4cG9ydHM6e30scGFyZW50OnJ9LGUuZXhwb3J0cyksZS5leHBvcnRzfX07XG4iLCJpbXBvcnQgKiBhcyBhcnIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYXJyJ1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcidcbmltcG9ydCBjbG9uZSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9jbG9uZSdcbmltcG9ydCB7IGdldEVsZW1lbnRSZWN0LCBtYXRjaGVzVXBUbywgbm9kZUNvbnRhaW5zLCB0cnlTZWxlY3RvciB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV2ZW50cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ldmVudHMnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IG5vcm1hbGl6ZUxpc3RlbmVycyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ub3JtYWxpemVMaXN0ZW5lcnMnXG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy93aW5kb3cnXG5pbXBvcnQgeyBBY3Rpb25EZWZhdWx0cywgRGVmYXVsdHMsIE9wdGlvbnMgfSBmcm9tICcuL2RlZmF1bHRPcHRpb25zJ1xuaW1wb3J0IEV2ZW50YWJsZSBmcm9tICcuL0V2ZW50YWJsZSdcbmltcG9ydCB7IEFjdGlvbnMsIGlzTm9uTmF0aXZlRXZlbnQgfSBmcm9tICcuL3Njb3BlJ1xuXG50eXBlIElnbm9yZVZhbHVlID0gc3RyaW5nIHwgSW50ZXJhY3QuRWxlbWVudCB8IGJvb2xlYW5cblxuLyoqICovXG5leHBvcnQgY2xhc3MgSW50ZXJhY3RhYmxlIGltcGxlbWVudHMgUGFydGlhbDxFdmVudGFibGU+IHtcbiAgcHJvdGVjdGVkIGdldCBfZGVmYXVsdHMgKCk6IERlZmF1bHRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmFzZToge30sXG4gICAgICBwZXJBY3Rpb246IHt9LFxuICAgICAgYWN0aW9uczoge30gYXMgQWN0aW9uRGVmYXVsdHMsXG4gICAgfVxuICB9XG5cbiAgcmVhZG9ubHkgb3B0aW9ucyE6IFJlcXVpcmVkPE9wdGlvbnM+XG4gIHJlYWRvbmx5IF9hY3Rpb25zOiBBY3Rpb25zXG4gIHJlYWRvbmx5IHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0XG4gIHJlYWRvbmx5IGV2ZW50cyA9IG5ldyBFdmVudGFibGUoKVxuICByZWFkb25seSBfY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50XG4gIHJlYWRvbmx5IF93aW46IFdpbmRvd1xuICByZWFkb25seSBfZG9jOiBEb2N1bWVudFxuXG4gIC8qKiAqL1xuICBjb25zdHJ1Y3RvciAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM6IGFueSwgZGVmYXVsdENvbnRleHQ6IERvY3VtZW50IHwgSW50ZXJhY3QuRWxlbWVudCkge1xuICAgIHRoaXMuX2FjdGlvbnMgPSBvcHRpb25zLmFjdGlvbnNcbiAgICB0aGlzLnRhcmdldCAgID0gdGFyZ2V0XG4gICAgdGhpcy5fY29udGV4dCA9IG9wdGlvbnMuY29udGV4dCB8fCBkZWZhdWx0Q29udGV4dFxuICAgIHRoaXMuX3dpbiAgICAgPSBnZXRXaW5kb3codHJ5U2VsZWN0b3IodGFyZ2V0KSA/IHRoaXMuX2NvbnRleHQgOiB0YXJnZXQpXG4gICAgdGhpcy5fZG9jICAgICA9IHRoaXMuX3dpbi5kb2N1bWVudFxuXG4gICAgdGhpcy5zZXQob3B0aW9ucylcbiAgfVxuXG4gIHNldE9uRXZlbnRzIChhY3Rpb25OYW1lOiBJbnRlcmFjdC5BY3Rpb25OYW1lLCBwaGFzZXM6IE5vbk51bGxhYmxlPGFueT4pIHtcbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25zdGFydCkpIHsgdGhpcy5vbihgJHthY3Rpb25OYW1lfXN0YXJ0YCwgcGhhc2VzLm9uc3RhcnQpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25tb3ZlKSkgeyB0aGlzLm9uKGAke2FjdGlvbk5hbWV9bW92ZWAsIHBoYXNlcy5vbm1vdmUpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25lbmQpKSB7IHRoaXMub24oYCR7YWN0aW9uTmFtZX1lbmRgLCBwaGFzZXMub25lbmQpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25pbmVydGlhc3RhcnQpKSB7IHRoaXMub24oYCR7YWN0aW9uTmFtZX1pbmVydGlhc3RhcnRgLCBwaGFzZXMub25pbmVydGlhc3RhcnQpIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1cGRhdGVQZXJBY3Rpb25MaXN0ZW5lcnMgKGFjdGlvbk5hbWU6IEludGVyYWN0LkFjdGlvbk5hbWUsIHByZXY6IEludGVyYWN0Lkxpc3RlbmVycywgY3VyOiBJbnRlcmFjdC5MaXN0ZW5lcnMpIHtcbiAgICBpZiAoaXMuYXJyYXkocHJldikgfHwgaXMub2JqZWN0KHByZXYpKSB7XG4gICAgICB0aGlzLm9mZihhY3Rpb25OYW1lLCBwcmV2KVxuICAgIH1cblxuICAgIGlmIChpcy5hcnJheShjdXIpIHx8IGlzLm9iamVjdChjdXIpKSB7XG4gICAgICB0aGlzLm9uKGFjdGlvbk5hbWUsIGN1cilcbiAgICB9XG4gIH1cblxuICBzZXRQZXJBY3Rpb24gKGFjdGlvbk5hbWU6IEludGVyYWN0LkFjdGlvbk5hbWUsIG9wdGlvbnM6IEludGVyYWN0Lk9yQm9vbGVhbjxPcHRpb25zPikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5fZGVmYXVsdHNcblxuICAgIC8vIGZvciBhbGwgdGhlIGRlZmF1bHQgcGVyLWFjdGlvbiBvcHRpb25zXG4gICAgZm9yIChjb25zdCBvcHRpb25OYW1lXyBpbiBvcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHRpb25OYW1lID0gb3B0aW9uTmFtZV8gYXMga2V5b2YgSW50ZXJhY3QuUGVyQWN0aW9uRGVmYXVsdHNcbiAgICAgIGNvbnN0IGFjdGlvbk9wdGlvbnMgPSB0aGlzLm9wdGlvbnNbYWN0aW9uTmFtZV1cbiAgICAgIGNvbnN0IG9wdGlvblZhbHVlOiBhbnkgPSBvcHRpb25zW29wdGlvbk5hbWVdXG5cbiAgICAgIC8vIHJlbW92ZSBvbGQgZXZlbnQgbGlzdGVuZXJzIGFuZCBhZGQgbmV3IG9uZXNcbiAgICAgIGlmIChvcHRpb25OYW1lID09PSAnbGlzdGVuZXJzJykge1xuICAgICAgICB0aGlzLnVwZGF0ZVBlckFjdGlvbkxpc3RlbmVycyhhY3Rpb25OYW1lLCBhY3Rpb25PcHRpb25zLmxpc3RlbmVycywgb3B0aW9uVmFsdWUgYXMgSW50ZXJhY3QuTGlzdGVuZXJzKVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgb3B0aW9uIHZhbHVlIGlzIGFuIGFycmF5XG4gICAgICBpZiAoaXMuYXJyYXk8YW55PihvcHRpb25WYWx1ZSkpIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IGFyci5mcm9tKG9wdGlvblZhbHVlKVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBhbiBvYmplY3RcbiAgICAgIGVsc2UgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvblZhbHVlKSkge1xuICAgICAgICAvLyBjb3B5IHRoZSBvYmplY3RcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IGV4dGVuZChcbiAgICAgICAgICBhY3Rpb25PcHRpb25zW29wdGlvbk5hbWVdIHx8IHt9IGFzIGFueSxcbiAgICAgICAgICBjbG9uZShvcHRpb25WYWx1ZSkpXG5cbiAgICAgICAgLy8gc2V0IGFuYWJsZWQgZmllbGQgdG8gdHJ1ZSBpZiBpdCBleGlzdHMgaW4gdGhlIGRlZmF1bHRzXG4gICAgICAgIGlmIChpcy5vYmplY3QoZGVmYXVsdHMucGVyQWN0aW9uW29wdGlvbk5hbWVdKSAmJiAnZW5hYmxlZCcgaW4gKGRlZmF1bHRzLnBlckFjdGlvbltvcHRpb25OYW1lXSBhcyBhbnkpKSB7XG4gICAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KS5lbmFibGVkID0gb3B0aW9uVmFsdWUuZW5hYmxlZCAhPT0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBhIGJvb2xlYW4gYW5kIHRoZSBkZWZhdWx0IGlzIGFuIG9iamVjdFxuICAgICAgZWxzZSBpZiAoaXMuYm9vbChvcHRpb25WYWx1ZSkgJiYgaXMub2JqZWN0KGRlZmF1bHRzLnBlckFjdGlvbltvcHRpb25OYW1lXSkpIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KS5lbmFibGVkID0gb3B0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIGlmIGl0J3MgYW55dGhpbmcgZWxzZSwgZG8gYSBwbGFpbiBhc3NpZ25tZW50XG4gICAgICBlbHNlIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IG9wdGlvblZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHRvIGdldCBhbiBJbnRlcmFjdGFibGVzIGJvdW5kaW5nIHJlY3QuIENhbiBiZVxuICAgKiBvdmVycmlkZGVuIHVzaW5nIHtAbGluayBJbnRlcmFjdGFibGUucmVjdENoZWNrZXJ9LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbGVtZW50XSBUaGUgZWxlbWVudCB0byBtZWFzdXJlLlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBvYmplY3QncyBib3VuZGluZyByZWN0YW5nbGUuXG4gICAqL1xuICBnZXRSZWN0IChlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gICAgZWxlbWVudCA9IGVsZW1lbnQgfHwgKGlzLmVsZW1lbnQodGhpcy50YXJnZXQpXG4gICAgICA/IHRoaXMudGFyZ2V0XG4gICAgICA6IG51bGwpXG5cbiAgICBpZiAoaXMuc3RyaW5nKHRoaXMudGFyZ2V0KSkge1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnQgfHwgdGhpcy5fY29udGV4dC5xdWVyeVNlbGVjdG9yKHRoaXMudGFyZ2V0KVxuICAgIH1cblxuICAgIHJldHVybiBnZXRFbGVtZW50UmVjdChlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBjYWxjdWxhdGUgdGhlIGludGVyYWN0YWJsZSdzXG4gICAqIGVsZW1lbnQncyByZWN0YW5nbGVcbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NoZWNrZXJdIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGlzIEludGVyYWN0YWJsZSdzXG4gICAqIGJvdW5kaW5nIHJlY3RhbmdsZS4gU2VlIHtAbGluayBJbnRlcmFjdGFibGUuZ2V0UmVjdH1cbiAgICogQHJldHVybiB7ZnVuY3Rpb24gfCBvYmplY3R9IFRoZSBjaGVja2VyIGZ1bmN0aW9uIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICByZWN0Q2hlY2tlciAoY2hlY2tlcjogKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpID0+IGFueSkge1xuICAgIGlmIChpcy5mdW5jKGNoZWNrZXIpKSB7XG4gICAgICB0aGlzLmdldFJlY3QgPSBjaGVja2VyXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrZXIgPT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmdldFJlY3RcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRSZWN0XG4gIH1cblxuICBfYmFja0NvbXBhdE9wdGlvbiAob3B0aW9uTmFtZToga2V5b2YgSW50ZXJhY3QuT3B0aW9ucywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0cnlTZWxlY3RvcihuZXdWYWx1ZSkgfHwgaXMub2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgKHRoaXMub3B0aW9uc1tvcHRpb25OYW1lXSBhcyBhbnkpID0gbmV3VmFsdWVcblxuICAgICAgZm9yIChjb25zdCBhY3Rpb24gaW4gdGhpcy5fYWN0aW9ucy5tYXApIHtcbiAgICAgICAgKHRoaXMub3B0aW9uc1thY3Rpb25dW29wdGlvbk5hbWVdIGFzIGFueSkgPSBuZXdWYWx1ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbb3B0aW9uTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWdpbiBvZiB0aGUgSW50ZXJhY3RhYmxlJ3MgZWxlbWVudC4gIFRoZSB4IGFuZCB5XG4gICAqIG9mIHRoZSBvcmlnaW4gd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gYWN0aW9uIGV2ZW50IGNvb3JkaW5hdGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnQgfCBvYmplY3QgfCBzdHJpbmd9IFtvcmlnaW5dIEFuIEhUTUwgb3IgU1ZHIEVsZW1lbnQgd2hvc2VcbiAgICogcmVjdCB3aWxsIGJlIHVzZWQsIGFuIG9iamVjdCBlZy4geyB4OiAwLCB5OiAwIH0gb3Igc3RyaW5nICdwYXJlbnQnLCAnc2VsZidcbiAgICogb3IgYW55IENTUyBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBjdXJyZW50IG9yaWdpbiBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgb3JpZ2luIChuZXdWYWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tDb21wYXRPcHRpb24oJ29yaWdpbicsIG5ld1ZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB0aGUgbW91c2UgY29vcmRpbmF0ZSB0eXBlcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGVcbiAgICogbW92ZW1lbnQgb2YgdGhlIHBvaW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmV3VmFsdWVdIFVzZSAnY2xpZW50JyBpZiB5b3Ugd2lsbCBiZSBzY3JvbGxpbmcgd2hpbGVcbiAgICogaW50ZXJhY3Rpbmc7IFVzZSAncGFnZScgaWYgeW91IHdhbnQgYXV0b1Njcm9sbCB0byB3b3JrXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IG9iamVjdH0gVGhlIGN1cnJlbnQgZGVsdGFTb3VyY2Ugb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIGRlbHRhU291cmNlIChuZXdWYWx1ZT86IHN0cmluZykge1xuICAgIGlmIChuZXdWYWx1ZSA9PT0gJ3BhZ2UnIHx8IG5ld1ZhbHVlID09PSAnY2xpZW50Jykge1xuICAgICAgdGhpcy5vcHRpb25zLmRlbHRhU291cmNlID0gbmV3VmFsdWVcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRlbHRhU291cmNlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2VsZWN0b3IgY29udGV4dCBOb2RlIG9mIHRoZSBJbnRlcmFjdGFibGUuIFRoZSBkZWZhdWx0IGlzXG4gICAqIGB3aW5kb3cuZG9jdW1lbnRgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtOb2RlfSBUaGUgY29udGV4dCBOb2RlIG9mIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBjb250ZXh0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dFxuICB9XG5cbiAgaW5Db250ZXh0IChlbGVtZW50OiBEb2N1bWVudCB8IE5vZGUpIHtcbiAgICByZXR1cm4gKHRoaXMuX2NvbnRleHQgPT09IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fFxuICAgICAgICAgICAgbm9kZUNvbnRhaW5zKHRoaXMuX2NvbnRleHQsIGVsZW1lbnQpKVxuICB9XG5cbiAgdGVzdElnbm9yZUFsbG93IChcbiAgICB0aGlzOiBJbnRlcmFjdGFibGUsXG4gICAgb3B0aW9uczogeyBpZ25vcmVGcm9tPzogSWdub3JlVmFsdWUsIGFsbG93RnJvbT86IElnbm9yZVZhbHVlIH0sXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsXG4gICkge1xuICAgIHJldHVybiAoIXRoaXMudGVzdElnbm9yZShvcHRpb25zLmlnbm9yZUZyb20sIHRhcmdldE5vZGUsIGV2ZW50VGFyZ2V0KSAmJlxuICAgICAgICAgICAgdGhpcy50ZXN0QWxsb3cob3B0aW9ucy5hbGxvd0Zyb20sIHRhcmdldE5vZGUsIGV2ZW50VGFyZ2V0KSlcbiAgfVxuXG4gIHRlc3RBbGxvdyAoXG4gICAgdGhpczogSW50ZXJhY3RhYmxlLFxuICAgIGFsbG93RnJvbTogSWdub3JlVmFsdWUsXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgKSB7XG4gICAgaWYgKCFhbGxvd0Zyb20pIHsgcmV0dXJuIHRydWUgfVxuXG4gICAgaWYgKCFpcy5lbGVtZW50KGVsZW1lbnQpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoaXMuc3RyaW5nKGFsbG93RnJvbSkpIHtcbiAgICAgIHJldHVybiBtYXRjaGVzVXBUbyhlbGVtZW50LCBhbGxvd0Zyb20sIHRhcmdldE5vZGUpXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLmVsZW1lbnQoYWxsb3dGcm9tKSkge1xuICAgICAgcmV0dXJuIG5vZGVDb250YWlucyhhbGxvd0Zyb20sIGVsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB0ZXN0SWdub3JlIChcbiAgICB0aGlzOiBJbnRlcmFjdGFibGUsXG4gICAgaWdub3JlRnJvbTogSWdub3JlVmFsdWUsXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgKSB7XG4gICAgaWYgKCFpZ25vcmVGcm9tIHx8ICFpcy5lbGVtZW50KGVsZW1lbnQpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoaXMuc3RyaW5nKGlnbm9yZUZyb20pKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlc1VwVG8oZWxlbWVudCwgaWdub3JlRnJvbSwgdGFyZ2V0Tm9kZSlcbiAgICB9XG4gICAgZWxzZSBpZiAoaXMuZWxlbWVudChpZ25vcmVGcm9tKSkge1xuICAgICAgcmV0dXJuIG5vZGVDb250YWlucyhpZ25vcmVGcm9tLCBlbGVtZW50KVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIEludGVyYWN0RXZlbnQgdHlwZSBib3VuZCBnbG9iYWxseVxuICAgKiBhbmQgZGlyZWN0bHkgdG8gdGhpcyBJbnRlcmFjdGFibGVcbiAgICpcbiAgICogQHBhcmFtIHtJbnRlcmFjdEV2ZW50fSBpRXZlbnQgVGhlIEludGVyYWN0RXZlbnQgb2JqZWN0IHRvIGJlIGZpcmVkIG9uIHRoaXNcbiAgICogSW50ZXJhY3RhYmxlXG4gICAqIEByZXR1cm4ge0ludGVyYWN0YWJsZX0gdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIGZpcmUgKGlFdmVudDogb2JqZWN0KSB7XG4gICAgdGhpcy5ldmVudHMuZmlyZShpRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX29uT2ZmIChtZXRob2Q6ICdvbicgfCAnb2ZmJywgdHlwZUFyZzogSW50ZXJhY3QuRXZlbnRUeXBlcywgbGlzdGVuZXJBcmc/OiBJbnRlcmFjdC5MaXN0ZW5lcnNBcmcgfCBudWxsLCBvcHRpb25zPzogYW55KSB7XG4gICAgaWYgKGlzLm9iamVjdCh0eXBlQXJnKSAmJiAhaXMuYXJyYXkodHlwZUFyZykpIHtcbiAgICAgIG9wdGlvbnMgPSBsaXN0ZW5lckFyZ1xuICAgICAgbGlzdGVuZXJBcmcgPSBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgYWRkUmVtb3ZlID0gbWV0aG9kID09PSAnb24nID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5vcm1hbGl6ZUxpc3RlbmVycyh0eXBlQXJnLCBsaXN0ZW5lckFyZylcblxuICAgIGZvciAobGV0IHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ3doZWVsJykgeyB0eXBlID0gYnJvd3Nlci53aGVlbEV2ZW50IH1cblxuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgLy8gaWYgaXQgaXMgYW4gYWN0aW9uIGV2ZW50IHR5cGVcbiAgICAgICAgaWYgKGlzTm9uTmF0aXZlRXZlbnQodHlwZSwgdGhpcy5fYWN0aW9ucykpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50c1ttZXRob2RdKHR5cGUsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICAgIC8vIGRlbGVnYXRlZCBldmVudFxuICAgICAgICBlbHNlIGlmIChpcy5zdHJpbmcodGhpcy50YXJnZXQpKSB7XG4gICAgICAgICAgZXZlbnRzW2Ake2FkZFJlbW92ZX1EZWxlZ2F0ZWAgYXMgJ2FkZERlbGVnYXRlJyB8ICdyZW1vdmVEZWxlZ2F0ZSddKHRoaXMudGFyZ2V0LCB0aGlzLl9jb250ZXh0LCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgbGlzdGVuZXIgZnJvbSB0aGlzIEludGVyYWN0YWJsZSdzIGVsZW1lbnRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgKGV2ZW50c1thZGRSZW1vdmVdIGFzIHR5cGVvZiBldmVudHMucmVtb3ZlKSh0aGlzLnRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgbGlzdGVuZXIgZm9yIGFuIEludGVyYWN0RXZlbnQsIHBvaW50ZXJFdmVudCBvciBET00gZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGVzIFRoZSB0eXBlcyBvZiBldmVudHMgdG8gbGlzdGVuXG4gICAqIGZvclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgYXJyYXkgfCBvYmplY3R9IFtsaXN0ZW5lcl0gVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uKHMpXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAgICogYWRkRXZlbnRMaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBvbiAodHlwZXM6IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyPzogSW50ZXJhY3QuTGlzdGVuZXJzQXJnLCBvcHRpb25zPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uT2ZmKCdvbicsIHR5cGVzLCBsaXN0ZW5lciwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIEludGVyYWN0RXZlbnQsIHBvaW50ZXJFdmVudCBvciBET00gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGVzIFRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCB3ZXJlXG4gICAqIGxpc3RlbmVkIGZvclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgYXJyYXkgfCBvYmplY3R9IFtsaXN0ZW5lcl0gVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uKHMpXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAgICogcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBvZmYgKHR5cGVzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyPzogSW50ZXJhY3QuTGlzdGVuZXJzQXJnLCBvcHRpb25zPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uT2ZmKCdvZmYnLCB0eXBlcywgbGlzdGVuZXIsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIG9wdGlvbnMgb2YgdGhpcyBJbnRlcmFjdGFibGVcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG5ldyBzZXR0aW5ncyB0byBhcHBseVxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBzZXQgKG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnNBcmcpIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuX2RlZmF1bHRzXG5cbiAgICBpZiAoIWlzLm9iamVjdChvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgKHRoaXMub3B0aW9ucyBhcyBSZXF1aXJlZDxPcHRpb25zPikgPSBjbG9uZShkZWZhdWx0cy5iYXNlKSBhcyBSZXF1aXJlZDxPcHRpb25zPlxuXG4gICAgZm9yIChjb25zdCBhY3Rpb25OYW1lXyBpbiB0aGlzLl9hY3Rpb25zLm1ldGhvZERpY3QpIHtcbiAgICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBhY3Rpb25OYW1lXyBhcyBJbnRlcmFjdC5BY3Rpb25OYW1lXG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gdGhpcy5fYWN0aW9ucy5tZXRob2REaWN0W2FjdGlvbk5hbWVdXG5cbiAgICAgIHRoaXMub3B0aW9uc1thY3Rpb25OYW1lXSA9IHt9XG4gICAgICB0aGlzLnNldFBlckFjdGlvbihhY3Rpb25OYW1lLCBleHRlbmQoZXh0ZW5kKHt9LCBkZWZhdWx0cy5wZXJBY3Rpb24pLCBkZWZhdWx0cy5hY3Rpb25zW2FjdGlvbk5hbWVdKSlcblxuICAgICAgdGhpc1ttZXRob2ROYW1lXShvcHRpb25zW2FjdGlvbk5hbWVdKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoaXMuZnVuYyh0aGlzW3NldHRpbmddKSkge1xuICAgICAgICB0aGlzW3NldHRpbmddKG9wdGlvbnNbc2V0dGluZ10pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyBpbnRlcmFjdGFibGUgZnJvbSB0aGUgbGlzdCBvZiBpbnRlcmFjdGFibGVzIGFuZCByZW1vdmUgaXQnc1xuICAgKiBhY3Rpb24gY2FwYWJpbGl0aWVzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICpcbiAgICogQHJldHVybiB7aW50ZXJhY3R9XG4gICAqL1xuICB1bnNldCAoKSB7XG4gICAgZXZlbnRzLnJlbW92ZSh0aGlzLnRhcmdldCBhcyBOb2RlLCAnYWxsJylcblxuICAgIGlmIChpcy5zdHJpbmcodGhpcy50YXJnZXQpKSB7XG4gICAgICAvLyByZW1vdmUgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgZm9yIChjb25zdCB0eXBlIGluIGV2ZW50cy5kZWxlZ2F0ZWRFdmVudHMpIHtcbiAgICAgICAgY29uc3QgZGVsZWdhdGVkID0gZXZlbnRzLmRlbGVnYXRlZEV2ZW50c1t0eXBlXVxuXG4gICAgICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzWzBdID09PSB0aGlzLnRhcmdldCAmJlxuICAgICAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzWzBdID09PSB0aGlzLl9jb250ZXh0KSB7XG4gICAgICAgICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5zcGxpY2UoMCwgMSlcbiAgICAgICAgICBkZWxlZ2F0ZWQuY29udGV4dHMuc3BsaWNlKDAsIDEpXG4gICAgICAgICAgZGVsZWdhdGVkLmxpc3RlbmVycy5zcGxpY2UoMCwgMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50cy5yZW1vdmUodGhpcy5fY29udGV4dCwgdHlwZSwgZXZlbnRzLmRlbGVnYXRlTGlzdGVuZXIpXG4gICAgICAgIGV2ZW50cy5yZW1vdmUodGhpcy5fY29udGV4dCwgdHlwZSwgZXZlbnRzLmRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBldmVudHMucmVtb3ZlKHRoaXMudGFyZ2V0IGFzIE5vZGUsICdhbGwnKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcmFjdGFibGVcbiIsImltcG9ydCBkb21PYmplY3RzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbU9iamVjdHMnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRPcHRpb25zJ1xuaW1wb3J0IEV2ZW50YWJsZSBmcm9tICcuL0V2ZW50YWJsZSdcbmltcG9ydCBJbnRlcmFjdGFibGVCYXNlIGZyb20gJy4vSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IEludGVyYWN0YWJsZVNldCBmcm9tICcuL0ludGVyYWN0YWJsZVNldCdcbmltcG9ydCBJbnRlcmFjdEV2ZW50LCB7IFBoYXNlTWFwIH0gZnJvbSAnLi9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0IGludGVyYWN0aW9ucyBmcm9tICcuL2ludGVyYWN0aW9ucydcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBcmdzIHtcbiAgJ3Njb3BlOmFkZC1kb2N1bWVudCc6IERvY1NpZ25hbEFyZ1xuICAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JzogRG9jU2lnbmFsQXJnXG4gICdpbnRlcmFjdGFibGU6dW5zZXQnOiB7IGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlQmFzZSB9XG4gICdpbnRlcmFjdGFibGU6c2V0JzogeyBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZUJhc2UsIG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnMgfVxuICAnaW50ZXJhY3Rpb25zOmRlc3Ryb3knOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9XG59XG5cbmV4cG9ydCB0eXBlIExpc3RlbmVyTmFtZSA9IGtleW9mIFNpZ25hbEFyZ3NcblxuZXhwb3J0IHR5cGUgTGlzdGVuZXJNYXAgPSB7XG4gIFtQIGluIExpc3RlbmVyTmFtZV0/OiAoYXJnOiBTaWduYWxBcmdzW1BdLCBzY29wZTogU2NvcGUsIHNpZ25hbE5hbWU6IFApID0+IHZvaWQgfCBib29sZWFuXG59XG5cbmludGVyZmFjZSBEb2NTaWduYWxBcmcge1xuICBkb2M6IERvY3VtZW50XG4gIHdpbmRvdzogV2luZG93XG4gIHNjb3BlOiBTY29wZVxuICBvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9XG59XG5cbmNvbnN0IHtcbiAgd2luLFxuICBicm93c2VyLFxuICByYWYsXG4gIGV2ZW50cyxcbn0gPSB1dGlsc1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25NYXAgeyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lIG5vLWVtcHR5LWludGVyZmFjZVxufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25OYW1lID0ga2V5b2YgQWN0aW9uTWFwXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9ucyB7XG4gIG1hcDogQWN0aW9uTWFwXG4gIHBoYXNlczogUGhhc2VNYXBcbiAgbWV0aG9kRGljdDogeyBbUCBpbiBBY3Rpb25OYW1lXT86IHN0cmluZyB9XG4gIHBoYXNlbGVzc1R5cGVzOiB7IFt0eXBlOiBzdHJpbmddOiB0cnVlIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjb3BlICgpIHtcbiAgcmV0dXJuIG5ldyBTY29wZSgpXG59XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRzID0gdHlwZW9mIGRlZmF1bHRzXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIGlkPzogc3RyaW5nXG4gIGxpc3RlbmVycz86IExpc3RlbmVyTWFwXG4gIGJlZm9yZT86IHN0cmluZ1tdXG4gIGluc3RhbGw/IChzY29wZTogU2NvcGUsIG9wdGlvbnM/OiBhbnkpOiB2b2lkXG59XG5cbmV4cG9ydCBjbGFzcyBTY29wZSB7XG4gIGlkID0gYF9faW50ZXJhY3Rfc2NvcGVfJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDApfWBcbiAgaXNJbml0aWFsaXplZCA9IGZhbHNlXG4gIGxpc3RlbmVyTWFwczogQXJyYXk8e1xuICAgIG1hcDogTGlzdGVuZXJNYXBcbiAgICBpZDogc3RyaW5nXG4gIH0+ID0gW11cblxuICBicm93c2VyID0gYnJvd3NlclxuICBldmVudHMgPSBldmVudHNcbiAgdXRpbHMgPSB1dGlsc1xuICBkZWZhdWx0czogRGVmYXVsdHMgPSB1dGlscy5jbG9uZShkZWZhdWx0cykgYXMgRGVmYXVsdHNcbiAgRXZlbnRhYmxlID0gRXZlbnRhYmxlXG4gIGFjdGlvbnM6IEFjdGlvbnMgPSB7XG4gICAgbWFwOiB7fSxcbiAgICBwaGFzZXM6IHtcbiAgICAgIHN0YXJ0OiB0cnVlLFxuICAgICAgbW92ZTogdHJ1ZSxcbiAgICAgIGVuZDogdHJ1ZSxcbiAgICB9LFxuICAgIG1ldGhvZERpY3Q6IHt9LFxuICAgIHBoYXNlbGVzc1R5cGVzOiB7fSxcbiAgfVxuXG4gIEludGVyYWN0RXZlbnQgPSBJbnRlcmFjdEV2ZW50XG4gIEludGVyYWN0YWJsZSE6IHR5cGVvZiBJbnRlcmFjdGFibGVCYXNlXG4gIGludGVyYWN0YWJsZXMgPSBuZXcgSW50ZXJhY3RhYmxlU2V0KHRoaXMpXG5cbiAgLy8gbWFpbiB3aW5kb3dcbiAgX3dpbiE6IFdpbmRvd1xuXG4gIC8vIG1haW4gZG9jdW1lbnRcbiAgZG9jdW1lbnQhOiBEb2N1bWVudFxuXG4gIC8vIG1haW4gd2luZG93XG4gIHdpbmRvdyE6IFdpbmRvd1xuXG4gIC8vIGFsbCBkb2N1bWVudHMgYmVpbmcgbGlzdGVuZWQgdG9cbiAgZG9jdW1lbnRzOiBBcnJheTx7IGRvYzogRG9jdW1lbnQsIG9wdGlvbnM6IGFueSB9PiA9IFtdXG5cbiAgX3BsdWdpbnM6IHtcbiAgICBsaXN0OiBQbHVnaW5bXVxuICAgIG1hcDogeyBbaWQ6IHN0cmluZ106IFBsdWdpbiB9XG4gIH0gPSB7XG4gICAgbGlzdDogW10sXG4gICAgbWFwOiB7fSxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXNcblxuICAgIHRoaXMuSW50ZXJhY3RhYmxlID0gY2xhc3MgZXh0ZW5kcyBJbnRlcmFjdGFibGVCYXNlIHtcbiAgICAgIGdldCBfZGVmYXVsdHMgKCkgeyByZXR1cm4gc2NvcGUuZGVmYXVsdHMgfVxuXG4gICAgICBzZXQgKG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIuc2V0KG9wdGlvbnMpXG5cbiAgICAgICAgc2NvcGUuZmlyZSgnaW50ZXJhY3RhYmxlOnNldCcsIHtcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGludGVyYWN0YWJsZTogdGhpcyxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfVxuXG4gICAgICB1bnNldCAoKSB7XG4gICAgICAgIHN1cGVyLnVuc2V0KClcbiAgICAgICAgc2NvcGUuaW50ZXJhY3RhYmxlcy5saXN0LnNwbGljZShzY29wZS5pbnRlcmFjdGFibGVzLmxpc3QuaW5kZXhPZih0aGlzKSwgMSlcblxuICAgICAgICBzY29wZS5maXJlKCdpbnRlcmFjdGFibGU6dW5zZXQnLCB7IGludGVyYWN0YWJsZTogdGhpcyB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZExpc3RlbmVycyAobWFwOiBMaXN0ZW5lck1hcCwgaWQ/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxpc3RlbmVyTWFwcy5wdXNoKHsgaWQsIG1hcCB9KVxuICB9XG5cbiAgZmlyZTxUIGV4dGVuZHMgTGlzdGVuZXJOYW1lPiAobmFtZTogVCwgYXJnOiBTaWduYWxBcmdzW1RdKTogdm9pZCB8IGZhbHNlIHtcbiAgICBmb3IgKGNvbnN0IHsgbWFwOiB7IFtuYW1lXTogbGlzdGVuZXIgfSB9IG9mIHRoaXMubGlzdGVuZXJNYXBzKSB7XG4gICAgICBpZiAoISFsaXN0ZW5lciAmJiBsaXN0ZW5lcihhcmcgYXMgYW55LCB0aGlzLCBuYW1lIGFzIG5ldmVyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25XaW5kb3dVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB0aGlzLnJlbW92ZURvY3VtZW50KGV2ZW50LnRhcmdldCBhcyBEb2N1bWVudClcblxuICBpbml0ICh3aW5kb3c6IFdpbmRvdykge1xuICAgIHJldHVybiB0aGlzLmlzSW5pdGlhbGl6ZWRcbiAgICAgID8gdGhpc1xuICAgICAgOiBpbml0U2NvcGUodGhpcywgd2luZG93KVxuICB9XG5cbiAgcGx1Z2luSXNJbnN0YWxsZWQgKHBsdWdpbjogUGx1Z2luKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsdWdpbnMubWFwW3BsdWdpbi5pZF0gfHwgdGhpcy5fcGx1Z2lucy5saXN0LmluZGV4T2YocGx1Z2luKSAhPT0gLTFcbiAgfVxuXG4gIHVzZVBsdWdpbiAocGx1Z2luOiBQbHVnaW4sIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gICAgaWYgKHRoaXMucGx1Z2luSXNJbnN0YWxsZWQocGx1Z2luKSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmlkKSB7IHRoaXMuX3BsdWdpbnMubWFwW3BsdWdpbi5pZF0gPSBwbHVnaW4gfVxuICAgIHRoaXMuX3BsdWdpbnMubGlzdC5wdXNoKHBsdWdpbilcblxuICAgIGlmIChwbHVnaW4uaW5zdGFsbCkge1xuICAgICAgcGx1Z2luLmluc3RhbGwodGhpcywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmxpc3RlbmVycyAmJiBwbHVnaW4uYmVmb3JlKSB7XG4gICAgICBsZXQgaW5kZXggPSAwXG4gICAgICBjb25zdCBsZW4gPSB0aGlzLmxpc3RlbmVyTWFwcy5sZW5ndGhcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHBsdWdpbi5iZWZvcmUucmVkdWNlKChhY2MsIGlkKSA9PiB7XG4gICAgICAgIGFjY1tpZF0gPSB0cnVlXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIHt9KVxuXG4gICAgICBmb3IgKDsgaW5kZXggPCBsZW47IGluZGV4KyspIHtcbiAgICAgICAgY29uc3Qgb3RoZXJJZCA9IHRoaXMubGlzdGVuZXJNYXBzW2luZGV4XS5pZFxuXG4gICAgICAgIGlmIChiZWZvcmVbb3RoZXJJZF0pIHsgYnJlYWsgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmxpc3RlbmVyTWFwcy5zcGxpY2UoaW5kZXgsIDAsIHsgaWQ6IHBsdWdpbi5pZCwgbWFwOiBwbHVnaW4ubGlzdGVuZXJzIH0pXG4gICAgfVxuICAgIGVsc2UgaWYgKHBsdWdpbi5saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJNYXBzLnB1c2goeyBpZDogcGx1Z2luLmlkLCBtYXA6IHBsdWdpbi5saXN0ZW5lcnMgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgYWRkRG9jdW1lbnQgKGRvYzogRG9jdW1lbnQsIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHwgZmFsc2Uge1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgZG9jdW1lbnQgaXMgYWxyZWFkeSBrbm93blxuICAgIGlmICh0aGlzLmdldERvY0luZGV4KGRvYykgIT09IC0xKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBjb25zdCB3aW5kb3cgPSB3aW4uZ2V0V2luZG93KGRvYylcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zID8gdXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IHt9XG5cbiAgICB0aGlzLmRvY3VtZW50cy5wdXNoKHsgZG9jLCBvcHRpb25zIH0pXG4gICAgZXZlbnRzLmRvY3VtZW50cy5wdXNoKGRvYylcblxuICAgIC8vIGRvbid0IGFkZCBhbiB1bmxvYWQgZXZlbnQgZm9yIHRoZSBtYWluIGRvY3VtZW50XG4gICAgLy8gc28gdGhhdCB0aGUgcGFnZSBtYXkgYmUgY2FjaGVkIGluIGJyb3dzZXIgaGlzdG9yeVxuICAgIGlmIChkb2MgIT09IHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgIGV2ZW50cy5hZGQod2luZG93LCAndW5sb2FkJywgdGhpcy5vbldpbmRvd1VubG9hZClcbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoJ3Njb3BlOmFkZC1kb2N1bWVudCcsIHsgZG9jLCB3aW5kb3csIHNjb3BlOiB0aGlzLCBvcHRpb25zIH0pXG4gIH1cblxuICByZW1vdmVEb2N1bWVudCAoZG9jOiBEb2N1bWVudCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXREb2NJbmRleChkb2MpXG5cbiAgICBjb25zdCB3aW5kb3cgPSB3aW4uZ2V0V2luZG93KGRvYylcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kb2N1bWVudHNbaW5kZXhdLm9wdGlvbnNcblxuICAgIGV2ZW50cy5yZW1vdmUod2luZG93LCAndW5sb2FkJywgdGhpcy5vbldpbmRvd1VubG9hZClcblxuICAgIHRoaXMuZG9jdW1lbnRzLnNwbGljZShpbmRleCwgMSlcbiAgICBldmVudHMuZG9jdW1lbnRzLnNwbGljZShpbmRleCwgMSlcblxuICAgIHRoaXMuZmlyZSgnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JywgeyBkb2MsIHdpbmRvdywgc2NvcGU6IHRoaXMsIG9wdGlvbnMgfSlcbiAgfVxuXG4gIGdldERvY0luZGV4IChkb2M6IERvY3VtZW50KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRvY3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZG9jdW1lbnRzW2ldLmRvYyA9PT0gZG9jKSB7XG4gICAgICAgIHJldHVybiBpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICBnZXREb2NPcHRpb25zIChkb2M6IERvY3VtZW50KSB7XG4gICAgY29uc3QgZG9jSW5kZXggPSB0aGlzLmdldERvY0luZGV4KGRvYylcblxuICAgIHJldHVybiBkb2NJbmRleCA9PT0gLTEgPyBudWxsIDogdGhpcy5kb2N1bWVudHNbZG9jSW5kZXhdLm9wdGlvbnNcbiAgfVxuXG4gIG5vdyAoKSB7XG4gICAgcmV0dXJuICgodGhpcy53aW5kb3cgYXMgYW55KS5EYXRlIGFzIHR5cGVvZiBEYXRlIHx8IERhdGUpLm5vdygpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uTmF0aXZlRXZlbnQgKHR5cGU6IHN0cmluZywgYWN0aW9uczogQWN0aW9ucykge1xuICBpZiAoYWN0aW9ucy5waGFzZWxlc3NUeXBlc1t0eXBlXSkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgZm9yIChjb25zdCBuYW1lIGluIGFjdGlvbnMubWFwKSB7XG4gICAgaWYgKHR5cGUuaW5kZXhPZihuYW1lKSA9PT0gMCAmJiB0eXBlLnN1YnN0cihuYW1lLmxlbmd0aCkgaW4gYWN0aW9ucy5waGFzZXMpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2NvcGUgKHNjb3BlOiBTY29wZSwgd2luZG93OiBXaW5kb3cpIHtcbiAgc2NvcGUuaXNJbml0aWFsaXplZCA9IHRydWVcbiAgd2luLmluaXQod2luZG93KVxuICBkb21PYmplY3RzLmluaXQod2luZG93KVxuICBicm93c2VyLmluaXQod2luZG93KVxuICByYWYuaW5pdCh3aW5kb3cpXG4gIGV2ZW50cy5pbml0KHdpbmRvdylcblxuICBzY29wZS51c2VQbHVnaW4oaW50ZXJhY3Rpb25zKVxuICBzY29wZS5kb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudFxuICBzY29wZS53aW5kb3cgPSB3aW5kb3dcblxuICByZXR1cm4gc2NvcGVcbn1cbiIsImltcG9ydCBicm93c2VyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2Jyb3dzZXInXG5pbXBvcnQgZG9tT2JqZWN0cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21PYmplY3RzJ1xuaW1wb3J0IHsgbm9kZUNvbnRhaW5zIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZG9tVXRpbHMnXG5pbXBvcnQgZXZlbnRzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V2ZW50cydcbmltcG9ydCAqIGFzIHBvaW50ZXJVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9wb2ludGVyVXRpbHMnXG5pbXBvcnQgSW50ZXJhY3Rpb25CYXNlIGZyb20gJy4vSW50ZXJhY3Rpb24nXG5pbXBvcnQgZmluZGVyLCB7IFNlYXJjaERldGFpbHMgfSBmcm9tICcuL2ludGVyYWN0aW9uRmluZGVyJ1xuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICcuL3Njb3BlJ1xuaW1wb3J0IGludGVyYWN0YWJsZVByZXZlbnREZWZhdWx0IGZyb20gJy4vaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgSW50ZXJhY3Rpb246IHR5cGVvZiBJbnRlcmFjdGlvbkJhc2VcbiAgICBpbnRlcmFjdGlvbnM6IHtcbiAgICAgIG5ldzogPFQgZXh0ZW5kcyBBY3Rpb25OYW1lPiAob3B0aW9uczogYW55KSA9PiBJbnRlcmFjdGlvbkJhc2U8VD5cbiAgICAgIGxpc3Q6IEludGVyYWN0aW9uQmFzZVtdXG4gICAgICBsaXN0ZW5lcnM6IHsgW3R5cGU6IHN0cmluZ106IEludGVyYWN0Lkxpc3RlbmVyIH1cbiAgICAgIGRvY0V2ZW50czogQXJyYXk8eyB0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBJbnRlcmFjdC5MaXN0ZW5lciB9PlxuICAgICAgcG9pbnRlck1vdmVUb2xlcmFuY2U6IG51bWJlclxuICAgIH1cbiAgICBwcmV2VG91Y2hUaW1lOiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2ludGVyYWN0aW9uczpmaW5kJzoge1xuICAgICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uQmFzZVxuICAgICAgc2VhcmNoRGV0YWlsczogU2VhcmNoRGV0YWlsc1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXRob2ROYW1lcyA9IFtcbiAgJ3BvaW50ZXJEb3duJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJVcCcsXG4gICd1cGRhdGVQb2ludGVyJywgJ3JlbW92ZVBvaW50ZXInLCAnd2luZG93Qmx1cicsXG5dXG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCBsaXN0ZW5lcnMgPSB7fSBhcyBhbnlcblxuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2ROYW1lcykge1xuICAgIGxpc3RlbmVyc1ttZXRob2RdID0gZG9PbkludGVyYWN0aW9ucyhtZXRob2QsIHNjb3BlKVxuICB9XG5cbiAgY29uc3QgcEV2ZW50VHlwZXMgPSBicm93c2VyLnBFdmVudFR5cGVzXG4gIGxldCBkb2NFdmVudHM6IHR5cGVvZiBzY29wZS5pbnRlcmFjdGlvbnMuZG9jRXZlbnRzXG5cbiAgaWYgKGRvbU9iamVjdHMuUG9pbnRlckV2ZW50KSB7XG4gICAgZG9jRXZlbnRzID0gW1xuICAgICAgeyB0eXBlOiBwRXZlbnRUeXBlcy5kb3duLCAgIGxpc3RlbmVyOiByZWxlYXNlUG9pbnRlcnNPblJlbW92ZWRFbHMgfSxcbiAgICAgIHsgdHlwZTogcEV2ZW50VHlwZXMuZG93biwgICBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJEb3duIH0sXG4gICAgICB7IHR5cGU6IHBFdmVudFR5cGVzLm1vdmUsICAgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiBwRXZlbnRUeXBlcy51cCwgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcnMucG9pbnRlclVwIH0sXG4gICAgICB7IHR5cGU6IHBFdmVudFR5cGVzLmNhbmNlbCwgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyVXAgfSxcbiAgICBdXG4gIH1cbiAgZWxzZSB7XG4gICAgZG9jRXZlbnRzID0gW1xuICAgICAgeyB0eXBlOiAnbW91c2Vkb3duJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyRG93biB9LFxuICAgICAgeyB0eXBlOiAnbW91c2Vtb3ZlJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiAnbW91c2V1cCcsIGxpc3RlbmVyOiBsaXN0ZW5lcnMucG9pbnRlclVwIH0sXG5cbiAgICAgIHsgdHlwZTogJ3RvdWNoc3RhcnQnLCBsaXN0ZW5lcjogcmVsZWFzZVBvaW50ZXJzT25SZW1vdmVkRWxzIH0sXG4gICAgICB7IHR5cGU6ICd0b3VjaHN0YXJ0JywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyRG93biB9LFxuICAgICAgeyB0eXBlOiAndG91Y2htb3ZlJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiAndG91Y2hlbmQnLCBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJVcCB9LFxuICAgICAgeyB0eXBlOiAndG91Y2hjYW5jZWwnLCBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJVcCB9LFxuICAgIF1cbiAgfVxuXG4gIGRvY0V2ZW50cy5wdXNoKHtcbiAgICB0eXBlOiAnYmx1cicsXG4gICAgbGlzdGVuZXIgKGV2ZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICAgIGludGVyYWN0aW9uLmRvY3VtZW50Qmx1cihldmVudClcbiAgICAgIH1cbiAgICB9LFxuICB9KVxuXG4gIC8vIGZvciBpZ25vcmluZyBicm93c2VyJ3Mgc2ltdWxhdGVkIG1vdXNlIGV2ZW50c1xuICBzY29wZS5wcmV2VG91Y2hUaW1lID0gMFxuXG4gIHNjb3BlLkludGVyYWN0aW9uID0gY2xhc3MgPFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiBleHRlbmRzIEludGVyYWN0aW9uQmFzZTxUPiB7XG4gICAgZ2V0IHBvaW50ZXJNb3ZlVG9sZXJhbmNlICgpIHtcbiAgICAgIHJldHVybiBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2VcbiAgICB9XG5cbiAgICBzZXQgcG9pbnRlck1vdmVUb2xlcmFuY2UgKHZhbHVlKSB7XG4gICAgICBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2UgPSB2YWx1ZVxuICAgIH1cblxuICAgIF9ub3cgKCkgeyByZXR1cm4gc2NvcGUubm93KCkgfVxuICB9XG5cbiAgc2NvcGUuaW50ZXJhY3Rpb25zID0ge1xuICAgIC8vIGFsbCBhY3RpdmUgYW5kIGlkbGUgaW50ZXJhY3Rpb25zXG4gICAgbGlzdDogW10sXG4gICAgbmV3PFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiAob3B0aW9uczogeyBwb2ludGVyVHlwZT86IHN0cmluZywgc2NvcGVGaXJlPzogU2NvcGVbJ2ZpcmUnXSB9KSB7XG4gICAgICBvcHRpb25zLnNjb3BlRmlyZSA9IChuYW1lLCBhcmcpID0+IHNjb3BlLmZpcmUobmFtZSwgYXJnKVxuXG4gICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IG5ldyBzY29wZS5JbnRlcmFjdGlvbjxUPihvcHRpb25zIGFzIFJlcXVpcmVkPHR5cGVvZiBvcHRpb25zPilcblxuICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QucHVzaChpbnRlcmFjdGlvbilcbiAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgIH0sXG4gICAgbGlzdGVuZXJzLFxuICAgIGRvY0V2ZW50cyxcbiAgICBwb2ludGVyTW92ZVRvbGVyYW5jZTogMSxcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbGVhc2VQb2ludGVyc09uUmVtb3ZlZEVscyAoKSB7XG4gICAgLy8gZm9yIGFsbCBpbmFjdGl2ZSB0b3VjaCBpbnRlcmFjdGlvbnMgd2l0aCBwb2ludGVycyBkb3duXG4gICAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgICAgaWYgKCFpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duIHx8XG4gICAgICAgIGludGVyYWN0aW9uLnBvaW50ZXJUeXBlICE9PSAndG91Y2gnIHx8XG4gICAgICAgIGludGVyYWN0aW9uLl9pbnRlcmFjdGluZykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBhIHBvaW50ZXIgaXMgZG93biBvbiBhbiBlbGVtZW50IHRoYXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBET00gdHJlZVxuICAgICAgZm9yIChjb25zdCBwb2ludGVyIG9mIGludGVyYWN0aW9uLnBvaW50ZXJzKSB7XG4gICAgICAgIGlmICghc2NvcGUuZG9jdW1lbnRzLnNvbWUoKHsgZG9jIH0pID0+IG5vZGVDb250YWlucyhkb2MsIHBvaW50ZXIuZG93blRhcmdldCkpKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwb2ludGVyIGZyb20gdGhlIGludGVyYWN0aW9uXG4gICAgICAgICAgaW50ZXJhY3Rpb24ucmVtb3ZlUG9pbnRlcihwb2ludGVyLnBvaW50ZXIsIHBvaW50ZXIuZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzY29wZS51c2VQbHVnaW4oaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQpXG59XG5cbmZ1bmN0aW9uIGRvT25JbnRlcmFjdGlvbnMgKG1ldGhvZCwgc2NvcGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGludGVyYWN0aW9ucyA9IHNjb3BlLmludGVyYWN0aW9ucy5saXN0XG5cbiAgICBjb25zdCBwb2ludGVyVHlwZSA9IHBvaW50ZXJVdGlscy5nZXRQb2ludGVyVHlwZShldmVudClcbiAgICBjb25zdCBbZXZlbnRUYXJnZXQsIGN1ckV2ZW50VGFyZ2V0XSA9IHBvaW50ZXJVdGlscy5nZXRFdmVudFRhcmdldHMoZXZlbnQpXG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdIC8vIFsgW3BvaW50ZXIsIGludGVyYWN0aW9uXSwgLi4uXVxuXG4gICAgaWYgKC9edG91Y2gvLnRlc3QoZXZlbnQudHlwZSkpIHtcbiAgICAgIHNjb3BlLnByZXZUb3VjaFRpbWUgPSBzY29wZS5ub3coKVxuXG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRUb3VjaCBvZiBldmVudC5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgICBjb25zdCBwb2ludGVyID0gY2hhbmdlZFRvdWNoXG4gICAgICAgIGNvbnN0IHBvaW50ZXJJZCA9IHBvaW50ZXJVdGlscy5nZXRQb2ludGVySWQocG9pbnRlcilcbiAgICAgICAgY29uc3Qgc2VhcmNoRGV0YWlsczogU2VhcmNoRGV0YWlscyA9IHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHBvaW50ZXJJZCxcbiAgICAgICAgICBwb2ludGVyVHlwZSxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICAgICAgY3VyRXZlbnRUYXJnZXQsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb24gPSBnZXRJbnRlcmFjdGlvbihzZWFyY2hEZXRhaWxzKVxuXG4gICAgICAgIG1hdGNoZXMucHVzaChbXG4gICAgICAgICAgc2VhcmNoRGV0YWlscy5wb2ludGVyLFxuICAgICAgICAgIHNlYXJjaERldGFpbHMuZXZlbnRUYXJnZXQsXG4gICAgICAgICAgc2VhcmNoRGV0YWlscy5jdXJFdmVudFRhcmdldCxcbiAgICAgICAgICBpbnRlcmFjdGlvbixcbiAgICAgICAgXSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsZXQgaW52YWxpZFBvaW50ZXIgPSBmYWxzZVxuXG4gICAgICBpZiAoIWJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnQgJiYgL21vdXNlLy50ZXN0KGV2ZW50LnR5cGUpKSB7XG4gICAgICAgIC8vIGlnbm9yZSBtb3VzZSBldmVudHMgd2hpbGUgdG91Y2ggaW50ZXJhY3Rpb25zIGFyZSBhY3RpdmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcmFjdGlvbnMubGVuZ3RoICYmICFpbnZhbGlkUG9pbnRlcjsgaSsrKSB7XG4gICAgICAgICAgaW52YWxpZFBvaW50ZXIgPSBpbnRlcmFjdGlvbnNbaV0ucG9pbnRlclR5cGUgIT09ICdtb3VzZScgJiYgaW50ZXJhY3Rpb25zW2ldLnBvaW50ZXJJc0Rvd25cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyeSB0byBpZ25vcmUgbW91c2UgZXZlbnRzIHRoYXQgYXJlIHNpbXVsYXRlZCBieSB0aGUgYnJvd3NlclxuICAgICAgICAvLyBhZnRlciBhIHRvdWNoIGV2ZW50XG4gICAgICAgIGludmFsaWRQb2ludGVyID0gaW52YWxpZFBvaW50ZXIgfHxcbiAgICAgICAgICAoc2NvcGUubm93KCkgLSBzY29wZS5wcmV2VG91Y2hUaW1lIDwgNTAwKSB8fFxuICAgICAgICAgIC8vIG9uIGlPUyBhbmQgRmlyZWZveCBNb2JpbGUsIE1vdXNlRXZlbnQudGltZVN0YW1wIGlzIHplcm8gaWYgc2ltdWxhdGVkXG4gICAgICAgICAgZXZlbnQudGltZVN0YW1wID09PSAwXG4gICAgICB9XG5cbiAgICAgIGlmICghaW52YWxpZFBvaW50ZXIpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRGV0YWlscyA9IHtcbiAgICAgICAgICBwb2ludGVyOiBldmVudCxcbiAgICAgICAgICBwb2ludGVySWQ6IHBvaW50ZXJVdGlscy5nZXRQb2ludGVySWQoZXZlbnQpLFxuICAgICAgICAgIHBvaW50ZXJUeXBlLFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQudHlwZSxcbiAgICAgICAgICBjdXJFdmVudFRhcmdldCxcbiAgICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZ2V0SW50ZXJhY3Rpb24oc2VhcmNoRGV0YWlscylcblxuICAgICAgICBtYXRjaGVzLnB1c2goW1xuICAgICAgICAgIHNlYXJjaERldGFpbHMucG9pbnRlcixcbiAgICAgICAgICBzZWFyY2hEZXRhaWxzLmV2ZW50VGFyZ2V0LFxuICAgICAgICAgIHNlYXJjaERldGFpbHMuY3VyRXZlbnRUYXJnZXQsXG4gICAgICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICAgIF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZvciAoY29uc3QgW3BvaW50ZXIsIGV2ZW50VGFyZ2V0LCBjdXJFdmVudFRhcmdldCwgaW50ZXJhY3Rpb25dIG9mIG1hdGNoZXMpIHtcbiAgICAgIGludGVyYWN0aW9uW21ldGhvZF0ocG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBjdXJFdmVudFRhcmdldClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJhY3Rpb24gKHNlYXJjaERldGFpbHM6IFNlYXJjaERldGFpbHMpIHtcbiAgY29uc3QgeyBwb2ludGVyVHlwZSwgc2NvcGUgfSA9IHNlYXJjaERldGFpbHNcblxuICBjb25zdCBmb3VuZEludGVyYWN0aW9uID0gZmluZGVyLnNlYXJjaChzZWFyY2hEZXRhaWxzKVxuICBjb25zdCBzaWduYWxBcmcgPSB7IGludGVyYWN0aW9uOiBmb3VuZEludGVyYWN0aW9uLCBzZWFyY2hEZXRhaWxzIH1cblxuICBzY29wZS5maXJlKCdpbnRlcmFjdGlvbnM6ZmluZCcsIHNpZ25hbEFyZylcblxuICByZXR1cm4gc2lnbmFsQXJnLmludGVyYWN0aW9uIHx8IHNjb3BlLmludGVyYWN0aW9ucy5uZXcoeyBwb2ludGVyVHlwZSB9KVxufVxuXG5mdW5jdGlvbiBvbkRvY1NpZ25hbDxUIGV4dGVuZHMgJ3Njb3BlOmFkZC1kb2N1bWVudCcgfCAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50Jz4gKHsgZG9jLCBzY29wZSwgb3B0aW9ucyB9OiBJbnRlcmFjdC5TaWduYWxBcmdzW1RdLCBldmVudE1ldGhvZE5hbWU6ICdhZGQnIHwgJ3JlbW92ZScpIHtcbiAgY29uc3QgeyBkb2NFdmVudHMgfSA9IHNjb3BlLmludGVyYWN0aW9uc1xuICBjb25zdCBldmVudE1ldGhvZCA9IGV2ZW50c1tldmVudE1ldGhvZE5hbWVdXG5cbiAgaWYgKHNjb3BlLmJyb3dzZXIuaXNJT1MgJiYgIW9wdGlvbnMuZXZlbnRzKSB7XG4gICAgb3B0aW9ucy5ldmVudHMgPSB7IHBhc3NpdmU6IGZhbHNlIH1cbiAgfVxuXG4gIC8vIGRlbGVnYXRlIGV2ZW50IGxpc3RlbmVyXG4gIGZvciAoY29uc3QgZXZlbnRUeXBlIGluIGV2ZW50cy5kZWxlZ2F0ZWRFdmVudHMpIHtcbiAgICBldmVudE1ldGhvZChkb2MsIGV2ZW50VHlwZSwgZXZlbnRzLmRlbGVnYXRlTGlzdGVuZXIpXG4gICAgZXZlbnRNZXRob2QoZG9jLCBldmVudFR5cGUsIGV2ZW50cy5kZWxlZ2F0ZVVzZUNhcHR1cmUsIHRydWUpXG4gIH1cblxuICBjb25zdCBldmVudE9wdGlvbnMgPSBvcHRpb25zICYmIG9wdGlvbnMuZXZlbnRzXG5cbiAgZm9yIChjb25zdCB7IHR5cGUsIGxpc3RlbmVyIH0gb2YgZG9jRXZlbnRzKSB7XG4gICAgZXZlbnRNZXRob2QoZG9jLCB0eXBlLCBsaXN0ZW5lciwgZXZlbnRPcHRpb25zKVxuICB9XG59XG5cbmNvbnN0IGludGVyYWN0aW9uczogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ2NvcmUvaW50ZXJhY3Rpb25zJyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ3Njb3BlOmFkZC1kb2N1bWVudCc6IGFyZyA9PiBvbkRvY1NpZ25hbChhcmcsICdhZGQnKSxcbiAgICAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JzogYXJnID0+IG9uRG9jU2lnbmFsKGFyZywgJ3JlbW92ZScpLFxuICAgICdpbnRlcmFjdGFibGU6dW5zZXQnOiAoeyBpbnRlcmFjdGFibGUgfSwgc2NvcGUpID0+IHtcbiAgICAgIC8vIFN0b3AgYW5kIGRlc3Ryb3kgcmVsYXRlZCBpbnRlcmFjdGlvbnMgd2hlbiBhbiBJbnRlcmFjdGFibGUgaXMgdW5zZXRcbiAgICAgIGZvciAobGV0IGkgPSBzY29wZS5pbnRlcmFjdGlvbnMubGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IHNjb3BlLmludGVyYWN0aW9ucy5saXN0W2ldXG5cbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSAhPT0gaW50ZXJhY3RhYmxlKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICBpbnRlcmFjdGlvbi5zdG9wKClcbiAgICAgICAgc2NvcGUuZmlyZSgnaW50ZXJhY3Rpb25zOmRlc3Ryb3knLCB7IGludGVyYWN0aW9uIH0pXG4gICAgICAgIGludGVyYWN0aW9uLmRlc3Ryb3koKVxuXG4gICAgICAgIGlmIChzY29wZS5pbnRlcmFjdGlvbnMubGlzdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3Quc3BsaWNlKGksIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBvbkRvY1NpZ25hbCxcbiAgZG9PbkludGVyYWN0aW9ucyxcbiAgbWV0aG9kTmFtZXMsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGludGVyYWN0aW9uc1xuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwZXMuZC50c1wiIC8+XG4iLCJleHBvcnQgZGVmYXVsdCAodGhpbmc6IGFueSkgPT4gISEodGhpbmcgJiYgdGhpbmcuV2luZG93KSAmJiAodGhpbmcgaW5zdGFuY2VvZiB0aGluZy5XaW5kb3cpXG4iLCJpbXBvcnQgaXNXaW5kb3cgZnJvbSAnLi9pc1dpbmRvdydcblxuY29uc3Qgd2luID0ge1xuICByZWFsV2luZG93OiB1bmRlZmluZWQgYXMgV2luZG93LFxuICB3aW5kb3c6IHVuZGVmaW5lZCBhcyBXaW5kb3csXG4gIGdldFdpbmRvdyxcbiAgaW5pdCxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKHdpbmRvdzogV2luZG93ICYgeyB3cmFwPzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgfSkge1xuICAvLyBnZXQgd3JhcHBlZCB3aW5kb3cgaWYgdXNpbmcgU2hhZG93IERPTSBwb2x5ZmlsbFxuXG4gIHdpbi5yZWFsV2luZG93ID0gd2luZG93XG5cbiAgLy8gY3JlYXRlIGEgVGV4dE5vZGVcbiAgY29uc3QgZWwgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpXG5cbiAgLy8gY2hlY2sgaWYgaXQncyB3cmFwcGVkIGJ5IGEgcG9seWZpbGxcbiAgaWYgKGVsLm93bmVyRG9jdW1lbnQgIT09IHdpbmRvdy5kb2N1bWVudCAmJlxuICAgICAgdHlwZW9mIHdpbmRvdy53cmFwID09PSAnZnVuY3Rpb24nICYmXG4gICAgd2luZG93LndyYXAoZWwpID09PSBlbCkge1xuICAgIC8vIHVzZSB3cmFwcGVkIHdpbmRvd1xuICAgIHdpbmRvdyA9IHdpbmRvdy53cmFwKHdpbmRvdylcbiAgfVxuXG4gIHdpbi53aW5kb3cgPSB3aW5kb3dcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbi53aW5kb3cgICAgID0gdW5kZWZpbmVkXG4gIHdpbi5yZWFsV2luZG93ID0gdW5kZWZpbmVkXG59XG5lbHNlIHtcbiAgaW5pdCh3aW5kb3cpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3cgKG5vZGU6IGFueSkge1xuICBpZiAoaXNXaW5kb3cobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgY29uc3Qgcm9vdE5vZGUgPSAobm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUpXG5cbiAgcmV0dXJuIHJvb3ROb2RlLmRlZmF1bHRWaWV3IHx8IHdpbi53aW5kb3dcbn1cblxud2luLmluaXQgPSBpbml0XG5cbmV4cG9ydCBkZWZhdWx0IHdpblxuIiwiLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxuXG5pbXBvcnQgaXNXaW5kb3cgZnJvbSAnLi9pc1dpbmRvdydcbmltcG9ydCB3aW4gZnJvbSAnLi93aW5kb3cnXG5cbmV4cG9ydCBjb25zdCB3aW5kb3cgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIFdpbmRvdyA9PlxuICB0aGluZyA9PT0gd2luLndpbmRvdyB8fCBpc1dpbmRvdyh0aGluZylcblxuZXhwb3J0IGNvbnN0IGRvY0ZyYWcgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIERvY3VtZW50RnJhZ21lbnQgPT5cbiAgb2JqZWN0KHRoaW5nKSAmJiB0aGluZy5ub2RlVHlwZSA9PT0gMTFcblxuZXhwb3J0IGNvbnN0IG9iamVjdCA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0+XG4gICEhdGhpbmcgJiYgKHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCcpXG5cbmV4cG9ydCBjb25zdCBmdW5jID0gKHRoaW5nOiBhbnkpOiB0aGluZyBpcyAoLi4uYXJnczogYW55W10pID0+IGFueSA9PlxuICB0eXBlb2YgdGhpbmcgPT09ICdmdW5jdGlvbidcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgbnVtYmVyID0+XG4gIHR5cGVvZiB0aGluZyA9PT0gJ251bWJlcidcblxuZXhwb3J0IGNvbnN0IGJvb2wgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIGJvb2xlYW4gPT5cbiAgdHlwZW9mIHRoaW5nID09PSAnYm9vbGVhbidcblxuZXhwb3J0IGNvbnN0IHN0cmluZyA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgc3RyaW5nID0+XG4gIHR5cGVvZiB0aGluZyA9PT0gJ3N0cmluZydcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnQgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIEludGVyYWN0LkVsZW1lbnQgPT4ge1xuICBpZiAoIXRoaW5nIHx8ICh0eXBlb2YgdGhpbmcgIT09ICdvYmplY3QnKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IF93aW5kb3cgPSB3aW4uZ2V0V2luZG93KHRoaW5nKSB8fCB3aW4ud2luZG93XG5cbiAgcmV0dXJuICgvb2JqZWN0fGZ1bmN0aW9uLy50ZXN0KHR5cGVvZiBfd2luZG93LkVsZW1lbnQpXG4gICAgPyB0aGluZyBpbnN0YW5jZW9mIF93aW5kb3cuRWxlbWVudCAvLyBET00yXG4gICAgOiB0aGluZy5ub2RlVHlwZSA9PT0gMSAmJiB0eXBlb2YgdGhpbmcubm9kZU5hbWUgPT09ICdzdHJpbmcnKVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5PYmplY3Q6IHR5cGVvZiBvYmplY3QgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9PlxuICBvYmplY3QodGhpbmcpICYmXG4gICEhdGhpbmcuY29uc3RydWN0b3IgJiZcbiAgL2Z1bmN0aW9uIE9iamVjdFxcYi8udGVzdCh0aGluZy5jb25zdHJ1Y3Rvci50b1N0cmluZygpKVxuXG5leHBvcnQgY29uc3QgYXJyYXkgPSA8VCBleHRlbmRzIHVua25vd24+KHRoaW5nOiBhbnkpOiB0aGluZyBpcyBUW10gPT5cbiAgKG9iamVjdCh0aGluZykgJiZcbiAgKHR5cGVvZiB0aGluZy5sZW5ndGggIT09ICd1bmRlZmluZWQnKSAmJlxuICBmdW5jKHRoaW5nLnNwbGljZSkpXG4iLCJpbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIGRyYWdnYWJsZTogRHJhZ2dhYmxlTWV0aG9kXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBkcmFnOiBJbnRlcmFjdC5EcmFnZ2FibGVPcHRpb25zXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbk1hcCB7XG4gICAgZHJhZz86IHR5cGVvZiBkcmFnXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgRHJhZ0V2ZW50ID0gSW50ZXJhY3QuSW50ZXJhY3RFdmVudDwnZHJhZyc+XG5cbmV4cG9ydCB0eXBlIERyYWdnYWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5EcmFnZ2FibGVPcHRpb25zPlxuXG5mdW5jdGlvbiBpbnN0YWxsIChzY29wZTogU2NvcGUpIHtcbiAgY29uc3Qge1xuICAgIGFjdGlvbnMsXG4gICAgSW50ZXJhY3RhYmxlLFxuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyYWdnYWJsZSA9IGRyYWcuZHJhZ2dhYmxlXG5cbiAgYWN0aW9ucy5tYXAuZHJhZyA9IGRyYWdcbiAgYWN0aW9ucy5tZXRob2REaWN0LmRyYWcgPSAnZHJhZ2dhYmxlJ1xuXG4gIGRlZmF1bHRzLmFjdGlvbnMuZHJhZyA9IGRyYWcuZGVmYXVsdHNcbn1cblxuZnVuY3Rpb24gYmVmb3JlTW92ZSAoeyBpbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICBjb25zdCBheGlzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpc1xuXG4gIGlmIChheGlzID09PSAneCcpIHtcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnBhZ2UueSAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueVxuICAgIGludGVyYWN0aW9uLmNvb3Jkcy5jdXIuY2xpZW50LnkgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQuY2xpZW50LnlcblxuICAgIGludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eS5jbGllbnQueSA9IDBcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHkucGFnZS55ICAgPSAwXG4gIH1cbiAgZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgaW50ZXJhY3Rpb24uY29vcmRzLmN1ci5wYWdlLnggICA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5wYWdlLnhcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLmNsaWVudC54ID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LmNsaWVudC54XG5cbiAgICBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHkuY2xpZW50LnggPSAwXG4gICAgaW50ZXJhY3Rpb24uY29vcmRzLnZlbG9jaXR5LnBhZ2UueCAgID0gMFxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdmUgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICBjb25zdCBheGlzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpc1xuXG4gIGlmIChheGlzID09PSAneCcgfHwgYXhpcyA9PT0gJ3knKSB7XG4gICAgY29uc3Qgb3Bwb3NpdGUgPSBheGlzID09PSAneCcgPyAneScgOiAneCdcblxuICAgIGlFdmVudC5wYWdlW29wcG9zaXRlXSAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2Vbb3Bwb3NpdGVdXG4gICAgaUV2ZW50LmNsaWVudFtvcHBvc2l0ZV0gPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQuY2xpZW50W29wcG9zaXRlXVxuICAgIGlFdmVudC5kZWx0YVtvcHBvc2l0ZV0gPSAwXG4gIH1cbn1cblxuLyoqXG4gKiBgYGBqc1xuICogaW50ZXJhY3QoZWxlbWVudCkuZHJhZ2dhYmxlKHtcbiAqICAgICBvbnN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICogICAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gKiAgICAgb25lbmQgIDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAqXG4gKiAgICAgLy8gdGhlIGF4aXMgaW4gd2hpY2ggdGhlIGZpcnN0IG1vdmVtZW50IG11c3QgYmVcbiAqICAgICAvLyBmb3IgdGhlIGRyYWcgc2VxdWVuY2UgdG8gc3RhcnRcbiAqICAgICAvLyAneHknIGJ5IGRlZmF1bHQgLSBhbnkgZGlyZWN0aW9uXG4gKiAgICAgc3RhcnRBeGlzOiAneCcgfHwgJ3knIHx8ICd4eScsXG4gKlxuICogICAgIC8vICd4eScgYnkgZGVmYXVsdCAtIGRvbid0IHJlc3RyaWN0IHRvIG9uZSBheGlzIChtb3ZlIGluIGFueSBkaXJlY3Rpb24pXG4gKiAgICAgLy8gJ3gnIG9yICd5JyB0byByZXN0cmljdCBtb3ZlbWVudCB0byBlaXRoZXIgYXhpc1xuICogICAgIC8vICdzdGFydCcgdG8gcmVzdHJpY3QgbW92ZW1lbnQgdG8gdGhlIGF4aXMgdGhlIGRyYWcgc3RhcnRlZCBpblxuICogICAgIGxvY2tBeGlzOiAneCcgfHwgJ3knIHx8ICd4eScgfHwgJ3N0YXJ0JyxcbiAqXG4gKiAgICAgLy8gbWF4IG51bWJlciBvZiBkcmFncyB0aGF0IGNhbiBoYXBwZW4gY29uY3VycmVudGx5XG4gKiAgICAgLy8gd2l0aCBlbGVtZW50cyBvZiB0aGlzIEludGVyYWN0YWJsZS4gSW5maW5pdHkgYnkgZGVmYXVsdFxuICogICAgIG1heDogSW5maW5pdHksXG4gKlxuICogICAgIC8vIG1heCBudW1iZXIgb2YgZHJhZ3MgdGhhdCBjYW4gdGFyZ2V0IHRoZSBzYW1lIGVsZW1lbnQrSW50ZXJhY3RhYmxlXG4gKiAgICAgLy8gMSBieSBkZWZhdWx0XG4gKiAgICAgbWF4UGVyRWxlbWVudDogMlxuICogfSlcbiAqXG4gKiB2YXIgaXNEcmFnZ2FibGUgPSBpbnRlcmFjdCgnZWxlbWVudCcpLmRyYWdnYWJsZSgpOyAvLyB0cnVlXG4gKiBgYGBcbiAqXG4gKiBHZXQgb3Igc2V0IHdoZXRoZXIgZHJhZyBhY3Rpb25zIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHRhcmdldFxuICpcbiAqIEBhbGlhcyBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyYWdnYWJsZVxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAqIGxpc3RlbmVycyB0byBiZSBmaXJlZCBvbiBkcmFnIGV2ZW50cyAob2JqZWN0IG1ha2VzIHRoZSBJbnRlcmFjdGFibGVcbiAqIGRyYWdnYWJsZSlcbiAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIGNhbiBiZSB0aGVcbiAqIHRhcmdldCBvZiBkcmFnIGV2ZW50cywgb3IgdGhpcyBJbnRlcmN0YWJsZVxuICovXG5jb25zdCBkcmFnZ2FibGU6IERyYWdnYWJsZU1ldGhvZCA9IGZ1bmN0aW9uIGRyYWdnYWJsZSAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zPzogSW50ZXJhY3QuRHJhZ2dhYmxlT3B0aW9ucyB8IGJvb2xlYW4pOiBhbnkge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgdGhpcy5vcHRpb25zLmRyYWcuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcbiAgICB0aGlzLnNldFBlckFjdGlvbignZHJhZycsIG9wdGlvbnMpXG4gICAgdGhpcy5zZXRPbkV2ZW50cygnZHJhZycsIG9wdGlvbnMpXG5cbiAgICBpZiAoL14oeHl8eHx5fHN0YXJ0KSQvLnRlc3Qob3B0aW9ucy5sb2NrQXhpcykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5kcmFnLmxvY2tBeGlzID0gb3B0aW9ucy5sb2NrQXhpc1xuICAgIH1cbiAgICBpZiAoL14oeHl8eHx5KSQvLnRlc3Qob3B0aW9ucy5zdGFydEF4aXMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZHJhZy5zdGFydEF4aXMgPSBvcHRpb25zLnN0YXJ0QXhpc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoaXMuYm9vbChvcHRpb25zKSkge1xuICAgIHRoaXMub3B0aW9ucy5kcmFnLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcmV0dXJuIHRoaXMub3B0aW9ucy5kcmFnXG59XG5cbmNvbnN0IGRyYWc6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhY3Rpb25zL2RyYWcnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGJlZm9yZU1vdmUsXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tcmVzdW1lJzogYmVmb3JlTW92ZSxcblxuICAgIC8vIGRyYWdtb3ZlXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IG1vdmUsXG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBhcmcgPT4ge1xuICAgICAgY29uc3QgeyBpbnRlcmFjdGlvbiwgaW50ZXJhY3RhYmxlLCBidXR0b25zIH0gPSBhcmdcbiAgICAgIGNvbnN0IGRyYWdPcHRpb25zID0gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJhZ1xuXG4gICAgICBpZiAoXG4gICAgICAgICEoZHJhZ09wdGlvbnMgJiYgZHJhZ09wdGlvbnMuZW5hYmxlZCkgfHxcbiAgICAgICAgLy8gY2hlY2sgbW91c2VCdXR0b24gc2V0dGluZyBpZiB0aGUgcG9pbnRlciBpcyBkb3duXG4gICAgICAgIChpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duICYmXG4gICAgICAgICAvbW91c2V8cG9pbnRlci8udGVzdChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSkgJiZcbiAgICAgICAoYnV0dG9ucyAmIGludGVyYWN0YWJsZS5vcHRpb25zLmRyYWcubW91c2VCdXR0b25zKSA9PT0gMClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGFyZy5hY3Rpb24gPSB7XG4gICAgICAgIG5hbWU6ICdkcmFnJyxcbiAgICAgICAgYXhpczogKGRyYWdPcHRpb25zLmxvY2tBeGlzID09PSAnc3RhcnQnXG4gICAgICAgICAgPyBkcmFnT3B0aW9ucy5zdGFydEF4aXNcbiAgICAgICAgICA6IGRyYWdPcHRpb25zLmxvY2tBeGlzKSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcbiAgfSxcbiAgZHJhZ2dhYmxlLFxuICBiZWZvcmVNb3ZlLFxuICBtb3ZlLFxuICBkZWZhdWx0czoge1xuICAgIHN0YXJ0QXhpcyA6ICd4eScsXG4gICAgbG9ja0F4aXMgIDogJ3h5JyxcbiAgfSBhcyBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnMsXG5cbiAgZ2V0Q3Vyc29yICgpIHtcbiAgICByZXR1cm4gJ21vdmUnXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWdcbiIsInR5cGUgRmlsdGVyPFQ+ID0gKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IGJvb2xlYW5cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zID0gPFQ+KGFycmF5OiBUW10sIHRhcmdldDogVCkgPT4gYXJyYXkuaW5kZXhPZih0YXJnZXQpICE9PSAtMVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlID0gPFQ+KGFycmF5OiBUW10sIHRhcmdldDogVCkgPT4gYXJyYXkuc3BsaWNlKGFycmF5LmluZGV4T2YodGFyZ2V0KSwgMSlcblxuZXhwb3J0IGNvbnN0IG1lcmdlID0gPFQsIFU+KHRhcmdldDogQXJyYXk8VCB8IFU+LCBzb3VyY2U6IFVbXSkgPT4ge1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKSB7XG4gICAgdGFyZ2V0LnB1c2goaXRlbSlcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRcbn1cblxuZXhwb3J0IGNvbnN0IGZyb20gPSA8VCA9IGFueT4oc291cmNlOiBBcnJheUxpa2U8VD4pID0+IG1lcmdlKFtdIGFzIFRbXSwgc291cmNlIGFzIFRbXSlcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihhcnJheTogVFtdLCBmdW5jOiBGaWx0ZXI8VD4pID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmdW5jKGFycmF5W2ldLCBpLCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbmV4cG9ydCBjb25zdCBmaW5kID0gPFQgPSBhbnk+KGFycmF5OiBUW10sIGZ1bmM6IEZpbHRlcjxUPikgPT4gYXJyYXlbZmluZEluZGV4KGFycmF5LCBmdW5jKV1cbiIsImNvbnN0IGRvbU9iamVjdHM6IHtcbiAgaW5pdDogYW55XG4gIGRvY3VtZW50OiBEb2N1bWVudFxuICBEb2N1bWVudEZyYWdtZW50OiB0eXBlb2YgRG9jdW1lbnRGcmFnbWVudFxuICBTVkdFbGVtZW50OiB0eXBlb2YgU1ZHRWxlbWVudFxuICBTVkdTVkdFbGVtZW50OiB0eXBlb2YgU1ZHU1ZHRWxlbWVudFxuICBTVkdFbGVtZW50SW5zdGFuY2U6IGFueVxuICBFbGVtZW50OiB0eXBlb2YgRWxlbWVudFxuICBIVE1MRWxlbWVudDogdHlwZW9mIEhUTUxFbGVtZW50XG4gIEV2ZW50OiB0eXBlb2YgRXZlbnRcbiAgVG91Y2g6IHR5cGVvZiBUb3VjaFxuICBQb2ludGVyRXZlbnQ6IHR5cGVvZiBQb2ludGVyRXZlbnRcbn0gPVxue1xuICBpbml0LFxuICBkb2N1bWVudDogbnVsbCxcbiAgRG9jdW1lbnRGcmFnbWVudDogbnVsbCxcbiAgU1ZHRWxlbWVudDogbnVsbCxcbiAgU1ZHU1ZHRWxlbWVudDogbnVsbCxcbiAgU1ZHRWxlbWVudEluc3RhbmNlOiBudWxsLFxuICBFbGVtZW50OiBudWxsLFxuICBIVE1MRWxlbWVudDogbnVsbCxcbiAgRXZlbnQ6IG51bGwsXG4gIFRvdWNoOiBudWxsLFxuICBQb2ludGVyRXZlbnQ6IG51bGwsXG59XG5cbmZ1bmN0aW9uIGJsYW5rICgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGRvbU9iamVjdHNcblxuZnVuY3Rpb24gaW5pdCAod2luZG93OiBXaW5kb3cpIHtcbiAgY29uc3Qgd2luID0gd2luZG93IGFzIGFueVxuXG4gIGRvbU9iamVjdHMuZG9jdW1lbnQgICAgICAgICAgID0gd2luLmRvY3VtZW50XG4gIGRvbU9iamVjdHMuRG9jdW1lbnRGcmFnbWVudCAgID0gd2luLkRvY3VtZW50RnJhZ21lbnQgICB8fCBibGFua1xuICBkb21PYmplY3RzLlNWR0VsZW1lbnQgICAgICAgICA9IHdpbi5TVkdFbGVtZW50ICAgICAgICAgfHwgYmxhbmtcbiAgZG9tT2JqZWN0cy5TVkdTVkdFbGVtZW50ICAgICAgPSB3aW4uU1ZHU1ZHRWxlbWVudCAgICAgIHx8IGJsYW5rXG4gIGRvbU9iamVjdHMuU1ZHRWxlbWVudEluc3RhbmNlID0gd2luLlNWR0VsZW1lbnRJbnN0YW5jZSB8fCBibGFua1xuICBkb21PYmplY3RzLkVsZW1lbnQgICAgICAgICAgICA9IHdpbi5FbGVtZW50ICAgICAgICAgICAgfHwgYmxhbmtcbiAgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAgICAgICAgPSB3aW4uSFRNTEVsZW1lbnQgICAgICAgIHx8IGRvbU9iamVjdHMuRWxlbWVudFxuXG4gIGRvbU9iamVjdHMuRXZlbnQgICAgICAgID0gd2luLkV2ZW50XG4gIGRvbU9iamVjdHMuVG91Y2ggICAgICAgID0gd2luLlRvdWNoIHx8IGJsYW5rXG4gIGRvbU9iamVjdHMuUG9pbnRlckV2ZW50ID0gKHdpbi5Qb2ludGVyRXZlbnQgfHwgd2luLk1TUG9pbnRlckV2ZW50KVxufVxuIiwiaW1wb3J0IGRvbU9iamVjdHMgZnJvbSAnLi9kb21PYmplY3RzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCB3aW4gZnJvbSAnLi93aW5kb3cnXG5cbmNvbnN0IGJyb3dzZXIgPSB7XG4gIGluaXQsXG4gIHN1cHBvcnRzVG91Y2g6IG51bGwgYXMgYm9vbGVhbixcbiAgc3VwcG9ydHNQb2ludGVyRXZlbnQ6IG51bGwgYXMgYm9vbGVhbixcbiAgaXNJT1M3OiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzSU9TOiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzSWU5OiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzT3BlcmFNb2JpbGU6IG51bGwgYXMgYm9vbGVhbixcbiAgcHJlZml4ZWRNYXRjaGVzU2VsZWN0b3I6IG51bGwgYXMgc3RyaW5nLFxuICBwRXZlbnRUeXBlczogbnVsbCBhcyB7XG4gICAgdXA6IHN0cmluZ1xuICAgIGRvd246IHN0cmluZ1xuICAgIG92ZXI6IHN0cmluZ1xuICAgIG91dDogc3RyaW5nXG4gICAgbW92ZTogc3RyaW5nXG4gICAgY2FuY2VsOiBzdHJpbmdcbiAgfSxcbiAgd2hlZWxFdmVudDogbnVsbCBhcyBzdHJpbmcsXG59XG5cbmZ1bmN0aW9uIGluaXQgKHdpbmRvdzogYW55KSB7XG4gIGNvbnN0IEVsZW1lbnQgPSBkb21PYmplY3RzLkVsZW1lbnRcbiAgY29uc3QgbmF2aWdhdG9yICA9IHdpbi53aW5kb3cubmF2aWdhdG9yXG5cbiAgLy8gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IHRvdWNoIGlucHV0P1xuICBicm93c2VyLnN1cHBvcnRzVG91Y2ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KSB8fFxuICAgIChpcy5mdW5jKHdpbmRvdy5Eb2N1bWVudFRvdWNoKSAmJiBkb21PYmplY3RzLmRvY3VtZW50IGluc3RhbmNlb2Ygd2luZG93LkRvY3VtZW50VG91Y2gpXG5cbiAgLy8gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IFBvaW50ZXJFdmVudHNcbiAgYnJvd3Nlci5zdXBwb3J0c1BvaW50ZXJFdmVudCA9IG5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCAhPT0gZmFsc2UgJiYgISFkb21PYmplY3RzLlBvaW50ZXJFdmVudFxuXG4gIGJyb3dzZXIuaXNJT1MgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkpXG5cbiAgLy8gc2Nyb2xsaW5nIGRvZXNuJ3QgY2hhbmdlIHRoZSByZXN1bHQgb2YgZ2V0Q2xpZW50UmVjdHMgb24gaU9TIDdcbiAgYnJvd3Nlci5pc0lPUzcgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgJiZcbiAgICAgICAgICAgL09TIDdbXlxcZF0vLnRlc3QobmF2aWdhdG9yLmFwcFZlcnNpb24pKVxuXG4gIGJyb3dzZXIuaXNJZTkgPSAvTVNJRSA5Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgLy8gT3BlcmEgTW9iaWxlIG11c3QgYmUgaGFuZGxlZCBkaWZmZXJlbnRseVxuICBicm93c2VyLmlzT3BlcmFNb2JpbGUgPSAobmF2aWdhdG9yLmFwcE5hbWUgPT09ICdPcGVyYScgJiZcbiAgICBicm93c2VyLnN1cHBvcnRzVG91Y2ggJiZcbiAgICAvUHJlc3RvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKVxuXG4gIC8vIHByZWZpeCBtYXRjaGVzU2VsZWN0b3JcbiAgYnJvd3Nlci5wcmVmaXhlZE1hdGNoZXNTZWxlY3RvciA9ICdtYXRjaGVzJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgID8gJ21hdGNoZXMnXG4gICAgOiAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgICAgPyAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJ1xuICAgICAgOiAnbW96TWF0Y2hlc1NlbGVjdG9yJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgICAgICA/ICdtb3pNYXRjaGVzU2VsZWN0b3InXG4gICAgICAgIDogJ29NYXRjaGVzU2VsZWN0b3InIGluIEVsZW1lbnQucHJvdG90eXBlXG4gICAgICAgICAgPyAnb01hdGNoZXNTZWxlY3RvcidcbiAgICAgICAgICA6ICdtc01hdGNoZXNTZWxlY3RvcidcblxuICBicm93c2VyLnBFdmVudFR5cGVzID0gKGJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnRcbiAgICA/IChkb21PYmplY3RzLlBvaW50ZXJFdmVudCA9PT0gd2luZG93Lk1TUG9pbnRlckV2ZW50XG4gICAgICA/IHtcbiAgICAgICAgdXA6ICAgICAnTVNQb2ludGVyVXAnLFxuICAgICAgICBkb3duOiAgICdNU1BvaW50ZXJEb3duJyxcbiAgICAgICAgb3ZlcjogICAnbW91c2VvdmVyJyxcbiAgICAgICAgb3V0OiAgICAnbW91c2VvdXQnLFxuICAgICAgICBtb3ZlOiAgICdNU1BvaW50ZXJNb3ZlJyxcbiAgICAgICAgY2FuY2VsOiAnTVNQb2ludGVyQ2FuY2VsJyxcbiAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICB1cDogICAgICdwb2ludGVydXAnLFxuICAgICAgICBkb3duOiAgICdwb2ludGVyZG93bicsXG4gICAgICAgIG92ZXI6ICAgJ3BvaW50ZXJvdmVyJyxcbiAgICAgICAgb3V0OiAgICAncG9pbnRlcm91dCcsXG4gICAgICAgIG1vdmU6ICAgJ3BvaW50ZXJtb3ZlJyxcbiAgICAgICAgY2FuY2VsOiAncG9pbnRlcmNhbmNlbCcsXG4gICAgICB9KVxuICAgIDogbnVsbClcblxuICAvLyBiZWNhdXNlIFdlYmtpdCBhbmQgT3BlcmEgc3RpbGwgdXNlICdtb3VzZXdoZWVsJyBldmVudCB0eXBlXG4gIGJyb3dzZXIud2hlZWxFdmVudCA9ICdvbm1vdXNld2hlZWwnIGluIGRvbU9iamVjdHMuZG9jdW1lbnQgPyAnbW91c2V3aGVlbCcgOiAnd2hlZWwnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGJyb3dzZXJcbiIsImltcG9ydCAqIGFzIGFyciBmcm9tICcuL2FycidcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBiYW4tdHlwZXNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsb25lPFQgZXh0ZW5kcyBPYmplY3Q+IChzb3VyY2U6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgZGVzdCA9IHt9IGFzIFBhcnRpYWw8VD5cblxuICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbcHJvcF1cblxuICAgIGlmIChpcy5wbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGRlc3RbcHJvcF0gPSBjbG9uZSh2YWx1ZSkgYXMgYW55XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLmFycmF5KHZhbHVlKSkge1xuICAgICAgZGVzdFtwcm9wXSA9IGFyci5mcm9tKHZhbHVlKSBhcyB0eXBlb2YgdmFsdWVcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkZXN0W3Byb3BdID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVzdFxufVxuIiwiaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi9icm93c2VyJ1xuaW1wb3J0IGRvbU9iamVjdHMgZnJvbSAnLi9kb21PYmplY3RzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCB3aW4sIHsgZ2V0V2luZG93IH0gZnJvbSAnLi93aW5kb3cnXG5cbmV4cG9ydCBmdW5jdGlvbiBub2RlQ29udGFpbnMgKHBhcmVudDogTm9kZSB8IEludGVyYWN0LkV2ZW50VGFyZ2V0LCBjaGlsZDogTm9kZSB8IEludGVyYWN0LkV2ZW50VGFyZ2V0KSB7XG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGlmIChjaGlsZCA9PT0gcGFyZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNoaWxkID0gKGNoaWxkIGFzIE5vZGUpLnBhcmVudE5vZGVcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VzdCAoZWxlbWVudDogTm9kZSwgc2VsZWN0b3I6IHN0cmluZykge1xuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIGlmIChtYXRjaGVzU2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3IpKSB7IHJldHVybiBlbGVtZW50IH1cblxuICAgIGVsZW1lbnQgPSBwYXJlbnROb2RlKGVsZW1lbnQpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyZW50Tm9kZSAobm9kZTogTm9kZSB8IERvY3VtZW50KSB7XG4gIGxldCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGVcblxuICBpZiAoaXMuZG9jRnJhZyhwYXJlbnQpKSB7XG4gICAgLy8gc2tpcCBwYXN0ICNzaGFkby1yb290IGZyYWdtZW50c1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIHdoaWxlICgocGFyZW50ID0gKHBhcmVudCBhcyBhbnkpLmhvc3QpICYmIGlzLmRvY0ZyYWcocGFyZW50KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICByZXR1cm4gcGFyZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgLy8gcmVtb3ZlIC9kZWVwLyBmcm9tIHNlbGVjdG9ycyBpZiBzaGFkb3dET00gcG9seWZpbGwgaXMgdXNlZFxuICBpZiAod2luLndpbmRvdyAhPT0gd2luLnJlYWxXaW5kb3cpIHtcbiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoL1xcL2RlZXBcXC8vZywgJyAnKVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRbYnJvd3Nlci5wcmVmaXhlZE1hdGNoZXNTZWxlY3Rvcl0oc2VsZWN0b3IpXG59XG5cbmNvbnN0IGdldFBhcmVudCA9IGVsID0+IGVsLnBhcmVudE5vZGUgPyBlbC5wYXJlbnROb2RlIDogZWwuaG9zdFxuXG4vLyBUZXN0IGZvciB0aGUgZWxlbWVudCB0aGF0J3MgXCJhYm92ZVwiIGFsbCBvdGhlciBxdWFsaWZpZXJzXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZkRlZXBlc3RFbGVtZW50IChlbGVtZW50czogSW50ZXJhY3QuRWxlbWVudFtdIHwgTm9kZUxpc3RPZjxFbGVtZW50Pikge1xuICBsZXQgZGVlcGVzdFpvbmVQYXJlbnRzID0gW11cbiAgbGV0IGRlZXBlc3Rab25lID0gZWxlbWVudHNbMF1cbiAgbGV0IGluZGV4ID0gZGVlcGVzdFpvbmUgPyAwIDogLTFcbiAgbGV0IGlcbiAgbGV0IG5cblxuICBmb3IgKGkgPSAxOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkcm9wem9uZSA9IGVsZW1lbnRzW2ldXG5cbiAgICAvLyBhbiBlbGVtZW50IG1pZ2h0IGJlbG9uZyB0byBtdWx0aXBsZSBzZWxlY3RvciBkcm9wem9uZXNcbiAgICBpZiAoIWRyb3B6b25lIHx8IGRyb3B6b25lID09PSBkZWVwZXN0Wm9uZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIWRlZXBlc3Rab25lKSB7XG4gICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICBpbmRleCA9IGlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGRlZXBlc3Qgb3IgY3VycmVudCBhcmUgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LnJvb3RFbGVtZW50XG4gICAgLy8gLSBpZiB0aGUgY3VycmVudCBkcm9wem9uZSBpcywgZG8gbm90aGluZyBhbmQgY29udGludWVcbiAgICBpZiAoZHJvcHpvbmUucGFyZW50Tm9kZSA9PT0gZHJvcHpvbmUub3duZXJEb2N1bWVudCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgLy8gLSBpZiBkZWVwZXN0IGlzLCB1cGRhdGUgd2l0aCB0aGUgY3VycmVudCBkcm9wem9uZSBhbmQgY29udGludWUgdG8gbmV4dFxuICAgIGVsc2UgaWYgKGRlZXBlc3Rab25lLnBhcmVudE5vZGUgPT09IGRyb3B6b25lLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIGRlZXBlc3Rab25lID0gZHJvcHpvbmVcbiAgICAgIGluZGV4ID0gaVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHpJbmRleCBvZiBzaWJsaW5nc1xuICAgIGlmIChkcm9wem9uZS5wYXJlbnROb2RlID09PSBkZWVwZXN0Wm9uZS5wYXJlbnROb2RlKSB7XG4gICAgICBjb25zdCBkZWVwZXN0WkluZGV4ID0gcGFyc2VJbnQoZ2V0V2luZG93KGRlZXBlc3Rab25lKS5nZXRDb21wdXRlZFN0eWxlKGRlZXBlc3Rab25lKS56SW5kZXgsIDEwKSB8fCAwXG4gICAgICBjb25zdCBkcm9wem9uZVpJbmRleCA9IHBhcnNlSW50KGdldFdpbmRvdyhkcm9wem9uZSkuZ2V0Q29tcHV0ZWRTdHlsZShkcm9wem9uZSkuekluZGV4LCAxMCkgfHwgMFxuXG4gICAgICBpZiAoZHJvcHpvbmVaSW5kZXggPj0gZGVlcGVzdFpJbmRleCkge1xuICAgICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICAgIGluZGV4ID0gaVxuICAgICAgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIHBvcHVsYXRlIHRoZSBhbmNlc3RyeSBhcnJheSBmb3IgdGhlIGxhdGVzdCBkZWVwZXN0IGRyb3B6b25lXG4gICAgaWYgKCFkZWVwZXN0Wm9uZVBhcmVudHMubGVuZ3RoKSB7XG4gICAgICBsZXQgcGFyZW50ID0gZGVlcGVzdFpvbmVcbiAgICAgIGxldCBwYXJlbnRQYXJlbnRcblxuICAgICAgd2hpbGUgKChwYXJlbnRQYXJlbnQgPSBnZXRQYXJlbnQocGFyZW50KSkgJiYgcGFyZW50UGFyZW50ICE9PSBwYXJlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgICBkZWVwZXN0Wm9uZVBhcmVudHMudW5zaGlmdChwYXJlbnQpXG4gICAgICAgIHBhcmVudCA9IHBhcmVudFBhcmVudFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwYXJlbnRcblxuICAgIC8vIGlmIHRoaXMgZWxlbWVudCBpcyBhbiBzdmcgZWxlbWVudCBhbmQgdGhlIGN1cnJlbnQgZGVlcGVzdCBpcyBhblxuICAgIC8vIEhUTUxFbGVtZW50XG4gICAgaWYgKGRlZXBlc3Rab25lIGluc3RhbmNlb2YgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAmJlxuICAgICAgICBkcm9wem9uZSBpbnN0YW5jZW9mIGRvbU9iamVjdHMuU1ZHRWxlbWVudCAmJlxuICAgICAgICAhKGRyb3B6b25lIGluc3RhbmNlb2YgZG9tT2JqZWN0cy5TVkdTVkdFbGVtZW50KSkge1xuICAgICAgaWYgKGRyb3B6b25lID09PSBkZWVwZXN0Wm9uZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IGRyb3B6b25lLm93bmVyU1ZHRWxlbWVudFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHBhcmVudCA9IGRyb3B6b25lXG4gICAgfVxuXG4gICAgY29uc3QgZHJvcHpvbmVQYXJlbnRzID0gW11cblxuICAgIHdoaWxlIChwYXJlbnQucGFyZW50Tm9kZSAhPT0gcGFyZW50Lm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIGRyb3B6b25lUGFyZW50cy51bnNoaWZ0KHBhcmVudClcbiAgICAgIHBhcmVudCA9IGdldFBhcmVudChwYXJlbnQpXG4gICAgfVxuXG4gICAgbiA9IDBcblxuICAgIC8vIGdldCAocG9zaXRpb24gb2YgbGFzdCBjb21tb24gYW5jZXN0b3IpICsgMVxuICAgIHdoaWxlIChkcm9wem9uZVBhcmVudHNbbl0gJiYgZHJvcHpvbmVQYXJlbnRzW25dID09PSBkZWVwZXN0Wm9uZVBhcmVudHNbbl0pIHtcbiAgICAgIG4rK1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudHMgPSBbXG4gICAgICBkcm9wem9uZVBhcmVudHNbbiAtIDFdLFxuICAgICAgZHJvcHpvbmVQYXJlbnRzW25dLFxuICAgICAgZGVlcGVzdFpvbmVQYXJlbnRzW25dLFxuICAgIF1cblxuICAgIGxldCBjaGlsZCA9IHBhcmVudHNbMF0ubGFzdENoaWxkXG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZCA9PT0gcGFyZW50c1sxXSkge1xuICAgICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICAgIGluZGV4ID0gaVxuICAgICAgICBkZWVwZXN0Wm9uZVBhcmVudHMgPSBkcm9wem9uZVBhcmVudHNcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoY2hpbGQgPT09IHBhcmVudHNbMl0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmdcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5kZXhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNVcFRvIChlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nLCBsaW1pdDogTm9kZSkge1xuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIGlmIChtYXRjaGVzU2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGVsZW1lbnQgPSBwYXJlbnROb2RlKGVsZW1lbnQpIGFzIEludGVyYWN0LkVsZW1lbnRcblxuICAgIGlmIChlbGVtZW50ID09PSBsaW1pdCkge1xuICAgICAgcmV0dXJuIG1hdGNoZXNTZWxlY3RvcihlbGVtZW50LCBzZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdHVhbEVsZW1lbnQgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpIHtcbiAgcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgZG9tT2JqZWN0cy5TVkdFbGVtZW50SW5zdGFuY2VcbiAgICA/IChlbGVtZW50IGFzIFNWR0VsZW1lbnQpLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50XG4gICAgOiBlbGVtZW50KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Nyb2xsWFkgKHJlbGV2YW50V2luZG93KSB7XG4gIHJlbGV2YW50V2luZG93ID0gcmVsZXZhbnRXaW5kb3cgfHwgd2luLndpbmRvd1xuICByZXR1cm4ge1xuICAgIHg6IHJlbGV2YW50V2luZG93LnNjcm9sbFggfHwgcmVsZXZhbnRXaW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgeTogcmVsZXZhbnRXaW5kb3cuc2Nyb2xsWSB8fCByZWxldmFudFdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50Q2xpZW50UmVjdCAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICBjb25zdCBjbGllbnRSZWN0ID0gKGVsZW1lbnQgaW5zdGFuY2VvZiBkb21PYmplY3RzLlNWR0VsZW1lbnRcbiAgICA/IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICA6IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKVswXSlcblxuICByZXR1cm4gY2xpZW50UmVjdCAmJiB7XG4gICAgbGVmdCAgOiBjbGllbnRSZWN0LmxlZnQsXG4gICAgcmlnaHQgOiBjbGllbnRSZWN0LnJpZ2h0LFxuICAgIHRvcCAgIDogY2xpZW50UmVjdC50b3AsXG4gICAgYm90dG9tOiBjbGllbnRSZWN0LmJvdHRvbSxcbiAgICB3aWR0aCA6IGNsaWVudFJlY3Qud2lkdGggIHx8IGNsaWVudFJlY3QucmlnaHQgIC0gY2xpZW50UmVjdC5sZWZ0LFxuICAgIGhlaWdodDogY2xpZW50UmVjdC5oZWlnaHQgfHwgY2xpZW50UmVjdC5ib3R0b20gLSBjbGllbnRSZWN0LnRvcCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudFJlY3QgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpIHtcbiAgY29uc3QgY2xpZW50UmVjdCA9IGdldEVsZW1lbnRDbGllbnRSZWN0KGVsZW1lbnQpXG5cbiAgaWYgKCFicm93c2VyLmlzSU9TNyAmJiBjbGllbnRSZWN0KSB7XG4gICAgY29uc3Qgc2Nyb2xsID0gZ2V0U2Nyb2xsWFkod2luLmdldFdpbmRvdyhlbGVtZW50KSlcblxuICAgIGNsaWVudFJlY3QubGVmdCAgICs9IHNjcm9sbC54XG4gICAgY2xpZW50UmVjdC5yaWdodCAgKz0gc2Nyb2xsLnhcbiAgICBjbGllbnRSZWN0LnRvcCAgICArPSBzY3JvbGwueVxuICAgIGNsaWVudFJlY3QuYm90dG9tICs9IHNjcm9sbC55XG4gIH1cblxuICByZXR1cm4gY2xpZW50UmVjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aCAobm9kZTogTm9kZSB8IERvY3VtZW50KSB7XG4gIGNvbnN0IHBhdGggPSBbXVxuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgcGF0aC5wdXNoKG5vZGUpXG4gICAgbm9kZSA9IHBhcmVudE5vZGUobm9kZSlcbiAgfVxuXG4gIHJldHVybiBwYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlTZWxlY3RvciAodmFsdWUpIHtcbiAgaWYgKCFpcy5zdHJpbmcodmFsdWUpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGlmIGl0IGlzIGludmFsaWRcbiAgZG9tT2JqZWN0cy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHZhbHVlKVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBQb2ludGVyRXh0ZW5kIHtcbiAgd2Via2l0OiBSZWdFeHBcbiAgW3ByZWZpeDogc3RyaW5nXTogUmVnRXhwXG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJFeHRlbmQgKGRlc3QsIHNvdXJjZSkge1xuICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgY29uc3QgcHJlZml4ZWRQcm9wUkVzID0gcG9pbnRlckV4dGVuZC5wcmVmaXhlZFByb3BSRXNcbiAgICBsZXQgZGVwcmVjYXRlZCA9IGZhbHNlXG5cbiAgICAvLyBza2lwIGRlcHJlY2F0ZWQgcHJlZml4ZWQgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3QgdmVuZG9yIGluIHByZWZpeGVkUHJvcFJFcykge1xuICAgICAgaWYgKHByb3AuaW5kZXhPZih2ZW5kb3IpID09PSAwICYmIHByZWZpeGVkUHJvcFJFc1t2ZW5kb3JdLnRlc3QocHJvcCkpIHtcbiAgICAgICAgZGVwcmVjYXRlZCA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWRlcHJlY2F0ZWQgJiYgdHlwZW9mIHNvdXJjZVtwcm9wXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVzdFtwcm9wXSA9IHNvdXJjZVtwcm9wXVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdFxufVxuXG5wb2ludGVyRXh0ZW5kLnByZWZpeGVkUHJvcFJFcyA9IHtcbiAgd2Via2l0OiAvKE1vdmVtZW50W1hZXXxSYWRpdXNbWFldfFJvdGF0aW9uQW5nbGV8Rm9yY2UpJC8sXG4gIG1vejogLyhQcmVzc3VyZSkkLyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcG9pbnRlckV4dGVuZFxuIiwiZXhwb3J0IGRlZmF1bHQgKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiAgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpXG4iLCJpbXBvcnQgYnJvd3NlciBmcm9tICcuL2Jyb3dzZXInXG5pbXBvcnQgZG9tIGZyb20gJy4vZG9tT2JqZWN0cydcbmltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJy4vZG9tVXRpbHMnXG5pbXBvcnQgaHlwb3QgZnJvbSAnLi9oeXBvdCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5pbXBvcnQgcG9pbnRlckV4dGVuZCBmcm9tICcuL3BvaW50ZXJFeHRlbmQnXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5Q29vcmRzIChkZXN0OiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIsIHNyYzogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIGRlc3QucGFnZSA9IGRlc3QucGFnZSB8fCB7fSBhcyBhbnlcbiAgZGVzdC5wYWdlLnggPSBzcmMucGFnZS54XG4gIGRlc3QucGFnZS55ID0gc3JjLnBhZ2UueVxuXG4gIGRlc3QuY2xpZW50ID0gZGVzdC5jbGllbnQgfHwge30gYXMgYW55XG4gIGRlc3QuY2xpZW50LnggPSBzcmMuY2xpZW50LnhcbiAgZGVzdC5jbGllbnQueSA9IHNyYy5jbGllbnQueVxuXG4gIGRlc3QudGltZVN0YW1wID0gc3JjLnRpbWVTdGFtcFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29vcmREZWx0YXMgKHRhcmdldE9iajogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyLCBwcmV2OiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIsIGN1cjogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIHRhcmdldE9iai5wYWdlLnggICAgPSBjdXIucGFnZS54ICAgIC0gcHJldi5wYWdlLnhcbiAgdGFyZ2V0T2JqLnBhZ2UueSAgICA9IGN1ci5wYWdlLnkgICAgLSBwcmV2LnBhZ2UueVxuICB0YXJnZXRPYmouY2xpZW50LnggID0gY3VyLmNsaWVudC54ICAtIHByZXYuY2xpZW50LnhcbiAgdGFyZ2V0T2JqLmNsaWVudC55ICA9IGN1ci5jbGllbnQueSAgLSBwcmV2LmNsaWVudC55XG4gIHRhcmdldE9iai50aW1lU3RhbXAgPSBjdXIudGltZVN0YW1wIC0gcHJldi50aW1lU3RhbXBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb3JkVmVsb2NpdHkgKHRhcmdldE9iajogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyLCBkZWx0YTogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIGNvbnN0IGR0ID0gTWF0aC5tYXgoZGVsdGEudGltZVN0YW1wIC8gMTAwMCwgMC4wMDEpXG5cbiAgdGFyZ2V0T2JqLnBhZ2UueCAgID0gZGVsdGEucGFnZS54IC8gZHRcbiAgdGFyZ2V0T2JqLnBhZ2UueSAgID0gZGVsdGEucGFnZS55IC8gZHRcbiAgdGFyZ2V0T2JqLmNsaWVudC54ID0gZGVsdGEuY2xpZW50LnggLyBkdFxuICB0YXJnZXRPYmouY2xpZW50LnkgPSBkZWx0YS5jbGllbnQueSAvIGR0XG4gIHRhcmdldE9iai50aW1lU3RhbXAgPSBkdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0WmVyb0Nvb3JkcyAodGFyZ2V0T2JqOiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIpIHtcbiAgdGFyZ2V0T2JqLnBhZ2UueCA9IDBcbiAgdGFyZ2V0T2JqLnBhZ2UueSA9IDBcbiAgdGFyZ2V0T2JqLmNsaWVudC54ID0gMFxuICB0YXJnZXRPYmouY2xpZW50LnkgPSAwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05hdGl2ZVBvaW50ZXIgIChwb2ludGVyOiBhbnkpIHtcbiAgcmV0dXJuIChwb2ludGVyIGluc3RhbmNlb2YgZG9tLkV2ZW50IHx8IHBvaW50ZXIgaW5zdGFuY2VvZiBkb20uVG91Y2gpXG59XG5cbi8vIEdldCBzcGVjaWZpZWQgWC9ZIGNvb3JkcyBmb3IgbW91c2Ugb3IgZXZlbnQudG91Y2hlc1swXVxuZXhwb3J0IGZ1bmN0aW9uIGdldFhZICh0eXBlLCBwb2ludGVyLCB4eSkge1xuICB4eSA9IHh5IHx8IHt9XG4gIHR5cGUgPSB0eXBlIHx8ICdwYWdlJ1xuXG4gIHh5LnggPSBwb2ludGVyW3R5cGUgKyAnWCddXG4gIHh5LnkgPSBwb2ludGVyW3R5cGUgKyAnWSddXG5cbiAgcmV0dXJuIHh5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdlWFkgKHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIHwgSW50ZXJhY3QuSW50ZXJhY3RFdmVudCwgcGFnZT86IEludGVyYWN0LlBvaW50KSB7XG4gIHBhZ2UgPSBwYWdlIHx8IHsgeDogMCwgeTogMCB9XG5cbiAgLy8gT3BlcmEgTW9iaWxlIGhhbmRsZXMgdGhlIHZpZXdwb3J0IGFuZCBzY3JvbGxpbmcgb2RkbHlcbiAgaWYgKGJyb3dzZXIuaXNPcGVyYU1vYmlsZSAmJiBpc05hdGl2ZVBvaW50ZXIocG9pbnRlcikpIHtcbiAgICBnZXRYWSgnc2NyZWVuJywgcG9pbnRlciwgcGFnZSlcblxuICAgIHBhZ2UueCArPSB3aW5kb3cuc2Nyb2xsWFxuICAgIHBhZ2UueSArPSB3aW5kb3cuc2Nyb2xsWVxuICB9XG4gIGVsc2Uge1xuICAgIGdldFhZKCdwYWdlJywgcG9pbnRlciwgcGFnZSlcbiAgfVxuXG4gIHJldHVybiBwYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGllbnRYWSAocG9pbnRlciwgY2xpZW50KSB7XG4gIGNsaWVudCA9IGNsaWVudCB8fCB7fVxuXG4gIGlmIChicm93c2VyLmlzT3BlcmFNb2JpbGUgJiYgaXNOYXRpdmVQb2ludGVyKHBvaW50ZXIpKSB7XG4gICAgLy8gT3BlcmEgTW9iaWxlIGhhbmRsZXMgdGhlIHZpZXdwb3J0IGFuZCBzY3JvbGxpbmcgb2RkbHlcbiAgICBnZXRYWSgnc2NyZWVuJywgcG9pbnRlciwgY2xpZW50KVxuICB9XG4gIGVsc2Uge1xuICAgIGdldFhZKCdjbGllbnQnLCBwb2ludGVyLCBjbGllbnQpXG4gIH1cblxuICByZXR1cm4gY2xpZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludGVySWQgKHBvaW50ZXIpIHtcbiAgcmV0dXJuIGlzLm51bWJlcihwb2ludGVyLnBvaW50ZXJJZCkgPyBwb2ludGVyLnBvaW50ZXJJZCA6IHBvaW50ZXIuaWRlbnRpZmllclxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29vcmRzICh0YXJnZXRPYmosIHBvaW50ZXJzOiBhbnlbXSwgdGltZVN0YW1wOiBudW1iZXIpIHtcbiAgY29uc3QgcG9pbnRlciA9IChwb2ludGVycy5sZW5ndGggPiAxXG4gICAgPyBwb2ludGVyQXZlcmFnZShwb2ludGVycylcbiAgICA6IHBvaW50ZXJzWzBdKVxuXG4gIGNvbnN0IHRtcFhZID0ge30gYXMgeyB4OiBudW1iZXIsIHk6IG51bWJlciB9XG5cbiAgZ2V0UGFnZVhZKHBvaW50ZXIsIHRtcFhZKVxuICB0YXJnZXRPYmoucGFnZS54ID0gdG1wWFkueFxuICB0YXJnZXRPYmoucGFnZS55ID0gdG1wWFkueVxuXG4gIGdldENsaWVudFhZKHBvaW50ZXIsIHRtcFhZKVxuICB0YXJnZXRPYmouY2xpZW50LnggPSB0bXBYWS54XG4gIHRhcmdldE9iai5jbGllbnQueSA9IHRtcFhZLnlcblxuICB0YXJnZXRPYmoudGltZVN0YW1wID0gdGltZVN0YW1wXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaFBhaXIgKGV2ZW50KSB7XG4gIGNvbnN0IHRvdWNoZXMgPSBbXVxuXG4gIC8vIGFycmF5IG9mIHRvdWNoZXMgaXMgc3VwcGxpZWRcbiAgaWYgKGlzLmFycmF5KGV2ZW50KSkge1xuICAgIHRvdWNoZXNbMF0gPSBldmVudFswXVxuICAgIHRvdWNoZXNbMV0gPSBldmVudFsxXVxuICB9XG4gIC8vIGFuIGV2ZW50XG4gIGVsc2Uge1xuICAgIGlmIChldmVudC50eXBlID09PSAndG91Y2hlbmQnKSB7XG4gICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdG91Y2hlc1swXSA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgICAgdG91Y2hlc1sxXSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0b3VjaGVzWzBdID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgICAgdG91Y2hlc1sxXSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzFdXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdG91Y2hlc1swXSA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgIHRvdWNoZXNbMV0gPSBldmVudC50b3VjaGVzWzFdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdWNoZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50ZXJBdmVyYWdlIChwb2ludGVyczogUG9pbnRlckV2ZW50W10gfCBFdmVudFtdKSB7XG4gIGNvbnN0IGF2ZXJhZ2UgPSB7XG4gICAgcGFnZVggIDogMCxcbiAgICBwYWdlWSAgOiAwLFxuICAgIGNsaWVudFg6IDAsXG4gICAgY2xpZW50WTogMCxcbiAgICBzY3JlZW5YOiAwLFxuICAgIHNjcmVlblk6IDAsXG4gIH1cblxuICBmb3IgKGNvbnN0IHBvaW50ZXIgb2YgcG9pbnRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gYXZlcmFnZSkge1xuICAgICAgYXZlcmFnZVtwcm9wXSArPSBwb2ludGVyW3Byb3BdXG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgcHJvcCBpbiBhdmVyYWdlKSB7XG4gICAgYXZlcmFnZVtwcm9wXSAvPSBwb2ludGVycy5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiBhdmVyYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b3VjaEJCb3ggKGV2ZW50OiBFdmVudCB8IEFycmF5PChJbnRlcmFjdC5Qb2ludGVyVHlwZSkgfCBUb3VjaEV2ZW50Pikge1xuICBpZiAoIShldmVudCBhcyBhbnkpLmxlbmd0aCAmJlxuICAgICAgISgoZXZlbnQgYXMgVG91Y2hFdmVudCkudG91Y2hlcyAmJlxuICAgICAgICAoZXZlbnQgYXMgVG91Y2hFdmVudCkudG91Y2hlcy5sZW5ndGggPiAxKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB0b3VjaGVzID0gZ2V0VG91Y2hQYWlyKGV2ZW50KVxuICBjb25zdCBtaW5YID0gTWF0aC5taW4odG91Y2hlc1swXS5wYWdlWCwgdG91Y2hlc1sxXS5wYWdlWClcbiAgY29uc3QgbWluWSA9IE1hdGgubWluKHRvdWNoZXNbMF0ucGFnZVksIHRvdWNoZXNbMV0ucGFnZVkpXG4gIGNvbnN0IG1heFggPSBNYXRoLm1heCh0b3VjaGVzWzBdLnBhZ2VYLCB0b3VjaGVzWzFdLnBhZ2VYKVxuICBjb25zdCBtYXhZID0gTWF0aC5tYXgodG91Y2hlc1swXS5wYWdlWSwgdG91Y2hlc1sxXS5wYWdlWSlcblxuICByZXR1cm4ge1xuICAgIHg6IG1pblgsXG4gICAgeTogbWluWSxcbiAgICBsZWZ0OiBtaW5YLFxuICAgIHRvcDogbWluWSxcbiAgICByaWdodDogbWF4WCxcbiAgICBib3R0b206IG1heFksXG4gICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoRGlzdGFuY2UgKGV2ZW50LCBkZWx0YVNvdXJjZSkge1xuICBjb25zdCBzb3VyY2VYID0gZGVsdGFTb3VyY2UgKyAnWCdcbiAgY29uc3Qgc291cmNlWSA9IGRlbHRhU291cmNlICsgJ1knXG4gIGNvbnN0IHRvdWNoZXMgPSBnZXRUb3VjaFBhaXIoZXZlbnQpXG5cbiAgY29uc3QgZHggPSB0b3VjaGVzWzBdW3NvdXJjZVhdIC0gdG91Y2hlc1sxXVtzb3VyY2VYXVxuICBjb25zdCBkeSA9IHRvdWNoZXNbMF1bc291cmNlWV0gLSB0b3VjaGVzWzFdW3NvdXJjZVldXG5cbiAgcmV0dXJuIGh5cG90KGR4LCBkeSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoQW5nbGUgKGV2ZW50LCBkZWx0YVNvdXJjZSkge1xuICBjb25zdCBzb3VyY2VYID0gZGVsdGFTb3VyY2UgKyAnWCdcbiAgY29uc3Qgc291cmNlWSA9IGRlbHRhU291cmNlICsgJ1knXG4gIGNvbnN0IHRvdWNoZXMgPSBnZXRUb3VjaFBhaXIoZXZlbnQpXG4gIGNvbnN0IGR4ID0gdG91Y2hlc1sxXVtzb3VyY2VYXSAtIHRvdWNoZXNbMF1bc291cmNlWF1cbiAgY29uc3QgZHkgPSB0b3VjaGVzWzFdW3NvdXJjZVldIC0gdG91Y2hlc1swXVtzb3VyY2VZXVxuICBjb25zdCBhbmdsZSA9IDE4MCAqIE1hdGguYXRhbjIoZHksIGR4KSAvIE1hdGguUElcblxuICByZXR1cm4gIGFuZ2xlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludGVyVHlwZSAocG9pbnRlcikge1xuICByZXR1cm4gaXMuc3RyaW5nKHBvaW50ZXIucG9pbnRlclR5cGUpXG4gICAgPyBwb2ludGVyLnBvaW50ZXJUeXBlXG4gICAgOiBpcy5udW1iZXIocG9pbnRlci5wb2ludGVyVHlwZSlcbiAgICAgID8gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAndG91Y2gnLCAncGVuJywgJ21vdXNlJ11bcG9pbnRlci5wb2ludGVyVHlwZV1cbiAgICAgIC8vIGlmIHRoZSBQb2ludGVyRXZlbnQgQVBJIGlzbid0IGF2YWlsYWJsZSwgdGhlbiB0aGUgXCJwb2ludGVyXCIgbXVzdFxuICAgICAgLy8gYmUgZWl0aGVyIGEgTW91c2VFdmVudCwgVG91Y2hFdmVudCwgb3IgVG91Y2ggb2JqZWN0XG4gICAgICA6IC90b3VjaC8udGVzdChwb2ludGVyLnR5cGUpIHx8IHBvaW50ZXIgaW5zdGFuY2VvZiBkb20uVG91Y2hcbiAgICAgICAgPyAndG91Y2gnXG4gICAgICAgIDogJ21vdXNlJ1xufVxuXG4vLyBbIGV2ZW50LnRhcmdldCwgZXZlbnQuY3VycmVudFRhcmdldCBdXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXRzIChldmVudCkge1xuICBjb25zdCBwYXRoID0gaXMuZnVuYyhldmVudC5jb21wb3NlZFBhdGgpID8gZXZlbnQuY29tcG9zZWRQYXRoKCkgOiBldmVudC5wYXRoXG5cbiAgcmV0dXJuIFtcbiAgICBkb21VdGlscy5nZXRBY3R1YWxFbGVtZW50KHBhdGggPyBwYXRoWzBdIDogZXZlbnQudGFyZ2V0KSxcbiAgICBkb21VdGlscy5nZXRBY3R1YWxFbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQpLFxuICBdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdDb29yZHMgKCk6IEludGVyYWN0LkNvb3Jkc1NldE1lbWJlciB7XG4gIHJldHVybiB7XG4gICAgcGFnZSAgICAgOiB7IHg6IDAsIHk6IDAgfSxcbiAgICBjbGllbnQgICA6IHsgeDogMCwgeTogMCB9LFxuICAgIHRpbWVTdGFtcDogMCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29vcmRzVG9FdmVudCAoY29vcmRzOiBNb2NrQ29vcmRzKSB7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIGNvb3JkcyxcbiAgICBnZXQgcGFnZSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5wYWdlIH0sXG4gICAgZ2V0IGNsaWVudCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5jbGllbnQgfSxcbiAgICBnZXQgdGltZVN0YW1wICgpIHsgcmV0dXJuIHRoaXMuY29vcmRzLnRpbWVTdGFtcCB9LFxuICAgIGdldCBwYWdlWCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5wYWdlLnggfSxcbiAgICBnZXQgcGFnZVkgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMucGFnZS55IH0sXG4gICAgZ2V0IGNsaWVudFggKCkgeyByZXR1cm4gdGhpcy5jb29yZHMuY2xpZW50LnggfSxcbiAgICBnZXQgY2xpZW50WSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5jbGllbnQueSB9LFxuICAgIGdldCBwb2ludGVySWQgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMucG9pbnRlcklkIH0sXG4gICAgZ2V0IHRhcmdldCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy50YXJnZXQgfSxcbiAgICBnZXQgdHlwZSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy50eXBlIH0sXG4gICAgZ2V0IHBvaW50ZXJUeXBlICgpIHsgcmV0dXJuIHRoaXMuY29vcmRzLnBvaW50ZXJUeXBlIH0sXG4gICAgZ2V0IGJ1dHRvbnMgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMuYnV0dG9ucyB9LFxuICAgIHByZXZlbnREZWZhdWx0ICgpIHt9LFxuICB9XG5cbiAgcmV0dXJuIGV2ZW50IGFzIHR5cGVvZiBldmVudCAmIEludGVyYWN0LlBvaW50ZXJUeXBlICYgSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vY2tDb29yZHMge1xuICBwYWdlOiBJbnRlcmFjdC5Qb2ludFxuICBjbGllbnQ6IEludGVyYWN0LlBvaW50XG4gIHRpbWVTdGFtcD86IG51bWJlclxuICBwb2ludGVySWQ/OiBhbnlcbiAgdGFyZ2V0PzogYW55XG4gIHR5cGU/OiBzdHJpbmdcbiAgcG9pbnRlclR5cGU/OiBzdHJpbmdcbiAgYnV0dG9ucz86IG51bWJlclxufVxuXG5leHBvcnQgeyBwb2ludGVyRXh0ZW5kIH1cbiIsImltcG9ydCB7IGNvbnRhaW5zIH0gZnJvbSAnLi9hcnInXG5pbXBvcnQgKiBhcyBkb21VdGlscyBmcm9tICcuL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCBwRXh0ZW5kIGZyb20gJy4vcG9pbnRlckV4dGVuZCdcbmltcG9ydCAqIGFzIHBvaW50ZXJVdGlscyBmcm9tICcuL3BvaW50ZXJVdGlscydcblxudHlwZSBMaXN0ZW5lciA9IChldmVudDogRXZlbnQgfCBGYWtlRXZlbnQpID0+IGFueVxuXG5jb25zdCBlbGVtZW50czogRXZlbnRUYXJnZXRbXSA9IFtdXG5jb25zdCB0YXJnZXRzOiBBcnJheTx7XG4gIGV2ZW50czogeyBbdHlwZTogc3RyaW5nXTogTGlzdGVuZXJbXSB9XG4gIHR5cGVDb3VudDogbnVtYmVyXG59PiA9IFtdXG5cbmNvbnN0IGRlbGVnYXRlZEV2ZW50czoge1xuICBbdHlwZTogc3RyaW5nXToge1xuICAgIHNlbGVjdG9yczogc3RyaW5nW11cbiAgICBjb250ZXh0czogTm9kZVtdXG4gICAgbGlzdGVuZXJzOiBBcnJheTxBcnJheTxbTGlzdGVuZXIsIGJvb2xlYW4sIGJvb2xlYW5dPj5cbiAgfVxufSA9IHt9XG5jb25zdCBkb2N1bWVudHM6IERvY3VtZW50W10gPSBbXVxuXG5mdW5jdGlvbiBhZGQgKGVsZW1lbnQ6IEV2ZW50VGFyZ2V0LCB0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgb3B0aW9uYWxBcmc/OiBib29sZWFuIHwgYW55KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbmFsQXJnKVxuICBsZXQgZWxlbWVudEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KVxuICBsZXQgdGFyZ2V0ID0gdGFyZ2V0c1tlbGVtZW50SW5kZXhdXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0YXJnZXQgPSB7XG4gICAgICBldmVudHM6IHt9LFxuICAgICAgdHlwZUNvdW50OiAwLFxuICAgIH1cblxuICAgIGVsZW1lbnRJbmRleCA9IGVsZW1lbnRzLnB1c2goZWxlbWVudCkgLSAxXG4gICAgdGFyZ2V0cy5wdXNoKHRhcmdldClcbiAgfVxuXG4gIGlmICghdGFyZ2V0LmV2ZW50c1t0eXBlXSkge1xuICAgIHRhcmdldC5ldmVudHNbdHlwZV0gPSBbXVxuICAgIHRhcmdldC50eXBlQ291bnQrK1xuICB9XG5cbiAgaWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciAmJiAhY29udGFpbnModGFyZ2V0LmV2ZW50c1t0eXBlXSwgbGlzdGVuZXIpKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyIGFzIGFueSwgZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZSlcbiAgICB0YXJnZXQuZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlIChlbGVtZW50OiBFdmVudFRhcmdldCwgdHlwZTogc3RyaW5nLCBsaXN0ZW5lcj86ICdhbGwnIHwgTGlzdGVuZXIsIG9wdGlvbmFsQXJnPzogYm9vbGVhbiB8IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgY29uc3QgZWxlbWVudEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KVxuICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzW2VsZW1lbnRJbmRleF1cblxuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmV2ZW50cykge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdhbGwnKSB7XG4gICAgZm9yICh0eXBlIGluIHRhcmdldC5ldmVudHMpIHtcbiAgICAgIGlmICh0YXJnZXQuZXZlbnRzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICAgIHJlbW92ZShlbGVtZW50LCB0eXBlLCAnYWxsJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGFyZ2V0LmV2ZW50c1t0eXBlXSkge1xuICAgIGNvbnN0IGxlbiA9IHRhcmdldC5ldmVudHNbdHlwZV0ubGVuZ3RoXG5cbiAgICBpZiAobGlzdGVuZXIgPT09ICdhbGwnKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHJlbW92ZShlbGVtZW50LCB0eXBlLCB0YXJnZXQuZXZlbnRzW3R5cGVdW2ldLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyICYmIHRhcmdldC5ldmVudHNbdHlwZV1baV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyIGFzIGFueSwgZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICB0YXJnZXQuZXZlbnRzW3R5cGVdLnNwbGljZShpLCAxKVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YXJnZXQuZXZlbnRzW3R5cGVdICYmIHRhcmdldC5ldmVudHNbdHlwZV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAodGFyZ2V0LmV2ZW50c1t0eXBlXSBhcyBhbnkpID0gbnVsbFxuICAgICAgdGFyZ2V0LnR5cGVDb3VudC0tXG4gICAgfVxuICB9XG5cbiAgaWYgKCF0YXJnZXQudHlwZUNvdW50KSB7XG4gICAgdGFyZ2V0cy5zcGxpY2UoZWxlbWVudEluZGV4LCAxKVxuICAgIGVsZW1lbnRzLnNwbGljZShlbGVtZW50SW5kZXgsIDEpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGVsZWdhdGUgKHNlbGVjdG9yOiBzdHJpbmcsIGNvbnRleHQ6IE5vZGUsIHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IExpc3RlbmVyLCBvcHRpb25hbEFyZz86IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgaWYgKCFkZWxlZ2F0ZWRFdmVudHNbdHlwZV0pIHtcbiAgICBkZWxlZ2F0ZWRFdmVudHNbdHlwZV0gPSB7XG4gICAgICBjb250ZXh0cyA6IFtdLFxuICAgICAgbGlzdGVuZXJzOiBbXSxcbiAgICAgIHNlbGVjdG9yczogW10sXG4gICAgfVxuXG4gICAgLy8gYWRkIGRlbGVnYXRlIGxpc3RlbmVyIGZ1bmN0aW9uc1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3VtZW50cykge1xuICAgICAgYWRkKGRvYywgdHlwZSwgZGVsZWdhdGVMaXN0ZW5lcilcbiAgICAgIGFkZChkb2MsIHR5cGUsIGRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWxlZ2F0ZWQgPSBkZWxlZ2F0ZWRFdmVudHNbdHlwZV1cbiAgbGV0IGluZGV4XG5cbiAgZm9yIChpbmRleCA9IGRlbGVnYXRlZC5zZWxlY3RvcnMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzW2luZGV4XSA9PT0gc2VsZWN0b3IgJiZcbiAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzW2luZGV4XSA9PT0gY29udGV4dCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgaW5kZXggPSBkZWxlZ2F0ZWQuc2VsZWN0b3JzLmxlbmd0aFxuXG4gICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5wdXNoKHNlbGVjdG9yKVxuICAgIGRlbGVnYXRlZC5jb250ZXh0cy5wdXNoKGNvbnRleHQpXG4gICAgZGVsZWdhdGVkLmxpc3RlbmVycy5wdXNoKFtdKVxuICB9XG5cbiAgLy8ga2VlcCBsaXN0ZW5lciBhbmQgY2FwdHVyZSBhbmQgcGFzc2l2ZSBmbGFnc1xuICBkZWxlZ2F0ZWQubGlzdGVuZXJzW2luZGV4XS5wdXNoKFtsaXN0ZW5lciwgISFvcHRpb25zLmNhcHR1cmUsIG9wdGlvbnMucGFzc2l2ZV0pXG59XG5cbmZ1bmN0aW9uIHJlbW92ZURlbGVnYXRlIChcbiAgc2VsZWN0b3I6IHN0cmluZyxcbiAgY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50LFxuICB0eXBlOiBzdHJpbmcsXG4gIGxpc3RlbmVyPzogTGlzdGVuZXIsXG4gIG9wdGlvbmFsQXJnPzogYW55LFxuKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbmFsQXJnKVxuICBjb25zdCBkZWxlZ2F0ZWQgPSBkZWxlZ2F0ZWRFdmVudHNbdHlwZV1cbiAgbGV0IG1hdGNoRm91bmQgPSBmYWxzZVxuICBsZXQgaW5kZXhcblxuICBpZiAoIWRlbGVnYXRlZCkgeyByZXR1cm4gfVxuXG4gIC8vIGNvdW50IGZyb20gbGFzdCBpbmRleCBvZiBkZWxlZ2F0ZWQgdG8gMFxuICBmb3IgKGluZGV4ID0gZGVsZWdhdGVkLnNlbGVjdG9ycy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgLy8gbG9vayBmb3IgbWF0Y2hpbmcgc2VsZWN0b3IgYW5kIGNvbnRleHQgTm9kZVxuICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzW2luZGV4XSA9PT0gc2VsZWN0b3IgJiZcbiAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzW2luZGV4XSA9PT0gY29udGV4dCkge1xuICAgICAgY29uc3QgbGlzdGVuZXJzID0gZGVsZWdhdGVkLmxpc3RlbmVyc1tpbmRleF1cblxuICAgICAgLy8gZWFjaCBpdGVtIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkgaXMgYW4gYXJyYXk6IFtmdW5jdGlvbiwgY2FwdHVyZSwgcGFzc2l2ZV1cbiAgICAgIGZvciAobGV0IGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgW2ZuLCBjYXB0dXJlLCBwYXNzaXZlXSA9IGxpc3RlbmVyc1tpXVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBsaXN0ZW5lciBmdW5jdGlvbnMgYW5kIGNhcHR1cmUgYW5kIHBhc3NpdmUgZmxhZ3MgbWF0Y2hcbiAgICAgICAgaWYgKGZuID09PSBsaXN0ZW5lciAmJiBjYXB0dXJlID09PSAhIW9wdGlvbnMuY2FwdHVyZSAmJiBwYXNzaXZlID09PSBvcHRpb25zLnBhc3NpdmUpIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGFycmF5IG9mIGxpc3RlbmVyc1xuICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSlcblxuICAgICAgICAgIC8vIGlmIGFsbCBsaXN0ZW5lcnMgZm9yIHRoaXMgaW50ZXJhY3RhYmxlIGhhdmUgYmVlbiByZW1vdmVkXG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBpbnRlcmFjdGFibGUgZnJvbSB0aGUgZGVsZWdhdGVkIGFycmF5c1xuICAgICAgICAgIGlmICghbGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICBkZWxlZ2F0ZWQuY29udGV4dHMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgZGVsZWdhdGVkLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpXG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBkZWxlZ2F0ZSBmdW5jdGlvbiBmcm9tIGNvbnRleHRcbiAgICAgICAgICAgIHJlbW92ZShjb250ZXh0LCB0eXBlLCBkZWxlZ2F0ZUxpc3RlbmVyKVxuICAgICAgICAgICAgcmVtb3ZlKGNvbnRleHQsIHR5cGUsIGRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBhcnJheXMgaWYgdGhleSBhcmUgZW1wdHlcbiAgICAgICAgICAgIGlmICghZGVsZWdhdGVkLnNlbGVjdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZGVsZWdhdGVkRXZlbnRzW3R5cGVdID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG9ubHkgcmVtb3ZlIG9uZSBsaXN0ZW5lclxuICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hGb3VuZCkgeyBicmVhayB9XG4gICAgfVxuICB9XG59XG5cbi8vIGJvdW5kIHRvIHRoZSBpbnRlcmFjdGFibGUgY29udGV4dCB3aGVuIGEgRE9NIGV2ZW50XG4vLyBsaXN0ZW5lciBpcyBhZGRlZCB0byBhIHNlbGVjdG9yIGludGVyYWN0YWJsZVxuZnVuY3Rpb24gZGVsZWdhdGVMaXN0ZW5lciAoZXZlbnQ6IEV2ZW50LCBvcHRpb25hbEFyZz86IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgY29uc3QgZmFrZUV2ZW50ID0gbmV3IEZha2VFdmVudChldmVudClcbiAgY29uc3QgZGVsZWdhdGVkID0gZGVsZWdhdGVkRXZlbnRzW2V2ZW50LnR5cGVdXG4gIGNvbnN0IFtldmVudFRhcmdldF0gPSAocG9pbnRlclV0aWxzLmdldEV2ZW50VGFyZ2V0cyhldmVudCkpXG4gIGxldCBlbGVtZW50OiBOb2RlID0gZXZlbnRUYXJnZXRcblxuICAvLyBjbGltYiB1cCBkb2N1bWVudCB0cmVlIGxvb2tpbmcgZm9yIHNlbGVjdG9yIG1hdGNoZXNcbiAgd2hpbGUgKGlzLmVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbGVnYXRlZC5zZWxlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gZGVsZWdhdGVkLnNlbGVjdG9yc1tpXVxuICAgICAgY29uc3QgY29udGV4dCA9IGRlbGVnYXRlZC5jb250ZXh0c1tpXVxuXG4gICAgICBpZiAoZG9tVXRpbHMubWF0Y2hlc1NlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKSAmJlxuICAgICAgICAgIGRvbVV0aWxzLm5vZGVDb250YWlucyhjb250ZXh0LCBldmVudFRhcmdldCkgJiZcbiAgICAgICAgICBkb21VdGlscy5ub2RlQ29udGFpbnMoY29udGV4dCwgZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZGVsZWdhdGVkLmxpc3RlbmVyc1tpXVxuXG4gICAgICAgIGZha2VFdmVudC5jdXJyZW50VGFyZ2V0ID0gZWxlbWVudFxuXG4gICAgICAgIGZvciAoY29uc3QgW2ZuLCBjYXB0dXJlLCBwYXNzaXZlXSBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICBpZiAoY2FwdHVyZSA9PT0gISFvcHRpb25zLmNhcHR1cmUgJiYgcGFzc2l2ZSA9PT0gb3B0aW9ucy5wYXNzaXZlKSB7XG4gICAgICAgICAgICBmbihmYWtlRXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGRvbVV0aWxzLnBhcmVudE5vZGUoZWxlbWVudClcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxlZ2F0ZVVzZUNhcHR1cmUgKGV2ZW50OiBFdmVudCkge1xuICByZXR1cm4gZGVsZWdhdGVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50LCB0cnVlKVxufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zIChwYXJhbTogb2JqZWN0KSB7XG4gIHJldHVybiBpcy5vYmplY3QocGFyYW0pID8gcGFyYW0gOiB7IGNhcHR1cmU6IHBhcmFtIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZha2VFdmVudCBpbXBsZW1lbnRzIFBhcnRpYWw8RXZlbnQ+IHtcbiAgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXRcblxuICBjb25zdHJ1Y3RvciAocHVibGljIG9yaWdpbmFsRXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZHVwbGljYXRlIHRoZSBldmVudCBzbyB0aGF0IGN1cnJlbnRUYXJnZXQgY2FuIGJlIGNoYW5nZWRcbiAgICBwRXh0ZW5kKHRoaXMsIG9yaWdpbmFsRXZlbnQpXG4gIH1cblxuICBwcmV2ZW50T3JpZ2luYWxEZWZhdWx0ICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgc3RvcFByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgfVxuXG4gIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiAoKSB7XG4gICAgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gIH1cbn1cblxuY29uc3QgZXZlbnRzID0ge1xuICBhZGQsXG4gIHJlbW92ZSxcblxuICBhZGREZWxlZ2F0ZSxcbiAgcmVtb3ZlRGVsZWdhdGUsXG5cbiAgZGVsZWdhdGVMaXN0ZW5lcixcbiAgZGVsZWdhdGVVc2VDYXB0dXJlLFxuICBkZWxlZ2F0ZWRFdmVudHMsXG4gIGRvY3VtZW50cyxcblxuICBzdXBwb3J0c09wdGlvbnM6IGZhbHNlLFxuICBzdXBwb3J0c1Bhc3NpdmU6IGZhbHNlLFxuXG4gIF9lbGVtZW50czogZWxlbWVudHMsXG4gIF90YXJnZXRzOiB0YXJnZXRzLFxuXG4gIGluaXQgKHdpbmRvdzogV2luZG93KSB7XG4gICAgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCB7XG4gICAgICBnZXQgY2FwdHVyZSAoKSB7IHJldHVybiAoZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA9IHRydWUpIH0sXG4gICAgICBnZXQgcGFzc2l2ZSAoKSB7IHJldHVybiAoZXZlbnRzLnN1cHBvcnRzUGFzc2l2ZSA9IHRydWUpIH0sXG4gICAgfSlcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXZlbnRzXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRlbmQ8VCwgVSBleHRlbmRzIG9iamVjdD4gKGRlc3Q6IFUgJiBQYXJ0aWFsPFQ+LCBzb3VyY2U6IFQpOiBUICYgVSB7XG4gIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAoZGVzdCBhcyB1bmtub3duIGFzIFQpW3Byb3BdID0gc291cmNlW3Byb3BdXG4gIH1cblxuICBjb25zdCByZXQgPSBkZXN0IGFzIFQgJiBVXG5cbiAgcmV0dXJuIHJldFxufVxuIiwiaW1wb3J0IGV4dGVuZCBmcm9tICcuL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZExpc3RlbmVycyB7XG4gIFt0eXBlOiBzdHJpbmddOiBJbnRlcmFjdC5MaXN0ZW5lcltdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZSAoXG4gIHR5cGU6IEludGVyYWN0LkV2ZW50VHlwZXMsXG4gIGxpc3RlbmVycz86IEludGVyYWN0Lkxpc3RlbmVyc0FyZyB8IEludGVyYWN0Lkxpc3RlbmVyc0FyZ1tdLFxuICByZXN1bHQ/OiBOb3JtYWxpemVkTGlzdGVuZXJzLFxuKTogTm9ybWFsaXplZExpc3RlbmVycyB7XG4gIHJlc3VsdCA9IHJlc3VsdCB8fCB7fVxuXG4gIGlmIChpcy5zdHJpbmcodHlwZSkgJiYgdHlwZS5zZWFyY2goJyAnKSAhPT0gLTEpIHtcbiAgICB0eXBlID0gc3BsaXQodHlwZSlcbiAgfVxuXG4gIGlmIChpcy5hcnJheSh0eXBlKSkge1xuICAgIHJldHVybiB0eXBlLnJlZHVjZTxOb3JtYWxpemVkTGlzdGVuZXJzPihcbiAgICAgIChhY2MsIHQpID0+IGV4dGVuZChhY2MsIG5vcm1hbGl6ZSh0LCBsaXN0ZW5lcnMsIHJlc3VsdCkpLFxuICAgICAgcmVzdWx0LFxuICAgIClcbiAgfVxuXG4gIC8vICh7IHR5cGU6IGZuIH0pIC0+ICgnJywgeyB0eXBlOiBmbiB9KVxuICBpZiAoaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgbGlzdGVuZXJzID0gdHlwZVxuICAgIHR5cGUgPSAnJ1xuICB9XG5cbiAgaWYgKGlzLmZ1bmMobGlzdGVuZXJzKSkge1xuICAgIHJlc3VsdFt0eXBlXSA9IHJlc3VsdFt0eXBlXSB8fCBbXVxuICAgIHJlc3VsdFt0eXBlXS5wdXNoKGxpc3RlbmVycylcbiAgfVxuICBlbHNlIGlmIChpcy5hcnJheShsaXN0ZW5lcnMpKSB7XG4gICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgbm9ybWFsaXplKHR5cGUsIGwsIHJlc3VsdClcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAoaXMub2JqZWN0KGxpc3RlbmVycykpIHtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkVHlwZXMgPSBzcGxpdChwcmVmaXgpLm1hcChwID0+IGAke3R5cGV9JHtwfWApXG5cbiAgICAgIG5vcm1hbGl6ZShjb21iaW5lZFR5cGVzLCBsaXN0ZW5lcnNbcHJlZml4XSwgcmVzdWx0KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgYXMgTm9ybWFsaXplZExpc3RlbmVyc1xufVxuXG5mdW5jdGlvbiBzcGxpdCAodHlwZTogc3RyaW5nKSB7XG4gIHJldHVybiB0eXBlLnRyaW0oKS5zcGxpdCgvICsvKVxufVxuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcbmltcG9ydCBleHRlbmQgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IG5vcm1hbGl6ZSwgeyBOb3JtYWxpemVkTGlzdGVuZXJzIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvbm9ybWFsaXplTGlzdGVuZXJzJ1xuXG5mdW5jdGlvbiBmaXJlVW50aWxJbW1lZGlhdGVTdG9wcGVkPFxuICBUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZSxcbiAgUCBleHRlbmRzIEludGVyYWN0LkV2ZW50UGhhc2UsXG4+IChldmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxULCBQPiwgbGlzdGVuZXJzOiBJbnRlcmFjdC5MaXN0ZW5lcltdKSB7XG4gIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgaWYgKGV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCkgeyBicmVhayB9XG5cbiAgICBsaXN0ZW5lcihldmVudClcbiAgfVxufVxuXG5jbGFzcyBFdmVudGFibGUge1xuICBvcHRpb25zOiBhbnlcbiAgdHlwZXM6IE5vcm1hbGl6ZWRMaXN0ZW5lcnMgPSB7fVxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBnbG9iYWw6IGFueVxuXG4gIGNvbnN0cnVjdG9yIChvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zIHx8IHt9KVxuICB9XG5cbiAgZmlyZSAoZXZlbnQ6IGFueSkge1xuICAgIGxldCBsaXN0ZW5lcnNcbiAgICBjb25zdCBnbG9iYWwgPSB0aGlzLmdsb2JhbFxuXG4gICAgLy8gSW50ZXJhY3RhYmxlI29uKCkgbGlzdGVuZXJzXG4gICAgLy8gdHNsaW50OmRpc2FibGUgbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICAgIGlmICgobGlzdGVuZXJzID0gdGhpcy50eXBlc1tldmVudC50eXBlXSkpIHtcbiAgICAgIGZpcmVVbnRpbEltbWVkaWF0ZVN0b3BwZWQoZXZlbnQsIGxpc3RlbmVycylcbiAgICB9XG5cbiAgICAvLyBpbnRlcmFjdC5vbigpIGxpc3RlbmVyc1xuICAgIGlmICghZXZlbnQucHJvcGFnYXRpb25TdG9wcGVkICYmIGdsb2JhbCAmJiAobGlzdGVuZXJzID0gZ2xvYmFsW2V2ZW50LnR5cGVdKSkgIHtcbiAgICAgIGZpcmVVbnRpbEltbWVkaWF0ZVN0b3BwZWQoZXZlbnQsIGxpc3RlbmVycylcbiAgICB9XG4gIH1cblxuICBvbiAodHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogSW50ZXJhY3QuTGlzdGVuZXJzQXJnKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gbm9ybWFsaXplKHR5cGUsIGxpc3RlbmVyKVxuXG4gICAgZm9yICh0eXBlIGluIGxpc3RlbmVycykge1xuICAgICAgdGhpcy50eXBlc1t0eXBlXSA9IGFyci5tZXJnZSh0aGlzLnR5cGVzW3R5cGVdIHx8IFtdLCBsaXN0ZW5lcnNbdHlwZV0pXG4gICAgfVxuICB9XG5cbiAgb2ZmICh0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBJbnRlcmFjdC5MaXN0ZW5lcnNBcmcpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBub3JtYWxpemUodHlwZSwgbGlzdGVuZXIpXG5cbiAgICBmb3IgKHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBjb25zdCBldmVudExpc3QgPSB0aGlzLnR5cGVzW3R5cGVdXG5cbiAgICAgIGlmICghZXZlbnRMaXN0IHx8ICFldmVudExpc3QubGVuZ3RoKSB7IGNvbnRpbnVlIH1cblxuICAgICAgZm9yIChjb25zdCBzdWJMaXN0ZW5lciBvZiBsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBldmVudExpc3QuaW5kZXhPZihzdWJMaXN0ZW5lcilcblxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZXZlbnRMaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJlY3QgKF9lbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KTogSW50ZXJhY3QuUmVjdCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudGFibGVcbiIsImltcG9ydCB7IGNsb3Nlc3QsIGdldEVsZW1lbnRSZWN0LCBwYXJlbnROb2RlIH0gZnJvbSAnLi9kb21VdGlscydcbmltcG9ydCBleHRlbmQgZnJvbSAnLi9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICcuL2lzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nT3B0aW9uUmVzdWx0ICh2YWx1ZTogYW55LCB0YXJnZXQ6IEludGVyYWN0Lkhhc0dldFJlY3QsIGVsZW1lbnQpIHtcbiAgaWYgKHZhbHVlID09PSAncGFyZW50JykgeyByZXR1cm4gcGFyZW50Tm9kZShlbGVtZW50KSB9XG5cbiAgaWYgKHZhbHVlID09PSAnc2VsZicpIHsgcmV0dXJuIHRhcmdldC5nZXRSZWN0KGVsZW1lbnQpIH1cblxuICByZXR1cm4gY2xvc2VzdChlbGVtZW50LCB2YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWN0TGlrZTxUIGV4dGVuZHMgYW55W10+IChcbiAgdmFsdWU6IEludGVyYWN0LlJlY3RSZXNvbHZhYmxlPFQ+LFxuICB0YXJnZXQ/OiBJbnRlcmFjdC5IYXNHZXRSZWN0LFxuICBlbGVtZW50PzogTm9kZSxcbiAgZnVuY3Rpb25BcmdzPzogVCxcbikge1xuICBsZXQgcmV0dXJuVmFsdWU6IGFueSA9IHZhbHVlXG4gIGlmIChpcy5zdHJpbmcocmV0dXJuVmFsdWUpKSB7XG4gICAgcmV0dXJuVmFsdWUgPSBnZXRTdHJpbmdPcHRpb25SZXN1bHQocmV0dXJuVmFsdWUsIHRhcmdldCwgZWxlbWVudClcbiAgfVxuICBlbHNlIGlmIChpcy5mdW5jKHJldHVyblZhbHVlKSkge1xuICAgIHJldHVyblZhbHVlID0gcmV0dXJuVmFsdWUoLi4uZnVuY3Rpb25BcmdzKVxuICB9XG5cbiAgaWYgKGlzLmVsZW1lbnQocmV0dXJuVmFsdWUpKSB7XG4gICAgcmV0dXJuVmFsdWUgPSBnZXRFbGVtZW50UmVjdChyZXR1cm5WYWx1ZSlcbiAgfVxuXG4gIHJldHVybiByZXR1cm5WYWx1ZSBhcyBJbnRlcmFjdC5SZWN0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWN0VG9YWSAocmVjdCkge1xuICByZXR1cm4gIHJlY3QgJiYge1xuICAgIHg6ICd4JyBpbiByZWN0ID8gcmVjdC54IDogcmVjdC5sZWZ0LFxuICAgIHk6ICd5JyBpbiByZWN0ID8gcmVjdC55IDogcmVjdC50b3AsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHh5d2hUb1RsYnIgKHJlY3QpIHtcbiAgaWYgKHJlY3QgJiYgISgnbGVmdCcgaW4gcmVjdCAmJiAndG9wJyBpbiByZWN0KSkge1xuICAgIHJlY3QgPSBleHRlbmQoe30sIHJlY3QpXG5cbiAgICByZWN0LmxlZnQgICA9IHJlY3QueCB8fCAwXG4gICAgcmVjdC50b3AgICAgPSByZWN0LnkgfHwgMFxuICAgIHJlY3QucmlnaHQgID0gcmVjdC5yaWdodCAgIHx8IChyZWN0LmxlZnQgKyByZWN0LndpZHRoKVxuICAgIHJlY3QuYm90dG9tID0gcmVjdC5ib3R0b20gIHx8IChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0KVxuICB9XG5cbiAgcmV0dXJuIHJlY3Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRsYnJUb1h5d2ggKHJlY3QpIHtcbiAgaWYgKHJlY3QgJiYgISgneCcgaW4gcmVjdCAmJiAneScgaW4gcmVjdCkpIHtcbiAgICByZWN0ID0gZXh0ZW5kKHt9LCByZWN0KVxuXG4gICAgcmVjdC54ICAgICAgPSByZWN0LmxlZnQgfHwgMFxuICAgIHJlY3QueSAgICAgID0gcmVjdC50b3AgIHx8IDBcbiAgICByZWN0LndpZHRoICA9IHJlY3Qud2lkdGggIHx8IChyZWN0LnJpZ2h0IHx8IDAgIC0gcmVjdC54KVxuICAgIHJlY3QuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgfHwgKHJlY3QuYm90dG9tIHx8IDAgLSByZWN0LnkpXG4gIH1cblxuICByZXR1cm4gcmVjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRWRnZXMgKGVkZ2VzOiBJbnRlcmFjdC5FZGdlT3B0aW9ucywgcmVjdDogSW50ZXJhY3QuUmVjdCwgZGVsdGE6IEludGVyYWN0LlBvaW50KSB7XG4gIGlmIChlZGdlcy5sZWZ0KSAgIHsgcmVjdC5sZWZ0ICAgKz0gZGVsdGEueCB9XG4gIGlmIChlZGdlcy5yaWdodCkgIHsgcmVjdC5yaWdodCAgKz0gZGVsdGEueCB9XG4gIGlmIChlZGdlcy50b3ApICAgIHsgcmVjdC50b3AgICAgKz0gZGVsdGEueSB9XG4gIGlmIChlZGdlcy5ib3R0b20pIHsgcmVjdC5ib3R0b20gKz0gZGVsdGEueSB9XG5cbiAgcmVjdC53aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnRcbiAgcmVjdC5oZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG59XG4iLCJpbXBvcnQgeyByZWN0VG9YWSwgcmVzb2x2ZVJlY3RMaWtlIH0gZnJvbSAnLi9yZWN0J1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoXG4gIHRhcmdldDogSW50ZXJhY3QuSGFzR2V0UmVjdCAmIHsgb3B0aW9uczogSW50ZXJhY3QuUGVyQWN0aW9uRGVmYXVsdHMgfSxcbiAgZWxlbWVudDogTm9kZSxcbiAgYWN0aW9uTmFtZT86IEludGVyYWN0LkFjdGlvbk5hbWUsXG4pIHtcbiAgY29uc3QgYWN0aW9uT3B0aW9ucyA9ICh0YXJnZXQub3B0aW9ucyBhcyBhbnkpW2FjdGlvbk5hbWVdXG4gIGNvbnN0IGFjdGlvbk9yaWdpbiA9IGFjdGlvbk9wdGlvbnMgJiYgYWN0aW9uT3B0aW9ucy5vcmlnaW5cbiAgY29uc3Qgb3JpZ2luID0gYWN0aW9uT3JpZ2luIHx8IHRhcmdldC5vcHRpb25zLm9yaWdpblxuXG4gIGNvbnN0IG9yaWdpblJlY3QgPSByZXNvbHZlUmVjdExpa2Uob3JpZ2luLCB0YXJnZXQsIGVsZW1lbnQsIFt0YXJnZXQgJiYgZWxlbWVudF0pXG5cbiAgcmV0dXJuIHJlY3RUb1hZKG9yaWdpblJlY3QpIHx8IHsgeDogMCwgeTogMCB9XG59XG4iLCJsZXQgbGFzdFRpbWUgPSAwXG5sZXQgcmVxdWVzdFxubGV0IGNhbmNlbFxuXG5mdW5jdGlvbiBpbml0ICh3aW5kb3cpIHtcbiAgcmVxdWVzdCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lXG5cbiAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgY29uc3QgdmVuZG9ycyA9IFsnbXMnLCAnbW96JywgJ3dlYmtpdCcsICdvJ11cblxuICAgIGZvciAoY29uc3QgdmVuZG9yIG9mIHZlbmRvcnMpIHtcbiAgICAgIHJlcXVlc3QgPSB3aW5kb3dbYCR7dmVuZG9yfVJlcXVlc3RBbmltYXRpb25GcmFtZWBdXG4gICAgICBjYW5jZWwgPSB3aW5kb3dbYCR7dmVuZG9yfUNhbmNlbEFuaW1hdGlvbkZyYW1lYF0gfHwgd2luZG93W2Ake3ZlbmRvcn1DYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWVgXVxuICAgIH1cbiAgfVxuXG4gIGlmICghcmVxdWVzdCkge1xuICAgIHJlcXVlc3QgPSBjYWxsYmFjayA9PiB7XG4gICAgICBjb25zdCBjdXJyVGltZSA9IERhdGUubm93KClcbiAgICAgIGNvbnN0IHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdGFuZGFyZC9uby1jYWxsYmFjay1saXRlcmFsXG4gICAgICBjb25zdCB0b2tlbiA9IHNldFRpbWVvdXQoKCkgPT4geyBjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpIH0sXG4gICAgICAgIHRpbWVUb0NhbGwpXG5cbiAgICAgIGxhc3RUaW1lID0gY3VyclRpbWUgKyB0aW1lVG9DYWxsXG4gICAgICByZXR1cm4gdG9rZW5cbiAgICB9XG5cbiAgICBjYW5jZWwgPSB0b2tlbiA9PiBjbGVhclRpbWVvdXQodG9rZW4pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICByZXF1ZXN0OiBjYWxsYmFjayA9PiByZXF1ZXN0KGNhbGxiYWNrKSxcbiAgY2FuY2VsOiB0b2tlbiA9PiBjYW5jZWwodG9rZW4pLFxuICBpbml0LFxufVxuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJy4vYXJyJ1xuaW1wb3J0ICogYXMgZG9tIGZyb20gJy4vZG9tVXRpbHMnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICcuL2lzJ1xuaW1wb3J0ICogYXMgcG9pbnRlciBmcm9tICcuL3BvaW50ZXJVdGlscydcbmltcG9ydCAqIGFzIHJlY3QgZnJvbSAnLi9yZWN0J1xuaW1wb3J0IHdpbiBmcm9tICcuL3dpbmRvdydcblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PbmNlPFQ+ICh0aGlzOiBULCBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgbGV0IHdhcm5lZCA9IGZhbHNlXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICByZXR1cm4gZnVuY3Rpb24gKHRoaXM6IFQpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgKHdpbiBhcyBhbnkpLndpbmRvdy5jb25zb2xlLndhcm4obWVzc2FnZSlcbiAgICAgIHdhcm5lZCA9IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUFjdGlvbiAoZGVzdDogSW50ZXJhY3QuQWN0aW9uUHJvcHMsIHNyYzogSW50ZXJhY3QuQWN0aW9uUHJvcHMpIHtcbiAgZGVzdC5uYW1lICA9IHNyYy5uYW1lXG4gIGRlc3QuYXhpcyAgPSBzcmMuYXhpc1xuICBkZXN0LmVkZ2VzID0gc3JjLmVkZ2VzXG5cbiAgcmV0dXJuIGRlc3Rcbn1cblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBicm93c2VyIH0gZnJvbSAnLi9icm93c2VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGV2ZW50cyB9IGZyb20gJy4vZXZlbnRzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBleHRlbmQgfSBmcm9tICcuL2V4dGVuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0T3JpZ2luWFkgfSBmcm9tICcuL2dldE9yaWdpblhZJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoeXBvdCB9IGZyb20gJy4vaHlwb3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vcm1hbGl6ZUxpc3RlbmVycyB9IGZyb20gJy4vbm9ybWFsaXplTGlzdGVuZXJzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByYWYgfSBmcm9tICcuL3JhZidcbmV4cG9ydCB7IHdpbiwgYXJyLCBkb20sIGlzLCBwb2ludGVyLCByZWN0IH1cbiIsIi8vIHRzbGludDpkaXNhYmxlIG5vLWVtcHR5LWludGVyZmFjZVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRzIHtcbiAgYmFzZTogQmFzZURlZmF1bHRzXG4gIHBlckFjdGlvbjogUGVyQWN0aW9uRGVmYXVsdHNcbiAgYWN0aW9uczogQWN0aW9uRGVmYXVsdHNcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VEZWZhdWx0cyB7XG4gIHByZXZlbnREZWZhdWx0PzogJ2F1dG8nIHwgJ25ldmVyJyB8IHN0cmluZ1xuICBkZWx0YVNvdXJjZT86ICdwYWdlJyB8ICdjbGllbnQnXG4gIGNvbnRleHQ/OiBJbnRlcmFjdC5FdmVudFRhcmdldFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlckFjdGlvbkRlZmF1bHRzIHtcbiAgZW5hYmxlZD86IGJvb2xlYW5cbiAgb3JpZ2luPzogSW50ZXJhY3QuUG9pbnQgfCBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGxpc3RlbmVycz86IEludGVyYWN0Lkxpc3RlbmVyc1xuICBhbGxvd0Zyb20/OiBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGlnbm9yZUZyb20/OiBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG59XG5cbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSBQYXJ0aWFsPEJhc2VEZWZhdWx0cz4gJiBQYXJ0aWFsPFBlckFjdGlvbkRlZmF1bHRzPiAmIHtcbiAgW1AgaW4ga2V5b2YgQWN0aW9uRGVmYXVsdHNdPzogUGFydGlhbDxBY3Rpb25EZWZhdWx0c1tQXT5cbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIGV4dGVuZHMgQmFzZURlZmF1bHRzLCBQZXJBY3Rpb25EZWZhdWx0cyB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnNBcmcgZXh0ZW5kcyBCYXNlRGVmYXVsdHMsIEludGVyYWN0Lk9yQm9vbGVhbjxQYXJ0aWFsPEFjdGlvbkRlZmF1bHRzPj4ge31cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBEZWZhdWx0cyA9IHtcbiAgYmFzZToge1xuICAgIHByZXZlbnREZWZhdWx0OiAnYXV0bycsXG4gICAgZGVsdGFTb3VyY2U6ICdwYWdlJyxcbiAgfSxcblxuICBwZXJBY3Rpb246IHtcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBvcmlnaW46IHsgeDogMCwgeTogMCB9LFxuICB9LFxuXG4gIGFjdGlvbnM6IHt9IGFzIEFjdGlvbkRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0c1xuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcbmltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNpZ25hbEFyZ3Mge1xuICAgICdpbnRlcmFjdGFibGU6bmV3Jzoge1xuICAgICAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgICAgIHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0XG4gICAgICBvcHRpb25zOiBJbnRlcmFjdC5PcHRpb25zQXJnXG4gICAgICB3aW46IFdpbmRvd1xuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgSW50ZXJhY3RhYmxlU2NvcGVQcm9wIHtcbiAgY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVyYWN0YWJsZVNldCB7XG4gIC8vIGFsbCBzZXQgaW50ZXJhY3RhYmxlc1xuICBsaXN0OiBJbnRlcmFjdC5JbnRlcmFjdGFibGVbXSA9IFtdXG5cbiAgc2VsZWN0b3JNYXA6IHtcbiAgICBbc2VsZWN0b3I6IHN0cmluZ106IEludGVyYWN0YWJsZVNjb3BlUHJvcFtdXG4gIH0gPSB7fVxuXG4gIGNvbnN0cnVjdG9yIChwcm90ZWN0ZWQgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gICAgc2NvcGUuYWRkTGlzdGVuZXJzKHtcbiAgICAgICdpbnRlcmFjdGFibGU6dW5zZXQnOiAoeyBpbnRlcmFjdGFibGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRhcmdldCwgX2NvbnRleHQ6IGNvbnRleHQgfSA9IGludGVyYWN0YWJsZVxuICAgICAgICBjb25zdCB0YXJnZXRNYXBwaW5nczogSW50ZXJhY3RhYmxlU2NvcGVQcm9wW10gPSBpcy5zdHJpbmcodGFyZ2V0KVxuICAgICAgICAgID8gdGhpcy5zZWxlY3Rvck1hcFt0YXJnZXRdXG4gICAgICAgICAgOiAodGFyZ2V0IGFzIGFueSlbdGhpcy5zY29wZS5pZF1cblxuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IHRhcmdldE1hcHBpbmdzLmZpbmRJbmRleChtID0+IG0uY29udGV4dCA9PT0gY29udGV4dClcbiAgICAgICAgaWYgKHRhcmdldE1hcHBpbmdzW3RhcmdldEluZGV4XSkge1xuICAgICAgICAvLyBEZXN0cm95aW5nIG1hcHBpbmdJbmZvJ3MgY29udGV4dCBhbmQgaW50ZXJhY3RhYmxlXG4gICAgICAgICAgdGFyZ2V0TWFwcGluZ3NbdGFyZ2V0SW5kZXhdLmNvbnRleHQgPSBudWxsXG4gICAgICAgICAgdGFyZ2V0TWFwcGluZ3NbdGFyZ2V0SW5kZXhdLmludGVyYWN0YWJsZSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRNYXBwaW5ncy5zcGxpY2UodGFyZ2V0SW5kZXgsIDEpXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBuZXcgKHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0LCBvcHRpb25zPzogYW55KTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlIHtcbiAgICBvcHRpb25zID0gZXh0ZW5kKG9wdGlvbnMgfHwge30sIHtcbiAgICAgIGFjdGlvbnM6IHRoaXMuc2NvcGUuYWN0aW9ucyxcbiAgICB9KVxuICAgIGNvbnN0IGludGVyYWN0YWJsZSA9IG5ldyB0aGlzLnNjb3BlLkludGVyYWN0YWJsZSh0YXJnZXQsIG9wdGlvbnMsIHRoaXMuc2NvcGUuZG9jdW1lbnQpXG4gICAgY29uc3QgbWFwcGluZ0luZm8gPSB7IGNvbnRleHQ6IGludGVyYWN0YWJsZS5fY29udGV4dCwgaW50ZXJhY3RhYmxlIH1cblxuICAgIHRoaXMuc2NvcGUuYWRkRG9jdW1lbnQoaW50ZXJhY3RhYmxlLl9kb2MpXG4gICAgdGhpcy5saXN0LnB1c2goaW50ZXJhY3RhYmxlKVxuXG4gICAgaWYgKGlzLnN0cmluZyh0YXJnZXQpKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0b3JNYXBbdGFyZ2V0XSkgeyB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldF0gPSBbXSB9XG4gICAgICB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldF0ucHVzaChtYXBwaW5nSW5mbylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEoKGludGVyYWN0YWJsZS50YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXSkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgdGhpcy5zY29wZS5pZCwge1xuICAgICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgICh0YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXS5wdXNoKG1hcHBpbmdJbmZvKVxuICAgIH1cblxuICAgIHRoaXMuc2NvcGUuZmlyZSgnaW50ZXJhY3RhYmxlOm5ldycsIHtcbiAgICAgIHRhcmdldCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpbnRlcmFjdGFibGUsXG4gICAgICB3aW46IHRoaXMuc2NvcGUuX3dpbixcbiAgICB9KVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG5cbiAgZ2V0ICh0YXJnZXQ6IEludGVyYWN0LlRhcmdldCwgb3B0aW9ucz86IEludGVyYWN0Lk9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0KSB8fCB0aGlzLnNjb3BlLmRvY3VtZW50XG4gICAgY29uc3QgaXNTZWxlY3RvciA9IGlzLnN0cmluZyh0YXJnZXQpXG4gICAgY29uc3QgdGFyZ2V0TWFwcGluZ3M6IEludGVyYWN0YWJsZVNjb3BlUHJvcFtdID0gaXNTZWxlY3RvclxuICAgICAgPyB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldCBhcyBzdHJpbmddXG4gICAgICA6ICh0YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXVxuXG4gICAgaWYgKCF0YXJnZXRNYXBwaW5ncykgeyByZXR1cm4gbnVsbCB9XG5cbiAgICBjb25zdCBmb3VuZCA9IGFyci5maW5kKFxuICAgICAgdGFyZ2V0TWFwcGluZ3MsXG4gICAgICBtID0+IG0uY29udGV4dCA9PT0gY29udGV4dCAmJlxuICAgICAgICAoaXNTZWxlY3RvciB8fCBtLmludGVyYWN0YWJsZS5pbkNvbnRleHQodGFyZ2V0IGFzIGFueSkpKVxuXG4gICAgcmV0dXJuIGZvdW5kICYmIGZvdW5kLmludGVyYWN0YWJsZVxuICB9XG5cbiAgZm9yRWFjaE1hdGNoPFQ+IChub2RlOiBOb2RlLCBjYWxsYmFjazogKGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKSA9PiBUKTogVCB8IHZvaWQge1xuICAgIGZvciAoY29uc3QgaW50ZXJhY3RhYmxlIG9mIHRoaXMubGlzdCkge1xuICAgICAgbGV0IHJldFxuXG4gICAgICBpZiAoKGlzLnN0cmluZyhpbnRlcmFjdGFibGUudGFyZ2V0KVxuICAgICAgLy8gdGFyZ2V0IGlzIGEgc2VsZWN0b3IgYW5kIHRoZSBlbGVtZW50IG1hdGNoZXNcbiAgICAgICAgPyAoaXMuZWxlbWVudChub2RlKSAmJiBkb21VdGlscy5tYXRjaGVzU2VsZWN0b3Iobm9kZSwgaW50ZXJhY3RhYmxlLnRhcmdldCkpXG4gICAgICAgIC8vIHRhcmdldCBpcyB0aGUgZWxlbWVudFxuICAgICAgICA6IG5vZGUgPT09IGludGVyYWN0YWJsZS50YXJnZXQpICYmXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIGNvbnRleHRcbiAgICAgICAgKGludGVyYWN0YWJsZS5pbkNvbnRleHQobm9kZSkpKSB7XG4gICAgICAgIHJldCA9IGNhbGxiYWNrKGludGVyYWN0YWJsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXRcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBCYXNlRXZlbnQ8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWUgPSBhbnk+IHtcbiAgdHlwZTogc3RyaW5nXG4gIHRhcmdldDogRXZlbnRUYXJnZXRcbiAgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXRcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgX2ludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbjxUPlxuICB0aW1lU3RhbXA6IGFueVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuXG4gIGdldCBpbnRlcmFjdGlvbiAoKTogSW50ZXJhY3QuSW50ZXJhY3Rpb25Qcm94eTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW9uLl9wcm94eVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICAgIHRoaXMuX2ludGVyYWN0aW9uID0gaW50ZXJhY3Rpb25cbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0ICgpIHt9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgYW55IG90aGVyIGxpc3RlbmVycyAoZXZlbiBvbiB0aGUgY3VycmVudCB0YXJnZXQpXG4gICAqL1xuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgbGlzdGVuZXJzIG9uIHRoZSByZW1haW5pbmcgdGFyZ2V0c1xuICAgKi9cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VFdmVudFxuIiwiaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgZ2V0T3JpZ2luWFkgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZ2V0T3JpZ2luWFknXG5pbXBvcnQgaHlwb3QgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaHlwb3QnXG5pbXBvcnQgQmFzZUV2ZW50IGZyb20gJy4vQmFzZUV2ZW50J1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgSW50ZXJhY3Rpb24gZnJvbSAnLi9JbnRlcmFjdGlvbidcblxuZXhwb3J0IHR5cGUgRXZlbnRQaGFzZSA9IGtleW9mIFBoYXNlTWFwXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGhhc2VNYXAge1xuICBzdGFydDogdHJ1ZVxuICBtb3ZlOiB0cnVlXG4gIGVuZDogdHJ1ZVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJhY3RFdmVudDxcbiAgVCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWUgPSBuZXZlcixcbiAgUCBleHRlbmRzIEV2ZW50UGhhc2UgPSBFdmVudFBoYXNlLFxuPiBleHRlbmRzIEJhc2VFdmVudDxUPiB7XG4gIHRhcmdldDogSW50ZXJhY3QuRWxlbWVudFxuICBjdXJyZW50VGFyZ2V0OiBJbnRlcmFjdC5FbGVtZW50XG4gIHJlbGF0ZWRUYXJnZXQ6IG51bGwgPSBudWxsXG4gIHNjcmVlblg/OiBudW1iZXJcbiAgc2NyZWVuWT86IG51bWJlclxuICBidXR0b246IG51bWJlclxuICBidXR0b25zOiBudW1iZXJcbiAgY3RybEtleTogYm9vbGVhblxuICBzaGlmdEtleTogYm9vbGVhblxuICBhbHRLZXk6IGJvb2xlYW5cbiAgbWV0YUtleTogYm9vbGVhblxuICBwYWdlOiBJbnRlcmFjdC5Qb2ludFxuICBjbGllbnQ6IEludGVyYWN0LlBvaW50XG4gIGRlbHRhOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICB4MDogbnVtYmVyXG4gIHkwOiBudW1iZXJcbiAgdDA6IG51bWJlclxuICBkdDogbnVtYmVyXG4gIGR1cmF0aW9uOiBudW1iZXJcbiAgY2xpZW50WDA6IG51bWJlclxuICBjbGllbnRZMDogbnVtYmVyXG4gIHZlbG9jaXR5OiBJbnRlcmFjdC5Qb2ludFxuICBzcGVlZDogbnVtYmVyXG4gIHN3aXBlOiBSZXR1cm5UeXBlPEludGVyYWN0RXZlbnQ8VD5bJ2dldFN3aXBlJ10+XG4gIHRpbWVTdGFtcDogYW55XG4gIC8vIGRyYWdcbiAgZHJhZ0VudGVyPzogSW50ZXJhY3QuRWxlbWVudFxuICBkcmFnTGVhdmU/OiBJbnRlcmFjdC5FbGVtZW50XG4gIC8vIHJlc2l6ZVxuICBheGVzPzogJ3gnIHwgJ3knIHwgJ3h5J1xuICBwcmVFbmQ/OiBib29sZWFuXG5cbiAgLyoqICovXG4gIGNvbnN0cnVjdG9yIChcbiAgICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24sXG4gICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgYWN0aW9uTmFtZTogVCxcbiAgICBwaGFzZTogUCxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgIHByZUVuZD86IGJvb2xlYW4sXG4gICAgdHlwZT86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoaW50ZXJhY3Rpb24pXG5cbiAgICBlbGVtZW50ID0gZWxlbWVudCB8fCBpbnRlcmFjdGlvbi5lbGVtZW50XG5cbiAgICBjb25zdCB0YXJnZXQgICAgICA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZVxuICAgIGNvbnN0IGRlbHRhU291cmNlID0gKCgodGFyZ2V0ICYmIHRhcmdldC5vcHRpb25zKSB8fCBkZWZhdWx0cykgYXMgYW55KS5kZWx0YVNvdXJjZSBhcyAncGFnZScgfCAnY2xpZW50J1xuICAgIGNvbnN0IG9yaWdpbiAgICAgID0gZ2V0T3JpZ2luWFkodGFyZ2V0LCBlbGVtZW50LCBhY3Rpb25OYW1lKVxuICAgIGNvbnN0IHN0YXJ0aW5nICAgID0gcGhhc2UgPT09ICdzdGFydCdcbiAgICBjb25zdCBlbmRpbmcgICAgICA9IHBoYXNlID09PSAnZW5kJ1xuICAgIGNvbnN0IHByZXZFdmVudCAgID0gc3RhcnRpbmcgPyB0aGlzIDogaW50ZXJhY3Rpb24ucHJldkV2ZW50XG4gICAgY29uc3QgY29vcmRzICAgICAgPSBzdGFydGluZ1xuICAgICAgPyBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnRcbiAgICAgIDogZW5kaW5nXG4gICAgICAgID8geyBwYWdlOiBwcmV2RXZlbnQucGFnZSwgY2xpZW50OiBwcmV2RXZlbnQuY2xpZW50LCB0aW1lU3RhbXA6IGludGVyYWN0aW9uLmNvb3Jkcy5jdXIudGltZVN0YW1wIH1cbiAgICAgICAgOiBpbnRlcmFjdGlvbi5jb29yZHMuY3VyXG5cbiAgICB0aGlzLnBhZ2UgICAgICA9IGV4dGVuZCh7fSwgY29vcmRzLnBhZ2UpXG4gICAgdGhpcy5jbGllbnQgICAgPSBleHRlbmQoe30sIGNvb3Jkcy5jbGllbnQpXG4gICAgdGhpcy5yZWN0ICAgICAgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLnJlY3QpXG4gICAgdGhpcy50aW1lU3RhbXAgPSBjb29yZHMudGltZVN0YW1wXG5cbiAgICBpZiAoIWVuZGluZykge1xuICAgICAgdGhpcy5wYWdlLnggLT0gb3JpZ2luLnhcbiAgICAgIHRoaXMucGFnZS55IC09IG9yaWdpbi55XG5cbiAgICAgIHRoaXMuY2xpZW50LnggLT0gb3JpZ2luLnhcbiAgICAgIHRoaXMuY2xpZW50LnkgLT0gb3JpZ2luLnlcbiAgICB9XG5cbiAgICB0aGlzLmN0cmxLZXkgICAgICAgPSBldmVudC5jdHJsS2V5XG4gICAgdGhpcy5hbHRLZXkgICAgICAgID0gZXZlbnQuYWx0S2V5XG4gICAgdGhpcy5zaGlmdEtleSAgICAgID0gZXZlbnQuc2hpZnRLZXlcbiAgICB0aGlzLm1ldGFLZXkgICAgICAgPSBldmVudC5tZXRhS2V5XG4gICAgdGhpcy5idXR0b24gICAgICAgID0gKGV2ZW50IGFzIE1vdXNlRXZlbnQpLmJ1dHRvblxuICAgIHRoaXMuYnV0dG9ucyAgICAgICA9IChldmVudCBhcyBNb3VzZUV2ZW50KS5idXR0b25zXG4gICAgdGhpcy50YXJnZXQgICAgICAgID0gZWxlbWVudFxuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IGVsZW1lbnRcbiAgICB0aGlzLnByZUVuZCAgICAgICAgPSBwcmVFbmRcbiAgICB0aGlzLnR5cGUgICAgICAgICAgPSB0eXBlIHx8IChhY3Rpb25OYW1lICsgKHBoYXNlIHx8ICcnKSlcbiAgICB0aGlzLmludGVyYWN0YWJsZSAgPSB0YXJnZXRcblxuICAgIHRoaXMudDAgPSBzdGFydGluZ1xuICAgICAgPyBpbnRlcmFjdGlvbi5wb2ludGVyc1tpbnRlcmFjdGlvbi5wb2ludGVycy5sZW5ndGggLSAxXS5kb3duVGltZVxuICAgICAgOiBwcmV2RXZlbnQudDBcblxuICAgIHRoaXMueDAgICAgICAgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQucGFnZS54IC0gb3JpZ2luLnhcbiAgICB0aGlzLnkwICAgICAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueSAtIG9yaWdpbi55XG4gICAgdGhpcy5jbGllbnRYMCA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5jbGllbnQueCAtIG9yaWdpbi54XG4gICAgdGhpcy5jbGllbnRZMCA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5jbGllbnQueSAtIG9yaWdpbi55XG5cbiAgICBpZiAoc3RhcnRpbmcgfHwgZW5kaW5nKSB7XG4gICAgICB0aGlzLmRlbHRhID0geyB4OiAwLCB5OiAwIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRlbHRhID0ge1xuICAgICAgICB4OiB0aGlzW2RlbHRhU291cmNlXS54IC0gcHJldkV2ZW50W2RlbHRhU291cmNlXS54LFxuICAgICAgICB5OiB0aGlzW2RlbHRhU291cmNlXS55IC0gcHJldkV2ZW50W2RlbHRhU291cmNlXS55LFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZHQgICAgICAgID0gaW50ZXJhY3Rpb24uY29vcmRzLmRlbHRhLnRpbWVTdGFtcFxuICAgIHRoaXMuZHVyYXRpb24gID0gdGhpcy50aW1lU3RhbXAgLSB0aGlzLnQwXG5cbiAgICAvLyB2ZWxvY2l0eSBhbmQgc3BlZWQgaW4gcGl4ZWxzIHBlciBzZWNvbmRcbiAgICB0aGlzLnZlbG9jaXR5ID0gZXh0ZW5kKHt9LCBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHlbZGVsdGFTb3VyY2VdKVxuICAgIHRoaXMuc3BlZWQgPSBoeXBvdCh0aGlzLnZlbG9jaXR5LngsIHRoaXMudmVsb2NpdHkueSlcblxuICAgIHRoaXMuc3dpcGUgPSAoZW5kaW5nIHx8IHBoYXNlID09PSAnaW5lcnRpYXN0YXJ0JykgPyB0aGlzLmdldFN3aXBlKCkgOiBudWxsXG4gIH1cblxuICBnZXQgcGFnZVggKCkgeyByZXR1cm4gdGhpcy5wYWdlLnggfVxuICBzZXQgcGFnZVggKHZhbHVlKSB7IHRoaXMucGFnZS54ID0gdmFsdWUgfVxuICBnZXQgcGFnZVkgKCkgeyByZXR1cm4gdGhpcy5wYWdlLnkgfVxuICBzZXQgcGFnZVkgKHZhbHVlKSB7IHRoaXMucGFnZS55ID0gdmFsdWUgfVxuXG4gIGdldCBjbGllbnRYICgpIHsgcmV0dXJuIHRoaXMuY2xpZW50LnggfVxuICBzZXQgY2xpZW50WCAodmFsdWUpIHsgdGhpcy5jbGllbnQueCA9IHZhbHVlIH1cbiAgZ2V0IGNsaWVudFkgKCkgeyByZXR1cm4gdGhpcy5jbGllbnQueSB9XG4gIHNldCBjbGllbnRZICh2YWx1ZSkgeyB0aGlzLmNsaWVudC55ID0gdmFsdWUgfVxuXG4gIGdldCBkeCAoKSB7IHJldHVybiB0aGlzLmRlbHRhLnggfVxuICBzZXQgZHggKHZhbHVlKSB7IHRoaXMuZGVsdGEueCA9IHZhbHVlIH1cbiAgZ2V0IGR5ICgpIHsgcmV0dXJuIHRoaXMuZGVsdGEueSB9XG4gIHNldCBkeSAodmFsdWUpIHsgdGhpcy5kZWx0YS55ID0gdmFsdWUgfVxuXG4gIGdldCB2ZWxvY2l0eVggKCkgeyByZXR1cm4gdGhpcy52ZWxvY2l0eS54IH1cbiAgc2V0IHZlbG9jaXR5WCAodmFsdWUpIHsgdGhpcy52ZWxvY2l0eS54ID0gdmFsdWUgfVxuICBnZXQgdmVsb2NpdHlZICgpIHsgcmV0dXJuIHRoaXMudmVsb2NpdHkueSB9XG4gIHNldCB2ZWxvY2l0eVkgKHZhbHVlKSB7IHRoaXMudmVsb2NpdHkueSA9IHZhbHVlIH1cblxuICBnZXRTd2lwZSAoKSB7XG4gICAgY29uc3QgaW50ZXJhY3Rpb24gPSB0aGlzLl9pbnRlcmFjdGlvblxuXG4gICAgaWYgKGludGVyYWN0aW9uLnByZXZFdmVudC5zcGVlZCA8IDYwMCB8fFxuICAgICAgICB0aGlzLnRpbWVTdGFtcCAtIGludGVyYWN0aW9uLnByZXZFdmVudC50aW1lU3RhbXAgPiAxNTApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGFuZ2xlID0gMTgwICogTWF0aC5hdGFuMihpbnRlcmFjdGlvbi5wcmV2RXZlbnQudmVsb2NpdHlZLCBpbnRlcmFjdGlvbi5wcmV2RXZlbnQudmVsb2NpdHlYKSAvIE1hdGguUElcbiAgICBjb25zdCBvdmVybGFwID0gMjIuNVxuXG4gICAgaWYgKGFuZ2xlIDwgMCkge1xuICAgICAgYW5nbGUgKz0gMzYwXG4gICAgfVxuXG4gICAgY29uc3QgbGVmdCA9IDEzNSAtIG92ZXJsYXAgPD0gYW5nbGUgJiYgYW5nbGUgPCAyMjUgKyBvdmVybGFwXG4gICAgY29uc3QgdXAgICA9IDIyNSAtIG92ZXJsYXAgPD0gYW5nbGUgJiYgYW5nbGUgPCAzMTUgKyBvdmVybGFwXG5cbiAgICBjb25zdCByaWdodCA9ICFsZWZ0ICYmICgzMTUgLSBvdmVybGFwIDw9IGFuZ2xlIHx8IGFuZ2xlIDwgIDQ1ICsgb3ZlcmxhcClcbiAgICBjb25zdCBkb3duICA9ICF1cCAgICYmICAgNDUgLSBvdmVybGFwIDw9IGFuZ2xlICYmIGFuZ2xlIDwgMTM1ICsgb3ZlcmxhcFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVwLFxuICAgICAgZG93bixcbiAgICAgIGxlZnQsXG4gICAgICByaWdodCxcbiAgICAgIGFuZ2xlLFxuICAgICAgc3BlZWQ6IGludGVyYWN0aW9uLnByZXZFdmVudC5zcGVlZCxcbiAgICAgIHZlbG9jaXR5OiB7XG4gICAgICAgIHg6IGludGVyYWN0aW9uLnByZXZFdmVudC52ZWxvY2l0eVgsXG4gICAgICAgIHk6IGludGVyYWN0aW9uLnByZXZFdmVudC52ZWxvY2l0eVksXG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0ICgpIHt9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgbGlzdGVuZXJzIG9uIHRoZSByZW1haW5pbmcgdGFyZ2V0c1xuICAgKi9cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgYW55IG90aGVyIGxpc3RlbmVycyAoZXZlbiBvbiB0aGUgY3VycmVudCB0YXJnZXQpXG4gICAqL1xuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVyYWN0RXZlbnRcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1wYXJhbWV0ZXItcHJvcGVydGllcyAqL1xuZXhwb3J0IGNsYXNzIFBvaW50ZXJJbmZvIHtcbiAgY29uc3RydWN0b3IgKFxuICAgIHB1YmxpYyBpZDogbnVtYmVyLFxuICAgIHB1YmxpYyBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgICBwdWJsaWMgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgcHVibGljIGRvd25UaW1lOiBudW1iZXIsXG4gICAgcHVibGljIGRvd25UYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0LFxuICApIHt9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50ZXJJbmZvXG4iLCJpbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBJbnRlcmFjdGFibGUgZnJvbSAnLi9JbnRlcmFjdGFibGUnXG5pbXBvcnQgSW50ZXJhY3RFdmVudCwgeyBFdmVudFBoYXNlIH0gZnJvbSAnLi9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0IFBvaW50ZXJJbmZvIGZyb20gJy4vUG9pbnRlckluZm8nXG5pbXBvcnQgeyBBY3Rpb25OYW1lIH0gZnJvbSAnLi9zY29wZSdcblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25Qcm9wczxUIGV4dGVuZHMgQWN0aW9uTmFtZSA9IEludGVyYWN0LkFjdGlvbk5hbWU+IHtcbiAgbmFtZTogVFxuICBheGlzPzogJ3gnIHwgJ3knIHwgJ3h5J1xuICBlZGdlcz86IEludGVyYWN0LkVkZ2VPcHRpb25zXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb25Qcm9wcyB7XG4gIG5hbWU6IEFjdGlvbk5hbWVcbn1cblxuZXhwb3J0IGVudW0gX1Byb3h5VmFsdWVzIHtcbiAgaW50ZXJhY3RhYmxlID0gJycsXG4gIGVsZW1lbnQgPSAnJyxcbiAgcHJlcGFyZWQgPSAnJyxcbiAgcG9pbnRlcklzRG93biA9ICcnLFxuICBwb2ludGVyV2FzTW92ZWQgPSAnJyxcbiAgX3Byb3h5ID0gJydcbn1cblxuZXhwb3J0IGVudW0gX1Byb3h5TWV0aG9kcyB7XG4gIHN0YXJ0ID0gJycsXG4gIG1vdmUgPSAnJyxcbiAgZW5kID0gJycsXG4gIHN0b3AgPSAnJyxcbiAgaW50ZXJhY3RpbmcgPSAnJ1xufVxuXG5leHBvcnQgdHlwZSBQb2ludGVyQXJnUHJvcHM8VCBleHRlbmRzIHt9ID0ge30+ID0ge1xuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZVxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgcG9pbnRlckluZGV4OiBudW1iZXJcbiAgcG9pbnRlckluZm86IFBvaW50ZXJJbmZvXG4gIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblxufSAmIFRcblxuZXhwb3J0IGludGVyZmFjZSBEb1BoYXNlQXJnPFQgZXh0ZW5kcyBBY3Rpb25OYW1lLCBQIGV4dGVuZHMgRXZlbnRQaGFzZT4ge1xuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICBwaGFzZTogRXZlbnRQaGFzZVxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb248VD5cbiAgaUV2ZW50OiBJbnRlcmFjdEV2ZW50PFQsIFA+XG4gIHByZUVuZD86IGJvb2xlYW5cbiAgdHlwZT86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBEb0FueVBoYXNlQXJnID0gRG9QaGFzZUFyZzxBY3Rpb25OYW1lLCBFdmVudFBoYXNlPlxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB9XG4gICAgJ2ludGVyYWN0aW9uczpkb3duJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICdkb3duJ1xuICAgIH0+XG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICdtb3ZlJ1xuICAgICAgZHg6IG51bWJlclxuICAgICAgZHk6IG51bWJlclxuICAgICAgZHVwbGljYXRlOiBib29sZWFuXG4gICAgfT5cbiAgICAnaW50ZXJhY3Rpb25zOnVwJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICd1cCdcbiAgICAgIGN1ckV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldFxuICAgIH0+XG4gICAgJ2ludGVyYWN0aW9uczpjYW5jZWwnOiBTaWduYWxBcmdzWydpbnRlcmFjdGlvbnM6dXAnXSAmIHtcbiAgICAgIHR5cGU6ICdjYW5jZWwnXG4gICAgICBjdXJFdmVudFRhcmdldDogRXZlbnRUYXJnZXRcbiAgICB9XG4gICAgJ2ludGVyYWN0aW9uczp1cGRhdGUtcG9pbnRlcic6IFBvaW50ZXJBcmdQcm9wczx7XG4gICAgICBkb3duOiBib29sZWFuXG4gICAgfT5cbiAgICAnaW50ZXJhY3Rpb25zOnJlbW92ZS1wb2ludGVyJzogUG9pbnRlckFyZ1Byb3BzXG4gICAgJ2ludGVyYWN0aW9uczpibHVyJ1xuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1zdGFydCc6IE9taXQ8RG9BbnlQaGFzZUFyZywgJ2lFdmVudCc+XG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tc3RhcnQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tc3RhcnQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczpiZWZvcmUtYWN0aW9uLW1vdmUnOiBPbWl0PERvQW55UGhhc2VBcmcsICdpRXZlbnQnPlxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IERvQW55UGhhc2VBcmdcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogT21pdDxEb0FueVBoYXNlQXJnLCAnaUV2ZW50Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1lbmQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tZW5kJzogRG9BbnlQaGFzZUFyZ1xuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IHsgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBJbnRlcmFjdGlvblByb3h5PFQgZXh0ZW5kcyBBY3Rpb25OYW1lID0gQWN0aW9uTmFtZT4gPSBQaWNrPFxuSW50ZXJhY3Rpb248VD4sXG5rZXlvZiB0eXBlb2YgX1Byb3h5VmFsdWVzIHwga2V5b2YgdHlwZW9mIF9Qcm94eU1ldGhvZHNcbj5cblxubGV0IGlkQ291bnRlciA9IDBcblxuZXhwb3J0IGNsYXNzIEludGVyYWN0aW9uPFQgZXh0ZW5kcyBBY3Rpb25OYW1lID0gQWN0aW9uTmFtZT4ge1xuICAvLyBjdXJyZW50IGludGVyYWN0YWJsZSBiZWluZyBpbnRlcmFjdGVkIHdpdGhcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdGFibGUgPSBudWxsXG5cbiAgLy8gdGhlIHRhcmdldCBlbGVtZW50IG9mIHRoZSBpbnRlcmFjdGFibGVcbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCA9IG51bGxcbiAgcmVjdDogSW50ZXJhY3QuRnVsbFJlY3RcbiAgX3JlY3RzPzoge1xuICAgIHN0YXJ0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICAgIGNvcnJlY3RlZDogSW50ZXJhY3QuRnVsbFJlY3RcbiAgICBwcmV2aW91czogSW50ZXJhY3QuRnVsbFJlY3RcbiAgICBkZWx0YTogSW50ZXJhY3QuRnVsbFJlY3RcbiAgfVxuICBlZGdlczogSW50ZXJhY3QuRWRnZU9wdGlvbnNcblxuICBfc2NvcGVGaXJlOiBJbnRlcmFjdC5TY29wZVsnZmlyZSddXG5cbiAgLy8gYWN0aW9uIHRoYXQncyByZWFkeSB0byBiZSBmaXJlZCBvbiBuZXh0IG1vdmUgZXZlbnRcbiAgcHJlcGFyZWQ6IEFjdGlvblByb3BzPFQ+ID0ge1xuICAgIG5hbWUgOiBudWxsLFxuICAgIGF4aXMgOiBudWxsLFxuICAgIGVkZ2VzOiBudWxsLFxuICB9XG5cbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuXG4gIC8vIGtlZXAgdHJhY2sgb2YgYWRkZWQgcG9pbnRlcnNcbiAgcG9pbnRlcnM6IFBvaW50ZXJJbmZvW10gPSBbXVxuXG4gIC8vIHBvaW50ZXJkb3duL21vdXNlZG93bi90b3VjaHN0YXJ0IGV2ZW50XG4gIGRvd25FdmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSA9IG51bGxcblxuICBkb3duUG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgPSB7fSBhcyBJbnRlcmFjdC5Qb2ludGVyVHlwZVxuXG4gIF9sYXRlc3RQb2ludGVyOiB7XG4gICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGVcbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICAgIGV2ZW50VGFyZ2V0OiBOb2RlXG4gIH0gPSB7XG4gICAgcG9pbnRlcjogbnVsbCxcbiAgICBldmVudDogbnVsbCxcbiAgICBldmVudFRhcmdldDogbnVsbCxcbiAgfVxuXG4gIC8vIHByZXZpb3VzIGFjdGlvbiBldmVudFxuICBwcmV2RXZlbnQ6IEludGVyYWN0RXZlbnQ8VCwgRXZlbnRQaGFzZT4gPSBudWxsXG5cbiAgcG9pbnRlcklzRG93biA9IGZhbHNlXG4gIHBvaW50ZXJXYXNNb3ZlZCA9IGZhbHNlXG4gIF9pbnRlcmFjdGluZyA9IGZhbHNlXG4gIF9lbmRpbmcgPSBmYWxzZVxuICBfc3RvcHBlZCA9IHRydWVcbiAgX3Byb3h5OiBJbnRlcmFjdGlvblByb3h5PFQ+ID0gbnVsbFxuXG4gIHNpbXVsYXRpb24gPSBudWxsXG5cbiAgZ2V0IHBvaW50ZXJNb3ZlVG9sZXJhbmNlICgpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgLyoqXG4gICAqIEBhbGlhcyBJbnRlcmFjdGlvbi5wcm90b3R5cGUubW92ZVxuICAgKi9cbiAgZG9Nb3ZlID0gdXRpbHMud2Fybk9uY2UoXG4gICAgZnVuY3Rpb24gKHRoaXM6IEludGVyYWN0aW9uLCBzaWduYWxBcmc6IGFueSkge1xuICAgICAgdGhpcy5tb3ZlKHNpZ25hbEFyZylcbiAgICB9LFxuICAgICdUaGUgaW50ZXJhY3Rpb24uZG9Nb3ZlKCkgbWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gaW50ZXJhY3Rpb24ubW92ZSgpJylcblxuICBjb29yZHM6IEludGVyYWN0LkNvb3Jkc1NldCA9IHtcbiAgICAvLyBTdGFydGluZyBJbnRlcmFjdEV2ZW50IHBvaW50ZXIgY29vcmRpbmF0ZXNcbiAgICBzdGFydDogdXRpbHMucG9pbnRlci5uZXdDb29yZHMoKSxcbiAgICAvLyBQcmV2aW91cyBuYXRpdmUgcG9pbnRlciBtb3ZlIGV2ZW50IGNvb3JkaW5hdGVzXG4gICAgcHJldjogdXRpbHMucG9pbnRlci5uZXdDb29yZHMoKSxcbiAgICAvLyBjdXJyZW50IG5hdGl2ZSBwb2ludGVyIG1vdmUgZXZlbnQgY29vcmRpbmF0ZXNcbiAgICBjdXI6IHV0aWxzLnBvaW50ZXIubmV3Q29vcmRzKCksXG4gICAgLy8gQ2hhbmdlIGluIGNvb3JkaW5hdGVzIGFuZCB0aW1lIG9mIHRoZSBwb2ludGVyXG4gICAgZGVsdGE6IHV0aWxzLnBvaW50ZXIubmV3Q29vcmRzKCksXG4gICAgLy8gcG9pbnRlciB2ZWxvY2l0eVxuICAgIHZlbG9jaXR5OiB1dGlscy5wb2ludGVyLm5ld0Nvb3JkcygpLFxuICB9XG5cbiAgcmVhZG9ubHkgX2lkOiBudW1iZXIgPSBpZENvdW50ZXIrK1xuXG4gIC8qKiAqL1xuICBjb25zdHJ1Y3RvciAoeyBwb2ludGVyVHlwZSwgc2NvcGVGaXJlIH06IHtcbiAgICBwb2ludGVyVHlwZT86IHN0cmluZ1xuICAgIHNjb3BlRmlyZTogSW50ZXJhY3QuU2NvcGVbJ2ZpcmUnXVxuICB9KSB7XG4gICAgdGhpcy5fc2NvcGVGaXJlID0gc2NvcGVGaXJlXG4gICAgdGhpcy5wb2ludGVyVHlwZSA9IHBvaW50ZXJUeXBlXG5cbiAgICBjb25zdCB0aGF0ID0gdGhpc1xuXG4gICAgdGhpcy5fcHJveHkgPSB7fSBhcyBJbnRlcmFjdGlvblByb3h5PFQ+XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBfUHJveHlWYWx1ZXMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLl9wcm94eSwga2V5LCB7XG4gICAgICAgIGdldCAoKSB7IHJldHVybiB0aGF0W2tleV0gfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gX1Byb3h5TWV0aG9kcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuX3Byb3h5LCBrZXksIHtcbiAgICAgICAgdmFsdWU6ICguLi5hcmdzKSA9PiB0aGF0W2tleV0oLi4uYXJncyksXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOm5ldycsIHsgaW50ZXJhY3Rpb246IHRoaXMgfSlcbiAgfVxuXG4gIHBvaW50ZXJEb3duIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCkge1xuICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IHRoaXMudXBkYXRlUG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHRydWUpXG4gICAgY29uc3QgcG9pbnRlckluZm8gPSB0aGlzLnBvaW50ZXJzW3BvaW50ZXJJbmRleF1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOmRvd24nLCB7XG4gICAgICBwb2ludGVyLFxuICAgICAgZXZlbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHBvaW50ZXJJbmRleCxcbiAgICAgIHBvaW50ZXJJbmZvLFxuICAgICAgdHlwZTogJ2Rvd24nLFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBgYGBqc1xuICAgKiBpbnRlcmFjdCh0YXJnZXQpXG4gICAqICAgLmRyYWdnYWJsZSh7XG4gICAqICAgICAvLyBkaXNhYmxlIHRoZSBkZWZhdWx0IGRyYWcgc3RhcnQgYnkgZG93bi0+bW92ZVxuICAgKiAgICAgbWFudWFsU3RhcnQ6IHRydWVcbiAgICogICB9KVxuICAgKiAgIC8vIHN0YXJ0IGRyYWdnaW5nIGFmdGVyIHRoZSB1c2VyIGhvbGRzIHRoZSBwb2ludGVyIGRvd25cbiAgICogICAub24oJ2hvbGQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICogICAgIHZhciBpbnRlcmFjdGlvbiA9IGV2ZW50LmludGVyYWN0aW9uXG4gICAqXG4gICAqICAgICBpZiAoIWludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICogICAgICAgaW50ZXJhY3Rpb24uc3RhcnQoeyBuYW1lOiAnZHJhZycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW50ZXJhY3RhYmxlLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0KVxuICAgKiAgICAgfVxuICAgKiB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogU3RhcnQgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIEludGVyYWN0YWJsZSBhbmQgRWxlbWVudCBhcyB0YXJ0Z2V0cy4gVGhlXG4gICAqIGFjdGlvbiBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoZSB0YXJnZXQgSW50ZXJhY3RhYmxlIGFuZCBhbiBhcHByb3ByaWF0ZVxuICAgKiBudW1iZXIgb2YgcG9pbnRlcnMgbXVzdCBiZSBoZWxkIGRvd24gLSAxIGZvciBkcmFnL3Jlc2l6ZSwgMiBmb3IgZ2VzdHVyZS5cbiAgICpcbiAgICogVXNlIGl0IHdpdGggYGludGVyYWN0YWJsZS48YWN0aW9uPmFibGUoeyBtYW51YWxTdGFydDogZmFsc2UgfSlgIHRvIGFsd2F5c1xuICAgKiBbc3RhcnQgYWN0aW9ucyBtYW51YWxseV0oaHR0cHM6Ly9naXRodWIuY29tL3RheWUvaW50ZXJhY3QuanMvaXNzdWVzLzExNClcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiAgIFRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIC0gZHJhZywgcmVzaXplLCBldGMuXG4gICAqIEBwYXJhbSB7SW50ZXJhY3RhYmxlfSB0YXJnZXQgIFRoZSBJbnRlcmFjdGFibGUgdG8gdGFyZ2V0XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgRE9NIEVsZW1lbnQgdG8gdGFyZ2V0XG4gICAqIEByZXR1cm4ge29iamVjdH0gaW50ZXJhY3RcbiAgICovXG4gIHN0YXJ0IChhY3Rpb246IFN0YXJ0QWN0aW9uLCBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSwgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAgIGlmICh0aGlzLmludGVyYWN0aW5nKCkgfHxcbiAgICAgICAgIXRoaXMucG9pbnRlcklzRG93biB8fFxuICAgICAgICB0aGlzLnBvaW50ZXJzLmxlbmd0aCA8IChhY3Rpb24ubmFtZSA9PT0gJ2dlc3R1cmUnID8gMiA6IDEpIHx8XG4gICAgICAgICFpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb24ubmFtZV0uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgdXRpbHMuY29weUFjdGlvbih0aGlzLnByZXBhcmVkLCBhY3Rpb24pXG5cbiAgICB0aGlzLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICAgIHRoaXMuZWxlbWVudCAgICAgID0gZWxlbWVudFxuICAgIHRoaXMucmVjdCAgICAgICAgID0gaW50ZXJhY3RhYmxlLmdldFJlY3QoZWxlbWVudClcbiAgICB0aGlzLmVkZ2VzICAgICAgICA9IHRoaXMucHJlcGFyZWQuZWRnZXNcbiAgICAgID8gdXRpbHMuZXh0ZW5kKHt9LCB0aGlzLnByZXBhcmVkLmVkZ2VzKVxuICAgICAgOiB7IGxlZnQ6IHRydWUsIHJpZ2h0OiB0cnVlLCB0b3A6IHRydWUsIGJvdHRvbTogdHJ1ZSB9XG4gICAgdGhpcy5fc3RvcHBlZCAgICAgPSBmYWxzZVxuICAgIHRoaXMuX2ludGVyYWN0aW5nID0gdGhpcy5fZG9QaGFzZSh7XG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICAgIGV2ZW50OiB0aGlzLmRvd25FdmVudCxcbiAgICAgIHBoYXNlOiAnc3RhcnQnLFxuICAgIH0pICYmICF0aGlzLl9zdG9wcGVkXG5cbiAgICByZXR1cm4gdGhpcy5faW50ZXJhY3RpbmdcbiAgfVxuXG4gIHBvaW50ZXJNb3ZlIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCkge1xuICAgIGlmICghdGhpcy5zaW11bGF0aW9uICYmICEodGhpcy5tb2RpZmljYXRpb24gJiYgdGhpcy5tb2RpZmljYXRpb24uZW5kUmVzdWx0KSkge1xuICAgICAgdGhpcy51cGRhdGVQb2ludGVyKHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgZHVwbGljYXRlTW92ZSA9ICh0aGlzLmNvb3Jkcy5jdXIucGFnZS54ID09PSB0aGlzLmNvb3Jkcy5wcmV2LnBhZ2UueCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29yZHMuY3VyLnBhZ2UueSA9PT0gdGhpcy5jb29yZHMucHJldi5wYWdlLnkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzLmN1ci5jbGllbnQueCA9PT0gdGhpcy5jb29yZHMucHJldi5jbGllbnQueCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29yZHMuY3VyLmNsaWVudC55ID09PSB0aGlzLmNvb3Jkcy5wcmV2LmNsaWVudC55KVxuXG4gICAgbGV0IGR4XG4gICAgbGV0IGR5XG5cbiAgICAvLyByZWdpc3RlciBtb3ZlbWVudCBncmVhdGVyIHRoYW4gcG9pbnRlck1vdmVUb2xlcmFuY2VcbiAgICBpZiAodGhpcy5wb2ludGVySXNEb3duICYmICF0aGlzLnBvaW50ZXJXYXNNb3ZlZCkge1xuICAgICAgZHggPSB0aGlzLmNvb3Jkcy5jdXIuY2xpZW50LnggLSB0aGlzLmNvb3Jkcy5zdGFydC5jbGllbnQueFxuICAgICAgZHkgPSB0aGlzLmNvb3Jkcy5jdXIuY2xpZW50LnkgLSB0aGlzLmNvb3Jkcy5zdGFydC5jbGllbnQueVxuXG4gICAgICB0aGlzLnBvaW50ZXJXYXNNb3ZlZCA9IHV0aWxzLmh5cG90KGR4LCBkeSkgPiB0aGlzLnBvaW50ZXJNb3ZlVG9sZXJhbmNlXG4gICAgfVxuXG4gICAgY29uc3QgcG9pbnRlckluZGV4ID0gdGhpcy5nZXRQb2ludGVySW5kZXgocG9pbnRlcilcbiAgICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgICBwb2ludGVyLFxuICAgICAgcG9pbnRlckluZGV4LFxuICAgICAgcG9pbnRlckluZm86IHRoaXMucG9pbnRlcnNbcG9pbnRlckluZGV4XSxcbiAgICAgIGV2ZW50LFxuICAgICAgdHlwZTogJ21vdmUnIGFzIGNvbnN0LFxuICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICBkeCxcbiAgICAgIGR5LFxuICAgICAgZHVwbGljYXRlOiBkdXBsaWNhdGVNb3ZlLFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfVxuXG4gICAgaWYgKCFkdXBsaWNhdGVNb3ZlKSB7XG4gICAgICAvLyBzZXQgcG9pbnRlciBjb29yZGluYXRlLCB0aW1lIGNoYW5nZXMgYW5kIHZlbG9jaXR5XG4gICAgICB1dGlscy5wb2ludGVyLnNldENvb3JkVmVsb2NpdHkodGhpcy5jb29yZHMudmVsb2NpdHksIHRoaXMuY29vcmRzLmRlbHRhKVxuICAgIH1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOm1vdmUnLCBzaWduYWxBcmcpXG5cbiAgICBpZiAoIWR1cGxpY2F0ZU1vdmUgJiYgIXRoaXMuc2ltdWxhdGlvbikge1xuICAgICAgLy8gaWYgaW50ZXJhY3RpbmcsIGZpcmUgYW4gJ2FjdGlvbi1tb3ZlJyBzaWduYWwgZXRjXG4gICAgICBpZiAodGhpcy5pbnRlcmFjdGluZygpKSB7XG4gICAgICAgIHNpZ25hbEFyZy50eXBlID0gbnVsbFxuICAgICAgICB0aGlzLm1vdmUoc2lnbmFsQXJnKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wb2ludGVyV2FzTW92ZWQpIHtcbiAgICAgICAgdXRpbHMucG9pbnRlci5jb3B5Q29vcmRzKHRoaXMuY29vcmRzLnByZXYsIHRoaXMuY29vcmRzLmN1cilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAgIC5kcmFnZ2FibGUodHJ1ZSlcbiAgICogICAub24oJ2RyYWdtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAqICAgICBpZiAoc29tZUNvbmRpdGlvbikge1xuICAgKiAgICAgICAvLyBjaGFuZ2UgdGhlIHNuYXAgc2V0dGluZ3NcbiAgICogICAgICAgZXZlbnQuaW50ZXJhY3RhYmxlLmRyYWdnYWJsZSh7IHNuYXA6IHsgdGFyZ2V0czogW10gfX0pXG4gICAqICAgICAgIC8vIGZpcmUgYW5vdGhlciBtb3ZlIGV2ZW50IHdpdGggcmUtY2FsY3VsYXRlZCBzbmFwXG4gICAqICAgICAgIGV2ZW50LmludGVyYWN0aW9uLm1vdmUoKVxuICAgKiAgICAgfVxuICAgKiAgIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBGb3JjZSBhIG1vdmUgb2YgdGhlIGN1cnJlbnQgYWN0aW9uIGF0IHRoZSBzYW1lIGNvb3JkaW5hdGVzLiBVc2VmdWwgaWZcbiAgICogc25hcC9yZXN0cmljdCBoYXMgYmVlbiBjaGFuZ2VkIGFuZCB5b3Ugd2FudCBhIG1vdmVtZW50IHdpdGggdGhlIG5ld1xuICAgKiBzZXR0aW5ncy5cbiAgICovXG4gIG1vdmUgKHNpZ25hbEFyZz8pIHtcbiAgICBpZiAoIXNpZ25hbEFyZyB8fCAhc2lnbmFsQXJnLmV2ZW50KSB7XG4gICAgICB1dGlscy5wb2ludGVyLnNldFplcm9Db29yZHModGhpcy5jb29yZHMuZGVsdGEpXG4gICAgfVxuXG4gICAgc2lnbmFsQXJnID0gdXRpbHMuZXh0ZW5kKHtcbiAgICAgIHBvaW50ZXI6IHRoaXMuX2xhdGVzdFBvaW50ZXIucG9pbnRlcixcbiAgICAgIGV2ZW50OiB0aGlzLl9sYXRlc3RQb2ludGVyLmV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQsXG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICB9LCBzaWduYWxBcmcgfHwge30pXG5cbiAgICBzaWduYWxBcmcucGhhc2UgPSAnbW92ZSdcblxuICAgIHRoaXMuX2RvUGhhc2Uoc2lnbmFsQXJnKVxuICB9XG5cbiAgLy8gRW5kIGludGVyYWN0IG1vdmUgZXZlbnRzIGFuZCBzdG9wIGF1dG8tc2Nyb2xsIHVubGVzcyBzaW11bGF0aW9uIGlzIHJ1bm5pbmdcbiAgcG9pbnRlclVwIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCwgY3VyRXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0KSB7XG4gICAgbGV0IHBvaW50ZXJJbmRleCA9IHRoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG5cbiAgICBpZiAocG9pbnRlckluZGV4ID09PSAtMSkge1xuICAgICAgcG9pbnRlckluZGV4ID0gdGhpcy51cGRhdGVQb2ludGVyKHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IC9jYW5jZWwkL2kudGVzdChldmVudC50eXBlKSA/ICdjYW5jZWwnIDogJ3VwJ1xuXG4gICAgdGhpcy5fc2NvcGVGaXJlKGBpbnRlcmFjdGlvbnM6JHt0eXBlfWAgYXMgJ2ludGVyYWN0aW9uczp1cCcgfCAnaW50ZXJhY3Rpb25zOmNhbmNlbCcsIHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBwb2ludGVySW5kZXgsXG4gICAgICBwb2ludGVySW5mbzogdGhpcy5wb2ludGVyc1twb2ludGVySW5kZXhdLFxuICAgICAgZXZlbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHR5cGU6IHR5cGUgYXMgYW55LFxuICAgICAgY3VyRXZlbnRUYXJnZXQsXG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICB9KVxuXG4gICAgaWYgKCF0aGlzLnNpbXVsYXRpb24pIHtcbiAgICAgIHRoaXMuZW5kKGV2ZW50KVxuICAgIH1cblxuICAgIHRoaXMucG9pbnRlcklzRG93biA9IGZhbHNlXG4gICAgdGhpcy5yZW1vdmVQb2ludGVyKHBvaW50ZXIsIGV2ZW50KVxuICB9XG5cbiAgZG9jdW1lbnRCbHVyIChldmVudCkge1xuICAgIHRoaXMuZW5kKGV2ZW50KVxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOmJsdXInLCB7IGV2ZW50LCB0eXBlOiAnYmx1cicsIGludGVyYWN0aW9uOiB0aGlzIH0pXG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAgIC5kcmFnZ2FibGUodHJ1ZSlcbiAgICogICAub24oJ21vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICogICAgIGlmIChldmVudC5wYWdlWCA+IDEwMDApIHtcbiAgICogICAgICAgLy8gZW5kIHRoZSBjdXJyZW50IGFjdGlvblxuICAgKiAgICAgICBldmVudC5pbnRlcmFjdGlvbi5lbmQoKVxuICAgKiAgICAgICAvLyBzdG9wIGFsbCBmdXJ0aGVyIGxpc3RlbmVycyBmcm9tIGJlaW5nIGNhbGxlZFxuICAgKiAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgKiAgICAgfVxuICAgKiAgIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gW2V2ZW50XVxuICAgKi9cbiAgZW5kIChldmVudD86IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9lbmRpbmcgPSB0cnVlXG4gICAgZXZlbnQgPSBldmVudCB8fCB0aGlzLl9sYXRlc3RQb2ludGVyLmV2ZW50XG4gICAgbGV0IGVuZFBoYXNlUmVzdWx0XG5cbiAgICBpZiAodGhpcy5pbnRlcmFjdGluZygpKSB7XG4gICAgICBlbmRQaGFzZVJlc3VsdCA9IHRoaXMuX2RvUGhhc2Uoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgICAgIHBoYXNlOiAnZW5kJyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fZW5kaW5nID0gZmFsc2VcblxuICAgIGlmIChlbmRQaGFzZVJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdG9wKClcbiAgICB9XG4gIH1cblxuICBjdXJyZW50QWN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJhY3RpbmcgPyB0aGlzLnByZXBhcmVkLm5hbWUgOiBudWxsXG4gIH1cblxuICBpbnRlcmFjdGluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW5nXG4gIH1cblxuICAvKiogKi9cbiAgc3RvcCAoKSB7XG4gICAgdGhpcy5fc2NvcGVGaXJlKCdpbnRlcmFjdGlvbnM6c3RvcCcsIHsgaW50ZXJhY3Rpb246IHRoaXMgfSlcblxuICAgIHRoaXMuaW50ZXJhY3RhYmxlID0gdGhpcy5lbGVtZW50ID0gbnVsbFxuXG4gICAgdGhpcy5faW50ZXJhY3RpbmcgPSBmYWxzZVxuICAgIHRoaXMuX3N0b3BwZWQgPSB0cnVlXG4gICAgdGhpcy5wcmVwYXJlZC5uYW1lID0gdGhpcy5wcmV2RXZlbnQgPSBudWxsXG4gIH1cblxuICBnZXRQb2ludGVySW5kZXggKHBvaW50ZXIpIHtcbiAgICBjb25zdCBwb2ludGVySWQgPSB1dGlscy5wb2ludGVyLmdldFBvaW50ZXJJZChwb2ludGVyKVxuXG4gICAgLy8gbW91c2UgYW5kIHBlbiBpbnRlcmFjdGlvbnMgbWF5IGhhdmUgb25seSBvbmUgcG9pbnRlclxuICAgIHJldHVybiAodGhpcy5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCB0aGlzLnBvaW50ZXJUeXBlID09PSAncGVuJylcbiAgICAgID8gdGhpcy5wb2ludGVycy5sZW5ndGggLSAxXG4gICAgICA6IHV0aWxzLmFyci5maW5kSW5kZXgodGhpcy5wb2ludGVycywgY3VyUG9pbnRlciA9PiBjdXJQb2ludGVyLmlkID09PSBwb2ludGVySWQpXG4gIH1cblxuICBnZXRQb2ludGVySW5mbyAocG9pbnRlcikge1xuICAgIHJldHVybiB0aGlzLnBvaW50ZXJzW3RoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXVxuICB9XG5cbiAgdXBkYXRlUG9pbnRlciAocG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUsIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLCBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsIGRvd24/OiBib29sZWFuKSB7XG4gICAgY29uc3QgaWQgPSB1dGlscy5wb2ludGVyLmdldFBvaW50ZXJJZChwb2ludGVyKVxuICAgIGxldCBwb2ludGVySW5kZXggPSB0aGlzLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuICAgIGxldCBwb2ludGVySW5mbyA9IHRoaXMucG9pbnRlcnNbcG9pbnRlckluZGV4XVxuXG4gICAgZG93biA9IGRvd24gPT09IGZhbHNlXG4gICAgICA/IGZhbHNlXG4gICAgICA6IGRvd24gfHwgLyhkb3dufHN0YXJ0KSQvaS50ZXN0KGV2ZW50LnR5cGUpXG5cbiAgICBpZiAoIXBvaW50ZXJJbmZvKSB7XG4gICAgICBwb2ludGVySW5mbyA9IG5ldyBQb2ludGVySW5mbyhcbiAgICAgICAgaWQsXG4gICAgICAgIHBvaW50ZXIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKVxuXG4gICAgICBwb2ludGVySW5kZXggPSB0aGlzLnBvaW50ZXJzLmxlbmd0aFxuICAgICAgdGhpcy5wb2ludGVycy5wdXNoKHBvaW50ZXJJbmZvKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHBvaW50ZXJJbmZvLnBvaW50ZXIgPSBwb2ludGVyXG4gICAgfVxuXG4gICAgdXRpbHMucG9pbnRlci5zZXRDb29yZHModGhpcy5jb29yZHMuY3VyLCB0aGlzLnBvaW50ZXJzLm1hcChwID0+IHAucG9pbnRlciksIHRoaXMuX25vdygpKVxuICAgIHV0aWxzLnBvaW50ZXIuc2V0Q29vcmREZWx0YXModGhpcy5jb29yZHMuZGVsdGEsIHRoaXMuY29vcmRzLnByZXYsIHRoaXMuY29vcmRzLmN1cilcblxuICAgIGlmIChkb3duKSB7XG4gICAgICB0aGlzLnBvaW50ZXJJc0Rvd24gPSB0cnVlXG5cbiAgICAgIHBvaW50ZXJJbmZvLmRvd25UaW1lID0gdGhpcy5jb29yZHMuY3VyLnRpbWVTdGFtcFxuICAgICAgcG9pbnRlckluZm8uZG93blRhcmdldCA9IGV2ZW50VGFyZ2V0XG4gICAgICB1dGlscy5wb2ludGVyLnBvaW50ZXJFeHRlbmQodGhpcy5kb3duUG9pbnRlciwgcG9pbnRlcilcblxuICAgICAgaWYgKCF0aGlzLmludGVyYWN0aW5nKCkpIHtcbiAgICAgICAgdXRpbHMucG9pbnRlci5jb3B5Q29vcmRzKHRoaXMuY29vcmRzLnN0YXJ0LCB0aGlzLmNvb3Jkcy5jdXIpXG4gICAgICAgIHV0aWxzLnBvaW50ZXIuY29weUNvb3Jkcyh0aGlzLmNvb3Jkcy5wcmV2LCB0aGlzLmNvb3Jkcy5jdXIpXG5cbiAgICAgICAgdGhpcy5kb3duRXZlbnQgPSBldmVudFxuICAgICAgICB0aGlzLnBvaW50ZXJXYXNNb3ZlZCA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlTGF0ZXN0UG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQpXG5cbiAgICB0aGlzLl9zY29wZUZpcmUoJ2ludGVyYWN0aW9uczp1cGRhdGUtcG9pbnRlcicsIHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBldmVudCxcbiAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgZG93bixcbiAgICAgIHBvaW50ZXJJbmZvLFxuICAgICAgcG9pbnRlckluZGV4LFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfSlcblxuICAgIHJldHVybiBwb2ludGVySW5kZXhcbiAgfVxuXG4gIHJlbW92ZVBvaW50ZXIgKHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLCBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSkge1xuICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IHRoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG5cbiAgICBpZiAocG9pbnRlckluZGV4ID09PSAtMSkgeyByZXR1cm4gfVxuXG4gICAgY29uc3QgcG9pbnRlckluZm8gPSB0aGlzLnBvaW50ZXJzW3BvaW50ZXJJbmRleF1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOnJlbW92ZS1wb2ludGVyJywge1xuICAgICAgcG9pbnRlcixcbiAgICAgIGV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IG51bGwsXG4gICAgICBwb2ludGVySW5kZXgsXG4gICAgICBwb2ludGVySW5mbyxcbiAgICAgIGludGVyYWN0aW9uOiB0aGlzLFxuICAgIH0pXG5cbiAgICB0aGlzLnBvaW50ZXJzLnNwbGljZShwb2ludGVySW5kZXgsIDEpXG4gIH1cblxuICBfdXBkYXRlTGF0ZXN0UG9pbnRlciAocG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5wb2ludGVyID0gcG9pbnRlclxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnQgPSBldmVudFxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldFxuICB9XG5cbiAgZGVzdHJveSAoKSB7XG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5wb2ludGVyID0gbnVsbFxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnQgPSBudWxsXG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5ldmVudFRhcmdldCA9IG51bGxcbiAgfVxuXG4gIF9jcmVhdGVQcmVwYXJlZEV2ZW50PFAgZXh0ZW5kcyBFdmVudFBoYXNlPiAoZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIHBoYXNlOiBQLCBwcmVFbmQ/OiBib29sZWFuLCB0eXBlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBJbnRlcmFjdEV2ZW50PFQsIFA+KHRoaXMsIGV2ZW50LCB0aGlzLnByZXBhcmVkLm5hbWUsIHBoYXNlLCB0aGlzLmVsZW1lbnQsIHByZUVuZCwgdHlwZSlcbiAgfVxuXG4gIF9maXJlRXZlbnQ8UCBleHRlbmRzIEV2ZW50UGhhc2U+IChpRXZlbnQ6IEludGVyYWN0RXZlbnQ8VCwgUD4pIHtcbiAgICB0aGlzLmludGVyYWN0YWJsZS5maXJlKGlFdmVudClcblxuICAgIGlmICghdGhpcy5wcmV2RXZlbnQgfHwgaUV2ZW50LnRpbWVTdGFtcCA+PSB0aGlzLnByZXZFdmVudC50aW1lU3RhbXApIHtcbiAgICAgIHRoaXMucHJldkV2ZW50ID0gaUV2ZW50XG4gICAgfVxuICB9XG5cbiAgX2RvUGhhc2U8UCBleHRlbmRzIEV2ZW50UGhhc2U+IChzaWduYWxBcmc6IE9taXQ8RG9QaGFzZUFyZzxULCBQPiwgJ2lFdmVudCc+ICYgeyBpRXZlbnQ/OiBJbnRlcmFjdEV2ZW50PFQsIFA+IH0pIHtcbiAgICBjb25zdCB7IGV2ZW50LCBwaGFzZSwgcHJlRW5kLCB0eXBlIH0gPSBzaWduYWxBcmdcbiAgICBjb25zdCB7IHJlY3QgfSA9IHRoaXNcblxuICAgIGlmIChyZWN0ICYmIHBoYXNlID09PSAnbW92ZScpIHtcbiAgICAgIC8vIHVwZGF0ZSB0aGUgcmVjdCBjaGFuZ2VzIGR1ZSB0byBwb2ludGVyIG1vdmVcbiAgICAgIHV0aWxzLnJlY3QuYWRkRWRnZXModGhpcy5lZGdlcywgcmVjdCwgdGhpcy5jb29yZHMuZGVsdGFbdGhpcy5pbnRlcmFjdGFibGUub3B0aW9ucy5kZWx0YVNvdXJjZV0pXG5cbiAgICAgIHJlY3Qud2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0XG4gICAgICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgICB9XG5cbiAgICBjb25zdCBiZWZvcmVSZXN1bHQgPSB0aGlzLl9zY29wZUZpcmUoYGludGVyYWN0aW9uczpiZWZvcmUtYWN0aW9uLSR7cGhhc2V9YCBhcyBhbnksIHNpZ25hbEFyZylcblxuICAgIGlmIChiZWZvcmVSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBpRXZlbnQgPSBzaWduYWxBcmcuaUV2ZW50ID0gdGhpcy5fY3JlYXRlUHJlcGFyZWRFdmVudChldmVudCwgcGhhc2UsIHByZUVuZCwgdHlwZSlcblxuICAgIHRoaXMuX3Njb3BlRmlyZShgaW50ZXJhY3Rpb25zOmFjdGlvbi0ke3BoYXNlfWAgYXMgYW55LCBzaWduYWxBcmcpXG5cbiAgICBpZiAocGhhc2UgPT09ICdzdGFydCcpIHsgdGhpcy5wcmV2RXZlbnQgPSBpRXZlbnQgfVxuXG4gICAgdGhpcy5fZmlyZUV2ZW50KGlFdmVudClcblxuICAgIHRoaXMuX3Njb3BlRmlyZShgaW50ZXJhY3Rpb25zOmFmdGVyLWFjdGlvbi0ke3BoYXNlfWAgYXMgYW55LCBzaWduYWxBcmcpXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX25vdyAoKSB7IHJldHVybiBEYXRlLm5vdygpIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJhY3Rpb25cbmV4cG9ydCB7IFBvaW50ZXJJbmZvIH1cbiIsImltcG9ydCAqIGFzIGRvbSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21VdGlscydcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hEZXRhaWxzIHtcbiAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGVcbiAgcG9pbnRlcklkOiBudW1iZXJcbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuICBldmVudFR5cGU6IHN0cmluZ1xuICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgY3VyRXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZVxufVxuXG5jb25zdCBmaW5kZXIgPSB7XG4gIG1ldGhvZE9yZGVyOiBbJ3NpbXVsYXRpb25SZXN1bWUnLCAnbW91c2VPclBlbicsICdoYXNQb2ludGVyJywgJ2lkbGUnXSBhcyBjb25zdCxcblxuICBzZWFyY2ggKGRldGFpbHM6IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBmaW5kZXIubWV0aG9kT3JkZXIpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZmluZGVyW21ldGhvZF0oZGV0YWlscylcblxuICAgICAgaWYgKGludGVyYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgLy8gdHJ5IHRvIHJlc3VtZSBzaW11bGF0aW9uIHdpdGggYSBuZXcgcG9pbnRlclxuICBzaW11bGF0aW9uUmVzdW1lICh7IHBvaW50ZXJUeXBlLCBldmVudFR5cGUsIGV2ZW50VGFyZ2V0LCBzY29wZSB9OiBTZWFyY2hEZXRhaWxzKSB7XG4gICAgaWYgKCEvZG93bnxzdGFydC9pLnRlc3QoZXZlbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICBsZXQgZWxlbWVudCA9IGV2ZW50VGFyZ2V0IGFzIE5vZGVcblxuICAgICAgaWYgKGludGVyYWN0aW9uLnNpbXVsYXRpb24gJiYgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbi5hbGxvd1Jlc3VtZSAmJlxuICAgICAgICAgIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpKSB7XG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XG4gICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgdGhlIGludGVyYWN0aW9uIGVsZW1lbnRcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gaW50ZXJhY3Rpb24uZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGludGVyYWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQgPSBkb20ucGFyZW50Tm9kZShlbGVtZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICAvLyBpZiBpdCdzIGEgbW91c2Ugb3IgcGVuIGludGVyYWN0aW9uXG4gIG1vdXNlT3JQZW4gKHsgcG9pbnRlcklkLCBwb2ludGVyVHlwZSwgZXZlbnRUeXBlLCBzY29wZSB9OiBTZWFyY2hEZXRhaWxzKSB7XG4gICAgaWYgKHBvaW50ZXJUeXBlICE9PSAnbW91c2UnICYmIHBvaW50ZXJUeXBlICE9PSAncGVuJykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBsZXQgZmlyc3ROb25BY3RpdmVcblxuICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpIHtcbiAgICAgICAgLy8gaWYgaXQncyBhIGRvd24gZXZlbnQsIHNraXAgaW50ZXJhY3Rpb25zIHdpdGggcnVubmluZyBzaW11bGF0aW9uc1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiAmJiAhaGFzUG9pbnRlcklkKGludGVyYWN0aW9uLCBwb2ludGVySWQpKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICAvLyBpZiB0aGUgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLCByZXR1cm4gaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2Ugc2F2ZSBpdCBhbmQgbG9vayBmb3IgYW5vdGhlciBhY3RpdmUgaW50ZXJhY3Rpb25cbiAgICAgICAgZWxzZSBpZiAoIWZpcnN0Tm9uQWN0aXZlKSB7XG4gICAgICAgICAgZmlyc3ROb25BY3RpdmUgPSBpbnRlcmFjdGlvblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgbm8gYWN0aXZlIG1vdXNlIGludGVyYWN0aW9uIHdhcyBmb3VuZCB1c2UgdGhlIGZpcnN0IGluYWN0aXZlIG1vdXNlXG4gICAgLy8gaW50ZXJhY3Rpb25cbiAgICBpZiAoZmlyc3ROb25BY3RpdmUpIHtcbiAgICAgIHJldHVybiBmaXJzdE5vbkFjdGl2ZVxuICAgIH1cblxuICAgIC8vIGZpbmQgYW55IG1vdXNlIG9yIHBlbiBpbnRlcmFjdGlvbi5cbiAgICAvLyBpZ25vcmUgdGhlIGludGVyYWN0aW9uIGlmIHRoZSBldmVudFR5cGUgaXMgYSAqZG93biwgYW5kIGEgc2ltdWxhdGlvblxuICAgIC8vIGlzIGFjdGl2ZVxuICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUgJiYgISgvZG93bi9pLnRlc3QoZXZlbnRUeXBlKSAmJiBpbnRlcmFjdGlvbi5zaW11bGF0aW9uKSkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIC8vIGdldCBpbnRlcmFjdGlvbiB0aGF0IGhhcyB0aGlzIHBvaW50ZXJcbiAgaGFzUG9pbnRlciAoeyBwb2ludGVySWQsIHNjb3BlIH06IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICBpZiAoaGFzUG9pbnRlcklkKGludGVyYWN0aW9uLCBwb2ludGVySWQpKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgLy8gZ2V0IGZpcnN0IGlkbGUgaW50ZXJhY3Rpb24gd2l0aCBhIG1hdGNoaW5nIHBvaW50ZXJUeXBlXG4gIGlkbGUgKHsgcG9pbnRlclR5cGUsIHNjb3BlIH06IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICAvLyBpZiB0aGVyZSdzIGFscmVhZHkgYSBwb2ludGVyIGhlbGQgZG93blxuICAgICAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGVcbiAgICAgICAgLy8gZG9uJ3QgYWRkIHRoaXMgcG9pbnRlciBpZiB0aGVyZSBpcyBhIHRhcmdldCBpbnRlcmFjdGFibGUgYW5kIGl0XG4gICAgICAgIC8vIGlzbid0IGdlc3R1cmFibGVcbiAgICAgICAgaWYgKHRhcmdldCAmJiAhKHRhcmdldC5vcHRpb25zLmdlc3R1cmUgJiYgdGFyZ2V0Lm9wdGlvbnMuZ2VzdHVyZS5lbmFibGVkKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG1heGltdW0gb2YgMiBwb2ludGVycyBwZXIgaW50ZXJhY3Rpb25cbiAgICAgIGVsc2UgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSAmJiAocG9pbnRlclR5cGUgPT09IGludGVyYWN0aW9uLnBvaW50ZXJUeXBlKSkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxufVxuXG5mdW5jdGlvbiBoYXNQb2ludGVySWQgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiwgcG9pbnRlcklkOiBudW1iZXIpIHtcbiAgcmV0dXJuIGludGVyYWN0aW9uLnBvaW50ZXJzLnNvbWUoKHsgaWQgfSkgPT4gaWQgPT09IHBvaW50ZXJJZClcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmluZGVyXG4iLCJpbXBvcnQgeyBtYXRjaGVzU2VsZWN0b3IsIG5vZGVDb250YWlucyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV2ZW50cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ldmVudHMnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcbmltcG9ydCB7IGdldFdpbmRvdyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3dpbmRvdydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIHByZXZlbnREZWZhdWx0OiB0eXBlb2YgcHJldmVudERlZmF1bHRcbiAgICBjaGVja0FuZFByZXZlbnREZWZhdWx0OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkXG4gIH1cbn1cblxudHlwZSBQcmV2ZW50RGVmYXVsdFZhbHVlID0gJ2Fsd2F5cycgfCAnbmV2ZXInIHwgJ2F1dG8nXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKTogUHJldmVudERlZmF1bHRWYWx1ZVxuZnVuY3Rpb24gcHJldmVudERlZmF1bHQgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU6IFByZXZlbnREZWZhdWx0VmFsdWUpOiB0eXBlb2YgdGhpc1xuZnVuY3Rpb24gcHJldmVudERlZmF1bHQgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU/OiBQcmV2ZW50RGVmYXVsdFZhbHVlKSB7XG4gIGlmICgvXihhbHdheXN8bmV2ZXJ8YXV0bykkLy50ZXN0KG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCA9IG5ld1ZhbHVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGlmIChpcy5ib29sKG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCA9IG5ld1ZhbHVlID8gJ2Fsd2F5cycgOiAnbmV2ZXInXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMucHJldmVudERlZmF1bHRcbn1cblxuZnVuY3Rpb24gY2hlY2tBbmRQcmV2ZW50RGVmYXVsdCAoaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIHNjb3BlOiBJbnRlcmFjdC5TY29wZSwgZXZlbnQ6IEV2ZW50KSB7XG4gIGNvbnN0IHNldHRpbmcgPSBpbnRlcmFjdGFibGUub3B0aW9ucy5wcmV2ZW50RGVmYXVsdFxuXG4gIGlmIChzZXR0aW5nID09PSAnbmV2ZXInKSB7IHJldHVybiB9XG5cbiAgaWYgKHNldHRpbmcgPT09ICdhbHdheXMnKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gc2V0dGluZyA9PT0gJ2F1dG8nXG5cbiAgLy8gaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMgYW5kIGlzbid0IHJ1bm5pbmcgb24gaU9TLFxuICAvLyBkb24ndCBwcmV2ZW50RGVmYXVsdCBvZiB0b3VjaHtzdGFydCxtb3ZlfSBldmVudHMuIENTUyB0b3VjaC1hY3Rpb24gYW5kXG4gIC8vIHVzZXItc2VsZWN0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgY2FsbGluZyBldmVudC5wcmV2ZW50RGVmYXVsdCgpLlxuICBpZiAoZXZlbnRzLnN1cHBvcnRzUGFzc2l2ZSAmJiAvXnRvdWNoKHN0YXJ0fG1vdmUpJC8udGVzdChldmVudC50eXBlKSkge1xuICAgIGNvbnN0IGRvYyA9IGdldFdpbmRvdyhldmVudC50YXJnZXQpLmRvY3VtZW50XG4gICAgY29uc3QgZG9jT3B0aW9ucyA9IHNjb3BlLmdldERvY09wdGlvbnMoZG9jKVxuXG4gICAgaWYgKCEoZG9jT3B0aW9ucyAmJiBkb2NPcHRpb25zLmV2ZW50cykgfHwgZG9jT3B0aW9ucy5ldmVudHMucGFzc2l2ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8vIGRvbid0IHByZXZlbnREZWZhdWx0IG9mIHBvaW50ZXJkb3duIGV2ZW50c1xuICBpZiAoL14obW91c2V8cG9pbnRlcnx0b3VjaCkqKGRvd258c3RhcnQpL2kudGVzdChldmVudC50eXBlKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gZG9uJ3QgcHJldmVudERlZmF1bHQgb24gZWRpdGFibGUgZWxlbWVudHNcbiAgaWYgKGlzLmVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgbWF0Y2hlc1NlbGVjdG9yKGV2ZW50LnRhcmdldCwgJ2lucHV0LHNlbGVjdCx0ZXh0YXJlYSxbY29udGVudGVkaXRhYmxlPXRydWVdLFtjb250ZW50ZWRpdGFibGU9dHJ1ZV0gKicpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG5cbmZ1bmN0aW9uIG9uSW50ZXJhY3Rpb25FdmVudCAoeyBpbnRlcmFjdGlvbiwgZXZlbnQgfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSkge1xuICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5jaGVja0FuZFByZXZlbnREZWZhdWx0KGV2ZW50IGFzIEV2ZW50KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsIChzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgY29uc3QgeyBJbnRlcmFjdGFibGUgfSA9IHNjb3BlXG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB3aGV0aGVyIHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW91ciBpblxuICAgKiByZXNwb25zZSB0byBwb2ludGVyIGV2ZW50cy4gQ2FuIGJlIHNldCB0bzpcbiAgICogIC0gYCdhbHdheXMnYCB0byBhbHdheXMgcHJldmVudFxuICAgKiAgLSBgJ25ldmVyJ2AgdG8gbmV2ZXIgcHJldmVudFxuICAgKiAgLSBgJ2F1dG8nYCB0byBsZXQgaW50ZXJhY3QuanMgdHJ5IHRvIGRldGVybWluZSB3aGF0IHdvdWxkIGJlIGJlc3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuZXdWYWx1ZV0gYCdhbHdheXMnYCwgYCduZXZlcidgIG9yIGAnYXV0bydgXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IEludGVyYWN0YWJsZX0gVGhlIGN1cnJlbnQgc2V0dGluZyBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IHByZXZlbnREZWZhdWx0XG5cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5jaGVja0FuZFByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGNoZWNrQW5kUHJldmVudERlZmF1bHQodGhpcywgc2NvcGUsIGV2ZW50KVxuICB9XG5cbiAgLy8gcHJldmVudCBuYXRpdmUgSFRNTDUgZHJhZyBvbiBpbnRlcmFjdC5qcyB0YXJnZXQgZWxlbWVudHNcbiAgc2NvcGUuaW50ZXJhY3Rpb25zLmRvY0V2ZW50cy5wdXNoKHtcbiAgICB0eXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICBsaXN0ZW5lciAoZXZlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmVsZW1lbnQgJiZcbiAgICAgICAgICAoaW50ZXJhY3Rpb24uZWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0IHx8XG4gICAgICAgICAgIG5vZGVDb250YWlucyhpbnRlcmFjdGlvbi5lbGVtZW50LCBldmVudC50YXJnZXQpKSkge1xuICAgICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5jaGVja0FuZFByZXZlbnREZWZhdWx0KGV2ZW50KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2NvcmUvaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IFsnZG93bicsICdtb3ZlJywgJ3VwJywgJ2NhbmNlbCddLnJlZHVjZSgoYWNjLCBldmVudFR5cGUpID0+IHtcbiAgICBhY2NbYGludGVyYWN0aW9uczoke2V2ZW50VHlwZX1gXSA9IG9uSW50ZXJhY3Rpb25FdmVudFxuICAgIHJldHVybiBhY2NcbiAgfSwge30gYXMgYW55KSxcbn1cbiIsImltcG9ydCBCYXNlRXZlbnQgZnJvbSAnQGludGVyYWN0anMvY29yZS9CYXNlRXZlbnQnXG5pbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IEludGVyYWN0RXZlbnQgZnJvbSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcblxuY2xhc3MgRHJvcEV2ZW50IGV4dGVuZHMgQmFzZUV2ZW50IHtcbiAgdGFyZ2V0OiBJbnRlcmFjdC5FbGVtZW50XG4gIGRyb3B6b25lOiBJbnRlcmFjdGFibGVcbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdEV2ZW50PCdkcmFnJz5cbiAgcmVsYXRlZFRhcmdldDogSW50ZXJhY3QuRWxlbWVudFxuICBkcmFnZ2FibGU6IEludGVyYWN0YWJsZVxuICB0aW1lU3RhbXA6IG51bWJlclxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBDbGFzcyBvZiBldmVudHMgZmlyZWQgb24gZHJvcHpvbmVzIGR1cmluZyBkcmFncyB3aXRoIGFjY2VwdGFibGUgdGFyZ2V0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChkcm9wU3RhdGU6IGltcG9ydCgnLi8nKS5Ecm9wU3RhdGUsIGRyYWdFdmVudDogSW50ZXJhY3RFdmVudDwnZHJhZyc+LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihkcmFnRXZlbnQuX2ludGVyYWN0aW9uKVxuXG4gICAgY29uc3QgeyBlbGVtZW50LCBkcm9wem9uZSB9ID0gdHlwZSA9PT0gJ2RyYWdsZWF2ZSdcbiAgICAgID8gZHJvcFN0YXRlLnByZXZcbiAgICAgIDogZHJvcFN0YXRlLmN1clxuXG4gICAgdGhpcy50eXBlICAgICAgICAgID0gdHlwZVxuICAgIHRoaXMudGFyZ2V0ICAgICAgICA9IGVsZW1lbnRcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50XG4gICAgdGhpcy5kcm9wem9uZSAgICAgID0gZHJvcHpvbmVcbiAgICB0aGlzLmRyYWdFdmVudCAgICAgPSBkcmFnRXZlbnRcbiAgICB0aGlzLnJlbGF0ZWRUYXJnZXQgPSBkcmFnRXZlbnQudGFyZ2V0XG4gICAgdGhpcy5kcmFnZ2FibGUgICAgID0gZHJhZ0V2ZW50LmludGVyYWN0YWJsZVxuICAgIHRoaXMudGltZVN0YW1wICAgICA9IGRyYWdFdmVudC50aW1lU3RhbXBcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIGEgYGRyb3BhY3RpdmF0ZWAgZXZlbnQsIHRoZSBkcm9wem9uZSBlbGVtZW50IHdpbGwgYmVcbiAgICogZGVhY3RpdmF0ZWQuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYSBgZHJhZ21vdmVgIG9yIGBkcmFnZW50ZXJgLCBhIGBkcmFnbGVhdmVgIHdpbGwgYmUgZmlyZWQgb24gdGhlXG4gICAqIGRyb3B6b25lIGVsZW1lbnQgYW5kIG1vcmUuXG4gICAqL1xuICByZWplY3QgKCkge1xuICAgIGNvbnN0IHsgZHJvcFN0YXRlIH0gPSB0aGlzLl9pbnRlcmFjdGlvblxuXG4gICAgaWYgKFxuICAgICAgKHRoaXMudHlwZSAhPT0gJ2Ryb3BhY3RpdmF0ZScpICYmIChcbiAgICAgICAgIXRoaXMuZHJvcHpvbmUgfHxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSAhPT0gdGhpcy5kcm9wem9uZSB8fFxuICAgICAgICBkcm9wU3RhdGUuY3VyLmVsZW1lbnQgIT09IHRoaXMudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZHJvcFN0YXRlLnByZXYuZHJvcHpvbmUgPSB0aGlzLmRyb3B6b25lXG4gICAgZHJvcFN0YXRlLnByZXYuZWxlbWVudCA9IHRoaXMudGFyZ2V0XG5cbiAgICBkcm9wU3RhdGUucmVqZWN0ZWQgPSB0cnVlXG4gICAgZHJvcFN0YXRlLmV2ZW50cy5lbnRlciA9IG51bGxcblxuICAgIHRoaXMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkcm9wYWN0aXZhdGUnKSB7XG4gICAgICBjb25zdCBhY3RpdmVEcm9wcyA9IGRyb3BTdGF0ZS5hY3RpdmVEcm9wc1xuICAgICAgY29uc3QgaW5kZXggPSBhcnIuZmluZEluZGV4KGFjdGl2ZURyb3BzLCAoeyBkcm9wem9uZSwgZWxlbWVudCB9KSA9PlxuICAgICAgICBkcm9wem9uZSA9PT0gdGhpcy5kcm9wem9uZSAmJiBlbGVtZW50ID09PSB0aGlzLnRhcmdldClcblxuICAgICAgZHJvcFN0YXRlLmFjdGl2ZURyb3BzLnNwbGljZShpbmRleCwgMSlcblxuICAgICAgY29uc3QgZGVhY3RpdmF0ZUV2ZW50ID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIHRoaXMuZHJhZ0V2ZW50LCAnZHJvcGRlYWN0aXZhdGUnKVxuXG4gICAgICBkZWFjdGl2YXRlRXZlbnQuZHJvcHpvbmUgPSB0aGlzLmRyb3B6b25lXG4gICAgICBkZWFjdGl2YXRlRXZlbnQudGFyZ2V0ID0gdGhpcy50YXJnZXRcblxuICAgICAgdGhpcy5kcm9wem9uZS5maXJlKGRlYWN0aXZhdGVFdmVudClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRyb3B6b25lLmZpcmUobmV3IERyb3BFdmVudChkcm9wU3RhdGUsIHRoaXMuZHJhZ0V2ZW50LCAnZHJhZ2xlYXZlJykpXG4gICAgfVxuICB9XG5cbiAgcHJldmVudERlZmF1bHQgKCkge31cblxuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERyb3BFdmVudFxuIiwiaW1wb3J0IEludGVyYWN0YWJsZSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZSdcbmltcG9ydCBJbnRlcmFjdEV2ZW50IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RFdmVudCdcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9zY29wZSdcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0IGRyYWcgZnJvbSAnLi4vZHJhZydcbmltcG9ydCBEcm9wRXZlbnQgZnJvbSAnLi9Ecm9wRXZlbnQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcHpvbmVNZXRob2Qge1xuICAob3B0aW9uczogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zIHwgYm9vbGVhbik6IEludGVyYWN0LkludGVyYWN0YWJsZVxuICAoKTogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBkcm9wem9uZTogRHJvcHpvbmVNZXRob2RcbiAgICBkcm9wQ2hlY2s6IChcbiAgICAgIGRyYWdFdmVudDogSW50ZXJhY3RFdmVudCxcbiAgICAgIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLFxuICAgICAgZHJhZ2dhYmxlOiBJbnRlcmFjdGFibGUsXG4gICAgICBkcmFnZ2FibGVFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgICAgZHJvcEVsZW1lbjogSW50ZXJhY3QuRWxlbWVudCxcbiAgICAgIHJlY3Q6IGFueVxuICAgICkgPT4gYm9vbGVhblxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgZHJvcFN0YXRlPzogRHJvcFN0YXRlXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBkcm9wOiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgQWN0aW9uTWFwIHtcbiAgICBkcm9wPzogdHlwZW9mIGRyb3BcbiAgfVxuXG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgZHluYW1pY0Ryb3A/OiBib29sZWFuXG4gIH1cblxuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2FjdGlvbnMvZHJvcDpzdGFydCc6IERyb3BTaWduYWxBcmdcbiAgICAnYWN0aW9ucy9kcm9wOm1vdmUnOiBEcm9wU2lnbmFsQXJnXG4gICAgJ2FjdGlvbnMvZHJvcDplbmQnOiBEcm9wU2lnbmFsQXJnXG4gIH1cbn1cblxuaW50ZXJmYWNlIERyb3BTaWduYWxBcmcge1xuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdC5EcmFnRXZlbnRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEcm9wU3RhdGUge1xuICBjdXI6IHtcbiAgICBkcm9wem9uZTogSW50ZXJhY3RhYmxlICAgIC8vIHRoZSBkcm9wem9uZSBhIGRyYWcgdGFyZ2V0IG1pZ2h0IGJlIGRyb3BwZWQgaW50b1xuICAgIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQgLy8gdGhlIGVsZW1lbnQgYXQgdGhlIHRpbWUgb2YgY2hlY2tpbmdcbiAgfVxuICBwcmV2OiB7XG4gICAgZHJvcHpvbmU6IEludGVyYWN0YWJsZSAgICAvLyB0aGUgZHJvcHpvbmUgdGhhdCB3YXMgcmVjZW50bHkgZHJhZ2dlZCBhd2F5IGZyb21cbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50IC8vIHRoZSBlbGVtZW50IGF0IHRoZSB0aW1lIG9mIGNoZWNraW5nXG4gIH1cbiAgcmVqZWN0ZWQ6IGJvb2xlYW4gICAgICAgICAgIC8vIHdoZWF0aGVyIHRoZSBwb3RlbnRpYWwgZHJvcCB3YXMgcmVqZWN0ZWQgZnJvbSBhIGxpc3RlbmVyXG4gIGV2ZW50czogYW55ICAgICAgICAgICAgICAgICAvLyB0aGUgZHJvcCBldmVudHMgcmVsYXRlZCB0byB0aGUgY3VycmVudCBkcmFnIGV2ZW50XG4gIGFjdGl2ZURyb3BzOiBBcnJheTx7XG4gICAgZHJvcHpvbmU6IEludGVyYWN0YWJsZVxuICAgIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbiAgICByZWN0OiBJbnRlcmFjdC5SZWN0XG4gIH0+XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgYWN0aW9ucyxcbiAgICAvKiogQGxlbmRzIG1vZHVsZTppbnRlcmFjdCAqL1xuICAgIGludGVyYWN0LFxuICAgIC8qKiBAbGVuZHMgSW50ZXJhY3RhYmxlICovXG4gICAgSW50ZXJhY3RhYmxlLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNoYWRvd1xuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS51c2VQbHVnaW4oZHJhZylcblxuICAvKipcbiAgICpcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QoJy5kcm9wJykuZHJvcHpvbmUoe1xuICAgKiAgIGFjY2VwdDogJy5jYW4tZHJvcCcgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbmdsZS1kcm9wJyksXG4gICAqICAgb3ZlcmxhcDogJ3BvaW50ZXInIHx8ICdjZW50ZXInIHx8IHplcm9Ub09uZVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXR1cm5zIG9yIHNldHMgd2hldGhlciBkcmFnZ2FibGVzIGNhbiBiZSBkcm9wcGVkIG9udG8gdGhpcyB0YXJnZXQgdG9cbiAgICogdHJpZ2dlciBkcm9wIGV2ZW50c1xuICAgKlxuICAgKiBEcm9wem9uZXMgY2FuIHJlY2VpdmUgdGhlIGZvbGxvd2luZyBldmVudHM6XG4gICAqICAtIGBkcm9wYWN0aXZhdGVgIGFuZCBgZHJvcGRlYWN0aXZhdGVgIHdoZW4gYW4gYWNjZXB0YWJsZSBkcmFnIHN0YXJ0cyBhbmQgZW5kc1xuICAgKiAgLSBgZHJhZ2VudGVyYCBhbmQgYGRyYWdsZWF2ZWAgd2hlbiBhIGRyYWdnYWJsZSBlbnRlcnMgYW5kIGxlYXZlcyB0aGUgZHJvcHpvbmVcbiAgICogIC0gYGRyYWdtb3ZlYCB3aGVuIGEgZHJhZ2dhYmxlIHRoYXQgaGFzIGVudGVyZWQgdGhlIGRyb3B6b25lIGlzIG1vdmVkXG4gICAqICAtIGBkcm9wYCB3aGVuIGEgZHJhZ2dhYmxlIGlzIGRyb3BwZWQgaW50byB0aGlzIGRyb3B6b25lXG4gICAqXG4gICAqIFVzZSB0aGUgYGFjY2VwdGAgb3B0aW9uIHRvIGFsbG93IG9ubHkgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gQ1NTXG4gICAqIHNlbGVjdG9yIG9yIGVsZW1lbnQuIFRoZSB2YWx1ZSBjYW4gYmU6XG4gICAqXG4gICAqICAtICoqYW4gRWxlbWVudCoqIC0gb25seSB0aGF0IGVsZW1lbnQgY2FuIGJlIGRyb3BwZWQgaW50byB0aGlzIGRyb3B6b25lLlxuICAgKiAgLSAqKmEgc3RyaW5nKiosIC0gdGhlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZCBtdXN0IG1hdGNoIGl0IGFzIGEgQ1NTIHNlbGVjdG9yLlxuICAgKiAgLSAqKmBudWxsYCoqIC0gYWNjZXB0IG9wdGlvbnMgaXMgY2xlYXJlZCAtIGl0IGFjY2VwdHMgYW55IGVsZW1lbnQuXG4gICAqXG4gICAqIFVzZSB0aGUgYG92ZXJsYXBgIG9wdGlvbiB0byBzZXQgaG93IGRyb3BzIGFyZSBjaGVja2VkIGZvci4gVGhlIGFsbG93ZWRcbiAgICogdmFsdWVzIGFyZTpcbiAgICpcbiAgICogICAtIGAncG9pbnRlcidgLCB0aGUgcG9pbnRlciBtdXN0IGJlIG92ZXIgdGhlIGRyb3B6b25lIChkZWZhdWx0KVxuICAgKiAgIC0gYCdjZW50ZXInYCwgdGhlIGRyYWdnYWJsZSBlbGVtZW50J3MgY2VudGVyIG11c3QgYmUgb3ZlciB0aGUgZHJvcHpvbmVcbiAgICogICAtIGEgbnVtYmVyIGZyb20gMC0xIHdoaWNoIGlzIHRoZSBgKGludGVyc2VjdGlvbiBhcmVhKSAvIChkcmFnZ2FibGUgYXJlYSlgLlxuICAgKiAgIGUuZy4gYDAuNWAgZm9yIGRyb3AgdG8gaGFwcGVuIHdoZW4gaGFsZiBvZiB0aGUgYXJlYSBvZiB0aGUgZHJhZ2dhYmxlIGlzXG4gICAqICAgb3ZlciB0aGUgZHJvcHpvbmVcbiAgICpcbiAgICogVXNlIHRoZSBgY2hlY2tlcmAgb3B0aW9uIHRvIHNwZWNpZnkgYSBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGRyYWdnZWQgZWxlbWVudFxuICAgKiBpcyBvdmVyIHRoaXMgSW50ZXJhY3RhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW4gfCBvYmplY3QgfCBudWxsfSBbb3B0aW9uc10gVGhlIG5ldyBvcHRpb25zIHRvIGJlIHNldC5cbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IEludGVyYWN0YWJsZX0gVGhlIGN1cnJlbnQgc2V0dGluZyBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5kcm9wem9uZSA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIG9wdGlvbnM/OiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnMgfCBib29sZWFuKSB7XG4gICAgcmV0dXJuIGRyb3B6b25lTWV0aG9kKHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAuZHJvcENoZWNrZXIoZnVuY3Rpb24oZHJhZ0V2ZW50LCAgICAgICAgIC8vIHJlbGF0ZWQgZHJhZ21vdmUgb3IgZHJhZ2VuZCBldmVudFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsICAgICAgICAgICAgIC8vIFRvdWNoRXZlbnQvUG9pbnRlckV2ZW50L01vdXNlRXZlbnRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsICAgICAgICAgICAvLyBib29sIHJlc3VsdCBvZiB0aGUgZGVmYXVsdCBjaGVja2VyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcm9wem9uZSwgICAgICAgICAgLy8gZHJvcHpvbmUgSW50ZXJhY3RhYmxlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcm9wRWxlbWVudCwgICAgICAgLy8gZHJvcHpvbmUgZWxlbW50XG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGUsICAgICAgICAgLy8gZHJhZ2dhYmxlIEludGVyYWN0YWJsZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlRWxlbWVudCkgey8vIGRyYWdnYWJsZSBlbGVtZW50XG4gICAqXG4gICAqICAgcmV0dXJuIGRyb3BwZWQgJiYgZXZlbnQudGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnYWxsb3ctZHJvcCcpXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyb3BDaGVjayA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIGRyYWdFdmVudCwgZXZlbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudCwgZHJvcEVsZW1lbnQsIHJlY3QpIHtcbiAgICByZXR1cm4gZHJvcENoZWNrTWV0aG9kKHRoaXMsIGRyYWdFdmVudCwgZXZlbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudCwgZHJvcEVsZW1lbnQsIHJlY3QpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHdoZXRoZXIgdGhlIGRpbWVuc2lvbnMgb2YgZHJvcHpvbmUgZWxlbWVudHMgYXJlIGNhbGN1bGF0ZWRcbiAgICogb24gZXZlcnkgZHJhZ21vdmUgb3Igb25seSBvbiBkcmFnc3RhcnQgZm9yIHRoZSBkZWZhdWx0IGRyb3BDaGVja2VyXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25ld1ZhbHVlXSBUcnVlIHRvIGNoZWNrIG9uIGVhY2ggbW92ZS4gRmFsc2UgdG8gY2hlY2sgb25seVxuICAgKiBiZWZvcmUgc3RhcnRcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IGludGVyYWN0fSBUaGUgY3VycmVudCBzZXR0aW5nIG9yIGludGVyYWN0XG4gICAqL1xuICBpbnRlcmFjdC5keW5hbWljRHJvcCA9IGZ1bmN0aW9uIChuZXdWYWx1ZT86IGJvb2xlYW4pIHtcbiAgICBpZiAodXRpbHMuaXMuYm9vbChuZXdWYWx1ZSkpIHtcbiAgICAgIC8vIGlmIChkcmFnZ2luZyAmJiBzY29wZS5keW5hbWljRHJvcCAhPT0gbmV3VmFsdWUgJiYgIW5ld1ZhbHVlKSB7XG4gICAgICAvLyAgY2FsY1JlY3RzKGRyb3B6b25lcylcbiAgICAgIC8vIH1cblxuICAgICAgc2NvcGUuZHluYW1pY0Ryb3AgPSBuZXdWYWx1ZVxuXG4gICAgICByZXR1cm4gaW50ZXJhY3RcbiAgICB9XG4gICAgcmV0dXJuIHNjb3BlLmR5bmFtaWNEcm9wXG4gIH1cblxuICB1dGlscy5leHRlbmQoYWN0aW9ucy5waGFzZWxlc3NUeXBlcywge1xuICAgIGRyYWdlbnRlcjogdHJ1ZSxcbiAgICBkcmFnbGVhdmU6IHRydWUsXG4gICAgZHJvcGFjdGl2YXRlOiB0cnVlLFxuICAgIGRyb3BkZWFjdGl2YXRlOiB0cnVlLFxuICAgIGRyb3Btb3ZlOiB0cnVlLFxuICAgIGRyb3A6IHRydWUsXG4gIH0pXG4gIGFjdGlvbnMubWV0aG9kRGljdC5kcm9wID0gJ2Ryb3B6b25lJ1xuXG4gIHNjb3BlLmR5bmFtaWNEcm9wID0gZmFsc2VcblxuICBkZWZhdWx0cy5hY3Rpb25zLmRyb3AgPSBkcm9wLmRlZmF1bHRzXG59XG5cbmZ1bmN0aW9uIGNvbGxlY3REcm9wcyAoeyBpbnRlcmFjdGFibGVzIH0sIGRyYWdnYWJsZUVsZW1lbnQpIHtcbiAgY29uc3QgZHJvcHMgPSBbXVxuXG4gIC8vIGNvbGxlY3QgYWxsIGRyb3B6b25lcyBhbmQgdGhlaXIgZWxlbWVudHMgd2hpY2ggcXVhbGlmeSBmb3IgYSBkcm9wXG4gIGZvciAoY29uc3QgZHJvcHpvbmUgb2YgaW50ZXJhY3RhYmxlcy5saXN0KSB7XG4gICAgaWYgKCFkcm9wem9uZS5vcHRpb25zLmRyb3AuZW5hYmxlZCkgeyBjb250aW51ZSB9XG5cbiAgICBjb25zdCBhY2NlcHQgPSBkcm9wem9uZS5vcHRpb25zLmRyb3AuYWNjZXB0XG5cbiAgICAvLyB0ZXN0IHRoZSBkcmFnZ2FibGUgZHJhZ2dhYmxlRWxlbWVudCBhZ2FpbnN0IHRoZSBkcm9wem9uZSdzIGFjY2VwdCBzZXR0aW5nXG4gICAgaWYgKCh1dGlscy5pcy5lbGVtZW50KGFjY2VwdCkgJiYgYWNjZXB0ICE9PSBkcmFnZ2FibGVFbGVtZW50KSB8fFxuICAgICAgICAodXRpbHMuaXMuc3RyaW5nKGFjY2VwdCkgJiZcbiAgICAgICAgIXV0aWxzLmRvbS5tYXRjaGVzU2VsZWN0b3IoZHJhZ2dhYmxlRWxlbWVudCwgYWNjZXB0KSkgfHxcbiAgICAgICAgKHV0aWxzLmlzLmZ1bmMoYWNjZXB0KSAmJiAhYWNjZXB0KHsgZHJvcHpvbmUsIGRyYWdnYWJsZUVsZW1lbnQgfSkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIHF1ZXJ5IGZvciBuZXcgZWxlbWVudHMgaWYgbmVjZXNzYXJ5XG4gICAgY29uc3QgZHJvcEVsZW1lbnRzID0gdXRpbHMuaXMuc3RyaW5nKGRyb3B6b25lLnRhcmdldClcbiAgICAgID8gZHJvcHpvbmUuX2NvbnRleHQucXVlcnlTZWxlY3RvckFsbChkcm9wem9uZS50YXJnZXQpXG4gICAgICA6IHV0aWxzLmlzLmFycmF5KGRyb3B6b25lLnRhcmdldCkgPyBkcm9wem9uZS50YXJnZXQgOiBbZHJvcHpvbmUudGFyZ2V0XVxuXG4gICAgZm9yIChjb25zdCBkcm9wem9uZUVsZW1lbnQgb2YgZHJvcEVsZW1lbnRzKSB7XG4gICAgICBpZiAoZHJvcHpvbmVFbGVtZW50ICE9PSBkcmFnZ2FibGVFbGVtZW50KSB7XG4gICAgICAgIGRyb3BzLnB1c2goe1xuICAgICAgICAgIGRyb3B6b25lLFxuICAgICAgICAgIGVsZW1lbnQ6IGRyb3B6b25lRWxlbWVudCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZHJvcHNcbn1cblxuZnVuY3Rpb24gZmlyZUFjdGl2YXRpb25FdmVudHMgKGFjdGl2ZURyb3BzLCBldmVudCkge1xuICAvLyBsb29wIHRocm91Z2ggYWxsIGFjdGl2ZSBkcm9wem9uZXMgYW5kIHRyaWdnZXIgZXZlbnRcbiAgZm9yIChjb25zdCB7IGRyb3B6b25lLCBlbGVtZW50IH0gb2YgYWN0aXZlRHJvcHMuc2xpY2UoKSkge1xuICAgIGV2ZW50LmRyb3B6b25lID0gZHJvcHpvbmVcblxuICAgIC8vIHNldCBjdXJyZW50IGVsZW1lbnQgYXMgZXZlbnQgdGFyZ2V0XG4gICAgZXZlbnQudGFyZ2V0ID0gZWxlbWVudFxuICAgIGRyb3B6b25lLmZpcmUoZXZlbnQpXG4gICAgZXZlbnQucHJvcGFnYXRpb25TdG9wcGVkID0gZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2VcbiAgfVxufVxuXG4vLyByZXR1cm4gYSBuZXcgYXJyYXkgb2YgcG9zc2libGUgZHJvcHMuIGdldEFjdGl2ZURyb3BzIHNob3VsZCBhbHdheXMgYmVcbi8vIGNhbGxlZCB3aGVuIGEgZHJhZyBoYXMganVzdCBzdGFydGVkIG9yIGEgZHJhZyBldmVudCBoYXBwZW5zIHdoaWxlXG4vLyBkeW5hbWljRHJvcCBpcyB0cnVlXG5mdW5jdGlvbiBnZXRBY3RpdmVEcm9wcyAoc2NvcGU6IFNjb3BlLCBkcmFnRWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAvLyBnZXQgZHJvcHpvbmVzIGFuZCB0aGVpciBlbGVtZW50cyB0aGF0IGNvdWxkIHJlY2VpdmUgdGhlIGRyYWdnYWJsZVxuICBjb25zdCBhY3RpdmVEcm9wcyA9IGNvbGxlY3REcm9wcyhzY29wZSwgZHJhZ0VsZW1lbnQpXG5cbiAgZm9yIChjb25zdCBhY3RpdmVEcm9wIG9mIGFjdGl2ZURyb3BzKSB7XG4gICAgYWN0aXZlRHJvcC5yZWN0ID0gYWN0aXZlRHJvcC5kcm9wem9uZS5nZXRSZWN0KGFjdGl2ZURyb3AuZWxlbWVudClcbiAgfVxuXG4gIHJldHVybiBhY3RpdmVEcm9wc1xufVxuXG5mdW5jdGlvbiBnZXREcm9wICh7IGRyb3BTdGF0ZSwgaW50ZXJhY3RhYmxlOiBkcmFnZ2FibGUsIGVsZW1lbnQ6IGRyYWdFbGVtZW50IH06IFBhcnRpYWw8SW50ZXJhY3QuSW50ZXJhY3Rpb24+LCBkcmFnRXZlbnQsIHBvaW50ZXJFdmVudCkge1xuICBjb25zdCB2YWxpZERyb3BzID0gW11cblxuICAvLyBjb2xsZWN0IGFsbCBkcm9wem9uZXMgYW5kIHRoZWlyIGVsZW1lbnRzIHdoaWNoIHF1YWxpZnkgZm9yIGEgZHJvcFxuICBmb3IgKGNvbnN0IHsgZHJvcHpvbmUsIGVsZW1lbnQ6IGRyb3B6b25lRWxlbWVudCwgcmVjdCB9IG9mIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcykge1xuICAgIHZhbGlkRHJvcHMucHVzaChkcm9wem9uZS5kcm9wQ2hlY2soZHJhZ0V2ZW50LCBwb2ludGVyRXZlbnQsIGRyYWdnYWJsZSwgZHJhZ0VsZW1lbnQsIGRyb3B6b25lRWxlbWVudCwgcmVjdClcbiAgICAgID8gZHJvcHpvbmVFbGVtZW50XG4gICAgICA6IG51bGwpXG4gIH1cblxuICAvLyBnZXQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZHJvcHpvbmUgYmFzZWQgb24gRE9NIGRlcHRoIGFuZCBvcmRlclxuICBjb25zdCBkcm9wSW5kZXggPSB1dGlscy5kb20uaW5kZXhPZkRlZXBlc3RFbGVtZW50KHZhbGlkRHJvcHMpXG5cbiAgcmV0dXJuIGRyb3BTdGF0ZS5hY3RpdmVEcm9wc1tkcm9wSW5kZXhdIHx8IG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0RHJvcEV2ZW50cyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLCBfcG9pbnRlckV2ZW50LCBkcmFnRXZlbnQpIHtcbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IGRyb3BFdmVudHMgPSB7XG4gICAgZW50ZXIgICAgIDogbnVsbCxcbiAgICBsZWF2ZSAgICAgOiBudWxsLFxuICAgIGFjdGl2YXRlICA6IG51bGwsXG4gICAgZGVhY3RpdmF0ZTogbnVsbCxcbiAgICBtb3ZlICAgICAgOiBudWxsLFxuICAgIGRyb3AgICAgICA6IG51bGwsXG4gIH1cblxuICBpZiAoZHJhZ0V2ZW50LnR5cGUgPT09ICdkcmFnc3RhcnQnKSB7XG4gICAgZHJvcEV2ZW50cy5hY3RpdmF0ZSA9IG5ldyBEcm9wRXZlbnQoZHJvcFN0YXRlLCBkcmFnRXZlbnQsICdkcm9wYWN0aXZhdGUnKVxuXG4gICAgZHJvcEV2ZW50cy5hY3RpdmF0ZS50YXJnZXQgICA9IG51bGxcbiAgICBkcm9wRXZlbnRzLmFjdGl2YXRlLmRyb3B6b25lID0gbnVsbFxuICB9XG4gIGlmIChkcmFnRXZlbnQudHlwZSA9PT0gJ2RyYWdlbmQnKSB7XG4gICAgZHJvcEV2ZW50cy5kZWFjdGl2YXRlID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIGRyYWdFdmVudCwgJ2Ryb3BkZWFjdGl2YXRlJylcblxuICAgIGRyb3BFdmVudHMuZGVhY3RpdmF0ZS50YXJnZXQgICA9IG51bGxcbiAgICBkcm9wRXZlbnRzLmRlYWN0aXZhdGUuZHJvcHpvbmUgPSBudWxsXG4gIH1cblxuICBpZiAoZHJvcFN0YXRlLnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIGRyb3BFdmVudHNcbiAgfVxuXG4gIGlmIChkcm9wU3RhdGUuY3VyLmVsZW1lbnQgIT09IGRyb3BTdGF0ZS5wcmV2LmVsZW1lbnQpIHtcbiAgICAvLyBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBkcm9wem9uZSwgY3JlYXRlIGEgZHJhZ2xlYXZlIGV2ZW50XG4gICAgaWYgKGRyb3BTdGF0ZS5wcmV2LmRyb3B6b25lKSB7XG4gICAgICBkcm9wRXZlbnRzLmxlYXZlID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIGRyYWdFdmVudCwgJ2RyYWdsZWF2ZScpXG5cbiAgICAgIGRyYWdFdmVudC5kcmFnTGVhdmUgICAgPSBkcm9wRXZlbnRzLmxlYXZlLnRhcmdldCAgID0gZHJvcFN0YXRlLnByZXYuZWxlbWVudFxuICAgICAgZHJhZ0V2ZW50LnByZXZEcm9wem9uZSA9IGRyb3BFdmVudHMubGVhdmUuZHJvcHpvbmUgPSBkcm9wU3RhdGUucHJldi5kcm9wem9uZVxuICAgIH1cbiAgICAvLyBpZiBkcm9wem9uZSBpcyBub3QgbnVsbCwgY3JlYXRlIGEgZHJhZ2VudGVyIGV2ZW50XG4gICAgaWYgKGRyb3BTdGF0ZS5jdXIuZHJvcHpvbmUpIHtcbiAgICAgIGRyb3BFdmVudHMuZW50ZXIgPSBuZXcgRHJvcEV2ZW50KGRyb3BTdGF0ZSwgZHJhZ0V2ZW50LCAnZHJhZ2VudGVyJylcblxuICAgICAgZHJhZ0V2ZW50LmRyYWdFbnRlciA9IGRyb3BTdGF0ZS5jdXIuZWxlbWVudFxuICAgICAgZHJhZ0V2ZW50LmRyb3B6b25lID0gZHJvcFN0YXRlLmN1ci5kcm9wem9uZVxuICAgIH1cbiAgfVxuXG4gIGlmIChkcmFnRXZlbnQudHlwZSA9PT0gJ2RyYWdlbmQnICYmIGRyb3BTdGF0ZS5jdXIuZHJvcHpvbmUpIHtcbiAgICBkcm9wRXZlbnRzLmRyb3AgPSBuZXcgRHJvcEV2ZW50KGRyb3BTdGF0ZSwgZHJhZ0V2ZW50LCAnZHJvcCcpXG5cbiAgICBkcmFnRXZlbnQuZHJvcHpvbmUgPSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lXG4gICAgZHJhZ0V2ZW50LnJlbGF0ZWRUYXJnZXQgPSBkcm9wU3RhdGUuY3VyLmVsZW1lbnRcbiAgfVxuICBpZiAoZHJhZ0V2ZW50LnR5cGUgPT09ICdkcmFnbW92ZScgJiYgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSkge1xuICAgIGRyb3BFdmVudHMubW92ZSA9IG5ldyBEcm9wRXZlbnQoZHJvcFN0YXRlLCBkcmFnRXZlbnQsICdkcm9wbW92ZScpXG5cbiAgICBkcm9wRXZlbnRzLm1vdmUuZHJhZ21vdmUgPSBkcmFnRXZlbnRcbiAgICBkcmFnRXZlbnQuZHJvcHpvbmUgPSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lXG4gIH1cblxuICByZXR1cm4gZHJvcEV2ZW50c1xufVxuXG5mdW5jdGlvbiBmaXJlRHJvcEV2ZW50cyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLCBldmVudHMpIHtcbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IHtcbiAgICBhY3RpdmVEcm9wcyxcbiAgICBjdXIsXG4gICAgcHJldixcbiAgfSA9IGRyb3BTdGF0ZVxuXG4gIGlmIChldmVudHMubGVhdmUpIHsgcHJldi5kcm9wem9uZS5maXJlKGV2ZW50cy5sZWF2ZSkgfVxuICBpZiAoZXZlbnRzLm1vdmUpIHsgY3VyLmRyb3B6b25lLmZpcmUoZXZlbnRzLm1vdmUpIH1cbiAgaWYgKGV2ZW50cy5lbnRlcikgeyBjdXIuZHJvcHpvbmUuZmlyZShldmVudHMuZW50ZXIpIH1cbiAgaWYgKGV2ZW50cy5kcm9wKSB7IGN1ci5kcm9wem9uZS5maXJlKGV2ZW50cy5kcm9wKSB9XG5cbiAgaWYgKGV2ZW50cy5kZWFjdGl2YXRlKSB7XG4gICAgZmlyZUFjdGl2YXRpb25FdmVudHMoYWN0aXZlRHJvcHMsIGV2ZW50cy5kZWFjdGl2YXRlKVxuICB9XG5cbiAgZHJvcFN0YXRlLnByZXYuZHJvcHpvbmUgID0gY3VyLmRyb3B6b25lXG4gIGRyb3BTdGF0ZS5wcmV2LmVsZW1lbnQgPSBjdXIuZWxlbWVudFxufVxuXG5mdW5jdGlvbiBvbkV2ZW50Q3JlYXRlZCAoeyBpbnRlcmFjdGlvbiwgaUV2ZW50LCBldmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSB7XG4gIGlmIChpRXZlbnQudHlwZSAhPT0gJ2RyYWdtb3ZlJyAmJiBpRXZlbnQudHlwZSAhPT0gJ2RyYWdlbmQnKSB7IHJldHVybiB9XG5cbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG5cbiAgaWYgKHNjb3BlLmR5bmFtaWNEcm9wKSB7XG4gICAgZHJvcFN0YXRlLmFjdGl2ZURyb3BzID0gZ2V0QWN0aXZlRHJvcHMoc2NvcGUsIGludGVyYWN0aW9uLmVsZW1lbnQpXG4gIH1cblxuICBjb25zdCBkcmFnRXZlbnQgPSBpRXZlbnRcbiAgY29uc3QgZHJvcFJlc3VsdCA9IGdldERyb3AoaW50ZXJhY3Rpb24sIGRyYWdFdmVudCwgZXZlbnQpXG5cbiAgLy8gdXBkYXRlIHJlamVjdGVkIHN0YXR1c1xuICBkcm9wU3RhdGUucmVqZWN0ZWQgPSBkcm9wU3RhdGUucmVqZWN0ZWQgJiZcbiAgICAhIWRyb3BSZXN1bHQgJiZcbiAgICBkcm9wUmVzdWx0LmRyb3B6b25lID09PSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lICYmXG4gICAgZHJvcFJlc3VsdC5lbGVtZW50ID09PSBkcm9wU3RhdGUuY3VyLmVsZW1lbnRcblxuICBkcm9wU3RhdGUuY3VyLmRyb3B6b25lICA9IGRyb3BSZXN1bHQgJiYgZHJvcFJlc3VsdC5kcm9wem9uZVxuICBkcm9wU3RhdGUuY3VyLmVsZW1lbnQgPSBkcm9wUmVzdWx0ICYmIGRyb3BSZXN1bHQuZWxlbWVudFxuXG4gIGRyb3BTdGF0ZS5ldmVudHMgPSBnZXREcm9wRXZlbnRzKGludGVyYWN0aW9uLCBldmVudCwgZHJhZ0V2ZW50KVxufVxuXG5mdW5jdGlvbiBkcm9wem9uZU1ldGhvZCAoaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUpOiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnNcbmZ1bmN0aW9uIGRyb3B6b25lTWV0aG9kIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9uczogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zIHwgYm9vbGVhbilcbmZ1bmN0aW9uIGRyb3B6b25lTWV0aG9kIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9ucz86IEludGVyYWN0LkRyb3B6b25lT3B0aW9ucyB8IGJvb2xlYW4pIHtcbiAgaWYgKHV0aWxzLmlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3AuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcblxuICAgIGlmIChvcHRpb25zLmxpc3RlbmVycykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHV0aWxzLm5vcm1hbGl6ZUxpc3RlbmVycyhvcHRpb25zLmxpc3RlbmVycylcbiAgICAgIC8vIHJlbmFtZSAnZHJvcCcgdG8gJycgYXMgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoICdkcm9wJ1xuICAgICAgY29uc3QgY29ycmVjdGVkID0gT2JqZWN0LmtleXMobm9ybWFsaXplZCkucmVkdWNlKChhY2MsIHR5cGUpID0+IHtcbiAgICAgICAgY29uc3QgY29ycmVjdGVkVHlwZSA9IC9eKGVudGVyfGxlYXZlKS8udGVzdCh0eXBlKVxuICAgICAgICAgID8gYGRyYWcke3R5cGV9YFxuICAgICAgICAgIDogL14oYWN0aXZhdGV8ZGVhY3RpdmF0ZXxtb3ZlKS8udGVzdCh0eXBlKVxuICAgICAgICAgICAgPyBgZHJvcCR7dHlwZX1gXG4gICAgICAgICAgICA6IHR5cGVcblxuICAgICAgICBhY2NbY29ycmVjdGVkVHlwZV0gPSBub3JtYWxpemVkW3R5cGVdXG5cbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfSwge30pXG5cbiAgICAgIGludGVyYWN0YWJsZS5vZmYoaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5saXN0ZW5lcnMpXG4gICAgICBpbnRlcmFjdGFibGUub24oY29ycmVjdGVkKVxuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5saXN0ZW5lcnMgPSBjb3JyZWN0ZWRcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcCkpIHsgaW50ZXJhY3RhYmxlLm9uKCdkcm9wJywgb3B0aW9ucy5vbmRyb3ApIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcGFjdGl2YXRlKSkgeyBpbnRlcmFjdGFibGUub24oJ2Ryb3BhY3RpdmF0ZScsIG9wdGlvbnMub25kcm9wYWN0aXZhdGUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcGRlYWN0aXZhdGUpKSB7IGludGVyYWN0YWJsZS5vbignZHJvcGRlYWN0aXZhdGUnLCBvcHRpb25zLm9uZHJvcGRlYWN0aXZhdGUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJhZ2VudGVyKSkgeyBpbnRlcmFjdGFibGUub24oJ2RyYWdlbnRlcicsIG9wdGlvbnMub25kcmFnZW50ZXIpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJhZ2xlYXZlKSkgeyBpbnRlcmFjdGFibGUub24oJ2RyYWdsZWF2ZScsIG9wdGlvbnMub25kcmFnbGVhdmUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcG1vdmUpKSB7IGludGVyYWN0YWJsZS5vbignZHJvcG1vdmUnLCBvcHRpb25zLm9uZHJvcG1vdmUpIH1cblxuICAgIGlmICgvXihwb2ludGVyfGNlbnRlcikkLy50ZXN0KG9wdGlvbnMub3ZlcmxhcCBhcyBzdHJpbmcpKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLm92ZXJsYXAgPSBvcHRpb25zLm92ZXJsYXBcbiAgICB9XG4gICAgZWxzZSBpZiAodXRpbHMuaXMubnVtYmVyKG9wdGlvbnMub3ZlcmxhcCkpIHtcbiAgICAgIGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3Aub3ZlcmxhcCA9IE1hdGgubWF4KE1hdGgubWluKDEsIG9wdGlvbnMub3ZlcmxhcCksIDApXG4gICAgfVxuICAgIGlmICgnYWNjZXB0JyBpbiBvcHRpb25zKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmFjY2VwdCA9IG9wdGlvbnMuYWNjZXB0XG4gICAgfVxuICAgIGlmICgnY2hlY2tlcicgaW4gb3B0aW9ucykge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyID0gb3B0aW9ucy5jaGVja2VyXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG5cbiAgaWYgKHV0aWxzLmlzLmJvb2wob3B0aW9ucykpIHtcbiAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gaW50ZXJhY3RhYmxlXG4gIH1cblxuICByZXR1cm4gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcFxufVxuXG5mdW5jdGlvbiBkcm9wQ2hlY2tNZXRob2QgKFxuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdEV2ZW50LFxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgZHJhZ2dhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsXG4gIGRyYWdnYWJsZUVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsXG4gIGRyb3BFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICByZWN0OiBhbnksXG4pIHtcbiAgbGV0IGRyb3BwZWQgPSBmYWxzZVxuXG4gIC8vIGlmIHRoZSBkcm9wem9uZSBoYXMgbm8gcmVjdCAoZWcuIGRpc3BsYXk6IG5vbmUpXG4gIC8vIGNhbGwgdGhlIGN1c3RvbSBkcm9wQ2hlY2tlciBvciBqdXN0IHJldHVybiBmYWxzZVxuICBpZiAoIShyZWN0ID0gcmVjdCB8fCBpbnRlcmFjdGFibGUuZ2V0UmVjdChkcm9wRWxlbWVudCkpKSB7XG4gICAgcmV0dXJuIChpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmNoZWNrZXJcbiAgICAgID8gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyKGRyYWdFdmVudCwgZXZlbnQsIGRyb3BwZWQsIGludGVyYWN0YWJsZSwgZHJvcEVsZW1lbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudClcbiAgICAgIDogZmFsc2UpXG4gIH1cblxuICBjb25zdCBkcm9wT3ZlcmxhcCA9IGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3Aub3ZlcmxhcFxuXG4gIGlmIChkcm9wT3ZlcmxhcCA9PT0gJ3BvaW50ZXInKSB7XG4gICAgY29uc3Qgb3JpZ2luID0gdXRpbHMuZ2V0T3JpZ2luWFkoZHJhZ2dhYmxlLCBkcmFnZ2FibGVFbGVtZW50LCAnZHJhZycpXG4gICAgY29uc3QgcGFnZSA9IHV0aWxzLnBvaW50ZXIuZ2V0UGFnZVhZKGRyYWdFdmVudClcblxuICAgIHBhZ2UueCArPSBvcmlnaW4ueFxuICAgIHBhZ2UueSArPSBvcmlnaW4ueVxuXG4gICAgY29uc3QgaG9yaXpvbnRhbCA9IChwYWdlLnggPiByZWN0LmxlZnQpICYmIChwYWdlLnggPCByZWN0LnJpZ2h0KVxuICAgIGNvbnN0IHZlcnRpY2FsICAgPSAocGFnZS55ID4gcmVjdC50b3ApICYmIChwYWdlLnkgPCByZWN0LmJvdHRvbSlcblxuICAgIGRyb3BwZWQgPSBob3Jpem9udGFsICYmIHZlcnRpY2FsXG4gIH1cblxuICBjb25zdCBkcmFnUmVjdCA9IGRyYWdnYWJsZS5nZXRSZWN0KGRyYWdnYWJsZUVsZW1lbnQpXG5cbiAgaWYgKGRyYWdSZWN0ICYmIGRyb3BPdmVybGFwID09PSAnY2VudGVyJykge1xuICAgIGNvbnN0IGN4ID0gZHJhZ1JlY3QubGVmdCArIGRyYWdSZWN0LndpZHRoICAvIDJcbiAgICBjb25zdCBjeSA9IGRyYWdSZWN0LnRvcCAgKyBkcmFnUmVjdC5oZWlnaHQgLyAyXG5cbiAgICBkcm9wcGVkID0gY3ggPj0gcmVjdC5sZWZ0ICYmIGN4IDw9IHJlY3QucmlnaHQgJiYgY3kgPj0gcmVjdC50b3AgJiYgY3kgPD0gcmVjdC5ib3R0b21cbiAgfVxuXG4gIGlmIChkcmFnUmVjdCAmJiB1dGlscy5pcy5udW1iZXIoZHJvcE92ZXJsYXApKSB7XG4gICAgY29uc3Qgb3ZlcmxhcEFyZWEgID0gKE1hdGgubWF4KDAsIE1hdGgubWluKHJlY3QucmlnaHQsIGRyYWdSZWN0LnJpZ2h0KSAtIE1hdGgubWF4KHJlY3QubGVmdCwgZHJhZ1JlY3QubGVmdCkpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgTWF0aC5taW4ocmVjdC5ib3R0b20sIGRyYWdSZWN0LmJvdHRvbSkgLSBNYXRoLm1heChyZWN0LnRvcCwgZHJhZ1JlY3QudG9wKSkpXG5cbiAgICBjb25zdCBvdmVybGFwUmF0aW8gPSBvdmVybGFwQXJlYSAvIChkcmFnUmVjdC53aWR0aCAqIGRyYWdSZWN0LmhlaWdodClcblxuICAgIGRyb3BwZWQgPSBvdmVybGFwUmF0aW8gPj0gZHJvcE92ZXJsYXBcbiAgfVxuXG4gIGlmIChpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmNoZWNrZXIpIHtcbiAgICBkcm9wcGVkID0gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyKGRyYWdFdmVudCwgZXZlbnQsIGRyb3BwZWQsIGludGVyYWN0YWJsZSwgZHJvcEVsZW1lbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudClcbiAgfVxuXG4gIHJldHVybiBkcm9wcGVkXG59XG5cbmNvbnN0IGRyb3A6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhY3Rpb25zL2Ryb3AnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tc3RhcnQnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGludGVyYWN0aW9uLmRyb3BTdGF0ZSA9IHtcbiAgICAgICAgY3VyOiB7XG4gICAgICAgICAgZHJvcHpvbmU6IG51bGwsXG4gICAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJldjoge1xuICAgICAgICAgIGRyb3B6b25lOiBudWxsLFxuICAgICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdGVkOiBudWxsLFxuICAgICAgICBldmVudHM6IG51bGwsXG4gICAgICAgIGFjdGl2ZURyb3BzOiBbXSxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tc3RhcnQnOiAoeyBpbnRlcmFjdGlvbiwgZXZlbnQsIGlFdmVudDogZHJhZ0V2ZW50IH06IEludGVyYWN0LkRvUGhhc2VBcmc8J2RyYWcnLCBJbnRlcmFjdC5FdmVudFBoYXNlPiwgc2NvcGUpID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICAgICAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG5cbiAgICAgIC8vIHJlc2V0IGFjdGl2ZSBkcm9wem9uZXNcbiAgICAgIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcyA9IG51bGxcbiAgICAgIGRyb3BTdGF0ZS5ldmVudHMgPSBudWxsXG4gICAgICBkcm9wU3RhdGUuYWN0aXZlRHJvcHMgPSBnZXRBY3RpdmVEcm9wcyhzY29wZSwgaW50ZXJhY3Rpb24uZWxlbWVudClcbiAgICAgIGRyb3BTdGF0ZS5ldmVudHMgPSBnZXREcm9wRXZlbnRzKGludGVyYWN0aW9uLCBldmVudCwgZHJhZ0V2ZW50KVxuXG4gICAgICBpZiAoZHJvcFN0YXRlLmV2ZW50cy5hY3RpdmF0ZSkge1xuICAgICAgICBmaXJlQWN0aXZhdGlvbkV2ZW50cyhkcm9wU3RhdGUuYWN0aXZlRHJvcHMsIGRyb3BTdGF0ZS5ldmVudHMuYWN0aXZhdGUpXG4gICAgICAgIHNjb3BlLmZpcmUoJ2FjdGlvbnMvZHJvcDpzdGFydCcsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBGSVhNRSBwcm9wZXIgc2lnbmFsIHR5cGVzXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IG9uRXZlbnRDcmVhdGVkLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLWVuZCc6IG9uRXZlbnRDcmVhdGVkLFxuXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IGZ1bmN0aW9uIGZpcmVEcm9wQWZ0ZXJNb3ZlICh7IGludGVyYWN0aW9uLCBpRXZlbnQ6IGRyYWdFdmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGZpcmVEcm9wRXZlbnRzKGludGVyYWN0aW9uLCBpbnRlcmFjdGlvbi5kcm9wU3RhdGUuZXZlbnRzKVxuXG4gICAgICBzY29wZS5maXJlKCdhY3Rpb25zL2Ryb3A6bW92ZScsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgICAgaW50ZXJhY3Rpb24uZHJvcFN0YXRlLmV2ZW50cyA9IHt9XG4gICAgfSxcblxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLWVuZCc6ICh7IGludGVyYWN0aW9uLCBpRXZlbnQ6IGRyYWdFdmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGZpcmVEcm9wRXZlbnRzKGludGVyYWN0aW9uLCBpbnRlcmFjdGlvbi5kcm9wU3RhdGUuZXZlbnRzKVxuICAgICAgc2NvcGUuZmlyZSgnYWN0aW9ucy9kcm9wOmVuZCcsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOnN0b3AnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGNvbnN0IHsgZHJvcFN0YXRlIH0gPSBpbnRlcmFjdGlvblxuXG4gICAgICBpZiAoZHJvcFN0YXRlKSB7XG4gICAgICAgIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcyA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmV2ZW50cyA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5lbGVtZW50ID0gbnVsbFxuICAgICAgICBkcm9wU3RhdGUucHJldi5kcm9wem9uZSA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLnByZXYuZWxlbWVudCA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLnJlamVjdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBnZXRBY3RpdmVEcm9wcyxcbiAgZ2V0RHJvcCxcbiAgZ2V0RHJvcEV2ZW50cyxcbiAgZmlyZURyb3BFdmVudHMsXG4gIGRlZmF1bHRzOiB7XG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgYWNjZXB0IDogbnVsbCxcbiAgICBvdmVybGFwOiAncG9pbnRlcicsXG4gIH0gYXMgSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zLFxufVxuXG5leHBvcnQgZGVmYXVsdCBkcm9wXG4iLCJpbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcblxuZXhwb3J0IHR5cGUgR2VzdHVyYWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9ucz5cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBnZXN0dXJlPzoge1xuICAgICAgYW5nbGU6IG51bWJlciAgICAgICAgICAgLy8gYW5nbGUgZnJvbSBmaXJzdCB0byBzZWNvbmQgdG91Y2hcbiAgICAgIGRpc3RhbmNlOiBudW1iZXJcbiAgICAgIHNjYWxlOiBudW1iZXIgICAgICAgICAgIC8vIGdlc3R1cmUuZGlzdGFuY2UgLyBnZXN0dXJlLnN0YXJ0RGlzdGFuY2VcbiAgICAgIHN0YXJ0QW5nbGU6IG51bWJlciAgICAgIC8vIGFuZ2xlIG9mIGxpbmUgam9pbmluZyB0d28gdG91Y2hlc1xuICAgICAgc3RhcnREaXN0YW5jZTogbnVtYmVyICAgLy8gZGlzdGFuY2UgYmV0d2VlbiB0d28gdG91Y2hlcyBvZiB0b3VjaFN0YXJ0XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBnZXN0dXJhYmxlOiBHZXN0dXJhYmxlTWV0aG9kXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBnZXN0dXJlOiBJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9uc1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBBY3Rpb25NYXAge1xuICAgIGdlc3R1cmU/OiB0eXBlb2YgZ2VzdHVyZVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VzdHVyZUV2ZW50IGV4dGVuZHMgSW50ZXJhY3QuSW50ZXJhY3RFdmVudDwnZ2VzdHVyZSc+IHtcbiAgZGlzdGFuY2U6IG51bWJlclxuICBhbmdsZTogbnVtYmVyXG4gIGRhOiBudW1iZXIgLy8gYW5nbGUgY2hhbmdlXG4gIHNjYWxlOiBudW1iZXIgLy8gcmF0aW8gb2YgZGlzdGFuY2Ugc3RhcnQgdG8gY3VycmVudCBldmVudFxuICBkczogbnVtYmVyIC8vIHNjYWxlIGNoYW5nZVxuICBib3g6IEludGVyYWN0LlJlY3QgLy8gZW5jbG9zaW5nIGJveCBvZiBhbGwgcG9pbnRzXG4gIHRvdWNoZXM6IEludGVyYWN0LlBvaW50ZXJUeXBlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlU2lnbmFsQXJnIGV4dGVuZHMgSW50ZXJhY3QuRG9QaGFzZUFyZzwnZ2VzdHVyZScsIEludGVyYWN0LkV2ZW50UGhhc2U+IHtcbiAgaUV2ZW50OiBHZXN0dXJlRXZlbnRcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uPCdnZXN0dXJlJz5cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBhY3Rpb25zLFxuICAgIEludGVyYWN0YWJsZSxcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGludGVyYWN0KGVsZW1lbnQpLmdlc3R1cmFibGUoe1xuICAgKiAgICAgb25zdGFydDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAgICogICAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gICAqICAgICBvbmVuZCAgOiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICAgKlxuICAgKiAgICAgLy8gbGltaXQgbXVsdGlwbGUgZ2VzdHVyZXMuXG4gICAqICAgICAvLyBTZWUgdGhlIGV4cGxhbmF0aW9uIGluIHtAbGluayBJbnRlcmFjdGFibGUuZHJhZ2dhYmxlfSBleGFtcGxlXG4gICAqICAgICBtYXg6IEluZmluaXR5LFxuICAgKiAgICAgbWF4UGVyRWxlbWVudDogMSxcbiAgICogfSlcbiAgICpcbiAgICogdmFyIGlzR2VzdHVyZWFibGUgPSBpbnRlcmFjdChlbGVtZW50KS5nZXN0dXJhYmxlKClcbiAgICogYGBgXG4gICAqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIG11bHRpdG91Y2ggZ2VzdHVyZXMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAgICogbGlzdGVuZXJzIHRvIGJlIGZpcmVkIG9uIGdlc3R1cmUgZXZlbnRzIChtYWtlcyB0aGUgSW50ZXJhY3RhYmxlIGdlc3R1cmFibGUpXG4gICAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgY2FuIGJlIHRoZVxuICAgKiB0YXJnZXQgb2YgZ2VzdHVyZSBldmVudHMsIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmdlc3R1cmFibGUgPSBmdW5jdGlvbiAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zOiBJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9ucyB8IGJvb2xlYW4pIHtcbiAgICBpZiAodXRpbHMuaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZ2VzdHVyZS5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZVxuICAgICAgdGhpcy5zZXRQZXJBY3Rpb24oJ2dlc3R1cmUnLCBvcHRpb25zKVxuICAgICAgdGhpcy5zZXRPbkV2ZW50cygnZ2VzdHVyZScsIG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzLmJvb2wob3B0aW9ucykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5nZXN0dXJlLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXN0dXJlIGFzIEludGVyYWN0Lk9wdGlvbnNcbiAgfSBhcyBHZXN0dXJhYmxlTWV0aG9kXG5cbiAgYWN0aW9ucy5tYXAuZ2VzdHVyZSA9IGdlc3R1cmVcbiAgYWN0aW9ucy5tZXRob2REaWN0Lmdlc3R1cmUgPSAnZ2VzdHVyYWJsZSdcblxuICBkZWZhdWx0cy5hY3Rpb25zLmdlc3R1cmUgPSBnZXN0dXJlLmRlZmF1bHRzXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUdlc3R1cmVQcm9wcyAoeyBpbnRlcmFjdGlvbiwgaUV2ZW50LCBwaGFzZSB9OiBHZXN0dXJlU2lnbmFsQXJnKSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZ2VzdHVyZScpIHsgcmV0dXJuIH1cblxuICBjb25zdCBwb2ludGVycyA9IGludGVyYWN0aW9uLnBvaW50ZXJzLm1hcChwID0+IHAucG9pbnRlcilcbiAgY29uc3Qgc3RhcnRpbmcgPSBwaGFzZSA9PT0gJ3N0YXJ0J1xuICBjb25zdCBlbmRpbmcgPSBwaGFzZSA9PT0gJ2VuZCdcbiAgY29uc3QgZGVsdGFTb3VyY2UgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5kZWx0YVNvdXJjZVxuXG4gIGlFdmVudC50b3VjaGVzID0gW3BvaW50ZXJzWzBdLCBwb2ludGVyc1sxXV1cblxuICBpZiAoc3RhcnRpbmcpIHtcbiAgICBpRXZlbnQuZGlzdGFuY2UgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2UocG9pbnRlcnMsIGRlbHRhU291cmNlKVxuICAgIGlFdmVudC5ib3ggICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94KHBvaW50ZXJzKVxuICAgIGlFdmVudC5zY2FsZSAgICA9IDFcbiAgICBpRXZlbnQuZHMgICAgICAgPSAwXG4gICAgaUV2ZW50LmFuZ2xlICAgID0gdXRpbHMucG9pbnRlci50b3VjaEFuZ2xlKHBvaW50ZXJzLCBkZWx0YVNvdXJjZSlcbiAgICBpRXZlbnQuZGEgICAgICAgPSAwXG5cbiAgICBpbnRlcmFjdGlvbi5nZXN0dXJlLnN0YXJ0RGlzdGFuY2UgPSBpRXZlbnQuZGlzdGFuY2VcbiAgICBpbnRlcmFjdGlvbi5nZXN0dXJlLnN0YXJ0QW5nbGUgPSBpRXZlbnQuYW5nbGVcbiAgfVxuICBlbHNlIGlmIChlbmRpbmcpIHtcbiAgICBjb25zdCBwcmV2RXZlbnQgPSBpbnRlcmFjdGlvbi5wcmV2RXZlbnQgYXMgR2VzdHVyZUV2ZW50XG5cbiAgICBpRXZlbnQuZGlzdGFuY2UgPSBwcmV2RXZlbnQuZGlzdGFuY2VcbiAgICBpRXZlbnQuYm94ICAgICAgPSBwcmV2RXZlbnQuYm94XG4gICAgaUV2ZW50LnNjYWxlICAgID0gcHJldkV2ZW50LnNjYWxlXG4gICAgaUV2ZW50LmRzICAgICAgID0gMFxuICAgIGlFdmVudC5hbmdsZSAgICA9IHByZXZFdmVudC5hbmdsZVxuICAgIGlFdmVudC5kYSAgICAgICA9IDBcbiAgfVxuICBlbHNlIHtcbiAgICBpRXZlbnQuZGlzdGFuY2UgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2UocG9pbnRlcnMsIGRlbHRhU291cmNlKVxuICAgIGlFdmVudC5ib3ggICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94KHBvaW50ZXJzKVxuICAgIGlFdmVudC5zY2FsZSAgICA9IGlFdmVudC5kaXN0YW5jZSAvIGludGVyYWN0aW9uLmdlc3R1cmUuc3RhcnREaXN0YW5jZVxuICAgIGlFdmVudC5hbmdsZSAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hBbmdsZShwb2ludGVycywgZGVsdGFTb3VyY2UpXG5cbiAgICBpRXZlbnQuZHMgPSBpRXZlbnQuc2NhbGUgLSBpbnRlcmFjdGlvbi5nZXN0dXJlLnNjYWxlXG4gICAgaUV2ZW50LmRhID0gaUV2ZW50LmFuZ2xlIC0gaW50ZXJhY3Rpb24uZ2VzdHVyZS5hbmdsZVxuICB9XG5cbiAgaW50ZXJhY3Rpb24uZ2VzdHVyZS5kaXN0YW5jZSA9IGlFdmVudC5kaXN0YW5jZVxuICBpbnRlcmFjdGlvbi5nZXN0dXJlLmFuZ2xlID0gaUV2ZW50LmFuZ2xlXG5cbiAgaWYgKHV0aWxzLmlzLm51bWJlcihpRXZlbnQuc2NhbGUpICYmXG4gICAgICBpRXZlbnQuc2NhbGUgIT09IEluZmluaXR5ICYmXG4gICAgICAhaXNOYU4oaUV2ZW50LnNjYWxlKSkge1xuICAgIGludGVyYWN0aW9uLmdlc3R1cmUuc2NhbGUgPSBpRXZlbnQuc2NhbGVcbiAgfVxufVxuXG5jb25zdCBnZXN0dXJlOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYWN0aW9ucy9nZXN0dXJlJyxcbiAgYmVmb3JlOiBbJ2FjdGlvbnMvZHJhZycsICdhY3Rpb25zL3Jlc2l6ZSddLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1zdGFydCc6IHVwZGF0ZUdlc3R1cmVQcm9wcyxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1tb3ZlJzogdXBkYXRlR2VzdHVyZVByb3BzLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLWVuZCc6IHVwZGF0ZUdlc3R1cmVQcm9wcyxcblxuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogKHsgaW50ZXJhY3Rpb24gfSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24uZ2VzdHVyZSA9IHtcbiAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgc3RhcnRBbmdsZTogMCxcbiAgICAgICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBhcmcgPT4ge1xuICAgICAgaWYgKGFyZy5pbnRlcmFjdGlvbi5wb2ludGVycy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2VzdHVyZU9wdGlvbnMgPSBhcmcuaW50ZXJhY3RhYmxlLm9wdGlvbnMuZ2VzdHVyZVxuXG4gICAgICBpZiAoIShnZXN0dXJlT3B0aW9ucyAmJiBnZXN0dXJlT3B0aW9ucy5lbmFibGVkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGFyZy5hY3Rpb24gPSB7IG5hbWU6ICdnZXN0dXJlJyB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgfSxcblxuICBnZXRDdXJzb3IgKCkge1xuICAgIHJldHVybiAnJ1xuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBnZXN0dXJlXG4iLCJpbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyBkb20gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZG9tVXRpbHMnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuXG5leHBvcnQgdHlwZSBFZGdlTmFtZSA9ICd0b3AnIHwgJ2xlZnQnIHwgJ2JvdHRvbScgfCAncmlnaHQnXG5cbmV4cG9ydCB0eXBlIFJlc2l6YWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5SZXNpemFibGVPcHRpb25zPlxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0YWJsZSB7XG4gICAgcmVzaXphYmxlOiBSZXNpemFibGVNZXRob2RcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIHJlc2l6ZUF4ZXM6ICd4JyB8ICd5JyB8ICd4eSdcbiAgICByZXNpemVTdGFydEFzcGVjdFJhdGlvOiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xuICAgIHJlc2l6ZTogSW50ZXJhY3QuUmVzaXphYmxlT3B0aW9uc1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBBY3Rpb25NYXAge1xuICAgIHJlc2l6ZT86IHR5cGVvZiByZXNpemVcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2l6ZUV2ZW50PFAgZXh0ZW5kcyBJbnRlcmFjdC5FdmVudFBoYXNlID0gSW50ZXJhY3QuRXZlbnRQaGFzZT4gZXh0ZW5kcyBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PCdyZXNpemUnLCBQPiB7XG4gIGRlbHRhUmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGVkZ2VzPzogSW50ZXJhY3QuQWN0aW9uUHJvcHNbJ2VkZ2VzJ11cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IFNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBhY3Rpb25zLFxuICAgIGJyb3dzZXIsXG4gICAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgICBJbnRlcmFjdGFibGUsIC8vIHRzbGludDpkaXNhYmxlLWxpbmUgbm8tc2hhZG93ZWQtdmFyaWFibGVcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgLy8gTGVzcyBQcmVjaXNpb24gd2l0aCB0b3VjaCBpbnB1dFxuXG4gIHJlc2l6ZS5jdXJzb3JzID0gaW5pdEN1cnNvcnMoYnJvd3NlcilcbiAgcmVzaXplLmRlZmF1bHRNYXJnaW4gPSBicm93c2VyLnN1cHBvcnRzVG91Y2ggfHwgYnJvd3Nlci5zdXBwb3J0c1BvaW50ZXJFdmVudCA/IDIwIDogMTBcblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QoZWxlbWVudCkucmVzaXphYmxlKHtcbiAgICogICBvbnN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICAgKiAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gICAqICAgb25lbmQgIDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAgICpcbiAgICogICBlZGdlczoge1xuICAgKiAgICAgdG9wICAgOiB0cnVlLCAgICAgICAvLyBVc2UgcG9pbnRlciBjb29yZHMgdG8gY2hlY2sgZm9yIHJlc2l6ZS5cbiAgICogICAgIGxlZnQgIDogZmFsc2UsICAgICAgLy8gRGlzYWJsZSByZXNpemluZyBmcm9tIGxlZnQgZWRnZS5cbiAgICogICAgIGJvdHRvbTogJy5yZXNpemUtcycsLy8gUmVzaXplIGlmIHBvaW50ZXIgdGFyZ2V0IG1hdGNoZXMgc2VsZWN0b3JcbiAgICogICAgIHJpZ2h0IDogaGFuZGxlRWwgICAgLy8gUmVzaXplIGlmIHBvaW50ZXIgdGFyZ2V0IGlzIHRoZSBnaXZlbiBFbGVtZW50XG4gICAqICAgfSxcbiAgICpcbiAgICogICAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgY2FuIGJlIGFkanVzdGVkIGluZGVwZW5kZW50bHkuIFdoZW4gYHRydWVgLCB3aWR0aCBhbmRcbiAgICogICAgIC8vIGhlaWdodCBhcmUgYWRqdXN0ZWQgYXQgYSAxOjEgcmF0aW8uXG4gICAqICAgICBzcXVhcmU6IGZhbHNlLFxuICAgKlxuICAgKiAgICAgLy8gV2lkdGggYW5kIGhlaWdodCBjYW4gYmUgYWRqdXN0ZWQgaW5kZXBlbmRlbnRseS4gV2hlbiBgdHJ1ZWAsIHdpZHRoIGFuZFxuICAgKiAgICAgLy8gaGVpZ2h0IG1haW50YWluIHRoZSBhc3BlY3QgcmF0aW8gdGhleSBoYWQgd2hlbiByZXNpemluZyBzdGFydGVkLlxuICAgKiAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogZmFsc2UsXG4gICAqXG4gICAqICAgLy8gYSB2YWx1ZSBvZiAnbm9uZScgd2lsbCBsaW1pdCB0aGUgcmVzaXplIHJlY3QgdG8gYSBtaW5pbXVtIG9mIDB4MFxuICAgKiAgIC8vICduZWdhdGUnIHdpbGwgYWxsb3cgdGhlIHJlY3QgdG8gaGF2ZSBuZWdhdGl2ZSB3aWR0aC9oZWlnaHRcbiAgICogICAvLyAncmVwb3NpdGlvbicgd2lsbCBrZWVwIHRoZSB3aWR0aC9oZWlnaHQgcG9zaXRpdmUgYnkgc3dhcHBpbmdcbiAgICogICAvLyB0aGUgdG9wIGFuZCBib3R0b20gZWRnZXMgYW5kL29yIHN3YXBwaW5nIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlc1xuICAgKiAgIGludmVydDogJ25vbmUnIHx8ICduZWdhdGUnIHx8ICdyZXBvc2l0aW9uJ1xuICAgKlxuICAgKiAgIC8vIGxpbWl0IG11bHRpcGxlIHJlc2l6ZXMuXG4gICAqICAgLy8gU2VlIHRoZSBleHBsYW5hdGlvbiBpbiB0aGUge0BsaW5rIEludGVyYWN0YWJsZS5kcmFnZ2FibGV9IGV4YW1wbGVcbiAgICogICBtYXg6IEluZmluaXR5LFxuICAgKiAgIG1heFBlckVsZW1lbnQ6IDEsXG4gICAqIH0pXG4gICAqXG4gICAqIHZhciBpc1Jlc2l6ZWFibGUgPSBpbnRlcmFjdChlbGVtZW50KS5yZXNpemFibGUoKVxuICAgKiBgYGBcbiAgICpcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgcmVzaXplIGFjdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAgICogbGlzdGVuZXJzIHRvIGJlIGZpcmVkIG9uIHJlc2l6ZSBldmVudHMgKG9iamVjdCBtYWtlcyB0aGUgSW50ZXJhY3RhYmxlXG4gICAqIHJlc2l6YWJsZSlcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IEludGVyYWN0YWJsZX0gQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBjYW4gYmUgdGhlXG4gICAqIHRhcmdldCBvZiByZXNpemUgZWxlbWVudHMsIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLnJlc2l6YWJsZSA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIG9wdGlvbnM6IEludGVyYWN0LlJlc2l6YWJsZU9wdGlvbnMgfCBib29sZWFuKSB7XG4gICAgcmV0dXJuIHJlc2l6YWJsZSh0aGlzLCBvcHRpb25zLCBzY29wZSlcbiAgfSBhcyBSZXNpemFibGVNZXRob2RcblxuICBhY3Rpb25zLm1hcC5yZXNpemUgPSByZXNpemVcbiAgYWN0aW9ucy5tZXRob2REaWN0LnJlc2l6ZSA9ICdyZXNpemFibGUnXG5cbiAgZGVmYXVsdHMuYWN0aW9ucy5yZXNpemUgPSByZXNpemUuZGVmYXVsdHNcbn1cblxuZnVuY3Rpb24gcmVzaXplQ2hlY2tlciAoYXJnKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgcmVjdCwgYnV0dG9ucyB9ID0gYXJnXG5cbiAgaWYgKCFyZWN0KSB7IHJldHVybiB1bmRlZmluZWQgfVxuXG4gIGNvbnN0IHBhZ2UgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZSlcbiAgY29uc3QgcmVzaXplT3B0aW9ucyA9IGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZVxuXG4gIGlmIChcbiAgICAhKHJlc2l6ZU9wdGlvbnMgJiYgcmVzaXplT3B0aW9ucy5lbmFibGVkKSB8fFxuICAgIC8vIGNoZWNrIG1vdXNlQnV0dG9uIHNldHRpbmcgaWYgdGhlIHBvaW50ZXIgaXMgZG93blxuICAgIChpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duICYmXG4gICAgIC9tb3VzZXxwb2ludGVyLy50ZXN0KGludGVyYWN0aW9uLnBvaW50ZXJUeXBlKSAmJlxuICAgKGJ1dHRvbnMgJiByZXNpemVPcHRpb25zLm1vdXNlQnV0dG9ucykgPT09IDApXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIGlmIHVzaW5nIHJlc2l6ZS5lZGdlc1xuICBpZiAoaXMub2JqZWN0KHJlc2l6ZU9wdGlvbnMuZWRnZXMpKSB7XG4gICAgY29uc3QgcmVzaXplRWRnZXMgPSB7XG4gICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgIHJpZ2h0OiBmYWxzZSxcbiAgICAgIHRvcDogZmFsc2UsXG4gICAgICBib3R0b206IGZhbHNlLFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWRnZSBpbiByZXNpemVFZGdlcykge1xuICAgICAgcmVzaXplRWRnZXNbZWRnZV0gPSBjaGVja1Jlc2l6ZUVkZ2UoZWRnZSxcbiAgICAgICAgcmVzaXplT3B0aW9ucy5lZGdlc1tlZGdlXSxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgaW50ZXJhY3Rpb24uX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHJlY3QsXG4gICAgICAgIHJlc2l6ZU9wdGlvbnMubWFyZ2luIHx8IHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuICAgIH1cblxuICAgIHJlc2l6ZUVkZ2VzLmxlZnQgPSByZXNpemVFZGdlcy5sZWZ0ICYmICFyZXNpemVFZGdlcy5yaWdodFxuICAgIHJlc2l6ZUVkZ2VzLnRvcCAgPSByZXNpemVFZGdlcy50b3AgICYmICFyZXNpemVFZGdlcy5ib3R0b21cblxuICAgIGlmIChyZXNpemVFZGdlcy5sZWZ0IHx8IHJlc2l6ZUVkZ2VzLnJpZ2h0IHx8IHJlc2l6ZUVkZ2VzLnRvcCB8fCByZXNpemVFZGdlcy5ib3R0b20pIHtcbiAgICAgIGFyZy5hY3Rpb24gPSB7XG4gICAgICAgIG5hbWU6ICdyZXNpemUnLFxuICAgICAgICBlZGdlczogcmVzaXplRWRnZXMsXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGNvbnN0IHJpZ2h0ICA9IHJlc2l6ZU9wdGlvbnMuYXhpcyAhPT0gJ3knICYmIHBhZ2UueCA+IChyZWN0LnJpZ2h0ICAtIHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuICAgIGNvbnN0IGJvdHRvbSA9IHJlc2l6ZU9wdGlvbnMuYXhpcyAhPT0gJ3gnICYmIHBhZ2UueSA+IChyZWN0LmJvdHRvbSAtIHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuXG4gICAgaWYgKHJpZ2h0IHx8IGJvdHRvbSkge1xuICAgICAgYXJnLmFjdGlvbiA9IHtcbiAgICAgICAgbmFtZTogJ3Jlc2l6ZScsXG4gICAgICAgIGF4ZXM6IChyaWdodCA/ICd4JyA6ICcnKSArIChib3R0b20gPyAneScgOiAnJyksXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyZy5hY3Rpb24gPyBmYWxzZSA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiByZXNpemFibGUgKGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zOiBJbnRlcmFjdC5PckJvb2xlYW48SW50ZXJhY3QuUmVzaXphYmxlT3B0aW9ucz4gfCBib29sZWFuLCBzY29wZTogU2NvcGUpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZS5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZVxuICAgIGludGVyYWN0YWJsZS5zZXRQZXJBY3Rpb24oJ3Jlc2l6ZScsIG9wdGlvbnMpXG4gICAgaW50ZXJhY3RhYmxlLnNldE9uRXZlbnRzKCdyZXNpemUnLCBvcHRpb25zKVxuXG4gICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmF4aXMpICYmIC9eeCR8XnkkfF54eSQvLnRlc3Qob3B0aW9ucy5heGlzKSkge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLmF4aXMgPSBvcHRpb25zLmF4aXNcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5heGlzID09PSBudWxsKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemUuYXhpcyA9IHNjb3BlLmRlZmF1bHRzLmFjdGlvbnMucmVzaXplLmF4aXNcbiAgICB9XG5cbiAgICBpZiAoaXMuYm9vbChvcHRpb25zLnByZXNlcnZlQXNwZWN0UmF0aW8pKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemUucHJlc2VydmVBc3BlY3RSYXRpbyA9IG9wdGlvbnMucHJlc2VydmVBc3BlY3RSYXRpb1xuICAgIH1cbiAgICBlbHNlIGlmIChpcy5ib29sKG9wdGlvbnMuc3F1YXJlKSkge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLnNxdWFyZSA9IG9wdGlvbnMuc3F1YXJlXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG4gIGlmIChpcy5ib29sKG9wdGlvbnMpKSB7XG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gaW50ZXJhY3RhYmxlXG4gIH1cbiAgcmV0dXJuIGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZVxufVxuXG5mdW5jdGlvbiBjaGVja1Jlc2l6ZUVkZ2UgKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHBhZ2U6IEludGVyYWN0LlBvaW50LFxuICBlbGVtZW50OiBOb2RlLFxuICBpbnRlcmFjdGFibGVFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICByZWN0OiBJbnRlcmFjdC5SZWN0LFxuICBtYXJnaW46IG51bWJlcixcbikge1xuICAvLyBmYWxzZSwgJycsIHVuZGVmaW5lZCwgbnVsbFxuICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gdHJ1ZSB2YWx1ZSwgdXNlIHBvaW50ZXIgY29vcmRzIGFuZCBlbGVtZW50IHJlY3RcbiAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgLy8gaWYgZGltZW5zaW9ucyBhcmUgbmVnYXRpdmUsIFwic3dpdGNoXCIgZWRnZXNcbiAgICBjb25zdCB3aWR0aCAgPSBpcy5udW1iZXIocmVjdC53aWR0aCkgPyByZWN0LndpZHRoICA6IHJlY3QucmlnaHQgIC0gcmVjdC5sZWZ0XG4gICAgY29uc3QgaGVpZ2h0ID0gaXMubnVtYmVyKHJlY3QuaGVpZ2h0KSA/IHJlY3QuaGVpZ2h0IDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuXG4gICAgLy8gZG9uJ3QgdXNlIG1hcmdpbiBncmVhdGVyIHRoYW4gaGFsZiB0aGUgcmVsZXZlbnQgZGltZW5zaW9uXG4gICAgbWFyZ2luID0gTWF0aC5taW4obWFyZ2luLCAobmFtZSA9PT0gJ2xlZnQnIHx8IG5hbWUgPT09ICdyaWdodCcgPyB3aWR0aCA6IGhlaWdodCkgLyAyKVxuXG4gICAgaWYgKHdpZHRoIDwgMCkge1xuICAgICAgaWYgICAgICAobmFtZSA9PT0gJ2xlZnQnKSAgeyBuYW1lID0gJ3JpZ2h0JyB9XG4gICAgICBlbHNlIGlmIChuYW1lID09PSAncmlnaHQnKSB7IG5hbWUgPSAnbGVmdCcgIH1cbiAgICB9XG4gICAgaWYgKGhlaWdodCA8IDApIHtcbiAgICAgIGlmICAgICAgKG5hbWUgPT09ICd0b3AnKSAgICB7IG5hbWUgPSAnYm90dG9tJyB9XG4gICAgICBlbHNlIGlmIChuYW1lID09PSAnYm90dG9tJykgeyBuYW1lID0gJ3RvcCcgICAgfVxuICAgIH1cblxuICAgIGlmIChuYW1lID09PSAnbGVmdCcpIHsgcmV0dXJuIHBhZ2UueCA8ICgod2lkdGggID49IDAgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0KSArIG1hcmdpbikgfVxuICAgIGlmIChuYW1lID09PSAndG9wJykgeyByZXR1cm4gcGFnZS55IDwgKChoZWlnaHQgPj0gMCA/IHJlY3QudG9wIDogcmVjdC5ib3R0b20pICsgbWFyZ2luKSB9XG5cbiAgICBpZiAobmFtZSA9PT0gJ3JpZ2h0JykgeyByZXR1cm4gcGFnZS54ID4gKCh3aWR0aCAgPj0gMCA/IHJlY3QucmlnaHQgOiByZWN0LmxlZnQpIC0gbWFyZ2luKSB9XG4gICAgaWYgKG5hbWUgPT09ICdib3R0b20nKSB7IHJldHVybiBwYWdlLnkgPiAoKGhlaWdodCA+PSAwID8gcmVjdC5ib3R0b20gOiByZWN0LnRvcCkgLSBtYXJnaW4pIH1cbiAgfVxuXG4gIC8vIHRoZSByZW1haW5pbmcgY2hlY2tzIHJlcXVpcmUgYW4gZWxlbWVudFxuICBpZiAoIWlzLmVsZW1lbnQoZWxlbWVudCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICByZXR1cm4gaXMuZWxlbWVudCh2YWx1ZSlcbiAgLy8gdGhlIHZhbHVlIGlzIGFuIGVsZW1lbnQgdG8gdXNlIGFzIGEgcmVzaXplIGhhbmRsZVxuICAgID8gdmFsdWUgPT09IGVsZW1lbnRcbiAgICAvLyBvdGhlcndpc2UgY2hlY2sgaWYgZWxlbWVudCBtYXRjaGVzIHZhbHVlIGFzIHNlbGVjdG9yXG4gICAgOiBkb20ubWF0Y2hlc1VwVG8oZWxlbWVudCwgdmFsdWUsIGludGVyYWN0YWJsZUVsZW1lbnQpXG59XG5cbmZ1bmN0aW9uIGluaXRDdXJzb3JzIChicm93c2VyOiB0eXBlb2YgaW1wb3J0ICgnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcicpLmRlZmF1bHQpIHtcbiAgcmV0dXJuIChicm93c2VyLmlzSWU5ID8ge1xuICAgIHggOiAnZS1yZXNpemUnLFxuICAgIHkgOiAncy1yZXNpemUnLFxuICAgIHh5OiAnc2UtcmVzaXplJyxcblxuICAgIHRvcCAgICAgICAgOiAnbi1yZXNpemUnLFxuICAgIGxlZnQgICAgICAgOiAndy1yZXNpemUnLFxuICAgIGJvdHRvbSAgICAgOiAncy1yZXNpemUnLFxuICAgIHJpZ2h0ICAgICAgOiAnZS1yZXNpemUnLFxuICAgIHRvcGxlZnQgICAgOiAnc2UtcmVzaXplJyxcbiAgICBib3R0b21yaWdodDogJ3NlLXJlc2l6ZScsXG4gICAgdG9wcmlnaHQgICA6ICduZS1yZXNpemUnLFxuICAgIGJvdHRvbWxlZnQgOiAnbmUtcmVzaXplJyxcbiAgfSA6IHtcbiAgICB4IDogJ2V3LXJlc2l6ZScsXG4gICAgeSA6ICducy1yZXNpemUnLFxuICAgIHh5OiAnbndzZS1yZXNpemUnLFxuXG4gICAgdG9wICAgICAgICA6ICducy1yZXNpemUnLFxuICAgIGxlZnQgICAgICAgOiAnZXctcmVzaXplJyxcbiAgICBib3R0b20gICAgIDogJ25zLXJlc2l6ZScsXG4gICAgcmlnaHQgICAgICA6ICdldy1yZXNpemUnLFxuICAgIHRvcGxlZnQgICAgOiAnbndzZS1yZXNpemUnLFxuICAgIGJvdHRvbXJpZ2h0OiAnbndzZS1yZXNpemUnLFxuICAgIHRvcHJpZ2h0ICAgOiAnbmVzdy1yZXNpemUnLFxuICAgIGJvdHRvbWxlZnQgOiAnbmVzdy1yZXNpemUnLFxuICB9KVxufVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpRXZlbnQsIGludGVyYWN0aW9uIH06IHsgaUV2ZW50OiBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PGFueSwgYW55PiwgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUgIT09ICdyZXNpemUnIHx8ICFpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzaXplRXZlbnQgPSBpRXZlbnQgYXMgUmVzaXplRXZlbnRcbiAgY29uc3QgcmVjdCA9IGludGVyYWN0aW9uLnJlY3RcblxuICBpbnRlcmFjdGlvbi5fcmVjdHMgPSB7XG4gICAgc3RhcnQ6IGV4dGVuZCh7fSwgcmVjdCksXG4gICAgY29ycmVjdGVkOiBleHRlbmQoe30sIHJlY3QpLFxuICAgIHByZXZpb3VzOiBleHRlbmQoe30sIHJlY3QpLFxuICAgIGRlbHRhOiB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQgOiAwLFxuICAgICAgd2lkdGggOiAwLFxuICAgICAgdG9wIDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICB9LFxuICB9XG5cbiAgcmVzaXplRXZlbnQuZWRnZXMgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlc1xuICByZXNpemVFdmVudC5yZWN0ID0gaW50ZXJhY3Rpb24uX3JlY3RzLmNvcnJlY3RlZFxuICByZXNpemVFdmVudC5kZWx0YVJlY3QgPSBpbnRlcmFjdGlvbi5fcmVjdHMuZGVsdGFcbn1cblxuZnVuY3Rpb24gbW92ZSAoeyBpRXZlbnQsIGludGVyYWN0aW9uIH06IHsgaUV2ZW50OiBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PGFueSwgYW55PiwgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUgIT09ICdyZXNpemUnIHx8ICFpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlcykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IHJlc2l6ZUV2ZW50ID0gaUV2ZW50IGFzIFJlc2l6ZUV2ZW50XG4gIGNvbnN0IHJlc2l6ZU9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemVcbiAgY29uc3QgaW52ZXJ0ID0gcmVzaXplT3B0aW9ucy5pbnZlcnRcbiAgY29uc3QgaW52ZXJ0aWJsZSA9IGludmVydCA9PT0gJ3JlcG9zaXRpb24nIHx8IGludmVydCA9PT0gJ25lZ2F0ZSdcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGNvbnN0IGN1cnJlbnQgPSBpbnRlcmFjdGlvbi5yZWN0XG4gIGNvbnN0IHsgc3RhcnQ6IHN0YXJ0UmVjdCwgY29ycmVjdGVkLCBkZWx0YTogZGVsdGFSZWN0LCBwcmV2aW91cyB9ID0gaW50ZXJhY3Rpb24uX3JlY3RzXG5cbiAgZXh0ZW5kKHByZXZpb3VzLCBjb3JyZWN0ZWQpXG5cbiAgaWYgKGludmVydGlibGUpIHtcbiAgICAvLyBpZiBpbnZlcnRpYmxlLCBjb3B5IHRoZSBjdXJyZW50IHJlY3RcbiAgICBleHRlbmQoY29ycmVjdGVkLCBjdXJyZW50KVxuXG4gICAgaWYgKGludmVydCA9PT0gJ3JlcG9zaXRpb24nKSB7XG4gICAgICAvLyBzd2FwIGVkZ2UgdmFsdWVzIGlmIG5lY2Vzc2FyeSB0byBrZWVwIHdpZHRoL2hlaWdodCBwb3NpdGl2ZVxuICAgICAgaWYgKGNvcnJlY3RlZC50b3AgPiBjb3JyZWN0ZWQuYm90dG9tKSB7XG4gICAgICAgIGNvbnN0IHN3YXAgPSBjb3JyZWN0ZWQudG9wXG5cbiAgICAgICAgY29ycmVjdGVkLnRvcCA9IGNvcnJlY3RlZC5ib3R0b21cbiAgICAgICAgY29ycmVjdGVkLmJvdHRvbSA9IHN3YXBcbiAgICAgIH1cbiAgICAgIGlmIChjb3JyZWN0ZWQubGVmdCA+IGNvcnJlY3RlZC5yaWdodCkge1xuICAgICAgICBjb25zdCBzd2FwID0gY29ycmVjdGVkLmxlZnRcblxuICAgICAgICBjb3JyZWN0ZWQubGVmdCA9IGNvcnJlY3RlZC5yaWdodFxuICAgICAgICBjb3JyZWN0ZWQucmlnaHQgPSBzd2FwXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIGlmIG5vdCBpbnZlcnRpYmxlLCByZXN0cmljdCB0byBtaW5pbXVtIG9mIDB4MCByZWN0XG4gICAgY29ycmVjdGVkLnRvcCAgICA9IE1hdGgubWluKGN1cnJlbnQudG9wLCBzdGFydFJlY3QuYm90dG9tKVxuICAgIGNvcnJlY3RlZC5ib3R0b20gPSBNYXRoLm1heChjdXJyZW50LmJvdHRvbSwgc3RhcnRSZWN0LnRvcClcbiAgICBjb3JyZWN0ZWQubGVmdCAgID0gTWF0aC5taW4oY3VycmVudC5sZWZ0LCBzdGFydFJlY3QucmlnaHQpXG4gICAgY29ycmVjdGVkLnJpZ2h0ICA9IE1hdGgubWF4KGN1cnJlbnQucmlnaHQsIHN0YXJ0UmVjdC5sZWZ0KVxuICB9XG5cbiAgY29ycmVjdGVkLndpZHRoICA9IGNvcnJlY3RlZC5yaWdodCAgLSBjb3JyZWN0ZWQubGVmdFxuICBjb3JyZWN0ZWQuaGVpZ2h0ID0gY29ycmVjdGVkLmJvdHRvbSAtIGNvcnJlY3RlZC50b3BcblxuICBmb3IgKGNvbnN0IGVkZ2UgaW4gY29ycmVjdGVkKSB7XG4gICAgZGVsdGFSZWN0W2VkZ2VdID0gY29ycmVjdGVkW2VkZ2VdIC0gcHJldmlvdXNbZWRnZV1cbiAgfVxuXG4gIHJlc2l6ZUV2ZW50LmVkZ2VzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuZWRnZXNcbiAgcmVzaXplRXZlbnQucmVjdCA9IGNvcnJlY3RlZFxuICByZXNpemVFdmVudC5kZWx0YVJlY3QgPSBkZWx0YVJlY3Rcbn1cblxuZnVuY3Rpb24gZW5kICh7IGlFdmVudCwgaW50ZXJhY3Rpb24gfTogeyBpRXZlbnQ6IEludGVyYWN0LkludGVyYWN0RXZlbnQ8YW55LCBhbnk+LCBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24gfSkge1xuICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ3Jlc2l6ZScgfHwgIWludGVyYWN0aW9uLnByZXBhcmVkLmVkZ2VzKSB7IHJldHVybiB9XG5cbiAgY29uc3QgcmVzaXplRXZlbnQgPSBpRXZlbnQgYXMgUmVzaXplRXZlbnRcblxuICByZXNpemVFdmVudC5lZGdlcyA9IGludGVyYWN0aW9uLnByZXBhcmVkLmVkZ2VzXG4gIHJlc2l6ZUV2ZW50LnJlY3QgPSBpbnRlcmFjdGlvbi5fcmVjdHMuY29ycmVjdGVkXG4gIHJlc2l6ZUV2ZW50LmRlbHRhUmVjdCA9IGludGVyYWN0aW9uLl9yZWN0cy5kZWx0YVxufVxuXG5mdW5jdGlvbiB1cGRhdGVFdmVudEF4ZXMgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbiB9OiB7IGlFdmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxhbnksIGFueT4sIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAncmVzaXplJyB8fCAhaW50ZXJhY3Rpb24ucmVzaXplQXhlcykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9uc1xuICBjb25zdCByZXNpemVFdmVudCA9IGlFdmVudCBhcyBSZXNpemVFdmVudFxuXG4gIGlmIChvcHRpb25zLnJlc2l6ZS5zcXVhcmUpIHtcbiAgICBpZiAoaW50ZXJhY3Rpb24ucmVzaXplQXhlcyA9PT0gJ3knKSB7XG4gICAgICByZXNpemVFdmVudC5kZWx0YS54ID0gcmVzaXplRXZlbnQuZGVsdGEueVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJlc2l6ZUV2ZW50LmRlbHRhLnkgPSByZXNpemVFdmVudC5kZWx0YS54XG4gICAgfVxuICAgIHJlc2l6ZUV2ZW50LmF4ZXMgPSAneHknXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzaXplRXZlbnQuYXhlcyA9IGludGVyYWN0aW9uLnJlc2l6ZUF4ZXNcblxuICAgIGlmIChpbnRlcmFjdGlvbi5yZXNpemVBeGVzID09PSAneCcpIHtcbiAgICAgIHJlc2l6ZUV2ZW50LmRlbHRhLnkgPSAwXG4gICAgfVxuICAgIGVsc2UgaWYgKGludGVyYWN0aW9uLnJlc2l6ZUF4ZXMgPT09ICd5Jykge1xuICAgICAgcmVzaXplRXZlbnQuZGVsdGEueCA9IDBcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcmVzaXplOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYWN0aW9ucy9yZXNpemUnLFxuICBiZWZvcmU6IFsnYWN0aW9ucy9kcmFnJ10sXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogKHsgaW50ZXJhY3Rpb24gfSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24ucmVzaXplQXhlcyA9ICd4eSdcbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tc3RhcnQnOiBhcmcgPT4ge1xuICAgICAgc3RhcnQoYXJnKVxuICAgICAgdXBkYXRlRXZlbnRBeGVzKGFyZylcbiAgICB9LFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBhcmcgPT4ge1xuICAgICAgbW92ZShhcmcpXG4gICAgICB1cGRhdGVFdmVudEF4ZXMoYXJnKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tZW5kJzogZW5kLFxuICAgICdhdXRvLXN0YXJ0OmNoZWNrJzogcmVzaXplQ2hlY2tlcixcbiAgfSxcblxuICBkZWZhdWx0czoge1xuICAgIHNxdWFyZTogZmFsc2UsXG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgYXhpczogJ3h5JyxcblxuICAgIC8vIHVzZSBkZWZhdWx0IG1hcmdpblxuICAgIG1hcmdpbjogTmFOLFxuXG4gICAgLy8gb2JqZWN0IHdpdGggcHJvcHMgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIHdoaWNoIGFyZVxuICAgIC8vIHRydWUvZmFsc2UgdmFsdWVzIHRvIHJlc2l6ZSB3aGVuIHRoZSBwb2ludGVyIGlzIG92ZXIgdGhhdCBlZGdlLFxuICAgIC8vIENTUyBzZWxlY3RvcnMgdG8gbWF0Y2ggdGhlIGhhbmRsZXMgZm9yIGVhY2ggZGlyZWN0aW9uXG4gICAgLy8gb3IgdGhlIEVsZW1lbnRzIGZvciBlYWNoIGhhbmRsZVxuICAgIGVkZ2VzOiBudWxsLFxuXG4gICAgLy8gYSB2YWx1ZSBvZiAnbm9uZScgd2lsbCBsaW1pdCB0aGUgcmVzaXplIHJlY3QgdG8gYSBtaW5pbXVtIG9mIDB4MFxuICAgIC8vICduZWdhdGUnIHdpbGwgYWxvdyB0aGUgcmVjdCB0byBoYXZlIG5lZ2F0aXZlIHdpZHRoL2hlaWdodFxuICAgIC8vICdyZXBvc2l0aW9uJyB3aWxsIGtlZXAgdGhlIHdpZHRoL2hlaWdodCBwb3NpdGl2ZSBieSBzd2FwcGluZ1xuICAgIC8vIHRoZSB0b3AgYW5kIGJvdHRvbSBlZGdlcyBhbmQvb3Igc3dhcHBpbmcgdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzXG4gICAgaW52ZXJ0OiAnbm9uZScsXG4gIH0gYXMgSW50ZXJhY3QuUmVzaXphYmxlT3B0aW9ucyxcblxuICBjdXJzb3JzOiBudWxsIGFzIFJldHVyblR5cGU8dHlwZW9mIGluaXRDdXJzb3JzPixcblxuICBnZXRDdXJzb3IgKHsgZWRnZXMsIGF4aXMsIG5hbWUgfTogSW50ZXJhY3QuQWN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjdXJzb3JzID0gcmVzaXplLmN1cnNvcnNcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsXG5cbiAgICBpZiAoYXhpcykge1xuICAgICAgcmVzdWx0ID0gY3Vyc29yc1tuYW1lICsgYXhpc11cbiAgICB9XG4gICAgZWxzZSBpZiAoZWRnZXMpIHtcbiAgICAgIGxldCBjdXJzb3JLZXkgPSAnJ1xuXG4gICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgWyd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnXSkge1xuICAgICAgICBpZiAoZWRnZXNbZWRnZV0pIHtcbiAgICAgICAgICBjdXJzb3JLZXkgKz0gZWRnZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCA9IGN1cnNvcnNbY3Vyc29yS2V5XVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfSxcblxuICBkZWZhdWx0TWFyZ2luOiBudWxsIGFzIG51bWJlcixcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVzaXplXG4iLCJpbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgZHJhZyBmcm9tICcuL2RyYWcnXG5pbXBvcnQgZHJvcCBmcm9tICcuL2Ryb3AvaW5kZXgnXG5pbXBvcnQgZ2VzdHVyZSBmcm9tICcuL2dlc3R1cmUnXG5pbXBvcnQgcmVzaXplIGZyb20gJy4vcmVzaXplJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnYWN0aW9ucycsXG4gIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICAgIHNjb3BlLnVzZVBsdWdpbihnZXN0dXJlKVxuICAgIHNjb3BlLnVzZVBsdWdpbihyZXNpemUpXG4gICAgc2NvcGUudXNlUGx1Z2luKGRyYWcpXG4gICAgc2NvcGUudXNlUGx1Z2luKGRyb3ApXG4gIH0sXG59XG5cbmV4cG9ydCB7XG4gIGdlc3R1cmUsXG4gIHJlc2l6ZSxcbiAgZHJhZyxcbiAgZHJvcCxcbn1cbiIsImltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5pbXBvcnQgcmFmIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JhZidcbmltcG9ydCB7IGdldFN0cmluZ09wdGlvblJlc3VsdCB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JlY3QnXG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy93aW5kb3cnXG5cbnR5cGUgU2NvcGUgPSBpbXBvcnQgKCdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJykuU2NvcGVcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNjb3BlIHtcbiAgICBhdXRvU2Nyb2xsOiB0eXBlb2YgYXV0b1Njcm9sbFxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgYXV0b1Njcm9sbD86IHR5cGVvZiBhdXRvU2Nyb2xsXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIFBlckFjdGlvbkRlZmF1bHRzIHtcbiAgICBhdXRvU2Nyb2xsPzogQXV0b1Njcm9sbE9wdGlvbnNcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TY3JvbGxPcHRpb25zIHtcbiAgY29udGFpbmVyPzogV2luZG93IHwgSFRNTEVsZW1lbnRcbiAgbWFyZ2luPzogbnVtYmVyXG4gIGRpc3RhbmNlPzogbnVtYmVyXG4gIGludGVydmFsPzogbnVtYmVyXG4gIHNwZWVkPzogbnVtYmVyXG4gIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgZGVmYXVsdHMsXG4gICAgYWN0aW9ucyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUuYXV0b1Njcm9sbCA9IGF1dG9TY3JvbGxcbiAgYXV0b1Njcm9sbC5ub3cgPSAoKSA9PiBzY29wZS5ub3coKVxuXG4gIGFjdGlvbnMucGhhc2VsZXNzVHlwZXMuYXV0b3Njcm9sbCA9IHRydWVcbiAgZGVmYXVsdHMucGVyQWN0aW9uLmF1dG9TY3JvbGwgPSBhdXRvU2Nyb2xsLmRlZmF1bHRzXG59XG5cbmNvbnN0IGF1dG9TY3JvbGwgPSB7XG4gIGRlZmF1bHRzOiB7XG4gICAgZW5hYmxlZCAgOiBmYWxzZSxcbiAgICBtYXJnaW4gICA6IDYwLFxuXG4gICAgLy8gdGhlIGl0ZW0gdGhhdCBpcyBzY3JvbGxlZCAoV2luZG93IG9yIEhUTUxFbGVtZW50KVxuICAgIGNvbnRhaW5lcjogbnVsbCBhcyBBdXRvU2Nyb2xsT3B0aW9uc1snY29udGFpbmVyJ10sXG5cbiAgICAvLyB0aGUgc2Nyb2xsIHNwZWVkIGluIHBpeGVscyBwZXIgc2Vjb25kXG4gICAgc3BlZWQgICAgOiAzMDAsXG4gIH0gYXMgQXV0b1Njcm9sbE9wdGlvbnMsXG5cbiAgbm93OiBEYXRlLm5vdyxcblxuICBpbnRlcmFjdGlvbjogbnVsbCBhcyBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgaTogMCwgLy8gdGhlIGhhbmRsZSByZXR1cm5lZCBieSB3aW5kb3cuc2V0SW50ZXJ2YWxcblxuICAvLyBEaXJlY3Rpb24gZWFjaCBwdWxzZSBpcyB0byBzY3JvbGwgaW5cbiAgeDogMCxcbiAgeTogMCxcblxuICBpc1Njcm9sbGluZzogZmFsc2UsXG4gIHByZXZUaW1lOiAwLFxuICBtYXJnaW46IDAsXG4gIHNwZWVkOiAwLFxuXG4gIHN0YXJ0IChpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24pIHtcbiAgICBhdXRvU2Nyb2xsLmlzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgIHJhZi5jYW5jZWwoYXV0b1Njcm9sbC5pKVxuXG4gICAgaW50ZXJhY3Rpb24uYXV0b1Njcm9sbCA9IGF1dG9TY3JvbGxcbiAgICBhdXRvU2Nyb2xsLmludGVyYWN0aW9uID0gaW50ZXJhY3Rpb25cbiAgICBhdXRvU2Nyb2xsLnByZXZUaW1lID0gYXV0b1Njcm9sbC5ub3coKVxuICAgIGF1dG9TY3JvbGwuaSA9IHJhZi5yZXF1ZXN0KGF1dG9TY3JvbGwuc2Nyb2xsKVxuICB9LFxuXG4gIHN0b3AgKCkge1xuICAgIGF1dG9TY3JvbGwuaXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgIGlmIChhdXRvU2Nyb2xsLmludGVyYWN0aW9uKSB7XG4gICAgICBhdXRvU2Nyb2xsLmludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgfVxuICAgIHJhZi5jYW5jZWwoYXV0b1Njcm9sbC5pKVxuICB9LFxuXG4gIC8vIHNjcm9sbCB0aGUgd2luZG93IGJ5IHRoZSB2YWx1ZXMgaW4gc2Nyb2xsLngveVxuICBzY3JvbGwgKCkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGF1dG9TY3JvbGxcbiAgICBjb25zdCB7IGludGVyYWN0YWJsZSwgZWxlbWVudCB9ID0gaW50ZXJhY3Rpb25cbiAgICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb25OYW1lXS5hdXRvU2Nyb2xsXG4gICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbnMuY29udGFpbmVyLCBpbnRlcmFjdGFibGUsIGVsZW1lbnQpXG4gICAgY29uc3Qgbm93ID0gYXV0b1Njcm9sbC5ub3coKVxuICAgIC8vIGNoYW5nZSBpbiB0aW1lIGluIHNlY29uZHNcbiAgICBjb25zdCBkdCA9IChub3cgLSBhdXRvU2Nyb2xsLnByZXZUaW1lKSAvIDEwMDBcbiAgICAvLyBkaXNwbGFjZW1lbnRcbiAgICBjb25zdCBzID0gb3B0aW9ucy5zcGVlZCAqIGR0XG5cbiAgICBpZiAocyA+PSAxKSB7XG4gICAgICBjb25zdCBzY3JvbGxCeSA9IHtcbiAgICAgICAgeDogYXV0b1Njcm9sbC54ICogcyxcbiAgICAgICAgeTogYXV0b1Njcm9sbC55ICogcyxcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbEJ5LnggfHwgc2Nyb2xsQnkueSkge1xuICAgICAgICBjb25zdCBwcmV2U2Nyb2xsID0gZ2V0U2Nyb2xsKGNvbnRhaW5lcilcblxuICAgICAgICBpZiAoaXMud2luZG93KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICBjb250YWluZXIuc2Nyb2xsQnkoc2Nyb2xsQnkueCwgc2Nyb2xsQnkueSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICBjb250YWluZXIuc2Nyb2xsTGVmdCArPSBzY3JvbGxCeS54XG4gICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCAgKz0gc2Nyb2xsQnkueVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VyU2Nyb2xsID0gZ2V0U2Nyb2xsKGNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgZGVsdGEgPSB7XG4gICAgICAgICAgeDogY3VyU2Nyb2xsLnggLSBwcmV2U2Nyb2xsLngsXG4gICAgICAgICAgeTogY3VyU2Nyb2xsLnkgLSBwcmV2U2Nyb2xsLnksXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsdGEueCB8fCBkZWx0YS55KSB7XG4gICAgICAgICAgaW50ZXJhY3RhYmxlLmZpcmUoe1xuICAgICAgICAgICAgdHlwZTogJ2F1dG9zY3JvbGwnLFxuICAgICAgICAgICAgdGFyZ2V0OiBlbGVtZW50LFxuICAgICAgICAgICAgaW50ZXJhY3RhYmxlLFxuICAgICAgICAgICAgZGVsdGEsXG4gICAgICAgICAgICBpbnRlcmFjdGlvbixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF1dG9TY3JvbGwucHJldlRpbWUgPSBub3dcbiAgICB9XG5cbiAgICBpZiAoYXV0b1Njcm9sbC5pc1Njcm9sbGluZykge1xuICAgICAgcmFmLmNhbmNlbChhdXRvU2Nyb2xsLmkpXG4gICAgICBhdXRvU2Nyb2xsLmkgPSByYWYucmVxdWVzdChhdXRvU2Nyb2xsLnNjcm9sbClcbiAgICB9XG4gIH0sXG4gIGNoZWNrIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgYWN0aW9uTmFtZTogSW50ZXJhY3QuQWN0aW9uTmFtZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1xuXG4gICAgcmV0dXJuIG9wdGlvbnNbYWN0aW9uTmFtZV0uYXV0b1Njcm9sbCAmJiBvcHRpb25zW2FjdGlvbk5hbWVdLmF1dG9TY3JvbGwuZW5hYmxlZFxuICB9LFxuICBvbkludGVyYWN0aW9uTW92ZTxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKHsgaW50ZXJhY3Rpb24sIHBvaW50ZXIgfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb248VD4sIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIH0pIHtcbiAgICBpZiAoIShpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpICYmXG4gICAgICAgICAgYXV0b1Njcm9sbC5jaGVjayhpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLnNpbXVsYXRpb24pIHtcbiAgICAgIGF1dG9TY3JvbGwueCA9IGF1dG9TY3JvbGwueSA9IDBcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCB0b3BcbiAgICBsZXQgcmlnaHRcbiAgICBsZXQgYm90dG9tXG4gICAgbGV0IGxlZnRcblxuICAgIGNvbnN0IHsgaW50ZXJhY3RhYmxlLCBlbGVtZW50IH0gPSBpbnRlcmFjdGlvblxuICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lXG4gICAgY29uc3Qgb3B0aW9ucyA9IGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbk5hbWVdLmF1dG9TY3JvbGxcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXIob3B0aW9ucy5jb250YWluZXIsIGludGVyYWN0YWJsZSwgZWxlbWVudClcblxuICAgIGlmIChpcy53aW5kb3coY29udGFpbmVyKSkge1xuICAgICAgbGVmdCAgID0gcG9pbnRlci5jbGllbnRYIDwgYXV0b1Njcm9sbC5tYXJnaW5cbiAgICAgIHRvcCAgICA9IHBvaW50ZXIuY2xpZW50WSA8IGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICByaWdodCAgPSBwb2ludGVyLmNsaWVudFggPiBjb250YWluZXIuaW5uZXJXaWR0aCAgLSBhdXRvU2Nyb2xsLm1hcmdpblxuICAgICAgYm90dG9tID0gcG9pbnRlci5jbGllbnRZID4gY29udGFpbmVyLmlubmVySGVpZ2h0IC0gYXV0b1Njcm9sbC5tYXJnaW5cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCByZWN0ID0gZG9tVXRpbHMuZ2V0RWxlbWVudENsaWVudFJlY3QoY29udGFpbmVyKVxuXG4gICAgICBsZWZ0ICAgPSBwb2ludGVyLmNsaWVudFggPCByZWN0LmxlZnQgICArIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICB0b3AgICAgPSBwb2ludGVyLmNsaWVudFkgPCByZWN0LnRvcCAgICArIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICByaWdodCAgPSBwb2ludGVyLmNsaWVudFggPiByZWN0LnJpZ2h0ICAtIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICBib3R0b20gPSBwb2ludGVyLmNsaWVudFkgPiByZWN0LmJvdHRvbSAtIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgfVxuXG4gICAgYXV0b1Njcm9sbC54ID0gKHJpZ2h0ID8gMSA6IGxlZnQgPyAtMSA6IDApXG4gICAgYXV0b1Njcm9sbC55ID0gKGJvdHRvbSA/IDEgOiAgdG9wID8gLTEgOiAwKVxuXG4gICAgaWYgKCFhdXRvU2Nyb2xsLmlzU2Nyb2xsaW5nKSB7XG4gICAgICAvLyBzZXQgdGhlIGF1dG9TY3JvbGwgcHJvcGVydGllcyB0byB0aG9zZSBvZiB0aGUgdGFyZ2V0XG4gICAgICBhdXRvU2Nyb2xsLm1hcmdpbiA9IG9wdGlvbnMubWFyZ2luXG4gICAgICBhdXRvU2Nyb2xsLnNwZWVkICA9IG9wdGlvbnMuc3BlZWRcblxuICAgICAgYXV0b1Njcm9sbC5zdGFydChpbnRlcmFjdGlvbilcbiAgICB9XG4gIH0sXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250YWluZXIgKHZhbHVlOiBhbnksIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gIHJldHVybiAoaXMuc3RyaW5nKHZhbHVlKSA/IGdldFN0cmluZ09wdGlvblJlc3VsdCh2YWx1ZSwgaW50ZXJhY3RhYmxlLCBlbGVtZW50KSA6IHZhbHVlKSB8fCBnZXRXaW5kb3coZWxlbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjcm9sbCAoY29udGFpbmVyOiBhbnkpIHtcbiAgaWYgKGlzLndpbmRvdyhjb250YWluZXIpKSB7IGNvbnRhaW5lciA9IHdpbmRvdy5kb2N1bWVudC5ib2R5IH1cblxuICByZXR1cm4geyB4OiBjb250YWluZXIuc2Nyb2xsTGVmdCwgeTogY29udGFpbmVyLnNjcm9sbFRvcCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxTaXplIChjb250YWluZXI6IGFueSkge1xuICBpZiAoaXMud2luZG93KGNvbnRhaW5lcikpIHsgY29udGFpbmVyID0gd2luZG93LmRvY3VtZW50LmJvZHkgfVxuXG4gIHJldHVybiB7IHg6IGNvbnRhaW5lci5zY3JvbGxXaWR0aCwgeTogY29udGFpbmVyLnNjcm9sbEhlaWdodCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxTaXplRGVsdGE8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+ICh7IGludGVyYWN0aW9uLCBlbGVtZW50IH06IHtcbiAgaW50ZXJhY3Rpb246IFBhcnRpYWw8SW50ZXJhY3QuSW50ZXJhY3Rpb248VD4+XG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbn0sIGZ1bmM6IGFueSkge1xuICBjb25zdCBzY3JvbGxPcHRpb25zID0gaW50ZXJhY3Rpb24gJiYgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLm9wdGlvbnNbaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZV0uYXV0b1Njcm9sbFxuXG4gIGlmICghc2Nyb2xsT3B0aW9ucyB8fCAhc2Nyb2xsT3B0aW9ucy5lbmFibGVkKSB7XG4gICAgZnVuYygpXG4gICAgcmV0dXJuIHsgeDogMCwgeTogMCB9XG4gIH1cblxuICBjb25zdCBzY3JvbGxDb250YWluZXIgPSBnZXRDb250YWluZXIoXG4gICAgc2Nyb2xsT3B0aW9ucy5jb250YWluZXIsXG4gICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLFxuICAgIGVsZW1lbnQsXG4gIClcblxuICBjb25zdCBwcmV2U2l6ZSA9IGdldFNjcm9sbChzY3JvbGxDb250YWluZXIpXG4gIGZ1bmMoKVxuICBjb25zdCBjdXJTaXplID0gZ2V0U2Nyb2xsKHNjcm9sbENvbnRhaW5lcilcblxuICByZXR1cm4ge1xuICAgIHg6IGN1clNpemUueCAtIHByZXZTaXplLngsXG4gICAgeTogY3VyU2l6ZS55IC0gcHJldlNpemUueSxcbiAgfVxufVxuXG5jb25zdCBhdXRvU2Nyb2xsUGx1Z2luOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYXV0by1zY3JvbGwnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgfSxcblxuICAgICdpbnRlcmFjdGlvbnM6ZGVzdHJveSc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgICBhdXRvU2Nyb2xsLnN0b3AoKVxuICAgICAgaWYgKGF1dG9TY3JvbGwuaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgYXV0b1Njcm9sbC5pbnRlcmFjdGlvbiA9IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogYXV0b1Njcm9sbC5zdG9wLFxuXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IChhcmc6IGFueSkgPT4gYXV0b1Njcm9sbC5vbkludGVyYWN0aW9uTW92ZShhcmcpLFxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBhdXRvU2Nyb2xsUGx1Z2luXG4iLCJpbXBvcnQgeyB3YXJuT25jZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBnZXRBY3Rpb246IChcbiAgICAgIHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLFxuICAgICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sXG4gICAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgICkgPT4gSW50ZXJhY3QuQWN0aW9uUHJvcHMgfCBudWxsXG4gICAgc3R5bGVDdXJzb3I6IHR5cGVvZiBzdHlsZUN1cnNvclxuICAgIGFjdGlvbkNoZWNrZXI6IHR5cGVvZiBhY3Rpb25DaGVja2VyXG4gICAgaWdub3JlRnJvbToge1xuICAgICAgKC4uLmFyZ3M6IGFueVtdKTogSW50ZXJhY3RhYmxlXG4gICAgICAoKTogYm9vbGVhblxuICAgIH1cbiAgICBhbGxvd0Zyb206IHtcbiAgICAgICguLi5hcmdzOiBhbnlbXSk6IEludGVyYWN0YWJsZVxuICAgICAgKCk6IGJvb2xlYW5cbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBwb2ludGVySXNEb3duOiBib29sZWFuXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICAvKiogQGxlbmRzIEludGVyYWN0YWJsZSAqL1xuICAgIEludGVyYWN0YWJsZSwgLy8gdHNsaW50OmRpc2FibGUtbGluZSBuby1zaGFkb3dlZC12YXJpYWJsZVxuICB9ID0gc2NvcGVcblxuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmdldEFjdGlvbiA9IGZ1bmN0aW9uIGdldEFjdGlvbiAoXG4gICAgdGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLFxuICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLFxuICAgIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLFxuICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICApOiBJbnRlcmFjdC5BY3Rpb25Qcm9wcyB7XG4gICAgY29uc3QgYWN0aW9uID0gZGVmYXVsdEFjdGlvbkNoZWNrZXIodGhpcywgZXZlbnQsIGludGVyYWN0aW9uLCBlbGVtZW50LCBzY29wZSlcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlcikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hY3Rpb25DaGVja2VyKHBvaW50ZXIsIGV2ZW50LCBhY3Rpb24sIHRoaXMsIGVsZW1lbnQsIGludGVyYWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBgYGBqc1xuICAgKiBpbnRlcmFjdChlbGVtZW50LCB7IGlnbm9yZUZyb206IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduby1hY3Rpb24nKSB9KVxuICAgKiAvLyBvclxuICAgKiBpbnRlcmFjdChlbGVtZW50KS5pZ25vcmVGcm9tKCdpbnB1dCwgdGV4dGFyZWEsIGEnKVxuICAgKiBgYGBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogSWYgdGhlIHRhcmdldCBvZiB0aGUgYG1vdXNlZG93bmAsIGBwb2ludGVyZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50IG9yIGFueVxuICAgKiBvZiBpdCdzIHBhcmVudHMgbWF0Y2ggdGhlIGdpdmVuIENTUyBzZWxlY3RvciBvciBFbGVtZW50LCBub1xuICAgKiBkcmFnL3Jlc2l6ZS9nZXN0dXJlIGlzIHN0YXJ0ZWQuXG4gICAqXG4gICAqIERvbid0IHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCBzZXQgdGhlIGBpZ25vcmVGcm9tYCBvcHRpb24gZm9yIGVhY2ggYWN0aW9uXG4gICAqIG9yIGZvciBgcG9pbnRlckV2ZW50c2BcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogaW50ZXJhY3QodGFyZ2V0dClcbiAgICogICAuZHJhZ2dhYmxlKHtcbiAgICogICAgIGlnbm9yZUZyb206ICdpbnB1dCwgdGV4dGFyZWEsIGFbaHJlZl0nJyxcbiAgICogICB9KVxuICAgKiAgIC5wb2ludGVyRXZlbnRzKHtcbiAgICogICAgIGlnbm9yZUZyb206ICdbbm8tcG9pbnRlcl0nLFxuICAgKiAgIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRWxlbWVudCB8IG51bGx9IFtuZXdWYWx1ZV0gYSBDU1Mgc2VsZWN0b3Igc3RyaW5nLCBhblxuICAgKiBFbGVtZW50IG9yIGBudWxsYCB0byBub3QgaWdub3JlIGFueSBlbGVtZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBFbGVtZW50IHwgb2JqZWN0fSBUaGUgY3VycmVudCBpZ25vcmVGcm9tIHZhbHVlIG9yIHRoaXNcbiAgICogSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmlnbm9yZUZyb20gPSB3YXJuT25jZShmdW5jdGlvbiAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBuZXdWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrQ29tcGF0T3B0aW9uKCdpZ25vcmVGcm9tJywgbmV3VmFsdWUpXG4gIH0sICdJbnRlcmFjdGFibGUuaWdub3JlRnJvbSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBJbnRlcmFjdGJsZS5kcmFnZ2FibGUoe2lnbm9yZUZyb206IG5ld1ZhbHVlfSkuJylcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICpcbiAgICogQSBkcmFnL3Jlc2l6ZS9nZXN0dXJlIGlzIHN0YXJ0ZWQgb25seSBJZiB0aGUgdGFyZ2V0IG9mIHRoZSBgbW91c2Vkb3duYCxcbiAgICogYHBvaW50ZXJkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQgb3IgYW55IG9mIGl0J3MgcGFyZW50cyBtYXRjaCB0aGUgZ2l2ZW5cbiAgICogQ1NTIHNlbGVjdG9yIG9yIEVsZW1lbnQuXG4gICAqXG4gICAqIERvbid0IHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCBzZXQgdGhlIGBhbGxvd0Zyb21gIG9wdGlvbiBmb3IgZWFjaCBhY3Rpb25cbiAgICogb3IgZm9yIGBwb2ludGVyRXZlbnRzYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpbnRlcmFjdCh0YXJnZXR0KVxuICAgKiAgIC5yZXNpemFibGUoe1xuICAgKiAgICAgYWxsb3dGcm9tOiAnLnJlc2l6ZS1oYW5kbGUnLFxuICAgKiAgIC5wb2ludGVyRXZlbnRzKHtcbiAgICogICAgIGFsbG93RnJvbTogJy5oYW5kbGUnLCxcbiAgICogICB9KVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEVsZW1lbnQgfCBudWxsfSBbbmV3VmFsdWVdIGEgQ1NTIHNlbGVjdG9yIHN0cmluZywgYW5cbiAgICogRWxlbWVudCBvciBgbnVsbGAgdG8gYWxsb3cgZnJvbSBhbnkgZWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBFbGVtZW50IHwgb2JqZWN0fSBUaGUgY3VycmVudCBhbGxvd0Zyb20gdmFsdWUgb3IgdGhpc1xuICAgKiBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuYWxsb3dGcm9tID0gd2Fybk9uY2UoZnVuY3Rpb24gKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja0NvbXBhdE9wdGlvbignYWxsb3dGcm9tJywgbmV3VmFsdWUpXG4gIH0sICdJbnRlcmFjdGFibGUuYWxsb3dGcm9tKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIEludGVyYWN0YmxlLmRyYWdnYWJsZSh7YWxsb3dGcm9tOiBuZXdWYWx1ZX0pLicpXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGludGVyYWN0KCcucmVzaXplLWRyYWcnKVxuICAgKiAgIC5yZXNpemFibGUodHJ1ZSlcbiAgICogICAuZHJhZ2dhYmxlKHRydWUpXG4gICAqICAgLmFjdGlvbkNoZWNrZXIoZnVuY3Rpb24gKHBvaW50ZXIsIGV2ZW50LCBhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgaW50ZXJhY3Rpb24pIHtcbiAgICpcbiAgICogICBpZiAoaW50ZXJhY3QubWF0Y2hlc1NlbGVjdG9yKGV2ZW50LnRhcmdldCwgJy5kcmFnLWhhbmRsZScpKSB7XG4gICAqICAgICAvLyBmb3JjZSBkcmFnIHdpdGggaGFuZGxlIHRhcmdldFxuICAgKiAgICAgYWN0aW9uLm5hbWUgPSBkcmFnXG4gICAqICAgfVxuICAgKiAgIGVsc2Uge1xuICAgKiAgICAgLy8gcmVzaXplIGZyb20gdGhlIHRvcCBhbmQgcmlnaHQgZWRnZXNcbiAgICogICAgIGFjdGlvbi5uYW1lICA9ICdyZXNpemUnXG4gICAqICAgICBhY3Rpb24uZWRnZXMgPSB7IHRvcDogdHJ1ZSwgcmlnaHQ6IHRydWUgfVxuICAgKiAgIH1cbiAgICpcbiAgICogICByZXR1cm4gYWN0aW9uXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXR1cm5zIG9yIHNldHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvblxuICAgKiBwb2ludGVyRG93blxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgbnVsbH0gW2NoZWNrZXJdIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBwb2ludGVyIGV2ZW50LFxuICAgKiBkZWZhdWx0QWN0aW9uIHN0cmluZywgaW50ZXJhY3RhYmxlLCBlbGVtZW50IGFuZCBpbnRlcmFjdGlvbiBhcyBwYXJhbWV0ZXJzXG4gICAqIGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIG5hbWUgcHJvcGVydHkgJ2RyYWcnICdyZXNpemUnIG9yICdnZXN0dXJlJyBhbmRcbiAgICogb3B0aW9uYWxseSBhbiBgZWRnZXNgIG9iamVjdCB3aXRoIGJvb2xlYW4gJ3RvcCcsICdsZWZ0JywgJ2JvdHRvbScgYW5kIHJpZ2h0XG4gICAqIHByb3BzLlxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbiB8IEludGVyYWN0YWJsZX0gVGhlIGNoZWNrZXIgZnVuY3Rpb24gb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuYWN0aW9uQ2hlY2tlciA9IGFjdGlvbkNoZWNrZXJcblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHdoZXRoZXIgdGhlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGNoYW5nZWQgZGVwZW5kaW5nIG9uIHRoZVxuICAgKiBhY3Rpb24gdGhhdCB3b3VsZCBiZSBwZXJmb3JtZWQgaWYgdGhlIG1vdXNlIHdlcmUgcHJlc3NlZCBhbmQgZHJhZ2dlZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbbmV3VmFsdWVdXG4gICAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IFRoZSBjdXJyZW50IHNldHRpbmcgb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuc3R5bGVDdXJzb3IgPSBzdHlsZUN1cnNvclxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QWN0aW9uQ2hlY2tlciAoXG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLFxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICBzY29wZTogSW50ZXJhY3QuU2NvcGUsXG4pIHtcbiAgY29uc3QgcmVjdCA9IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQpXG4gIGNvbnN0IGJ1dHRvbnMgPSAoZXZlbnQgYXMgTW91c2VFdmVudCkuYnV0dG9ucyB8fCAoe1xuICAgIDA6IDEsXG4gICAgMTogNCxcbiAgICAzOiA4LFxuICAgIDQ6IDE2LFxuICB9KVsoZXZlbnQgYXMgTW91c2VFdmVudCkuYnV0dG9uIGFzIDAgfCAxIHwgMyB8IDRdXG4gIGNvbnN0IGFyZyA9IHtcbiAgICBhY3Rpb246IG51bGwsXG4gICAgaW50ZXJhY3RhYmxlLFxuICAgIGludGVyYWN0aW9uLFxuICAgIGVsZW1lbnQsXG4gICAgcmVjdCxcbiAgICBidXR0b25zLFxuICB9XG5cbiAgc2NvcGUuZmlyZSgnYXV0by1zdGFydDpjaGVjaycsIGFyZylcblxuICByZXR1cm4gYXJnLmFjdGlvblxufVxuXG5mdW5jdGlvbiBzdHlsZUN1cnNvciAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKTogYm9vbGVhblxuZnVuY3Rpb24gc3R5bGVDdXJzb3IgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU6IGJvb2xlYW4pOiB0eXBlb2YgdGhpc1xuZnVuY3Rpb24gc3R5bGVDdXJzb3IgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU/OiBib29sZWFuKSB7XG4gIGlmIChpcy5ib29sKG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5zdHlsZUN1cnNvciA9IG5ld1ZhbHVlXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgaWYgKG5ld1ZhbHVlID09PSBudWxsKSB7XG4gICAgZGVsZXRlIHRoaXMub3B0aW9ucy5zdHlsZUN1cnNvclxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMuc3R5bGVDdXJzb3Jcbn1cblxuZnVuY3Rpb24gYWN0aW9uQ2hlY2tlciAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBjaGVja2VyOiBhbnkpIHtcbiAgaWYgKGlzLmZ1bmMoY2hlY2tlcikpIHtcbiAgICB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlciA9IGNoZWNrZXJcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoY2hlY2tlciA9PT0gbnVsbCkge1xuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlclxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlclxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnYXV0by1zdGFydC9pbnRlcmFjdGFibGVNZXRob2RzJyxcbiAgaW5zdGFsbCxcbn1cbiIsImltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0IEludGVyYWN0YWJsZU1ldGhvZHMgZnJvbSAnLi9JbnRlcmFjdGFibGVNZXRob2RzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvaW50ZXJhY3QvaW5kZXgnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0U3RhdGljIHtcbiAgICBtYXhJbnRlcmFjdGlvbnM6IChuZXdWYWx1ZTogYW55KSA9PiBhbnlcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2NvcGUge1xuICAgIGF1dG9TdGFydDogQXV0b1N0YXJ0XG4gICAgbWF4SW50ZXJhY3Rpb25zOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICB9XG5cbiAgaW50ZXJmYWNlIFNpZ25hbEFyZ3Mge1xuICAgICdhdXRvU3RhcnQ6YmVmb3JlLXN0YXJ0JzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXVxuICAgICdhdXRvU3RhcnQ6cHJlcGFyZWQnOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9XG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBDaGVja1NpZ25hbEFyZ1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBCYXNlRGVmYXVsdHMge1xuICAgIGFjdGlvbkNoZWNrZXI/OiBhbnlcbiAgICBjdXJzb3JDaGVja2VyPzogYW55XG4gICAgc3R5bGVDdXJzb3I/OiBhbnlcbiAgfVxuXG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgbWFudWFsU3RhcnQ/OiBib29sZWFuXG4gICAgbWF4PzogbnVtYmVyXG4gICAgbWF4UGVyRWxlbWVudD86IG51bWJlclxuICAgIGFsbG93RnJvbT86IHN0cmluZyB8IEludGVyYWN0LkVsZW1lbnRcbiAgICBpZ25vcmVGcm9tPzogc3RyaW5nIHwgSW50ZXJhY3QuRWxlbWVudFxuICAgIGN1cnNvckNoZWNrZXI/OiBJbnRlcmFjdC5DdXJzb3JDaGVja2VyXG5cbiAgICAvLyBvbmx5IGFsbG93IGxlZnQgYnV0dG9uIGJ5IGRlZmF1bHRcbiAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9ucyNSZXR1cm5fdmFsdWVcbiAgICBtb3VzZUJ1dHRvbnM/OiAwIHwgMSB8IDIgfCA0IHwgMTZcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2hlY2tTaWduYWxBcmcge1xuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZVxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudFxuICBhY3Rpb246IEludGVyYWN0LkFjdGlvblByb3BzXG4gIGJ1dHRvbnM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TdGFydCB7XG4gIC8vIEFsbG93IHRoaXMgbWFueSBpbnRlcmFjdGlvbnMgdG8gaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gIG1heEludGVyYWN0aW9uczogbnVtYmVyXG4gIHdpdGhpbkludGVyYWN0aW9uTGltaXQ6IHR5cGVvZiB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0XG4gIGN1cnNvckVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlcmFjdCxcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKEludGVyYWN0YWJsZU1ldGhvZHMpXG5cbiAgZGVmYXVsdHMuYmFzZS5hY3Rpb25DaGVja2VyID0gbnVsbFxuICBkZWZhdWx0cy5iYXNlLnN0eWxlQ3Vyc29yID0gdHJ1ZVxuXG4gIHV0aWxzLmV4dGVuZChkZWZhdWx0cy5wZXJBY3Rpb24sIHtcbiAgICBtYW51YWxTdGFydDogZmFsc2UsXG4gICAgbWF4OiBJbmZpbml0eSxcbiAgICBtYXhQZXJFbGVtZW50OiAxLFxuICAgIGFsbG93RnJvbTogIG51bGwsXG4gICAgaWdub3JlRnJvbTogbnVsbCxcblxuICAgIC8vIG9ubHkgYWxsb3cgbGVmdCBidXR0b24gYnkgZGVmYXVsdFxuICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTW91c2VFdmVudC9idXR0b25zI1JldHVybl92YWx1ZVxuICAgIG1vdXNlQnV0dG9uczogMSxcbiAgfSlcblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGludGVyYWN0aW9ucyBhbGxvd2VkLiAgQnlcbiAgICogZGVmYXVsdCBvbmx5IDEgaW50ZXJhY3Rpb24gaXMgYWxsb3dlZCBhdCBhIHRpbWUgKGZvciBiYWNrd2FyZHNcbiAgICogY29tcGF0aWJpbGl0eSkuIFRvIGFsbG93IG11bHRpcGxlIGludGVyYWN0aW9ucyBvbiB0aGUgc2FtZSBJbnRlcmFjdGFibGVzIGFuZFxuICAgKiBlbGVtZW50cywgeW91IG5lZWQgdG8gZW5hYmxlIGl0IGluIHRoZSBkcmFnZ2FibGUsIHJlc2l6YWJsZSBhbmQgZ2VzdHVyYWJsZVxuICAgKiBgJ21heCdgIGFuZCBgJ21heFBlckVsZW1lbnQnYCBvcHRpb25zLlxuICAgKlxuICAgKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0Lm1heEludGVyYWN0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW25ld1ZhbHVlXSBBbnkgbnVtYmVyLiBuZXdWYWx1ZSA8PSAwIG1lYW5zIG5vIGludGVyYWN0aW9ucy5cbiAgICovXG4gIGludGVyYWN0Lm1heEludGVyYWN0aW9ucyA9IG5ld1ZhbHVlID0+IG1heEludGVyYWN0aW9ucyhuZXdWYWx1ZSwgc2NvcGUpXG5cbiAgc2NvcGUuYXV0b1N0YXJ0ID0ge1xuICAgIC8vIEFsbG93IHRoaXMgbWFueSBpbnRlcmFjdGlvbnMgdG8gaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gICAgbWF4SW50ZXJhY3Rpb25zOiBJbmZpbml0eSxcbiAgICB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0LFxuICAgIGN1cnNvckVsZW1lbnQ6IG51bGwsXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZU9uRG93biAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IH06IEludGVyYWN0LlNpZ25hbEFyZ3NbJ2ludGVyYWN0aW9uczpkb3duJ10sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBpZiAoaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSkgeyByZXR1cm4gfVxuXG4gIGNvbnN0IGFjdGlvbkluZm8gPSBnZXRBY3Rpb25JbmZvKGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHNjb3BlKVxuICBwcmVwYXJlKGludGVyYWN0aW9uLCBhY3Rpb25JbmZvLCBzY29wZSlcbn1cblxuZnVuY3Rpb24gcHJlcGFyZU9uTW92ZSAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IH06IEludGVyYWN0LlNpZ25hbEFyZ3NbJ2ludGVyYWN0aW9uczptb3ZlJ10sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBpZiAoaW50ZXJhY3Rpb24ucG9pbnRlclR5cGUgIT09ICdtb3VzZScgfHxcbiAgICAgIGludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24gfHxcbiAgICAgIGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHsgcmV0dXJuIH1cblxuICBjb25zdCBhY3Rpb25JbmZvID0gZ2V0QWN0aW9uSW5mbyhpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnQsIHNjb3BlKVxuICBwcmVwYXJlKGludGVyYWN0aW9uLCBhY3Rpb25JbmZvLCBzY29wZSlcbn1cblxuZnVuY3Rpb24gc3RhcnRPbk1vdmUgKGFyZzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGFyZ1xuXG4gIGlmICghaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93biB8fFxuICAgICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSB8fFxuICAgICAgIWludGVyYWN0aW9uLnBvaW50ZXJXYXNNb3ZlZCB8fFxuICAgICAgIWludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNjb3BlLmZpcmUoJ2F1dG9TdGFydDpiZWZvcmUtc3RhcnQnLCBhcmcpXG5cbiAgY29uc3QgeyBpbnRlcmFjdGFibGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lXG5cbiAgaWYgKGFjdGlvbk5hbWUgJiYgaW50ZXJhY3RhYmxlKSB7XG4gICAgLy8gY2hlY2sgbWFudWFsU3RhcnQgYW5kIGludGVyYWN0aW9uIGxpbWl0XG4gICAgaWYgKGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbk5hbWVdLm1hbnVhbFN0YXJ0IHx8XG4gICAgICAgICF3aXRoaW5JbnRlcmFjdGlvbkxpbWl0KGludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudCwgaW50ZXJhY3Rpb24ucHJlcGFyZWQsIHNjb3BlKSkge1xuICAgICAgaW50ZXJhY3Rpb24uc3RvcCgpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaW50ZXJhY3Rpb24uc3RhcnQoaW50ZXJhY3Rpb24ucHJlcGFyZWQsIGludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudClcbiAgICAgIHNldEludGVyYWN0aW9uQ3Vyc29yKGludGVyYWN0aW9uLCBzY29wZSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJDdXJzb3JPblN0b3AgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3RhYmxlIH0gPSBpbnRlcmFjdGlvblxuXG4gIGlmIChpbnRlcmFjdGFibGUgJiYgaW50ZXJhY3RhYmxlLm9wdGlvbnMuc3R5bGVDdXJzb3IpIHtcbiAgICBzZXRDdXJzb3IoaW50ZXJhY3Rpb24uZWxlbWVudCwgJycsIHNjb3BlKVxuICB9XG59XG5cbi8vIENoZWNrIGlmIHRoZSBjdXJyZW50IGludGVyYWN0YWJsZSBzdXBwb3J0cyB0aGUgYWN0aW9uLlxuLy8gSWYgc28sIHJldHVybiB0aGUgdmFsaWRhdGVkIGFjdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbFxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpb248VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+IChcbiAgYWN0aW9uOiBJbnRlcmFjdC5BY3Rpb25Qcm9wczxUPixcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsXG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGlmIChpbnRlcmFjdGFibGUudGVzdElnbm9yZUFsbG93KGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbi5uYW1lXSwgZWxlbWVudCwgZXZlbnRUYXJnZXQpICYmXG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb24ubmFtZV0uZW5hYmxlZCAmJlxuICAgICAgd2l0aGluSW50ZXJhY3Rpb25MaW1pdChpbnRlcmFjdGFibGUsIGVsZW1lbnQsIGFjdGlvbiwgc2NvcGUpKSB7XG4gICAgcmV0dXJuIGFjdGlvblxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNYXRjaGVzIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gIG1hdGNoZXM6IEludGVyYWN0LkludGVyYWN0YWJsZVtdLFxuICBtYXRjaEVsZW1lbnRzOiBJbnRlcmFjdC5FbGVtZW50W10sXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtYXRjaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2ldXG4gICAgY29uc3QgbWF0Y2hFbGVtZW50ID0gbWF0Y2hFbGVtZW50c1tpXVxuICAgIGNvbnN0IG1hdGNoQWN0aW9uID0gbWF0Y2guZ2V0QWN0aW9uKHBvaW50ZXIsIGV2ZW50LCBpbnRlcmFjdGlvbiwgbWF0Y2hFbGVtZW50KVxuXG4gICAgaWYgKCFtYXRjaEFjdGlvbikgeyBjb250aW51ZSB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSB2YWxpZGF0ZUFjdGlvbihcbiAgICAgIG1hdGNoQWN0aW9uLFxuICAgICAgbWF0Y2gsXG4gICAgICBtYXRjaEVsZW1lbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHNjb3BlKVxuXG4gICAgaWYgKGFjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBpbnRlcmFjdGFibGU6IG1hdGNoLFxuICAgICAgICBlbGVtZW50OiBtYXRjaEVsZW1lbnQsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBudWxsLCBpbnRlcmFjdGFibGU6IG51bGwsIGVsZW1lbnQ6IG51bGwgfVxufVxuXG5mdW5jdGlvbiBnZXRBY3Rpb25JbmZvIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGxldCBtYXRjaGVzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVbXSA9IFtdXG4gIGxldCBtYXRjaEVsZW1lbnRzOiBJbnRlcmFjdC5FbGVtZW50W10gPSBbXVxuXG4gIGxldCBlbGVtZW50ID0gZXZlbnRUYXJnZXQgYXMgSW50ZXJhY3QuRWxlbWVudFxuXG4gIGZ1bmN0aW9uIHB1c2hNYXRjaGVzIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSkge1xuICAgIG1hdGNoZXMucHVzaChpbnRlcmFjdGFibGUpXG4gICAgbWF0Y2hFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gIH1cblxuICB3aGlsZSAodXRpbHMuaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIG1hdGNoZXMgPSBbXVxuICAgIG1hdGNoRWxlbWVudHMgPSBbXVxuXG4gICAgc2NvcGUuaW50ZXJhY3RhYmxlcy5mb3JFYWNoTWF0Y2goZWxlbWVudCwgcHVzaE1hdGNoZXMpXG5cbiAgICBjb25zdCBhY3Rpb25JbmZvID0gdmFsaWRhdGVNYXRjaGVzKGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgbWF0Y2hlcywgbWF0Y2hFbGVtZW50cywgZXZlbnRUYXJnZXQsIHNjb3BlKVxuXG4gICAgaWYgKGFjdGlvbkluZm8uYWN0aW9uICYmXG4gICAgICAhYWN0aW9uSW5mby5pbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb25JbmZvLmFjdGlvbi5uYW1lXS5tYW51YWxTdGFydCkge1xuICAgICAgcmV0dXJuIGFjdGlvbkluZm9cbiAgICB9XG5cbiAgICBlbGVtZW50ID0gdXRpbHMuZG9tLnBhcmVudE5vZGUoZWxlbWVudCkgYXMgSW50ZXJhY3QuRWxlbWVudFxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBudWxsLCBpbnRlcmFjdGFibGU6IG51bGwsIGVsZW1lbnQ6IG51bGwgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICB7IGFjdGlvbiwgaW50ZXJhY3RhYmxlLCBlbGVtZW50IH06IHtcbiAgICBhY3Rpb246IEludGVyYWN0LkFjdGlvblByb3BzXG4gICAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50XG4gIH0sXG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZSxcbikge1xuICBhY3Rpb24gPSBhY3Rpb24gfHwgeyBuYW1lOiBudWxsIH1cblxuICBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUgPSBpbnRlcmFjdGFibGVcbiAgaW50ZXJhY3Rpb24uZWxlbWVudCA9IGVsZW1lbnRcbiAgdXRpbHMuY29weUFjdGlvbihpbnRlcmFjdGlvbi5wcmVwYXJlZCwgYWN0aW9uKVxuXG4gIGludGVyYWN0aW9uLnJlY3QgPSBpbnRlcmFjdGFibGUgJiYgYWN0aW9uLm5hbWVcbiAgICA/IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQpXG4gICAgOiBudWxsXG5cbiAgc2V0SW50ZXJhY3Rpb25DdXJzb3IoaW50ZXJhY3Rpb24sIHNjb3BlKVxuXG4gIHNjb3BlLmZpcmUoJ2F1dG9TdGFydDpwcmVwYXJlZCcsIHsgaW50ZXJhY3Rpb24gfSlcbn1cblxuZnVuY3Rpb24gd2l0aGluSW50ZXJhY3Rpb25MaW1pdDxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKFxuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCxcbiAgYWN0aW9uOiBJbnRlcmFjdC5BY3Rpb25Qcm9wczxUPixcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1xuICBjb25zdCBtYXhBY3Rpb25zID0gb3B0aW9uc1thY3Rpb24ubmFtZV0ubWF4XG4gIGNvbnN0IG1heFBlckVsZW1lbnQgPSBvcHRpb25zW2FjdGlvbi5uYW1lXS5tYXhQZXJFbGVtZW50XG4gIGNvbnN0IGF1dG9TdGFydE1heCA9IHNjb3BlLmF1dG9TdGFydC5tYXhJbnRlcmFjdGlvbnNcbiAgbGV0IGFjdGl2ZUludGVyYWN0aW9ucyA9IDBcbiAgbGV0IGludGVyYWN0YWJsZUNvdW50ID0gMFxuICBsZXQgZWxlbWVudENvdW50ID0gMFxuXG4gIC8vIG5vIGFjdGlvbnMgaWYgYW55IG9mIHRoZXNlIHZhbHVlcyA9PSAwXG4gIGlmICghKG1heEFjdGlvbnMgJiYgbWF4UGVyRWxlbWVudCAmJiBhdXRvU3RhcnRNYXgpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgIGNvbnN0IG90aGVyQWN0aW9uID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuXG4gICAgaWYgKCFpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpKSB7IGNvbnRpbnVlIH1cblxuICAgIGFjdGl2ZUludGVyYWN0aW9ucysrXG5cbiAgICBpZiAoYWN0aXZlSW50ZXJhY3Rpb25zID49IGF1dG9TdGFydE1heCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSAhPT0gaW50ZXJhY3RhYmxlKSB7IGNvbnRpbnVlIH1cblxuICAgIGludGVyYWN0YWJsZUNvdW50ICs9IG90aGVyQWN0aW9uID09PSBhY3Rpb24ubmFtZSA/IDEgOiAwXG5cbiAgICBpZiAoaW50ZXJhY3RhYmxlQ291bnQgPj0gbWF4QWN0aW9ucykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLmVsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnRDb3VudCsrXG5cbiAgICAgIGlmIChvdGhlckFjdGlvbiA9PT0gYWN0aW9uLm5hbWUgJiYgZWxlbWVudENvdW50ID49IG1heFBlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF1dG9TdGFydE1heCA+IDBcbn1cblxuZnVuY3Rpb24gbWF4SW50ZXJhY3Rpb25zIChuZXdWYWx1ZTogYW55LCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgaWYgKHV0aWxzLmlzLm51bWJlcihuZXdWYWx1ZSkpIHtcbiAgICBzY29wZS5hdXRvU3RhcnQubWF4SW50ZXJhY3Rpb25zID0gbmV3VmFsdWVcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICByZXR1cm4gc2NvcGUuYXV0b1N0YXJ0Lm1heEludGVyYWN0aW9uc1xufVxuXG5mdW5jdGlvbiBzZXRDdXJzb3IgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIGN1cnNvcjogc3RyaW5nLCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgY29uc3QgeyBjdXJzb3JFbGVtZW50OiBwcmV2Q3Vyc29yRWxlbWVudCB9ID0gc2NvcGUuYXV0b1N0YXJ0XG5cbiAgaWYgKHByZXZDdXJzb3JFbGVtZW50ICYmIHByZXZDdXJzb3JFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgcHJldkN1cnNvckVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJydcbiAgfVxuXG4gIGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3Vyc29yID0gY3Vyc29yXG4gIGVsZW1lbnQuc3R5bGUuY3Vyc29yID0gY3Vyc29yXG4gIHNjb3BlLmF1dG9TdGFydC5jdXJzb3JFbGVtZW50ID0gY3Vyc29yID8gZWxlbWVudCA6IG51bGxcbn1cblxuZnVuY3Rpb24gc2V0SW50ZXJhY3Rpb25DdXJzb3I8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+IChpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb248VD4sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBjb25zdCB7IGludGVyYWN0YWJsZSwgZWxlbWVudCwgcHJlcGFyZWQgfSA9IGludGVyYWN0aW9uXG5cbiAgaWYgKCEoaW50ZXJhY3Rpb24ucG9pbnRlclR5cGUgPT09ICdtb3VzZScgJiYgaW50ZXJhY3RhYmxlICYmIGludGVyYWN0YWJsZS5vcHRpb25zLnN0eWxlQ3Vyc29yKSkge1xuICAgIC8vIGNsZWFyIHByZXZpb3VzIHRhcmdldCBlbGVtZW50IGN1cnNvclxuICAgIGlmIChzY29wZS5hdXRvU3RhcnQuY3Vyc29yRWxlbWVudCkge1xuICAgICAgc2V0Q3Vyc29yKHNjb3BlLmF1dG9TdGFydC5jdXJzb3JFbGVtZW50LCAnJywgc2NvcGUpXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgY3Vyc29yID0gJydcblxuICBpZiAocHJlcGFyZWQubmFtZSkge1xuICAgIGNvbnN0IGN1cnNvckNoZWNrZXI6IEludGVyYWN0LkN1cnNvckNoZWNrZXIgPSBpbnRlcmFjdGFibGUub3B0aW9uc1twcmVwYXJlZC5uYW1lXS5jdXJzb3JDaGVja2VyXG5cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhjdXJzb3JDaGVja2VyKSkge1xuICAgICAgY3Vyc29yID0gY3Vyc29yQ2hlY2tlcihwcmVwYXJlZCwgaW50ZXJhY3RhYmxlLCBlbGVtZW50LCBpbnRlcmFjdGlvbi5faW50ZXJhY3RpbmcpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY3Vyc29yID0gc2NvcGUuYWN0aW9ucy5tYXBbcHJlcGFyZWQubmFtZV0uZ2V0Q3Vyc29yKHByZXBhcmVkKVxuICAgIH1cbiAgfVxuXG4gIHNldEN1cnNvcihpbnRlcmFjdGlvbi5lbGVtZW50LCBjdXJzb3IgfHwgJycsIHNjb3BlKVxufVxuXG5jb25zdCBhdXRvU3RhcnQ6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0L2Jhc2UnLFxuICBiZWZvcmU6IFsnYWN0aW9ucycsICdhY3Rpb25zL2RyYWcnLCAnYWN0aW9ucy9yZXNpemUnLCAnYWN0aW9ucy9nZXN0dXJlJ10sXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6ZG93bic6IHByZXBhcmVPbkRvd24sXG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogKGFyZywgc2NvcGUpID0+IHtcbiAgICAgIHByZXBhcmVPbk1vdmUoYXJnLCBzY29wZSlcbiAgICAgIHN0YXJ0T25Nb3ZlKGFyZywgc2NvcGUpXG4gICAgfSxcbiAgICAnaW50ZXJhY3Rpb25zOnN0b3AnOiBjbGVhckN1cnNvck9uU3RvcCxcbiAgfSxcbiAgbWF4SW50ZXJhY3Rpb25zLFxuICB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0LFxuICB2YWxpZGF0ZUFjdGlvbixcbn0gYXMgSW50ZXJhY3QuUGx1Z2luXG5cbmV4cG9ydCBkZWZhdWx0IGF1dG9TdGFydFxuIiwiaW1wb3J0IHsgcGFyZW50Tm9kZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5pbXBvcnQgYXV0b1N0YXJ0IGZyb20gJy4vYmFzZSdcblxuZnVuY3Rpb24gYmVmb3JlU3RhcnQgKHsgaW50ZXJhY3Rpb24sIGV2ZW50VGFyZ2V0LCBkeCwgZHkgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICAvLyBjaGVjayBpZiBhIGRyYWcgaXMgaW4gdGhlIGNvcnJlY3QgYXhpc1xuICBjb25zdCBhYnNYID0gTWF0aC5hYnMoZHgpXG4gIGNvbnN0IGFic1kgPSBNYXRoLmFicyhkeSlcbiAgY29uc3QgdGFyZ2V0T3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zLmRyYWdcbiAgY29uc3Qgc3RhcnRBeGlzID0gdGFyZ2V0T3B0aW9ucy5zdGFydEF4aXNcbiAgY29uc3QgY3VycmVudEF4aXMgPSAoYWJzWCA+IGFic1kgPyAneCcgOiBhYnNYIDwgYWJzWSA/ICd5JyA6ICd4eScpXG5cbiAgaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpcyA9IHRhcmdldE9wdGlvbnMubG9ja0F4aXMgPT09ICdzdGFydCdcbiAgICA/IGN1cnJlbnRBeGlzWzBdICBhcyAneCcgfCAneScgLy8gYWx3YXlzIGxvY2sgdG8gb25lIGF4aXMgZXZlbiBpZiBjdXJyZW50QXhpcyA9PT0gJ3h5J1xuICAgIDogdGFyZ2V0T3B0aW9ucy5sb2NrQXhpc1xuXG4gIC8vIGlmIHRoZSBtb3ZlbWVudCBpc24ndCBpbiB0aGUgc3RhcnRBeGlzIG9mIHRoZSBpbnRlcmFjdGFibGVcbiAgaWYgKGN1cnJlbnRBeGlzICE9PSAneHknICYmIHN0YXJ0QXhpcyAhPT0gJ3h5JyAmJiBzdGFydEF4aXMgIT09IGN1cnJlbnRBeGlzKSB7XG4gICAgLy8gY2FuY2VsIHRoZSBwcmVwYXJlZCBhY3Rpb25cbiAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gbnVsbFxuXG4gICAgLy8gdGhlbiB0cnkgdG8gZ2V0IGEgZHJhZyBmcm9tIGFub3RoZXIgaW5lcmFjdGFibGVcbiAgICBsZXQgZWxlbWVudCA9IGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnRcblxuICAgIGNvbnN0IGdldERyYWdnYWJsZSA9IGZ1bmN0aW9uIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSk6IEludGVyYWN0LkludGVyYWN0YWJsZSB8IHZvaWQge1xuICAgICAgaWYgKGludGVyYWN0YWJsZSA9PT0gaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlKSB7IHJldHVybiB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5kcmFnXG5cbiAgICAgIGlmICghb3B0aW9ucy5tYW51YWxTdGFydCAmJlxuICAgICAgICAgIGludGVyYWN0YWJsZS50ZXN0SWdub3JlQWxsb3cob3B0aW9ucywgZWxlbWVudCwgZXZlbnRUYXJnZXQpKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGludGVyYWN0YWJsZS5nZXRBY3Rpb24oXG4gICAgICAgICAgaW50ZXJhY3Rpb24uZG93blBvaW50ZXIsIGludGVyYWN0aW9uLmRvd25FdmVudCwgaW50ZXJhY3Rpb24sIGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKGFjdGlvbiAmJlxuICAgICAgICAgICAgYWN0aW9uLm5hbWUgPT09ICdkcmFnJyAmJlxuICAgICAgICAgICAgY2hlY2tTdGFydEF4aXMoY3VycmVudEF4aXMsIGludGVyYWN0YWJsZSkgJiZcbiAgICAgICAgICAgIGF1dG9TdGFydC52YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgZXZlbnRUYXJnZXQsIHNjb3BlKSkge1xuICAgICAgICAgIHJldHVybiBpbnRlcmFjdGFibGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoZWNrIGFsbCBpbnRlcmFjdGFibGVzXG4gICAgd2hpbGUgKGlzLmVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMuZm9yRWFjaE1hdGNoKGVsZW1lbnQsIGdldERyYWdnYWJsZSlcblxuICAgICAgaWYgKGludGVyYWN0YWJsZSkge1xuICAgICAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gJ2RyYWcnXG4gICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICAgICAgICBpbnRlcmFjdGlvbi5lbGVtZW50ID0gZWxlbWVudFxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50ID0gcGFyZW50Tm9kZShlbGVtZW50KSBhcyBJbnRlcmFjdC5FbGVtZW50XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrU3RhcnRBeGlzIChzdGFydEF4aXM6IHN0cmluZywgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUpIHtcbiAgaWYgKCFpbnRlcmFjdGFibGUpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCB0aGlzQXhpcyA9IGludGVyYWN0YWJsZS5vcHRpb25zLmRyYWcuc3RhcnRBeGlzXG5cbiAgcmV0dXJuIChzdGFydEF4aXMgPT09ICd4eScgfHwgdGhpc0F4aXMgPT09ICd4eScgfHwgdGhpc0F4aXMgPT09IHN0YXJ0QXhpcylcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2F1dG8tc3RhcnQvZHJhZ0F4aXMnLFxuICBsaXN0ZW5lcnM6IHsgJ2F1dG9TdGFydDpiZWZvcmUtc3RhcnQnOiBiZWZvcmVTdGFydCB9LFxufVxuIiwiaW1wb3J0IGJhc2VQbHVnaW4gZnJvbSAnLi9iYXNlJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgUGVyQWN0aW9uRGVmYXVsdHMge1xuICAgIGhvbGQ/OiBudW1iZXJcbiAgICBkZWxheT86IG51bWJlclxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgYXV0b1N0YXJ0SG9sZFRpbWVyPzogYW55XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKGJhc2VQbHVnaW4pXG5cbiAgZGVmYXVsdHMucGVyQWN0aW9uLmhvbGQgPSAwXG4gIGRlZmF1bHRzLnBlckFjdGlvbi5kZWxheSA9IDBcbn1cblxuZnVuY3Rpb24gZ2V0SG9sZER1cmF0aW9uIChpbnRlcmFjdGlvbikge1xuICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQgJiYgaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuXG4gIGlmICghYWN0aW9uTmFtZSkgeyByZXR1cm4gbnVsbCB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zXG5cbiAgcmV0dXJuIG9wdGlvbnNbYWN0aW9uTmFtZV0uaG9sZCB8fCBvcHRpb25zW2FjdGlvbk5hbWVdLmRlbGF5XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0L2hvbGQnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TdGFydEhvbGRUaW1lciA9IG51bGxcbiAgICB9LFxuXG4gICAgJ2F1dG9TdGFydDpwcmVwYXJlZCc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGhvbGQgPSBnZXRIb2xkRHVyYXRpb24oaW50ZXJhY3Rpb24pXG5cbiAgICAgIGlmIChob2xkID4gMCkge1xuICAgICAgICBpbnRlcmFjdGlvbi5hdXRvU3RhcnRIb2xkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5zdGFydChpbnRlcmFjdGlvbi5wcmVwYXJlZCwgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLCBpbnRlcmFjdGlvbi5lbGVtZW50KVxuICAgICAgICB9LCBob2xkKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOm1vdmUnOiAoeyBpbnRlcmFjdGlvbiwgZHVwbGljYXRlIH0pID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyV2FzTW92ZWQgJiYgIWR1cGxpY2F0ZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaW50ZXJhY3Rpb24uYXV0b1N0YXJ0SG9sZFRpbWVyKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBwcmV2ZW50IHJlZ3VsYXIgZG93bi0+bW92ZSBhdXRvU3RhcnRcbiAgICAnYXV0b1N0YXJ0OmJlZm9yZS1zdGFydCc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGhvbGQgPSBnZXRIb2xkRHVyYXRpb24oaW50ZXJhY3Rpb24pXG5cbiAgICAgIGlmIChob2xkID4gMCkge1xuICAgICAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gbnVsbFxuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGdldEhvbGREdXJhdGlvbixcbn1cbiIsImltcG9ydCBhdXRvU3RhcnQgZnJvbSAnLi9iYXNlJ1xuaW1wb3J0IGRyYWdBeGlzIGZyb20gJy4vZHJhZ0F4aXMnXG5pbXBvcnQgaG9sZCBmcm9tICcuL2hvbGQnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0JyxcbiAgaW5zdGFsbCAoc2NvcGUpIHtcbiAgICBzY29wZS51c2VQbHVnaW4oYXV0b1N0YXJ0KVxuICAgIHNjb3BlLnVzZVBsdWdpbihob2xkKVxuICAgIHNjb3BlLnVzZVBsdWdpbihkcmFnQXhpcylcbiAgfSxcbn1cblxuZXhwb3J0IHtcbiAgYXV0b1N0YXJ0LFxuICBob2xkLFxuICBkcmFnQXhpcyxcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbi8qIGdsb2JhbCBwcm9jZXNzICovXG5pbXBvcnQgZG9tT2JqZWN0cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21PYmplY3RzJ1xuaW1wb3J0IHsgcGFyZW50Tm9kZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcbmltcG9ydCB3aW4gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvd2luZG93J1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2NvcGUge1xuICAgIGxvZ2dlcjogTG9nZ2VyXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEJhc2VEZWZhdWx0cyB7XG4gICAgZGV2VG9vbHM/OiBEZXZUb29sc09wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0YWJsZSB7XG4gICAgZGV2VG9vbHM/OiBJbnRlcmFjdC5PcHRpb25NZXRob2Q8RGV2VG9vbHNPcHRpb25zPlxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2VG9vbHNPcHRpb25zIHtcbiAgaWdub3JlOiB7IFtQIGluIGtleW9mIHR5cGVvZiBDaGVja05hbWVdPzogYm9vbGVhbiB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgd2FybjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG4gIGVycm9yOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbiAgbG9nOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGVjayB7XG4gIG5hbWU6IENoZWNrTmFtZVxuICB0ZXh0OiBzdHJpbmdcbiAgcGVyZm9ybTogKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikgPT4gYm9vbGVhblxuICBnZXRJbmZvOiAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uKSA9PiBhbnlbXVxufVxuXG5lbnVtIENoZWNrTmFtZSB7XG4gIHRvdWNoQWN0aW9uID0gJ3RvdWNoQWN0aW9uJyxcbiAgYm94U2l6aW5nID0gJ2JveFNpemluZycsXG4gIG5vTGlzdGVuZXJzID0gJ25vTGlzdGVuZXJzJyxcbn1cblxuY29uc3QgcHJlZml4ICA9ICdbaW50ZXJhY3QuanNdICdcbmNvbnN0IGxpbmtzID0ge1xuICB0b3VjaEFjdGlvbjogJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy90b3VjaC1hY3Rpb24nLFxuICBib3hTaXppbmc6ICdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYm94LXNpemluZycsXG59XG5cbmNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbidcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5mdW5jdGlvbiBpbnN0YWxsIChzY29wZTogSW50ZXJhY3QuU2NvcGUsIHsgbG9nZ2VyIH06IHsgbG9nZ2VyPzogTG9nZ2VyIH0gPSB7fSkge1xuICBjb25zdCB7XG4gICAgSW50ZXJhY3RhYmxlLFxuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS5sb2dnZXIgPSBsb2dnZXIgfHwgY29uc29sZVxuXG4gIGRlZmF1bHRzLmJhc2UuZGV2VG9vbHMgPSB7XG4gICAgaWdub3JlOiB7fSxcbiAgfVxuXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuZGV2VG9vbHMgPSBmdW5jdGlvbiAob3B0aW9ucz86IG9iamVjdCkge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBleHRlbmQodGhpcy5vcHRpb25zLmRldlRvb2xzLCBvcHRpb25zKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRldlRvb2xzXG4gIH1cbn1cblxuY29uc3QgY2hlY2tzOiBDaGVja1tdID0gW1xuICB7XG4gICAgbmFtZTogQ2hlY2tOYW1lLnRvdWNoQWN0aW9uLFxuICAgIHBlcmZvcm0gKHsgZWxlbWVudCB9KSB7XG4gICAgICByZXR1cm4gIXBhcmVudEhhc1N0eWxlKGVsZW1lbnQsICd0b3VjaEFjdGlvbicsIC9wYW4tfHBpbmNofG5vbmUvKVxuICAgIH0sXG4gICAgZ2V0SW5mbyAoeyBlbGVtZW50IH0pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGxpbmtzLnRvdWNoQWN0aW9uLFxuICAgICAgXVxuICAgIH0sXG4gICAgdGV4dDogJ0NvbnNpZGVyIGFkZGluZyBDU1MgXCJ0b3VjaC1hY3Rpb246IG5vbmVcIiB0byB0aGlzIGVsZW1lbnRcXG4nLFxuICB9LFxuXG4gIHtcbiAgICBuYW1lOiBDaGVja05hbWUuYm94U2l6aW5nLFxuICAgIHBlcmZvcm0gKGludGVyYWN0aW9uKSB7XG4gICAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGludGVyYWN0aW9uXG5cbiAgICAgIHJldHVybiBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID09PSAncmVzaXplJyAmJlxuICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAmJlxuICAgICAgICAhaGFzU3R5bGUoZWxlbWVudCwgJ2JveFNpemluZycsIC9ib3JkZXItYm94LylcbiAgICB9LFxuICAgIHRleHQ6ICdDb25zaWRlciBhZGRpbmcgQ1NTIFwiYm94LXNpemluZzogYm9yZGVyLWJveFwiIHRvIHRoaXMgcmVzaXphYmxlIGVsZW1lbnQnLFxuICAgIGdldEluZm8gKHsgZWxlbWVudCB9KSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBlbGVtZW50LFxuICAgICAgICBsaW5rcy5ib3hTaXppbmcsXG4gICAgICBdXG4gICAgfSxcbiAgfSxcblxuICB7XG4gICAgbmFtZTogQ2hlY2tOYW1lLm5vTGlzdGVuZXJzLFxuICAgIHBlcmZvcm0gKGludGVyYWN0aW9uKSB7XG4gICAgICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuICAgICAgY29uc3QgbW92ZUxpc3RlbmVycyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5ldmVudHMudHlwZXNbYCR7YWN0aW9uTmFtZX1tb3ZlYF0gfHwgW11cblxuICAgICAgcmV0dXJuICFtb3ZlTGlzdGVuZXJzLmxlbmd0aFxuICAgIH0sXG4gICAgZ2V0SW5mbyAoaW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUsXG4gICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSxcbiAgICAgIF1cbiAgICB9LFxuICAgIHRleHQ6ICdUaGVyZSBhcmUgbm8gbGlzdGVuZXJzIHNldCBmb3IgdGhpcyBhY3Rpb24nLFxuICB9LFxuXVxuXG5mdW5jdGlvbiBoYXNTdHlsZSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIHByb3A6IGtleW9mIENTU1N0eWxlRGVjbGFyYXRpb24sIHN0eWxlUmU6IFJlZ0V4cCkge1xuICByZXR1cm4gc3R5bGVSZS50ZXN0KGVsZW1lbnQuc3R5bGVbcHJvcF0gfHwgd2luLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW3Byb3BdKVxufVxuXG5mdW5jdGlvbiBwYXJlbnRIYXNTdHlsZSAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCwgcHJvcDoga2V5b2YgQ1NTU3R5bGVEZWNsYXJhdGlvbiwgc3R5bGVSZTogUmVnRXhwKSB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50IGFzIEhUTUxFbGVtZW50XG5cbiAgd2hpbGUgKGlzLmVsZW1lbnQocGFyZW50KSkge1xuICAgIGlmIChoYXNTdHlsZShwYXJlbnQsIHByb3AsIHN0eWxlUmUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudE5vZGUocGFyZW50KSBhcyBIVE1MRWxlbWVudFxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IGlkID0gJ2Rldi10b29scydcbmNvbnN0IGRlZmF1bHRFeHBvcnQ6IEludGVyYWN0LlBsdWdpbiA9IGlzUHJvZHVjdGlvblxuICA/IHsgaWQsIGluc3RhbGw6ICgpID0+IHt9IH1cbiAgOiB7XG4gICAgaWQsXG4gICAgaW5zdGFsbCxcbiAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLXN0YXJ0JzogKHsgaW50ZXJhY3Rpb24gfSwgc2NvcGUpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiBjaGVja3MpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlICYmIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zXG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKG9wdGlvbnMgJiYgb3B0aW9ucy5kZXZUb29scyAmJiBvcHRpb25zLmRldlRvb2xzLmlnbm9yZVtjaGVjay5uYW1lXSkgJiZcbiAgICAgICAgICAgIGNoZWNrLnBlcmZvcm0oaW50ZXJhY3Rpb24pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzY29wZS5sb2dnZXIud2FybihwcmVmaXggKyBjaGVjay50ZXh0LCAuLi5jaGVjay5nZXRJbmZvKGludGVyYWN0aW9uKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBjaGVja3MsXG4gICAgQ2hlY2tOYW1lLFxuICAgIGxpbmtzLFxuICAgIHByZWZpeCxcbiAgfVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0XG4iLCJpbXBvcnQgY2xvbmUgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvY2xvbmUnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXIsIE1vZGlmaWVyQXJnLCBNb2RpZmllclN0YXRlIH0gZnJvbSAnLi9iYXNlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWNhdGlvblJlc3VsdCB7XG4gIGRlbHRhOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0RGVsdGE6IEludGVyYWN0LlJlY3RcbiAgY29vcmRzOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICBldmVudFByb3BzOiBhbnlbXVxuICBjaGFuZ2VkOiBib29sZWFuXG59XG5cbmludGVyZmFjZSBNZXRob2RBcmcge1xuICBwaGFzZTogSW50ZXJhY3QuRXZlbnRQaGFzZVxuICBwYWdlQ29vcmRzPzogSW50ZXJhY3QuUG9pbnRcbiAgcmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHByZUVuZD86IGJvb2xlYW5cbiAgc2tpcE1vZGlmaWVycz86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2RpZmljYXRpb24ge1xuICBzdGF0ZXM6IE1vZGlmaWVyU3RhdGVbXSA9IFtdXG4gIHN0YXJ0T2Zmc2V0OiBJbnRlcmFjdC5SZWN0ID0geyBsZWZ0OiAwLCByaWdodDogMCwgdG9wOiAwLCBib3R0b206IDAgfVxuICBzdGFydERlbHRhOiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgcmVzdWx0PzogTW9kaWZpY2F0aW9uUmVzdWx0ID0gbnVsbFxuICBlbmRSZXN1bHQ/OiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgZWRnZXM6IEludGVyYWN0LkVkZ2VPcHRpb25zXG5cbiAgY29uc3RydWN0b3IgKHJlYWRvbmx5IGludGVyYWN0aW9uOiBSZWFkb25seTxJbnRlcmFjdC5JbnRlcmFjdGlvbj4pIHtcbiAgICB0aGlzLnJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpXG4gIH1cblxuICBzdGFydCAoXG4gICAgeyBwaGFzZSB9OiBNZXRob2RBcmcsXG4gICAgcGFnZUNvb3JkczogSW50ZXJhY3QuUG9pbnQsXG4gICkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCBtb2RpZmllckxpc3QgPSBnZXRNb2RpZmllckxpc3QoaW50ZXJhY3Rpb24pXG4gICAgdGhpcy5wcmVwYXJlU3RhdGVzKG1vZGlmaWVyTGlzdClcblxuICAgIHRoaXMuZWRnZXMgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLmVkZ2VzKVxuICAgIHRoaXMuc3RhcnRPZmZzZXQgPSBnZXRSZWN0T2Zmc2V0KGludGVyYWN0aW9uLnJlY3QsIHBhZ2VDb29yZHMpXG4gICAgdGhpcy5zdGFydERlbHRhID0geyB4OiAwLCB5OiAwIH1cblxuICAgIGNvbnN0IGFyZzogTWV0aG9kQXJnID0ge1xuICAgICAgcGhhc2UsXG4gICAgICBwYWdlQ29vcmRzLFxuICAgICAgcHJlRW5kOiBmYWxzZSxcbiAgICB9XG5cbiAgICB0aGlzLnJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpXG4gICAgdGhpcy5zdGFydEFsbChhcmcpXG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdCA9IHRoaXMuc2V0QWxsKGFyZylcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZpbGxBcmcgKGFyZzogUGFydGlhbDxNb2RpZmllckFyZz4pIHtcbiAgICBjb25zdCB7IGludGVyYWN0aW9uIH0gPSB0aGlzXG5cbiAgICBhcmcuaW50ZXJhY3Rpb24gPSBpbnRlcmFjdGlvblxuICAgIGFyZy5pbnRlcmFjdGFibGUgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGVcbiAgICBhcmcuZWxlbWVudCA9IGludGVyYWN0aW9uLmVsZW1lbnRcbiAgICBhcmcucmVjdCA9IGFyZy5yZWN0IHx8IGludGVyYWN0aW9uLnJlY3RcbiAgICBhcmcuZWRnZXMgPSB0aGlzLmVkZ2VzXG4gICAgYXJnLnN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldFxuICB9XG5cbiAgc3RhcnRBbGwgKGFyZzogTWV0aG9kQXJnICYgUGFydGlhbDxNb2RpZmllckFyZz4pIHtcbiAgICB0aGlzLmZpbGxBcmcoYXJnKVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgaWYgKHN0YXRlLm1ldGhvZHMuc3RhcnQpIHtcbiAgICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgICAgc3RhdGUubWV0aG9kcy5zdGFydChhcmcgYXMgTW9kaWZpZXJBcmcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QWxsIChhcmc6IE1ldGhvZEFyZyAmIFBhcnRpYWw8TW9kaWZpZXJBcmc+KTogTW9kaWZpY2F0aW9uUmVzdWx0IHtcbiAgICB0aGlzLmZpbGxBcmcoYXJnKVxuXG4gICAgY29uc3Qge1xuICAgICAgcGhhc2UsXG4gICAgICBwcmVFbmQsXG4gICAgICBza2lwTW9kaWZpZXJzLFxuICAgICAgcmVjdDogdW5tb2RpZmllZFJlY3QsXG4gICAgfSA9IGFyZ1xuXG4gICAgYXJnLmNvb3JkcyA9IGV4dGVuZCh7fSwgYXJnLnBhZ2VDb29yZHMpXG4gICAgYXJnLnJlY3QgPSBleHRlbmQoe30sIHVubW9kaWZpZWRSZWN0KVxuXG4gICAgY29uc3Qgc3RhdGVzID0gc2tpcE1vZGlmaWVyc1xuICAgICAgPyB0aGlzLnN0YXRlcy5zbGljZShza2lwTW9kaWZpZXJzKVxuICAgICAgOiB0aGlzLnN0YXRlc1xuXG4gICAgY29uc3QgbmV3UmVzdWx0ID0gY3JlYXRlUmVzdWx0KGFyZy5jb29yZHMsIGFyZy5yZWN0KVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiBzdGF0ZXMpIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcbiAgICAgIGNvbnN0IGxhc3RNb2RpZmllckNvb3JkcyA9IGV4dGVuZCh7fSwgYXJnLmNvb3JkcylcbiAgICAgIGxldCByZXR1cm5WYWx1ZSA9IG51bGxcblxuICAgICAgaWYgKHN0YXRlLm1ldGhvZHMuc2V0ICYmIHRoaXMuc2hvdWxkRG8ob3B0aW9ucywgcHJlRW5kLCBwaGFzZSkpIHtcbiAgICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBzdGF0ZS5tZXRob2RzLnNldChhcmcgYXMgTW9kaWZpZXJBcmcpXG5cbiAgICAgICAgcmVjdFV0aWxzLmFkZEVkZ2VzKHRoaXMuaW50ZXJhY3Rpb24uZWRnZXMsIGFyZy5yZWN0LCB7IHg6IGFyZy5jb29yZHMueCAtIGxhc3RNb2RpZmllckNvb3Jkcy54LCB5OiBhcmcuY29vcmRzLnkgLSBsYXN0TW9kaWZpZXJDb29yZHMueSB9KVxuICAgICAgfVxuXG4gICAgICBuZXdSZXN1bHQuZXZlbnRQcm9wcy5wdXNoKHJldHVyblZhbHVlKVxuICAgIH1cblxuICAgIG5ld1Jlc3VsdC5kZWx0YS54ID0gYXJnLmNvb3Jkcy54IC0gYXJnLnBhZ2VDb29yZHMueFxuICAgIG5ld1Jlc3VsdC5kZWx0YS55ID0gYXJnLmNvb3Jkcy55IC0gYXJnLnBhZ2VDb29yZHMueVxuXG4gICAgbmV3UmVzdWx0LnJlY3REZWx0YS5sZWZ0ICAgPSBhcmcucmVjdC5sZWZ0IC0gdW5tb2RpZmllZFJlY3QubGVmdFxuICAgIG5ld1Jlc3VsdC5yZWN0RGVsdGEucmlnaHQgID0gYXJnLnJlY3QucmlnaHQgLSB1bm1vZGlmaWVkUmVjdC5yaWdodFxuICAgIG5ld1Jlc3VsdC5yZWN0RGVsdGEudG9wICAgID0gYXJnLnJlY3QudG9wIC0gdW5tb2RpZmllZFJlY3QudG9wXG4gICAgbmV3UmVzdWx0LnJlY3REZWx0YS5ib3R0b20gPSBhcmcucmVjdC5ib3R0b20gLSB1bm1vZGlmaWVkUmVjdC5ib3R0b21cblxuICAgIGNvbnN0IHByZXZDb29yZHMgPSB0aGlzLnJlc3VsdC5jb29yZHNcbiAgICBjb25zdCBwcmV2UmVjdCA9IHRoaXMucmVzdWx0LnJlY3RcblxuICAgIGlmIChwcmV2Q29vcmRzICYmIHByZXZSZWN0KSB7XG4gICAgICBjb25zdCByZWN0Q2hhbmdlZCA9IG5ld1Jlc3VsdC5yZWN0LmxlZnQgIT09IHByZXZSZWN0LmxlZnQgfHxcbiAgICAgICAgbmV3UmVzdWx0LnJlY3QucmlnaHQgIT09IHByZXZSZWN0LnJpZ2h0IHx8XG4gICAgICAgIG5ld1Jlc3VsdC5yZWN0LnRvcCAhPT0gcHJldlJlY3QudG9wIHx8XG4gICAgICAgIG5ld1Jlc3VsdC5yZWN0LmJvdHRvbSAhPT0gcHJldlJlY3QuYm90dG9tXG5cbiAgICAgIG5ld1Jlc3VsdC5jaGFuZ2VkID0gcmVjdENoYW5nZWQgfHxcbiAgICAgICAgcHJldkNvb3Jkcy54ICE9PSBuZXdSZXN1bHQuY29vcmRzLnggfHxcbiAgICAgICAgcHJldkNvb3Jkcy55ICE9PSBuZXdSZXN1bHQuY29vcmRzLnlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3UmVzdWx0XG4gIH1cblxuICBhcHBseVRvSW50ZXJhY3Rpb24gKGFyZzogeyBwaGFzZTogSW50ZXJhY3QuRXZlbnRQaGFzZSwgcmVjdD86IEludGVyYWN0LlJlY3QgfSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCB7IHBoYXNlIH0gPSBhcmdcbiAgICBjb25zdCBjdXJDb29yZHMgPSBpbnRlcmFjdGlvbi5jb29yZHMuY3VyXG4gICAgY29uc3Qgc3RhcnRDb29yZHMgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnRcbiAgICBjb25zdCB7IHJlc3VsdCwgc3RhcnREZWx0YSB9ID0gdGhpc1xuICAgIGNvbnN0IGN1ckRlbHRhID0gcmVzdWx0LmRlbHRhXG5cbiAgICBpZiAocGhhc2UgPT09ICdzdGFydCcpIHtcbiAgICAgIGV4dGVuZCh0aGlzLnN0YXJ0RGVsdGEsIHJlc3VsdC5kZWx0YSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb29yZHNTZXQsIGRlbHRhXSBvZiBbW3N0YXJ0Q29vcmRzLCBzdGFydERlbHRhXSwgW2N1ckNvb3JkcywgY3VyRGVsdGFdXSBhcyBjb25zdCkge1xuICAgICAgY29vcmRzU2V0LnBhZ2UueCAgICs9IGRlbHRhLnhcbiAgICAgIGNvb3Jkc1NldC5wYWdlLnkgICArPSBkZWx0YS55XG4gICAgICBjb29yZHNTZXQuY2xpZW50LnggKz0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LmNsaWVudC55ICs9IGRlbHRhLnlcbiAgICB9XG5cbiAgICBjb25zdCB7IHJlY3REZWx0YSB9ID0gdGhpcy5yZXN1bHRcbiAgICBjb25zdCByZWN0ID0gYXJnLnJlY3QgfHwgaW50ZXJhY3Rpb24ucmVjdFxuXG4gICAgcmVjdC5sZWZ0ICAgKz0gcmVjdERlbHRhLmxlZnRcbiAgICByZWN0LnJpZ2h0ICArPSByZWN0RGVsdGEucmlnaHRcbiAgICByZWN0LnRvcCAgICArPSByZWN0RGVsdGEudG9wXG4gICAgcmVjdC5ib3R0b20gKz0gcmVjdERlbHRhLmJvdHRvbVxuXG4gICAgcmVjdC53aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnRcbiAgICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgfVxuXG4gIHNldEFuZEFwcGx5IChhcmc6IFBhcnRpYWw8SW50ZXJhY3QuRG9BbnlQaGFzZUFyZz4gJiB7XG4gICAgcGhhc2U6IEludGVyYWN0LkV2ZW50UGhhc2VcbiAgICBwcmVFbmQ/OiBib29sZWFuXG4gICAgc2tpcE1vZGlmaWVycz86IG51bWJlclxuICAgIG1vZGlmaWVkQ29vcmRzPzogSW50ZXJhY3QuUG9pbnRcbiAgfSk6IHZvaWQgfCBmYWxzZSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdGlvbiB9ID0gdGhpc1xuICAgIGNvbnN0IHsgcGhhc2UsIHByZUVuZCwgc2tpcE1vZGlmaWVycyB9ID0gYXJnXG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNldEFsbCh7XG4gICAgICBwcmVFbmQsXG4gICAgICBwaGFzZSxcbiAgICAgIHBhZ2VDb29yZHM6IGFyZy5tb2RpZmllZENvb3JkcyB8fCBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnBhZ2UsXG4gICAgfSlcblxuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0XG5cbiAgICAvLyBkb24ndCBmaXJlIGFuIGFjdGlvbiBtb3ZlIGlmIGEgbW9kaWZpZXIgd291bGQga2VlcCB0aGUgZXZlbnQgaW4gdGhlIHNhbWVcbiAgICAvLyBjb3JkaW5hdGVzIGFzIGJlZm9yZVxuICAgIGlmICghcmVzdWx0LmNoYW5nZWQgJiYgKCFza2lwTW9kaWZpZXJzIHx8IHNraXBNb2RpZmllcnMgPCB0aGlzLnN0YXRlcy5sZW5ndGgpICYmIGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChhcmcubW9kaWZpZWRDb29yZHMpIHtcbiAgICAgIGNvbnN0IHsgcGFnZSB9ID0gaW50ZXJhY3Rpb24uY29vcmRzLmN1clxuICAgICAgY29uc3QgYWRqdXN0bWVudCA9IHtcbiAgICAgICAgeDogYXJnLm1vZGlmaWVkQ29vcmRzLnggLSBwYWdlLngsXG4gICAgICAgIHk6IGFyZy5tb2RpZmllZENvb3Jkcy55IC0gcGFnZS55LFxuICAgICAgfVxuXG4gICAgICByZXN1bHQuY29vcmRzLnggKz0gYWRqdXN0bWVudC54XG4gICAgICByZXN1bHQuY29vcmRzLnkgKz0gYWRqdXN0bWVudC55XG4gICAgICByZXN1bHQuZGVsdGEueCArPSBhZGp1c3RtZW50LnhcbiAgICAgIHJlc3VsdC5kZWx0YS55ICs9IGFkanVzdG1lbnQueVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlUb0ludGVyYWN0aW9uKGFyZylcbiAgfVxuXG4gIGJlZm9yZUVuZCAoYXJnOiBPbWl0PEludGVyYWN0LkRvQW55UGhhc2VBcmcsICdpRXZlbnQnPiAmIHsgc3RhdGU/OiBNb2RpZmllclN0YXRlIH0pOiB2b2lkIHwgZmFsc2Uge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGV2ZW50IH0gPSBhcmdcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0YXRlc1xuXG4gICAgaWYgKCFzdGF0ZXMgfHwgIXN0YXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBkb1ByZWVuZCA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHN0YXRlcykge1xuICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgIGNvbnN0IHsgb3B0aW9ucywgbWV0aG9kcyB9ID0gc3RhdGVcblxuICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBtZXRob2RzLmJlZm9yZUVuZCAmJiBtZXRob2RzLmJlZm9yZUVuZChhcmcgYXMgdW5rbm93biBhcyBNb2RpZmllckFyZylcblxuICAgICAgaWYgKGVuZFBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZW5kUmVzdWx0ID0gZW5kUG9zaXRpb25cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGRvUHJlZW5kID0gZG9QcmVlbmQgfHwgKCFkb1ByZWVuZCAmJiB0aGlzLnNob3VsZERvKG9wdGlvbnMsIHRydWUsIGFyZy5waGFzZSwgdHJ1ZSkpXG4gICAgfVxuXG4gICAgaWYgKGRvUHJlZW5kKSB7XG4gICAgICAvLyB0cmlnZ2VyIGEgZmluYWwgbW9kaWZpZWQgbW92ZSBiZWZvcmUgZW5kaW5nXG4gICAgICBpbnRlcmFjdGlvbi5tb3ZlKHsgZXZlbnQsIHByZUVuZDogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIHN0b3AgKGFyZzogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGFyZ1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlcyB8fCAhdGhpcy5zdGF0ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBtb2RpZmllckFyZzogUGFydGlhbDxNb2RpZmllckFyZz4gPSBleHRlbmQoe1xuICAgICAgc3RhdGVzOiB0aGlzLnN0YXRlcyxcbiAgICAgIGludGVyYWN0YWJsZTogaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLFxuICAgICAgZWxlbWVudDogaW50ZXJhY3Rpb24uZWxlbWVudCxcbiAgICAgIHJlY3Q6IG51bGwsXG4gICAgfSwgYXJnKVxuXG4gICAgdGhpcy5maWxsQXJnKG1vZGlmaWVyQXJnKVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgbW9kaWZpZXJBcmcuc3RhdGUgPSBzdGF0ZVxuXG4gICAgICBpZiAoc3RhdGUubWV0aG9kcy5zdG9wKSB7IHN0YXRlLm1ldGhvZHMuc3RvcChtb2RpZmllckFyZyBhcyBNb2RpZmllckFyZykgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGVzID0gbnVsbFxuICAgIHRoaXMuZW5kUmVzdWx0ID0gbnVsbFxuICB9XG5cbiAgcHJlcGFyZVN0YXRlcyAobW9kaWZpZXJMaXN0OiBNb2RpZmllcltdKSB7XG4gICAgdGhpcy5zdGF0ZXMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1vZGlmaWVyTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucywgbWV0aG9kcywgbmFtZSB9ID0gbW9kaWZpZXJMaXN0W2luZGV4XVxuXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVuYWJsZWQgPT09IGZhbHNlKSB7IGNvbnRpbnVlIH1cblxuICAgICAgdGhpcy5zdGF0ZXMucHVzaCh7XG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIG1ldGhvZHMsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBuYW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZXNcbiAgfVxuXG4gIHJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyAoeyBpbnRlcmFjdGlvbjogeyBjb29yZHMsIHJlY3QsIG1vZGlmaWNhdGlvbiB9IH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgICBpZiAoIW1vZGlmaWNhdGlvbi5yZXN1bHQpIHsgcmV0dXJuIH1cblxuICAgIGNvbnN0IHsgc3RhcnREZWx0YSB9ID0gbW9kaWZpY2F0aW9uXG4gICAgY29uc3QgeyBkZWx0YTogY3VyRGVsdGEsIHJlY3REZWx0YSB9ID0gbW9kaWZpY2F0aW9uLnJlc3VsdFxuXG4gICAgY29uc3QgY29vcmRzQW5kRGVsdGFzID0gW1xuICAgICAgW2Nvb3Jkcy5zdGFydCwgc3RhcnREZWx0YV0sXG4gICAgICBbY29vcmRzLmN1ciwgY3VyRGVsdGFdLFxuICAgIF1cblxuICAgIGZvciAoY29uc3QgW2Nvb3Jkc1NldCwgZGVsdGFdIG9mIGNvb3Jkc0FuZERlbHRhcyBhcyBhbnkpIHtcbiAgICAgIGNvb3Jkc1NldC5wYWdlLnggLT0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LnBhZ2UueSAtPSBkZWx0YS55XG4gICAgICBjb29yZHNTZXQuY2xpZW50LnggLT0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LmNsaWVudC55IC09IGRlbHRhLnlcbiAgICB9XG5cbiAgICByZWN0LmxlZnQgLT0gcmVjdERlbHRhLmxlZnRcbiAgICByZWN0LnJpZ2h0IC09IHJlY3REZWx0YS5yaWdodFxuICAgIHJlY3QudG9wIC09IHJlY3REZWx0YS50b3BcbiAgICByZWN0LmJvdHRvbSAtPSByZWN0RGVsdGEuYm90dG9tXG4gIH1cblxuICBzaG91bGREbyAob3B0aW9ucywgcHJlRW5kPzogYm9vbGVhbiwgcGhhc2U/OiBzdHJpbmcsIHJlcXVpcmVFbmRPbmx5PzogYm9vbGVhbikge1xuICAgIGlmIChcbiAgICAgIC8vIGlnbm9yZSBkaXNhYmxlZCBtb2RpZmllcnNcbiAgICAgICghb3B0aW9ucyB8fCBvcHRpb25zLmVuYWJsZWQgPT09IGZhbHNlKSB8fFxuICAgICAgLy8gY2hlY2sgaWYgd2UgcmVxdWlyZSBlbmRPbmx5IG9wdGlvbiB0byBmaXJlIG1vdmUgYmVmb3JlIGVuZFxuICAgICAgKHJlcXVpcmVFbmRPbmx5ICYmICFvcHRpb25zLmVuZE9ubHkpIHx8XG4gICAgICAvLyBkb24ndCBhcHBseSBlbmRPbmx5IG1vZGlmaWVycyB3aGVuIG5vdCBlbmRpbmdcbiAgICAgIChvcHRpb25zLmVuZE9ubHkgJiYgIXByZUVuZCkgfHxcbiAgICAgIC8vIGNoZWNrIGlmIG1vZGlmaWVyIHNob3VsZCBydW4gYmUgYXBwbGllZCBvbiBzdGFydFxuICAgICAgKHBoYXNlID09PSAnc3RhcnQnICYmICFvcHRpb25zLnNldFN0YXJ0KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvcHlGcm9tIChvdGhlcjogTW9kaWZpY2F0aW9uKSB7XG4gICAgdGhpcy5zdGFydE9mZnNldCA9IG90aGVyLnN0YXJ0T2Zmc2V0XG4gICAgdGhpcy5zdGFydERlbHRhID0gb3RoZXIuc3RhcnREZWx0YVxuICAgIHRoaXMuZWRnZXMgPSBvdGhlci5lZGdlc1xuICAgIHRoaXMuc3RhdGVzID0gb3RoZXIuc3RhdGVzLm1hcChzID0+IGNsb25lKHMpIGFzIE1vZGlmaWVyU3RhdGUpXG4gICAgdGhpcy5yZXN1bHQgPSBjcmVhdGVSZXN1bHQoZXh0ZW5kKHt9LCBvdGhlci5yZXN1bHQuY29vcmRzKSwgZXh0ZW5kKHt9LCBvdGhlci5yZXN1bHQucmVjdCkpXG4gIH1cblxuICBkZXN0cm95ICgpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcykge1xuICAgICAgdGhpc1twcm9wXSA9IG51bGxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVzdWx0IChjb29yZHM/OiBJbnRlcmFjdC5Qb2ludCwgcmVjdD86IEludGVyYWN0LkZ1bGxSZWN0KTogTW9kaWZpY2F0aW9uUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICByZWN0LFxuICAgIGNvb3JkcyxcbiAgICBkZWx0YTogeyB4OiAwLCB5OiAwIH0sXG4gICAgcmVjdERlbHRhOiB7XG4gICAgICBsZWZ0ICA6IDAsXG4gICAgICByaWdodCA6IDAsXG4gICAgICB0b3AgICA6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgfSxcbiAgICBldmVudFByb3BzOiBbXSxcbiAgICBjaGFuZ2VkOiB0cnVlLFxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyTGlzdCAoaW50ZXJhY3Rpb24pIHtcbiAgY29uc3QgYWN0aW9uT3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zW2ludGVyYWN0aW9uLnByZXBhcmVkLm5hbWVdXG4gIGNvbnN0IGFjdGlvbk1vZGlmaWVycyA9IGFjdGlvbk9wdGlvbnMubW9kaWZpZXJzXG5cbiAgaWYgKGFjdGlvbk1vZGlmaWVycyAmJiBhY3Rpb25Nb2RpZmllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFjdGlvbk1vZGlmaWVycy5maWx0ZXIoXG4gICAgICBtb2RpZmllciA9PiAhbW9kaWZpZXIub3B0aW9ucyB8fCBtb2RpZmllci5vcHRpb25zLmVuYWJsZWQgIT09IGZhbHNlLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBbJ3NuYXAnLCAnc25hcFNpemUnLCAnc25hcEVkZ2VzJywgJ3Jlc3RyaWN0JywgJ3Jlc3RyaWN0RWRnZXMnLCAncmVzdHJpY3RTaXplJ11cbiAgICAubWFwKHR5cGUgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGFjdGlvbk9wdGlvbnNbdHlwZV1cblxuICAgICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5lbmFibGVkICYmIHtcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgbWV0aG9kczogb3B0aW9ucy5fbWV0aG9kcyxcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIobSA9PiAhIW0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN0T2Zmc2V0IChyZWN0LCBjb29yZHMpIHtcbiAgcmV0dXJuIHJlY3RcbiAgICA/IHtcbiAgICAgIGxlZnQgIDogY29vcmRzLnggLSByZWN0LmxlZnQsXG4gICAgICB0b3AgICA6IGNvb3Jkcy55IC0gcmVjdC50b3AsXG4gICAgICByaWdodCA6IHJlY3QucmlnaHQgIC0gY29vcmRzLngsXG4gICAgICBib3R0b206IHJlY3QuYm90dG9tIC0gY29vcmRzLnksXG4gICAgfVxuICAgIDoge1xuICAgICAgbGVmdCAgOiAwLFxuICAgICAgdG9wICAgOiAwLFxuICAgICAgcmlnaHQgOiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgIH1cbn1cbiIsImltcG9ydCBNb2RpZmljYXRpb24gZnJvbSAnLi9Nb2RpZmljYXRpb24nXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgbW9kaWZpY2F0aW9uPzogTW9kaWZpY2F0aW9uXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RFdmVudCcge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RFdmVudCB7XG4gICAgbW9kaWZpZXJzPzogQXJyYXk8e1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9PlxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgbW9kaWZpZXJzPzogTW9kaWZpZXJbXVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZXI8XG4gIERlZmF1bHRzID0gYW55LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUgPSBhbnksXG4gIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBhbnlcbj4ge1xuICBvcHRpb25zPzogRGVmYXVsdHNcbiAgbWV0aG9kczoge1xuICAgIHN0YXJ0PzogKGFyZzogTW9kaWZpZXJBcmc8U3RhdGU+KSA9PiB2b2lkXG4gICAgc2V0OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IHZvaWRcbiAgICBiZWZvcmVFbmQ/OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IEludGVyYWN0LlBvaW50IHwgdm9pZFxuICAgIHN0b3A/OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IHZvaWRcbiAgfVxuICBuYW1lPzogTmFtZVxufVxuXG5leHBvcnQgdHlwZSBNb2RpZmllclN0YXRlPFxuICBEZWZhdWx0cyA9IHt9LFxuICBTdGF0ZVByb3BzIGV4dGVuZHMgeyBbcHJvcDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgTmFtZSBleHRlbmRzIHN0cmluZyA9IGFueVxuPiA9IHtcbiAgb3B0aW9uczogRGVmYXVsdHNcbiAgbWV0aG9kcz86IE1vZGlmaWVyPERlZmF1bHRzPlsnbWV0aG9kcyddXG4gIGluZGV4PzogbnVtYmVyXG4gIG5hbWU/OiBOYW1lXG59ICYgU3RhdGVQcm9wc1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWVyQXJnPFN0YXRlIGV4dGVuZHMgTW9kaWZpZXJTdGF0ZSA9IE1vZGlmaWVyU3RhdGU+IHtcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uXG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlXG4gIHBoYXNlOiBJbnRlcmFjdC5FdmVudFBoYXNlXG4gIHJlY3Q6IEludGVyYWN0LkZ1bGxSZWN0XG4gIGVkZ2VzOiBJbnRlcmFjdC5FZGdlT3B0aW9uc1xuICBzdGF0ZT86IFN0YXRlXG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbiAgcGFnZUNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHByZXZDb29yZHM/OiBJbnRlcmFjdC5Qb2ludFxuICBwcmV2UmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHN0YXJ0T2Zmc2V0PzogSW50ZXJhY3QuUmVjdFxuICBwcmVFbmQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZXJNb2R1bGU8XG4gIERlZmF1bHRzIGV4dGVuZHMgeyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUsXG4+IHtcbiAgZGVmYXVsdHM/OiBEZWZhdWx0c1xuICBzdGFydD8gKGFyZzogTW9kaWZpZXJBcmc8U3RhdGU+KTogdm9pZFxuICBzZXQ/IChhcmc6IE1vZGlmaWVyQXJnPFN0YXRlPik6IGFueVxuICBiZWZvcmVFbmQ/IChhcmc6IE1vZGlmaWVyQXJnPFN0YXRlPik6IEludGVyYWN0LlBvaW50IHwgdm9pZFxuICBzdG9wPyAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pOiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTW9kaWZpZXI8XG4gIERlZmF1bHRzIGV4dGVuZHMgeyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUsXG4gIE5hbWUgZXh0ZW5kcyBzdHJpbmdcbj4gKFxuICBtb2R1bGU6IE1vZGlmaWVyTW9kdWxlPERlZmF1bHRzLCBTdGF0ZT4sXG4gIG5hbWU/OiBOYW1lLFxuKSB7XG4gIGNvbnN0IHsgZGVmYXVsdHMgfSA9IG1vZHVsZVxuICBjb25zdCBtZXRob2RzID0ge1xuICAgIHN0YXJ0OiBtb2R1bGUuc3RhcnQsXG4gICAgc2V0OiBtb2R1bGUuc2V0LFxuICAgIGJlZm9yZUVuZDogbW9kdWxlLmJlZm9yZUVuZCxcbiAgICBzdG9wOiBtb2R1bGUuc3RvcCxcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVyID0gKF9vcHRpb25zPzogUGFydGlhbDxEZWZhdWx0cz4pID0+IHtcbiAgICBjb25zdCBvcHRpb25zOiBEZWZhdWx0cyA9IChfb3B0aW9ucyB8fCB7fSkgYXMgRGVmYXVsdHNcblxuICAgIG9wdGlvbnMuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcblxuICAgIC8vIGFkZCBtaXNzaW5nIGRlZmF1bHRzIHRvIG9wdGlvbnNcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGVmYXVsdHMpIHtcbiAgICAgIGlmICghKHByb3AgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IGRlZmF1bHRzW3Byb3BdXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbTogTW9kaWZpZXI8RGVmYXVsdHMsIFN0YXRlLCBOYW1lPiA9IHsgb3B0aW9ucywgbWV0aG9kcywgbmFtZSB9XG5cbiAgICByZXR1cm4gbVxuICB9XG5cbiAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZm9yIGJhY2t3cmFkcyBjb21wYXRpYmlsaXR5XG4gICAgbW9kaWZpZXIuX2RlZmF1bHRzID0gZGVmYXVsdHNcbiAgICBtb2RpZmllci5fbWV0aG9kcyA9IG1ldGhvZHNcbiAgfVxuXG4gIHJldHVybiBtb2RpZmllclxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRXZlbnRNb2RpZmllcnMgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbjogeyBtb2RpZmljYXRpb246IHsgcmVzdWx0IH0gfSB9OiB7XG4gIGlFdmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxJbnRlcmFjdC5BY3Rpb25OYW1lLCBJbnRlcmFjdC5FdmVudFBoYXNlPlxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbn0pIHtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGlFdmVudC5tb2RpZmllcnMgPSByZXN1bHQuZXZlbnRQcm9wc1xuICB9XG59XG5cbmNvbnN0IG1vZGlmaWVyc0Jhc2U6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdtb2RpZmllcnMvYmFzZScsXG4gIGluc3RhbGw6IHNjb3BlID0+IHtcbiAgICBzY29wZS5kZWZhdWx0cy5wZXJBY3Rpb24ubW9kaWZpZXJzID0gW11cbiAgfSxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGlvbi5tb2RpZmljYXRpb24gPSBuZXcgTW9kaWZpY2F0aW9uKGludGVyYWN0aW9uKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tc3RhcnQnOiBhcmcgPT4ge1xuICAgICAgY29uc3QgeyBtb2RpZmljYXRpb24gfSA9IGFyZy5pbnRlcmFjdGlvblxuXG4gICAgICBtb2RpZmljYXRpb24uc3RhcnQoYXJnLCBhcmcuaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UpXG4gICAgICBhcmcuaW50ZXJhY3Rpb24uZWRnZXMgPSBtb2RpZmljYXRpb24uZWRnZXNcbiAgICAgIG1vZGlmaWNhdGlvbi5hcHBseVRvSW50ZXJhY3Rpb24oYXJnKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnNldEFuZEFwcGx5KGFyZyksXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uYmVmb3JlRW5kKGFyZyksXG5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1zdGFydCc6IGFkZEV2ZW50TW9kaWZpZXJzLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBhZGRFdmVudE1vZGlmaWVycyxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1lbmQnOiBhZGRFdmVudE1vZGlmaWVycyxcblxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXN0YXJ0JzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24ucmVzdG9yZUludGVyYWN0aW9uQ29vcmRzKGFyZyksXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uc3RvcChhcmcpLFxuICB9LFxuICBiZWZvcmU6IFsnYWN0aW9ucycsICdhY3Rpb24vZHJhZycsICdhY3Rpb25zL3Jlc2l6ZScsICdhY3Rpb25zL2dlc3R1cmUnXSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbW9kaWZpZXJzQmFzZVxuIiwiaW1wb3J0IHsgX1Byb3h5TWV0aG9kcyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgKiBhcyByZWN0VXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmVjdCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBvZmZzZXRCeT86IHR5cGVvZiBvZmZzZXRCeVxuICAgIG9mZnNldDoge1xuICAgICAgdG90YWw6IEludGVyYWN0LlBvaW50XG4gICAgICBwZW5kaW5nOiBJbnRlcmFjdC5Qb2ludFxuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZW51bSBfUHJveHlNZXRob2RzIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgb2Zmc2V0QnkgPSAnJ1xuICB9XG59XG5cbihfUHJveHlNZXRob2RzIGFzIGFueSkub2Zmc2V0QnkgPSAnJ1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkVG90YWwgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICBpZiAoIWludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24pIHsgcmV0dXJuIH1cblxuICBhZGRUb0Nvb3JkcyhpbnRlcmFjdGlvbi5jb29yZHMuY3VyLCBpbnRlcmFjdGlvbi5vZmZzZXQudG90YWwpXG5cbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueCA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueSA9IDBcbn1cblxuZnVuY3Rpb24gYmVmb3JlQWN0aW9uICh7IGludGVyYWN0aW9uIH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgYXBwbHlQZW5kaW5nKGludGVyYWN0aW9uKVxufVxuXG5mdW5jdGlvbiBiZWZvcmVFbmQgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSk6IGJvb2xlYW4gfCB2b2lkIHtcbiAgY29uc3QgaGFkUGVuZGluZyA9IGFwcGx5UGVuZGluZyhpbnRlcmFjdGlvbilcblxuICBpZiAoIWhhZFBlbmRpbmcpIHsgcmV0dXJuIH1cblxuICBpbnRlcmFjdGlvbi5tb3ZlKHsgb2Zmc2V0OiB0cnVlIH0pXG4gIGludGVyYWN0aW9uLmVuZCgpXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGVuZCAoeyBpbnRlcmFjdGlvbiB9OiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9KSB7XG4gIGludGVyYWN0aW9uLm9mZnNldC50b3RhbC54ID0gMFxuICBpbnRlcmFjdGlvbi5vZmZzZXQudG90YWwueSA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueCA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueSA9IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGVuZGluZyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uKSB7XG4gIGlmICghaGFzUGVuZGluZyhpbnRlcmFjdGlvbikpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IHsgcGVuZGluZyB9ID0gaW50ZXJhY3Rpb24ub2Zmc2V0XG5cbiAgYWRkVG9Db29yZHMoaW50ZXJhY3Rpb24uY29vcmRzLmN1ciwgcGVuZGluZylcbiAgYWRkVG9Db29yZHMoaW50ZXJhY3Rpb24uY29vcmRzLmRlbHRhLCBwZW5kaW5nKVxuICByZWN0VXRpbHMuYWRkRWRnZXMoaW50ZXJhY3Rpb24uZWRnZXMsIGludGVyYWN0aW9uLnJlY3QsIHBlbmRpbmcpXG5cbiAgcGVuZGluZy54ID0gMFxuICBwZW5kaW5nLnkgPSAwXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gb2Zmc2V0QnkgKHRoaXM6IEludGVyYWN0LkludGVyYWN0aW9uLCB7IHgsIHkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgdGhpcy5vZmZzZXQucGVuZGluZy54ICs9IHhcbiAgdGhpcy5vZmZzZXQucGVuZGluZy55ICs9IHlcblxuICB0aGlzLm9mZnNldC50b3RhbC54ICs9IHhcbiAgdGhpcy5vZmZzZXQudG90YWwueSArPSB5XG59XG5cbmZ1bmN0aW9uIGFkZFRvQ29vcmRzICh7IHBhZ2UsIGNsaWVudCB9LCB7IHgsIHkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgcGFnZS54ICs9IHhcbiAgcGFnZS55ICs9IHlcbiAgY2xpZW50LnggKz0geFxuICBjbGllbnQueSArPSB5XG59XG5cbmZ1bmN0aW9uIGhhc1BlbmRpbmcgKGludGVyYWN0aW9uKSB7XG4gIHJldHVybiAhIShpbnRlcmFjdGlvbi5vZmZzZXQucGVuZGluZy54IHx8IGludGVyYWN0aW9uLm9mZnNldC5wZW5kaW5nLnkpXG59XG5cbmNvbnN0IG9mZnNldDogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ29mZnNldCcsXG4gIGluc3RhbGwgKHNjb3BlKSB7XG4gICAgc2NvcGUuSW50ZXJhY3Rpb24ucHJvdG90eXBlLm9mZnNldEJ5ID0gb2Zmc2V0QnlcbiAgfSxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGlvbi5vZmZzZXQgPSB7XG4gICAgICAgIHRvdGFsOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgcGVuZGluZzogeyB4OiAwLCB5OiAwIH0sXG4gICAgICB9XG4gICAgfSxcbiAgICAnaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJzogKHsgaW50ZXJhY3Rpb24gfSkgPT4gYWRkVG90YWwoaW50ZXJhY3Rpb24pLFxuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1zdGFydCc6IGJlZm9yZUFjdGlvbixcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGJlZm9yZUFjdGlvbixcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogYmVmb3JlRW5kLFxuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IGVuZCxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgb2Zmc2V0XG4iLCJpbXBvcnQgKiBhcyBtb2RpZmllcnMgZnJvbSAnQGludGVyYWN0anMvbW9kaWZpZXJzL2Jhc2UnXG5pbXBvcnQgTW9kaWZpY2F0aW9uIGZyb20gJ0BpbnRlcmFjdGpzL21vZGlmaWVycy9Nb2RpZmljYXRpb24nXG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0BpbnRlcmFjdGpzL29mZnNldC9pbmRleCdcbmltcG9ydCAqIGFzIGRvbSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21VdGlscydcbmltcG9ydCBoeXBvdCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9oeXBvdCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IHsgY29weUNvb3JkcyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3BvaW50ZXJVdGlscydcbmltcG9ydCByYWYgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmFmJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50JyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgaW50ZXJmYWNlIFBoYXNlTWFwIHtcbiAgICByZXN1bWU/OiB0cnVlXG4gICAgaW5lcnRpYXN0YXJ0PzogdHJ1ZVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgaW5lcnRpYT86IEluZXJ0aWFTdGF0ZVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgaW5lcnRpYT86IHtcbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICByZXNpc3RhbmNlPzogbnVtYmVyICAgICAgICAvLyB0aGUgbGFtYmRhIGluIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgICBtaW5TcGVlZD86IG51bWJlciAgICAgICAgICAvLyB0YXJnZXQgc3BlZWQgbXVzdCBiZSBhYm92ZSB0aGlzIGZvciBpbmVydGlhIHRvIHN0YXJ0XG4gICAgICBlbmRTcGVlZD86IG51bWJlciAgICAgICAgICAvLyB0aGUgc3BlZWQgYXQgd2hpY2ggaW5lcnRpYSBpcyBzbG93IGVub3VnaCB0byBzdG9wXG4gICAgICBhbGxvd1Jlc3VtZT86IHRydWUgICAgICAgICAvLyBhbGxvdyByZXN1bWluZyBhbiBhY3Rpb24gaW4gaW5lcnRpYSBwaGFzZVxuICAgICAgc21vb3RoRW5kRHVyYXRpb24/OiBudW1iZXIgLy8gYW5pbWF0ZSB0byBzbmFwL3Jlc3RyaWN0IGVuZE9ubHkgaWYgdGhlcmUncyBubyBpbmVydGlhXG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTaWduYWxBcmdzIHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24taW5lcnRpYXN0YXJ0JzogT21pdDxJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdpbmVydGlhc3RhcnQnPiwgJ2lFdmVudCc+XG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24taW5lcnRpYXN0YXJ0JzogSW50ZXJhY3QuRG9QaGFzZUFyZzxJbnRlcmFjdC5BY3Rpb25OYW1lLCAnaW5lcnRpYXN0YXJ0Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFmdGVyLWFjdGlvbi1pbmVydGlhc3RhcnQnOiBJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdpbmVydGlhc3RhcnQnPlxuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1yZXN1bWUnOiBPbWl0PEludGVyYWN0LkRvUGhhc2VBcmc8SW50ZXJhY3QuQWN0aW9uTmFtZSwgJ3Jlc3VtZSc+LCAnaUV2ZW50Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1yZXN1bWUnOiBJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdyZXN1bWUnPlxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXJlc3VtZSc6IEludGVyYWN0LkRvUGhhc2VBcmc8SW50ZXJhY3QuQWN0aW9uTmFtZSwgJ3Jlc3VtZSc+XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKG9mZnNldClcbiAgc2NvcGUudXNlUGx1Z2luKG1vZGlmaWVycy5kZWZhdWx0KVxuICBzY29wZS5hY3Rpb25zLnBoYXNlcy5pbmVydGlhc3RhcnQgPSB0cnVlXG4gIHNjb3BlLmFjdGlvbnMucGhhc2VzLnJlc3VtZSA9IHRydWVcblxuICBkZWZhdWx0cy5wZXJBY3Rpb24uaW5lcnRpYSA9IHtcbiAgICBlbmFibGVkICAgICAgICAgIDogZmFsc2UsXG4gICAgcmVzaXN0YW5jZSAgICAgICA6IDEwLCAgICAvLyB0aGUgbGFtYmRhIGluIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgbWluU3BlZWQgICAgICAgICA6IDEwMCwgICAvLyB0YXJnZXQgc3BlZWQgbXVzdCBiZSBhYm92ZSB0aGlzIGZvciBpbmVydGlhIHRvIHN0YXJ0XG4gICAgZW5kU3BlZWQgICAgICAgICA6IDEwLCAgICAvLyB0aGUgc3BlZWQgYXQgd2hpY2ggaW5lcnRpYSBpcyBzbG93IGVub3VnaCB0byBzdG9wXG4gICAgYWxsb3dSZXN1bWUgICAgICA6IHRydWUsICAvLyBhbGxvdyByZXN1bWluZyBhbiBhY3Rpb24gaW4gaW5lcnRpYSBwaGFzZVxuICAgIHNtb290aEVuZER1cmF0aW9uOiAzMDAsICAgLy8gYW5pbWF0ZSB0byBzbmFwL3Jlc3RyaWN0IGVuZE9ubHkgaWYgdGhlcmUncyBubyBpbmVydGlhXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZXJ0aWFTdGF0ZSB7XG4gIGFjdGl2ZSA9IGZhbHNlXG4gIGlzTW9kaWZpZWQgPSBmYWxzZVxuICBzbW9vdGhFbmQgPSBmYWxzZVxuICBhbGxvd1Jlc3VtZSA9IGZhbHNlXG5cbiAgbW9kaWZpY2F0aW9uOiBNb2RpZmljYXRpb24gPSBudWxsXG4gIG1vZGlmaWVyQ291bnQgPSAwXG4gIG1vZGlmaWVyQXJnOiBtb2RpZmllcnMuTW9kaWZpZXJBcmcgPSBudWxsXG5cbiAgc3RhcnRDb29yZHM6IEludGVyYWN0LlBvaW50ID0gbnVsbFxuICB0MCA9IDBcbiAgdjAgPSAwXG5cbiAgdGUgPSAwXG4gIHRhcmdldE9mZnNldDogSW50ZXJhY3QuUG9pbnQgPSBudWxsXG4gIG1vZGlmaWVkT2Zmc2V0OiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgY3VycmVudE9mZnNldDogSW50ZXJhY3QuUG9pbnQgPSBudWxsXG5cbiAgbGFtYmRhX3YwPyA9IDAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgb25lX3ZlX3YwPyA9IDAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgdGltZW91dDogbnVtYmVyID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yIChcbiAgICBwcml2YXRlIHJlYWRvbmx5IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgKSB7fVxuXG4gIHN0YXJ0IChldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhpbnRlcmFjdGlvbilcblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudDogdmVsb2NpdHlDbGllbnQgfSA9IGludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eVxuICAgIGNvbnN0IHBvaW50ZXJTcGVlZCA9IGh5cG90KHZlbG9jaXR5Q2xpZW50LngsIHZlbG9jaXR5Q2xpZW50LnkpXG4gICAgY29uc3QgbW9kaWZpY2F0aW9uID0gdGhpcy5tb2RpZmljYXRpb24gfHwgKHRoaXMubW9kaWZpY2F0aW9uID0gbmV3IE1vZGlmaWNhdGlvbihpbnRlcmFjdGlvbikpXG5cbiAgICBtb2RpZmljYXRpb24uY29weUZyb20oaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uKVxuXG4gICAgdGhpcy50MCA9IGludGVyYWN0aW9uLl9ub3coKVxuICAgIHRoaXMuYWxsb3dSZXN1bWUgPSBvcHRpb25zLmFsbG93UmVzdW1lXG4gICAgdGhpcy52MCA9IHBvaW50ZXJTcGVlZFxuICAgIHRoaXMuY3VycmVudE9mZnNldCA9IHsgeDogMCwgeTogMCB9XG4gICAgdGhpcy5zdGFydENvb3JkcyA9IGludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZVxuXG4gICAgdGhpcy5tb2RpZmllckFyZyA9IHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgaW50ZXJhY3RhYmxlOiBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsXG4gICAgICBlbGVtZW50OiBpbnRlcmFjdGlvbi5lbGVtZW50LFxuICAgICAgcmVjdDogaW50ZXJhY3Rpb24ucmVjdCxcbiAgICAgIGVkZ2VzOiBpbnRlcmFjdGlvbi5lZGdlcyxcbiAgICAgIHBhZ2VDb29yZHM6IHRoaXMuc3RhcnRDb29yZHMsXG4gICAgICBwcmVFbmQ6IHRydWUsXG4gICAgICBwaGFzZTogJ2luZXJ0aWFzdGFydCcsXG4gICAgfVxuXG4gICAgY29uc3QgdGhyb3duID0gKFxuICAgICAgKHRoaXMudDAgLSBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnRpbWVTdGFtcCkgPCA1MCAmJlxuICAgICAgcG9pbnRlclNwZWVkID4gb3B0aW9ucy5taW5TcGVlZCAmJlxuICAgICAgcG9pbnRlclNwZWVkID4gb3B0aW9ucy5lbmRTcGVlZFxuICAgIClcblxuICAgIGlmICh0aHJvd24pIHtcbiAgICAgIHRoaXMuc3RhcnRJbmVydGlhKClcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kaWZpY2F0aW9uLnJlc3VsdCA9IG1vZGlmaWNhdGlvbi5zZXRBbGwodGhpcy5tb2RpZmllckFyZylcblxuICAgICAgaWYgKCFtb2RpZmljYXRpb24ucmVzdWx0LmNoYW5nZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhcnRTbW9vdGhFbmQoKVxuICAgIH1cblxuICAgIC8vIGZvcmNlIG1vZGlmaWNhdGlvbiBjaGFuZ2VcbiAgICBpbnRlcmFjdGlvbi5tb2RpZmljYXRpb24ucmVzdWx0LnJlY3QgPSBudWxsXG5cbiAgICAvLyBicmluZyBpbmVydGlhc3RhcnQgZXZlbnQgdG8gdGhlIHRhcmdldCBjb29yZHNcbiAgICBpbnRlcmFjdGlvbi5vZmZzZXRCeSh0aGlzLnRhcmdldE9mZnNldClcbiAgICBpbnRlcmFjdGlvbi5fZG9QaGFzZSh7XG4gICAgICBpbnRlcmFjdGlvbixcbiAgICAgIGV2ZW50LFxuICAgICAgcGhhc2U6ICdpbmVydGlhc3RhcnQnLFxuICAgIH0pXG4gICAgaW50ZXJhY3Rpb24ub2Zmc2V0QnkoeyB4OiAtdGhpcy50YXJnZXRPZmZzZXQueCwgeTogLXRoaXMudGFyZ2V0T2Zmc2V0LnkgfSlcbiAgICAvLyBmb3JjZSBtb2RpZmljYXRpb24gY2hhbmdlXG4gICAgaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3VsdC5yZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlXG4gICAgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiA9IHRoaXNcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzdGFydEluZXJ0aWEgKCkge1xuICAgIGNvbnN0IHN0YXJ0VmVsb2NpdHkgPSB0aGlzLmludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eS5jbGllbnRcbiAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyh0aGlzLmludGVyYWN0aW9uKVxuICAgIGNvbnN0IGxhbWJkYSA9IG9wdGlvbnMucmVzaXN0YW5jZVxuICAgIGNvbnN0IGluZXJ0aWFEdXIgPSAtTWF0aC5sb2cob3B0aW9ucy5lbmRTcGVlZCAvIHRoaXMudjApIC8gbGFtYmRhXG5cbiAgICB0aGlzLnRhcmdldE9mZnNldCA9IHtcbiAgICAgIHg6IChzdGFydFZlbG9jaXR5LnggLSBpbmVydGlhRHVyKSAvIGxhbWJkYSxcbiAgICAgIHk6IChzdGFydFZlbG9jaXR5LnkgLSBpbmVydGlhRHVyKSAvIGxhbWJkYSxcbiAgICB9XG5cbiAgICB0aGlzLnRlID0gaW5lcnRpYUR1clxuICAgIHRoaXMubGFtYmRhX3YwID0gbGFtYmRhIC8gdGhpcy52MFxuICAgIHRoaXMub25lX3ZlX3YwID0gMSAtIG9wdGlvbnMuZW5kU3BlZWQgLyB0aGlzLnYwXG5cbiAgICBjb25zdCB7IG1vZGlmaWNhdGlvbiwgbW9kaWZpZXJBcmcgfSA9IHRoaXNcblxuICAgIG1vZGlmaWVyQXJnLnBhZ2VDb29yZHMgPSB7XG4gICAgICB4OiB0aGlzLnN0YXJ0Q29vcmRzLnggKyB0aGlzLnRhcmdldE9mZnNldC54LFxuICAgICAgeTogdGhpcy5zdGFydENvb3Jkcy55ICsgdGhpcy50YXJnZXRPZmZzZXQueSxcbiAgICB9XG5cbiAgICBtb2RpZmljYXRpb24ucmVzdWx0ID0gbW9kaWZpY2F0aW9uLnNldEFsbChtb2RpZmllckFyZylcblxuICAgIGlmIChtb2RpZmljYXRpb24ucmVzdWx0LmNoYW5nZWQpIHtcbiAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWVcbiAgICAgIHRoaXMubW9kaWZpZWRPZmZzZXQgPSB7XG4gICAgICAgIHg6IHRoaXMudGFyZ2V0T2Zmc2V0LnggKyBtb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLngsXG4gICAgICAgIHk6IHRoaXMudGFyZ2V0T2Zmc2V0LnkgKyBtb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLnksXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5pbmVydGlhVGljaygpKVxuICB9XG5cbiAgc3RhcnRTbW9vdGhFbmQgKCkge1xuICAgIHRoaXMuc21vb3RoRW5kID0gdHJ1ZVxuICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWVcbiAgICB0aGlzLnRhcmdldE9mZnNldCA9IHtcbiAgICAgIHg6IHRoaXMubW9kaWZpY2F0aW9uLnJlc3VsdC5kZWx0YS54LFxuICAgICAgeTogdGhpcy5tb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLnksXG4gICAgfVxuXG4gICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5zbW9vdGhFbmRUaWNrKCkpXG4gIH1cblxuICBpbmVydGlhVGljayAoKSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdGlvbiB9ID0gdGhpc1xuICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGludGVyYWN0aW9uKVxuICAgIGNvbnN0IGxhbWJkYSA9IG9wdGlvbnMucmVzaXN0YW5jZVxuICAgIGNvbnN0IHQgPSAoaW50ZXJhY3Rpb24uX25vdygpIC0gdGhpcy50MCkgLyAxMDAwXG5cbiAgICBpZiAodCA8IHRoaXMudGUpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gIDEgLSAoTWF0aC5leHAoLWxhbWJkYSAqIHQpIC0gdGhpcy5sYW1iZGFfdjApIC8gdGhpcy5vbmVfdmVfdjBcbiAgICAgIGxldCBuZXdPZmZzZXQ6IEludGVyYWN0LlBvaW50XG5cbiAgICAgIGlmICh0aGlzLmlzTW9kaWZpZWQpIHtcbiAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0UXVhZHJhdGljQ3VydmVQb2ludChcbiAgICAgICAgICAwLCAwLFxuICAgICAgICAgIHRoaXMudGFyZ2V0T2Zmc2V0LngsIHRoaXMudGFyZ2V0T2Zmc2V0LnksXG4gICAgICAgICAgdGhpcy5tb2RpZmllZE9mZnNldC54LCB0aGlzLm1vZGlmaWVkT2Zmc2V0LnksXG4gICAgICAgICAgcHJvZ3Jlc3MsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBuZXdPZmZzZXQgPSB7XG4gICAgICAgICAgeDogdGhpcy50YXJnZXRPZmZzZXQueCAqIHByb2dyZXNzLFxuICAgICAgICAgIHk6IHRoaXMudGFyZ2V0T2Zmc2V0LnkgKiBwcm9ncmVzcyxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWx0YSA9IHsgeDogbmV3T2Zmc2V0LnggLSB0aGlzLmN1cnJlbnRPZmZzZXQueCwgeTogbmV3T2Zmc2V0LnkgLSB0aGlzLmN1cnJlbnRPZmZzZXQueSB9XG5cbiAgICAgIHRoaXMuY3VycmVudE9mZnNldC54ICs9IGRlbHRhLnhcbiAgICAgIHRoaXMuY3VycmVudE9mZnNldC55ICs9IGRlbHRhLnlcblxuICAgICAgaW50ZXJhY3Rpb24ub2Zmc2V0QnkoZGVsdGEpXG4gICAgICBpbnRlcmFjdGlvbi5tb3ZlKClcblxuICAgICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5pbmVydGlhVGljaygpKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KHtcbiAgICAgICAgeDogdGhpcy5tb2RpZmllZE9mZnNldC54IC0gdGhpcy5jdXJyZW50T2Zmc2V0LngsXG4gICAgICAgIHk6IHRoaXMubW9kaWZpZWRPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIHNtb290aEVuZFRpY2sgKCkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCB0ID0gaW50ZXJhY3Rpb24uX25vdygpIC0gdGhpcy50MFxuICAgIGNvbnN0IHsgc21vb3RoRW5kRHVyYXRpb246IGR1cmF0aW9uIH0gPSBnZXRPcHRpb25zKGludGVyYWN0aW9uKVxuXG4gICAgaWYgKHQgPCBkdXJhdGlvbikge1xuICAgICAgY29uc3QgbmV3T2Zmc2V0ID0ge1xuICAgICAgICB4OiBlYXNlT3V0UXVhZCh0LCAwLCB0aGlzLnRhcmdldE9mZnNldC54LCBkdXJhdGlvbiksXG4gICAgICAgIHk6IGVhc2VPdXRRdWFkKHQsIDAsIHRoaXMudGFyZ2V0T2Zmc2V0LnksIGR1cmF0aW9uKSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbHRhID0ge1xuICAgICAgICB4OiBuZXdPZmZzZXQueCAtIHRoaXMuY3VycmVudE9mZnNldC54LFxuICAgICAgICB5OiBuZXdPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRPZmZzZXQueCArPSBkZWx0YS54XG4gICAgICB0aGlzLmN1cnJlbnRPZmZzZXQueSArPSBkZWx0YS55XG5cbiAgICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KGRlbHRhKVxuICAgICAgaW50ZXJhY3Rpb24ubW92ZSh7IHNraXBNb2RpZmllcnM6IHRoaXMubW9kaWZpZXJDb3VudCB9KVxuXG4gICAgICB0aGlzLnRpbWVvdXQgPSByYWYucmVxdWVzdCgoKSA9PiB0aGlzLnNtb290aEVuZFRpY2soKSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpbnRlcmFjdGlvbi5vZmZzZXRCeSh7XG4gICAgICAgIHg6IHRoaXMudGFyZ2V0T2Zmc2V0LnggLSB0aGlzLmN1cnJlbnRPZmZzZXQueCxcbiAgICAgICAgeTogdGhpcy50YXJnZXRPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIHJlc3VtZSAoeyBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcblxuICAgIC8vIHVuZG8gaW5lcnRpYSBjaGFuZ2VzIHRvIGludGVyYWN0aW9uIGNvb3Jkc1xuICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KHtcbiAgICAgIHg6IC10aGlzLmN1cnJlbnRPZmZzZXQueCxcbiAgICAgIHk6IC10aGlzLmN1cnJlbnRPZmZzZXQueSxcbiAgICB9KVxuXG4gICAgLy8gdXBkYXRlIHBvaW50ZXIgYXQgcG9pbnRlciBkb3duIHBvc2l0aW9uXG4gICAgaW50ZXJhY3Rpb24udXBkYXRlUG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHRydWUpXG5cbiAgICAvLyBmaXJlIHJlc3VtZSBzaWduYWxzIGFuZCBldmVudFxuICAgIGludGVyYWN0aW9uLl9kb1BoYXNlKHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgZXZlbnQsXG4gICAgICBwaGFzZTogJ3Jlc3VtZScsXG4gICAgfSlcbiAgICBjb3B5Q29vcmRzKGludGVyYWN0aW9uLmNvb3Jkcy5wcmV2LCBpbnRlcmFjdGlvbi5jb29yZHMuY3VyKVxuXG4gICAgdGhpcy5zdG9wKClcbiAgfVxuXG4gIGVuZCAoKSB7XG4gICAgdGhpcy5pbnRlcmFjdGlvbi5tb3ZlKClcbiAgICB0aGlzLmludGVyYWN0aW9uLmVuZCgpXG4gICAgdGhpcy5zdG9wKClcbiAgfVxuXG4gIHN0b3AgKCkge1xuICAgIHRoaXMuYWN0aXZlID0gdGhpcy5zbW9vdGhFbmQgPSBmYWxzZVxuICAgIHRoaXMuaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiA9IG51bGxcbiAgICByYWYuY2FuY2VsKHRoaXMudGltZW91dClcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpbnRlcmFjdGlvbiwgZXZlbnQgfTogSW50ZXJhY3QuRG9QaGFzZUFyZzxJbnRlcmFjdC5BY3Rpb25OYW1lLCAnZW5kJz4pIHtcbiAgaWYgKCFpbnRlcmFjdGlvbi5faW50ZXJhY3RpbmcgfHwgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBzdGFydGVkID0gaW50ZXJhY3Rpb24uaW5lcnRpYS5zdGFydChldmVudClcblxuICAvLyBwcmV2ZW50IGFjdGlvbiBlbmQgaWYgaW5lcnRpYSBvciBzbW9vdGhFbmRcbiAgcmV0dXJuIHN0YXJ0ZWQgPyBmYWxzZSA6IG51bGxcbn1cblxuLy8gQ2hlY2sgaWYgdGhlIGRvd24gZXZlbnQgaGl0cyB0aGUgY3VycmVudCBpbmVydGlhIHRhcmdldFxuLy8gY29udHJvbCBzaG91bGQgYmUgcmV0dXJuIHRvIHRoZSB1c2VyXG5mdW5jdGlvbiByZXN1bWUgKGFyZzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSkge1xuICBjb25zdCB7IGludGVyYWN0aW9uLCBldmVudFRhcmdldCB9ID0gYXJnXG4gIGNvbnN0IHN0YXRlID0gaW50ZXJhY3Rpb24uaW5lcnRpYVxuXG4gIGlmICghc3RhdGUuYWN0aXZlKSB7IHJldHVybiB9XG5cbiAgbGV0IGVsZW1lbnQgPSBldmVudFRhcmdldCBhcyBOb2RlXG5cbiAgLy8gY2xpbWIgdXAgdGhlIERPTSB0cmVlIGZyb20gdGhlIGV2ZW50IHRhcmdldFxuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIGlmIGludGVyYWN0aW9uIGVsZW1lbnQgaXMgdGhlIGN1cnJlbnQgaW5lcnRpYSB0YXJnZXQgZWxlbWVudFxuICAgIGlmIChlbGVtZW50ID09PSBpbnRlcmFjdGlvbi5lbGVtZW50KSB7XG4gICAgICBzdGF0ZS5yZXN1bWUoYXJnKVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZG9tLnBhcmVudE5vZGUoZWxlbWVudClcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wICh7IGludGVyYWN0aW9uIH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgY29uc3Qgc3RhdGUgPSBpbnRlcmFjdGlvbi5pbmVydGlhXG5cbiAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgIHN0YXRlLnN0b3AoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvbnMgKHsgaW50ZXJhY3RhYmxlLCBwcmVwYXJlZCB9OiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICByZXR1cm4gaW50ZXJhY3RhYmxlICYmXG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMgJiZcbiAgICBwcmVwYXJlZC5uYW1lICYmXG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnNbcHJlcGFyZWQubmFtZV0uaW5lcnRpYVxufVxuXG5jb25zdCBpbmVydGlhOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnaW5lcnRpYScsXG4gIGJlZm9yZTogWydtb2RpZmllcnMvYmFzZSddLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmluZXJ0aWEgPSBuZXcgSW5lcnRpYVN0YXRlKGludGVyYWN0aW9uKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogc3RhcnQsXG4gICAgJ2ludGVyYWN0aW9uczpkb3duJzogcmVzdW1lLFxuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IHN0b3AsXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tcmVzdW1lJzogYXJnID0+IHtcbiAgICAgIGNvbnN0IHsgbW9kaWZpY2F0aW9uIH0gPSBhcmcuaW50ZXJhY3Rpb25cblxuICAgICAgbW9kaWZpY2F0aW9uLnN0b3AoYXJnKVxuICAgICAgbW9kaWZpY2F0aW9uLnN0YXJ0KGFyZywgYXJnLmludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZSlcbiAgICAgIG1vZGlmaWNhdGlvbi5hcHBseVRvSW50ZXJhY3Rpb24oYXJnKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24taW5lcnRpYXN0YXJ0JzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uc2V0QW5kQXBwbHkoYXJnKSxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1yZXN1bWUnOiBtb2RpZmllcnMuYWRkRXZlbnRNb2RpZmllcnMsXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24taW5lcnRpYXN0YXJ0JzogbW9kaWZpZXJzLmFkZEV2ZW50TW9kaWZpZXJzLFxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLWluZXJ0aWFzdGFydCc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXJlc3VtZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuICB9LFxufVxuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81NjM0NTI4LzIyODA4ODhcbmZ1bmN0aW9uIF9nZXRRQmV6aWVyVmFsdWUgKHQ6IG51bWJlciwgcDE6IG51bWJlciwgcDI6IG51bWJlciwgcDM6IG51bWJlcikge1xuICBjb25zdCBpVCA9IDEgLSB0XG4gIHJldHVybiBpVCAqIGlUICogcDEgKyAyICogaVQgKiB0ICogcDIgKyB0ICogdCAqIHAzXG59XG5cbmZ1bmN0aW9uIGdldFF1YWRyYXRpY0N1cnZlUG9pbnQgKFxuICBzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIGNwWDogbnVtYmVyLCBjcFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAgX2dldFFCZXppZXJWYWx1ZShwb3NpdGlvbiwgc3RhcnRYLCBjcFgsIGVuZFgpLFxuICAgIHk6ICBfZ2V0UUJlemllclZhbHVlKHBvc2l0aW9uLCBzdGFydFksIGNwWSwgZW5kWSksXG4gIH1cbn1cblxuLy8gaHR0cDovL2dpem1hLmNvbS9lYXNpbmcvXG5mdW5jdGlvbiBlYXNlT3V0UXVhZCAodDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIHQgLz0gZFxuICByZXR1cm4gLWMgKiB0ICogKHQgLSAyKSArIGJcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5lcnRpYVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIG1vZGlmaWVycy9hc3BlY3RSYXRpb1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgZm9yY2VzIGVsZW1lbnRzIHRvIGJlIHJlc2l6ZWQgd2l0aCBhIHNwZWNpZmllZCBkeC9keSByYXRpby5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJhY3QodGFyZ2V0KS5yZXNpemFibGUoe1xuICogICBtb2RpZmllcnM6IFtcbiAqICAgICBpbnRlcmFjdC5tb2RpZmllcnMuc25hcFNpemUoe1xuICogICAgICAgdGFyZ2V0czogWyBpbnRlcmFjdC5jcmVhdGVTbmFwR3JpZCh7IHg6IDIwLCB5OiAyMCB9KSBdLFxuICogICAgIH0pLFxuICogICAgIGludGVyYWN0LmFzcGVjdFJhdGlvKHsgcmF0aW86ICdwcmVzZXJ2ZScgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqL1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCB7IGFkZEVkZ2VzIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmVjdCdcbmltcG9ydCB7IE1vZGlmaWVyLCBNb2RpZmllck1vZHVsZSwgTW9kaWZpZXJTdGF0ZSB9IGZyb20gJy4vYmFzZSdcbmltcG9ydCBNb2RpZmljYXRpb24gZnJvbSAnLi9Nb2RpZmljYXRpb24nXG5pbXBvcnQgeyBtYWtlTW9kaWZpZXIgfSBmcm9tICcuL2Jhc2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNwZWN0UmF0aW9PcHRpb25zIHtcbiAgcmF0aW8/OiBudW1iZXIgfCAncHJlc2VydmUnXG4gIGVxdWFsRGVsdGE/OiBib29sZWFuXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW11cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgQXNwZWN0UmF0aW9TdGF0ZSA9IE1vZGlmaWVyU3RhdGU8QXNwZWN0UmF0aW9PcHRpb25zLCB7XG4gIHN0YXJ0Q29vcmRzOiBJbnRlcmFjdC5Qb2ludFxuICBzdGFydFJlY3Q6IEludGVyYWN0LlJlY3RcbiAgbGlua2VkRWRnZXM6IEludGVyYWN0LkVkZ2VPcHRpb25zXG4gIHJhdGlvOiBudW1iZXJcbiAgZXF1YWxEZWx0YTogYm9vbGVhblxuICB4SXNQcmltYXJ5QXhpczogYm9vbGVhblxuICBlZGdlU2lnbjogMSB8IC0xXG4gIHN1Yk1vZGlmaWNhdGlvbjogTW9kaWZpY2F0aW9uXG59PlxuXG5jb25zdCBhc3BlY3RSYXRpbzogTW9kaWZpZXJNb2R1bGU8QXNwZWN0UmF0aW9PcHRpb25zLCBBc3BlY3RSYXRpb1N0YXRlPiA9IHtcbiAgc3RhcnQgKGFyZykge1xuICAgIGNvbnN0IHsgc3RhdGUsIHJlY3QsIGVkZ2VzOiBvcmlnaW5hbEVkZ2VzLCBwYWdlQ29vcmRzOiBjb29yZHMgfSA9IGFyZ1xuICAgIGxldCB7IHJhdGlvIH0gPSBzdGF0ZS5vcHRpb25zXG4gICAgY29uc3QgeyBlcXVhbERlbHRhLCBtb2RpZmllcnMgfSA9IHN0YXRlLm9wdGlvbnNcblxuICAgIGlmIChyYXRpbyA9PT0gJ3ByZXNlcnZlJykge1xuICAgICAgcmF0aW8gPSByZWN0LndpZHRoIC8gcmVjdC5oZWlnaHRcbiAgICB9XG5cbiAgICBzdGF0ZS5zdGFydENvb3JkcyA9IGV4dGVuZCh7fSwgY29vcmRzKVxuICAgIHN0YXRlLnN0YXJ0UmVjdCA9IGV4dGVuZCh7fSwgcmVjdClcbiAgICBzdGF0ZS5yYXRpbyA9IHJhdGlvXG4gICAgc3RhdGUuZXF1YWxEZWx0YSA9IGVxdWFsRGVsdGFcblxuICAgIGNvbnN0IGxpbmtlZEVkZ2VzID0gc3RhdGUubGlua2VkRWRnZXMgPSB7XG4gICAgICB0b3AgICA6IG9yaWdpbmFsRWRnZXMudG9wICAgIHx8IChvcmlnaW5hbEVkZ2VzLmxlZnQgICAmJiAhb3JpZ2luYWxFZGdlcy5ib3R0b20pLFxuICAgICAgbGVmdCAgOiBvcmlnaW5hbEVkZ2VzLmxlZnQgICB8fCAob3JpZ2luYWxFZGdlcy50b3AgICAgJiYgIW9yaWdpbmFsRWRnZXMucmlnaHQpLFxuICAgICAgYm90dG9tOiBvcmlnaW5hbEVkZ2VzLmJvdHRvbSB8fCAob3JpZ2luYWxFZGdlcy5yaWdodCAgJiYgIW9yaWdpbmFsRWRnZXMudG9wKSxcbiAgICAgIHJpZ2h0IDogb3JpZ2luYWxFZGdlcy5yaWdodCAgfHwgKG9yaWdpbmFsRWRnZXMuYm90dG9tICYmICFvcmlnaW5hbEVkZ2VzLmxlZnQpLFxuICAgIH1cblxuICAgIHN0YXRlLnhJc1ByaW1hcnlBeGlzID0gISEob3JpZ2luYWxFZGdlcy5sZWZ0IHx8IG9yaWdpbmFsRWRnZXMucmlnaHQpXG5cbiAgICBpZiAoc3RhdGUuZXF1YWxEZWx0YSkge1xuICAgICAgc3RhdGUuZWRnZVNpZ24gPSAobGlua2VkRWRnZXMubGVmdCA/IDEgOiAtMSkgKiAobGlua2VkRWRnZXMudG9wID8gMSA6IC0xKSBhcyAxIHwgLTFcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZVNlY29uZGFyeUVkZ2UgPSBzdGF0ZS54SXNQcmltYXJ5QXhpcyA/IGxpbmtlZEVkZ2VzLnRvcCA6IGxpbmtlZEVkZ2VzLmxlZnRcbiAgICAgIHN0YXRlLmVkZ2VTaWduID0gbmVnYXRpdmVTZWNvbmRhcnlFZGdlID8gLTEgOiAxXG4gICAgfVxuXG4gICAgZXh0ZW5kKGFyZy5lZGdlcywgbGlua2VkRWRnZXMpXG5cbiAgICBpZiAoIW1vZGlmaWVycyB8fCAhbW9kaWZpZXJzLmxlbmd0aCkgeyByZXR1cm4gfVxuXG4gICAgY29uc3Qgc3ViTW9kaWZpY2F0aW9uID0gbmV3IE1vZGlmaWNhdGlvbihhcmcuaW50ZXJhY3Rpb24pXG5cbiAgICBzdWJNb2RpZmljYXRpb24uY29weUZyb20oYXJnLmludGVyYWN0aW9uLm1vZGlmaWNhdGlvbilcbiAgICBzdWJNb2RpZmljYXRpb24ucHJlcGFyZVN0YXRlcyhtb2RpZmllcnMpXG5cbiAgICBzdGF0ZS5zdWJNb2RpZmljYXRpb24gPSBzdWJNb2RpZmljYXRpb25cbiAgICBzdWJNb2RpZmljYXRpb24uc3RhcnRBbGwoeyAuLi5hcmcgfSlcbiAgfSxcblxuICBzZXQgKGFyZykge1xuICAgIGNvbnN0IHsgc3RhdGUsIHJlY3QsIGNvb3JkcyB9ID0gYXJnXG4gICAgY29uc3QgaW5pdGlhbENvb3JkcyA9IGV4dGVuZCh7fSwgY29vcmRzKVxuICAgIGNvbnN0IGFzcGVjdE1ldGhvZCA9IHN0YXRlLmVxdWFsRGVsdGEgPyBzZXRFcXVhbERlbHRhIDogc2V0UmF0aW9cblxuICAgIGFzcGVjdE1ldGhvZChzdGF0ZSwgc3RhdGUueElzUHJpbWFyeUF4aXMsIGNvb3JkcywgcmVjdClcblxuICAgIGlmICghc3RhdGUuc3ViTW9kaWZpY2F0aW9uKSB7IHJldHVybiBudWxsIH1cblxuICAgIGNvbnN0IGNvcnJlY3RlZFJlY3QgPSBleHRlbmQoe30sIHJlY3QpXG5cbiAgICBhZGRFZGdlcyhzdGF0ZS5saW5rZWRFZGdlcywgY29ycmVjdGVkUmVjdCwgeyB4OiBjb29yZHMueCAtIGluaXRpYWxDb29yZHMueCwgeTogY29vcmRzLnkgLSBpbml0aWFsQ29vcmRzLnkgfSlcblxuICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLnN1Yk1vZGlmaWNhdGlvbi5zZXRBbGwoe1xuICAgICAgLi4uYXJnLFxuICAgICAgcmVjdDogY29ycmVjdGVkUmVjdCxcbiAgICAgIGVkZ2VzOiBzdGF0ZS5saW5rZWRFZGdlcyxcbiAgICAgIHBhZ2VDb29yZHM6IGNvb3JkcyxcbiAgICAgIHByZXZDb29yZHM6IGNvb3JkcyxcbiAgICAgIHByZXZSZWN0OiBjb3JyZWN0ZWRSZWN0LFxuICAgIH0pXG5cbiAgICBjb25zdCB7IGRlbHRhIH0gPSByZXN1bHRcblxuICAgIGlmIChyZXN1bHQuY2hhbmdlZCkge1xuICAgICAgY29uc3QgeElzQ3JpdGljYWxBeGlzID0gTWF0aC5hYnMoZGVsdGEueCkgPiBNYXRoLmFicyhkZWx0YS55KVxuXG4gICAgICAvLyBkbyBhc3BlY3QgbW9kaWZpY2F0aW9uIGFnYWluIHdpdGggY3JpdGljYWwgZWRnZSBheGlzIGFzIHByaW1hcnlcbiAgICAgIGFzcGVjdE1ldGhvZChzdGF0ZSwgeElzQ3JpdGljYWxBeGlzLCByZXN1bHQuY29vcmRzLCByZXN1bHQucmVjdClcbiAgICAgIGV4dGVuZChjb29yZHMsIHJlc3VsdC5jb29yZHMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5ldmVudFByb3BzXG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICByYXRpbzogJ3ByZXNlcnZlJyxcbiAgICBlcXVhbERlbHRhOiBmYWxzZSxcbiAgICBtb2RpZmllcnM6IFtdLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICB9LFxufVxuXG5mdW5jdGlvbiBzZXRFcXVhbERlbHRhICh7IHN0YXJ0Q29vcmRzLCBlZGdlU2lnbiB9OiBBc3BlY3RSYXRpb1N0YXRlLCB4SXNQcmltYXJ5QXhpczogYm9vbGVhbiwgY29vcmRzOiBJbnRlcmFjdC5Qb2ludCkge1xuICBpZiAoeElzUHJpbWFyeUF4aXMpIHtcbiAgICBjb29yZHMueSA9IHN0YXJ0Q29vcmRzLnkgKyAoY29vcmRzLnggLSBzdGFydENvb3Jkcy54KSAqIGVkZ2VTaWduXG4gIH1cbiAgZWxzZSB7XG4gICAgY29vcmRzLnggPSBzdGFydENvb3Jkcy54ICsgKGNvb3Jkcy55IC0gc3RhcnRDb29yZHMueSkgKiBlZGdlU2lnblxuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJhdGlvICh7IHN0YXJ0UmVjdCwgc3RhcnRDb29yZHMsIHJhdGlvLCBlZGdlU2lnbiB9OiBBc3BlY3RSYXRpb1N0YXRlLCB4SXNQcmltYXJ5QXhpczogYm9vbGVhbiwgY29vcmRzOiBJbnRlcmFjdC5Qb2ludCwgcmVjdDogSW50ZXJhY3QuUmVjdCkge1xuICBpZiAoeElzUHJpbWFyeUF4aXMpIHtcbiAgICBjb25zdCBuZXdIZWlnaHQgPSByZWN0LndpZHRoIC8gcmF0aW9cblxuICAgIGNvb3Jkcy55ID0gc3RhcnRDb29yZHMueSArIChuZXdIZWlnaHQgLSBzdGFydFJlY3QuaGVpZ2h0KSAqIGVkZ2VTaWduXG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc3QgbmV3V2lkdGggPSByZWN0LmhlaWdodCAqIHJhdGlvXG5cbiAgICBjb29yZHMueCA9IHN0YXJ0Q29vcmRzLnggKyAobmV3V2lkdGggLSBzdGFydFJlY3Qud2lkdGgpICogZWRnZVNpZ25cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIoYXNwZWN0UmF0aW8sICdhc3BlY3RSYXRpbycpXG5leHBvcnQgeyBhc3BlY3RSYXRpbyB9XG4iLCJpbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0ICogYXMgcmVjdFV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JlY3QnXG5pbXBvcnQgeyBNb2RpZmllckFyZywgTW9kaWZpZXJNb2R1bGUsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdHJpY3RPcHRpb25zIHtcbiAgLy8gd2hlcmUgdG8gZHJhZyBvdmVyXG4gIHJlc3RyaWN0aW9uOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbbnVtYmVyLCBudW1iZXIsIEludGVyYWN0LkludGVyYWN0aW9uXT5cbiAgLy8gd2hhdCBwYXJ0IG9mIHNlbGYgaXMgYWxsb3dlZCB0byBkcmFnIG92ZXJcbiAgZWxlbWVudFJlY3Q6IEludGVyYWN0LlJlY3RcbiAgb2Zmc2V0OiBJbnRlcmFjdC5SZWN0XG4gIC8vIHJlc3RyaWN0IGp1c3QgYmVmb3JlIHRoZSBlbmQgZHJhZ1xuICBlbmRPbmx5OiBib29sZWFuXG4gIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0U3RhdGUgPSBNb2RpZmllclN0YXRlPFJlc3RyaWN0T3B0aW9ucywge1xuICBvZmZzZXQ6IEludGVyYWN0LlJlY3Rcbn0+XG5cbmZ1bmN0aW9uIHN0YXJ0ICh7IHJlY3QsIHN0YXJ0T2Zmc2V0LCBzdGF0ZSwgaW50ZXJhY3Rpb24sIHBhZ2VDb29yZHMgfTogTW9kaWZpZXJBcmc8UmVzdHJpY3RTdGF0ZT4pIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBjb25zdCB7IGVsZW1lbnRSZWN0IH0gPSBvcHRpb25zXG4gIGNvbnN0IG9mZnNldDogSW50ZXJhY3QuUmVjdCA9IGV4dGVuZCh7XG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICB9LCBvcHRpb25zLm9mZnNldCB8fCB7fSlcblxuICBpZiAocmVjdCAmJiBlbGVtZW50UmVjdCkge1xuICAgIGNvbnN0IHJlc3RyaWN0aW9uID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMucmVzdHJpY3Rpb24sIGludGVyYWN0aW9uLCBwYWdlQ29vcmRzKVxuXG4gICAgaWYgKHJlc3RyaWN0aW9uKSB7XG4gICAgICBjb25zdCB3aWR0aERpZmYgPSAocmVzdHJpY3Rpb24ucmlnaHQgLSByZXN0cmljdGlvbi5sZWZ0KSAtIHJlY3Qud2lkdGhcbiAgICAgIGNvbnN0IGhlaWdodERpZmYgPSAocmVzdHJpY3Rpb24uYm90dG9tIC0gcmVzdHJpY3Rpb24udG9wKSAtIHJlY3QuaGVpZ2h0XG5cbiAgICAgIGlmICh3aWR0aERpZmYgPCAwKSB7XG4gICAgICAgIG9mZnNldC5sZWZ0ICs9IHdpZHRoRGlmZlxuICAgICAgICBvZmZzZXQucmlnaHQgKz0gd2lkdGhEaWZmXG4gICAgICB9XG4gICAgICBpZiAoaGVpZ2h0RGlmZiA8IDApIHtcbiAgICAgICAgb2Zmc2V0LnRvcCArPSBoZWlnaHREaWZmXG4gICAgICAgIG9mZnNldC5ib3R0b20gKz0gaGVpZ2h0RGlmZlxuICAgICAgfVxuICAgIH1cblxuICAgIG9mZnNldC5sZWZ0ICs9IHN0YXJ0T2Zmc2V0LmxlZnQgLSAocmVjdC53aWR0aCAgKiBlbGVtZW50UmVjdC5sZWZ0KVxuICAgIG9mZnNldC50b3AgICs9IHN0YXJ0T2Zmc2V0LnRvcCAgLSAocmVjdC5oZWlnaHQgKiBlbGVtZW50UmVjdC50b3ApXG5cbiAgICBvZmZzZXQucmlnaHQgICs9IHN0YXJ0T2Zmc2V0LnJpZ2h0ICAtIChyZWN0LndpZHRoICAqICgxIC0gZWxlbWVudFJlY3QucmlnaHQpKVxuICAgIG9mZnNldC5ib3R0b20gKz0gc3RhcnRPZmZzZXQuYm90dG9tIC0gKHJlY3QuaGVpZ2h0ICogKDEgLSBlbGVtZW50UmVjdC5ib3R0b20pKVxuICB9XG5cbiAgc3RhdGUub2Zmc2V0ID0gb2Zmc2V0XG59XG5cbmZ1bmN0aW9uIHNldCAoeyBjb29yZHMsIGludGVyYWN0aW9uLCBzdGF0ZSB9OiBNb2RpZmllckFyZzxSZXN0cmljdFN0YXRlPikge1xuICBjb25zdCB7IG9wdGlvbnMsIG9mZnNldCB9ID0gc3RhdGVcblxuICBjb25zdCByZXN0cmljdGlvbiA9IGdldFJlc3RyaWN0aW9uUmVjdChvcHRpb25zLnJlc3RyaWN0aW9uLCBpbnRlcmFjdGlvbiwgY29vcmRzKVxuXG4gIGlmICghcmVzdHJpY3Rpb24pIHsgcmV0dXJuIH1cblxuICBjb25zdCByZWN0ID0gcmVjdFV0aWxzLnh5d2hUb1RsYnIocmVzdHJpY3Rpb24pXG5cbiAgY29vcmRzLnggPSBNYXRoLm1heChNYXRoLm1pbihyZWN0LnJpZ2h0ICAtIG9mZnNldC5yaWdodCwgY29vcmRzLngpLCByZWN0LmxlZnQgKyBvZmZzZXQubGVmdClcbiAgY29vcmRzLnkgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0LmJvdHRvbSAtIG9mZnNldC5ib3R0b20sIGNvb3Jkcy55KSwgcmVjdC50b3AgICsgb2Zmc2V0LnRvcClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc3RyaWN0aW9uUmVjdCAoXG4gIHZhbHVlOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbbnVtYmVyLCBudW1iZXIsIEludGVyYWN0LkludGVyYWN0aW9uXT4sXG4gIGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgY29vcmRzPzogSW50ZXJhY3QuUG9pbnQsXG4pIHtcbiAgaWYgKGlzLmZ1bmModmFsdWUpKSB7XG4gICAgcmV0dXJuIHJlY3RVdGlscy5yZXNvbHZlUmVjdExpa2UodmFsdWUsIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudCwgW2Nvb3Jkcy54LCBjb29yZHMueSwgaW50ZXJhY3Rpb25dKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZWN0VXRpbHMucmVzb2x2ZVJlY3RMaWtlKHZhbHVlLCBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLmVsZW1lbnQpXG4gIH1cbn1cblxuY29uc3QgZGVmYXVsdHM6IFJlc3RyaWN0T3B0aW9ucyA9IHtcbiAgcmVzdHJpY3Rpb246IG51bGwsXG4gIGVsZW1lbnRSZWN0OiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3Q6IE1vZGlmaWVyTW9kdWxlPFJlc3RyaWN0T3B0aW9ucywgUmVzdHJpY3RTdGF0ZT4gPSB7XG4gIHN0YXJ0LFxuICBzZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIocmVzdHJpY3QsICdyZXN0cmljdCcpXG5leHBvcnQgeyByZXN0cmljdCB9XG4iLCIvLyBUaGlzIG1vZHVsZSBhZGRzIHRoZSBvcHRpb25zLnJlc2l6ZS5yZXN0cmljdEVkZ2VzIHNldHRpbmcgd2hpY2ggc2V0cyBtaW4gYW5kXG4vLyBtYXggZm9yIHRoZSB0b3AsIGxlZnQsIGJvdHRvbSBhbmQgcmlnaHQgZWRnZXMgb2YgdGhlIHRhcmdldCBiZWluZyByZXNpemVkLlxuLy9cbi8vIGludGVyYWN0KHRhcmdldCkucmVzaXplKHtcbi8vICAgZWRnZXM6IHsgdG9wOiB0cnVlLCBsZWZ0OiB0cnVlIH0sXG4vLyAgIHJlc3RyaWN0RWRnZXM6IHtcbi8vICAgICBpbm5lcjogeyB0b3A6IDIwMCwgbGVmdDogMjAwLCByaWdodDogNDAwLCBib3R0b206IDQwMCB9LFxuLy8gICAgIG91dGVyOiB7IHRvcDogICAwLCBsZWZ0OiAgIDAsIHJpZ2h0OiA2MDAsIGJvdHRvbTogNjAwIH0sXG4vLyAgIH0sXG4vLyB9KVxuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBnZXRSZXN0cmljdGlvblJlY3QsIFJlc3RyaWN0T3B0aW9ucyB9IGZyb20gJy4vcG9pbnRlcidcblxuZXhwb3J0IGludGVyZmFjZSBSZXN0cmljdEVkZ2VzT3B0aW9ucyB7XG4gIGlubmVyOiBSZXN0cmljdE9wdGlvbnNbJ3Jlc3RyaWN0aW9uJ11cbiAgb3V0ZXI6IFJlc3RyaWN0T3B0aW9uc1sncmVzdHJpY3Rpb24nXVxuICBvZmZzZXQ/OiBSZXN0cmljdE9wdGlvbnNbJ29mZnNldCddXG4gIGVuZE9ubHk6IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgUmVzdHJpY3RFZGdlc1N0YXRlID0gTW9kaWZpZXJTdGF0ZTxSZXN0cmljdEVkZ2VzT3B0aW9ucywge1xuICBpbm5lcjogSW50ZXJhY3QuUmVjdFxuICBvdXRlcjogSW50ZXJhY3QuUmVjdFxuICBvZmZzZXQ6IFJlc3RyaWN0RWRnZXNPcHRpb25zWydvZmZzZXQnXVxufT5cblxuY29uc3Qgbm9Jbm5lciA9IHsgdG9wOiArSW5maW5pdHksIGxlZnQ6ICtJbmZpbml0eSwgYm90dG9tOiAtSW5maW5pdHksIHJpZ2h0OiAtSW5maW5pdHkgfVxuY29uc3Qgbm9PdXRlciA9IHsgdG9wOiAtSW5maW5pdHksIGxlZnQ6IC1JbmZpbml0eSwgYm90dG9tOiArSW5maW5pdHksIHJpZ2h0OiArSW5maW5pdHkgfVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpbnRlcmFjdGlvbiwgc3RhcnRPZmZzZXQsIHN0YXRlIH06IE1vZGlmaWVyQXJnPFJlc3RyaWN0RWRnZXNTdGF0ZT4pIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBsZXQgb2Zmc2V0XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBjb25zdCBvZmZzZXRSZWN0ID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMub2Zmc2V0LCBpbnRlcmFjdGlvbiwgaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UpXG5cbiAgICBvZmZzZXQgPSByZWN0VXRpbHMucmVjdFRvWFkob2Zmc2V0UmVjdClcbiAgfVxuXG4gIG9mZnNldCA9IG9mZnNldCB8fCB7IHg6IDAsIHk6IDAgfVxuXG4gIHN0YXRlLm9mZnNldCA9IHtcbiAgICB0b3A6ICAgIG9mZnNldC55ICsgc3RhcnRPZmZzZXQudG9wLFxuICAgIGxlZnQ6ICAgb2Zmc2V0LnggKyBzdGFydE9mZnNldC5sZWZ0LFxuICAgIGJvdHRvbTogb2Zmc2V0LnkgLSBzdGFydE9mZnNldC5ib3R0b20sXG4gICAgcmlnaHQ6ICBvZmZzZXQueCAtIHN0YXJ0T2Zmc2V0LnJpZ2h0LFxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCAoeyBjb29yZHMsIGVkZ2VzLCBpbnRlcmFjdGlvbiwgc3RhdGUgfTogTW9kaWZpZXJBcmc8UmVzdHJpY3RFZGdlc1N0YXRlPikge1xuICBjb25zdCB7IG9mZnNldCwgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYWdlID0gZXh0ZW5kKHt9LCBjb29yZHMpXG4gIGNvbnN0IGlubmVyID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMuaW5uZXIsIGludGVyYWN0aW9uLCBwYWdlKSB8fCB7fSBhcyBJbnRlcmFjdC5SZWN0XG4gIGNvbnN0IG91dGVyID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMub3V0ZXIsIGludGVyYWN0aW9uLCBwYWdlKSB8fCB7fSBhcyBJbnRlcmFjdC5SZWN0XG5cbiAgZml4UmVjdChpbm5lciwgbm9Jbm5lcilcbiAgZml4UmVjdChvdXRlciwgbm9PdXRlcilcblxuICBpZiAoZWRnZXMudG9wKSB7XG4gICAgY29vcmRzLnkgPSBNYXRoLm1pbihNYXRoLm1heChvdXRlci50b3AgICAgKyBvZmZzZXQudG9wLCAgICBwYWdlLnkpLCBpbm5lci50b3AgICAgKyBvZmZzZXQudG9wKVxuICB9XG4gIGVsc2UgaWYgKGVkZ2VzLmJvdHRvbSkge1xuICAgIGNvb3Jkcy55ID0gTWF0aC5tYXgoTWF0aC5taW4ob3V0ZXIuYm90dG9tICsgb2Zmc2V0LmJvdHRvbSwgcGFnZS55KSwgaW5uZXIuYm90dG9tICsgb2Zmc2V0LmJvdHRvbSlcbiAgfVxuICBpZiAoZWRnZXMubGVmdCkge1xuICAgIGNvb3Jkcy54ID0gTWF0aC5taW4oTWF0aC5tYXgob3V0ZXIubGVmdCAgICsgb2Zmc2V0LmxlZnQsICAgcGFnZS54KSwgaW5uZXIubGVmdCAgICsgb2Zmc2V0LmxlZnQpXG4gIH1cbiAgZWxzZSBpZiAoZWRnZXMucmlnaHQpIHtcbiAgICBjb29yZHMueCA9IE1hdGgubWF4KE1hdGgubWluKG91dGVyLnJpZ2h0ICArIG9mZnNldC5yaWdodCwgIHBhZ2UueCksIGlubmVyLnJpZ2h0ICArIG9mZnNldC5yaWdodClcbiAgfVxufVxuXG5mdW5jdGlvbiBmaXhSZWN0IChyZWN0LCBkZWZhdWx0cykge1xuICBmb3IgKGNvbnN0IGVkZ2Ugb2YgWyd0b3AnLCAnbGVmdCcsICdib3R0b20nLCAncmlnaHQnXSkge1xuICAgIGlmICghKGVkZ2UgaW4gcmVjdCkpIHtcbiAgICAgIHJlY3RbZWRnZV0gPSBkZWZhdWx0c1tlZGdlXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWN0XG59XG5cbmNvbnN0IGRlZmF1bHRzOiBSZXN0cmljdEVkZ2VzT3B0aW9ucyA9IHtcbiAgaW5uZXI6IG51bGwsXG4gIG91dGVyOiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3RFZGdlcyA9IHtcbiAgbm9Jbm5lcixcbiAgbm9PdXRlcixcbiAgc3RhcnQsXG4gIHNldCxcbiAgZGVmYXVsdHMsXG59XG5cbmV4cG9ydCBkZWZhdWx0IG1ha2VNb2RpZmllcihyZXN0cmljdEVkZ2VzLCAncmVzdHJpY3RFZGdlcycpXG5leHBvcnQgeyByZXN0cmljdEVkZ2VzIH1cbiIsImltcG9ydCBleHRlbmQgZnJvbSAnLi4vLi4vdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IHsgcmVzdHJpY3QgfSBmcm9tICcuL3BvaW50ZXInXG5pbXBvcnQgeyBtYWtlTW9kaWZpZXIgfSBmcm9tICcuLi9iYXNlJ1xuXG5jb25zdCBkZWZhdWx0cyA9IGV4dGVuZCh7XG4gIGdldCBlbGVtZW50UmVjdCAoKSB7XG4gICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IDEsIHJpZ2h0OiAxIH1cbiAgfSxcbiAgc2V0IGVsZW1lbnRSZWN0IChfKSB7fSxcbn0sIHJlc3RyaWN0LmRlZmF1bHRzKVxuXG5jb25zdCByZXN0cmljdFJlY3QgPSB7XG4gIHN0YXJ0OiByZXN0cmljdC5zdGFydCxcbiAgc2V0OiByZXN0cmljdC5zZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIocmVzdHJpY3RSZWN0LCAncmVzdHJpY3RSZWN0JylcbmV4cG9ydCB7IHJlc3RyaWN0UmVjdCB9XG4iLCJpbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBSZXN0cmljdEVkZ2VzU3RhdGUsIHJlc3RyaWN0RWRnZXMgfSBmcm9tICcuL2VkZ2VzJ1xuaW1wb3J0IHsgZ2V0UmVzdHJpY3Rpb25SZWN0LCBSZXN0cmljdE9wdGlvbnMgfSBmcm9tICcuL3BvaW50ZXInXG5cbmNvbnN0IG5vTWluID0geyB3aWR0aDogLUluZmluaXR5LCBoZWlnaHQ6IC1JbmZpbml0eSB9XG5jb25zdCBub01heCA9IHsgd2lkdGg6ICtJbmZpbml0eSwgaGVpZ2h0OiArSW5maW5pdHkgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RyaWN0U2l6ZU9wdGlvbnMge1xuICBtaW4/OiBJbnRlcmFjdC5TaXplIHwgSW50ZXJhY3QuUG9pbnQgfCBSZXN0cmljdE9wdGlvbnNbJ3Jlc3RyaWN0aW9uJ11cbiAgbWF4PzogSW50ZXJhY3QuU2l6ZSB8IEludGVyYWN0LlBvaW50IHwgUmVzdHJpY3RPcHRpb25zWydyZXN0cmljdGlvbiddXG4gIGVuZE9ubHk6IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gc3RhcnQgKGFyZzogTW9kaWZpZXJBcmc8UmVzdHJpY3RFZGdlc1N0YXRlPikge1xuICByZXR1cm4gcmVzdHJpY3RFZGdlcy5zdGFydChhcmcpXG59XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0U2l6ZVN0YXRlID1cbiAgUmVzdHJpY3RFZGdlc1N0YXRlICYgTW9kaWZpZXJTdGF0ZTxSZXN0cmljdFNpemVPcHRpb25zICYgeyBpbm5lcjogSW50ZXJhY3QuUmVjdCwgb3V0ZXI6IEludGVyYWN0LlJlY3QgfSwge1xuICAgIG1pbjogSW50ZXJhY3QuUmVjdFxuICAgIG1heDogSW50ZXJhY3QuUmVjdFxuICB9PlxuXG5mdW5jdGlvbiBzZXQgKGFyZzogTW9kaWZpZXJBcmc8UmVzdHJpY3RTaXplU3RhdGU+KSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIHN0YXRlLCByZWN0LCBlZGdlcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtaW5TaXplID0gcmVjdFV0aWxzLnRsYnJUb1h5d2goZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMubWluIGFzIGFueSwgaW50ZXJhY3Rpb24sIGFyZy5jb29yZHMpKSB8fCBub01pblxuICBjb25zdCBtYXhTaXplID0gcmVjdFV0aWxzLnRsYnJUb1h5d2goZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMubWF4IGFzIGFueSwgaW50ZXJhY3Rpb24sIGFyZy5jb29yZHMpKSB8fCBub01heFxuXG4gIHN0YXRlLm9wdGlvbnMgPSB7XG4gICAgZW5kT25seTogb3B0aW9ucy5lbmRPbmx5LFxuICAgIGlubmVyOiBleHRlbmQoe30sIHJlc3RyaWN0RWRnZXMubm9Jbm5lciksXG4gICAgb3V0ZXI6IGV4dGVuZCh7fSwgcmVzdHJpY3RFZGdlcy5ub091dGVyKSxcbiAgfVxuXG4gIGlmIChlZGdlcy50b3ApIHtcbiAgICBzdGF0ZS5vcHRpb25zLmlubmVyLnRvcCA9IHJlY3QuYm90dG9tIC0gbWluU2l6ZS5oZWlnaHRcbiAgICBzdGF0ZS5vcHRpb25zLm91dGVyLnRvcCA9IHJlY3QuYm90dG9tIC0gbWF4U2l6ZS5oZWlnaHRcbiAgfVxuICBlbHNlIGlmIChlZGdlcy5ib3R0b20pIHtcbiAgICBzdGF0ZS5vcHRpb25zLmlubmVyLmJvdHRvbSA9IHJlY3QudG9wICsgbWluU2l6ZS5oZWlnaHRcbiAgICBzdGF0ZS5vcHRpb25zLm91dGVyLmJvdHRvbSA9IHJlY3QudG9wICsgbWF4U2l6ZS5oZWlnaHRcbiAgfVxuICBpZiAoZWRnZXMubGVmdCkge1xuICAgIHN0YXRlLm9wdGlvbnMuaW5uZXIubGVmdCA9IHJlY3QucmlnaHQgLSBtaW5TaXplLndpZHRoXG4gICAgc3RhdGUub3B0aW9ucy5vdXRlci5sZWZ0ID0gcmVjdC5yaWdodCAtIG1heFNpemUud2lkdGhcbiAgfVxuICBlbHNlIGlmIChlZGdlcy5yaWdodCkge1xuICAgIHN0YXRlLm9wdGlvbnMuaW5uZXIucmlnaHQgPSByZWN0LmxlZnQgKyBtaW5TaXplLndpZHRoXG4gICAgc3RhdGUub3B0aW9ucy5vdXRlci5yaWdodCA9IHJlY3QubGVmdCArIG1heFNpemUud2lkdGhcbiAgfVxuXG4gIHJlc3RyaWN0RWRnZXMuc2V0KGFyZylcblxuICBzdGF0ZS5vcHRpb25zID0gb3B0aW9uc1xufVxuXG5jb25zdCBkZWZhdWx0czogUmVzdHJpY3RTaXplT3B0aW9ucyA9IHtcbiAgbWluOiBudWxsLFxuICBtYXg6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3RTaXplID0ge1xuICBzdGFydCxcbiAgc2V0LFxuICBkZWZhdWx0cyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHJlc3RyaWN0U2l6ZSwgJ3Jlc3RyaWN0U2l6ZScpXG5leHBvcnQgeyByZXN0cmljdFNpemUgfVxuIiwiaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaW5kZXgnXG5pbXBvcnQgeyBNb2RpZmllckFyZywgTW9kaWZpZXJTdGF0ZSwgbWFrZU1vZGlmaWVyIH0gZnJvbSAnLi4vYmFzZSdcblxuZXhwb3J0IGludGVyZmFjZSBPZmZzZXQge1xuICB4OiBudW1iZXJcbiAgeTogbnVtYmVyXG4gIGluZGV4OiBudW1iZXJcbiAgcmVsYXRpdmVQb2ludD86IEludGVyYWN0LlBvaW50XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU25hcFBvc2l0aW9uIHtcbiAgeD86IG51bWJlclxuICB5PzogbnVtYmVyXG4gIHJhbmdlPzogbnVtYmVyXG4gIG9mZnNldD86IE9mZnNldFxuICBbaW5kZXg6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgdHlwZSBTbmFwRnVuY3Rpb24gPSAoXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sXG4gIG9mZnNldDogT2Zmc2V0LFxuICBpbmRleDogbnVtYmVyXG4pID0+IFNuYXBQb3NpdGlvblxuZXhwb3J0IHR5cGUgU25hcFRhcmdldCA9IFNuYXBQb3NpdGlvbiB8IFNuYXBGdW5jdGlvblxuZXhwb3J0IGludGVyZmFjZSBTbmFwT3B0aW9ucyB7XG4gIHRhcmdldHM6IFNuYXBUYXJnZXRbXVxuICAvLyB0YXJnZXQgcmFuZ2VcbiAgcmFuZ2U6IG51bWJlclxuICAvLyBzZWxmIHBvaW50cyBmb3Igc25hcHBpbmcuIFswLDBdID0gdG9wIGxlZnQsIFsxLDFdID0gYm90dG9tIHJpZ2h0XG4gIHJlbGF0aXZlUG9pbnRzOiBJbnRlcmFjdC5Qb2ludFtdXG4gIC8vIHN0YXJ0Q29vcmRzID0gb2Zmc2V0IHNuYXBwaW5nIGZyb20gZHJhZyBzdGFydCBwYWdlIHBvc2l0aW9uXG4gIG9mZnNldDogSW50ZXJhY3QuUG9pbnQgfCBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbSW50ZXJhY3QuSW50ZXJhY3Rpb25dPiB8ICdzdGFydENvb3JkcydcbiAgb2Zmc2V0V2l0aE9yaWdpbj86IGJvb2xlYW5cbiAgb3JpZ2luOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbSW50ZXJhY3QuRWxlbWVudF0+IHwgSW50ZXJhY3QuUG9pbnRcbiAgZW5kT25seT86IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgU25hcFN0YXRlID0gTW9kaWZpZXJTdGF0ZTxTbmFwT3B0aW9ucywge1xuICBvZmZzZXRzPzogT2Zmc2V0W11cbiAgY2xvc2VzdD86IGFueVxuICB0YXJnZXRGaWVsZHM/OiBzdHJpbmdbXVtdXG59PlxuXG5mdW5jdGlvbiBzdGFydCAoYXJnOiBNb2RpZmllckFyZzxTbmFwU3RhdGU+KSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgcmVjdCwgc3RhdGUsIHN0YXJ0T2Zmc2V0IH0gPSBhcmdcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBjb25zdCBvcmlnaW4gPSBvcHRpb25zLm9mZnNldFdpdGhPcmlnaW5cbiAgICA/IGdldE9yaWdpbihhcmcpXG4gICAgOiB7IHg6IDAsIHk6IDAgfVxuXG4gIGxldCBzbmFwT2Zmc2V0OiBJbnRlcmFjdC5Qb2ludFxuXG4gIGlmIChvcHRpb25zLm9mZnNldCA9PT0gJ3N0YXJ0Q29vcmRzJykge1xuICAgIHNuYXBPZmZzZXQgPSB7XG4gICAgICB4OiBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQucGFnZS54LFxuICAgICAgeTogaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueSxcbiAgICB9XG4gIH1cbiAgZWxzZSAge1xuICAgIGNvbnN0IG9mZnNldFJlY3QgPSB1dGlscy5yZWN0LnJlc29sdmVSZWN0TGlrZShvcHRpb25zLm9mZnNldCBhcyBhbnksIGludGVyYWN0YWJsZSwgZWxlbWVudCwgW2ludGVyYWN0aW9uXSlcblxuICAgIHNuYXBPZmZzZXQgPSB1dGlscy5yZWN0LnJlY3RUb1hZKG9mZnNldFJlY3QpIHx8IHsgeDogMCwgeTogMCB9XG4gICAgc25hcE9mZnNldC54ICs9IG9yaWdpbi54XG4gICAgc25hcE9mZnNldC55ICs9IG9yaWdpbi55XG4gIH1cblxuICBjb25zdCB7IHJlbGF0aXZlUG9pbnRzIH0gPSBvcHRpb25zXG5cbiAgc3RhdGUub2Zmc2V0cyA9IHJlY3QgJiYgcmVsYXRpdmVQb2ludHMgJiYgcmVsYXRpdmVQb2ludHMubGVuZ3RoXG4gICAgPyAgcmVsYXRpdmVQb2ludHMubWFwKChyZWxhdGl2ZVBvaW50LCBpbmRleCkgPT4gKHtcbiAgICAgIGluZGV4LFxuICAgICAgcmVsYXRpdmVQb2ludCxcbiAgICAgIHg6IHN0YXJ0T2Zmc2V0LmxlZnQgLSAocmVjdC53aWR0aCAgKiByZWxhdGl2ZVBvaW50LngpICsgc25hcE9mZnNldC54LFxuICAgICAgeTogc3RhcnRPZmZzZXQudG9wICAtIChyZWN0LmhlaWdodCAqIHJlbGF0aXZlUG9pbnQueSkgKyBzbmFwT2Zmc2V0LnksXG4gICAgfSkpXG4gICAgOiBbdXRpbHMuZXh0ZW5kKHtcbiAgICAgIGluZGV4OiAwLFxuICAgICAgcmVsYXRpdmVQb2ludDogbnVsbCxcbiAgICB9LCBzbmFwT2Zmc2V0KV1cbn1cblxuZnVuY3Rpb24gc2V0IChhcmc6IE1vZGlmaWVyQXJnPFNuYXBTdGF0ZT4pIHtcbiAgY29uc3QgeyBpbnRlcmFjdGlvbiwgY29vcmRzLCBzdGF0ZSB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucywgb2Zmc2V0cyB9ID0gc3RhdGVcblxuICBjb25zdCBvcmlnaW4gPSB1dGlscy5nZXRPcmlnaW5YWShpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLmVsZW1lbnQsIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpXG4gIGNvbnN0IHBhZ2UgPSB1dGlscy5leHRlbmQoe30sIGNvb3JkcylcbiAgY29uc3QgdGFyZ2V0cyA9IFtdXG5cbiAgaWYgKCFvcHRpb25zLm9mZnNldFdpdGhPcmlnaW4pIHtcbiAgICBwYWdlLnggLT0gb3JpZ2luLnhcbiAgICBwYWdlLnkgLT0gb3JpZ2luLnlcbiAgfVxuXG4gIGZvciAoY29uc3Qgb2Zmc2V0IG9mIG9mZnNldHMpIHtcbiAgICBjb25zdCByZWxhdGl2ZVggPSBwYWdlLnggLSBvZmZzZXQueFxuICAgIGNvbnN0IHJlbGF0aXZlWSA9IHBhZ2UueSAtIG9mZnNldC55XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDAsIGxlbiA9IG9wdGlvbnMudGFyZ2V0cy5sZW5ndGg7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzbmFwVGFyZ2V0ID0gb3B0aW9ucy50YXJnZXRzW2luZGV4XVxuICAgICAgbGV0IHRhcmdldFxuXG4gICAgICBpZiAodXRpbHMuaXMuZnVuYyhzbmFwVGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0KHJlbGF0aXZlWCwgcmVsYXRpdmVZLCBpbnRlcmFjdGlvbiwgb2Zmc2V0LCBpbmRleClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0XG4gICAgICB9XG5cbiAgICAgIGlmICghdGFyZ2V0KSB7IGNvbnRpbnVlIH1cblxuICAgICAgdGFyZ2V0cy5wdXNoKHtcbiAgICAgICAgeDogKHV0aWxzLmlzLm51bWJlcih0YXJnZXQueCkgPyB0YXJnZXQueCA6IHJlbGF0aXZlWCkgKyBvZmZzZXQueCxcbiAgICAgICAgeTogKHV0aWxzLmlzLm51bWJlcih0YXJnZXQueSkgPyB0YXJnZXQueSA6IHJlbGF0aXZlWSkgKyBvZmZzZXQueSxcblxuICAgICAgICByYW5nZTogdXRpbHMuaXMubnVtYmVyKHRhcmdldC5yYW5nZSkgPyB0YXJnZXQucmFuZ2UgOiBvcHRpb25zLnJhbmdlLFxuICAgICAgICBzb3VyY2U6IHNuYXBUYXJnZXQsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBvZmZzZXQsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNsb3Nlc3QgPSB7XG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIGluUmFuZ2U6IGZhbHNlLFxuICAgIGRpc3RhbmNlOiAwLFxuICAgIHJhbmdlOiAwLFxuICAgIGRlbHRhOiB7IHg6IDAsIHk6IDAgfSxcbiAgfVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCByYW5nZSA9IHRhcmdldC5yYW5nZVxuICAgIGNvbnN0IGR4ID0gdGFyZ2V0LnggLSBwYWdlLnhcbiAgICBjb25zdCBkeSA9IHRhcmdldC55IC0gcGFnZS55XG4gICAgY29uc3QgZGlzdGFuY2UgPSB1dGlscy5oeXBvdChkeCwgZHkpXG4gICAgbGV0IGluUmFuZ2UgPSBkaXN0YW5jZSA8PSByYW5nZVxuXG4gICAgLy8gSW5maW5pdGUgdGFyZ2V0cyBjb3VudCBhcyBiZWluZyBvdXQgb2YgcmFuZ2VcbiAgICAvLyBjb21wYXJlZCB0byBub24gaW5maW5pdGUgb25lcyB0aGF0IGFyZSBpbiByYW5nZVxuICAgIGlmIChyYW5nZSA9PT0gSW5maW5pdHkgJiYgY2xvc2VzdC5pblJhbmdlICYmIGNsb3Nlc3QucmFuZ2UgIT09IEluZmluaXR5KSB7XG4gICAgICBpblJhbmdlID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIWNsb3Nlc3QudGFyZ2V0IHx8IChpblJhbmdlXG4gICAgICAvLyBpcyB0aGUgY2xvc2VzdCB0YXJnZXQgaW4gcmFuZ2U/XG4gICAgICA/IChjbG9zZXN0LmluUmFuZ2UgJiYgcmFuZ2UgIT09IEluZmluaXR5XG4gICAgICAgIC8vIHRoZSBwb2ludGVyIGlzIHJlbGF0aXZlbHkgZGVlcGVyIGluIHRoaXMgdGFyZ2V0XG4gICAgICAgID8gZGlzdGFuY2UgLyByYW5nZSA8IGNsb3Nlc3QuZGlzdGFuY2UgLyBjbG9zZXN0LnJhbmdlXG4gICAgICAgIC8vIHRoaXMgdGFyZ2V0IGhhcyBJbmZpbml0ZSByYW5nZSBhbmQgdGhlIGNsb3Nlc3QgZG9lc24ndFxuICAgICAgICA6IChyYW5nZSA9PT0gSW5maW5pdHkgJiYgY2xvc2VzdC5yYW5nZSAhPT0gSW5maW5pdHkpIHx8XG4gICAgICAgICAgLy8gT1IgdGhpcyB0YXJnZXQgaXMgY2xvc2VyIHRoYXQgdGhlIHByZXZpb3VzIGNsb3Nlc3RcbiAgICAgICAgICBkaXN0YW5jZSA8IGNsb3Nlc3QuZGlzdGFuY2UpXG4gICAgICAvLyBUaGUgb3RoZXIgaXMgbm90IGluIHJhbmdlIGFuZCB0aGUgcG9pbnRlciBpcyBjbG9zZXIgdG8gdGhpcyB0YXJnZXRcbiAgICAgIDogKCFjbG9zZXN0LmluUmFuZ2UgJiYgZGlzdGFuY2UgPCBjbG9zZXN0LmRpc3RhbmNlKSkpIHtcbiAgICAgIGNsb3Nlc3QudGFyZ2V0ID0gdGFyZ2V0XG4gICAgICBjbG9zZXN0LmRpc3RhbmNlID0gZGlzdGFuY2VcbiAgICAgIGNsb3Nlc3QucmFuZ2UgPSByYW5nZVxuICAgICAgY2xvc2VzdC5pblJhbmdlID0gaW5SYW5nZVxuICAgICAgY2xvc2VzdC5kZWx0YS54ID0gZHhcbiAgICAgIGNsb3Nlc3QuZGVsdGEueSA9IGR5XG4gICAgfVxuICB9XG5cbiAgaWYgKGNsb3Nlc3QuaW5SYW5nZSkge1xuICAgIGNvb3Jkcy54ID0gY2xvc2VzdC50YXJnZXQueFxuICAgIGNvb3Jkcy55ID0gY2xvc2VzdC50YXJnZXQueVxuICB9XG5cbiAgc3RhdGUuY2xvc2VzdCA9IGNsb3Nlc3RcbiAgcmV0dXJuIGNsb3Nlc3Rcbn1cblxuZnVuY3Rpb24gZ2V0T3JpZ2luIChhcmc6IFBhcnRpYWw8TW9kaWZpZXJBcmc8U25hcFN0YXRlPj4pIHtcbiAgY29uc3QgeyBlbGVtZW50IH0gPSBhcmcuaW50ZXJhY3Rpb25cbiAgY29uc3Qgb3B0aW9uc09yaWdpbiA9IHV0aWxzLnJlY3QucmVjdFRvWFkoXG4gICAgdXRpbHMucmVjdC5yZXNvbHZlUmVjdExpa2UoYXJnLnN0YXRlLm9wdGlvbnMub3JpZ2luIGFzIGFueSwgbnVsbCwgbnVsbCwgW2VsZW1lbnRdKSxcbiAgKVxuICBjb25zdCBvcmlnaW4gPSBvcHRpb25zT3JpZ2luIHx8IHV0aWxzLmdldE9yaWdpblhZKFxuICAgIGFyZy5pbnRlcmFjdGFibGUsXG4gICAgZWxlbWVudCxcbiAgICBhcmcuaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSxcbiAgKVxuXG4gIHJldHVybiBvcmlnaW5cbn1cblxuY29uc3QgZGVmYXVsdHM6IFNuYXBPcHRpb25zID0ge1xuICByYW5nZSAgOiBJbmZpbml0eSxcbiAgdGFyZ2V0czogbnVsbCxcbiAgb2Zmc2V0OiBudWxsLFxuICBvZmZzZXRXaXRoT3JpZ2luOiB0cnVlLFxuICBvcmlnaW46IG51bGwsXG4gIHJlbGF0aXZlUG9pbnRzOiBudWxsLFxuICBlbmRPbmx5OiBmYWxzZSxcbiAgZW5hYmxlZDogZmFsc2UsXG59XG5jb25zdCBzbmFwID0ge1xuICBzdGFydCxcbiAgc2V0LFxuICBkZWZhdWx0cyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHNuYXAsICdzbmFwJylcbmV4cG9ydCB7IHNuYXAgfVxuIiwiLy8gVGhpcyBtb2R1bGUgYWxsb3dzIHNuYXBwaW5nIG9mIHRoZSBzaXplIG9mIHRhcmdldHMgZHVyaW5nIHJlc2l6ZVxuLy8gaW50ZXJhY3Rpb25zLlxuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBTbmFwT3B0aW9ucywgU25hcFN0YXRlLCBzbmFwIH0gZnJvbSAnLi9wb2ludGVyJ1xuXG5leHBvcnQgdHlwZSBTbmFwU2l6ZU9wdGlvbnMgPSBQaWNrPFxuU25hcE9wdGlvbnMsXG4ndGFyZ2V0cycgfCAnb2Zmc2V0JyB8ICdlbmRPbmx5JyB8ICdyYW5nZScgfCAnZW5hYmxlZCdcbj5cblxuZnVuY3Rpb24gc3RhcnQgKGFyZzogTW9kaWZpZXJBcmc8U25hcFN0YXRlPikge1xuICBjb25zdCB7IHN0YXRlLCBlZGdlcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7IHJldHVybiBudWxsIH1cblxuICBhcmcuc3RhdGUgPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgdGFyZ2V0czogbnVsbCxcbiAgICAgIHJlbGF0aXZlUG9pbnRzOiBbe1xuICAgICAgICB4OiBlZGdlcy5sZWZ0ID8gMCA6IDEsXG4gICAgICAgIHk6IGVkZ2VzLnRvcCA/IDAgOiAxLFxuICAgICAgfV0sXG4gICAgICBvZmZzZXQ6IG9wdGlvbnMub2Zmc2V0IHx8ICdzZWxmJyxcbiAgICAgIG9yaWdpbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICByYW5nZTogb3B0aW9ucy5yYW5nZSxcbiAgICB9LFxuICB9XG5cbiAgc3RhdGUudGFyZ2V0RmllbGRzID0gc3RhdGUudGFyZ2V0RmllbGRzIHx8IFtcbiAgICBbJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgIFsneCcsICd5J10sXG4gIF1cblxuICBzbmFwLnN0YXJ0KGFyZylcbiAgc3RhdGUub2Zmc2V0cyA9IGFyZy5zdGF0ZS5vZmZzZXRzXG5cbiAgYXJnLnN0YXRlID0gc3RhdGVcbn1cblxuZnVuY3Rpb24gc2V0IChhcmcpIHtcbiAgY29uc3QgeyBpbnRlcmFjdGlvbiwgc3RhdGUsIGNvb3JkcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucywgb2Zmc2V0cyB9ID0gc3RhdGVcbiAgY29uc3QgcmVsYXRpdmUgPSB7XG4gICAgeDogY29vcmRzLnggLSBvZmZzZXRzWzBdLngsXG4gICAgeTogY29vcmRzLnkgLSBvZmZzZXRzWzBdLnksXG4gIH1cblxuICBzdGF0ZS5vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKVxuICBzdGF0ZS5vcHRpb25zLnRhcmdldHMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc25hcFRhcmdldCBvZiAob3B0aW9ucy50YXJnZXRzIHx8IFtdKSkge1xuICAgIGxldCB0YXJnZXRcblxuICAgIGlmIChpcy5mdW5jKHNuYXBUYXJnZXQpKSB7XG4gICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0KHJlbGF0aXZlLngsIHJlbGF0aXZlLnksIGludGVyYWN0aW9uKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRhcmdldCA9IHNuYXBUYXJnZXRcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCkgeyBjb250aW51ZSB9XG5cbiAgICBmb3IgKGNvbnN0IFt4RmllbGQsIHlGaWVsZF0gb2Ygc3RhdGUudGFyZ2V0RmllbGRzKSB7XG4gICAgICBpZiAoeEZpZWxkIGluIHRhcmdldCB8fCB5RmllbGQgaW4gdGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC54ID0gdGFyZ2V0W3hGaWVsZF1cbiAgICAgICAgdGFyZ2V0LnkgPSB0YXJnZXRbeUZpZWxkXVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGUub3B0aW9ucy50YXJnZXRzLnB1c2godGFyZ2V0KVxuICB9XG5cbiAgY29uc3QgcmV0dXJuVmFsdWUgPSBzbmFwLnNldChhcmcpXG5cbiAgc3RhdGUub3B0aW9ucyA9IG9wdGlvbnNcblxuICByZXR1cm4gcmV0dXJuVmFsdWVcbn1cblxuY29uc3QgZGVmYXVsdHM6IFNuYXBTaXplT3B0aW9ucyA9IHtcbiAgcmFuZ2U6IEluZmluaXR5LFxuICB0YXJnZXRzOiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3Qgc25hcFNpemUgPSB7XG4gIHN0YXJ0LFxuICBzZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIoc25hcFNpemUsICdzbmFwU2l6ZScpXG5leHBvcnQgeyBzbmFwU2l6ZSB9XG4iLCIvKipcbiAqIEBtb2R1bGUgbW9kaWZpZXJzL3NuYXBFZGdlc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgYWxsb3dzIHNuYXBwaW5nIG9mIHRoZSBlZGdlcyBvZiB0YXJnZXRzIGR1cmluZyByZXNpemVcbiAqIGludGVyYWN0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJhY3QodGFyZ2V0KS5yZXNpemFibGUoe1xuICogICBzbmFwRWRnZXM6IHtcbiAqICAgICB0YXJnZXRzOiBbaW50ZXJhY3Quc25hcHBlcnMuZ3JpZCh7IHg6IDEwMCwgeTogNTAgfSldLFxuICogICB9LFxuICogfSlcbiAqXG4gKiBpbnRlcmFjdCh0YXJnZXQpLnJlc2l6YWJsZSh7XG4gKiAgIHNuYXBFZGdlczoge1xuICogICAgIHRhcmdldHM6IFtcbiAqICAgICAgIGludGVyYWN0LnNuYXBwZXJzLmdyaWQoe1xuICogICAgICAgIHRvcDogNTAsXG4gKiAgICAgICAgbGVmdDogNTAsXG4gKiAgICAgICAgYm90dG9tOiAxMDAsXG4gKiAgICAgICAgcmlnaHQ6IDEwMCxcbiAqICAgICAgIH0pLFxuICogICAgIF0sXG4gKiAgIH0sXG4gKiB9KVxuICovXG5cbmltcG9ydCBjbG9uZSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9jbG9uZSdcbmltcG9ydCBleHRlbmQgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyTW9kdWxlLCBtYWtlTW9kaWZpZXIgfSBmcm9tICcuLi9iYXNlJ1xuaW1wb3J0IHsgU25hcE9wdGlvbnMsIFNuYXBTdGF0ZSB9IGZyb20gJy4vcG9pbnRlcidcbmltcG9ydCB7IHNuYXBTaXplIH0gZnJvbSAnLi9zaXplJ1xuXG5leHBvcnQgdHlwZSBTbmFwRWRnZXNPcHRpb25zID0gUGljazxTbmFwT3B0aW9ucywgJ3RhcmdldHMnIHwgJ3JhbmdlJyB8ICdvZmZzZXQnIHwgJ2VuZE9ubHknIHwgJ2VuYWJsZWQnPlxuXG5mdW5jdGlvbiBzdGFydCAoYXJnOiBNb2RpZmllckFyZzxTbmFwU3RhdGU+KSB7XG4gIGNvbnN0IHsgZWRnZXMgfSA9IGFyZ1xuXG4gIGlmICghZWRnZXMpIHsgcmV0dXJuIG51bGwgfVxuXG4gIGFyZy5zdGF0ZS50YXJnZXRGaWVsZHMgPSBhcmcuc3RhdGUudGFyZ2V0RmllbGRzIHx8IFtcbiAgICBbZWRnZXMubGVmdCA/ICdsZWZ0JyA6ICdyaWdodCcsIGVkZ2VzLnRvcCA/ICd0b3AnIDogJ2JvdHRvbSddLFxuICBdXG5cbiAgcmV0dXJuIHNuYXBTaXplLnN0YXJ0KGFyZylcbn1cblxuY29uc3Qgc25hcEVkZ2VzOiBNb2RpZmllck1vZHVsZTxTbmFwRWRnZXNPcHRpb25zLCBTbmFwU3RhdGU+ID0ge1xuICBzdGFydCxcbiAgc2V0OiBzbmFwU2l6ZS5zZXQsXG4gIGRlZmF1bHRzOiBleHRlbmQoXG4gICAgY2xvbmUoc25hcFNpemUuZGVmYXVsdHMpLFxuICAgIHtcbiAgICAgIHRhcmdldHM6IG51bGwsXG4gICAgICByYW5nZTogbnVsbCxcbiAgICAgIG9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gICAgfSBhcyBjb25zdCxcbiAgKSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHNuYXBFZGdlcywgJ3NuYXBFZGdlcycpXG5leHBvcnQgeyBzbmFwRWRnZXMgfVxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3BlY3RSYXRpbyB9IGZyb20gJy4vYXNwZWN0UmF0aW8nXG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlc3RyaWN0RWRnZXMgfSBmcm9tICcuL3Jlc3RyaWN0L2VkZ2VzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXN0cmljdCB9IGZyb20gJy4vcmVzdHJpY3QvcG9pbnRlcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVzdHJpY3RSZWN0IH0gZnJvbSAnLi9yZXN0cmljdC9yZWN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXN0cmljdFNpemUgfSBmcm9tICcuL3Jlc3RyaWN0L3NpemUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHNuYXBFZGdlcyB9IGZyb20gJy4vc25hcC9lZGdlcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc25hcCB9IGZyb20gJy4vc25hcC9wb2ludGVyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzbmFwU2l6ZSB9IGZyb20gJy4vc25hcC9zaXplJ1xuIiwiZnVuY3Rpb24gY3JlYXRlR3JpZCAoZ3JpZDogKFBhcnRpYWw8SW50ZXJhY3QuUmVjdD4gfCBJbnRlcmFjdC5Qb2ludCkgJiB7IHJhbmdlPzogbnVtYmVyLCBsaW1pdHM/OiBJbnRlcmFjdC5SZWN0LCBvZmZzZXQ/OiBJbnRlcmFjdC5Qb2ludCB9KSB7XG4gIGNvbnN0IGNvb3JkRmllbGRzID0gKFtcbiAgICBbJ3gnLCAneSddLFxuICAgIFsnbGVmdCcsICd0b3AnXSxcbiAgICBbJ3JpZ2h0JywgJ2JvdHRvbSddLFxuICAgIFsnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIF0gYXMgY29uc3QpLmZpbHRlcigoW3hGaWVsZCwgeUZpZWxkXSkgPT4geEZpZWxkIGluIGdyaWQgfHwgeUZpZWxkIGluIGdyaWQpXG5cbiAgY29uc3QgZ3JpZEZ1bmM6IEludGVyYWN0LlNuYXBGdW5jdGlvbiAmIHtcbiAgICBncmlkOiB0eXBlb2YgZ3JpZFxuICAgIGNvb3JkRmllbGRzOiB0eXBlb2YgY29vcmRGaWVsZHNcbiAgfSA9ICh4LCB5KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmFuZ2UsXG4gICAgICBsaW1pdHMgPSB7XG4gICAgICAgIGxlZnQgIDogLUluZmluaXR5LFxuICAgICAgICByaWdodCA6ICBJbmZpbml0eSxcbiAgICAgICAgdG9wICAgOiAtSW5maW5pdHksXG4gICAgICAgIGJvdHRvbTogIEluZmluaXR5LFxuICAgICAgfSxcbiAgICAgIG9mZnNldCA9IHsgeDogMCwgeTogMCB9LFxuICAgIH0gPSBncmlkXG5cbiAgICBjb25zdCByZXN1bHQ6IEludGVyYWN0LlNuYXBUYXJnZXQgJiB7XG4gICAgICBncmlkOiB0eXBlb2YgZ3JpZFxuICAgIH0gPSB7IHJhbmdlLCBncmlkLCB4OiBudWxsIGFzIG51bWJlciwgeTogbnVsbCBhcyBudW1iZXIgfVxuXG4gICAgZm9yIChjb25zdCBbeEZpZWxkLCB5RmllbGRdIG9mIGNvb3JkRmllbGRzKSB7XG4gICAgICBjb25zdCBncmlkeCA9IE1hdGgucm91bmQoKHggLSBvZmZzZXQueCkgLyAoZ3JpZCBhcyBhbnkpW3hGaWVsZF0pXG4gICAgICBjb25zdCBncmlkeSA9IE1hdGgucm91bmQoKHkgLSBvZmZzZXQueSkgLyAoZ3JpZCBhcyBhbnkpW3lGaWVsZF0pXG5cbiAgICAgIHJlc3VsdFt4RmllbGRdID0gTWF0aC5tYXgobGltaXRzLmxlZnQsIE1hdGgubWluKGxpbWl0cy5yaWdodCwgZ3JpZHggKiAoZ3JpZCBhcyBhbnkpW3hGaWVsZF0gKyBvZmZzZXQueCkpXG4gICAgICByZXN1bHRbeUZpZWxkXSA9IE1hdGgubWF4KGxpbWl0cy50b3AsIE1hdGgubWluKGxpbWl0cy5ib3R0b20sIGdyaWR5ICogKGdyaWQgYXMgYW55KVt5RmllbGRdICsgb2Zmc2V0LnkpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGdyaWRGdW5jLmdyaWQgPSBncmlkXG4gIGdyaWRGdW5jLmNvb3JkRmllbGRzID0gY29vcmRGaWVsZHNcblxuICByZXR1cm4gZ3JpZEZ1bmNcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlR3JpZFxuIiwiaW1wb3J0IGdyaWQgZnJvbSAnLi9ncmlkJ1xuXG5leHBvcnQgeyBncmlkIH1cbiIsImltcG9ydCBiYXNlIGZyb20gJy4vYmFzZSdcblxuaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vYWxsJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBzbmFwcGVycyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9zbmFwcGVycy9pbmRleCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2ludGVyYWN0L2luZGV4JyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdFN0YXRpYyB7XG4gICAgbW9kaWZpZXJzOiB0eXBlb2YgYWxsXG4gICAgc25hcHBlcnM6IHR5cGVvZiBzbmFwcGVyc1xuICAgIGNyZWF0ZVNuYXBHcmlkOiB0eXBlb2Ygc25hcHBlcnMuZ3JpZFxuICB9XG59XG5cbmNvbnN0IG1vZGlmaWVyczogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ21vZGlmaWVycycsXG4gIGluc3RhbGwgKHNjb3BlKSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdCB9ID0gc2NvcGVcblxuICAgIHNjb3BlLnVzZVBsdWdpbihiYXNlKVxuXG4gICAgaW50ZXJhY3QubW9kaWZpZXJzID0gZXh0ZW5kKGludGVyYWN0Lm1vZGlmaWVycyB8fCB7fSwgYWxsKVxuICAgIGludGVyYWN0LnNuYXBwZXJzID0gZXh0ZW5kKGludGVyYWN0LnNuYXBwZXJzIHx8IHt9LCBzbmFwcGVycylcbiAgICBpbnRlcmFjdC5jcmVhdGVTbmFwR3JpZCA9IGludGVyYWN0LnNuYXBwZXJzLmdyaWRcblxuICAgIC8vIGZvciBiYWNrd3JhZHMgY29tcGF0aWJpbGl0eVxuICAgIGZvciAoY29uc3QgdHlwZSBpbiBhbGwpIHtcbiAgICAgIGNvbnN0IHsgX2RlZmF1bHRzLCBfbWV0aG9kcyB9ID0gYWxsW3R5cGUgYXMga2V5b2YgdHlwZW9mIGFsbF1cblxuICAgICAgOyhfZGVmYXVsdHMgYXMgYW55KS5fbWV0aG9kcyA9IF9tZXRob2RzXG4gICAgICA7KHNjb3BlLmRlZmF1bHRzLnBlckFjdGlvbiBhcyBhbnkpW3R5cGVdID0gX2RlZmF1bHRzXG4gICAgfVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBtb2RpZmllcnNcbiIsImltcG9ydCBCYXNlRXZlbnQgZnJvbSAnLi4vY29yZS9CYXNlRXZlbnQnXG5pbXBvcnQgKiBhcyBwb2ludGVyVXRpbHMgZnJvbSAnLi4vdXRpbHMvcG9pbnRlclV0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2ludGVyRXZlbnQ8VCBleHRlbmRzIHN0cmluZyA9IGFueT4gZXh0ZW5kcyBCYXNlRXZlbnQge1xuICB0eXBlOiBUXG4gIG9yaWdpbmFsRXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGVcbiAgcG9pbnRlcklkOiBudW1iZXJcbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuICBkb3VibGU6IGJvb2xlYW5cbiAgcGFnZVg6IG51bWJlclxuICBwYWdlWTogbnVtYmVyXG4gIGNsaWVudFg6IG51bWJlclxuICBjbGllbnRZOiBudW1iZXJcbiAgZHQ6IG51bWJlclxuICBldmVudGFibGU6IGFueVxuICBba2V5OiBzdHJpbmddOiBhbnlcblxuICAvKiogKi9cbiAgY29uc3RydWN0b3IgKFxuICAgIHR5cGU6IFQsXG4gICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PixcbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsXG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICAgIHRpbWVTdGFtcDogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcihpbnRlcmFjdGlvbilcbiAgICBwb2ludGVyVXRpbHMucG9pbnRlckV4dGVuZCh0aGlzLCBldmVudClcblxuICAgIGlmIChldmVudCAhPT0gcG9pbnRlcikge1xuICAgICAgcG9pbnRlclV0aWxzLnBvaW50ZXJFeHRlbmQodGhpcywgcG9pbnRlcilcbiAgICB9XG5cbiAgICB0aGlzLnRpbWVTdGFtcCAgICAgPSB0aW1lU3RhbXBcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBldmVudFxuICAgIHRoaXMudHlwZSAgICAgICAgICA9IHR5cGVcbiAgICB0aGlzLnBvaW50ZXJJZCAgICAgPSBwb2ludGVyVXRpbHMuZ2V0UG9pbnRlcklkKHBvaW50ZXIpXG4gICAgdGhpcy5wb2ludGVyVHlwZSAgID0gcG9pbnRlclV0aWxzLmdldFBvaW50ZXJUeXBlKHBvaW50ZXIpXG4gICAgdGhpcy50YXJnZXQgICAgICAgID0gZXZlbnRUYXJnZXRcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsXG5cbiAgICBpZiAodHlwZSA9PT0gJ3RhcCcpIHtcbiAgICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IGludGVyYWN0aW9uLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuICAgICAgdGhpcy5kdCA9IHRoaXMudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XS5kb3duVGltZVxuXG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24udGFwVGltZVxuXG4gICAgICB0aGlzLmRvdWJsZSA9ICEhKGludGVyYWN0aW9uLnByZXZUYXAgJiZcbiAgICAgICAgaW50ZXJhY3Rpb24ucHJldlRhcC50eXBlICE9PSAnZG91YmxldGFwJyAmJlxuICAgICAgICBpbnRlcmFjdGlvbi5wcmV2VGFwLnRhcmdldCA9PT0gdGhpcy50YXJnZXQgJiZcbiAgICAgICAgaW50ZXJ2YWwgPCA1MDApXG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdkb3VibGV0YXAnKSB7XG4gICAgICB0aGlzLmR0ID0gKHBvaW50ZXIgYXMgUG9pbnRlckV2ZW50PCd0YXAnPikudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24udGFwVGltZVxuICAgIH1cbiAgfVxuXG4gIF9zdWJ0cmFjdE9yaWdpbiAoeyB4OiBvcmlnaW5YLCB5OiBvcmlnaW5ZIH06IEludGVyYWN0LlBvaW50KSB7XG4gICAgdGhpcy5wYWdlWCAgIC09IG9yaWdpblhcbiAgICB0aGlzLnBhZ2VZICAgLT0gb3JpZ2luWVxuICAgIHRoaXMuY2xpZW50WCAtPSBvcmlnaW5YXG4gICAgdGhpcy5jbGllbnRZIC09IG9yaWdpbllcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBfYWRkT3JpZ2luICh7IHg6IG9yaWdpblgsIHk6IG9yaWdpblkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgICB0aGlzLnBhZ2VYICAgKz0gb3JpZ2luWFxuICAgIHRoaXMucGFnZVkgICArPSBvcmlnaW5ZXG4gICAgdGhpcy5jbGllbnRYICs9IG9yaWdpblhcbiAgICB0aGlzLmNsaWVudFkgKz0gb3JpZ2luWVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgb3JpZ2luYWwgRXZlbnRcbiAgICovXG4gIHByZXZlbnREZWZhdWx0ICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG59XG5cbmV4cG9ydCB7IFBvaW50ZXJFdmVudCB9XG4iLCJpbXBvcnQgeyBQZXJBY3Rpb25EZWZhdWx0cyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgRXZlbnRhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvRXZlbnRhYmxlJ1xuaW1wb3J0IEludGVyYWN0aW9uIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBQb2ludGVyRXZlbnQgZnJvbSAnLi9Qb2ludGVyRXZlbnQnXG5cbmV4cG9ydCB0eXBlIEV2ZW50VGFyZ2V0TGlzdCA9IEFycmF5PHtcbiAgbm9kZTogTm9kZVxuICBldmVudGFibGU6IEV2ZW50YWJsZVxuICBwcm9wczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufT5cblxuZXhwb3J0IGludGVyZmFjZSBQb2ludGVyRXZlbnRPcHRpb25zIGV4dGVuZHMgUGVyQWN0aW9uRGVmYXVsdHMge1xuICBlbmFibGVkPzogdW5kZWZpbmVkIC8vIG5vdCB1c2VkXG4gIGhvbGREdXJhdGlvbj86IG51bWJlclxuICBpZ25vcmVGcm9tPzogYW55XG4gIGFsbG93RnJvbT86IGFueVxuICBvcmlnaW4/OiBJbnRlcmFjdC5Qb2ludCB8IHN0cmluZyB8IEludGVyYWN0LkVsZW1lbnRcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNjb3BlIHtcbiAgICBwb2ludGVyRXZlbnRzOiB0eXBlb2YgcG9pbnRlckV2ZW50c1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgcHJldlRhcD86IFBvaW50ZXJFdmVudDxzdHJpbmc+XG4gICAgdGFwVGltZT86IG51bWJlclxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL1BvaW50ZXJJbmZvJyB7XG4gIGludGVyZmFjZSBQb2ludGVySW5mbyB7XG4gICAgaG9sZD86IHtcbiAgICAgIGR1cmF0aW9uOiBudW1iZXJcbiAgICAgIHRpbWVvdXQ6IGFueVxuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xuICAgIHBvaW50ZXJFdmVudHM6IEludGVyYWN0Lk9wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ3BvaW50ZXJFdmVudHM6bmV3JzogeyBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+IH1cbiAgICAncG9pbnRlckV2ZW50czpmaXJlZCc6IHtcbiAgICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblxuICAgICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICAgICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICAgICAgZXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gICAgICBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICB0YXJnZXRzPzogRXZlbnRUYXJnZXRMaXN0XG4gICAgICB0eXBlOiBzdHJpbmdcbiAgICB9XG4gICAgJ3BvaW50ZXJFdmVudHM6Y29sbGVjdC10YXJnZXRzJzoge1xuICAgICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uXG4gICAgICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgICAgIHRhcmdldHM/OiBFdmVudFRhcmdldExpc3RcbiAgICAgIHR5cGU6IHN0cmluZ1xuICAgICAgcGF0aDogTm9kZVtdXG4gICAgICBub2RlOiBudWxsXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlZmF1bHRzOiBQb2ludGVyRXZlbnRPcHRpb25zID0ge1xuICBob2xkRHVyYXRpb246IDYwMCxcbiAgaWdub3JlRnJvbSAgOiBudWxsLFxuICBhbGxvd0Zyb20gICA6IG51bGwsXG4gIG9yaWdpbiAgICAgIDogeyB4OiAwLCB5OiAwIH0sXG59XG5cbmNvbnN0IHBvaW50ZXJFdmVudHMgPSB7XG4gIGlkOiAncG9pbnRlci1ldmVudHMvYmFzZScsXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogYWRkSW50ZXJhY3Rpb25Qcm9wcyxcbiAgICAnaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJzogYWRkSG9sZEluZm8sXG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogbW92ZUFuZENsZWFySG9sZCxcbiAgICAnaW50ZXJhY3Rpb25zOmRvd24nOiAoYXJnLCBzY29wZSkgPT4ge1xuICAgICAgZG93bkFuZFN0YXJ0SG9sZChhcmcsIHNjb3BlKVxuICAgICAgZmlyZShhcmcsIHNjb3BlKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczp1cCc6IChhcmcsIHNjb3BlKSA9PiB7XG4gICAgICBjbGVhckhvbGQoYXJnKVxuICAgICAgZmlyZShhcmcsIHNjb3BlKVxuICAgICAgdGFwQWZ0ZXJVcChhcmcsIHNjb3BlKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczpjYW5jZWwnOiAoYXJnLCBzY29wZSkgPT4ge1xuICAgICAgY2xlYXJIb2xkKGFyZylcbiAgICAgIGZpcmUoYXJnLCBzY29wZSlcbiAgICB9LFxuICB9LFxuICBQb2ludGVyRXZlbnQsXG4gIGZpcmUsXG4gIGNvbGxlY3RFdmVudFRhcmdldHMsXG4gIGRlZmF1bHRzLFxuICB0eXBlczoge1xuICAgIGRvd246IHRydWUsXG4gICAgbW92ZTogdHJ1ZSxcbiAgICB1cDogdHJ1ZSxcbiAgICBjYW5jZWw6IHRydWUsXG4gICAgdGFwOiB0cnVlLFxuICAgIGRvdWJsZXRhcDogdHJ1ZSxcbiAgICBob2xkOiB0cnVlLFxuICB9IGFzIHsgW3R5cGU6IHN0cmluZ106IHRydWUgfSxcbn1cblxuZnVuY3Rpb24gZmlyZTxUIGV4dGVuZHMgc3RyaW5nPiAoXG4gIGFyZzoge1xuICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIHwgUG9pbnRlckV2ZW50PGFueT5cbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgZXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uXG4gICAgdHlwZTogVFxuICAgIHRhcmdldHM/OiBFdmVudFRhcmdldExpc3RcbiAgfSxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlcmFjdGlvbixcbiAgICBwb2ludGVyLFxuICAgIGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0LFxuICAgIHR5cGUsXG4gICAgdGFyZ2V0cyA9IGNvbGxlY3RFdmVudFRhcmdldHMoYXJnLCBzY29wZSksXG4gIH0gPSBhcmdcblxuICBjb25zdCBwb2ludGVyRXZlbnQgPSBuZXcgUG9pbnRlckV2ZW50KHR5cGUsIHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgaW50ZXJhY3Rpb24sIHNjb3BlLm5vdygpKVxuXG4gIHNjb3BlLmZpcmUoJ3BvaW50ZXJFdmVudHM6bmV3JywgeyBwb2ludGVyRXZlbnQgfSlcblxuICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgaW50ZXJhY3Rpb24sXG4gICAgcG9pbnRlcixcbiAgICBldmVudCxcbiAgICBldmVudFRhcmdldCxcbiAgICB0YXJnZXRzLFxuICAgIHR5cGUsXG4gICAgcG9pbnRlckV2ZW50LFxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0c1tpXVxuXG4gICAgZm9yIChjb25zdCBwcm9wIGluIHRhcmdldC5wcm9wcyB8fCB7fSkge1xuICAgICAgKHBvaW50ZXJFdmVudCBhcyBhbnkpW3Byb3BdID0gdGFyZ2V0LnByb3BzW3Byb3BdXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luID0gdXRpbHMuZ2V0T3JpZ2luWFkodGFyZ2V0LmV2ZW50YWJsZSwgdGFyZ2V0Lm5vZGUpXG5cbiAgICBwb2ludGVyRXZlbnQuX3N1YnRyYWN0T3JpZ2luKG9yaWdpbilcbiAgICBwb2ludGVyRXZlbnQuZXZlbnRhYmxlID0gdGFyZ2V0LmV2ZW50YWJsZVxuICAgIHBvaW50ZXJFdmVudC5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0Lm5vZGVcblxuICAgIHRhcmdldC5ldmVudGFibGUuZmlyZShwb2ludGVyRXZlbnQpXG5cbiAgICBwb2ludGVyRXZlbnQuX2FkZE9yaWdpbihvcmlnaW4pXG5cbiAgICBpZiAocG9pbnRlckV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCB8fFxuICAgICAgICAocG9pbnRlckV2ZW50LnByb3BhZ2F0aW9uU3RvcHBlZCAmJlxuICAgICAgICAgICAgKGkgKyAxKSA8IHRhcmdldHMubGVuZ3RoICYmIHRhcmdldHNbaSArIDFdLm5vZGUgIT09IHBvaW50ZXJFdmVudC5jdXJyZW50VGFyZ2V0KSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBzY29wZS5maXJlKCdwb2ludGVyRXZlbnRzOmZpcmVkJywgc2lnbmFsQXJnKVxuXG4gIGlmICh0eXBlID09PSAndGFwJykge1xuICAgIC8vIGlmIHBvaW50ZXJFdmVudCBzaG91bGQgbWFrZSBhIGRvdWJsZSB0YXAsIGNyZWF0ZSBhbmQgZmlyZSBhIGRvdWJsZXRhcFxuICAgIC8vIFBvaW50ZXJFdmVudCBhbmQgdXNlIHRoYXQgYXMgdGhlIHByZXZUYXBcbiAgICBjb25zdCBwcmV2VGFwID0gcG9pbnRlckV2ZW50LmRvdWJsZVxuICAgICAgPyBmaXJlKHtcbiAgICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICAgIHBvaW50ZXIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgdHlwZTogJ2RvdWJsZXRhcCcsXG4gICAgICB9LCBzY29wZSlcbiAgICAgIDogcG9pbnRlckV2ZW50XG5cbiAgICBpbnRlcmFjdGlvbi5wcmV2VGFwID0gcHJldlRhcFxuICAgIGludGVyYWN0aW9uLnRhcFRpbWUgPSBwcmV2VGFwLnRpbWVTdGFtcFxuICB9XG5cbiAgcmV0dXJuIHBvaW50ZXJFdmVudFxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RXZlbnRUYXJnZXRzPFQgZXh0ZW5kcyBzdHJpbmc+ICh7IGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHR5cGUgfToge1xuICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb25cbiAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldFxuICB0eXBlOiBUXG59LCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgY29uc3QgcG9pbnRlckluZGV4ID0gaW50ZXJhY3Rpb24uZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG4gIGNvbnN0IHBvaW50ZXJJbmZvID0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XVxuXG4gIC8vIGRvIG5vdCBmaXJlIGEgdGFwIGV2ZW50IGlmIHRoZSBwb2ludGVyIHdhcyBtb3ZlZCBiZWZvcmUgYmVpbmcgbGlmdGVkXG4gIGlmICh0eXBlID09PSAndGFwJyAmJiAoaW50ZXJhY3Rpb24ucG9pbnRlcldhc01vdmVkIHx8XG4gICAgICAvLyBvciBpZiB0aGUgcG9pbnRlcnVwIHRhcmdldCBpcyBkaWZmZXJlbnQgdG8gdGhlIHBvaW50ZXJkb3duIHRhcmdldFxuICAgICAgIShwb2ludGVySW5mbyAmJiBwb2ludGVySW5mby5kb3duVGFyZ2V0ID09PSBldmVudFRhcmdldCkpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBwYXRoID0gdXRpbHMuZG9tLmdldFBhdGgoZXZlbnRUYXJnZXQgYXMgSW50ZXJhY3QuRWxlbWVudCB8IERvY3VtZW50KVxuICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgaW50ZXJhY3Rpb24sXG4gICAgcG9pbnRlcixcbiAgICBldmVudCxcbiAgICBldmVudFRhcmdldCxcbiAgICB0eXBlLFxuICAgIHBhdGgsXG4gICAgdGFyZ2V0czogW10gYXMgRXZlbnRUYXJnZXRMaXN0LFxuICAgIG5vZGU6IG51bGwsXG4gIH1cblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgcGF0aCkge1xuICAgIHNpZ25hbEFyZy5ub2RlID0gbm9kZVxuXG4gICAgc2NvcGUuZmlyZSgncG9pbnRlckV2ZW50czpjb2xsZWN0LXRhcmdldHMnLCBzaWduYWxBcmcpXG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ2hvbGQnKSB7XG4gICAgc2lnbmFsQXJnLnRhcmdldHMgPSBzaWduYWxBcmcudGFyZ2V0cy5maWx0ZXIodGFyZ2V0ID0+XG4gICAgICB0YXJnZXQuZXZlbnRhYmxlLm9wdGlvbnMuaG9sZER1cmF0aW9uID09PSBpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQuZHVyYXRpb24pXG4gIH1cblxuICByZXR1cm4gc2lnbmFsQXJnLnRhcmdldHNcbn1cblxuZnVuY3Rpb24gYWRkSW50ZXJhY3Rpb25Qcm9wcyAoeyBpbnRlcmFjdGlvbiB9KSB7XG4gIGludGVyYWN0aW9uLnByZXZUYXAgPSBudWxsICAgLy8gdGhlIG1vc3QgcmVjZW50IHRhcCBldmVudCBvbiB0aGlzIGludGVyYWN0aW9uXG4gIGludGVyYWN0aW9uLnRhcFRpbWUgPSAwICAgICAvLyB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCB0YXAgZXZlbnRcbn1cblxuZnVuY3Rpb24gYWRkSG9sZEluZm8gKHsgZG93biwgcG9pbnRlckluZm8gfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJ10pIHtcbiAgaWYgKCFkb3duICYmIHBvaW50ZXJJbmZvLmhvbGQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHBvaW50ZXJJbmZvLmhvbGQgPSB7IGR1cmF0aW9uOiBJbmZpbml0eSwgdGltZW91dDogbnVsbCB9XG59XG5cbmZ1bmN0aW9uIGNsZWFySG9sZCAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlckluZGV4IH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzW3BvaW50ZXJJbmRleF0uaG9sZCkge1xuICAgIGNsZWFyVGltZW91dChpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQudGltZW91dClcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQW5kQ2xlYXJIb2xkIChcbiAgeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBkdXBsaWNhdGUgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IHBvaW50ZXJJbmRleCA9IGludGVyYWN0aW9uLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuXG4gIGlmICghZHVwbGljYXRlICYmICghaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93biB8fCBpbnRlcmFjdGlvbi5wb2ludGVyV2FzTW92ZWQpKSB7XG4gICAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24pIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQudGltZW91dClcbiAgICB9XG5cbiAgICBmaXJlKHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgcG9pbnRlcixcbiAgICAgIGV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnQsXG4gICAgICB0eXBlOiAnbW92ZScsXG4gICAgfSwgc2NvcGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gZG93bkFuZFN0YXJ0SG9sZCAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBwb2ludGVySW5kZXggfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHRpbWVyID0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XS5ob2xkXG4gIGNvbnN0IHBhdGggPSB1dGlscy5kb20uZ2V0UGF0aChldmVudFRhcmdldCBhcyBJbnRlcmFjdC5FbGVtZW50IHwgRG9jdW1lbnQpXG4gIGNvbnN0IHNpZ25hbEFyZyA9IHtcbiAgICBpbnRlcmFjdGlvbixcbiAgICBwb2ludGVyLFxuICAgIGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0LFxuICAgIHR5cGU6ICdob2xkJyxcbiAgICB0YXJnZXRzOiBbXSBhcyBFdmVudFRhcmdldExpc3QsXG4gICAgcGF0aCxcbiAgICBub2RlOiBudWxsLFxuICB9XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIHBhdGgpIHtcbiAgICBzaWduYWxBcmcubm9kZSA9IG5vZGVcblxuICAgIHNjb3BlLmZpcmUoJ3BvaW50ZXJFdmVudHM6Y29sbGVjdC10YXJnZXRzJywgc2lnbmFsQXJnKVxuICB9XG5cbiAgaWYgKCFzaWduYWxBcmcudGFyZ2V0cy5sZW5ndGgpIHsgcmV0dXJuIH1cblxuICBsZXQgbWluRHVyYXRpb24gPSBJbmZpbml0eVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHNpZ25hbEFyZy50YXJnZXRzKSB7XG4gICAgY29uc3QgaG9sZER1cmF0aW9uID0gdGFyZ2V0LmV2ZW50YWJsZS5vcHRpb25zLmhvbGREdXJhdGlvblxuXG4gICAgaWYgKGhvbGREdXJhdGlvbiA8IG1pbkR1cmF0aW9uKSB7XG4gICAgICBtaW5EdXJhdGlvbiA9IGhvbGREdXJhdGlvblxuICAgIH1cbiAgfVxuXG4gIHRpbWVyLmR1cmF0aW9uID0gbWluRHVyYXRpb25cbiAgdGltZXIudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGZpcmUoe1xuICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHBvaW50ZXIsXG4gICAgICBldmVudCxcbiAgICAgIHR5cGU6ICdob2xkJyxcbiAgICB9LCBzY29wZSlcbiAgfSwgbWluRHVyYXRpb24pXG59XG5cbmZ1bmN0aW9uIHRhcEFmdGVyVXAgKHsgaW50ZXJhY3Rpb24sIHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCB9OiBJbnRlcmFjdC5TaWduYWxBcmdzWydpbnRlcmFjdGlvbnM6dXAnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGlmICghaW50ZXJhY3Rpb24ucG9pbnRlcldhc01vdmVkKSB7XG4gICAgZmlyZSh7IGludGVyYWN0aW9uLCBldmVudFRhcmdldCwgcG9pbnRlciwgZXZlbnQsIHR5cGU6ICd0YXAnIH0sIHNjb3BlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBzY29wZS5wb2ludGVyRXZlbnRzID0gcG9pbnRlckV2ZW50c1xuICBzY29wZS5kZWZhdWx0cy5hY3Rpb25zLnBvaW50ZXJFdmVudHMgPSBwb2ludGVyRXZlbnRzLmRlZmF1bHRzXG4gIHV0aWxzLmV4dGVuZChzY29wZS5hY3Rpb25zLnBoYXNlbGVzc1R5cGVzLCBwb2ludGVyRXZlbnRzLnR5cGVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCBwb2ludGVyRXZlbnRzXG4iLCJpbXBvcnQgeyBMaXN0ZW5lck1hcCB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgYmFzZVBsdWdpbiBmcm9tICcuL2Jhc2UnXG5pbXBvcnQgUG9pbnRlckV2ZW50IGZyb20gJy4vUG9pbnRlckV2ZW50J1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIGhvbGRJbnRlcnZhbEhhbmRsZT86IGFueVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9wb2ludGVyLWV2ZW50cy9Qb2ludGVyRXZlbnQnIHtcbiAgaW50ZXJmYWNlIFBvaW50ZXJFdmVudDxUIGV4dGVuZHMgc3RyaW5nID0gYW55PiB7XG4gICAgY291bnQ/OiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvYmFzZScge1xuICBpbnRlcmZhY2UgUG9pbnRlckV2ZW50T3B0aW9ucyB7XG4gICAgaG9sZFJlcGVhdEludGVydmFsPzogbnVtYmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIHNjb3BlLnVzZVBsdWdpbihiYXNlUGx1Z2luKVxuXG4gIGNvbnN0IHtcbiAgICBwb2ludGVyRXZlbnRzLFxuICB9ID0gc2NvcGVcblxuICAvLyBkb24ndCByZXBlYXQgYnkgZGVmYXVsdFxuICBwb2ludGVyRXZlbnRzLmRlZmF1bHRzLmhvbGRSZXBlYXRJbnRlcnZhbCA9IDBcbiAgcG9pbnRlckV2ZW50cy50eXBlcy5ob2xkcmVwZWF0ID0gc2NvcGUuYWN0aW9ucy5waGFzZWxlc3NUeXBlcy5ob2xkcmVwZWF0ID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBvbk5ldyAoeyBwb2ludGVyRXZlbnQgfTogeyBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+IH0pIHtcbiAgaWYgKHBvaW50ZXJFdmVudC50eXBlICE9PSAnaG9sZCcpIHsgcmV0dXJuIH1cblxuICBwb2ludGVyRXZlbnQuY291bnQgPSAocG9pbnRlckV2ZW50LmNvdW50IHx8IDApICsgMVxufVxuXG5mdW5jdGlvbiBvbkZpcmVkIChcbiAgeyBpbnRlcmFjdGlvbiwgcG9pbnRlckV2ZW50LCBldmVudFRhcmdldCwgdGFyZ2V0cyB9OiBJbnRlcmFjdC5TaWduYWxBcmdzWydwb2ludGVyRXZlbnRzOmZpcmVkJ10sXG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZSxcbikge1xuICBpZiAocG9pbnRlckV2ZW50LnR5cGUgIT09ICdob2xkJyB8fCAhdGFyZ2V0cy5sZW5ndGgpIHsgcmV0dXJuIH1cblxuICAvLyBnZXQgdGhlIHJlcGVhdCBpbnRlcnZhbCBmcm9tIHRoZSBmaXJzdCBldmVudGFibGVcbiAgY29uc3QgaW50ZXJ2YWwgPSB0YXJnZXRzWzBdLmV2ZW50YWJsZS5vcHRpb25zLmhvbGRSZXBlYXRJbnRlcnZhbFxuXG4gIC8vIGRvbid0IHJlcGVhdCBpZiB0aGUgaW50ZXJ2YWwgaXMgMCBvciBsZXNzXG4gIGlmIChpbnRlcnZhbCA8PSAwKSB7IHJldHVybiB9XG5cbiAgLy8gc2V0IGEgdGltZW91dCB0byBmaXJlIHRoZSBob2xkcmVwZWF0IGV2ZW50XG4gIGludGVyYWN0aW9uLmhvbGRJbnRlcnZhbEhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHNjb3BlLnBvaW50ZXJFdmVudHMuZmlyZSh7XG4gICAgICBpbnRlcmFjdGlvbixcbiAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgdHlwZTogJ2hvbGQnLFxuICAgICAgcG9pbnRlcjogcG9pbnRlckV2ZW50LFxuICAgICAgZXZlbnQ6IHBvaW50ZXJFdmVudCxcbiAgICB9LCBzY29wZSlcbiAgfSwgaW50ZXJ2YWwpXG59XG5cbmZ1bmN0aW9uIGVuZEhvbGRSZXBlYXQgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSkge1xuICAvLyBzZXQgdGhlIGludGVyYWN0aW9uJ3MgaG9sZFN0b3BUaW1lIHByb3BlcnR5XG4gIC8vIHRvIHN0b3AgZnVydGhlciBob2xkUmVwZWF0IGV2ZW50c1xuICBpZiAoaW50ZXJhY3Rpb24uaG9sZEludGVydmFsSGFuZGxlKSB7XG4gICAgY2xlYXJJbnRlcnZhbChpbnRlcmFjdGlvbi5ob2xkSW50ZXJ2YWxIYW5kbGUpXG4gICAgaW50ZXJhY3Rpb24uaG9sZEludGVydmFsSGFuZGxlID0gbnVsbFxuICB9XG59XG5cbmNvbnN0IGhvbGRSZXBlYXQ6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdwb2ludGVyLWV2ZW50cy9ob2xkUmVwZWF0JyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiBbJ21vdmUnLCAndXAnLCAnY2FuY2VsJywgJ2VuZGFsbCddLnJlZHVjZShcbiAgICAoYWNjLCBlbmRlclR5cGVzKSA9PiB7XG4gICAgICAoYWNjIGFzIGFueSlbYHBvaW50ZXJFdmVudHM6JHtlbmRlclR5cGVzfWBdID0gZW5kSG9sZFJlcGVhdFxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sXG4gICAge1xuICAgICAgJ3BvaW50ZXJFdmVudHM6bmV3Jzogb25OZXcsXG4gICAgICAncG9pbnRlckV2ZW50czpmaXJlZCc6IG9uRmlyZWQsXG4gICAgfSBhcyBMaXN0ZW5lck1hcCxcbiAgKSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgaG9sZFJlcGVhdFxuIiwiaW1wb3J0IHsgU2NvcGUgfSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5cbnR5cGUgSW50ZXJhY3RhYmxlID0gaW1wb3J0ICgnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnKS5kZWZhdWx0XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBwb2ludGVyRXZlbnRzOiB0eXBlb2YgcG9pbnRlckV2ZW50c01ldGhvZFxuICAgIF9fYmFja0NvbXBhdE9wdGlvbjogKG9wdGlvbk5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkgPT4gYW55XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IFNjb3BlKSB7XG4gIGNvbnN0IHsgSW50ZXJhY3RhYmxlIH0gPSBzY29wZVxuXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUucG9pbnRlckV2ZW50cyA9IHBvaW50ZXJFdmVudHNNZXRob2RcblxuICBjb25zdCBfX2JhY2tDb21wYXRPcHRpb24gPSBJbnRlcmFjdGFibGUucHJvdG90eXBlLl9iYWNrQ29tcGF0T3B0aW9uXG5cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5fYmFja0NvbXBhdE9wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25OYW1lLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IHJldCA9IF9fYmFja0NvbXBhdE9wdGlvbi5jYWxsKHRoaXMsIG9wdGlvbk5hbWUsIG5ld1ZhbHVlKVxuXG4gICAgaWYgKHJldCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5ldmVudHMub3B0aW9uc1tvcHRpb25OYW1lXSA9IG5ld1ZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJFdmVudHNNZXRob2QgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9uczogYW55KSB7XG4gIGV4dGVuZCh0aGlzLmV2ZW50cy5vcHRpb25zLCBvcHRpb25zKVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmNvbnN0IHBsdWdpbjogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ3BvaW50ZXItZXZlbnRzL2ludGVyYWN0YWJsZVRhcmdldHMnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAncG9pbnRlckV2ZW50czpjb2xsZWN0LXRhcmdldHMnOiAoe1xuICAgICAgdGFyZ2V0cyxcbiAgICAgIG5vZGUsXG4gICAgICB0eXBlLFxuICAgICAgZXZlbnRUYXJnZXQsXG4gICAgfSwgc2NvcGUpID0+IHtcbiAgICAgIHNjb3BlLmludGVyYWN0YWJsZXMuZm9yRWFjaE1hdGNoKG5vZGUsIChpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSkgPT4ge1xuICAgICAgICBjb25zdCBldmVudGFibGUgPSBpbnRlcmFjdGFibGUuZXZlbnRzXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBldmVudGFibGUub3B0aW9uc1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBldmVudGFibGUudHlwZXNbdHlwZV0gJiZcbiAgICAgICAgICBldmVudGFibGUudHlwZXNbdHlwZV0ubGVuZ3RoICYmXG4gICAgICAgIGludGVyYWN0YWJsZS50ZXN0SWdub3JlQWxsb3cob3B0aW9ucywgbm9kZSwgZXZlbnRUYXJnZXQpKSB7XG4gICAgICAgICAgdGFyZ2V0cy5wdXNoKHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBldmVudGFibGUsXG4gICAgICAgICAgICBwcm9wczogeyBpbnRlcmFjdGFibGUgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3RhYmxlOm5ldyc6ICh7IGludGVyYWN0YWJsZSB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGFibGUuZXZlbnRzLmdldFJlY3QgPSBmdW5jdGlvbiAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3RhYmxlLmdldFJlY3QoZWxlbWVudClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0YWJsZTpzZXQnOiAoeyBpbnRlcmFjdGFibGUsIG9wdGlvbnMgfSwgc2NvcGUpID0+IHtcbiAgICAgIGV4dGVuZChpbnRlcmFjdGFibGUuZXZlbnRzLm9wdGlvbnMsIHNjb3BlLnBvaW50ZXJFdmVudHMuZGVmYXVsdHMpXG4gICAgICBleHRlbmQoaW50ZXJhY3RhYmxlLmV2ZW50cy5vcHRpb25zLCBvcHRpb25zLnBvaW50ZXJFdmVudHMgfHwge30pXG4gICAgfSxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcGx1Z2luXG4iLCJpbXBvcnQgKiBhcyBwb2ludGVyRXZlbnRzIGZyb20gJy4vYmFzZSdcbmltcG9ydCBob2xkUmVwZWF0IGZyb20gJy4vaG9sZFJlcGVhdCdcbmltcG9ydCBpbnRlcmFjdGFibGVUYXJnZXRzIGZyb20gJy4vaW50ZXJhY3RhYmxlVGFyZ2V0cydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ3BvaW50ZXItZXZlbnRzJyxcbiAgaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gICAgc2NvcGUudXNlUGx1Z2luKHBvaW50ZXJFdmVudHMpXG4gICAgc2NvcGUudXNlUGx1Z2luKGhvbGRSZXBlYXQpXG4gICAgc2NvcGUudXNlUGx1Z2luKGludGVyYWN0YWJsZVRhcmdldHMpXG4gIH0sXG59XG5cbmV4cG9ydCB7XG4gIHBvaW50ZXJFdmVudHMsXG4gIGhvbGRSZXBlYXQsXG4gIGludGVyYWN0YWJsZVRhcmdldHMsXG59XG4iLCJpbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IHsgQWN0aW9uUHJvcHMsIEludGVyYWN0aW9uIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbidcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9zY29wZSdcbmltcG9ydCB7IGFyciwgZXh0ZW5kLCBpcywgcG9pbnRlciBhcyBwb2ludGVyVXRpbHMsIHJlY3QgYXMgcmVjdFV0aWxzLCB3aW4gfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIHJlZmxvdzogKGFjdGlvbjogQWN0aW9uUHJvcHMpID0+IFJldHVyblR5cGU8dHlwZW9mIHJlZmxvdz5cbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIF9yZWZsb3dQcm9taXNlOiBQcm9taXNlPHZvaWQ+XG4gICAgX3JlZmxvd1Jlc29sdmU6ICgpID0+IHZvaWRcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50JyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgaW50ZXJmYWNlIFBoYXNlTWFwIHtcbiAgICByZWZsb3c/OiB0cnVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgSW50ZXJhY3RhYmxlLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS5hY3Rpb25zLnBoYXNlcy5yZWZsb3cgPSB0cnVlXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IGludGVyYWN0YWJsZSA9IGludGVyYWN0KHRhcmdldClcbiAgICogY29uc3QgZHJhZyA9IHsgbmFtZTogZHJhZywgYXhpczogJ3gnIH1cbiAgICogY29uc3QgcmVzaXplID0geyBuYW1lOiByZXNpemUsIGVkZ2VzOiB7IGxlZnQ6IHRydWUsIGJvdHRvbTogdHJ1ZSB9XG4gICAqXG4gICAqIGludGVyYWN0YWJsZS5yZWZsb3coZHJhZylcbiAgICogaW50ZXJhY3RhYmxlLnJlZmxvdyhyZXNpemUpXG4gICAqIGBgYFxuICAgKlxuICAgKiBTdGFydCBhbiBhY3Rpb24gc2VxdWVuY2UgdG8gcmUtYXBwbHkgbW9kaWZpZXJzLCBjaGVjayBkcm9wcywgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0geyBPYmplY3QgfSBhY3Rpb24gVGhlIGFjdGlvbiB0byBiZWdpblxuICAgKiBAcGFyYW0geyBzdHJpbmcgfSBhY3Rpb24ubmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG4gICAqIEByZXR1cm5zIHsgUHJvbWlzZSB9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBgSW50ZXJhY3RhYmxlYCB3aGVuIGFjdGlvbnMgb24gYWxsIHRhcmdldHMgaGF2ZSBlbmRlZFxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5yZWZsb3cgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgcmV0dXJuIHJlZmxvdyh0aGlzLCBhY3Rpb24sIHNjb3BlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlZmxvdzxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlLCBhY3Rpb246IEFjdGlvblByb3BzPFQ+LCBzY29wZTogU2NvcGUpOiBQcm9taXNlPEludGVyYWN0YWJsZT4ge1xuICBjb25zdCBlbGVtZW50cyA9IChpcy5zdHJpbmcoaW50ZXJhY3RhYmxlLnRhcmdldClcbiAgICA/IGFyci5mcm9tKGludGVyYWN0YWJsZS5fY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKGludGVyYWN0YWJsZS50YXJnZXQpKVxuICAgIDogW2ludGVyYWN0YWJsZS50YXJnZXRdKSBhcyBJbnRlcmFjdC5FbGVtZW50W11cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgdmFyaWFibGUtbmFtZVxuICBjb25zdCBQcm9taXNlID0gKHdpbi53aW5kb3cgYXMgYW55KS5Qcm9taXNlXG4gIGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlPG51bGw+PiB8IG51bGwgPSBQcm9taXNlID8gW10gOiBudWxsXG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgcmVjdCA9IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50KVxuXG4gICAgaWYgKCFyZWN0KSB7IGJyZWFrIH1cblxuICAgIGNvbnN0IHJ1bm5pbmdJbnRlcmFjdGlvbiA9IGFyci5maW5kKFxuICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QsXG4gICAgICAoaW50ZXJhY3Rpb246IEludGVyYWN0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpICYmXG4gICAgICAgICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlID09PSBpbnRlcmFjdGFibGUgJiZcbiAgICAgICAgICBpbnRlcmFjdGlvbi5lbGVtZW50ID09PSBlbGVtZW50ICYmXG4gICAgICAgICAgaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSA9PT0gYWN0aW9uLm5hbWVcbiAgICAgIH0pXG4gICAgbGV0IHJlZmxvd1Byb21pc2U6IFByb21pc2U8bnVsbD5cblxuICAgIGlmIChydW5uaW5nSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJ1bm5pbmdJbnRlcmFjdGlvbi5tb3ZlKClcblxuICAgICAgaWYgKHByb21pc2VzKSB7XG4gICAgICAgIHJlZmxvd1Byb21pc2UgPSBydW5uaW5nSW50ZXJhY3Rpb24uX3JlZmxvd1Byb21pc2UgfHwgbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgIHJ1bm5pbmdJbnRlcmFjdGlvbi5fcmVmbG93UmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB4eXdoID0gcmVjdFV0aWxzLnRsYnJUb1h5d2gocmVjdClcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgcGFnZSAgICAgOiB7IHg6IHh5d2gueCwgeTogeHl3aC55IH0sXG4gICAgICAgIGNsaWVudCAgIDogeyB4OiB4eXdoLngsIHk6IHh5d2gueSB9LFxuICAgICAgICB0aW1lU3RhbXA6IHNjb3BlLm5vdygpLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBldmVudCA9IHBvaW50ZXJVdGlscy5jb29yZHNUb0V2ZW50KGNvb3JkcylcbiAgICAgIHJlZmxvd1Byb21pc2UgPSBzdGFydFJlZmxvdzxUPihzY29wZSwgaW50ZXJhY3RhYmxlLCBlbGVtZW50LCBhY3Rpb24sIGV2ZW50KVxuICAgIH1cblxuICAgIGlmIChwcm9taXNlcykge1xuICAgICAgcHJvbWlzZXMucHVzaChyZWZsb3dQcm9taXNlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcm9taXNlcyAmJiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiBpbnRlcmFjdGFibGUpXG59XG5cbmZ1bmN0aW9uIHN0YXJ0UmVmbG93PFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiAoc2NvcGU6IFNjb3BlLCBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSwgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCwgYWN0aW9uOiBBY3Rpb25Qcm9wczxUPiwgZXZlbnQ6IGFueSkge1xuICBjb25zdCBpbnRlcmFjdGlvbiA9IHNjb3BlLmludGVyYWN0aW9ucy5uZXcoeyBwb2ludGVyVHlwZTogJ3JlZmxvdycgfSlcbiAgY29uc3Qgc2lnbmFsQXJnID0ge1xuICAgIGludGVyYWN0aW9uLFxuICAgIGV2ZW50LFxuICAgIHBvaW50ZXI6IGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0OiBlbGVtZW50LFxuICAgIHBoYXNlOiAncmVmbG93JyxcbiAgfSBhcyBjb25zdFxuXG4gIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICBpbnRlcmFjdGlvbi5lbGVtZW50ID0gZWxlbWVudFxuICBpbnRlcmFjdGlvbi5wcmVwYXJlZCA9IGV4dGVuZCh7fSwgYWN0aW9uKVxuICBpbnRlcmFjdGlvbi5wcmV2RXZlbnQgPSBldmVudFxuICBpbnRlcmFjdGlvbi51cGRhdGVQb2ludGVyKGV2ZW50LCBldmVudCwgZWxlbWVudCwgdHJ1ZSlcblxuICBpbnRlcmFjdGlvbi5fZG9QaGFzZShzaWduYWxBcmcpXG5cbiAgY29uc3QgcmVmbG93UHJvbWlzZSA9ICh3aW4ud2luZG93IGFzIHVua25vd24gYXMgYW55KS5Qcm9taXNlXG4gICAgPyBuZXcgKHdpbi53aW5kb3cgYXMgdW5rbm93biBhcyBhbnkpLlByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24uX3JlZmxvd1Jlc29sdmUgPSByZXNvbHZlXG4gICAgfSlcbiAgICA6IG51bGxcblxuICBpbnRlcmFjdGlvbi5fcmVmbG93UHJvbWlzZSA9IHJlZmxvd1Byb21pc2VcbiAgaW50ZXJhY3Rpb24uc3RhcnQoYWN0aW9uLCBpbnRlcmFjdGFibGUsIGVsZW1lbnQpXG5cbiAgaWYgKGludGVyYWN0aW9uLl9pbnRlcmFjdGluZykge1xuICAgIGludGVyYWN0aW9uLm1vdmUoc2lnbmFsQXJnKVxuICAgIGludGVyYWN0aW9uLmVuZChldmVudClcbiAgfVxuICBlbHNlIHtcbiAgICBpbnRlcmFjdGlvbi5zdG9wKClcbiAgfVxuXG4gIGludGVyYWN0aW9uLnJlbW92ZVBvaW50ZXIoZXZlbnQsIGV2ZW50KVxuICBpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duID0gZmFsc2VcblxuICByZXR1cm4gcmVmbG93UHJvbWlzZVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAncmVmbG93JyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiB7XG4gICAgLy8gcmVtb3ZlIGNvbXBsZXRlZCByZWZsb3cgaW50ZXJhY3Rpb25zXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogKHsgaW50ZXJhY3Rpb24gfSwgc2NvcGUpID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gJ3JlZmxvdycpIHtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLl9yZWZsb3dSZXNvbHZlKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX3JlZmxvd1Jlc29sdmUoKVxuICAgICAgICB9XG5cbiAgICAgICAgYXJyLnJlbW92ZShzY29wZS5pbnRlcmFjdGlvbnMubGlzdCwgaW50ZXJhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn0gYXMgSW50ZXJhY3QuUGx1Z2luXG4iLCIvKiogQG1vZHVsZSBpbnRlcmFjdCAqL1xuXG5pbXBvcnQgJ0BpbnRlcmFjdGpzL3R5cGVzL2luZGV4J1xuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IHsgaXNOb25OYXRpdmVFdmVudCwgU2NvcGUgfSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJ1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcidcbmltcG9ydCBldmVudHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXZlbnRzJ1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaW5kZXgnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgaW50ZXJhY3Q/OiBJbnRlcmFjdFN0YXRpY1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3RTdGF0aWMge1xuICAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM/OiBPcHRpb25zKTogSW50ZXJhY3RhYmxlXG4gIG9uOiB0eXBlb2Ygb25cbiAgcG9pbnRlck1vdmVUb2xlcmFuY2U6IHR5cGVvZiBwb2ludGVyTW92ZVRvbGVyYW5jZVxuICBzdG9wOiB0eXBlb2Ygc3RvcFxuICBzdXBwb3J0c1BvaW50ZXJFdmVudDogdHlwZW9mIHN1cHBvcnRzUG9pbnRlckV2ZW50XG4gIHN1cHBvcnRzVG91Y2g6IHR5cGVvZiBzdXBwb3J0c1RvdWNoXG4gIGRlYnVnOiB0eXBlb2YgZGVidWdcbiAgb2ZmOiB0eXBlb2Ygb2ZmXG4gIGlzU2V0OiB0eXBlb2YgaXNTZXRcbiAgdXNlOiB0eXBlb2YgdXNlXG4gIGdldFBvaW50ZXJBdmVyYWdlOiB0eXBlb2YgdXRpbHMucG9pbnRlci5wb2ludGVyQXZlcmFnZVxuICBnZXRUb3VjaEJCb3g6IHR5cGVvZiB1dGlscy5wb2ludGVyLnRvdWNoQkJveFxuICBnZXRUb3VjaERpc3RhbmNlOiB0eXBlb2YgdXRpbHMucG9pbnRlci50b3VjaERpc3RhbmNlXG4gIGdldFRvdWNoQW5nbGU6IHR5cGVvZiB1dGlscy5wb2ludGVyLnRvdWNoQW5nbGVcbiAgZ2V0RWxlbWVudFJlY3Q6IHR5cGVvZiB1dGlscy5kb20uZ2V0RWxlbWVudFJlY3RcbiAgZ2V0RWxlbWVudENsaWVudFJlY3Q6IHR5cGVvZiB1dGlscy5kb20uZ2V0RWxlbWVudENsaWVudFJlY3RcbiAgbWF0Y2hlc1NlbGVjdG9yOiB0eXBlb2YgdXRpbHMuZG9tLm1hdGNoZXNTZWxlY3RvclxuICBjbG9zZXN0OiB0eXBlb2YgdXRpbHMuZG9tLmNsb3Nlc3RcbiAgYWRkRG9jdW1lbnQ6IHR5cGVvZiBzY29wZS5hZGREb2N1bWVudFxuICByZW1vdmVEb2N1bWVudDogdHlwZW9mIHNjb3BlLnJlbW92ZURvY3VtZW50XG4gIGR5bmFtaWNEcm9wOiAobmV3VmFsdWU/OiBib29sZWFuKSA9PiBib29sZWFuIHwgSW50ZXJhY3QuaW50ZXJhY3RcbiAgdmVyc2lvbjogc3RyaW5nXG59XG5cbmNvbnN0IGdsb2JhbEV2ZW50czogYW55ID0ge31cbmNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKClcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKHdpbjogV2luZG93KSB7XG4gIHNjb3BlLmluaXQod2luKVxuXG4gIHJldHVybiBpbnRlcmFjdFxufVxuXG4vKipcbiAqIGBgYGpzXG4gKiBpbnRlcmFjdCgnI2RyYWdnYWJsZScpLmRyYWdnYWJsZSh0cnVlKVxuICpcbiAqIHZhciByZWN0YWJsZXMgPSBpbnRlcmFjdCgncmVjdCcpXG4gKiByZWN0YWJsZXNcbiAqICAgLmdlc3R1cmFibGUodHJ1ZSlcbiAqICAgLm9uKCdnZXN0dXJlbW92ZScsIGZ1bmN0aW9uIChldmVudCkge1xuICogICAgICAgLy8gLi4uXG4gKiAgIH0pXG4gKiBgYGBcbiAqXG4gKiBUaGUgbWV0aG9kcyBvZiB0aGlzIHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIHNldCBlbGVtZW50cyBhcyBpbnRlcmFjdGFibGVzXG4gKiBhbmQgYWxzbyB0byBjaGFuZ2UgdmFyaW91cyBkZWZhdWx0IHNldHRpbmdzLlxuICpcbiAqIENhbGxpbmcgaXQgYXMgYSBmdW5jdGlvbiBhbmQgcGFzc2luZyBhbiBlbGVtZW50IG9yIGEgdmFsaWQgQ1NTIHNlbGVjdG9yXG4gKiBzdHJpbmcgcmV0dXJucyBhbiBJbnRlcmFjdGFibGUgb2JqZWN0IHdoaWNoIGhhcyB2YXJpb3VzIG1ldGhvZHMgdG8gY29uZmlndXJlXG4gKiBpdC5cbiAqXG4gKiBAZ2xvYmFsXG4gKlxuICogQHBhcmFtIHtFbGVtZW50IHwgc3RyaW5nfSB0YXJnZXQgVGhlIEhUTUwgb3IgU1ZHIEVsZW1lbnQgdG8gaW50ZXJhY3Qgd2l0aFxuICogb3IgQ1NTIHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9XG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcmFjdDogSW50ZXJhY3RTdGF0aWMgPSBmdW5jdGlvbiBpbnRlcmFjdCAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgbGV0IGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMuZ2V0KHRhcmdldCwgb3B0aW9ucylcblxuICBpZiAoIWludGVyYWN0YWJsZSkge1xuICAgIGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMubmV3KHRhcmdldCwgb3B0aW9ucylcbiAgICBpbnRlcmFjdGFibGUuZXZlbnRzLmdsb2JhbCA9IGdsb2JhbEV2ZW50c1xuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0YWJsZVxufSBhcyBJbnRlcmFjdFN0YXRpY1xuXG4vKipcbiAqIFVzZSBhIHBsdWdpblxuICpcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3QudXNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBsdWdpblxuICogQHBhcmFtIHtmdW5jdGlvbn0gcGx1Z2luLmluc3RhbGxcbiAqIEByZXR1cm4ge2ludGVyYWN0fVxuICovXG5pbnRlcmFjdC51c2UgPSB1c2VcbmZ1bmN0aW9uIHVzZSAocGx1Z2luOiBJbnRlcmFjdC5QbHVnaW4sIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIHNjb3BlLnVzZVBsdWdpbihwbHVnaW4sIG9wdGlvbnMpXG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZWxlbWVudCBvciBzZWxlY3RvciBoYXMgYmVlbiBzZXQgd2l0aCB0aGUge0BsaW5rIGludGVyYWN0fVxuICogZnVuY3Rpb25cbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0LmlzU2V0XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBFbGVtZW50IGJlaW5nIHNlYXJjaGVkIGZvclxuICogQHJldHVybiB7Ym9vbGVhbn0gSW5kaWNhdGVzIGlmIHRoZSBlbGVtZW50IG9yIENTUyBzZWxlY3RvciB3YXMgcHJldmlvdXNseVxuICogcGFzc2VkIHRvIGludGVyYWN0XG4gKi9cbmludGVyYWN0LmlzU2V0ID0gaXNTZXRcbmZ1bmN0aW9uIGlzU2V0ICh0YXJnZXQ6IEludGVyYWN0LkVsZW1lbnQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgcmV0dXJuICEhc2NvcGUuaW50ZXJhY3RhYmxlcy5nZXQodGFyZ2V0LCBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dClcbn1cblxuLyoqXG4gKiBBZGQgYSBnbG9iYWwgbGlzdGVuZXIgZm9yIGFuIEludGVyYWN0RXZlbnQgb3IgYWRkcyBhIERPTSBldmVudCB0byBgZG9jdW1lbnRgXG4gKlxuICogQGFsaWFzIG1vZHVsZTppbnRlcmFjdC5vblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGUgVGhlIHR5cGVzIG9mIGV2ZW50cyB0byBsaXN0ZW4gZm9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gZXZlbnQgKHMpXG4gKiBAcGFyYW0ge29iamVjdCB8IGJvb2xlYW59IFtvcHRpb25zXSBvYmplY3Qgb3IgdXNlQ2FwdHVyZSBmbGFnIGZvclxuICogYWRkRXZlbnRMaXN0ZW5lclxuICogQHJldHVybiB7b2JqZWN0fSBpbnRlcmFjdFxuICovXG5pbnRlcmFjdC5vbiA9IG9uXG5mdW5jdGlvbiBvbiAodHlwZTogc3RyaW5nIHwgSW50ZXJhY3QuRXZlbnRUeXBlcywgbGlzdGVuZXI6IEludGVyYWN0Lkxpc3RlbmVyc0FyZywgb3B0aW9ucz86IG9iamVjdCkge1xuICBpZiAodXRpbHMuaXMuc3RyaW5nKHR5cGUpICYmIHR5cGUuc2VhcmNoKCcgJykgIT09IC0xKSB7XG4gICAgdHlwZSA9IHR5cGUudHJpbSgpLnNwbGl0KC8gKy8pXG4gIH1cblxuICBpZiAodXRpbHMuaXMuYXJyYXkodHlwZSkpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiAodHlwZSBhcyBhbnlbXSkpIHtcbiAgICAgIGludGVyYWN0Lm9uKGV2ZW50VHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0XG4gIH1cblxuICBpZiAodXRpbHMuaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIHR5cGUpIHtcbiAgICAgIGludGVyYWN0Lm9uKHByb3AsICh0eXBlIGFzIGFueSlbcHJvcF0sIGxpc3RlbmVyKVxuICAgIH1cblxuICAgIHJldHVybiBpbnRlcmFjdFxuICB9XG5cbiAgLy8gaWYgaXQgaXMgYW4gSW50ZXJhY3RFdmVudCB0eXBlLCBhZGQgbGlzdGVuZXIgdG8gZ2xvYmFsRXZlbnRzXG4gIGlmIChpc05vbk5hdGl2ZUV2ZW50KHR5cGUsIHNjb3BlLmFjdGlvbnMpKSB7XG4gICAgLy8gaWYgdGhpcyB0eXBlIG9mIGV2ZW50IHdhcyBuZXZlciBib3VuZFxuICAgIGlmICghZ2xvYmFsRXZlbnRzW3R5cGVdKSB7XG4gICAgICBnbG9iYWxFdmVudHNbdHlwZV0gPSBbbGlzdGVuZXJdXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZ2xvYmFsRXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpXG4gICAgfVxuICB9XG4gIC8vIElmIG5vbiBJbnRlcmFjdEV2ZW50IHR5cGUsIGFkZEV2ZW50TGlzdGVuZXIgdG8gZG9jdW1lbnRcbiAgZWxzZSB7XG4gICAgZXZlbnRzLmFkZChzY29wZS5kb2N1bWVudCwgdHlwZSwgbGlzdGVuZXIgYXMgSW50ZXJhY3QuTGlzdGVuZXIsIHsgb3B0aW9ucyB9KVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGdsb2JhbCBJbnRlcmFjdEV2ZW50IGxpc3RlbmVyIG9yIERPTSBldmVudCBmcm9tIGBkb2N1bWVudGBcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0Lm9mZlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGUgVGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHdlcmUgbGlzdGVuZWRcbiAqIGZvclxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIGJlIHJlbW92ZWRcbiAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gb3B0aW9ucyBbb3B0aW9uc10gb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAqIHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAqIEByZXR1cm4ge29iamVjdH0gaW50ZXJhY3RcbiAqL1xuaW50ZXJhY3Qub2ZmID0gb2ZmXG5mdW5jdGlvbiBvZmYgKHR5cGU6IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyOiBhbnksIG9wdGlvbnM/OiBvYmplY3QpIHtcbiAgaWYgKHV0aWxzLmlzLnN0cmluZyh0eXBlKSAmJiB0eXBlLnNlYXJjaCgnICcpICE9PSAtMSkge1xuICAgIHR5cGUgPSB0eXBlLnRyaW0oKS5zcGxpdCgvICsvKVxuICB9XG5cbiAgaWYgKHV0aWxzLmlzLmFycmF5KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgdHlwZSkge1xuICAgICAgaW50ZXJhY3Qub2ZmKGV2ZW50VHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0XG4gIH1cblxuICBpZiAodXRpbHMuaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIHR5cGUpIHtcbiAgICAgIGludGVyYWN0Lm9mZihwcm9wLCB0eXBlW3Byb3BdLCBsaXN0ZW5lcilcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJhY3RcbiAgfVxuXG4gIGlmIChpc05vbk5hdGl2ZUV2ZW50KHR5cGUsIHNjb3BlLmFjdGlvbnMpKSB7XG4gICAgbGV0IGluZGV4XG5cbiAgICBpZiAodHlwZSBpbiBnbG9iYWxFdmVudHMgJiZcbiAgICAgICAgKGluZGV4ID0gZ2xvYmFsRXZlbnRzW3R5cGVdLmluZGV4T2YobGlzdGVuZXIpKSAhPT0gLTEpIHtcbiAgICAgIGdsb2JhbEV2ZW50c1t0eXBlXS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGV2ZW50cy5yZW1vdmUoc2NvcGUuZG9jdW1lbnQsIHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbmludGVyYWN0LmRlYnVnID0gZGVidWdcbmZ1bmN0aW9uIGRlYnVnICgpIHtcbiAgcmV0dXJuIHNjb3BlXG59XG5cbi8vIGV4cG9zZSB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gY2FsY3VsYXRlIG11bHRpLXRvdWNoIHByb3BlcnRpZXNcbmludGVyYWN0LmdldFBvaW50ZXJBdmVyYWdlICA9IHV0aWxzLnBvaW50ZXIucG9pbnRlckF2ZXJhZ2VcbmludGVyYWN0LmdldFRvdWNoQkJveCAgICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94XG5pbnRlcmFjdC5nZXRUb3VjaERpc3RhbmNlICAgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2VcbmludGVyYWN0LmdldFRvdWNoQW5nbGUgICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hBbmdsZVxuXG5pbnRlcmFjdC5nZXRFbGVtZW50UmVjdCAgICAgICA9IHV0aWxzLmRvbS5nZXRFbGVtZW50UmVjdFxuaW50ZXJhY3QuZ2V0RWxlbWVudENsaWVudFJlY3QgPSB1dGlscy5kb20uZ2V0RWxlbWVudENsaWVudFJlY3RcbmludGVyYWN0Lm1hdGNoZXNTZWxlY3RvciAgICAgID0gdXRpbHMuZG9tLm1hdGNoZXNTZWxlY3RvclxuaW50ZXJhY3QuY2xvc2VzdCAgICAgICAgICAgICAgPSB1dGlscy5kb20uY2xvc2VzdFxuXG4vKipcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3Quc3VwcG9ydHNUb3VjaFxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBicm93c2VyIHN1cHBvcnRzIHRvdWNoIGlucHV0XG4gKi9cbmludGVyYWN0LnN1cHBvcnRzVG91Y2ggPSBzdXBwb3J0c1RvdWNoXG5mdW5jdGlvbiBzdXBwb3J0c1RvdWNoICgpIHtcbiAgcmV0dXJuIGJyb3dzZXIuc3VwcG9ydHNUb3VjaFxufVxuXG4vKipcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3Quc3VwcG9ydHNQb2ludGVyRXZlbnRcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgYnJvd3NlciBzdXBwb3J0cyBQb2ludGVyRXZlbnRzXG4gKi9cbmludGVyYWN0LnN1cHBvcnRzUG9pbnRlckV2ZW50ID0gc3VwcG9ydHNQb2ludGVyRXZlbnRcbmZ1bmN0aW9uIHN1cHBvcnRzUG9pbnRlckV2ZW50ICgpIHtcbiAgcmV0dXJuIGJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnRcbn1cblxuLyoqXG4gKiBDYW5jZWxzIGFsbCBpbnRlcmFjdGlvbnMgKGVuZCBldmVudHMgYXJlIG5vdCBmaXJlZClcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0LnN0b3BcbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9IGludGVyYWN0XG4gKi9cbmludGVyYWN0LnN0b3AgPSBzdG9wXG5mdW5jdGlvbiBzdG9wICgpIHtcbiAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgIGludGVyYWN0aW9uLnN0b3AoKVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogUmV0dXJucyBvciBzZXRzIHRoZSBkaXN0YW5jZSB0aGUgcG9pbnRlciBtdXN0IGJlIG1vdmVkIGJlZm9yZSBhbiBhY3Rpb25cbiAqIHNlcXVlbmNlIG9jY3Vycy4gVGhpcyBhbHNvIGFmZmVjdHMgdG9sZXJhbmNlIGZvciB0YXAgZXZlbnRzLlxuICpcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3QucG9pbnRlck1vdmVUb2xlcmFuY2VcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW25ld1ZhbHVlXSBUaGUgbW92ZW1lbnQgZnJvbSB0aGUgc3RhcnQgcG9zaXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZVxuICogQHJldHVybiB7aW50ZXJhY3QgfCBudW1iZXJ9XG4gKi9cbmludGVyYWN0LnBvaW50ZXJNb3ZlVG9sZXJhbmNlID0gcG9pbnRlck1vdmVUb2xlcmFuY2VcbmZ1bmN0aW9uIHBvaW50ZXJNb3ZlVG9sZXJhbmNlIChuZXdWYWx1ZT86IG51bWJlcikge1xuICBpZiAodXRpbHMuaXMubnVtYmVyKG5ld1ZhbHVlKSkge1xuICAgIHNjb3BlLmludGVyYWN0aW9ucy5wb2ludGVyTW92ZVRvbGVyYW5jZSA9IG5ld1ZhbHVlXG5cbiAgICByZXR1cm4gaW50ZXJhY3RcbiAgfVxuXG4gIHJldHVybiBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2Vcbn1cblxuaW50ZXJhY3QuYWRkRG9jdW1lbnQgPSAoZG9jLCBvcHRpb25zKSA9PiBzY29wZS5hZGREb2N1bWVudChkb2MsIG9wdGlvbnMpXG5pbnRlcmFjdC5yZW1vdmVEb2N1bWVudCA9IGRvYyA9PiBzY29wZS5yZW1vdmVEb2N1bWVudChkb2MpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuaW50ZXJhY3QudmVyc2lvbiA9IHByb2Nlc3MuZW52Lm5wbV9wYWNrYWdlX3ZlcnNpb25cblxuc2NvcGUuaW50ZXJhY3QgPSBpbnRlcmFjdFxuXG5leHBvcnQgeyBzY29wZSB9XG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuIiwiaW1wb3J0ICdAaW50ZXJhY3Rqcy90eXBlcy9pbmRleCdcbmltcG9ydCBhY3Rpb25zIGZyb20gJ0BpbnRlcmFjdGpzL2FjdGlvbnMvaW5kZXgnXG5pbXBvcnQgYXV0b1Njcm9sbCBmcm9tICdAaW50ZXJhY3Rqcy9hdXRvLXNjcm9sbC9pbmRleCdcbmltcG9ydCBhdXRvU3RhcnQgZnJvbSAnQGludGVyYWN0anMvYXV0by1zdGFydC9pbmRleCdcbmltcG9ydCBkZXZUb29scyBmcm9tICdAaW50ZXJhY3Rqcy9kZXYtdG9vbHMvaW5kZXgnXG5pbXBvcnQgaW5lcnRpYSBmcm9tICdAaW50ZXJhY3Rqcy9pbmVydGlhL2luZGV4J1xuaW1wb3J0IG1vZGlmaWVycyBmcm9tICdAaW50ZXJhY3Rqcy9tb2RpZmllcnMvaW5kZXgnXG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0BpbnRlcmFjdGpzL29mZnNldCdcbmltcG9ydCBwb2ludGVyRXZlbnRzIGZyb20gJ0BpbnRlcmFjdGpzL3BvaW50ZXItZXZlbnRzL2luZGV4J1xuaW1wb3J0IHJlZmxvdyBmcm9tICdAaW50ZXJhY3Rqcy9yZWZsb3cvaW5kZXgnXG5pbXBvcnQgaW50ZXJhY3QsIHsgaW5pdCBhcyBpbml0SW50ZXJhY3QgfSBmcm9tICdAaW50ZXJhY3Rqcy9pbnRlcmFjdC9pbmRleCdcblxuaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmICEhd2luZG93KSB7XG4gIGluaXQod2luZG93KVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCAod2luOiBXaW5kb3cpIHtcbiAgaW5pdEludGVyYWN0KHdpbilcblxuICBpbnRlcmFjdC51c2Uob2Zmc2V0KVxuXG4gIC8vIHBvaW50ZXJFdmVudHNcbiAgaW50ZXJhY3QudXNlKHBvaW50ZXJFdmVudHMpXG5cbiAgLy8gaW5lcnRpYVxuICBpbnRlcmFjdC51c2UoaW5lcnRpYSlcblxuICAvLyBzbmFwLCByZXNpemUsIGV0Yy5cbiAgaW50ZXJhY3QudXNlKG1vZGlmaWVycylcblxuICAvLyBhdXRvU3RhcnQsIGhvbGRcbiAgaW50ZXJhY3QudXNlKGF1dG9TdGFydClcblxuICAvLyBkcmFnIGFuZCBkcm9wLCByZXNpemUsIGdlc3R1cmVcbiAgaW50ZXJhY3QudXNlKGFjdGlvbnMpXG5cbiAgLy8gYXV0b1Njcm9sbFxuICBpbnRlcmFjdC51c2UoYXV0b1Njcm9sbClcblxuICAvLyByZWZsb3dcbiAgaW50ZXJhY3QudXNlKHJlZmxvdylcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpbnRlcmFjdC51c2UoZGV2VG9vbHMpXG4gIH1cblxuICByZXR1cm4gaW50ZXJhY3Rcbn1cbiIsImltcG9ydCBpbnRlcmFjdCwgeyBpbml0IH0gZnJvbSAnQGludGVyYWN0anMvaW50ZXJhY3Rqcy9pbmRleCdcblxuaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmICEhbW9kdWxlKSB7XG4gIHRyeSB7IG1vZHVsZS5leHBvcnRzID0gaW50ZXJhY3QgfVxuICBjYXRjaCB7fVxufVxuXG4oaW50ZXJhY3QgYXMgYW55KS5kZWZhdWx0ID0gaW50ZXJhY3RcbjsoaW50ZXJhY3QgYXMgYW55KS5pbml0ID0gaW5pdFxuXG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuZXhwb3J0IHsgaW5pdCB9XG4iLCJcbnJldHVybiBfJGluZGV4XzY5O1xuXG59KTtcbiJdfQ== diff --git a/interactjs/dist/interact.js.map b/interactjs/dist/interact.js.map new file mode 100644 index 000000000..aa7d5afa2 --- /dev/null +++ b/interactjs/dist/interact.js.map @@ -0,0 +1,10803 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.interact = f()}})(function(){var define,module,exports; +var createModuleFactory = function createModuleFactory(t){var e;return function(r){return e||t(e={exports:{},parent:r},e.exports),e.exports}}; +var _$Interactable_16 = createModuleFactory(function (module, exports) { +"use strict"; + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = exports.Interactable = void 0; + +var arr = _interopRequireWildcard(_$arr_49); + +var _browser = _interopRequireDefault(_$browser_50); + +var _clone = _interopRequireDefault(_$clone_51); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var _events = _interopRequireDefault(_$events_54); + +var _extend = _interopRequireDefault(_$extend_55); + +var is = _interopRequireWildcard(_$is_59); + +var _normalizeListeners = _interopRequireDefault(_$normalizeListeners_61); + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +var _Eventable = _interopRequireDefault(_$Eventable_14); + +var _scope = _$scope_24({}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/** */ +var Interactable = /*#__PURE__*/function () { + _createClass(Interactable, [{ + key: "_defaults", + get: function get() { + return { + base: {}, + perAction: {}, + actions: {} + }; + } + }]); + + /** */ + function Interactable(target, options, defaultContext) { + _classCallCheck(this, Interactable); + + _defineProperty(this, "options", void 0); + + _defineProperty(this, "_actions", void 0); + + _defineProperty(this, "target", void 0); + + _defineProperty(this, "events", new _Eventable["default"]()); + + _defineProperty(this, "_context", void 0); + + _defineProperty(this, "_win", void 0); + + _defineProperty(this, "_doc", void 0); + + this._actions = options.actions; + this.target = target; + this._context = options.context || defaultContext; + this._win = (0, _$window_68.getWindow)((0, _$domUtils_53.trySelector)(target) ? this._context : target); + this._doc = this._win.document; + this.set(options); + } + + _createClass(Interactable, [{ + key: "setOnEvents", + value: function setOnEvents(actionName, phases) { + if (is.func(phases.onstart)) { + this.on("".concat(actionName, "start"), phases.onstart); + } + + if (is.func(phases.onmove)) { + this.on("".concat(actionName, "move"), phases.onmove); + } + + if (is.func(phases.onend)) { + this.on("".concat(actionName, "end"), phases.onend); + } + + if (is.func(phases.oninertiastart)) { + this.on("".concat(actionName, "inertiastart"), phases.oninertiastart); + } + + return this; + } + }, { + key: "updatePerActionListeners", + value: function updatePerActionListeners(actionName, prev, cur) { + if (is.array(prev) || is.object(prev)) { + this.off(actionName, prev); + } + + if (is.array(cur) || is.object(cur)) { + this.on(actionName, cur); + } + } + }, { + key: "setPerAction", + value: function setPerAction(actionName, options) { + var defaults = this._defaults; // for all the default per-action options + + for (var optionName_ in options) { + var optionName = optionName_; + var actionOptions = this.options[actionName]; + var optionValue = options[optionName]; // remove old event listeners and add new ones + + if (optionName === 'listeners') { + this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue); + } // if the option value is an array + + + if (is.array(optionValue)) { + actionOptions[optionName] = arr.from(optionValue); + } // if the option value is an object + else if (is.plainObject(optionValue)) { + // copy the object + actionOptions[optionName] = (0, _extend["default"])(actionOptions[optionName] || {}, (0, _clone["default"])(optionValue)); // set anabled field to true if it exists in the defaults + + if (is.object(defaults.perAction[optionName]) && 'enabled' in defaults.perAction[optionName]) { + actionOptions[optionName].enabled = optionValue.enabled !== false; + } + } // if the option value is a boolean and the default is an object + else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) { + actionOptions[optionName].enabled = optionValue; + } // if it's anything else, do a plain assignment + else { + actionOptions[optionName] = optionValue; + } + } + } + /** + * The default function to get an Interactables bounding rect. Can be + * overridden using {@link Interactable.rectChecker}. + * + * @param {Element} [element] The element to measure. + * @return {object} The object's bounding rectangle. + */ + + }, { + key: "getRect", + value: function getRect(element) { + element = element || (is.element(this.target) ? this.target : null); + + if (is.string(this.target)) { + element = element || this._context.querySelector(this.target); + } + + return (0, _$domUtils_53.getElementRect)(element); + } + /** + * Returns or sets the function used to calculate the interactable's + * element's rectangle + * + * @param {function} [checker] A function which returns this Interactable's + * bounding rectangle. See {@link Interactable.getRect} + * @return {function | object} The checker function or this Interactable + */ + + }, { + key: "rectChecker", + value: function rectChecker(checker) { + if (is.func(checker)) { + this.getRect = checker; + return this; + } + + if (checker === null) { + delete this.getRect; + return this; + } + + return this.getRect; + } + }, { + key: "_backCompatOption", + value: function _backCompatOption(optionName, newValue) { + if ((0, _$domUtils_53.trySelector)(newValue) || is.object(newValue)) { + this.options[optionName] = newValue; + + for (var action in this._actions.map) { + this.options[action][optionName] = newValue; + } + + return this; + } + + return this.options[optionName]; + } + /** + * Gets or sets the origin of the Interactable's element. The x and y + * of the origin will be subtracted from action event coordinates. + * + * @param {Element | object | string} [origin] An HTML or SVG Element whose + * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self' + * or any CSS selector + * + * @return {object} The current origin or this Interactable + */ + + }, { + key: "origin", + value: function origin(newValue) { + return this._backCompatOption('origin', newValue); + } + /** + * Returns or sets the mouse coordinate types used to calculate the + * movement of the pointer. + * + * @param {string} [newValue] Use 'client' if you will be scrolling while + * interacting; Use 'page' if you want autoScroll to work + * @return {string | object} The current deltaSource or this Interactable + */ + + }, { + key: "deltaSource", + value: function deltaSource(newValue) { + if (newValue === 'page' || newValue === 'client') { + this.options.deltaSource = newValue; + return this; + } + + return this.options.deltaSource; + } + /** + * Gets the selector context Node of the Interactable. The default is + * `window.document`. + * + * @return {Node} The context Node of this Interactable + */ + + }, { + key: "context", + value: function context() { + return this._context; + } + }, { + key: "inContext", + value: function inContext(element) { + return this._context === element.ownerDocument || (0, _$domUtils_53.nodeContains)(this._context, element); + } + }, { + key: "testIgnoreAllow", + value: function testIgnoreAllow(options, targetNode, eventTarget) { + return !this.testIgnore(options.ignoreFrom, targetNode, eventTarget) && this.testAllow(options.allowFrom, targetNode, eventTarget); + } + }, { + key: "testAllow", + value: function testAllow(allowFrom, targetNode, element) { + if (!allowFrom) { + return true; + } + + if (!is.element(element)) { + return false; + } + + if (is.string(allowFrom)) { + return (0, _$domUtils_53.matchesUpTo)(element, allowFrom, targetNode); + } else if (is.element(allowFrom)) { + return (0, _$domUtils_53.nodeContains)(allowFrom, element); + } + + return false; + } + }, { + key: "testIgnore", + value: function testIgnore(ignoreFrom, targetNode, element) { + if (!ignoreFrom || !is.element(element)) { + return false; + } + + if (is.string(ignoreFrom)) { + return (0, _$domUtils_53.matchesUpTo)(element, ignoreFrom, targetNode); + } else if (is.element(ignoreFrom)) { + return (0, _$domUtils_53.nodeContains)(ignoreFrom, element); + } + + return false; + } + /** + * Calls listeners for the given InteractEvent type bound globally + * and directly to this Interactable + * + * @param {InteractEvent} iEvent The InteractEvent object to be fired on this + * Interactable + * @return {Interactable} this Interactable + */ + + }, { + key: "fire", + value: function fire(iEvent) { + this.events.fire(iEvent); + return this; + } + }, { + key: "_onOff", + value: function _onOff(method, typeArg, listenerArg, options) { + if (is.object(typeArg) && !is.array(typeArg)) { + options = listenerArg; + listenerArg = null; + } + + var addRemove = method === 'on' ? 'add' : 'remove'; + var listeners = (0, _normalizeListeners["default"])(typeArg, listenerArg); + + for (var type in listeners) { + if (type === 'wheel') { + type = _browser["default"].wheelEvent; + } + + for (var _i = 0; _i < listeners[type].length; _i++) { + var _ref; + + _ref = listeners[type][_i]; + var listener = _ref; + + // if it is an action event type + if ((0, _scope.isNonNativeEvent)(type, this._actions)) { + this.events[method](type, listener); + } // delegated event + else if (is.string(this.target)) { + _events["default"]["".concat(addRemove, "Delegate")](this.target, this._context, type, listener, options); + } // remove listener from this Interactable's element + else { + _events["default"][addRemove](this.target, type, listener, options); + } + } + } + + return this; + } + /** + * Binds a listener for an InteractEvent, pointerEvent or DOM event. + * + * @param {string | array | object} types The types of events to listen + * for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * addEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "on", + value: function on(types, listener, options) { + return this._onOff('on', types, listener, options); + } + /** + * Removes an InteractEvent, pointerEvent or DOM event listener. + * + * @param {string | array | object} types The types of events that were + * listened for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * removeEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "off", + value: function off(types, listener, options) { + return this._onOff('off', types, listener, options); + } + /** + * Reset the options of this Interactable + * + * @param {object} options The new settings to apply + * @return {object} This Interactable + */ + + }, { + key: "set", + value: function set(options) { + var defaults = this._defaults; + + if (!is.object(options)) { + options = {}; + } + + this.options = (0, _clone["default"])(defaults.base); + + for (var actionName_ in this._actions.methodDict) { + var actionName = actionName_; + var methodName = this._actions.methodDict[actionName]; + this.options[actionName] = {}; + this.setPerAction(actionName, (0, _extend["default"])((0, _extend["default"])({}, defaults.perAction), defaults.actions[actionName])); + this[methodName](options[actionName]); + } + + for (var setting in options) { + if (is.func(this[setting])) { + this[setting](options[setting]); + } + } + + return this; + } + /** + * Remove this interactable from the list of interactables and remove it's + * action capabilities and event listeners + * + * @return {interact} + */ + + }, { + key: "unset", + value: function unset() { + _events["default"].remove(this.target, 'all'); + + if (is.string(this.target)) { + // remove delegated events + for (var type in _events["default"].delegatedEvents) { + var delegated = _events["default"].delegatedEvents[type]; + + if (delegated.selectors[0] === this.target && delegated.contexts[0] === this._context) { + delegated.selectors.splice(0, 1); + delegated.contexts.splice(0, 1); + delegated.listeners.splice(0, 1); + } + + _events["default"].remove(this._context, type, _events["default"].delegateListener); + + _events["default"].remove(this._context, type, _events["default"].delegateUseCapture, true); + } + } else { + _events["default"].remove(this.target, 'all'); + } + } + }]); + + return Interactable; +}(); + +exports.Interactable = Interactable; +var _default = Interactable; +exports["default"] = _default; + +}); +var _$scope_24 = createModuleFactory(function (module, exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +/* common-shake removed: exports.createScope = */ void createScope; +exports.isNonNativeEvent = isNonNativeEvent; +/* common-shake removed: exports.initScope = */ void initScope; +exports.Scope = void 0; + +var _domObjects = _interopRequireDefault(_$domObjects_52); + +var utils = _interopRequireWildcard(_$index_58); + +var _defaultOptions = _interopRequireDefault(_$defaultOptions_20); + +var _Eventable = _interopRequireDefault(_$Eventable_14); + +var _Interactable = _interopRequireDefault(_$Interactable_16({})); + +var _InteractableSet = _interopRequireDefault(_$InteractableSet_17); + +var _InteractEvent = _interopRequireDefault(_$InteractEvent_15); + +var _interactions = _interopRequireDefault(_$interactions_23({})); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var win = utils.win, + browser = utils.browser, + raf = utils.raf, + events = utils.events; // eslint-disable-next-line @typescript-eslint/no-empty-interface + +function createScope() { + return new Scope(); +} + +var Scope = /*#__PURE__*/function () { + // main window + // main document + // main window + // all documents being listened to + function Scope() { + var _this = this; + + _classCallCheck(this, Scope); + + _defineProperty(this, "id", "__interact_scope_".concat(Math.floor(Math.random() * 100))); + + _defineProperty(this, "isInitialized", false); + + _defineProperty(this, "listenerMaps", []); + + _defineProperty(this, "browser", browser); + + _defineProperty(this, "events", events); + + _defineProperty(this, "utils", utils); + + _defineProperty(this, "defaults", utils.clone(_defaultOptions["default"])); + + _defineProperty(this, "Eventable", _Eventable["default"]); + + _defineProperty(this, "actions", { + map: {}, + phases: { + start: true, + move: true, + end: true + }, + methodDict: {}, + phaselessTypes: {} + }); + + _defineProperty(this, "InteractEvent", _InteractEvent["default"]); + + _defineProperty(this, "Interactable", void 0); + + _defineProperty(this, "interactables", new _InteractableSet["default"](this)); + + _defineProperty(this, "_win", void 0); + + _defineProperty(this, "document", void 0); + + _defineProperty(this, "window", void 0); + + _defineProperty(this, "documents", []); + + _defineProperty(this, "_plugins", { + list: [], + map: {} + }); + + _defineProperty(this, "onWindowUnload", function (event) { + return _this.removeDocument(event.target); + }); + + var scope = this; + + this.Interactable = /*#__PURE__*/function (_InteractableBase) { + _inherits(_class, _InteractableBase); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "set", + value: function set(options) { + _get(_getPrototypeOf(_class.prototype), "set", this).call(this, options); + + scope.fire('interactable:set', { + options: options, + interactable: this + }); + return this; + } + }, { + key: "unset", + value: function unset() { + _get(_getPrototypeOf(_class.prototype), "unset", this).call(this); + + scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1); + scope.fire('interactable:unset', { + interactable: this + }); + } + }, { + key: "_defaults", + get: function get() { + return scope.defaults; + } + }]); + + return _class; + }(_Interactable["default"]); + } + + _createClass(Scope, [{ + key: "addListeners", + value: function addListeners(map, id) { + this.listenerMaps.push({ + id: id, + map: map + }); + } + }, { + key: "fire", + value: function fire(name, arg) { + for (var _i = 0; _i < this.listenerMaps.length; _i++) { + var _ref; + + _ref = this.listenerMaps[_i]; + var _ref2 = _ref, + listener = _ref2.map[name]; + + if (!!listener && listener(arg, this, name) === false) { + return false; + } + } + } + }, { + key: "init", + value: function init(window) { + return this.isInitialized ? this : initScope(this, window); + } + }, { + key: "pluginIsInstalled", + value: function pluginIsInstalled(plugin) { + return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1; + } + }, { + key: "usePlugin", + value: function usePlugin(plugin, options) { + if (this.pluginIsInstalled(plugin)) { + return this; + } + + if (plugin.id) { + this._plugins.map[plugin.id] = plugin; + } + + this._plugins.list.push(plugin); + + if (plugin.install) { + plugin.install(this, options); + } + + if (plugin.listeners && plugin.before) { + var _index = 0; + var len = this.listenerMaps.length; + var before = plugin.before.reduce(function (acc, id) { + acc[id] = true; + return acc; + }, {}); + + for (; _index < len; _index++) { + var otherId = this.listenerMaps[_index].id; + + if (before[otherId]) { + break; + } + } + + this.listenerMaps.splice(_index, 0, { + id: plugin.id, + map: plugin.listeners + }); + } else if (plugin.listeners) { + this.listenerMaps.push({ + id: plugin.id, + map: plugin.listeners + }); + } + + return this; + } + }, { + key: "addDocument", + value: function addDocument(doc, options) { + // do nothing if document is already known + if (this.getDocIndex(doc) !== -1) { + return false; + } + + var window = win.getWindow(doc); + options = options ? utils.extend({}, options) : {}; + this.documents.push({ + doc: doc, + options: options + }); + events.documents.push(doc); // don't add an unload event for the main document + // so that the page may be cached in browser history + + if (doc !== this.document) { + events.add(window, 'unload', this.onWindowUnload); + } + + this.fire('scope:add-document', { + doc: doc, + window: window, + scope: this, + options: options + }); + } + }, { + key: "removeDocument", + value: function removeDocument(doc) { + var index = this.getDocIndex(doc); + var window = win.getWindow(doc); + var options = this.documents[index].options; + events.remove(window, 'unload', this.onWindowUnload); + this.documents.splice(index, 1); + events.documents.splice(index, 1); + this.fire('scope:remove-document', { + doc: doc, + window: window, + scope: this, + options: options + }); + } + }, { + key: "getDocIndex", + value: function getDocIndex(doc) { + for (var i = 0; i < this.documents.length; i++) { + if (this.documents[i].doc === doc) { + return i; + } + } + + return -1; + } + }, { + key: "getDocOptions", + value: function getDocOptions(doc) { + var docIndex = this.getDocIndex(doc); + return docIndex === -1 ? null : this.documents[docIndex].options; + } + }, { + key: "now", + value: function now() { + return (this.window.Date || Date).now(); + } + }]); + + return Scope; +}(); + +exports.Scope = Scope; + +function isNonNativeEvent(type, actions) { + if (actions.phaselessTypes[type]) { + return true; + } + + for (var name in actions.map) { + if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) { + return true; + } + } + + return false; +} + +function initScope(scope, window) { + scope.isInitialized = true; + win.init(window); + + _domObjects["default"].init(window); + + browser.init(window); + raf.init(window); + events.init(window); + scope.usePlugin(_interactions["default"]); + scope.document = window.document; + scope.window = window; + return scope; +} + +}); +var _$interactions_23 = createModuleFactory(function (module, exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _browser = _interopRequireDefault(_$browser_50); + +var _domObjects = _interopRequireDefault(_$domObjects_52); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var _events = _interopRequireDefault(_$events_54); + +var pointerUtils = _interopRequireWildcard(_$pointerUtils_63); + +var _Interaction = _interopRequireDefault(_$Interaction_18); + +var _interactionFinder = _interopRequireDefault(_$interactionFinder_22); + +var _scope = _$scope_24({}); + +var _interactablePreventDefault = _interopRequireDefault(_$interactablePreventDefault_21); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +var methodNames = ['pointerDown', 'pointerMove', 'pointerUp', 'updatePointer', 'removePointer', 'windowBlur']; + +function install(scope) { + var listeners = {}; + + for (var _i = 0; _i < methodNames.length; _i++) { + var _ref; + + _ref = methodNames[_i]; + var method = _ref; + listeners[method] = doOnInteractions(method, scope); + } + + var pEventTypes = _browser["default"].pEventTypes; + var docEvents; + + if (_domObjects["default"].PointerEvent) { + docEvents = [{ + type: pEventTypes.down, + listener: releasePointersOnRemovedEls + }, { + type: pEventTypes.down, + listener: listeners.pointerDown + }, { + type: pEventTypes.move, + listener: listeners.pointerMove + }, { + type: pEventTypes.up, + listener: listeners.pointerUp + }, { + type: pEventTypes.cancel, + listener: listeners.pointerUp + }]; + } else { + docEvents = [{ + type: 'mousedown', + listener: listeners.pointerDown + }, { + type: 'mousemove', + listener: listeners.pointerMove + }, { + type: 'mouseup', + listener: listeners.pointerUp + }, { + type: 'touchstart', + listener: releasePointersOnRemovedEls + }, { + type: 'touchstart', + listener: listeners.pointerDown + }, { + type: 'touchmove', + listener: listeners.pointerMove + }, { + type: 'touchend', + listener: listeners.pointerUp + }, { + type: 'touchcancel', + listener: listeners.pointerUp + }]; + } + + docEvents.push({ + type: 'blur', + listener: function listener(event) { + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref2; + + _ref2 = scope.interactions.list[_i2]; + var interaction = _ref2; + interaction.documentBlur(event); + } + } + }); // for ignoring browser's simulated mouse events + + scope.prevTouchTime = 0; + + scope.Interaction = /*#__PURE__*/function (_InteractionBase) { + _inherits(_class, _InteractionBase); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "_now", + value: function _now() { + return scope.now(); + } + }, { + key: "pointerMoveTolerance", + get: function get() { + return scope.interactions.pointerMoveTolerance; + }, + set: function set(value) { + scope.interactions.pointerMoveTolerance = value; + } + }]); + + return _class; + }(_Interaction["default"]); + + scope.interactions = { + // all active and idle interactions + list: [], + "new": function _new(options) { + options.scopeFire = function (name, arg) { + return scope.fire(name, arg); + }; + + var interaction = new scope.Interaction(options); + scope.interactions.list.push(interaction); + return interaction; + }, + listeners: listeners, + docEvents: docEvents, + pointerMoveTolerance: 1 + }; + + function releasePointersOnRemovedEls() { + // for all inactive touch interactions with pointers down + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref3; + + _ref3 = scope.interactions.list[_i3]; + var interaction = _ref3; + + if (!interaction.pointerIsDown || interaction.pointerType !== 'touch' || interaction._interacting) { + continue; + } // if a pointer is down on an element that is no longer in the DOM tree + + + var _loop = function _loop() { + _ref4 = interaction.pointers[_i4]; + var pointer = _ref4; + + if (!scope.documents.some(function (_ref5) { + var doc = _ref5.doc; + return (0, _$domUtils_53.nodeContains)(doc, pointer.downTarget); + })) { + // remove the pointer from the interaction + interaction.removePointer(pointer.pointer, pointer.event); + } + }; + + for (var _i4 = 0; _i4 < interaction.pointers.length; _i4++) { + var _ref4; + + _loop(); + } + } + } + + scope.usePlugin(_interactablePreventDefault["default"]); +} + +function doOnInteractions(method, scope) { + return function (event) { + var interactions = scope.interactions.list; + var pointerType = pointerUtils.getPointerType(event); + + var _pointerUtils$getEven = pointerUtils.getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 2), + eventTarget = _pointerUtils$getEven2[0], + curEventTarget = _pointerUtils$getEven2[1]; + + var matches = []; // [ [pointer, interaction], ...] + + if (/^touch/.test(event.type)) { + scope.prevTouchTime = scope.now(); + + for (var _i5 = 0; _i5 < event.changedTouches.length; _i5++) { + var _ref6; + + _ref6 = event.changedTouches[_i5]; + var changedTouch = _ref6; + var pointer = changedTouch; + var pointerId = pointerUtils.getPointerId(pointer); + var searchDetails = { + pointer: pointer, + pointerId: pointerId, + pointerType: pointerType, + eventType: event.type, + eventTarget: eventTarget, + curEventTarget: curEventTarget, + scope: scope + }; + var interaction = getInteraction(searchDetails); + matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]); + } + } else { + var invalidPointer = false; + + if (!_browser["default"].supportsPointerEvent && /mouse/.test(event.type)) { + // ignore mouse events while touch interactions are active + for (var i = 0; i < interactions.length && !invalidPointer; i++) { + invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown; + } // try to ignore mouse events that are simulated by the browser + // after a touch event + + + invalidPointer = invalidPointer || scope.now() - scope.prevTouchTime < 500 || // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated + event.timeStamp === 0; + } + + if (!invalidPointer) { + var _searchDetails = { + pointer: event, + pointerId: pointerUtils.getPointerId(event), + pointerType: pointerType, + eventType: event.type, + curEventTarget: curEventTarget, + eventTarget: eventTarget, + scope: scope + }; + + var _interaction = getInteraction(_searchDetails); + + matches.push([_searchDetails.pointer, _searchDetails.eventTarget, _searchDetails.curEventTarget, _interaction]); + } + } // eslint-disable-next-line no-shadow + + + for (var _i6 = 0; _i6 < matches.length; _i6++) { + var _matches$_i = _slicedToArray(matches[_i6], 4), + _pointer = _matches$_i[0], + _eventTarget = _matches$_i[1], + _curEventTarget = _matches$_i[2], + _interaction2 = _matches$_i[3]; + + _interaction2[method](_pointer, event, _eventTarget, _curEventTarget); + } + }; +} + +function getInteraction(searchDetails) { + var pointerType = searchDetails.pointerType, + scope = searchDetails.scope; + + var foundInteraction = _interactionFinder["default"].search(searchDetails); + + var signalArg = { + interaction: foundInteraction, + searchDetails: searchDetails + }; + scope.fire('interactions:find', signalArg); + return signalArg.interaction || scope.interactions["new"]({ + pointerType: pointerType + }); +} + +function onDocSignal(_ref7, eventMethodName) { + var doc = _ref7.doc, + scope = _ref7.scope, + options = _ref7.options; + var docEvents = scope.interactions.docEvents; + var eventMethod = _events["default"][eventMethodName]; + + if (scope.browser.isIOS && !options.events) { + options.events = { + passive: false + }; + } // delegate event listener + + + for (var eventType in _events["default"].delegatedEvents) { + eventMethod(doc, eventType, _events["default"].delegateListener); + eventMethod(doc, eventType, _events["default"].delegateUseCapture, true); + } + + var eventOptions = options && options.events; + + for (var _i7 = 0; _i7 < docEvents.length; _i7++) { + var _ref8; + + _ref8 = docEvents[_i7]; + var _ref9 = _ref8, + _type = _ref9.type, + listener = _ref9.listener; + eventMethod(doc, _type, listener, eventOptions); + } +} + +var interactions = { + id: 'core/interactions', + install: install, + listeners: { + 'scope:add-document': function scopeAddDocument(arg) { + return onDocSignal(arg, 'add'); + }, + 'scope:remove-document': function scopeRemoveDocument(arg) { + return onDocSignal(arg, 'remove'); + }, + 'interactable:unset': function interactableUnset(_ref10, scope) { + var interactable = _ref10.interactable; + + // Stop and destroy related interactions when an Interactable is unset + for (var i = scope.interactions.list.length - 1; i >= 0; i--) { + var interaction = scope.interactions.list[i]; + + if (interaction.interactable !== interactable) { + continue; + } + + interaction.stop(); + scope.fire('interactions:destroy', { + interaction: interaction + }); + interaction.destroy(); + + if (scope.interactions.list.length > 2) { + scope.interactions.list.splice(i, 1); + } + } + } + }, + onDocSignal: onDocSignal, + doOnInteractions: doOnInteractions, + methodNames: methodNames +}; +var _default = interactions; +exports["default"] = _default; + +}); +var _$index_48 = {}; +/// +"use strict"; + +var _$isWindow_60 = {}; +"use strict"; + +Object.defineProperty(_$isWindow_60, "__esModule", { + value: true +}); +_$isWindow_60["default"] = void 0; + +var _default = function _default(thing) { + return !!(thing && thing.Window) && thing instanceof thing.Window; +}; + +_$isWindow_60["default"] = _default; + +var _$window_68 = {}; +"use strict"; + +Object.defineProperty(_$window_68, "__esModule", { + value: true +}); +_$window_68.init = init; +_$window_68.getWindow = getWindow; +_$window_68["default"] = void 0; + +var _isWindow = _interopRequireDefault(_$isWindow_60); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var win = { + realWindow: undefined, + window: undefined, + getWindow: getWindow, + init: init +}; + +function init(window) { + // get wrapped window if using Shadow DOM polyfill + win.realWindow = window; // create a TextNode + + var el = window.document.createTextNode(''); // check if it's wrapped by a polyfill + + if (el.ownerDocument !== window.document && typeof window.wrap === 'function' && window.wrap(el) === el) { + // use wrapped window + window = window.wrap(window); + } + + win.window = window; +} + +if (typeof window === 'undefined') { + win.window = undefined; + win.realWindow = undefined; +} else { + init(window); +} + +function getWindow(node) { + if ((0, _isWindow["default"])(node)) { + return node; + } + + var rootNode = node.ownerDocument || node; + return rootNode.defaultView || win.window; +} + +win.init = init; +var ___default_68 = win; +_$window_68["default"] = ___default_68; + +var _$is_59 = {}; +"use strict"; + +Object.defineProperty(_$is_59, "__esModule", { + value: true +}); +_$is_59.array = _$is_59.plainObject = _$is_59.element = _$is_59.string = _$is_59.bool = _$is_59.number = _$is_59.func = _$is_59.object = _$is_59.docFrag = _$is_59.window = void 0; + +var ___isWindow_59 = ___interopRequireDefault_59(_$isWindow_60); + +var _window2 = ___interopRequireDefault_59(_$window_68); + +function ___interopRequireDefault_59(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var __window_59 = function window(thing) { + return thing === _window2["default"].window || (0, ___isWindow_59["default"])(thing); +}; + +_$is_59.window = __window_59; + +var docFrag = function docFrag(thing) { + return object(thing) && thing.nodeType === 11; +}; + +_$is_59.docFrag = docFrag; + +var object = function object(thing) { + return !!thing && _typeof(thing) === 'object'; +}; + +_$is_59.object = object; + +var func = function func(thing) { + return typeof thing === 'function'; +}; + +_$is_59.func = func; + +var number = function number(thing) { + return typeof thing === 'number'; +}; + +_$is_59.number = number; + +var bool = function bool(thing) { + return typeof thing === 'boolean'; +}; + +_$is_59.bool = bool; + +var string = function string(thing) { + return typeof thing === 'string'; +}; + +_$is_59.string = string; + +var element = function element(thing) { + if (!thing || _typeof(thing) !== 'object') { + return false; + } + + var _window = _window2["default"].getWindow(thing) || _window2["default"].window; + + return /object|function/.test(_typeof(_window.Element)) ? thing instanceof _window.Element // DOM2 + : thing.nodeType === 1 && typeof thing.nodeName === 'string'; +}; + +_$is_59.element = element; + +var plainObject = function plainObject(thing) { + return object(thing) && !!thing.constructor && /function Object\b/.test(thing.constructor.toString()); +}; + +_$is_59.plainObject = plainObject; + +var array = function array(thing) { + return object(thing) && typeof thing.length !== 'undefined' && func(thing.splice); +}; + +_$is_59.array = array; + +var _$drag_1 = {}; +"use strict"; + +function ___typeof_1(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_1 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_1 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_1(obj); } + +Object.defineProperty(_$drag_1, "__esModule", { + value: true +}); +_$drag_1["default"] = void 0; + +var is = _interopRequireWildcard(_$is_59); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_1(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function install(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + defaults = scope.defaults; + Interactable.prototype.draggable = drag.draggable; + actions.map.drag = drag; + actions.methodDict.drag = 'draggable'; + defaults.actions.drag = drag.defaults; +} + +function beforeMove(_ref) { + var interaction = _ref.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x') { + interaction.coords.cur.page.y = interaction.coords.start.page.y; + interaction.coords.cur.client.y = interaction.coords.start.client.y; + interaction.coords.velocity.client.y = 0; + interaction.coords.velocity.page.y = 0; + } else if (axis === 'y') { + interaction.coords.cur.page.x = interaction.coords.start.page.x; + interaction.coords.cur.client.x = interaction.coords.start.client.x; + interaction.coords.velocity.client.x = 0; + interaction.coords.velocity.page.x = 0; + } +} + +function move(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x' || axis === 'y') { + var opposite = axis === 'x' ? 'y' : 'x'; + iEvent.page[opposite] = interaction.coords.start.page[opposite]; + iEvent.client[opposite] = interaction.coords.start.client[opposite]; + iEvent.delta[opposite] = 0; + } +} +/** + * ```js + * interact(element).draggable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // the axis in which the first movement must be + * // for the drag sequence to start + * // 'xy' by default - any direction + * startAxis: 'x' || 'y' || 'xy', + * + * // 'xy' by default - don't restrict to one axis (move in any direction) + * // 'x' or 'y' to restrict movement to either axis + * // 'start' to restrict movement to the axis the drag started in + * lockAxis: 'x' || 'y' || 'xy' || 'start', + * + * // max number of drags that can happen concurrently + * // with elements of this Interactable. Infinity by default + * max: Infinity, + * + * // max number of drags that can target the same element+Interactable + * // 1 by default + * maxPerElement: 2 + * }) + * + * var isDraggable = interact('element').draggable(); // true + * ``` + * + * Get or set whether drag actions can be performed on the target + * + * @alias Interactable.prototype.draggable + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on drag events (object makes the Interactable + * draggable) + * @return {boolean | Interactable} boolean indicating if this can be the + * target of drag events, or this Interctable + */ + + +var draggable = function draggable(options) { + if (is.object(options)) { + this.options.drag.enabled = options.enabled !== false; + this.setPerAction('drag', options); + this.setOnEvents('drag', options); + + if (/^(xy|x|y|start)$/.test(options.lockAxis)) { + this.options.drag.lockAxis = options.lockAxis; + } + + if (/^(xy|x|y)$/.test(options.startAxis)) { + this.options.drag.startAxis = options.startAxis; + } + + return this; + } + + if (is.bool(options)) { + this.options.drag.enabled = options; + return this; + } + + return this.options.drag; +}; + +var drag = { + id: 'actions/drag', + install: install, + listeners: { + 'interactions:before-action-move': beforeMove, + 'interactions:action-resume': beforeMove, + // dragmove + 'interactions:action-move': move, + 'auto-start:check': function autoStartCheck(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + buttons = arg.buttons; + var dragOptions = interactable.options.drag; + + if (!(dragOptions && dragOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & interactable.options.drag.mouseButtons) === 0) { + return undefined; + } + + arg.action = { + name: 'drag', + axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis + }; + return false; + } + }, + draggable: draggable, + beforeMove: beforeMove, + move: move, + defaults: { + startAxis: 'xy', + lockAxis: 'xy' + }, + getCursor: function getCursor() { + return 'move'; + } +}; +var ___default_1 = drag; +_$drag_1["default"] = ___default_1; + +var _$arr_49 = {}; +"use strict"; + +Object.defineProperty(_$arr_49, "__esModule", { + value: true +}); +_$arr_49.find = _$arr_49.findIndex = _$arr_49.from = _$arr_49.merge = _$arr_49.remove = _$arr_49.contains = void 0; + +var contains = function contains(array, target) { + return array.indexOf(target) !== -1; +}; + +_$arr_49.contains = contains; + +var remove = function remove(array, target) { + return array.splice(array.indexOf(target), 1); +}; + +_$arr_49.remove = remove; + +var merge = function merge(target, source) { + for (var _i = 0; _i < source.length; _i++) { + var _ref; + + _ref = source[_i]; + var item = _ref; + target.push(item); + } + + return target; +}; + +_$arr_49.merge = merge; + +var from = function from(source) { + return merge([], source); +}; + +_$arr_49.from = from; + +var findIndex = function findIndex(array, func) { + for (var i = 0; i < array.length; i++) { + if (func(array[i], i, array)) { + return i; + } + } + + return -1; +}; + +_$arr_49.findIndex = findIndex; + +var find = function find(array, func) { + return array[findIndex(array, func)]; +}; + +_$arr_49.find = find; + +var _$domObjects_52 = {}; +"use strict"; + +Object.defineProperty(_$domObjects_52, "__esModule", { + value: true +}); +_$domObjects_52["default"] = void 0; +var domObjects = { + init: __init_52, + document: null, + DocumentFragment: null, + SVGElement: null, + SVGSVGElement: null, + SVGElementInstance: null, + Element: null, + HTMLElement: null, + Event: null, + Touch: null, + PointerEvent: null +}; + +function blank() {} + +var ___default_52 = domObjects; +_$domObjects_52["default"] = ___default_52; + +function __init_52(window) { + var win = window; + domObjects.document = win.document; + domObjects.DocumentFragment = win.DocumentFragment || blank; + domObjects.SVGElement = win.SVGElement || blank; + domObjects.SVGSVGElement = win.SVGSVGElement || blank; + domObjects.SVGElementInstance = win.SVGElementInstance || blank; + domObjects.Element = win.Element || blank; + domObjects.HTMLElement = win.HTMLElement || domObjects.Element; + domObjects.Event = win.Event; + domObjects.Touch = win.Touch || blank; + domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent; +} + +var _$browser_50 = {}; +"use strict"; + +function ___typeof_50(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_50 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_50 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_50(obj); } + +Object.defineProperty(_$browser_50, "__esModule", { + value: true +}); +_$browser_50["default"] = void 0; + +var _domObjects = ___interopRequireDefault_50(_$domObjects_52); + +var __is_50 = ___interopRequireWildcard_50(_$is_59); + +var _window = ___interopRequireDefault_50(_$window_68); + +function ___getRequireWildcardCache_50() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_50 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_50(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_50(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_50(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_50(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var browser = { + init: __init_50, + supportsTouch: null, + supportsPointerEvent: null, + isIOS7: null, + isIOS: null, + isIe9: null, + isOperaMobile: null, + prefixedMatchesSelector: null, + pEventTypes: null, + wheelEvent: null +}; + +function __init_50(window) { + var Element = _domObjects["default"].Element; + var navigator = _window["default"].window.navigator; // Does the browser support touch input? + + browser.supportsTouch = 'ontouchstart' in window || __is_50.func(window.DocumentTouch) && _domObjects["default"].document instanceof window.DocumentTouch; // Does the browser support PointerEvents + + browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!_domObjects["default"].PointerEvent; + browser.isIOS = /iP(hone|od|ad)/.test(navigator.platform); // scrolling doesn't change the result of getClientRects on iOS 7 + + browser.isIOS7 = /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\d]/.test(navigator.appVersion); + browser.isIe9 = /MSIE 9/.test(navigator.userAgent); // Opera Mobile must be handled differently + + browser.isOperaMobile = navigator.appName === 'Opera' && browser.supportsTouch && /Presto/.test(navigator.userAgent); // prefix matchesSelector + + browser.prefixedMatchesSelector = 'matches' in Element.prototype ? 'matches' : 'webkitMatchesSelector' in Element.prototype ? 'webkitMatchesSelector' : 'mozMatchesSelector' in Element.prototype ? 'mozMatchesSelector' : 'oMatchesSelector' in Element.prototype ? 'oMatchesSelector' : 'msMatchesSelector'; + browser.pEventTypes = browser.supportsPointerEvent ? _domObjects["default"].PointerEvent === window.MSPointerEvent ? { + up: 'MSPointerUp', + down: 'MSPointerDown', + over: 'mouseover', + out: 'mouseout', + move: 'MSPointerMove', + cancel: 'MSPointerCancel' + } : { + up: 'pointerup', + down: 'pointerdown', + over: 'pointerover', + out: 'pointerout', + move: 'pointermove', + cancel: 'pointercancel' + } : null; // because Webkit and Opera still use 'mousewheel' event type + + browser.wheelEvent = 'onmousewheel' in _domObjects["default"].document ? 'mousewheel' : 'wheel'; +} + +var ___default_50 = browser; +_$browser_50["default"] = ___default_50; + +var _$clone_51 = {}; +"use strict"; + +function ___typeof_51(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_51 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_51 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_51(obj); } + +Object.defineProperty(_$clone_51, "__esModule", { + value: true +}); +_$clone_51["default"] = clone; + +var arr = ___interopRequireWildcard_51(_$arr_49); + +var __is_51 = ___interopRequireWildcard_51(_$is_59); + +function ___getRequireWildcardCache_51() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_51 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_51(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_51(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_51(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +// tslint:disable-next-line ban-types +function clone(source) { + var dest = {}; + + for (var prop in source) { + var value = source[prop]; + + if (__is_51.plainObject(value)) { + dest[prop] = clone(value); + } else if (__is_51.array(value)) { + dest[prop] = arr.from(value); + } else { + dest[prop] = value; + } + } + + return dest; +} + +var _$domUtils_53 = {}; +"use strict"; + +function ___typeof_53(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_53 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_53 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_53(obj); } + +Object.defineProperty(_$domUtils_53, "__esModule", { + value: true +}); +_$domUtils_53.nodeContains = nodeContains; +_$domUtils_53.closest = closest; +_$domUtils_53.parentNode = parentNode; +_$domUtils_53.matchesSelector = matchesSelector; +_$domUtils_53.indexOfDeepestElement = indexOfDeepestElement; +_$domUtils_53.matchesUpTo = matchesUpTo; +_$domUtils_53.getActualElement = getActualElement; +_$domUtils_53.getScrollXY = getScrollXY; +_$domUtils_53.getElementClientRect = getElementClientRect; +_$domUtils_53.getElementRect = getElementRect; +_$domUtils_53.getPath = getPath; +_$domUtils_53.trySelector = trySelector; + +var _browser = ___interopRequireDefault_53(_$browser_50); + +var ___domObjects_53 = ___interopRequireDefault_53(_$domObjects_52); + +var __is_53 = ___interopRequireWildcard_53(_$is_59); + +var ___window_53 = ___interopRequireWildcard_53(_$window_68); + +function ___getRequireWildcardCache_53() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_53 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_53(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_53(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_53(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_53(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function nodeContains(parent, child) { + while (child) { + if (child === parent) { + return true; + } + + child = child.parentNode; + } + + return false; +} + +function closest(element, selector) { + while (__is_53.element(element)) { + if (matchesSelector(element, selector)) { + return element; + } + + element = parentNode(element); + } + + return null; +} + +function parentNode(node) { + var parent = node.parentNode; + + if (__is_53.docFrag(parent)) { + // skip past #shado-root fragments + // tslint:disable-next-line + while ((parent = parent.host) && __is_53.docFrag(parent)) { + continue; + } + + return parent; + } + + return parent; +} + +function matchesSelector(element, selector) { + // remove /deep/ from selectors if shadowDOM polyfill is used + if (___window_53["default"].window !== ___window_53["default"].realWindow) { + selector = selector.replace(/\/deep\//g, ' '); + } + + return element[_browser["default"].prefixedMatchesSelector](selector); +} + +var getParent = function getParent(el) { + return el.parentNode ? el.parentNode : el.host; +}; // Test for the element that's "above" all other qualifiers + + +function indexOfDeepestElement(elements) { + var deepestZoneParents = []; + var deepestZone = elements[0]; + var index = deepestZone ? 0 : -1; + var i; + var n; + + for (i = 1; i < elements.length; i++) { + var dropzone = elements[i]; // an element might belong to multiple selector dropzones + + if (!dropzone || dropzone === deepestZone) { + continue; + } + + if (!deepestZone) { + deepestZone = dropzone; + index = i; + continue; + } // check if the deepest or current are document.documentElement or document.rootElement + // - if the current dropzone is, do nothing and continue + + + if (dropzone.parentNode === dropzone.ownerDocument) { + continue; + } // - if deepest is, update with the current dropzone and continue to next + else if (deepestZone.parentNode === dropzone.ownerDocument) { + deepestZone = dropzone; + index = i; + continue; + } // compare zIndex of siblings + + + if (dropzone.parentNode === deepestZone.parentNode) { + var deepestZIndex = parseInt((0, ___window_53.getWindow)(deepestZone).getComputedStyle(deepestZone).zIndex, 10) || 0; + var dropzoneZIndex = parseInt((0, ___window_53.getWindow)(dropzone).getComputedStyle(dropzone).zIndex, 10) || 0; + + if (dropzoneZIndex >= deepestZIndex) { + deepestZone = dropzone; + index = i; + } + + continue; + } // populate the ancestry array for the latest deepest dropzone + + + if (!deepestZoneParents.length) { + var _parent = deepestZone; + var parentParent = void 0; + + while ((parentParent = getParent(_parent)) && parentParent !== _parent.ownerDocument) { + deepestZoneParents.unshift(_parent); + _parent = parentParent; + } + } + + var parent = void 0; // if this element is an svg element and the current deepest is an + // HTMLElement + + if (deepestZone instanceof ___domObjects_53["default"].HTMLElement && dropzone instanceof ___domObjects_53["default"].SVGElement && !(dropzone instanceof ___domObjects_53["default"].SVGSVGElement)) { + if (dropzone === deepestZone.parentNode) { + continue; + } + + parent = dropzone.ownerSVGElement; + } else { + parent = dropzone; + } + + var dropzoneParents = []; + + while (parent.parentNode !== parent.ownerDocument) { + dropzoneParents.unshift(parent); + parent = getParent(parent); + } + + n = 0; // get (position of last common ancestor) + 1 + + while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) { + n++; + } + + var parents = [dropzoneParents[n - 1], dropzoneParents[n], deepestZoneParents[n]]; + var child = parents[0].lastChild; + + while (child) { + if (child === parents[1]) { + deepestZone = dropzone; + index = i; + deepestZoneParents = dropzoneParents; + break; + } else if (child === parents[2]) { + break; + } + + child = child.previousSibling; + } + } + + return index; +} + +function matchesUpTo(element, selector, limit) { + while (__is_53.element(element)) { + if (matchesSelector(element, selector)) { + return true; + } + + element = parentNode(element); + + if (element === limit) { + return matchesSelector(element, selector); + } + } + + return false; +} + +function getActualElement(element) { + return element instanceof ___domObjects_53["default"].SVGElementInstance ? element.correspondingUseElement : element; +} + +function getScrollXY(relevantWindow) { + relevantWindow = relevantWindow || ___window_53["default"].window; + return { + x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft, + y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop + }; +} + +function getElementClientRect(element) { + var clientRect = element instanceof ___domObjects_53["default"].SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0]; + return clientRect && { + left: clientRect.left, + right: clientRect.right, + top: clientRect.top, + bottom: clientRect.bottom, + width: clientRect.width || clientRect.right - clientRect.left, + height: clientRect.height || clientRect.bottom - clientRect.top + }; +} + +function getElementRect(element) { + var clientRect = getElementClientRect(element); + + if (!_browser["default"].isIOS7 && clientRect) { + var scroll = getScrollXY(___window_53["default"].getWindow(element)); + clientRect.left += scroll.x; + clientRect.right += scroll.x; + clientRect.top += scroll.y; + clientRect.bottom += scroll.y; + } + + return clientRect; +} + +function getPath(node) { + var path = []; + + while (node) { + path.push(node); + node = parentNode(node); + } + + return path; +} + +function trySelector(value) { + if (!__is_53.string(value)) { + return false; + } // an exception will be raised if it is invalid + + + ___domObjects_53["default"].document.querySelector(value); + + return true; +} + +var _$pointerExtend_62 = {}; +"use strict"; + +Object.defineProperty(_$pointerExtend_62, "__esModule", { + value: true +}); +_$pointerExtend_62["default"] = void 0; + +function pointerExtend(dest, source) { + for (var prop in source) { + var prefixedPropREs = pointerExtend.prefixedPropREs; + var deprecated = false; // skip deprecated prefixed properties + + for (var vendor in prefixedPropREs) { + if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) { + deprecated = true; + break; + } + } + + if (!deprecated && typeof source[prop] !== 'function') { + dest[prop] = source[prop]; + } + } + + return dest; +} + +pointerExtend.prefixedPropREs = { + webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/, + moz: /(Pressure)$/ +}; +var ___default_62 = pointerExtend; +_$pointerExtend_62["default"] = ___default_62; + +var _$hypot_57 = {}; +"use strict"; + +Object.defineProperty(_$hypot_57, "__esModule", { + value: true +}); +_$hypot_57["default"] = void 0; + +var ___default_57 = function _default(x, y) { + return Math.sqrt(x * x + y * y); +}; + +_$hypot_57["default"] = ___default_57; + +var _$pointerUtils_63 = {}; +"use strict"; + +function ___typeof_63(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_63 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_63 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_63(obj); } + +Object.defineProperty(_$pointerUtils_63, "__esModule", { + value: true +}); +_$pointerUtils_63.copyCoords = copyCoords; +_$pointerUtils_63.setCoordDeltas = setCoordDeltas; +_$pointerUtils_63.setCoordVelocity = setCoordVelocity; +_$pointerUtils_63.setZeroCoords = setZeroCoords; +_$pointerUtils_63.isNativePointer = isNativePointer; +_$pointerUtils_63.getXY = getXY; +_$pointerUtils_63.getPageXY = getPageXY; +_$pointerUtils_63.getClientXY = getClientXY; +_$pointerUtils_63.getPointerId = getPointerId; +_$pointerUtils_63.setCoords = setCoords; +_$pointerUtils_63.getTouchPair = getTouchPair; +_$pointerUtils_63.pointerAverage = pointerAverage; +_$pointerUtils_63.touchBBox = touchBBox; +_$pointerUtils_63.touchDistance = touchDistance; +_$pointerUtils_63.touchAngle = touchAngle; +_$pointerUtils_63.getPointerType = getPointerType; +_$pointerUtils_63.getEventTargets = getEventTargets; +_$pointerUtils_63.newCoords = newCoords; +_$pointerUtils_63.coordsToEvent = coordsToEvent; +Object.defineProperty(_$pointerUtils_63, "pointerExtend", { + enumerable: true, + get: function get() { + return _pointerExtend["default"]; + } +}); + +var ___browser_63 = ___interopRequireDefault_63(_$browser_50); + +var ___domObjects_63 = ___interopRequireDefault_63(_$domObjects_52); + +var domUtils = ___interopRequireWildcard_63(_$domUtils_53); + +var _hypot = ___interopRequireDefault_63(_$hypot_57); + +var __is_63 = ___interopRequireWildcard_63(_$is_59); + +var _pointerExtend = ___interopRequireDefault_63(_$pointerExtend_62); + +function ___getRequireWildcardCache_63() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_63 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_63(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_63(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_63(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_63(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function copyCoords(dest, src) { + dest.page = dest.page || {}; + dest.page.x = src.page.x; + dest.page.y = src.page.y; + dest.client = dest.client || {}; + dest.client.x = src.client.x; + dest.client.y = src.client.y; + dest.timeStamp = src.timeStamp; +} + +function setCoordDeltas(targetObj, prev, cur) { + targetObj.page.x = cur.page.x - prev.page.x; + targetObj.page.y = cur.page.y - prev.page.y; + targetObj.client.x = cur.client.x - prev.client.x; + targetObj.client.y = cur.client.y - prev.client.y; + targetObj.timeStamp = cur.timeStamp - prev.timeStamp; +} + +function setCoordVelocity(targetObj, delta) { + var dt = Math.max(delta.timeStamp / 1000, 0.001); + targetObj.page.x = delta.page.x / dt; + targetObj.page.y = delta.page.y / dt; + targetObj.client.x = delta.client.x / dt; + targetObj.client.y = delta.client.y / dt; + targetObj.timeStamp = dt; +} + +function setZeroCoords(targetObj) { + targetObj.page.x = 0; + targetObj.page.y = 0; + targetObj.client.x = 0; + targetObj.client.y = 0; +} + +function isNativePointer(pointer) { + return pointer instanceof ___domObjects_63["default"].Event || pointer instanceof ___domObjects_63["default"].Touch; +} // Get specified X/Y coords for mouse or event.touches[0] + + +function getXY(type, pointer, xy) { + xy = xy || {}; + type = type || 'page'; + xy.x = pointer[type + 'X']; + xy.y = pointer[type + 'Y']; + return xy; +} + +function getPageXY(pointer, page) { + page = page || { + x: 0, + y: 0 + }; // Opera Mobile handles the viewport and scrolling oddly + + if (___browser_63["default"].isOperaMobile && isNativePointer(pointer)) { + getXY('screen', pointer, page); + page.x += window.scrollX; + page.y += window.scrollY; + } else { + getXY('page', pointer, page); + } + + return page; +} + +function getClientXY(pointer, client) { + client = client || {}; + + if (___browser_63["default"].isOperaMobile && isNativePointer(pointer)) { + // Opera Mobile handles the viewport and scrolling oddly + getXY('screen', pointer, client); + } else { + getXY('client', pointer, client); + } + + return client; +} + +function getPointerId(pointer) { + return __is_63.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier; +} + +function setCoords(targetObj, pointers, timeStamp) { + var pointer = pointers.length > 1 ? pointerAverage(pointers) : pointers[0]; + var tmpXY = {}; + getPageXY(pointer, tmpXY); + targetObj.page.x = tmpXY.x; + targetObj.page.y = tmpXY.y; + getClientXY(pointer, tmpXY); + targetObj.client.x = tmpXY.x; + targetObj.client.y = tmpXY.y; + targetObj.timeStamp = timeStamp; +} + +function getTouchPair(event) { + var touches = []; // array of touches is supplied + + if (__is_63.array(event)) { + touches[0] = event[0]; + touches[1] = event[1]; + } // an event + else { + if (event.type === 'touchend') { + if (event.touches.length === 1) { + touches[0] = event.touches[0]; + touches[1] = event.changedTouches[0]; + } else if (event.touches.length === 0) { + touches[0] = event.changedTouches[0]; + touches[1] = event.changedTouches[1]; + } + } else { + touches[0] = event.touches[0]; + touches[1] = event.touches[1]; + } + } + + return touches; +} + +function pointerAverage(pointers) { + var average = { + pageX: 0, + pageY: 0, + clientX: 0, + clientY: 0, + screenX: 0, + screenY: 0 + }; + + for (var _i = 0; _i < pointers.length; _i++) { + var _ref; + + _ref = pointers[_i]; + var pointer = _ref; + + for (var _prop in average) { + average[_prop] += pointer[_prop]; + } + } + + for (var prop in average) { + average[prop] /= pointers.length; + } + + return average; +} + +function touchBBox(event) { + if (!event.length && !(event.touches && event.touches.length > 1)) { + return null; + } + + var touches = getTouchPair(event); + var minX = Math.min(touches[0].pageX, touches[1].pageX); + var minY = Math.min(touches[0].pageY, touches[1].pageY); + var maxX = Math.max(touches[0].pageX, touches[1].pageX); + var maxY = Math.max(touches[0].pageY, touches[1].pageY); + return { + x: minX, + y: minY, + left: minX, + top: minY, + right: maxX, + bottom: maxY, + width: maxX - minX, + height: maxY - minY + }; +} + +function touchDistance(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = getTouchPair(event); + var dx = touches[0][sourceX] - touches[1][sourceX]; + var dy = touches[0][sourceY] - touches[1][sourceY]; + return (0, _hypot["default"])(dx, dy); +} + +function touchAngle(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = getTouchPair(event); + var dx = touches[1][sourceX] - touches[0][sourceX]; + var dy = touches[1][sourceY] - touches[0][sourceY]; + var angle = 180 * Math.atan2(dy, dx) / Math.PI; + return angle; +} + +function getPointerType(pointer) { + return __is_63.string(pointer.pointerType) ? pointer.pointerType : __is_63.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof ___domObjects_63["default"].Touch ? 'touch' : 'mouse'; +} // [ event.target, event.currentTarget ] + + +function getEventTargets(event) { + var path = __is_63.func(event.composedPath) ? event.composedPath() : event.path; + return [domUtils.getActualElement(path ? path[0] : event.target), domUtils.getActualElement(event.currentTarget)]; +} + +function newCoords() { + return { + page: { + x: 0, + y: 0 + }, + client: { + x: 0, + y: 0 + }, + timeStamp: 0 + }; +} + +function coordsToEvent(coords) { + var event = { + coords: coords, + + get page() { + return this.coords.page; + }, + + get client() { + return this.coords.client; + }, + + get timeStamp() { + return this.coords.timeStamp; + }, + + get pageX() { + return this.coords.page.x; + }, + + get pageY() { + return this.coords.page.y; + }, + + get clientX() { + return this.coords.client.x; + }, + + get clientY() { + return this.coords.client.y; + }, + + get pointerId() { + return this.coords.pointerId; + }, + + get target() { + return this.coords.target; + }, + + get type() { + return this.coords.type; + }, + + get pointerType() { + return this.coords.pointerType; + }, + + get buttons() { + return this.coords.buttons; + }, + + preventDefault: function preventDefault() {} + }; + return event; +} + +var _$events_54 = {}; +"use strict"; + +function ___typeof_54(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_54 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_54 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_54(obj); } + +Object.defineProperty(_$events_54, "__esModule", { + value: true +}); +_$events_54["default"] = _$events_54.FakeEvent = void 0; + +/* removed: var _$arr_49 = require("./arr"); */; + +var __domUtils_54 = ___interopRequireWildcard_54(_$domUtils_53); + +var __is_54 = ___interopRequireWildcard_54(_$is_59); + +var ___pointerExtend_54 = ___interopRequireDefault_54(_$pointerExtend_62); + +var pointerUtils = ___interopRequireWildcard_54(_$pointerUtils_63); + +function ___interopRequireDefault_54(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_54() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_54 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_54(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_54(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_54(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var elements = []; +var targets = []; +var delegatedEvents = {}; +var documents = []; + +function add(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; + + if (!target) { + target = { + events: {}, + typeCount: 0 + }; + elementIndex = elements.push(element) - 1; + targets.push(target); + } + + if (!target.events[type]) { + target.events[type] = []; + target.typeCount++; + } + + if (element.removeEventListener && !(0, _$arr_49.contains)(target.events[type], listener)) { + element.addEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].push(listener); + } +} + +function __remove_54(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; + + if (!target || !target.events) { + return; + } + + if (type === 'all') { + for (type in target.events) { + if (target.events.hasOwnProperty(type)) { + __remove_54(element, type, 'all'); + } + } + + return; + } + + if (target.events[type]) { + var len = target.events[type].length; + + if (listener === 'all') { + for (var i = 0; i < len; i++) { + __remove_54(element, type, target.events[type][i], options); + } + + return; + } else { + for (var _i = 0; _i < len; _i++) { + if (element.removeEventListener && target.events[type][_i] === listener) { + element.removeEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].splice(_i, 1); + break; + } + } + } + + if (target.events[type] && target.events[type].length === 0) { + target.events[type] = null; + target.typeCount--; + } + } + + if (!target.typeCount) { + targets.splice(elementIndex, 1); + elements.splice(elementIndex, 1); + } +} + +function addDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + + if (!delegatedEvents[type]) { + delegatedEvents[type] = { + contexts: [], + listeners: [], + selectors: [] + }; // add delegate listener functions + + for (var _i2 = 0; _i2 < documents.length; _i2++) { + var _ref; + + _ref = documents[_i2]; + var doc = _ref; + add(doc, type, delegateListener); + add(doc, type, delegateUseCapture, true); + } + } + + var delegated = delegatedEvents[type]; + var index; + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + break; + } + } + + if (index === -1) { + index = delegated.selectors.length; + delegated.selectors.push(selector); + delegated.contexts.push(context); + delegated.listeners.push([]); + } // keep listener and capture and passive flags + + + delegated.listeners[index].push([listener, !!options.capture, options.passive]); +} + +function removeDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var delegated = delegatedEvents[type]; + var matchFound = false; + var index; + + if (!delegated) { + return; + } // count from last index of delegated to 0 + + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + // look for matching selector and context Node + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + var listeners = delegated.listeners[index]; // each item of the listeners array is an array: [function, capture, passive] + + for (var i = listeners.length - 1; i >= 0; i--) { + var _listeners$i = _slicedToArray(listeners[i], 3), + fn = _listeners$i[0], + capture = _listeners$i[1], + passive = _listeners$i[2]; // check if the listener functions and capture and passive flags match + + + if (fn === listener && capture === !!options.capture && passive === options.passive) { + // remove the listener from the array of listeners + listeners.splice(i, 1); // if all listeners for this interactable have been removed + // remove the interactable from the delegated arrays + + if (!listeners.length) { + delegated.selectors.splice(index, 1); + delegated.contexts.splice(index, 1); + delegated.listeners.splice(index, 1); // remove delegate function from context + + __remove_54(context, type, delegateListener); + __remove_54(context, type, delegateUseCapture, true); // remove the arrays if they are empty + + if (!delegated.selectors.length) { + delegatedEvents[type] = null; + } + } // only remove one listener + + + matchFound = true; + break; + } + } + + if (matchFound) { + break; + } + } + } +} // bound to the interactable context when a DOM event +// listener is added to a selector interactable + + +function delegateListener(event, optionalArg) { + var options = getOptions(optionalArg); + var fakeEvent = new FakeEvent(event); + var delegated = delegatedEvents[event.type]; + + var _pointerUtils$getEven = pointerUtils.getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 1), + eventTarget = _pointerUtils$getEven2[0]; + + var element = eventTarget; // climb up document tree looking for selector matches + + while (__is_54.element(element)) { + for (var i = 0; i < delegated.selectors.length; i++) { + var selector = delegated.selectors[i]; + var context = delegated.contexts[i]; + + if (__domUtils_54.matchesSelector(element, selector) && __domUtils_54.nodeContains(context, eventTarget) && __domUtils_54.nodeContains(context, element)) { + var listeners = delegated.listeners[i]; + fakeEvent.currentTarget = element; + + for (var _i3 = 0; _i3 < listeners.length; _i3++) { + var _ref2; + + _ref2 = listeners[_i3]; + + var _ref3 = _ref2, + _ref4 = _slicedToArray(_ref3, 3), + fn = _ref4[0], + capture = _ref4[1], + passive = _ref4[2]; + + if (capture === !!options.capture && passive === options.passive) { + fn(fakeEvent); + } + } + } + } + + element = __domUtils_54.parentNode(element); + } +} + +function delegateUseCapture(event) { + return delegateListener.call(this, event, true); +} + +function getOptions(param) { + return __is_54.object(param) ? param : { + capture: param + }; +} + +var FakeEvent = /*#__PURE__*/function () { + function FakeEvent(originalEvent) { + _classCallCheck(this, FakeEvent); + + this.originalEvent = originalEvent; + + _defineProperty(this, "currentTarget", void 0); + + // duplicate the event so that currentTarget can be changed + (0, ___pointerExtend_54["default"])(this, originalEvent); + } + + _createClass(FakeEvent, [{ + key: "preventOriginalDefault", + value: function preventOriginalDefault() { + this.originalEvent.preventDefault(); + } + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.originalEvent.stopPropagation(); + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.originalEvent.stopImmediatePropagation(); + } + }]); + + return FakeEvent; +}(); + +_$events_54.FakeEvent = FakeEvent; +var events = { + add: add, + remove: __remove_54, + addDelegate: addDelegate, + removeDelegate: removeDelegate, + delegateListener: delegateListener, + delegateUseCapture: delegateUseCapture, + delegatedEvents: delegatedEvents, + documents: documents, + supportsOptions: false, + supportsPassive: false, + _elements: elements, + _targets: targets, + init: function init(window) { + window.document.createElement('div').addEventListener('test', null, { + get capture() { + return events.supportsOptions = true; + }, + + get passive() { + return events.supportsPassive = true; + } + + }); + } +}; +var ___default_54 = events; +_$events_54["default"] = ___default_54; + +var _$extend_55 = {}; +"use strict"; + +Object.defineProperty(_$extend_55, "__esModule", { + value: true +}); +_$extend_55["default"] = extend; + +function extend(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } + + var ret = dest; + return ret; +} + +var _$normalizeListeners_61 = {}; +"use strict"; + +function ___typeof_61(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_61 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_61 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_61(obj); } + +Object.defineProperty(_$normalizeListeners_61, "__esModule", { + value: true +}); +_$normalizeListeners_61["default"] = normalize; + +var _extend = ___interopRequireDefault_61(_$extend_55); + +var __is_61 = ___interopRequireWildcard_61(_$is_59); + +function ___getRequireWildcardCache_61() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_61 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_61(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_61(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_61(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_61(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function normalize(type, listeners, result) { + result = result || {}; + + if (__is_61.string(type) && type.search(' ') !== -1) { + type = split(type); + } + + if (__is_61.array(type)) { + return type.reduce(function (acc, t) { + return (0, _extend["default"])(acc, normalize(t, listeners, result)); + }, result); + } // ({ type: fn }) -> ('', { type: fn }) + + + if (__is_61.object(type)) { + listeners = type; + type = ''; + } + + if (__is_61.func(listeners)) { + result[type] = result[type] || []; + result[type].push(listeners); + } else if (__is_61.array(listeners)) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; + + _ref = listeners[_i]; + var l = _ref; + normalize(type, l, result); + } + } else if (__is_61.object(listeners)) { + for (var prefix in listeners) { + var combinedTypes = split(prefix).map(function (p) { + return "".concat(type).concat(p); + }); + normalize(combinedTypes, listeners[prefix], result); + } + } + + return result; +} + +function split(type) { + return type.trim().split(/ +/); +} + +var _$Eventable_14 = {}; +"use strict"; + +function ___typeof_14(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_14 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_14 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_14(obj); } + +Object.defineProperty(_$Eventable_14, "__esModule", { + value: true +}); +_$Eventable_14["default"] = void 0; + +var __arr_14 = ___interopRequireWildcard_14(_$arr_49); + +var ___extend_14 = ___interopRequireDefault_14(_$extend_55); + +var _normalizeListeners = ___interopRequireDefault_14(_$normalizeListeners_61); + +function ___interopRequireDefault_14(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_14() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_14 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_14(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_14(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_14(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_14(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_14(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_14(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_14(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_14(Constructor, staticProps); return Constructor; } + +function ___defineProperty_14(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function fireUntilImmediateStopped(event, listeners) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; + + _ref = listeners[_i]; + var listener = _ref; + + if (event.immediatePropagationStopped) { + break; + } + + listener(event); + } +} + +var Eventable = /*#__PURE__*/function () { + function Eventable(options) { + ___classCallCheck_14(this, Eventable); + + ___defineProperty_14(this, "options", void 0); + + ___defineProperty_14(this, "types", {}); + + ___defineProperty_14(this, "propagationStopped", false); + + ___defineProperty_14(this, "immediatePropagationStopped", false); + + ___defineProperty_14(this, "global", void 0); + + this.options = (0, ___extend_14["default"])({}, options || {}); + } + + ___createClass_14(Eventable, [{ + key: "fire", + value: function fire(event) { + var listeners; + var global = this.global; // Interactable#on() listeners + // tslint:disable no-conditional-assignment + + if (listeners = this.types[event.type]) { + fireUntilImmediateStopped(event, listeners); + } // interact.on() listeners + + + if (!event.propagationStopped && global && (listeners = global[event.type])) { + fireUntilImmediateStopped(event, listeners); + } + } + }, { + key: "on", + value: function on(type, listener) { + var listeners = (0, _normalizeListeners["default"])(type, listener); + + for (type in listeners) { + this.types[type] = __arr_14.merge(this.types[type] || [], listeners[type]); + } + } + }, { + key: "off", + value: function off(type, listener) { + var listeners = (0, _normalizeListeners["default"])(type, listener); + + for (type in listeners) { + var eventList = this.types[type]; + + if (!eventList || !eventList.length) { + continue; + } + + for (var _i2 = 0; _i2 < listeners[type].length; _i2++) { + var _ref2; + + _ref2 = listeners[type][_i2]; + var subListener = _ref2; + + var _index = eventList.indexOf(subListener); + + if (_index !== -1) { + eventList.splice(_index, 1); + } + } + } + } + }, { + key: "getRect", + value: function getRect(_element) { + return null; + } + }]); + + return Eventable; +}(); + +var ___default_14 = Eventable; +_$Eventable_14["default"] = ___default_14; + +var _$rect_65 = {}; +"use strict"; + +function ___typeof_65(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_65 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_65 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_65(obj); } + +Object.defineProperty(_$rect_65, "__esModule", { + value: true +}); +_$rect_65.getStringOptionResult = getStringOptionResult; +_$rect_65.resolveRectLike = resolveRectLike; +_$rect_65.rectToXY = rectToXY; +_$rect_65.xywhToTlbr = xywhToTlbr; +_$rect_65.tlbrToXywh = tlbrToXywh; +_$rect_65.addEdges = addEdges; + +/* removed: var _$domUtils_53 = require("./domUtils"); */; + +var ___extend_65 = ___interopRequireDefault_65(_$extend_55); + +var __is_65 = ___interopRequireWildcard_65(_$is_59); + +function ___getRequireWildcardCache_65() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_65 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_65(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_65(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_65(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_65(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +function getStringOptionResult(value, target, element) { + if (value === 'parent') { + return (0, _$domUtils_53.parentNode)(element); + } + + if (value === 'self') { + return target.getRect(element); + } + + return (0, _$domUtils_53.closest)(element, value); +} + +function resolveRectLike(value, target, element, functionArgs) { + var returnValue = value; + + if (__is_65.string(returnValue)) { + returnValue = getStringOptionResult(returnValue, target, element); + } else if (__is_65.func(returnValue)) { + returnValue = returnValue.apply(void 0, _toConsumableArray(functionArgs)); + } + + if (__is_65.element(returnValue)) { + returnValue = (0, _$domUtils_53.getElementRect)(returnValue); + } + + return returnValue; +} + +function rectToXY(rect) { + return rect && { + x: 'x' in rect ? rect.x : rect.left, + y: 'y' in rect ? rect.y : rect.top + }; +} + +function xywhToTlbr(rect) { + if (rect && !('left' in rect && 'top' in rect)) { + rect = (0, ___extend_65["default"])({}, rect); + rect.left = rect.x || 0; + rect.top = rect.y || 0; + rect.right = rect.right || rect.left + rect.width; + rect.bottom = rect.bottom || rect.top + rect.height; + } + + return rect; +} + +function tlbrToXywh(rect) { + if (rect && !('x' in rect && 'y' in rect)) { + rect = (0, ___extend_65["default"])({}, rect); + rect.x = rect.left || 0; + rect.y = rect.top || 0; + rect.width = rect.width || rect.right || 0 - rect.x; + rect.height = rect.height || rect.bottom || 0 - rect.y; + } + + return rect; +} + +function addEdges(edges, rect, delta) { + if (edges.left) { + rect.left += delta.x; + } + + if (edges.right) { + rect.right += delta.x; + } + + if (edges.top) { + rect.top += delta.y; + } + + if (edges.bottom) { + rect.bottom += delta.y; + } + + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; +} + +var _$getOriginXY_56 = {}; +"use strict"; + +Object.defineProperty(_$getOriginXY_56, "__esModule", { + value: true +}); +_$getOriginXY_56["default"] = ___default_56; + +/* removed: var _$rect_65 = require("./rect"); */; + +function ___default_56(target, element, actionName) { + var actionOptions = target.options[actionName]; + var actionOrigin = actionOptions && actionOptions.origin; + var origin = actionOrigin || target.options.origin; + var originRect = (0, _$rect_65.resolveRectLike)(origin, target, element, [target && element]); + return (0, _$rect_65.rectToXY)(originRect) || { + x: 0, + y: 0 + }; +} + +var _$raf_64 = {}; +"use strict"; + +Object.defineProperty(_$raf_64, "__esModule", { + value: true +}); +_$raf_64["default"] = void 0; +var lastTime = 0; + +var _request; + +var _cancel; + +function __init_64(window) { + _request = window.requestAnimationFrame; + _cancel = window.cancelAnimationFrame; + + if (!_request) { + var vendors = ['ms', 'moz', 'webkit', 'o']; + + for (var _i = 0; _i < vendors.length; _i++) { + var vendor = vendors[_i]; + _request = window["".concat(vendor, "RequestAnimationFrame")]; + _cancel = window["".concat(vendor, "CancelAnimationFrame")] || window["".concat(vendor, "CancelRequestAnimationFrame")]; + } + } + + if (!_request) { + _request = function request(callback) { + var currTime = Date.now(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); // eslint-disable-next-line standard/no-callback-literal + + var token = setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return token; + }; + + _cancel = function cancel(token) { + return clearTimeout(token); + }; + } +} + +var ___default_64 = { + request: function request(callback) { + return _request(callback); + }, + cancel: function cancel(token) { + return _cancel(token); + }, + init: __init_64 +}; +_$raf_64["default"] = ___default_64; + +var _$index_58 = {}; +"use strict"; + +function ___typeof_58(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_58 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_58 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_58(obj); } + +Object.defineProperty(_$index_58, "__esModule", { + value: true +}); +_$index_58.warnOnce = warnOnce; +_$index_58.copyAction = copyAction; +Object.defineProperty(_$index_58, "win", { + enumerable: true, + get: function get() { + return ___window_58["default"]; + } +}); +Object.defineProperty(_$index_58, "browser", { + enumerable: true, + get: function get() { + return ___browser_58["default"]; + } +}); +Object.defineProperty(_$index_58, "clone", { + enumerable: true, + get: function get() { + return _clone["default"]; + } +}); +Object.defineProperty(_$index_58, "events", { + enumerable: true, + get: function get() { + return _events["default"]; + } +}); +Object.defineProperty(_$index_58, "extend", { + enumerable: true, + get: function get() { + return ___extend_58["default"]; + } +}); +Object.defineProperty(_$index_58, "getOriginXY", { + enumerable: true, + get: function get() { + return _getOriginXY["default"]; + } +}); +Object.defineProperty(_$index_58, "hypot", { + enumerable: true, + get: function get() { + return ___hypot_58["default"]; + } +}); +Object.defineProperty(_$index_58, "normalizeListeners", { + enumerable: true, + get: function get() { + return ___normalizeListeners_58["default"]; + } +}); +Object.defineProperty(_$index_58, "raf", { + enumerable: true, + get: function get() { + return _raf["default"]; + } +}); +_$index_58.rect = _$index_58.pointer = _$index_58.is = _$index_58.dom = _$index_58.arr = void 0; + +var __arr_58 = ___interopRequireWildcard_58(_$arr_49); + +_$index_58.arr = __arr_58; + +var dom = ___interopRequireWildcard_58(_$domUtils_53); + +_$index_58.dom = dom; + +var __is_58 = ___interopRequireWildcard_58(_$is_59); + +_$index_58.is = __is_58; + +var pointer = ___interopRequireWildcard_58(_$pointerUtils_63); + +_$index_58.pointer = pointer; + +var rect = ___interopRequireWildcard_58(_$rect_65); + +_$index_58.rect = rect; + +var ___window_58 = ___interopRequireDefault_58(_$window_68); + +var ___browser_58 = ___interopRequireDefault_58(_$browser_50); + +var _clone = ___interopRequireDefault_58(_$clone_51); + +var _events = ___interopRequireDefault_58(_$events_54); + +var ___extend_58 = ___interopRequireDefault_58(_$extend_55); + +var _getOriginXY = ___interopRequireDefault_58(_$getOriginXY_56); + +var ___hypot_58 = ___interopRequireDefault_58(_$hypot_57); + +var ___normalizeListeners_58 = ___interopRequireDefault_58(_$normalizeListeners_61); + +var _raf = ___interopRequireDefault_58(_$raf_64); + +function ___interopRequireDefault_58(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_58() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_58 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_58(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_58(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_58(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function warnOnce(method, message) { + var warned = false; // eslint-disable-next-line no-shadow + + return function () { + if (!warned) { + ___window_58["default"].window.console.warn(message); + + warned = true; + } + + return method.apply(this, arguments); + }; +} + +function copyAction(dest, src) { + dest.name = src.name; + dest.axis = src.axis; + dest.edges = src.edges; + return dest; +} + +var _$defaultOptions_20 = {}; +"use strict"; + +Object.defineProperty(_$defaultOptions_20, "__esModule", { + value: true +}); +_$defaultOptions_20["default"] = _$defaultOptions_20.defaults = void 0; +// tslint:disable no-empty-interface +// eslint-disable-next-line @typescript-eslint/no-empty-interface +// export interface Options extends BaseDefaults, PerActionDefaults {} +var defaults = { + base: { + preventDefault: 'auto', + deltaSource: 'page' + }, + perAction: { + enabled: false, + origin: { + x: 0, + y: 0 + } + }, + actions: {} +}; +_$defaultOptions_20.defaults = defaults; +var ___default_20 = defaults; +_$defaultOptions_20["default"] = ___default_20; + +var _$InteractableSet_17 = {}; +"use strict"; + +function ___typeof_17(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_17 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_17 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_17(obj); } + +Object.defineProperty(_$InteractableSet_17, "__esModule", { + value: true +}); +_$InteractableSet_17["default"] = void 0; + +var __arr_17 = ___interopRequireWildcard_17(_$arr_49); + +var __domUtils_17 = ___interopRequireWildcard_17(_$domUtils_53); + +var ___extend_17 = ___interopRequireDefault_17(_$extend_55); + +var __is_17 = ___interopRequireWildcard_17(_$is_59); + +function ___interopRequireDefault_17(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_17() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_17 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_17(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_17(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_17(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_17(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_17(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_17(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_17(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_17(Constructor, staticProps); return Constructor; } + +function ___defineProperty_17(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var InteractableSet = /*#__PURE__*/function () { + // all set interactables + function InteractableSet(scope) { + var _this = this; + + ___classCallCheck_17(this, InteractableSet); + + this.scope = scope; + + ___defineProperty_17(this, "list", []); + + ___defineProperty_17(this, "selectorMap", {}); + + scope.addListeners({ + 'interactable:unset': function interactableUnset(_ref) { + var interactable = _ref.interactable; + var target = interactable.target, + context = interactable._context; + var targetMappings = __is_17.string(target) ? _this.selectorMap[target] : target[_this.scope.id]; + var targetIndex = targetMappings.findIndex(function (m) { + return m.context === context; + }); + + if (targetMappings[targetIndex]) { + // Destroying mappingInfo's context and interactable + targetMappings[targetIndex].context = null; + targetMappings[targetIndex].interactable = null; + } + + targetMappings.splice(targetIndex, 1); + } + }); + } + + ___createClass_17(InteractableSet, [{ + key: "new", + value: function _new(target, options) { + options = (0, ___extend_17["default"])(options || {}, { + actions: this.scope.actions + }); + var interactable = new this.scope.Interactable(target, options, this.scope.document); + var mappingInfo = { + context: interactable._context, + interactable: interactable + }; + this.scope.addDocument(interactable._doc); + this.list.push(interactable); + + if (__is_17.string(target)) { + if (!this.selectorMap[target]) { + this.selectorMap[target] = []; + } + + this.selectorMap[target].push(mappingInfo); + } else { + if (!interactable.target[this.scope.id]) { + Object.defineProperty(target, this.scope.id, { + value: [], + configurable: true + }); + } + + target[this.scope.id].push(mappingInfo); + } + + this.scope.fire('interactable:new', { + target: target, + options: options, + interactable: interactable, + win: this.scope._win + }); + return interactable; + } + }, { + key: "get", + value: function get(target, options) { + var context = options && options.context || this.scope.document; + var isSelector = __is_17.string(target); + var targetMappings = isSelector ? this.selectorMap[target] : target[this.scope.id]; + + if (!targetMappings) { + return null; + } + + var found = __arr_17.find(targetMappings, function (m) { + return m.context === context && (isSelector || m.interactable.inContext(target)); + }); + return found && found.interactable; + } + }, { + key: "forEachMatch", + value: function forEachMatch(node, callback) { + for (var _i = 0; _i < this.list.length; _i++) { + var _ref2; + + _ref2 = this.list[_i]; + var _interactable = _ref2; + var ret = void 0; + + if ((__is_17.string(_interactable.target) // target is a selector and the element matches + ? __is_17.element(node) && __domUtils_17.matchesSelector(node, _interactable.target) : // target is the element + node === _interactable.target) && // the element is in context + _interactable.inContext(node)) { + ret = callback(_interactable); + } + + if (ret !== undefined) { + return ret; + } + } + } + }]); + + return InteractableSet; +}(); + +_$InteractableSet_17["default"] = InteractableSet; + +var _$BaseEvent_13 = {}; +"use strict"; + +Object.defineProperty(_$BaseEvent_13, "__esModule", { + value: true +}); +_$BaseEvent_13["default"] = _$BaseEvent_13.BaseEvent = void 0; + +function ___classCallCheck_13(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_13(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_13(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_13(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_13(Constructor, staticProps); return Constructor; } + +function ___defineProperty_13(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var BaseEvent = /*#__PURE__*/function () { + ___createClass_13(BaseEvent, [{ + key: "interaction", + get: function get() { + return this._interaction._proxy; + } + }]); + + function BaseEvent(interaction) { + ___classCallCheck_13(this, BaseEvent); + + ___defineProperty_13(this, "type", void 0); + + ___defineProperty_13(this, "target", void 0); + + ___defineProperty_13(this, "currentTarget", void 0); + + ___defineProperty_13(this, "interactable", void 0); + + ___defineProperty_13(this, "_interaction", void 0); + + ___defineProperty_13(this, "timeStamp", void 0); + + ___defineProperty_13(this, "immediatePropagationStopped", false); + + ___defineProperty_13(this, "propagationStopped", false); + + this._interaction = interaction; + } + + ___createClass_13(BaseEvent, [{ + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call any other listeners (even on the current target) + */ + + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }]); + + return BaseEvent; +}(); + +_$BaseEvent_13.BaseEvent = BaseEvent; +var ___default_13 = BaseEvent; +_$BaseEvent_13["default"] = ___default_13; + +var _$InteractEvent_15 = {}; +"use strict"; + +Object.defineProperty(_$InteractEvent_15, "__esModule", { + value: true +}); +_$InteractEvent_15["default"] = _$InteractEvent_15.InteractEvent = void 0; + +var ___extend_15 = ___interopRequireDefault_15(_$extend_55); + +var ___getOriginXY_15 = ___interopRequireDefault_15(_$getOriginXY_56); + +var ___hypot_15 = ___interopRequireDefault_15(_$hypot_57); + +var _BaseEvent2 = ___interopRequireDefault_15(_$BaseEvent_13); + +var _defaultOptions = ___interopRequireDefault_15(_$defaultOptions_20); + +function ___interopRequireDefault_15(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_15(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_15 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_15 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_15(obj); } + +function ___classCallCheck_15(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_15(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_15(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_15(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_15(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (___typeof_15(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function ___defineProperty_15(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var InteractEvent = /*#__PURE__*/function (_BaseEvent) { + _inherits(InteractEvent, _BaseEvent); + + // drag + // resize + + /** */ + function InteractEvent(interaction, event, actionName, phase, element, preEnd, type) { + var _this; + + ___classCallCheck_15(this, InteractEvent); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(InteractEvent).call(this, interaction)); + + ___defineProperty_15(_assertThisInitialized(_this), "target", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "currentTarget", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "relatedTarget", null); + + ___defineProperty_15(_assertThisInitialized(_this), "screenX", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "screenY", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "button", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "buttons", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "ctrlKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "shiftKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "altKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "metaKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "page", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "client", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "delta", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "rect", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "x0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "y0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "t0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dt", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "duration", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "clientX0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "clientY0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "velocity", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "speed", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "swipe", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "timeStamp", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dragEnter", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dragLeave", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "axes", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "preEnd", void 0); + + element = element || interaction.element; + var target = interaction.interactable; + var deltaSource = (target && target.options || _defaultOptions["default"]).deltaSource; + var origin = (0, ___getOriginXY_15["default"])(target, element, actionName); + var starting = phase === 'start'; + var ending = phase === 'end'; + var prevEvent = starting ? _assertThisInitialized(_this) : interaction.prevEvent; + var coords = starting ? interaction.coords.start : ending ? { + page: prevEvent.page, + client: prevEvent.client, + timeStamp: interaction.coords.cur.timeStamp + } : interaction.coords.cur; + _this.page = (0, ___extend_15["default"])({}, coords.page); + _this.client = (0, ___extend_15["default"])({}, coords.client); + _this.rect = (0, ___extend_15["default"])({}, interaction.rect); + _this.timeStamp = coords.timeStamp; + + if (!ending) { + _this.page.x -= origin.x; + _this.page.y -= origin.y; + _this.client.x -= origin.x; + _this.client.y -= origin.y; + } + + _this.ctrlKey = event.ctrlKey; + _this.altKey = event.altKey; + _this.shiftKey = event.shiftKey; + _this.metaKey = event.metaKey; + _this.button = event.button; + _this.buttons = event.buttons; + _this.target = element; + _this.currentTarget = element; + _this.preEnd = preEnd; + _this.type = type || actionName + (phase || ''); + _this.interactable = target; + _this.t0 = starting ? interaction.pointers[interaction.pointers.length - 1].downTime : prevEvent.t0; + _this.x0 = interaction.coords.start.page.x - origin.x; + _this.y0 = interaction.coords.start.page.y - origin.y; + _this.clientX0 = interaction.coords.start.client.x - origin.x; + _this.clientY0 = interaction.coords.start.client.y - origin.y; + + if (starting || ending) { + _this.delta = { + x: 0, + y: 0 + }; + } else { + _this.delta = { + x: _this[deltaSource].x - prevEvent[deltaSource].x, + y: _this[deltaSource].y - prevEvent[deltaSource].y + }; + } + + _this.dt = interaction.coords.delta.timeStamp; + _this.duration = _this.timeStamp - _this.t0; // velocity and speed in pixels per second + + _this.velocity = (0, ___extend_15["default"])({}, interaction.coords.velocity[deltaSource]); + _this.speed = (0, ___hypot_15["default"])(_this.velocity.x, _this.velocity.y); + _this.swipe = ending || phase === 'inertiastart' ? _this.getSwipe() : null; + return _this; + } + + ___createClass_15(InteractEvent, [{ + key: "getSwipe", + value: function getSwipe() { + var interaction = this._interaction; + + if (interaction.prevEvent.speed < 600 || this.timeStamp - interaction.prevEvent.timeStamp > 150) { + return null; + } + + var angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI; + var overlap = 22.5; + + if (angle < 0) { + angle += 360; + } + + var left = 135 - overlap <= angle && angle < 225 + overlap; + var up = 225 - overlap <= angle && angle < 315 + overlap; + var right = !left && (315 - overlap <= angle || angle < 45 + overlap); + var down = !up && 45 - overlap <= angle && angle < 135 + overlap; + return { + up: up, + down: down, + left: left, + right: right, + angle: angle, + speed: interaction.prevEvent.speed, + velocity: { + x: interaction.prevEvent.velocityX, + y: interaction.prevEvent.velocityY + } + }; + } + }, { + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + /** + * Don't call any other listeners (even on the current target) + */ + + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "pageX", + get: function get() { + return this.page.x; + }, + set: function set(value) { + this.page.x = value; + } + }, { + key: "pageY", + get: function get() { + return this.page.y; + }, + set: function set(value) { + this.page.y = value; + } + }, { + key: "clientX", + get: function get() { + return this.client.x; + }, + set: function set(value) { + this.client.x = value; + } + }, { + key: "clientY", + get: function get() { + return this.client.y; + }, + set: function set(value) { + this.client.y = value; + } + }, { + key: "dx", + get: function get() { + return this.delta.x; + }, + set: function set(value) { + this.delta.x = value; + } + }, { + key: "dy", + get: function get() { + return this.delta.y; + }, + set: function set(value) { + this.delta.y = value; + } + }, { + key: "velocityX", + get: function get() { + return this.velocity.x; + }, + set: function set(value) { + this.velocity.x = value; + } + }, { + key: "velocityY", + get: function get() { + return this.velocity.y; + }, + set: function set(value) { + this.velocity.y = value; + } + }]); + + return InteractEvent; +}(_BaseEvent2["default"]); + +_$InteractEvent_15.InteractEvent = InteractEvent; +var ___default_15 = InteractEvent; +_$InteractEvent_15["default"] = ___default_15; + +var _$PointerInfo_19 = {}; +"use strict"; + +Object.defineProperty(_$PointerInfo_19, "__esModule", { + value: true +}); +_$PointerInfo_19["default"] = _$PointerInfo_19.PointerInfo = void 0; + +function ___classCallCheck_19(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* eslint-disable @typescript-eslint/no-parameter-properties */ +var PointerInfo = function PointerInfo(id, pointer, event, downTime, downTarget) { + ___classCallCheck_19(this, PointerInfo); + + this.id = id; + this.pointer = pointer; + this.event = event; + this.downTime = downTime; + this.downTarget = downTarget; +}; + +_$PointerInfo_19.PointerInfo = PointerInfo; +var ___default_19 = PointerInfo; +_$PointerInfo_19["default"] = ___default_19; + +var _$Interaction_18 = {}; +"use strict"; + +function ___typeof_18(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_18 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_18 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_18(obj); } + +Object.defineProperty(_$Interaction_18, "__esModule", { + value: true +}); +Object.defineProperty(_$Interaction_18, "PointerInfo", { + enumerable: true, + get: function get() { + return _PointerInfo["default"]; + } +}); +_$Interaction_18["default"] = _$Interaction_18.Interaction = _$Interaction_18._ProxyMethods = _$Interaction_18._ProxyValues = void 0; + +var utils = ___interopRequireWildcard_18(_$index_58); + +var _InteractEvent = ___interopRequireDefault_18(_$InteractEvent_15); + +var _PointerInfo = ___interopRequireDefault_18(_$PointerInfo_19); + +function ___interopRequireDefault_18(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_18() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_18 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_18(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_18(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_18(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_18(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_18(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_18(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_18(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_18(Constructor, staticProps); return Constructor; } + +function ___defineProperty_18(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _ProxyValues; + +_$Interaction_18._ProxyValues = _ProxyValues; + +(function (_ProxyValues) { + _ProxyValues["interactable"] = ""; + _ProxyValues["element"] = ""; + _ProxyValues["prepared"] = ""; + _ProxyValues["pointerIsDown"] = ""; + _ProxyValues["pointerWasMoved"] = ""; + _ProxyValues["_proxy"] = ""; +})(_ProxyValues || (_$Interaction_18._ProxyValues = _ProxyValues = {})); + +var _ProxyMethods; + +_$Interaction_18._ProxyMethods = _ProxyMethods; + +(function (_ProxyMethods) { + _ProxyMethods["start"] = ""; + _ProxyMethods["move"] = ""; + _ProxyMethods["end"] = ""; + _ProxyMethods["stop"] = ""; + _ProxyMethods["interacting"] = ""; +})(_ProxyMethods || (_$Interaction_18._ProxyMethods = _ProxyMethods = {})); + +var idCounter = 0; + +var Interaction = /*#__PURE__*/function () { + ___createClass_18(Interaction, [{ + key: "pointerMoveTolerance", + // current interactable being interacted with + // the target element of the interactable + // action that's ready to be fired on next move event + // keep track of added pointers + // pointerdown/mousedown/touchstart event + // previous action event + get: function get() { + return 1; + } + /** + * @alias Interaction.prototype.move + */ + + }]); + + /** */ + function Interaction(_ref) { + var _this = this; + + var pointerType = _ref.pointerType, + scopeFire = _ref.scopeFire; + + ___classCallCheck_18(this, Interaction); + + ___defineProperty_18(this, "interactable", null); + + ___defineProperty_18(this, "element", null); + + ___defineProperty_18(this, "rect", void 0); + + ___defineProperty_18(this, "_rects", void 0); + + ___defineProperty_18(this, "edges", void 0); + + ___defineProperty_18(this, "_scopeFire", void 0); + + ___defineProperty_18(this, "prepared", { + name: null, + axis: null, + edges: null + }); + + ___defineProperty_18(this, "pointerType", void 0); + + ___defineProperty_18(this, "pointers", []); + + ___defineProperty_18(this, "downEvent", null); + + ___defineProperty_18(this, "downPointer", {}); + + ___defineProperty_18(this, "_latestPointer", { + pointer: null, + event: null, + eventTarget: null + }); + + ___defineProperty_18(this, "prevEvent", null); + + ___defineProperty_18(this, "pointerIsDown", false); + + ___defineProperty_18(this, "pointerWasMoved", false); + + ___defineProperty_18(this, "_interacting", false); + + ___defineProperty_18(this, "_ending", false); + + ___defineProperty_18(this, "_stopped", true); + + ___defineProperty_18(this, "_proxy", null); + + ___defineProperty_18(this, "simulation", null); + + ___defineProperty_18(this, "doMove", utils.warnOnce(function (signalArg) { + this.move(signalArg); + }, 'The interaction.doMove() method has been renamed to interaction.move()')); + + ___defineProperty_18(this, "coords", { + // Starting InteractEvent pointer coordinates + start: utils.pointer.newCoords(), + // Previous native pointer move event coordinates + prev: utils.pointer.newCoords(), + // current native pointer move event coordinates + cur: utils.pointer.newCoords(), + // Change in coordinates and time of the pointer + delta: utils.pointer.newCoords(), + // pointer velocity + velocity: utils.pointer.newCoords() + }); + + ___defineProperty_18(this, "_id", idCounter++); + + this._scopeFire = scopeFire; + this.pointerType = pointerType; + var that = this; + this._proxy = {}; + + var _loop = function _loop(key) { + Object.defineProperty(_this._proxy, key, { + get: function get() { + return that[key]; + } + }); + }; + + for (var key in _ProxyValues) { + _loop(key); + } + + var _loop2 = function _loop2(_key) { + Object.defineProperty(_this._proxy, _key, { + value: function value() { + return that[_key].apply(that, arguments); + } + }); + }; + + for (var _key in _ProxyMethods) { + _loop2(_key); + } + + this._scopeFire('interactions:new', { + interaction: this + }); + } + + ___createClass_18(Interaction, [{ + key: "pointerDown", + value: function pointerDown(pointer, event, eventTarget) { + var pointerIndex = this.updatePointer(pointer, event, eventTarget, true); + var pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:down', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + pointerIndex: pointerIndex, + pointerInfo: pointerInfo, + type: 'down', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable({ + * // disable the default drag start by down->move + * manualStart: true + * }) + * // start dragging after the user holds the pointer down + * .on('hold', function (event) { + * var interaction = event.interaction + * + * if (!interaction.interacting()) { + * interaction.start({ name: 'drag' }, + * event.interactable, + * event.currentTarget) + * } + * }) + * ``` + * + * Start an action with the given Interactable and Element as tartgets. The + * action must be enabled for the target Interactable and an appropriate + * number of pointers must be held down - 1 for drag/resize, 2 for gesture. + * + * Use it with `interactable.able({ manualStart: false })` to always + * [start actions manually](https://github.com/taye/interact.js/issues/114) + * + * @param {object} action The action to be performed - drag, resize, etc. + * @param {Interactable} target The Interactable to target + * @param {Element} element The DOM Element to target + * @return {object} interact + */ + + }, { + key: "start", + value: function start(action, interactable, element) { + if (this.interacting() || !this.pointerIsDown || this.pointers.length < (action.name === 'gesture' ? 2 : 1) || !interactable.options[action.name].enabled) { + return false; + } + + utils.copyAction(this.prepared, action); + this.interactable = interactable; + this.element = element; + this.rect = interactable.getRect(element); + this.edges = this.prepared.edges ? utils.extend({}, this.prepared.edges) : { + left: true, + right: true, + top: true, + bottom: true + }; + this._stopped = false; + this._interacting = this._doPhase({ + interaction: this, + event: this.downEvent, + phase: 'start' + }) && !this._stopped; + return this._interacting; + } + }, { + key: "pointerMove", + value: function pointerMove(pointer, event, eventTarget) { + if (!this.simulation && !(this.modification && this.modification.endResult)) { + this.updatePointer(pointer, event, eventTarget, false); + } + + var duplicateMove = this.coords.cur.page.x === this.coords.prev.page.x && this.coords.cur.page.y === this.coords.prev.page.y && this.coords.cur.client.x === this.coords.prev.client.x && this.coords.cur.client.y === this.coords.prev.client.y; + var dx; + var dy; // register movement greater than pointerMoveTolerance + + if (this.pointerIsDown && !this.pointerWasMoved) { + dx = this.coords.cur.client.x - this.coords.start.client.x; + dy = this.coords.cur.client.y - this.coords.start.client.y; + this.pointerWasMoved = utils.hypot(dx, dy) > this.pointerMoveTolerance; + } + + var pointerIndex = this.getPointerIndex(pointer); + var signalArg = { + pointer: pointer, + pointerIndex: pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event: event, + type: 'move', + eventTarget: eventTarget, + dx: dx, + dy: dy, + duplicate: duplicateMove, + interaction: this + }; + + if (!duplicateMove) { + // set pointer coordinate, time changes and velocity + utils.pointer.setCoordVelocity(this.coords.velocity, this.coords.delta); + } + + this._scopeFire('interactions:move', signalArg); + + if (!duplicateMove && !this.simulation) { + // if interacting, fire an 'action-move' signal etc + if (this.interacting()) { + signalArg.type = null; + this.move(signalArg); + } + + if (this.pointerWasMoved) { + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + } + } + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('dragmove', function (event) { + * if (someCondition) { + * // change the snap settings + * event.interactable.draggable({ snap: { targets: [] }}) + * // fire another move event with re-calculated snap + * event.interaction.move() + * } + * }) + * ``` + * + * Force a move of the current action at the same coordinates. Useful if + * snap/restrict has been changed and you want a movement with the new + * settings. + */ + + }, { + key: "move", + value: function move(signalArg) { + if (!signalArg || !signalArg.event) { + utils.pointer.setZeroCoords(this.coords.delta); + } + + signalArg = utils.extend({ + pointer: this._latestPointer.pointer, + event: this._latestPointer.event, + eventTarget: this._latestPointer.eventTarget, + interaction: this + }, signalArg || {}); + signalArg.phase = 'move'; + + this._doPhase(signalArg); + } // End interact move events and stop auto-scroll unless simulation is running + + }, { + key: "pointerUp", + value: function pointerUp(pointer, event, eventTarget, curEventTarget) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + pointerIndex = this.updatePointer(pointer, event, eventTarget, false); + } + + var type = /cancel$/i.test(event.type) ? 'cancel' : 'up'; + + this._scopeFire("interactions:".concat(type), { + pointer: pointer, + pointerIndex: pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event: event, + eventTarget: eventTarget, + type: type, + curEventTarget: curEventTarget, + interaction: this + }); + + if (!this.simulation) { + this.end(event); + } + + this.pointerIsDown = false; + this.removePointer(pointer, event); + } + }, { + key: "documentBlur", + value: function documentBlur(event) { + this.end(event); + + this._scopeFire('interactions:blur', { + event: event, + type: 'blur', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('move', function (event) { + * if (event.pageX > 1000) { + * // end the current action + * event.interaction.end() + * // stop all further listeners from being called + * event.stopImmediatePropagation() + * } + * }) + * ``` + * + * @param {PointerEvent} [event] + */ + + }, { + key: "end", + value: function end(event) { + this._ending = true; + event = event || this._latestPointer.event; + var endPhaseResult; + + if (this.interacting()) { + endPhaseResult = this._doPhase({ + event: event, + interaction: this, + phase: 'end' + }); + } + + this._ending = false; + + if (endPhaseResult === true) { + this.stop(); + } + } + }, { + key: "currentAction", + value: function currentAction() { + return this._interacting ? this.prepared.name : null; + } + }, { + key: "interacting", + value: function interacting() { + return this._interacting; + } + /** */ + + }, { + key: "stop", + value: function stop() { + this._scopeFire('interactions:stop', { + interaction: this + }); + + this.interactable = this.element = null; + this._interacting = false; + this._stopped = true; + this.prepared.name = this.prevEvent = null; + } + }, { + key: "getPointerIndex", + value: function getPointerIndex(pointer) { + var pointerId = utils.pointer.getPointerId(pointer); // mouse and pen interactions may have only one pointer + + return this.pointerType === 'mouse' || this.pointerType === 'pen' ? this.pointers.length - 1 : utils.arr.findIndex(this.pointers, function (curPointer) { + return curPointer.id === pointerId; + }); + } + }, { + key: "getPointerInfo", + value: function getPointerInfo(pointer) { + return this.pointers[this.getPointerIndex(pointer)]; + } + }, { + key: "updatePointer", + value: function updatePointer(pointer, event, eventTarget, down) { + var id = utils.pointer.getPointerId(pointer); + var pointerIndex = this.getPointerIndex(pointer); + var pointerInfo = this.pointers[pointerIndex]; + down = down === false ? false : down || /(down|start)$/i.test(event.type); + + if (!pointerInfo) { + pointerInfo = new _PointerInfo["default"](id, pointer, event, null, null); + pointerIndex = this.pointers.length; + this.pointers.push(pointerInfo); + } else { + pointerInfo.pointer = pointer; + } + + utils.pointer.setCoords(this.coords.cur, this.pointers.map(function (p) { + return p.pointer; + }), this._now()); + utils.pointer.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur); + + if (down) { + this.pointerIsDown = true; + pointerInfo.downTime = this.coords.cur.timeStamp; + pointerInfo.downTarget = eventTarget; + utils.pointer.pointerExtend(this.downPointer, pointer); + + if (!this.interacting()) { + utils.pointer.copyCoords(this.coords.start, this.coords.cur); + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + this.downEvent = event; + this.pointerWasMoved = false; + } + } + + this._updateLatestPointer(pointer, event, eventTarget); + + this._scopeFire('interactions:update-pointer', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + down: down, + pointerInfo: pointerInfo, + pointerIndex: pointerIndex, + interaction: this + }); + + return pointerIndex; + } + }, { + key: "removePointer", + value: function removePointer(pointer, event) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + return; + } + + var pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:remove-pointer', { + pointer: pointer, + event: event, + eventTarget: null, + pointerIndex: pointerIndex, + pointerInfo: pointerInfo, + interaction: this + }); + + this.pointers.splice(pointerIndex, 1); + } + }, { + key: "_updateLatestPointer", + value: function _updateLatestPointer(pointer, event, eventTarget) { + this._latestPointer.pointer = pointer; + this._latestPointer.event = event; + this._latestPointer.eventTarget = eventTarget; + } + }, { + key: "destroy", + value: function destroy() { + this._latestPointer.pointer = null; + this._latestPointer.event = null; + this._latestPointer.eventTarget = null; + } + }, { + key: "_createPreparedEvent", + value: function _createPreparedEvent(event, phase, preEnd, type) { + return new _InteractEvent["default"](this, event, this.prepared.name, phase, this.element, preEnd, type); + } + }, { + key: "_fireEvent", + value: function _fireEvent(iEvent) { + this.interactable.fire(iEvent); + + if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) { + this.prevEvent = iEvent; + } + } + }, { + key: "_doPhase", + value: function _doPhase(signalArg) { + var event = signalArg.event, + phase = signalArg.phase, + preEnd = signalArg.preEnd, + type = signalArg.type; + var rect = this.rect; + + if (rect && phase === 'move') { + // update the rect changes due to pointer move + utils.rect.addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource]); + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + + var beforeResult = this._scopeFire("interactions:before-action-".concat(phase), signalArg); + + if (beforeResult === false) { + return false; + } + + var iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type); + + this._scopeFire("interactions:action-".concat(phase), signalArg); + + if (phase === 'start') { + this.prevEvent = iEvent; + } + + this._fireEvent(iEvent); + + this._scopeFire("interactions:after-action-".concat(phase), signalArg); + + return true; + } + }, { + key: "_now", + value: function _now() { + return Date.now(); + } + }]); + + return Interaction; +}(); + +_$Interaction_18.Interaction = Interaction; +var ___default_18 = Interaction; +_$Interaction_18["default"] = ___default_18; + +var _$interactionFinder_22 = {}; +"use strict"; + +function ___typeof_22(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_22 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_22 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_22(obj); } + +Object.defineProperty(_$interactionFinder_22, "__esModule", { + value: true +}); +_$interactionFinder_22["default"] = void 0; + +var __dom_22 = ___interopRequireWildcard_22(_$domUtils_53); + +function ___getRequireWildcardCache_22() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_22 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_22(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_22(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_22(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +var finder = { + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], + search: function search(details) { + for (var _i = 0; _i < finder.methodOrder.length; _i++) { + var _ref; + + _ref = finder.methodOrder[_i]; + var method = _ref; + var interaction = finder[method](details); + + if (interaction) { + return interaction; + } + } + + return null; + }, + // try to resume simulation with a new pointer + simulationResume: function simulationResume(_ref2) { + var pointerType = _ref2.pointerType, + eventType = _ref2.eventType, + eventTarget = _ref2.eventTarget, + scope = _ref2.scope; + + if (!/down|start/i.test(eventType)) { + return null; + } + + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref3; + + _ref3 = scope.interactions.list[_i2]; + var interaction = _ref3; + var element = eventTarget; + + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { + while (element) { + // if the element is the interaction element + if (element === interaction.element) { + return interaction; + } + + element = __dom_22.parentNode(element); + } + } + } + + return null; + }, + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { + var pointerId = _ref4.pointerId, + pointerType = _ref4.pointerType, + eventType = _ref4.eventType, + scope = _ref4.scope; + + if (pointerType !== 'mouse' && pointerType !== 'pen') { + return null; + } + + var firstNonActive; + + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref5; + + _ref5 = scope.interactions.list[_i3]; + var interaction = _ref5; + + if (interaction.pointerType === pointerType) { + // if it's a down event, skip interactions with running simulations + if (interaction.simulation && !hasPointerId(interaction, pointerId)) { + continue; + } // if the interaction is active, return it immediately + + + if (interaction.interacting()) { + return interaction; + } // otherwise save it and look for another active interaction + else if (!firstNonActive) { + firstNonActive = interaction; + } + } + } // if no active mouse interaction was found use the first inactive mouse + // interaction + + + if (firstNonActive) { + return firstNonActive; + } // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation + // is active + + + for (var _i4 = 0; _i4 < scope.interactions.list.length; _i4++) { + var _ref6; + + _ref6 = scope.interactions.list[_i4]; + var _interaction = _ref6; + + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { + return _interaction; + } + } + + return null; + }, + // get interaction that has this pointer + hasPointer: function hasPointer(_ref7) { + var pointerId = _ref7.pointerId, + scope = _ref7.scope; + + for (var _i5 = 0; _i5 < scope.interactions.list.length; _i5++) { + var _ref8; + + _ref8 = scope.interactions.list[_i5]; + var interaction = _ref8; + + if (hasPointerId(interaction, pointerId)) { + return interaction; + } + } + + return null; + }, + // get first idle interaction with a matching pointerType + idle: function idle(_ref9) { + var pointerType = _ref9.pointerType, + scope = _ref9.scope; + + for (var _i6 = 0; _i6 < scope.interactions.list.length; _i6++) { + var _ref10; + + _ref10 = scope.interactions.list[_i6]; + var interaction = _ref10; + + // if there's already a pointer held down + if (interaction.pointers.length === 1) { + var target = interaction.interactable; // don't add this pointer if there is a target interactable and it + // isn't gesturable + + if (target && !(target.options.gesture && target.options.gesture.enabled)) { + continue; + } + } // maximum of 2 pointers per interaction + else if (interaction.pointers.length >= 2) { + continue; + } + + if (!interaction.interacting() && pointerType === interaction.pointerType) { + return interaction; + } + } + + return null; + } +}; + +function hasPointerId(interaction, pointerId) { + return interaction.pointers.some(function (_ref11) { + var id = _ref11.id; + return id === pointerId; + }); +} + +var ___default_22 = finder; +_$interactionFinder_22["default"] = ___default_22; + +var _$interactablePreventDefault_21 = {}; +"use strict"; + +function ___typeof_21(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_21 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_21 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_21(obj); } + +Object.defineProperty(_$interactablePreventDefault_21, "__esModule", { + value: true +}); +_$interactablePreventDefault_21.install = __install_21; +_$interactablePreventDefault_21["default"] = void 0; + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var ___events_21 = ___interopRequireDefault_21(_$events_54); + +var __is_21 = ___interopRequireWildcard_21(_$is_59); + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +function ___getRequireWildcardCache_21() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_21 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_21(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_21(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_21(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_21(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function preventDefault(newValue) { + if (/^(always|never|auto)$/.test(newValue)) { + this.options.preventDefault = newValue; + return this; + } + + if (__is_21.bool(newValue)) { + this.options.preventDefault = newValue ? 'always' : 'never'; + return this; + } + + return this.options.preventDefault; +} + +function checkAndPreventDefault(interactable, scope, event) { + var setting = interactable.options.preventDefault; + + if (setting === 'never') { + return; + } + + if (setting === 'always') { + event.preventDefault(); + return; + } // setting === 'auto' + // if the browser supports passive event listeners and isn't running on iOS, + // don't preventDefault of touch{start,move} events. CSS touch-action and + // user-select should be used instead of calling event.preventDefault(). + + + if (___events_21["default"].supportsPassive && /^touch(start|move)$/.test(event.type)) { + var doc = (0, _$window_68.getWindow)(event.target).document; + var docOptions = scope.getDocOptions(doc); + + if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) { + return; + } + } // don't preventDefault of pointerdown events + + + if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) { + return; + } // don't preventDefault on editable elements + + + if (__is_21.element(event.target) && (0, _$domUtils_53.matchesSelector)(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) { + return; + } + + event.preventDefault(); +} + +function onInteractionEvent(_ref) { + var interaction = _ref.interaction, + event = _ref.event; + + if (interaction.interactable) { + interaction.interactable.checkAndPreventDefault(event); + } +} + +function __install_21(scope) { + /** @lends Interactable */ + var Interactable = scope.Interactable; + /** + * Returns or sets whether to prevent the browser's default behaviour in + * response to pointer events. Can be set to: + * - `'always'` to always prevent + * - `'never'` to never prevent + * - `'auto'` to let interact.js try to determine what would be best + * + * @param {string} [newValue] `'always'`, `'never'` or `'auto'` + * @return {string | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.preventDefault = preventDefault; + + Interactable.prototype.checkAndPreventDefault = function (event) { + return checkAndPreventDefault(this, scope, event); + }; // prevent native HTML5 drag on interact.js target elements + + + scope.interactions.docEvents.push({ + type: 'dragstart', + listener: function listener(event) { + for (var _i = 0; _i < scope.interactions.list.length; _i++) { + var _ref2; + + _ref2 = scope.interactions.list[_i]; + var interaction = _ref2; + + if (interaction.element && (interaction.element === event.target || (0, _$domUtils_53.nodeContains)(interaction.element, event.target))) { + interaction.interactable.checkAndPreventDefault(event); + return; + } + } + } + }); +} + +var ___default_21 = { + id: 'core/interactablePreventDefault', + install: __install_21, + listeners: ['down', 'move', 'up', 'cancel'].reduce(function (acc, eventType) { + acc["interactions:".concat(eventType)] = onInteractionEvent; + return acc; + }, {}) +}; +_$interactablePreventDefault_21["default"] = ___default_21; + +var _$DropEvent_2 = {}; +"use strict"; + +Object.defineProperty(_$DropEvent_2, "__esModule", { + value: true +}); +_$DropEvent_2["default"] = void 0; + +var ___BaseEvent2_2 = ___interopRequireDefault_2(_$BaseEvent_13); + +var __arr_2 = ___interopRequireWildcard_2(_$arr_49); + +function ___getRequireWildcardCache_2() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_2 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_2(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_2(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_2(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_2(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_2(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_2 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_2 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_2(obj); } + +function ___classCallCheck_2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_2(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_2(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_2(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_2(Constructor, staticProps); return Constructor; } + +function ___possibleConstructorReturn_2(self, call) { if (call && (___typeof_2(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_2(self); } + +function ___getPrototypeOf_2(o) { ___getPrototypeOf_2 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_2(o); } + +function ___assertThisInitialized_2(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ___inherits_2(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_2(subClass, superClass); } + +function ___setPrototypeOf_2(o, p) { ___setPrototypeOf_2 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_2(o, p); } + +function ___defineProperty_2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var DropEvent = /*#__PURE__*/function (_BaseEvent) { + ___inherits_2(DropEvent, _BaseEvent); + + /** + * Class of events fired on dropzones during drags with acceptable targets. + */ + function DropEvent(dropState, dragEvent, type) { + var _this; + + ___classCallCheck_2(this, DropEvent); + + _this = ___possibleConstructorReturn_2(this, ___getPrototypeOf_2(DropEvent).call(this, dragEvent._interaction)); + + ___defineProperty_2(___assertThisInitialized_2(_this), "target", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "dropzone", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "dragEvent", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "relatedTarget", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "draggable", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "timeStamp", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "propagationStopped", false); + + ___defineProperty_2(___assertThisInitialized_2(_this), "immediatePropagationStopped", false); + + var _ref = type === 'dragleave' ? dropState.prev : dropState.cur, + element = _ref.element, + dropzone = _ref.dropzone; + + _this.type = type; + _this.target = element; + _this.currentTarget = element; + _this.dropzone = dropzone; + _this.dragEvent = dragEvent; + _this.relatedTarget = dragEvent.target; + _this.draggable = dragEvent.interactable; + _this.timeStamp = dragEvent.timeStamp; + return _this; + } + /** + * If this is a `dropactivate` event, the dropzone element will be + * deactivated. + * + * If this is a `dragmove` or `dragenter`, a `dragleave` will be fired on the + * dropzone element and more. + */ + + + ___createClass_2(DropEvent, [{ + key: "reject", + value: function reject() { + var _this2 = this; + + var dropState = this._interaction.dropState; + + if (this.type !== 'dropactivate' && (!this.dropzone || dropState.cur.dropzone !== this.dropzone || dropState.cur.element !== this.target)) { + return; + } + + dropState.prev.dropzone = this.dropzone; + dropState.prev.element = this.target; + dropState.rejected = true; + dropState.events.enter = null; + this.stopImmediatePropagation(); + + if (this.type === 'dropactivate') { + var activeDrops = dropState.activeDrops; + var index = __arr_2.findIndex(activeDrops, function (_ref2) { + var dropzone = _ref2.dropzone, + element = _ref2.element; + return dropzone === _this2.dropzone && element === _this2.target; + }); + dropState.activeDrops.splice(index, 1); + var deactivateEvent = new DropEvent(dropState, this.dragEvent, 'dropdeactivate'); + deactivateEvent.dropzone = this.dropzone; + deactivateEvent.target = this.target; + this.dropzone.fire(deactivateEvent); + } else { + this.dropzone.fire(new DropEvent(dropState, this.dragEvent, 'dragleave')); + } + } + }, { + key: "preventDefault", + value: function preventDefault() {} + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }]); + + return DropEvent; +}(___BaseEvent2_2["default"]); + +var ___default_2 = DropEvent; +_$DropEvent_2["default"] = ___default_2; + +var _$index_3 = {}; +"use strict"; + +function ___typeof_3(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_3 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_3 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_3(obj); } + +Object.defineProperty(_$index_3, "__esModule", { + value: true +}); +_$index_3["default"] = void 0; + +var ___Interactable_3 = ___interopRequireDefault_3(_$Interactable_16({})); + +var ___scope_3 = _$scope_24({}); + +var __utils_3 = ___interopRequireWildcard_3(_$index_58); + +var _drag = ___interopRequireDefault_3(_$drag_1); + +var _DropEvent = ___interopRequireDefault_3(_$DropEvent_2); + +function ___getRequireWildcardCache_3() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_3 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_3(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_3(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_3(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_3(scope) { + var actions = scope.actions, + interact = scope.interact, + Interactable = scope.Interactable, + defaults = scope.defaults; + scope.usePlugin(_drag["default"]); + /** + * + * ```js + * interact('.drop').dropzone({ + * accept: '.can-drop' || document.getElementById('single-drop'), + * overlap: 'pointer' || 'center' || zeroToOne + * } + * ``` + * + * Returns or sets whether draggables can be dropped onto this target to + * trigger drop events + * + * Dropzones can receive the following events: + * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends + * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone + * - `dragmove` when a draggable that has entered the dropzone is moved + * - `drop` when a draggable is dropped into this dropzone + * + * Use the `accept` option to allow only elements that match the given CSS + * selector or element. The value can be: + * + * - **an Element** - only that element can be dropped into this dropzone. + * - **a string**, - the element being dragged must match it as a CSS selector. + * - **`null`** - accept options is cleared - it accepts any element. + * + * Use the `overlap` option to set how drops are checked for. The allowed + * values are: + * + * - `'pointer'`, the pointer must be over the dropzone (default) + * - `'center'`, the draggable element's center must be over the dropzone + * - a number from 0-1 which is the `(intersection area) / (draggable area)`. + * e.g. `0.5` for drop to happen when half of the area of the draggable is + * over the dropzone + * + * Use the `checker` option to specify a function to check if a dragged element + * is over this Interactable. + * + * @param {boolean | object | null} [options] The new options to be set. + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.dropzone = function (options) { + return dropzoneMethod(this, options); + }; + /** + * ```js + * interact(target) + * .dropChecker(function(dragEvent, // related dragmove or dragend event + * event, // TouchEvent/PointerEvent/MouseEvent + * dropped, // bool result of the default checker + * dropzone, // dropzone Interactable + * dropElement, // dropzone elemnt + * draggable, // draggable Interactable + * draggableElement) {// draggable element + * + * return dropped && event.target.hasAttribute('allow-drop') + * } + * ``` + */ + + + Interactable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) { + return dropCheckMethod(this, dragEvent, event, draggable, draggableElement, dropElement, rect); + }; + /** + * Returns or sets whether the dimensions of dropzone elements are calculated + * on every dragmove or only on dragstart for the default dropChecker + * + * @param {boolean} [newValue] True to check on each move. False to check only + * before start + * @return {boolean | interact} The current setting or interact + */ + + + interact.dynamicDrop = function (newValue) { + if (__utils_3.is.bool(newValue)) { + // if (dragging && scope.dynamicDrop !== newValue && !newValue) { + // calcRects(dropzones) + // } + scope.dynamicDrop = newValue; + return interact; + } + + return scope.dynamicDrop; + }; + + __utils_3.extend(actions.phaselessTypes, { + dragenter: true, + dragleave: true, + dropactivate: true, + dropdeactivate: true, + dropmove: true, + drop: true + }); + actions.methodDict.drop = 'dropzone'; + scope.dynamicDrop = false; + defaults.actions.drop = drop.defaults; +} + +function collectDrops(_ref, draggableElement) { + var interactables = _ref.interactables; + var drops = []; // collect all dropzones and their elements which qualify for a drop + + for (var _i = 0; _i < interactables.list.length; _i++) { + var _ref2; + + _ref2 = interactables.list[_i]; + var dropzone = _ref2; + + if (!dropzone.options.drop.enabled) { + continue; + } + + var accept = dropzone.options.drop.accept; // test the draggable draggableElement against the dropzone's accept setting + + if (__utils_3.is.element(accept) && accept !== draggableElement || __utils_3.is.string(accept) && !__utils_3.dom.matchesSelector(draggableElement, accept) || __utils_3.is.func(accept) && !accept({ + dropzone: dropzone, + draggableElement: draggableElement + })) { + continue; + } // query for new elements if necessary + + + var dropElements = __utils_3.is.string(dropzone.target) ? dropzone._context.querySelectorAll(dropzone.target) : __utils_3.is.array(dropzone.target) ? dropzone.target : [dropzone.target]; + + for (var _i2 = 0; _i2 < dropElements.length; _i2++) { + var _ref3; + + _ref3 = dropElements[_i2]; + var dropzoneElement = _ref3; + + if (dropzoneElement !== draggableElement) { + drops.push({ + dropzone: dropzone, + element: dropzoneElement + }); + } + } + } + + return drops; +} + +function fireActivationEvents(activeDrops, event) { + // loop through all active dropzones and trigger event + for (var _i3 = 0; _i3 < activeDrops.slice().length; _i3++) { + var _ref4; + + _ref4 = activeDrops.slice()[_i3]; + var _ref5 = _ref4, + dropzone = _ref5.dropzone, + element = _ref5.element; + event.dropzone = dropzone; // set current element as event target + + event.target = element; + dropzone.fire(event); + event.propagationStopped = event.immediatePropagationStopped = false; + } +} // return a new array of possible drops. getActiveDrops should always be +// called when a drag has just started or a drag event happens while +// dynamicDrop is true + + +function getActiveDrops(scope, dragElement) { + // get dropzones and their elements that could receive the draggable + var activeDrops = collectDrops(scope, dragElement); + + for (var _i4 = 0; _i4 < activeDrops.length; _i4++) { + var _ref6; + + _ref6 = activeDrops[_i4]; + var activeDrop = _ref6; + activeDrop.rect = activeDrop.dropzone.getRect(activeDrop.element); + } + + return activeDrops; +} + +function getDrop(_ref7, dragEvent, pointerEvent) { + var dropState = _ref7.dropState, + draggable = _ref7.interactable, + dragElement = _ref7.element; + var validDrops = []; // collect all dropzones and their elements which qualify for a drop + + for (var _i5 = 0; _i5 < dropState.activeDrops.length; _i5++) { + var _ref8; + + _ref8 = dropState.activeDrops[_i5]; + var _ref9 = _ref8, + dropzone = _ref9.dropzone, + dropzoneElement = _ref9.element, + _rect = _ref9.rect; + validDrops.push(dropzone.dropCheck(dragEvent, pointerEvent, draggable, dragElement, dropzoneElement, _rect) ? dropzoneElement : null); + } // get the most appropriate dropzone based on DOM depth and order + + + var dropIndex = __utils_3.dom.indexOfDeepestElement(validDrops); + return dropState.activeDrops[dropIndex] || null; +} + +function getDropEvents(interaction, _pointerEvent, dragEvent) { + var dropState = interaction.dropState; + var dropEvents = { + enter: null, + leave: null, + activate: null, + deactivate: null, + move: null, + drop: null + }; + + if (dragEvent.type === 'dragstart') { + dropEvents.activate = new _DropEvent["default"](dropState, dragEvent, 'dropactivate'); + dropEvents.activate.target = null; + dropEvents.activate.dropzone = null; + } + + if (dragEvent.type === 'dragend') { + dropEvents.deactivate = new _DropEvent["default"](dropState, dragEvent, 'dropdeactivate'); + dropEvents.deactivate.target = null; + dropEvents.deactivate.dropzone = null; + } + + if (dropState.rejected) { + return dropEvents; + } + + if (dropState.cur.element !== dropState.prev.element) { + // if there was a previous dropzone, create a dragleave event + if (dropState.prev.dropzone) { + dropEvents.leave = new _DropEvent["default"](dropState, dragEvent, 'dragleave'); + dragEvent.dragLeave = dropEvents.leave.target = dropState.prev.element; + dragEvent.prevDropzone = dropEvents.leave.dropzone = dropState.prev.dropzone; + } // if dropzone is not null, create a dragenter event + + + if (dropState.cur.dropzone) { + dropEvents.enter = new _DropEvent["default"](dropState, dragEvent, 'dragenter'); + dragEvent.dragEnter = dropState.cur.element; + dragEvent.dropzone = dropState.cur.dropzone; + } + } + + if (dragEvent.type === 'dragend' && dropState.cur.dropzone) { + dropEvents.drop = new _DropEvent["default"](dropState, dragEvent, 'drop'); + dragEvent.dropzone = dropState.cur.dropzone; + dragEvent.relatedTarget = dropState.cur.element; + } + + if (dragEvent.type === 'dragmove' && dropState.cur.dropzone) { + dropEvents.move = new _DropEvent["default"](dropState, dragEvent, 'dropmove'); + dropEvents.move.dragmove = dragEvent; + dragEvent.dropzone = dropState.cur.dropzone; + } + + return dropEvents; +} + +function fireDropEvents(interaction, events) { + var dropState = interaction.dropState; + var activeDrops = dropState.activeDrops, + cur = dropState.cur, + prev = dropState.prev; + + if (events.leave) { + prev.dropzone.fire(events.leave); + } + + if (events.move) { + cur.dropzone.fire(events.move); + } + + if (events.enter) { + cur.dropzone.fire(events.enter); + } + + if (events.drop) { + cur.dropzone.fire(events.drop); + } + + if (events.deactivate) { + fireActivationEvents(activeDrops, events.deactivate); + } + + dropState.prev.dropzone = cur.dropzone; + dropState.prev.element = cur.element; +} + +function onEventCreated(_ref10, scope) { + var interaction = _ref10.interaction, + iEvent = _ref10.iEvent, + event = _ref10.event; + + if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { + return; + } + + var dropState = interaction.dropState; + + if (scope.dynamicDrop) { + dropState.activeDrops = getActiveDrops(scope, interaction.element); + } + + var dragEvent = iEvent; + var dropResult = getDrop(interaction, dragEvent, event); // update rejected status + + dropState.rejected = dropState.rejected && !!dropResult && dropResult.dropzone === dropState.cur.dropzone && dropResult.element === dropState.cur.element; + dropState.cur.dropzone = dropResult && dropResult.dropzone; + dropState.cur.element = dropResult && dropResult.element; + dropState.events = getDropEvents(interaction, event, dragEvent); +} + +function dropzoneMethod(interactable, options) { + if (__utils_3.is.object(options)) { + interactable.options.drop.enabled = options.enabled !== false; + + if (options.listeners) { + var normalized = __utils_3.normalizeListeners(options.listeners); // rename 'drop' to '' as it will be prefixed with 'drop' + + var corrected = Object.keys(normalized).reduce(function (acc, type) { + var correctedType = /^(enter|leave)/.test(type) ? "drag".concat(type) : /^(activate|deactivate|move)/.test(type) ? "drop".concat(type) : type; + acc[correctedType] = normalized[type]; + return acc; + }, {}); + interactable.off(interactable.options.drop.listeners); + interactable.on(corrected); + interactable.options.drop.listeners = corrected; + } + + if (__utils_3.is.func(options.ondrop)) { + interactable.on('drop', options.ondrop); + } + + if (__utils_3.is.func(options.ondropactivate)) { + interactable.on('dropactivate', options.ondropactivate); + } + + if (__utils_3.is.func(options.ondropdeactivate)) { + interactable.on('dropdeactivate', options.ondropdeactivate); + } + + if (__utils_3.is.func(options.ondragenter)) { + interactable.on('dragenter', options.ondragenter); + } + + if (__utils_3.is.func(options.ondragleave)) { + interactable.on('dragleave', options.ondragleave); + } + + if (__utils_3.is.func(options.ondropmove)) { + interactable.on('dropmove', options.ondropmove); + } + + if (/^(pointer|center)$/.test(options.overlap)) { + interactable.options.drop.overlap = options.overlap; + } else if (__utils_3.is.number(options.overlap)) { + interactable.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0); + } + + if ('accept' in options) { + interactable.options.drop.accept = options.accept; + } + + if ('checker' in options) { + interactable.options.drop.checker = options.checker; + } + + return interactable; + } + + if (__utils_3.is.bool(options)) { + interactable.options.drop.enabled = options; + return interactable; + } + + return interactable.options.drop; +} + +function dropCheckMethod(interactable, dragEvent, event, draggable, draggableElement, dropElement, rect) { + var dropped = false; // if the dropzone has no rect (eg. display: none) + // call the custom dropChecker or just return false + + if (!(rect = rect || interactable.getRect(dropElement))) { + return interactable.options.drop.checker ? interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement) : false; + } + + var dropOverlap = interactable.options.drop.overlap; + + if (dropOverlap === 'pointer') { + var origin = __utils_3.getOriginXY(draggable, draggableElement, 'drag'); + var page = __utils_3.pointer.getPageXY(dragEvent); + page.x += origin.x; + page.y += origin.y; + var horizontal = page.x > rect.left && page.x < rect.right; + var vertical = page.y > rect.top && page.y < rect.bottom; + dropped = horizontal && vertical; + } + + var dragRect = draggable.getRect(draggableElement); + + if (dragRect && dropOverlap === 'center') { + var cx = dragRect.left + dragRect.width / 2; + var cy = dragRect.top + dragRect.height / 2; + dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom; + } + + if (dragRect && __utils_3.is.number(dropOverlap)) { + var overlapArea = Math.max(0, Math.min(rect.right, dragRect.right) - Math.max(rect.left, dragRect.left)) * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top, dragRect.top)); + var overlapRatio = overlapArea / (dragRect.width * dragRect.height); + dropped = overlapRatio >= dropOverlap; + } + + if (interactable.options.drop.checker) { + dropped = interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement); + } + + return dropped; +} + +var drop = { + id: 'actions/drop', + install: __install_3, + listeners: { + 'interactions:before-action-start': function interactionsBeforeActionStart(_ref11) { + var interaction = _ref11.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + interaction.dropState = { + cur: { + dropzone: null, + element: null + }, + prev: { + dropzone: null, + element: null + }, + rejected: null, + events: null, + activeDrops: [] + }; + }, + 'interactions:after-action-start': function interactionsAfterActionStart(_ref12, scope) { + var interaction = _ref12.interaction, + event = _ref12.event, + dragEvent = _ref12.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var dropState = interaction.dropState; // reset active dropzones + + dropState.activeDrops = null; + dropState.events = null; + dropState.activeDrops = getActiveDrops(scope, interaction.element); + dropState.events = getDropEvents(interaction, event, dragEvent); + + if (dropState.events.activate) { + fireActivationEvents(dropState.activeDrops, dropState.events.activate); + scope.fire('actions/drop:start', { + interaction: interaction, + dragEvent: dragEvent + }); + } + }, + // FIXME proper signal types + 'interactions:action-move': onEventCreated, + 'interactions:action-end': onEventCreated, + 'interactions:after-action-move': function fireDropAfterMove(_ref13, scope) { + var interaction = _ref13.interaction, + dragEvent = _ref13.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + fireDropEvents(interaction, interaction.dropState.events); + scope.fire('actions/drop:move', { + interaction: interaction, + dragEvent: dragEvent + }); + interaction.dropState.events = {}; + }, + 'interactions:after-action-end': function interactionsAfterActionEnd(_ref14, scope) { + var interaction = _ref14.interaction, + dragEvent = _ref14.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + fireDropEvents(interaction, interaction.dropState.events); + scope.fire('actions/drop:end', { + interaction: interaction, + dragEvent: dragEvent + }); + }, + 'interactions:stop': function interactionsStop(_ref15) { + var interaction = _ref15.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var dropState = interaction.dropState; + + if (dropState) { + dropState.activeDrops = null; + dropState.events = null; + dropState.cur.dropzone = null; + dropState.cur.element = null; + dropState.prev.dropzone = null; + dropState.prev.element = null; + dropState.rejected = false; + } + } + }, + getActiveDrops: getActiveDrops, + getDrop: getDrop, + getDropEvents: getDropEvents, + fireDropEvents: fireDropEvents, + defaults: { + enabled: false, + accept: null, + overlap: 'pointer' + } +}; +var ___default_3 = drop; +_$index_3["default"] = ___default_3; + +var _$gesture_4 = {}; +"use strict"; + +function ___typeof_4(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_4 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_4 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_4(obj); } + +Object.defineProperty(_$gesture_4, "__esModule", { + value: true +}); +_$gesture_4["default"] = void 0; + +var __utils_4 = ___interopRequireWildcard_4(_$index_58); + +function ___getRequireWildcardCache_4() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_4 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_4(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_4(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_4(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_4(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + defaults = scope.defaults; + /** + * ```js + * interact(element).gesturable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // limit multiple gestures. + * // See the explanation in {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isGestureable = interact(element).gesturable() + * ``` + * + * Gets or sets whether multitouch gestures can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on gesture events (makes the Interactable gesturable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of gesture events, or this Interactable + */ + + Interactable.prototype.gesturable = function (options) { + if (__utils_4.is.object(options)) { + this.options.gesture.enabled = options.enabled !== false; + this.setPerAction('gesture', options); + this.setOnEvents('gesture', options); + return this; + } + + if (__utils_4.is.bool(options)) { + this.options.gesture.enabled = options; + return this; + } + + return this.options.gesture; + }; + + actions.map.gesture = gesture; + actions.methodDict.gesture = 'gesturable'; + defaults.actions.gesture = gesture.defaults; +} + +function updateGestureProps(_ref) { + var interaction = _ref.interaction, + iEvent = _ref.iEvent, + phase = _ref.phase; + + if (interaction.prepared.name !== 'gesture') { + return; + } + + var pointers = interaction.pointers.map(function (p) { + return p.pointer; + }); + var starting = phase === 'start'; + var ending = phase === 'end'; + var deltaSource = interaction.interactable.options.deltaSource; + iEvent.touches = [pointers[0], pointers[1]]; + + if (starting) { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = 1; + iEvent.ds = 0; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.da = 0; + interaction.gesture.startDistance = iEvent.distance; + interaction.gesture.startAngle = iEvent.angle; + } else if (ending) { + var prevEvent = interaction.prevEvent; + iEvent.distance = prevEvent.distance; + iEvent.box = prevEvent.box; + iEvent.scale = prevEvent.scale; + iEvent.ds = 0; + iEvent.angle = prevEvent.angle; + iEvent.da = 0; + } else { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = iEvent.distance / interaction.gesture.startDistance; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.ds = iEvent.scale - interaction.gesture.scale; + iEvent.da = iEvent.angle - interaction.gesture.angle; + } + + interaction.gesture.distance = iEvent.distance; + interaction.gesture.angle = iEvent.angle; + + if (__utils_4.is.number(iEvent.scale) && iEvent.scale !== Infinity && !isNaN(iEvent.scale)) { + interaction.gesture.scale = iEvent.scale; + } +} + +var gesture = { + id: 'actions/gesture', + before: ['actions/drag', 'actions/resize'], + install: __install_4, + listeners: { + 'interactions:action-start': updateGestureProps, + 'interactions:action-move': updateGestureProps, + 'interactions:action-end': updateGestureProps, + 'interactions:new': function interactionsNew(_ref2) { + var interaction = _ref2.interaction; + interaction.gesture = { + angle: 0, + distance: 0, + scale: 1, + startAngle: 0, + startDistance: 0 + }; + }, + 'auto-start:check': function autoStartCheck(arg) { + if (arg.interaction.pointers.length < 2) { + return undefined; + } + + var gestureOptions = arg.interactable.options.gesture; + + if (!(gestureOptions && gestureOptions.enabled)) { + return undefined; + } + + arg.action = { + name: 'gesture' + }; + return false; + } + }, + defaults: {}, + getCursor: function getCursor() { + return ''; + } +}; +var ___default_4 = gesture; +_$gesture_4["default"] = ___default_4; + +var _$resize_6 = {}; +"use strict"; + +function ___typeof_6(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_6 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_6 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_6(obj); } + +Object.defineProperty(_$resize_6, "__esModule", { + value: true +}); +_$resize_6["default"] = void 0; + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +var __dom_6 = ___interopRequireWildcard_6(_$domUtils_53); + +var ___extend_6 = ___interopRequireDefault_6(_$extend_55); + +var __is_6 = ___interopRequireWildcard_6(_$is_59); + +function ___interopRequireDefault_6(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_6() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_6 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_6(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_6(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_6(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_6(scope) { + var actions = scope.actions, + browser = scope.browser, + Interactable = scope.Interactable, + defaults = scope.defaults; // Less Precision with touch input + + resize.cursors = initCursors(browser); + resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10; + /** + * ```js + * interact(element).resizable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * edges: { + * top : true, // Use pointer coords to check for resize. + * left : false, // Disable resizing from left edge. + * bottom: '.resize-s',// Resize if pointer target matches selector + * right : handleEl // Resize if pointer target is the given Element + * }, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height are adjusted at a 1:1 ratio. + * square: false, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height maintain the aspect ratio they had when resizing started. + * preserveAspectRatio: false, + * + * // a value of 'none' will limit the resize rect to a minimum of 0x0 + * // 'negate' will allow the rect to have negative width/height + * // 'reposition' will keep the width/height positive by swapping + * // the top and bottom edges and/or swapping the left and right edges + * invert: 'none' || 'negate' || 'reposition' + * + * // limit multiple resizes. + * // See the explanation in the {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isResizeable = interact(element).resizable() + * ``` + * + * Gets or sets whether resize actions can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on resize events (object makes the Interactable + * resizable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of resize elements, or this Interactable + */ + + Interactable.prototype.resizable = function (options) { + return resizable(this, options, scope); + }; + + actions.map.resize = resize; + actions.methodDict.resize = 'resizable'; + defaults.actions.resize = resize.defaults; +} + +function resizeChecker(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + element = arg.element, + rect = arg.rect, + buttons = arg.buttons; + + if (!rect) { + return undefined; + } + + var page = (0, ___extend_6["default"])({}, interaction.coords.cur.page); + var resizeOptions = interactable.options.resize; + + if (!(resizeOptions && resizeOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & resizeOptions.mouseButtons) === 0) { + return undefined; + } // if using resize.edges + + + if (__is_6.object(resizeOptions.edges)) { + var resizeEdges = { + left: false, + right: false, + top: false, + bottom: false + }; + + for (var edge in resizeEdges) { + resizeEdges[edge] = checkResizeEdge(edge, resizeOptions.edges[edge], page, interaction._latestPointer.eventTarget, element, rect, resizeOptions.margin || resize.defaultMargin); + } + + resizeEdges.left = resizeEdges.left && !resizeEdges.right; + resizeEdges.top = resizeEdges.top && !resizeEdges.bottom; + + if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) { + arg.action = { + name: 'resize', + edges: resizeEdges + }; + } + } else { + var right = resizeOptions.axis !== 'y' && page.x > rect.right - resize.defaultMargin; + var bottom = resizeOptions.axis !== 'x' && page.y > rect.bottom - resize.defaultMargin; + + if (right || bottom) { + arg.action = { + name: 'resize', + axes: (right ? 'x' : '') + (bottom ? 'y' : '') + }; + } + } + + return arg.action ? false : undefined; +} + +function resizable(interactable, options, scope) { + if (__is_6.object(options)) { + interactable.options.resize.enabled = options.enabled !== false; + interactable.setPerAction('resize', options); + interactable.setOnEvents('resize', options); + + if (__is_6.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) { + interactable.options.resize.axis = options.axis; + } else if (options.axis === null) { + interactable.options.resize.axis = scope.defaults.actions.resize.axis; + } + + if (__is_6.bool(options.preserveAspectRatio)) { + interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio; + } else if (__is_6.bool(options.square)) { + interactable.options.resize.square = options.square; + } + + return interactable; + } + + if (__is_6.bool(options)) { + interactable.options.resize.enabled = options; + return interactable; + } + + return interactable.options.resize; +} + +function checkResizeEdge(name, value, page, element, interactableElement, rect, margin) { + // false, '', undefined, null + if (!value) { + return false; + } // true value, use pointer coords and element rect + + + if (value === true) { + // if dimensions are negative, "switch" edges + var width = __is_6.number(rect.width) ? rect.width : rect.right - rect.left; + var height = __is_6.number(rect.height) ? rect.height : rect.bottom - rect.top; // don't use margin greater than half the relevent dimension + + margin = Math.min(margin, (name === 'left' || name === 'right' ? width : height) / 2); + + if (width < 0) { + if (name === 'left') { + name = 'right'; + } else if (name === 'right') { + name = 'left'; + } + } + + if (height < 0) { + if (name === 'top') { + name = 'bottom'; + } else if (name === 'bottom') { + name = 'top'; + } + } + + if (name === 'left') { + return page.x < (width >= 0 ? rect.left : rect.right) + margin; + } + + if (name === 'top') { + return page.y < (height >= 0 ? rect.top : rect.bottom) + margin; + } + + if (name === 'right') { + return page.x > (width >= 0 ? rect.right : rect.left) - margin; + } + + if (name === 'bottom') { + return page.y > (height >= 0 ? rect.bottom : rect.top) - margin; + } + } // the remaining checks require an element + + + if (!__is_6.element(element)) { + return false; + } + + return __is_6.element(value) // the value is an element to use as a resize handle + ? value === element // otherwise check if element matches value as selector + : __dom_6.matchesUpTo(element, value, interactableElement); +} + +function initCursors(browser) { + return browser.isIe9 ? { + x: 'e-resize', + y: 's-resize', + xy: 'se-resize', + top: 'n-resize', + left: 'w-resize', + bottom: 's-resize', + right: 'e-resize', + topleft: 'se-resize', + bottomright: 'se-resize', + topright: 'ne-resize', + bottomleft: 'ne-resize' + } : { + x: 'ew-resize', + y: 'ns-resize', + xy: 'nwse-resize', + top: 'ns-resize', + left: 'ew-resize', + bottom: 'ns-resize', + right: 'ew-resize', + topleft: 'nwse-resize', + bottomright: 'nwse-resize', + topright: 'nesw-resize', + bottomleft: 'nesw-resize' + }; +} + +function start(_ref) { + var iEvent = _ref.iEvent, + interaction = _ref.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + var rect = interaction.rect; + interaction._rects = { + start: (0, ___extend_6["default"])({}, rect), + corrected: (0, ___extend_6["default"])({}, rect), + previous: (0, ___extend_6["default"])({}, rect), + delta: { + left: 0, + right: 0, + width: 0, + top: 0, + bottom: 0, + height: 0 + } + }; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function __move_6(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + var resizeOptions = interaction.interactable.options.resize; + var invert = resizeOptions.invert; + var invertible = invert === 'reposition' || invert === 'negate'; // eslint-disable-next-line no-shadow + + var current = interaction.rect; + var _interaction$_rects = interaction._rects, + startRect = _interaction$_rects.start, + corrected = _interaction$_rects.corrected, + deltaRect = _interaction$_rects.delta, + previous = _interaction$_rects.previous; + (0, ___extend_6["default"])(previous, corrected); + + if (invertible) { + // if invertible, copy the current rect + (0, ___extend_6["default"])(corrected, current); + + if (invert === 'reposition') { + // swap edge values if necessary to keep width/height positive + if (corrected.top > corrected.bottom) { + var swap = corrected.top; + corrected.top = corrected.bottom; + corrected.bottom = swap; + } + + if (corrected.left > corrected.right) { + var _swap = corrected.left; + corrected.left = corrected.right; + corrected.right = _swap; + } + } + } else { + // if not invertible, restrict to minimum of 0x0 rect + corrected.top = Math.min(current.top, startRect.bottom); + corrected.bottom = Math.max(current.bottom, startRect.top); + corrected.left = Math.min(current.left, startRect.right); + corrected.right = Math.max(current.right, startRect.left); + } + + corrected.width = corrected.right - corrected.left; + corrected.height = corrected.bottom - corrected.top; + + for (var edge in corrected) { + deltaRect[edge] = corrected[edge] - previous[edge]; + } + + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = corrected; + resizeEvent.deltaRect = deltaRect; +} + +function end(_ref3) { + var iEvent = _ref3.iEvent, + interaction = _ref3.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function updateEventAxes(_ref4) { + var iEvent = _ref4.iEvent, + interaction = _ref4.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) { + return; + } + + var options = interaction.interactable.options; + var resizeEvent = iEvent; + + if (options.resize.square) { + if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = resizeEvent.delta.y; + } else { + resizeEvent.delta.y = resizeEvent.delta.x; + } + + resizeEvent.axes = 'xy'; + } else { + resizeEvent.axes = interaction.resizeAxes; + + if (interaction.resizeAxes === 'x') { + resizeEvent.delta.y = 0; + } else if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = 0; + } + } +} + +var resize = { + id: 'actions/resize', + before: ['actions/drag'], + install: __install_6, + listeners: { + 'interactions:new': function interactionsNew(_ref5) { + var interaction = _ref5.interaction; + interaction.resizeAxes = 'xy'; + }, + 'interactions:action-start': function interactionsActionStart(arg) { + start(arg); + updateEventAxes(arg); + }, + 'interactions:action-move': function interactionsActionMove(arg) { + __move_6(arg); + updateEventAxes(arg); + }, + 'interactions:action-end': end, + 'auto-start:check': resizeChecker + }, + defaults: { + square: false, + preserveAspectRatio: false, + axis: 'xy', + // use default margin + margin: NaN, + // object with props left, right, top, bottom which are + // true/false values to resize when the pointer is over that edge, + // CSS selectors to match the handles for each direction + // or the Elements for each handle + edges: null, + // a value of 'none' will limit the resize rect to a minimum of 0x0 + // 'negate' will alow the rect to have negative width/height + // 'reposition' will keep the width/height positive by swapping + // the top and bottom edges and/or swapping the left and right edges + invert: 'none' + }, + cursors: null, + getCursor: function getCursor(_ref6) { + var edges = _ref6.edges, + axis = _ref6.axis, + name = _ref6.name; + var cursors = resize.cursors; + var result = null; + + if (axis) { + result = cursors[name + axis]; + } else if (edges) { + var cursorKey = ''; + var _arr = ['top', 'bottom', 'left', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (edges[edge]) { + cursorKey += edge; + } + } + + result = cursors[cursorKey]; + } + + return result; + }, + defaultMargin: null +}; +var ___default_6 = resize; +_$resize_6["default"] = ___default_6; + +var _$index_5 = {}; +"use strict"; + +Object.defineProperty(_$index_5, "__esModule", { + value: true +}); +Object.defineProperty(_$index_5, "drag", { + enumerable: true, + get: function get() { + return ___drag_5["default"]; + } +}); +Object.defineProperty(_$index_5, "drop", { + enumerable: true, + get: function get() { + return _index["default"]; + } +}); +Object.defineProperty(_$index_5, "gesture", { + enumerable: true, + get: function get() { + return _gesture["default"]; + } +}); +Object.defineProperty(_$index_5, "resize", { + enumerable: true, + get: function get() { + return _resize["default"]; + } +}); +_$index_5["default"] = void 0; + +var ___drag_5 = ___interopRequireDefault_5(_$drag_1); + +var _index = ___interopRequireDefault_5(_$index_3); + +var _gesture = ___interopRequireDefault_5(_$gesture_4); + +var _resize = ___interopRequireDefault_5(_$resize_6); + +function ___interopRequireDefault_5(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var ___default_5 = { + id: 'actions', + install: function install(scope) { + scope.usePlugin(_gesture["default"]); + scope.usePlugin(_resize["default"]); + scope.usePlugin(___drag_5["default"]); + scope.usePlugin(_index["default"]); + } +}; +_$index_5["default"] = ___default_5; + +var _$index_7 = {}; +"use strict"; + +function ___typeof_7(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_7 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_7 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_7(obj); } + +Object.defineProperty(_$index_7, "__esModule", { + value: true +}); +_$index_7.getContainer = getContainer; +_$index_7.getScroll = getScroll; +_$index_7.getScrollSize = getScrollSize; +_$index_7.getScrollSizeDelta = getScrollSizeDelta; +_$index_7["default"] = void 0; + +var __domUtils_7 = ___interopRequireWildcard_7(_$domUtils_53); + +var __is_7 = ___interopRequireWildcard_7(_$is_59); + +var ___raf_7 = ___interopRequireDefault_7(_$raf_64); + +/* removed: var _$rect_65 = require("@interactjs/utils/rect"); */; + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +function ___interopRequireDefault_7(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_7() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_7 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_7(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_7(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_7(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_7(scope) { + var defaults = scope.defaults, + actions = scope.actions; + scope.autoScroll = autoScroll; + + autoScroll.now = function () { + return scope.now(); + }; + + actions.phaselessTypes.autoscroll = true; + defaults.perAction.autoScroll = autoScroll.defaults; +} + +var autoScroll = { + defaults: { + enabled: false, + margin: 60, + // the item that is scrolled (Window or HTMLElement) + container: null, + // the scroll speed in pixels per second + speed: 300 + }, + now: Date.now, + interaction: null, + i: 0, + // the handle returned by window.setInterval + // Direction each pulse is to scroll in + x: 0, + y: 0, + isScrolling: false, + prevTime: 0, + margin: 0, + speed: 0, + start: function start(interaction) { + autoScroll.isScrolling = true; + + ___raf_7["default"].cancel(autoScroll.i); + + interaction.autoScroll = autoScroll; + autoScroll.interaction = interaction; + autoScroll.prevTime = autoScroll.now(); + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + }, + stop: function stop() { + autoScroll.isScrolling = false; + + if (autoScroll.interaction) { + autoScroll.interaction.autoScroll = null; + } + + ___raf_7["default"].cancel(autoScroll.i); + }, + // scroll the window by the values in scroll.x/y + scroll: function scroll() { + var interaction = autoScroll.interaction; + var interactable = interaction.interactable, + element = interaction.element; + var actionName = interaction.prepared.name; + var options = interactable.options[actionName].autoScroll; + var container = getContainer(options.container, interactable, element); + var now = autoScroll.now(); // change in time in seconds + + var dt = (now - autoScroll.prevTime) / 1000; // displacement + + var s = options.speed * dt; + + if (s >= 1) { + var scrollBy = { + x: autoScroll.x * s, + y: autoScroll.y * s + }; + + if (scrollBy.x || scrollBy.y) { + var prevScroll = getScroll(container); + + if (__is_7.window(container)) { + container.scrollBy(scrollBy.x, scrollBy.y); + } else if (container) { + container.scrollLeft += scrollBy.x; + container.scrollTop += scrollBy.y; + } + + var curScroll = getScroll(container); + var delta = { + x: curScroll.x - prevScroll.x, + y: curScroll.y - prevScroll.y + }; + + if (delta.x || delta.y) { + interactable.fire({ + type: 'autoscroll', + target: element, + interactable: interactable, + delta: delta, + interaction: interaction, + container: container + }); + } + } + + autoScroll.prevTime = now; + } + + if (autoScroll.isScrolling) { + ___raf_7["default"].cancel(autoScroll.i); + + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + } + }, + check: function check(interactable, actionName) { + var options = interactable.options; + return options[actionName].autoScroll && options[actionName].autoScroll.enabled; + }, + onInteractionMove: function onInteractionMove(_ref) { + var interaction = _ref.interaction, + pointer = _ref.pointer; + + if (!(interaction.interacting() && autoScroll.check(interaction.interactable, interaction.prepared.name))) { + return; + } + + if (interaction.simulation) { + autoScroll.x = autoScroll.y = 0; + return; + } + + var top; + var right; + var bottom; + var left; + var interactable = interaction.interactable, + element = interaction.element; + var actionName = interaction.prepared.name; + var options = interactable.options[actionName].autoScroll; + var container = getContainer(options.container, interactable, element); + + if (__is_7.window(container)) { + left = pointer.clientX < autoScroll.margin; + top = pointer.clientY < autoScroll.margin; + right = pointer.clientX > container.innerWidth - autoScroll.margin; + bottom = pointer.clientY > container.innerHeight - autoScroll.margin; + } else { + var rect = __domUtils_7.getElementClientRect(container); + left = pointer.clientX < rect.left + autoScroll.margin; + top = pointer.clientY < rect.top + autoScroll.margin; + right = pointer.clientX > rect.right - autoScroll.margin; + bottom = pointer.clientY > rect.bottom - autoScroll.margin; + } + + autoScroll.x = right ? 1 : left ? -1 : 0; + autoScroll.y = bottom ? 1 : top ? -1 : 0; + + if (!autoScroll.isScrolling) { + // set the autoScroll properties to those of the target + autoScroll.margin = options.margin; + autoScroll.speed = options.speed; + autoScroll.start(interaction); + } + } +}; + +function getContainer(value, interactable, element) { + return (__is_7.string(value) ? (0, _$rect_65.getStringOptionResult)(value, interactable, element) : value) || (0, _$window_68.getWindow)(element); +} + +function getScroll(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollLeft, + y: container.scrollTop + }; +} + +function getScrollSize(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollWidth, + y: container.scrollHeight + }; +} + +function getScrollSizeDelta(_ref2, func) { + var interaction = _ref2.interaction, + element = _ref2.element; + var scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll; + + if (!scrollOptions || !scrollOptions.enabled) { + func(); + return { + x: 0, + y: 0 + }; + } + + var scrollContainer = getContainer(scrollOptions.container, interaction.interactable, element); + var prevSize = getScroll(scrollContainer); + func(); + var curSize = getScroll(scrollContainer); + return { + x: curSize.x - prevSize.x, + y: curSize.y - prevSize.y + }; +} + +var autoScrollPlugin = { + id: 'auto-scroll', + install: __install_7, + listeners: { + 'interactions:new': function interactionsNew(_ref3) { + var interaction = _ref3.interaction; + interaction.autoScroll = null; + }, + 'interactions:destroy': function interactionsDestroy(_ref4) { + var interaction = _ref4.interaction; + interaction.autoScroll = null; + autoScroll.stop(); + + if (autoScroll.interaction) { + autoScroll.interaction = null; + } + }, + 'interactions:stop': autoScroll.stop, + 'interactions:action-move': function interactionsActionMove(arg) { + return autoScroll.onInteractionMove(arg); + } + } +}; +var ___default_7 = autoScrollPlugin; +_$index_7["default"] = ___default_7; + +var _$InteractableMethods_8 = {}; +"use strict"; + +function ___typeof_8(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_8 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_8 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_8(obj); } + +Object.defineProperty(_$InteractableMethods_8, "__esModule", { + value: true +}); +_$InteractableMethods_8["default"] = void 0; + +/* removed: var _$index_58 = require("@interactjs/utils/index"); */; + +var __is_8 = ___interopRequireWildcard_8(_$is_59); + +function ___getRequireWildcardCache_8() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_8 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_8(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_8(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_8(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_8(scope) { + var Interactable = scope.Interactable; + + Interactable.prototype.getAction = function getAction(pointer, event, interaction, element) { + var action = defaultActionChecker(this, event, interaction, element, scope); + + if (this.options.actionChecker) { + return this.options.actionChecker(pointer, event, action, this, element, interaction); + } + + return action; + }; + /** + * ```js + * interact(element, { ignoreFrom: document.getElementById('no-action') }) + * // or + * interact(element).ignoreFrom('input, textarea, a') + * ``` + * @deprecated + * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any + * of it's parents match the given CSS selector or Element, no + * drag/resize/gesture is started. + * + * Don't use this method. Instead set the `ignoreFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .draggable({ + * ignoreFrom: 'input, textarea, a[href]'', + * }) + * .pointerEvents({ + * ignoreFrom: '[no-pointer]', + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to not ignore any elements + * @return {string | Element | object} The current ignoreFrom value or this + * Interactable + */ + + + Interactable.prototype.ignoreFrom = (0, _$index_58.warnOnce)(function (newValue) { + return this._backCompatOption('ignoreFrom', newValue); + }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).'); + /** + * @deprecated + * + * A drag/resize/gesture is started only If the target of the `mousedown`, + * `pointerdown` or `touchstart` event or any of it's parents match the given + * CSS selector or Element. + * + * Don't use this method. Instead set the `allowFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .resizable({ + * allowFrom: '.resize-handle', + * .pointerEvents({ + * allowFrom: '.handle',, + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to allow from any element + * @return {string | Element | object} The current allowFrom value or this + * Interactable + */ + + Interactable.prototype.allowFrom = (0, _$index_58.warnOnce)(function (newValue) { + return this._backCompatOption('allowFrom', newValue); + }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).'); + /** + * ```js + * interact('.resize-drag') + * .resizable(true) + * .draggable(true) + * .actionChecker(function (pointer, event, action, interactable, element, interaction) { + * + * if (interact.matchesSelector(event.target, '.drag-handle')) { + * // force drag with handle target + * action.name = drag + * } + * else { + * // resize from the top and right edges + * action.name = 'resize' + * action.edges = { top: true, right: true } + * } + * + * return action + * }) + * ``` + * + * Returns or sets the function used to check action to be performed on + * pointerDown + * + * @param {function | null} [checker] A function which takes a pointer event, + * defaultAction string, interactable, element and interaction as parameters + * and returns an object with name property 'drag' 'resize' or 'gesture' and + * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right + * props. + * @return {Function | Interactable} The checker function or this Interactable + */ + + Interactable.prototype.actionChecker = actionChecker; + /** + * Returns or sets whether the the cursor should be changed depending on the + * action that would be performed if the mouse were pressed and dragged. + * + * @param {boolean} [newValue] + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.styleCursor = styleCursor; +} + +function defaultActionChecker(interactable, event, interaction, element, scope) { + var rect = interactable.getRect(element); + var buttons = event.buttons || { + 0: 1, + 1: 4, + 3: 8, + 4: 16 + }[event.button]; + var arg = { + action: null, + interactable: interactable, + interaction: interaction, + element: element, + rect: rect, + buttons: buttons + }; + scope.fire('auto-start:check', arg); + return arg.action; +} + +function styleCursor(newValue) { + if (__is_8.bool(newValue)) { + this.options.styleCursor = newValue; + return this; + } + + if (newValue === null) { + delete this.options.styleCursor; + return this; + } + + return this.options.styleCursor; +} + +function actionChecker(checker) { + if (__is_8.func(checker)) { + this.options.actionChecker = checker; + return this; + } + + if (checker === null) { + delete this.options.actionChecker; + return this; + } + + return this.options.actionChecker; +} + +var ___default_8 = { + id: 'auto-start/interactableMethods', + install: __install_8 +}; +_$InteractableMethods_8["default"] = ___default_8; + +var _$base_9 = {}; +"use strict"; + +function ___typeof_9(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_9 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_9 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_9(obj); } + +Object.defineProperty(_$base_9, "__esModule", { + value: true +}); +_$base_9["default"] = void 0; + +var __utils_9 = ___interopRequireWildcard_9(_$index_58); + +var _InteractableMethods = ___interopRequireDefault_9(_$InteractableMethods_8); + +function ___interopRequireDefault_9(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_9() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_9 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_9(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_9(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_9(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_9(scope) { + var interact = scope.interact, + defaults = scope.defaults; + scope.usePlugin(_InteractableMethods["default"]); + defaults.base.actionChecker = null; + defaults.base.styleCursor = true; + __utils_9.extend(defaults.perAction, { + manualStart: false, + max: Infinity, + maxPerElement: 1, + allowFrom: null, + ignoreFrom: null, + // only allow left button by default + // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value + mouseButtons: 1 + }); + /** + * Returns or sets the maximum number of concurrent interactions allowed. By + * default only 1 interaction is allowed at a time (for backwards + * compatibility). To allow multiple interactions on the same Interactables and + * elements, you need to enable it in the draggable, resizable and gesturable + * `'max'` and `'maxPerElement'` options. + * + * @alias module:interact.maxInteractions + * + * @param {number} [newValue] Any number. newValue <= 0 means no interactions. + */ + + interact.maxInteractions = function (newValue) { + return maxInteractions(newValue, scope); + }; + + scope.autoStart = { + // Allow this many interactions to happen simultaneously + maxInteractions: Infinity, + withinInteractionLimit: withinInteractionLimit, + cursorElement: null + }; +} + +function prepareOnDown(_ref, scope) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; + + if (interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function prepareOnMove(_ref2, scope) { + var interaction = _ref2.interaction, + pointer = _ref2.pointer, + event = _ref2.event, + eventTarget = _ref2.eventTarget; + + if (interaction.pointerType !== 'mouse' || interaction.pointerIsDown || interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function startOnMove(arg, scope) { + var interaction = arg.interaction; + + if (!interaction.pointerIsDown || interaction.interacting() || !interaction.pointerWasMoved || !interaction.prepared.name) { + return; + } + + scope.fire('autoStart:before-start', arg); + var interactable = interaction.interactable; + var actionName = interaction.prepared.name; + + if (actionName && interactable) { + // check manualStart and interaction limit + if (interactable.options[actionName].manualStart || !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) { + interaction.stop(); + } else { + interaction.start(interaction.prepared, interactable, interaction.element); + setInteractionCursor(interaction, scope); + } + } +} + +function clearCursorOnStop(_ref3, scope) { + var interaction = _ref3.interaction; + var interactable = interaction.interactable; + + if (interactable && interactable.options.styleCursor) { + setCursor(interaction.element, '', scope); + } +} // Check if the current interactable supports the action. +// If so, return the validated action. Otherwise, return null + + +function validateAction(action, interactable, element, eventTarget, scope) { + if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) && interactable.options[action.name].enabled && withinInteractionLimit(interactable, element, action, scope)) { + return action; + } + + return null; +} + +function validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope) { + for (var i = 0, len = matches.length; i < len; i++) { + var match = matches[i]; + var matchElement = matchElements[i]; + var matchAction = match.getAction(pointer, event, interaction, matchElement); + + if (!matchAction) { + continue; + } + + var action = validateAction(matchAction, match, matchElement, eventTarget, scope); + + if (action) { + return { + action: action, + interactable: match, + element: matchElement + }; + } + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function getActionInfo(interaction, pointer, event, eventTarget, scope) { + var matches = []; + var matchElements = []; + var element = eventTarget; + + function pushMatches(interactable) { + matches.push(interactable); + matchElements.push(element); + } + + while (__utils_9.is.element(element)) { + matches = []; + matchElements = []; + scope.interactables.forEachMatch(element, pushMatches); + var actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope); + + if (actionInfo.action && !actionInfo.interactable.options[actionInfo.action.name].manualStart) { + return actionInfo; + } + + element = __utils_9.dom.parentNode(element); + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function prepare(interaction, _ref4, scope) { + var action = _ref4.action, + interactable = _ref4.interactable, + element = _ref4.element; + action = action || { + name: null + }; + interaction.interactable = interactable; + interaction.element = element; + __utils_9.copyAction(interaction.prepared, action); + interaction.rect = interactable && action.name ? interactable.getRect(element) : null; + setInteractionCursor(interaction, scope); + scope.fire('autoStart:prepared', { + interaction: interaction + }); +} + +function withinInteractionLimit(interactable, element, action, scope) { + var options = interactable.options; + var maxActions = options[action.name].max; + var maxPerElement = options[action.name].maxPerElement; + var autoStartMax = scope.autoStart.maxInteractions; + var activeInteractions = 0; + var interactableCount = 0; + var elementCount = 0; // no actions if any of these values == 0 + + if (!(maxActions && maxPerElement && autoStartMax)) { + return false; + } + + for (var _i = 0; _i < scope.interactions.list.length; _i++) { + var _ref5; + + _ref5 = scope.interactions.list[_i]; + var interaction = _ref5; + var otherAction = interaction.prepared.name; + + if (!interaction.interacting()) { + continue; + } + + activeInteractions++; + + if (activeInteractions >= autoStartMax) { + return false; + } + + if (interaction.interactable !== interactable) { + continue; + } + + interactableCount += otherAction === action.name ? 1 : 0; + + if (interactableCount >= maxActions) { + return false; + } + + if (interaction.element === element) { + elementCount++; + + if (otherAction === action.name && elementCount >= maxPerElement) { + return false; + } + } + } + + return autoStartMax > 0; +} + +function maxInteractions(newValue, scope) { + if (__utils_9.is.number(newValue)) { + scope.autoStart.maxInteractions = newValue; + return this; + } + + return scope.autoStart.maxInteractions; +} + +function setCursor(element, cursor, scope) { + var prevCursorElement = scope.autoStart.cursorElement; + + if (prevCursorElement && prevCursorElement !== element) { + prevCursorElement.style.cursor = ''; + } + + element.ownerDocument.documentElement.style.cursor = cursor; + element.style.cursor = cursor; + scope.autoStart.cursorElement = cursor ? element : null; +} + +function setInteractionCursor(interaction, scope) { + var interactable = interaction.interactable, + element = interaction.element, + prepared = interaction.prepared; + + if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) { + // clear previous target element cursor + if (scope.autoStart.cursorElement) { + setCursor(scope.autoStart.cursorElement, '', scope); + } + + return; + } + + var cursor = ''; + + if (prepared.name) { + var cursorChecker = interactable.options[prepared.name].cursorChecker; + + if (__utils_9.is.func(cursorChecker)) { + cursor = cursorChecker(prepared, interactable, element, interaction._interacting); + } else { + cursor = scope.actions.map[prepared.name].getCursor(prepared); + } + } + + setCursor(interaction.element, cursor || '', scope); +} + +var autoStart = { + id: 'auto-start/base', + before: ['actions', 'actions/drag', 'actions/resize', 'actions/gesture'], + install: __install_9, + listeners: { + 'interactions:down': prepareOnDown, + 'interactions:move': function interactionsMove(arg, scope) { + prepareOnMove(arg, scope); + startOnMove(arg, scope); + }, + 'interactions:stop': clearCursorOnStop + }, + maxInteractions: maxInteractions, + withinInteractionLimit: withinInteractionLimit, + validateAction: validateAction +}; +var ___default_9 = autoStart; +_$base_9["default"] = ___default_9; + +var _$dragAxis_10 = {}; +"use strict"; + +function ___typeof_10(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_10 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_10 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_10(obj); } + +Object.defineProperty(_$dragAxis_10, "__esModule", { + value: true +}); +_$dragAxis_10["default"] = void 0; + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var __is_10 = ___interopRequireWildcard_10(_$is_59); + +var _base = ___interopRequireDefault_10(_$base_9); + +function ___interopRequireDefault_10(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_10() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_10 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_10(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_10(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_10(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function beforeStart(_ref, scope) { + var interaction = _ref.interaction, + eventTarget = _ref.eventTarget, + dx = _ref.dx, + dy = _ref.dy; + + if (interaction.prepared.name !== 'drag') { + return; + } // check if a drag is in the correct axis + + + var absX = Math.abs(dx); + var absY = Math.abs(dy); + var targetOptions = interaction.interactable.options.drag; + var startAxis = targetOptions.startAxis; + var currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy'; + interaction.prepared.axis = targetOptions.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy' + : targetOptions.lockAxis; // if the movement isn't in the startAxis of the interactable + + if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) { + // cancel the prepared action + interaction.prepared.name = null; // then try to get a drag from another ineractable + + var element = eventTarget; + + var getDraggable = function getDraggable(interactable) { + if (interactable === interaction.interactable) { + return; + } + + var options = interaction.interactable.options.drag; + + if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) { + var action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element); + + if (action && action.name === 'drag' && checkStartAxis(currentAxis, interactable) && _base["default"].validateAction(action, interactable, element, eventTarget, scope)) { + return interactable; + } + } + }; // check all interactables + + + while (__is_10.element(element)) { + var interactable = scope.interactables.forEachMatch(element, getDraggable); + + if (interactable) { + interaction.prepared.name = 'drag'; + interaction.interactable = interactable; + interaction.element = element; + break; + } + + element = (0, _$domUtils_53.parentNode)(element); + } + } +} + +function checkStartAxis(startAxis, interactable) { + if (!interactable) { + return false; + } + + var thisAxis = interactable.options.drag.startAxis; + return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis; +} + +var ___default_10 = { + id: 'auto-start/dragAxis', + listeners: { + 'autoStart:before-start': beforeStart + } +}; +_$dragAxis_10["default"] = ___default_10; + +var _$hold_11 = {}; +"use strict"; + +Object.defineProperty(_$hold_11, "__esModule", { + value: true +}); +_$hold_11["default"] = void 0; + +var ___base_11 = ___interopRequireDefault_11(_$base_9); + +function ___interopRequireDefault_11(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_11(scope) { + var defaults = scope.defaults; + scope.usePlugin(___base_11["default"]); + defaults.perAction.hold = 0; + defaults.perAction.delay = 0; +} + +function getHoldDuration(interaction) { + var actionName = interaction.prepared && interaction.prepared.name; + + if (!actionName) { + return null; + } + + var options = interaction.interactable.options; + return options[actionName].hold || options[actionName].delay; +} + +var ___default_11 = { + id: 'auto-start/hold', + install: __install_11, + listeners: { + 'interactions:new': function interactionsNew(_ref) { + var interaction = _ref.interaction; + interaction.autoStartHoldTimer = null; + }, + 'autoStart:prepared': function autoStartPrepared(_ref2) { + var interaction = _ref2.interaction; + var hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.autoStartHoldTimer = setTimeout(function () { + interaction.start(interaction.prepared, interaction.interactable, interaction.element); + }, hold); + } + }, + 'interactions:move': function interactionsMove(_ref3) { + var interaction = _ref3.interaction, + duplicate = _ref3.duplicate; + + if (interaction.pointerWasMoved && !duplicate) { + clearTimeout(interaction.autoStartHoldTimer); + } + }, + // prevent regular down->move autoStart + 'autoStart:before-start': function autoStartBeforeStart(_ref4) { + var interaction = _ref4.interaction; + var hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.prepared.name = null; + } + } + }, + getHoldDuration: getHoldDuration +}; +_$hold_11["default"] = ___default_11; + +var _$index_12 = {}; +"use strict"; + +Object.defineProperty(_$index_12, "__esModule", { + value: true +}); +Object.defineProperty(_$index_12, "autoStart", { + enumerable: true, + get: function get() { + return ___base_12["default"]; + } +}); +Object.defineProperty(_$index_12, "dragAxis", { + enumerable: true, + get: function get() { + return _dragAxis["default"]; + } +}); +Object.defineProperty(_$index_12, "hold", { + enumerable: true, + get: function get() { + return _hold["default"]; + } +}); +_$index_12["default"] = void 0; + +var ___base_12 = ___interopRequireDefault_12(_$base_9); + +var _dragAxis = ___interopRequireDefault_12(_$dragAxis_10); + +var _hold = ___interopRequireDefault_12(_$hold_11); + +function ___interopRequireDefault_12(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var ___default_12 = { + id: 'auto-start', + install: function install(scope) { + scope.usePlugin(___base_12["default"]); + scope.usePlugin(_hold["default"]); + scope.usePlugin(_dragAxis["default"]); + } +}; +_$index_12["default"] = ___default_12; + +var _$index_25 = {}; +"use strict"; + +function ___typeof_25(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_25 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_25 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_25(obj); } + +Object.defineProperty(_$index_25, "__esModule", { + value: true +}); +_$index_25["default"] = void 0; + +var ___domObjects_25 = ___interopRequireDefault_25(_$domObjects_52); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var ___extend_25 = ___interopRequireDefault_25(_$extend_55); + +var __is_25 = ___interopRequireWildcard_25(_$is_59); + +var ___window_25 = ___interopRequireDefault_25(_$window_68); + +function ___getRequireWildcardCache_25() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_25 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_25(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_25(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_25(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_25(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___toConsumableArray_25(arr) { return ___arrayWithoutHoles_25(arr) || ___iterableToArray_25(arr) || ___nonIterableSpread_25(); } + +function ___nonIterableSpread_25() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function ___iterableToArray_25(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function ___arrayWithoutHoles_25(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +var CheckName; + +(function (CheckName) { + CheckName["touchAction"] = "touchAction"; + CheckName["boxSizing"] = "boxSizing"; + CheckName["noListeners"] = "noListeners"; +})(CheckName || (CheckName = {})); + +var prefix = '[interact.js] '; +var links = { + touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action', + boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing' +}; +var isProduction = "production" === 'production'; // eslint-disable-next-line no-restricted-syntax + +function __install_25(scope) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + logger = _ref.logger; + + var Interactable = scope.Interactable, + defaults = scope.defaults; + scope.logger = logger || console; + defaults.base.devTools = { + ignore: {} + }; + + Interactable.prototype.devTools = function (options) { + if (options) { + (0, ___extend_25["default"])(this.options.devTools, options); + return this; + } + + return this.options.devTools; + }; +} + +var checks = [{ + name: CheckName.touchAction, + perform: function perform(_ref2) { + var element = _ref2.element; + return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/); + }, + getInfo: function getInfo(_ref3) { + var element = _ref3.element; + return [element, links.touchAction]; + }, + text: 'Consider adding CSS "touch-action: none" to this element\n' +}, { + name: CheckName.boxSizing, + perform: function perform(interaction) { + var element = interaction.element; + return interaction.prepared.name === 'resize' && element instanceof ___domObjects_25["default"].HTMLElement && !hasStyle(element, 'boxSizing', /border-box/); + }, + text: 'Consider adding CSS "box-sizing: border-box" to this resizable element', + getInfo: function getInfo(_ref4) { + var element = _ref4.element; + return [element, links.boxSizing]; + } +}, { + name: CheckName.noListeners, + perform: function perform(interaction) { + var actionName = interaction.prepared.name; + var moveListeners = interaction.interactable.events.types["".concat(actionName, "move")] || []; + return !moveListeners.length; + }, + getInfo: function getInfo(interaction) { + return [interaction.prepared.name, interaction.interactable]; + }, + text: 'There are no listeners set for this action' +}]; + +function hasStyle(element, prop, styleRe) { + return styleRe.test(element.style[prop] || ___window_25["default"].window.getComputedStyle(element)[prop]); +} + +function parentHasStyle(element, prop, styleRe) { + var parent = element; + + while (__is_25.element(parent)) { + if (hasStyle(parent, prop, styleRe)) { + return true; + } + + parent = (0, _$domUtils_53.parentNode)(parent); + } + + return false; +} + +var id = 'dev-tools'; +var defaultExport = isProduction ? { + id: id, + install: function install() {} +} : { + id: id, + install: __install_25, + listeners: { + 'interactions:action-start': function interactionsActionStart(_ref5, scope) { + var interaction = _ref5.interaction; + + for (var _i = 0; _i < checks.length; _i++) { + var _ref6; + + _ref6 = checks[_i]; + var check = _ref6; + var options = interaction.interactable && interaction.interactable.options; + + if (!(options && options.devTools && options.devTools.ignore[check.name]) && check.perform(interaction)) { + var _scope$logger; + + (_scope$logger = scope.logger).warn.apply(_scope$logger, [prefix + check.text].concat(___toConsumableArray_25(check.getInfo(interaction)))); + } + } + } + }, + checks: checks, + CheckName: CheckName, + links: links, + prefix: prefix +}; +var ___default_25 = defaultExport; +_$index_25["default"] = ___default_25; + +var _$Modification_29 = {}; +"use strict"; + +function ___typeof_29(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_29 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_29 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_29(obj); } + +Object.defineProperty(_$Modification_29, "__esModule", { + value: true +}); +_$Modification_29.getRectOffset = getRectOffset; +_$Modification_29["default"] = void 0; + +var ___clone_29 = ___interopRequireDefault_29(_$clone_51); + +var ___extend_29 = ___interopRequireDefault_29(_$extend_55); + +var rectUtils = ___interopRequireWildcard_29(_$rect_65); + +function ___getRequireWildcardCache_29() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_29 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_29(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_29(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_29(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_29(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_29(arr, i) { return ___arrayWithHoles_29(arr) || ___iterableToArrayLimit_29(arr, i) || ___nonIterableRest_29(); } + +function ___nonIterableRest_29() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_29(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_29(arr) { if (Array.isArray(arr)) return arr; } + +function ___classCallCheck_29(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_29(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_29(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_29(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_29(Constructor, staticProps); return Constructor; } + +function ___defineProperty_29(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Modification = /*#__PURE__*/function () { + function Modification(interaction) { + ___classCallCheck_29(this, Modification); + + this.interaction = interaction; + + ___defineProperty_29(this, "states", []); + + ___defineProperty_29(this, "startOffset", { + left: 0, + right: 0, + top: 0, + bottom: 0 + }); + + ___defineProperty_29(this, "startDelta", null); + + ___defineProperty_29(this, "result", null); + + ___defineProperty_29(this, "endResult", null); + + ___defineProperty_29(this, "edges", void 0); + + this.result = createResult(); + } + + ___createClass_29(Modification, [{ + key: "start", + value: function start(_ref, pageCoords) { + var phase = _ref.phase; + var interaction = this.interaction; + var modifierList = getModifierList(interaction); + this.prepareStates(modifierList); + this.edges = (0, ___extend_29["default"])({}, interaction.edges); + this.startOffset = getRectOffset(interaction.rect, pageCoords); + this.startDelta = { + x: 0, + y: 0 + }; + var arg = { + phase: phase, + pageCoords: pageCoords, + preEnd: false + }; + this.result = createResult(); + this.startAll(arg); + var result = this.result = this.setAll(arg); + return result; + } + }, { + key: "fillArg", + value: function fillArg(arg) { + var interaction = this.interaction; + arg.interaction = interaction; + arg.interactable = interaction.interactable; + arg.element = interaction.element; + arg.rect = arg.rect || interaction.rect; + arg.edges = this.edges; + arg.startOffset = this.startOffset; + } + }, { + key: "startAll", + value: function startAll(arg) { + this.fillArg(arg); + + for (var _i = 0; _i < this.states.length; _i++) { + var _ref2; + + _ref2 = this.states[_i]; + var state = _ref2; + + if (state.methods.start) { + arg.state = state; + state.methods.start(arg); + } + } + } + }, { + key: "setAll", + value: function setAll(arg) { + this.fillArg(arg); + var phase = arg.phase, + preEnd = arg.preEnd, + skipModifiers = arg.skipModifiers, + unmodifiedRect = arg.rect; + arg.coords = (0, ___extend_29["default"])({}, arg.pageCoords); + arg.rect = (0, ___extend_29["default"])({}, unmodifiedRect); + var states = skipModifiers ? this.states.slice(skipModifiers) : this.states; + var newResult = createResult(arg.coords, arg.rect); + + for (var _i2 = 0; _i2 < states.length; _i2++) { + var _ref3; + + _ref3 = states[_i2]; + var state = _ref3; + var options = state.options; + var lastModifierCoords = (0, ___extend_29["default"])({}, arg.coords); + var returnValue = null; + + if (state.methods.set && this.shouldDo(options, preEnd, phase)) { + arg.state = state; + returnValue = state.methods.set(arg); + rectUtils.addEdges(this.interaction.edges, arg.rect, { + x: arg.coords.x - lastModifierCoords.x, + y: arg.coords.y - lastModifierCoords.y + }); + } + + newResult.eventProps.push(returnValue); + } + + newResult.delta.x = arg.coords.x - arg.pageCoords.x; + newResult.delta.y = arg.coords.y - arg.pageCoords.y; + newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left; + newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right; + newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top; + newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom; + var prevCoords = this.result.coords; + var prevRect = this.result.rect; + + if (prevCoords && prevRect) { + var rectChanged = newResult.rect.left !== prevRect.left || newResult.rect.right !== prevRect.right || newResult.rect.top !== prevRect.top || newResult.rect.bottom !== prevRect.bottom; + newResult.changed = rectChanged || prevCoords.x !== newResult.coords.x || prevCoords.y !== newResult.coords.y; + } + + return newResult; + } + }, { + key: "applyToInteraction", + value: function applyToInteraction(arg) { + var interaction = this.interaction; + var phase = arg.phase; + var curCoords = interaction.coords.cur; + var startCoords = interaction.coords.start; + var result = this.result, + startDelta = this.startDelta; + var curDelta = result.delta; + + if (phase === 'start') { + (0, ___extend_29["default"])(this.startDelta, result.delta); + } + + for (var _i3 = 0; _i3 < [[startCoords, startDelta], [curCoords, curDelta]].length; _i3++) { + var _ref4; + + _ref4 = [[startCoords, startDelta], [curCoords, curDelta]][_i3]; + + var _ref5 = _ref4, + _ref6 = ___slicedToArray_29(_ref5, 2), + coordsSet = _ref6[0], + delta = _ref6[1]; + + coordsSet.page.x += delta.x; + coordsSet.page.y += delta.y; + coordsSet.client.x += delta.x; + coordsSet.client.y += delta.y; + } + + var rectDelta = this.result.rectDelta; + var rect = arg.rect || interaction.rect; + rect.left += rectDelta.left; + rect.right += rectDelta.right; + rect.top += rectDelta.top; + rect.bottom += rectDelta.bottom; + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + }, { + key: "setAndApply", + value: function setAndApply(arg) { + var interaction = this.interaction; + var phase = arg.phase, + preEnd = arg.preEnd, + skipModifiers = arg.skipModifiers; + var result = this.setAll({ + preEnd: preEnd, + phase: phase, + pageCoords: arg.modifiedCoords || interaction.coords.cur.page + }); + this.result = result; // don't fire an action move if a modifier would keep the event in the same + // cordinates as before + + if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) { + return false; + } + + if (arg.modifiedCoords) { + var page = interaction.coords.cur.page; + var adjustment = { + x: arg.modifiedCoords.x - page.x, + y: arg.modifiedCoords.y - page.y + }; + result.coords.x += adjustment.x; + result.coords.y += adjustment.y; + result.delta.x += adjustment.x; + result.delta.y += adjustment.y; + } + + this.applyToInteraction(arg); + } + }, { + key: "beforeEnd", + value: function beforeEnd(arg) { + var interaction = arg.interaction, + event = arg.event; + var states = this.states; + + if (!states || !states.length) { + return; + } + + var doPreend = false; + + for (var _i4 = 0; _i4 < states.length; _i4++) { + var _ref7; + + _ref7 = states[_i4]; + var state = _ref7; + arg.state = state; + var options = state.options, + methods = state.methods; + var endPosition = methods.beforeEnd && methods.beforeEnd(arg); + + if (endPosition) { + this.endResult = endPosition; + return false; + } + + doPreend = doPreend || !doPreend && this.shouldDo(options, true, arg.phase, true); + } + + if (doPreend) { + // trigger a final modified move before ending + interaction.move({ + event: event, + preEnd: true + }); + } + } + }, { + key: "stop", + value: function stop(arg) { + var interaction = arg.interaction; + + if (!this.states || !this.states.length) { + return; + } + + var modifierArg = (0, ___extend_29["default"])({ + states: this.states, + interactable: interaction.interactable, + element: interaction.element, + rect: null + }, arg); + this.fillArg(modifierArg); + + for (var _i5 = 0; _i5 < this.states.length; _i5++) { + var _ref8; + + _ref8 = this.states[_i5]; + var state = _ref8; + modifierArg.state = state; + + if (state.methods.stop) { + state.methods.stop(modifierArg); + } + } + + this.states = null; + this.endResult = null; + } + }, { + key: "prepareStates", + value: function prepareStates(modifierList) { + this.states = []; + + for (var index = 0; index < modifierList.length; index++) { + var _modifierList$index = modifierList[index], + options = _modifierList$index.options, + methods = _modifierList$index.methods, + name = _modifierList$index.name; + + if (options && options.enabled === false) { + continue; + } + + this.states.push({ + options: options, + methods: methods, + index: index, + name: name + }); + } + + return this.states; + } + }, { + key: "restoreInteractionCoords", + value: function restoreInteractionCoords(_ref9) { + var _ref9$interaction = _ref9.interaction, + coords = _ref9$interaction.coords, + rect = _ref9$interaction.rect, + modification = _ref9$interaction.modification; + + if (!modification.result) { + return; + } + + var startDelta = modification.startDelta; + var _modification$result = modification.result, + curDelta = _modification$result.delta, + rectDelta = _modification$result.rectDelta; + var coordsAndDeltas = [[coords.start, startDelta], [coords.cur, curDelta]]; + + for (var _i6 = 0; _i6 < coordsAndDeltas.length; _i6++) { + var _ref10; + + _ref10 = coordsAndDeltas[_i6]; + + var _ref11 = _ref10, + _ref12 = ___slicedToArray_29(_ref11, 2), + coordsSet = _ref12[0], + delta = _ref12[1]; + + coordsSet.page.x -= delta.x; + coordsSet.page.y -= delta.y; + coordsSet.client.x -= delta.x; + coordsSet.client.y -= delta.y; + } + + rect.left -= rectDelta.left; + rect.right -= rectDelta.right; + rect.top -= rectDelta.top; + rect.bottom -= rectDelta.bottom; + } + }, { + key: "shouldDo", + value: function shouldDo(options, preEnd, phase, requireEndOnly) { + if ( // ignore disabled modifiers + !options || options.enabled === false || // check if we require endOnly option to fire move before end + requireEndOnly && !options.endOnly || // don't apply endOnly modifiers when not ending + options.endOnly && !preEnd || // check if modifier should run be applied on start + phase === 'start' && !options.setStart) { + return false; + } + + return true; + } + }, { + key: "copyFrom", + value: function copyFrom(other) { + this.startOffset = other.startOffset; + this.startDelta = other.startDelta; + this.edges = other.edges; + this.states = other.states.map(function (s) { + return (0, ___clone_29["default"])(s); + }); + this.result = createResult((0, ___extend_29["default"])({}, other.result.coords), (0, ___extend_29["default"])({}, other.result.rect)); + } + }, { + key: "destroy", + value: function destroy() { + for (var prop in this) { + this[prop] = null; + } + } + }]); + + return Modification; +}(); + +_$Modification_29["default"] = Modification; + +function createResult(coords, rect) { + return { + rect: rect, + coords: coords, + delta: { + x: 0, + y: 0 + }, + rectDelta: { + left: 0, + right: 0, + top: 0, + bottom: 0 + }, + eventProps: [], + changed: true + }; +} + +function getModifierList(interaction) { + var actionOptions = interaction.interactable.options[interaction.prepared.name]; + var actionModifiers = actionOptions.modifiers; + + if (actionModifiers && actionModifiers.length) { + return actionModifiers.filter(function (modifier) { + return !modifier.options || modifier.options.enabled !== false; + }); + } + + return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize'].map(function (type) { + var options = actionOptions[type]; + return options && options.enabled && { + options: options, + methods: options._methods + }; + }).filter(function (m) { + return !!m; + }); +} + +function getRectOffset(rect, coords) { + return rect ? { + left: coords.x - rect.left, + top: coords.y - rect.top, + right: rect.right - coords.x, + bottom: rect.bottom - coords.y + } : { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; +} + +var _$base_32 = {}; +"use strict"; + +Object.defineProperty(_$base_32, "__esModule", { + value: true +}); +_$base_32.makeModifier = makeModifier; +_$base_32.addEventModifiers = addEventModifiers; +_$base_32["default"] = void 0; + +var _Modification = ___interopRequireDefault_32(_$Modification_29); + +function ___interopRequireDefault_32(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function makeModifier(module, name) { + var defaults = module.defaults; + var methods = { + start: module.start, + set: module.set, + beforeEnd: module.beforeEnd, + stop: module.stop + }; + + var modifier = function modifier(_options) { + var options = _options || {}; + options.enabled = options.enabled !== false; // add missing defaults to options + + for (var _prop in defaults) { + if (!(_prop in options)) { + options[_prop] = defaults[_prop]; + } + } + + var m = { + options: options, + methods: methods, + name: name + }; + return m; + }; + + if (name && typeof name === 'string') { + // for backwrads compatibility + modifier._defaults = defaults; + modifier._methods = methods; + } + + return modifier; +} + +function addEventModifiers(_ref) { + var iEvent = _ref.iEvent, + result = _ref.interaction.modification.result; + + if (result) { + iEvent.modifiers = result.eventProps; + } +} + +var modifiersBase = { + id: 'modifiers/base', + install: function install(scope) { + scope.defaults.perAction.modifiers = []; + }, + listeners: { + 'interactions:new': function interactionsNew(_ref2) { + var interaction = _ref2.interaction; + interaction.modification = new _Modification["default"](interaction); + }, + 'interactions:before-action-start': function interactionsBeforeActionStart(arg) { + var modification = arg.interaction.modification; + modification.start(arg, arg.interaction.coords.start.page); + arg.interaction.edges = modification.edges; + modification.applyToInteraction(arg); + }, + 'interactions:before-action-move': function interactionsBeforeActionMove(arg) { + return arg.interaction.modification.setAndApply(arg); + }, + 'interactions:before-action-end': function interactionsBeforeActionEnd(arg) { + return arg.interaction.modification.beforeEnd(arg); + }, + 'interactions:action-start': addEventModifiers, + 'interactions:action-move': addEventModifiers, + 'interactions:action-end': addEventModifiers, + 'interactions:after-action-start': function interactionsAfterActionStart(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:after-action-move': function interactionsAfterActionMove(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:stop': function interactionsStop(arg) { + return arg.interaction.modification.stop(arg); + } + }, + before: ['actions', 'action/drag', 'actions/resize', 'actions/gesture'] +}; +var ___default_32 = modifiersBase; +_$base_32["default"] = ___default_32; + +var _$index_41 = {}; +"use strict"; + +function ___typeof_41(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_41 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_41 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_41(obj); } + +Object.defineProperty(_$index_41, "__esModule", { + value: true +}); +_$index_41.addTotal = addTotal; +_$index_41.applyPending = applyPending; +_$index_41["default"] = void 0; + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +var __rectUtils_41 = ___interopRequireWildcard_41(_$rect_65); + +function ___getRequireWildcardCache_41() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_41 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_41(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_41(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_41(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +_$Interaction_18._ProxyMethods.offsetBy = ''; + +function addTotal(interaction) { + if (!interaction.pointerIsDown) { + return; + } + + addToCoords(interaction.coords.cur, interaction.offset.total); + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +function beforeAction(_ref) { + var interaction = _ref.interaction; + applyPending(interaction); +} + +function beforeEnd(_ref2) { + var interaction = _ref2.interaction; + var hadPending = applyPending(interaction); + + if (!hadPending) { + return; + } + + interaction.move({ + offset: true + }); + interaction.end(); + return false; +} + +function __end_41(_ref3) { + var interaction = _ref3.interaction; + interaction.offset.total.x = 0; + interaction.offset.total.y = 0; + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +function applyPending(interaction) { + if (!hasPending(interaction)) { + return false; + } + + var pending = interaction.offset.pending; + addToCoords(interaction.coords.cur, pending); + addToCoords(interaction.coords.delta, pending); + __rectUtils_41.addEdges(interaction.edges, interaction.rect, pending); + pending.x = 0; + pending.y = 0; + return true; +} + +function offsetBy(_ref4) { + var x = _ref4.x, + y = _ref4.y; + this.offset.pending.x += x; + this.offset.pending.y += y; + this.offset.total.x += x; + this.offset.total.y += y; +} + +function addToCoords(_ref5, _ref6) { + var page = _ref5.page, + client = _ref5.client; + var x = _ref6.x, + y = _ref6.y; + page.x += x; + page.y += y; + client.x += x; + client.y += y; +} + +function hasPending(interaction) { + return !!(interaction.offset.pending.x || interaction.offset.pending.y); +} + +var offset = { + id: 'offset', + install: function install(scope) { + scope.Interaction.prototype.offsetBy = offsetBy; + }, + listeners: { + 'interactions:new': function interactionsNew(_ref7) { + var interaction = _ref7.interaction; + interaction.offset = { + total: { + x: 0, + y: 0 + }, + pending: { + x: 0, + y: 0 + } + }; + }, + 'interactions:update-pointer': function interactionsUpdatePointer(_ref8) { + var interaction = _ref8.interaction; + return addTotal(interaction); + }, + 'interactions:before-action-start': beforeAction, + 'interactions:before-action-move': beforeAction, + 'interactions:before-action-end': beforeEnd, + 'interactions:stop': __end_41 + } +}; +var ___default_41 = offset; +_$index_41["default"] = ___default_41; + +var _$index_26 = {}; +"use strict"; + +function ___typeof_26(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_26 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_26 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_26(obj); } + +Object.defineProperty(_$index_26, "__esModule", { + value: true +}); +_$index_26["default"] = _$index_26.InertiaState = void 0; + +var modifiers = ___interopRequireWildcard_26(_$base_32); + +var ___Modification_26 = ___interopRequireDefault_26(_$Modification_29); + +var ___index_26 = ___interopRequireDefault_26(_$index_41); + +var __dom_26 = ___interopRequireWildcard_26(_$domUtils_53); + +var ___hypot_26 = ___interopRequireDefault_26(_$hypot_57); + +var __is_26 = ___interopRequireWildcard_26(_$is_59); + +/* removed: var _$pointerUtils_63 = require("@interactjs/utils/pointerUtils"); */; + +var ___raf_26 = ___interopRequireDefault_26(_$raf_64); + +function ___interopRequireDefault_26(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_26() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_26 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_26(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_26(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_26(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_26(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_26(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_26(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_26(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_26(Constructor, staticProps); return Constructor; } + +function ___defineProperty_26(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function __install_26(scope) { + var defaults = scope.defaults; + scope.usePlugin(___index_26["default"]); + scope.usePlugin(modifiers["default"]); + scope.actions.phases.inertiastart = true; + scope.actions.phases.resume = true; + defaults.perAction.inertia = { + enabled: false, + resistance: 10, + // the lambda in exponential decay + minSpeed: 100, + // target speed must be above this for inertia to start + endSpeed: 10, + // the speed at which inertia is slow enough to stop + allowResume: true, + // allow resuming an action in inertia phase + smoothEndDuration: 300 // animate to snap/restrict endOnly if there's no inertia + + }; +} + +var InertiaState = /*#__PURE__*/function () { + // eslint-disable-line camelcase + // eslint-disable-line camelcase + function InertiaState(interaction) { + ___classCallCheck_26(this, InertiaState); + + this.interaction = interaction; + + ___defineProperty_26(this, "active", false); + + ___defineProperty_26(this, "isModified", false); + + ___defineProperty_26(this, "smoothEnd", false); + + ___defineProperty_26(this, "allowResume", false); + + ___defineProperty_26(this, "modification", null); + + ___defineProperty_26(this, "modifierCount", 0); + + ___defineProperty_26(this, "modifierArg", null); + + ___defineProperty_26(this, "startCoords", null); + + ___defineProperty_26(this, "t0", 0); + + ___defineProperty_26(this, "v0", 0); + + ___defineProperty_26(this, "te", 0); + + ___defineProperty_26(this, "targetOffset", null); + + ___defineProperty_26(this, "modifiedOffset", null); + + ___defineProperty_26(this, "currentOffset", null); + + ___defineProperty_26(this, "lambda_v0", 0); + + ___defineProperty_26(this, "one_ve_v0", 0); + + ___defineProperty_26(this, "timeout", null); + } + + ___createClass_26(InertiaState, [{ + key: "start", + value: function start(event) { + var interaction = this.interaction; + var options = __getOptions_26(interaction); + + if (!options || !options.enabled) { + return false; + } + + var velocityClient = interaction.coords.velocity.client; + var pointerSpeed = (0, ___hypot_26["default"])(velocityClient.x, velocityClient.y); + var modification = this.modification || (this.modification = new ___Modification_26["default"](interaction)); + modification.copyFrom(interaction.modification); + this.t0 = interaction._now(); + this.allowResume = options.allowResume; + this.v0 = pointerSpeed; + this.currentOffset = { + x: 0, + y: 0 + }; + this.startCoords = interaction.coords.cur.page; + this.modifierArg = { + interaction: interaction, + interactable: interaction.interactable, + element: interaction.element, + rect: interaction.rect, + edges: interaction.edges, + pageCoords: this.startCoords, + preEnd: true, + phase: 'inertiastart' + }; + var thrown = this.t0 - interaction.coords.cur.timeStamp < 50 && pointerSpeed > options.minSpeed && pointerSpeed > options.endSpeed; + + if (thrown) { + this.startInertia(); + } else { + modification.result = modification.setAll(this.modifierArg); + + if (!modification.result.changed) { + return false; + } + + this.startSmoothEnd(); + } // force modification change + + + interaction.modification.result.rect = null; // bring inertiastart event to the target coords + + interaction.offsetBy(this.targetOffset); + + interaction._doPhase({ + interaction: interaction, + event: event, + phase: 'inertiastart' + }); + + interaction.offsetBy({ + x: -this.targetOffset.x, + y: -this.targetOffset.y + }); // force modification change + + interaction.modification.result.rect = null; + this.active = true; + interaction.simulation = this; + return true; + } + }, { + key: "startInertia", + value: function startInertia() { + var _this = this; + + var startVelocity = this.interaction.coords.velocity.client; + var options = __getOptions_26(this.interaction); + var lambda = options.resistance; + var inertiaDur = -Math.log(options.endSpeed / this.v0) / lambda; + this.targetOffset = { + x: (startVelocity.x - inertiaDur) / lambda, + y: (startVelocity.y - inertiaDur) / lambda + }; + this.te = inertiaDur; + this.lambda_v0 = lambda / this.v0; + this.one_ve_v0 = 1 - options.endSpeed / this.v0; + var modification = this.modification, + modifierArg = this.modifierArg; + modifierArg.pageCoords = { + x: this.startCoords.x + this.targetOffset.x, + y: this.startCoords.y + this.targetOffset.y + }; + modification.result = modification.setAll(modifierArg); + + if (modification.result.changed) { + this.isModified = true; + this.modifiedOffset = { + x: this.targetOffset.x + modification.result.delta.x, + y: this.targetOffset.y + modification.result.delta.y + }; + } + + this.timeout = ___raf_26["default"].request(function () { + return _this.inertiaTick(); + }); + } + }, { + key: "startSmoothEnd", + value: function startSmoothEnd() { + var _this2 = this; + + this.smoothEnd = true; + this.isModified = true; + this.targetOffset = { + x: this.modification.result.delta.x, + y: this.modification.result.delta.y + }; + this.timeout = ___raf_26["default"].request(function () { + return _this2.smoothEndTick(); + }); + } + }, { + key: "inertiaTick", + value: function inertiaTick() { + var _this3 = this; + + var interaction = this.interaction; + var options = __getOptions_26(interaction); + var lambda = options.resistance; + var t = (interaction._now() - this.t0) / 1000; + + if (t < this.te) { + var progress = 1 - (Math.exp(-lambda * t) - this.lambda_v0) / this.one_ve_v0; + var newOffset; + + if (this.isModified) { + newOffset = getQuadraticCurvePoint(0, 0, this.targetOffset.x, this.targetOffset.y, this.modifiedOffset.x, this.modifiedOffset.y, progress); + } else { + newOffset = { + x: this.targetOffset.x * progress, + y: this.targetOffset.y * progress + }; + } + + var delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move(); + this.timeout = ___raf_26["default"].request(function () { + return _this3.inertiaTick(); + }); + } else { + interaction.offsetBy({ + x: this.modifiedOffset.x - this.currentOffset.x, + y: this.modifiedOffset.y - this.currentOffset.y + }); + this.end(); + } + } + }, { + key: "smoothEndTick", + value: function smoothEndTick() { + var _this4 = this; + + var interaction = this.interaction; + var t = interaction._now() - this.t0; + + var _getOptions = __getOptions_26(interaction), + duration = _getOptions.smoothEndDuration; + + if (t < duration) { + var newOffset = { + x: easeOutQuad(t, 0, this.targetOffset.x, duration), + y: easeOutQuad(t, 0, this.targetOffset.y, duration) + }; + var delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move({ + skipModifiers: this.modifierCount + }); + this.timeout = ___raf_26["default"].request(function () { + return _this4.smoothEndTick(); + }); + } else { + interaction.offsetBy({ + x: this.targetOffset.x - this.currentOffset.x, + y: this.targetOffset.y - this.currentOffset.y + }); + this.end(); + } + } + }, { + key: "resume", + value: function resume(_ref) { + var pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; + var interaction = this.interaction; // undo inertia changes to interaction coords + + interaction.offsetBy({ + x: -this.currentOffset.x, + y: -this.currentOffset.y + }); // update pointer at pointer down position + + interaction.updatePointer(pointer, event, eventTarget, true); // fire resume signals and event + + interaction._doPhase({ + interaction: interaction, + event: event, + phase: 'resume' + }); + + (0, _$pointerUtils_63.copyCoords)(interaction.coords.prev, interaction.coords.cur); + this.stop(); + } + }, { + key: "end", + value: function end() { + this.interaction.move(); + this.interaction.end(); + this.stop(); + } + }, { + key: "stop", + value: function stop() { + this.active = this.smoothEnd = false; + this.interaction.simulation = null; + + ___raf_26["default"].cancel(this.timeout); + } + }]); + + return InertiaState; +}(); + +_$index_26.InertiaState = InertiaState; + +function __start_26(_ref2) { + var interaction = _ref2.interaction, + event = _ref2.event; + + if (!interaction._interacting || interaction.simulation) { + return null; + } + + var started = interaction.inertia.start(event); // prevent action end if inertia or smoothEnd + + return started ? false : null; +} // Check if the down event hits the current inertia target +// control should be return to the user + + +function resume(arg) { + var interaction = arg.interaction, + eventTarget = arg.eventTarget; + var state = interaction.inertia; + + if (!state.active) { + return; + } + + var element = eventTarget; // climb up the DOM tree from the event target + + while (__is_26.element(element)) { + // if interaction element is the current inertia target element + if (element === interaction.element) { + state.resume(arg); + break; + } + + element = __dom_26.parentNode(element); + } +} + +function stop(_ref3) { + var interaction = _ref3.interaction; + var state = interaction.inertia; + + if (state.active) { + state.stop(); + } +} + +function __getOptions_26(_ref4) { + var interactable = _ref4.interactable, + prepared = _ref4.prepared; + return interactable && interactable.options && prepared.name && interactable.options[prepared.name].inertia; +} + +var inertia = { + id: 'inertia', + before: ['modifiers/base'], + install: __install_26, + listeners: { + 'interactions:new': function interactionsNew(_ref5) { + var interaction = _ref5.interaction; + interaction.inertia = new InertiaState(interaction); + }, + 'interactions:before-action-end': __start_26, + 'interactions:down': resume, + 'interactions:stop': stop, + 'interactions:before-action-resume': function interactionsBeforeActionResume(arg) { + var modification = arg.interaction.modification; + modification.stop(arg); + modification.start(arg, arg.interaction.coords.cur.page); + modification.applyToInteraction(arg); + }, + 'interactions:before-action-inertiastart': function interactionsBeforeActionInertiastart(arg) { + return arg.interaction.modification.setAndApply(arg); + }, + 'interactions:action-resume': modifiers.addEventModifiers, + 'interactions:action-inertiastart': modifiers.addEventModifiers, + 'interactions:after-action-inertiastart': function interactionsAfterActionInertiastart(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:after-action-resume': function interactionsAfterActionResume(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + } + } +}; // http://stackoverflow.com/a/5634528/2280888 + +function _getQBezierValue(t, p1, p2, p3) { + var iT = 1 - t; + return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3; +} + +function getQuadraticCurvePoint(startX, startY, cpX, cpY, endX, endY, position) { + return { + x: _getQBezierValue(position, startX, cpX, endX), + y: _getQBezierValue(position, startY, cpY, endY) + }; +} // http://gizma.com/easing/ + + +function easeOutQuad(t, b, c, d) { + t /= d; + return -c * t * (t - 2) + b; +} + +var ___default_26 = inertia; +_$index_26["default"] = ___default_26; + +var _$aspectRatio_31 = {}; +"use strict"; + +Object.defineProperty(_$aspectRatio_31, "__esModule", { + value: true +}); +_$aspectRatio_31.aspectRatio = _$aspectRatio_31["default"] = void 0; + +var ___extend_31 = ___interopRequireDefault_31(_$extend_55); + +/* removed: var _$rect_65 = require("@interactjs/utils/rect"); */; + +var ___Modification_31 = ___interopRequireDefault_31(_$Modification_29); + +/* removed: var _$base_32 = require("./base"); */; + +function ___interopRequireDefault_31(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { ___defineProperty_31(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function ___defineProperty_31(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var aspectRatio = { + start: function start(arg) { + var state = arg.state, + rect = arg.rect, + originalEdges = arg.edges, + coords = arg.pageCoords; + var ratio = state.options.ratio; + var _state$options = state.options, + equalDelta = _state$options.equalDelta, + modifiers = _state$options.modifiers; + + if (ratio === 'preserve') { + ratio = rect.width / rect.height; + } + + state.startCoords = (0, ___extend_31["default"])({}, coords); + state.startRect = (0, ___extend_31["default"])({}, rect); + state.ratio = ratio; + state.equalDelta = equalDelta; + var linkedEdges = state.linkedEdges = { + top: originalEdges.top || originalEdges.left && !originalEdges.bottom, + left: originalEdges.left || originalEdges.top && !originalEdges.right, + bottom: originalEdges.bottom || originalEdges.right && !originalEdges.top, + right: originalEdges.right || originalEdges.bottom && !originalEdges.left + }; + state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right); + + if (state.equalDelta) { + state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1); + } else { + var negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left; + state.edgeSign = negativeSecondaryEdge ? -1 : 1; + } + + (0, ___extend_31["default"])(arg.edges, linkedEdges); + + if (!modifiers || !modifiers.length) { + return; + } + + var subModification = new ___Modification_31["default"](arg.interaction); + subModification.copyFrom(arg.interaction.modification); + subModification.prepareStates(modifiers); + state.subModification = subModification; + subModification.startAll(_objectSpread({}, arg)); + }, + set: function set(arg) { + var state = arg.state, + rect = arg.rect, + coords = arg.coords; + var initialCoords = (0, ___extend_31["default"])({}, coords); + var aspectMethod = state.equalDelta ? setEqualDelta : setRatio; + aspectMethod(state, state.xIsPrimaryAxis, coords, rect); + + if (!state.subModification) { + return null; + } + + var correctedRect = (0, ___extend_31["default"])({}, rect); + (0, _$rect_65.addEdges)(state.linkedEdges, correctedRect, { + x: coords.x - initialCoords.x, + y: coords.y - initialCoords.y + }); + var result = state.subModification.setAll(_objectSpread({}, arg, { + rect: correctedRect, + edges: state.linkedEdges, + pageCoords: coords, + prevCoords: coords, + prevRect: correctedRect + })); + var delta = result.delta; + + if (result.changed) { + var xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y); // do aspect modification again with critical edge axis as primary + + aspectMethod(state, xIsCriticalAxis, result.coords, result.rect); + (0, ___extend_31["default"])(coords, result.coords); + } + + return result.eventProps; + }, + defaults: { + ratio: 'preserve', + equalDelta: false, + modifiers: [], + enabled: false + } +}; +_$aspectRatio_31.aspectRatio = aspectRatio; + +function setEqualDelta(_ref, xIsPrimaryAxis, coords) { + var startCoords = _ref.startCoords, + edgeSign = _ref.edgeSign; + + if (xIsPrimaryAxis) { + coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign; + } else { + coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign; + } +} + +function setRatio(_ref2, xIsPrimaryAxis, coords, rect) { + var startRect = _ref2.startRect, + startCoords = _ref2.startCoords, + ratio = _ref2.ratio, + edgeSign = _ref2.edgeSign; + + if (xIsPrimaryAxis) { + var newHeight = rect.width / ratio; + coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign; + } else { + var newWidth = rect.height * ratio; + coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign; + } +} + +var ___default_31 = (0, _$base_32.makeModifier)(aspectRatio, 'aspectRatio'); + +_$aspectRatio_31["default"] = ___default_31; + +var _$pointer_35 = {}; +"use strict"; + +function ___typeof_35(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_35 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_35 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_35(obj); } + +Object.defineProperty(_$pointer_35, "__esModule", { + value: true +}); +_$pointer_35.getRestrictionRect = getRestrictionRect; +_$pointer_35.restrict = _$pointer_35["default"] = void 0; + +var ___extend_35 = ___interopRequireDefault_35(_$extend_55); + +var __is_35 = ___interopRequireWildcard_35(_$is_59); + +var __rectUtils_35 = ___interopRequireWildcard_35(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +function ___getRequireWildcardCache_35() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_35 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_35(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_35(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_35(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_35(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __start_35(_ref) { + var rect = _ref.rect, + startOffset = _ref.startOffset, + state = _ref.state, + interaction = _ref.interaction, + pageCoords = _ref.pageCoords; + var options = state.options; + var elementRect = options.elementRect; + var offset = (0, ___extend_35["default"])({ + left: 0, + top: 0, + right: 0, + bottom: 0 + }, options.offset || {}); + + if (rect && elementRect) { + var restriction = getRestrictionRect(options.restriction, interaction, pageCoords); + + if (restriction) { + var widthDiff = restriction.right - restriction.left - rect.width; + var heightDiff = restriction.bottom - restriction.top - rect.height; + + if (widthDiff < 0) { + offset.left += widthDiff; + offset.right += widthDiff; + } + + if (heightDiff < 0) { + offset.top += heightDiff; + offset.bottom += heightDiff; + } + } + + offset.left += startOffset.left - rect.width * elementRect.left; + offset.top += startOffset.top - rect.height * elementRect.top; + offset.right += startOffset.right - rect.width * (1 - elementRect.right); + offset.bottom += startOffset.bottom - rect.height * (1 - elementRect.bottom); + } + + state.offset = offset; +} + +function set(_ref2) { + var coords = _ref2.coords, + interaction = _ref2.interaction, + state = _ref2.state; + var options = state.options, + offset = state.offset; + var restriction = getRestrictionRect(options.restriction, interaction, coords); + + if (!restriction) { + return; + } + + var rect = __rectUtils_35.xywhToTlbr(restriction); + coords.x = Math.max(Math.min(rect.right - offset.right, coords.x), rect.left + offset.left); + coords.y = Math.max(Math.min(rect.bottom - offset.bottom, coords.y), rect.top + offset.top); +} + +function getRestrictionRect(value, interaction, coords) { + if (__is_35.func(value)) { + return __rectUtils_35.resolveRectLike(value, interaction.interactable, interaction.element, [coords.x, coords.y, interaction]); + } else { + return __rectUtils_35.resolveRectLike(value, interaction.interactable, interaction.element); + } +} + +var __defaults_35 = { + restriction: null, + elementRect: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrict = { + start: __start_35, + set: set, + defaults: __defaults_35 +}; +_$pointer_35.restrict = restrict; + +var ___default_35 = (0, _$base_32.makeModifier)(restrict, 'restrict'); + +_$pointer_35["default"] = ___default_35; + +var _$edges_34 = {}; +"use strict"; + +function ___typeof_34(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_34 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_34 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_34(obj); } + +Object.defineProperty(_$edges_34, "__esModule", { + value: true +}); +_$edges_34.restrictEdges = _$edges_34["default"] = void 0; + +var ___extend_34 = ___interopRequireDefault_34(_$extend_55); + +var __rectUtils_34 = ___interopRequireWildcard_34(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$pointer_35 = require("./pointer"); */; + +function ___getRequireWildcardCache_34() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_34 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_34(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_34(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_34(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_34(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +// This module adds the options.resize.restrictEdges setting which sets min and +// max for the top, left, bottom and right edges of the target being resized. +// +// interact(target).resize({ +// edges: { top: true, left: true }, +// restrictEdges: { +// inner: { top: 200, left: 200, right: 400, bottom: 400 }, +// outer: { top: 0, left: 0, right: 600, bottom: 600 }, +// }, +// }) +var noInner = { + top: +Infinity, + left: +Infinity, + bottom: -Infinity, + right: -Infinity +}; +var noOuter = { + top: -Infinity, + left: -Infinity, + bottom: +Infinity, + right: +Infinity +}; + +function __start_34(_ref) { + var interaction = _ref.interaction, + startOffset = _ref.startOffset, + state = _ref.state; + var options = state.options; + var offset; + + if (options) { + var offsetRect = (0, _$pointer_35.getRestrictionRect)(options.offset, interaction, interaction.coords.start.page); + offset = __rectUtils_34.rectToXY(offsetRect); + } + + offset = offset || { + x: 0, + y: 0 + }; + state.offset = { + top: offset.y + startOffset.top, + left: offset.x + startOffset.left, + bottom: offset.y - startOffset.bottom, + right: offset.x - startOffset.right + }; +} + +function __set_34(_ref2) { + var coords = _ref2.coords, + edges = _ref2.edges, + interaction = _ref2.interaction, + state = _ref2.state; + var offset = state.offset, + options = state.options; + + if (!edges) { + return; + } + + var page = (0, ___extend_34["default"])({}, coords); + var inner = (0, _$pointer_35.getRestrictionRect)(options.inner, interaction, page) || {}; + var outer = (0, _$pointer_35.getRestrictionRect)(options.outer, interaction, page) || {}; + fixRect(inner, noInner); + fixRect(outer, noOuter); + + if (edges.top) { + coords.y = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top); + } else if (edges.bottom) { + coords.y = Math.max(Math.min(outer.bottom + offset.bottom, page.y), inner.bottom + offset.bottom); + } + + if (edges.left) { + coords.x = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left); + } else if (edges.right) { + coords.x = Math.max(Math.min(outer.right + offset.right, page.x), inner.right + offset.right); + } +} + +function fixRect(rect, defaults) { + var _arr = ['top', 'left', 'bottom', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (!(edge in rect)) { + rect[edge] = defaults[edge]; + } + } + + return rect; +} + +var __defaults_34 = { + inner: null, + outer: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrictEdges = { + noInner: noInner, + noOuter: noOuter, + start: __start_34, + set: __set_34, + defaults: __defaults_34 +}; +_$edges_34.restrictEdges = restrictEdges; + +var ___default_34 = (0, _$base_32.makeModifier)(restrictEdges, 'restrictEdges'); + +_$edges_34["default"] = ___default_34; + +var _$rect_36 = {}; +"use strict"; + +Object.defineProperty(_$rect_36, "__esModule", { + value: true +}); +_$rect_36.restrictRect = _$rect_36["default"] = void 0; + +var ___extend_36 = ___interopRequireDefault_36(_$extend_55); + +/* removed: var _$pointer_35 = require("./pointer"); */; + +/* removed: var _$base_32 = require("../base"); */; + +function ___interopRequireDefault_36(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __defaults_36 = (0, ___extend_36["default"])({ + get elementRect() { + return { + top: 0, + left: 0, + bottom: 1, + right: 1 + }; + }, + + set elementRect(_) {} + +}, _$pointer_35.restrict.defaults); +var restrictRect = { + start: _$pointer_35.restrict.start, + set: _$pointer_35.restrict.set, + defaults: __defaults_36 +}; +_$rect_36.restrictRect = restrictRect; + +var ___default_36 = (0, _$base_32.makeModifier)(restrictRect, 'restrictRect'); + +_$rect_36["default"] = ___default_36; + +var _$size_37 = {}; +"use strict"; + +function ___typeof_37(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_37 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_37 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_37(obj); } + +Object.defineProperty(_$size_37, "__esModule", { + value: true +}); +_$size_37.restrictSize = _$size_37["default"] = void 0; + +var ___extend_37 = ___interopRequireDefault_37(_$extend_55); + +var __rectUtils_37 = ___interopRequireWildcard_37(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$edges_34 = require("./edges"); */; + +/* removed: var _$pointer_35 = require("./pointer"); */; + +function ___getRequireWildcardCache_37() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_37 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_37(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_37(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_37(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_37(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var noMin = { + width: -Infinity, + height: -Infinity +}; +var noMax = { + width: +Infinity, + height: +Infinity +}; + +function __start_37(arg) { + return _$edges_34.restrictEdges.start(arg); +} + +function __set_37(arg) { + var interaction = arg.interaction, + state = arg.state, + rect = arg.rect, + edges = arg.edges; + var options = state.options; + + if (!edges) { + return; + } + + var minSize = __rectUtils_37.tlbrToXywh((0, _$pointer_35.getRestrictionRect)(options.min, interaction, arg.coords)) || noMin; + var maxSize = __rectUtils_37.tlbrToXywh((0, _$pointer_35.getRestrictionRect)(options.max, interaction, arg.coords)) || noMax; + state.options = { + endOnly: options.endOnly, + inner: (0, ___extend_37["default"])({}, _$edges_34.restrictEdges.noInner), + outer: (0, ___extend_37["default"])({}, _$edges_34.restrictEdges.noOuter) + }; + + if (edges.top) { + state.options.inner.top = rect.bottom - minSize.height; + state.options.outer.top = rect.bottom - maxSize.height; + } else if (edges.bottom) { + state.options.inner.bottom = rect.top + minSize.height; + state.options.outer.bottom = rect.top + maxSize.height; + } + + if (edges.left) { + state.options.inner.left = rect.right - minSize.width; + state.options.outer.left = rect.right - maxSize.width; + } else if (edges.right) { + state.options.inner.right = rect.left + minSize.width; + state.options.outer.right = rect.left + maxSize.width; + } + + _$edges_34.restrictEdges.set(arg); + + state.options = options; +} + +var __defaults_37 = { + min: null, + max: null, + endOnly: false, + enabled: false +}; +var restrictSize = { + start: __start_37, + set: __set_37, + defaults: __defaults_37 +}; +_$size_37.restrictSize = restrictSize; + +var ___default_37 = (0, _$base_32.makeModifier)(restrictSize, 'restrictSize'); + +_$size_37["default"] = ___default_37; + +var _$pointer_39 = {}; +"use strict"; + +function ___typeof_39(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_39 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_39 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_39(obj); } + +Object.defineProperty(_$pointer_39, "__esModule", { + value: true +}); +_$pointer_39.snap = _$pointer_39["default"] = void 0; + +var __utils_39 = ___interopRequireWildcard_39(_$index_58); + +/* removed: var _$base_32 = require("../base"); */; + +function ___getRequireWildcardCache_39() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_39 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_39(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_39(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_39(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __start_39(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + element = arg.element, + rect = arg.rect, + state = arg.state, + startOffset = arg.startOffset; + var options = state.options; + var origin = options.offsetWithOrigin ? getOrigin(arg) : { + x: 0, + y: 0 + }; + var snapOffset; + + if (options.offset === 'startCoords') { + snapOffset = { + x: interaction.coords.start.page.x, + y: interaction.coords.start.page.y + }; + } else { + var offsetRect = __utils_39.rect.resolveRectLike(options.offset, interactable, element, [interaction]); + snapOffset = __utils_39.rect.rectToXY(offsetRect) || { + x: 0, + y: 0 + }; + snapOffset.x += origin.x; + snapOffset.y += origin.y; + } + + var relativePoints = options.relativePoints; + state.offsets = rect && relativePoints && relativePoints.length ? relativePoints.map(function (relativePoint, index) { + return { + index: index, + relativePoint: relativePoint, + x: startOffset.left - rect.width * relativePoint.x + snapOffset.x, + y: startOffset.top - rect.height * relativePoint.y + snapOffset.y + }; + }) : [__utils_39.extend({ + index: 0, + relativePoint: null + }, snapOffset)]; +} + +function __set_39(arg) { + var interaction = arg.interaction, + coords = arg.coords, + state = arg.state; + var options = state.options, + offsets = state.offsets; + var origin = __utils_39.getOriginXY(interaction.interactable, interaction.element, interaction.prepared.name); + var page = __utils_39.extend({}, coords); + var targets = []; + + if (!options.offsetWithOrigin) { + page.x -= origin.x; + page.y -= origin.y; + } + + for (var _i = 0; _i < offsets.length; _i++) { + var _ref; + + _ref = offsets[_i]; + var _offset = _ref; + var relativeX = page.x - _offset.x; + var relativeY = page.y - _offset.y; + + for (var _index = 0, len = options.targets.length; _index < len; _index++) { + var snapTarget = options.targets[_index]; + var target = void 0; + + if (__utils_39.is.func(snapTarget)) { + target = snapTarget(relativeX, relativeY, interaction, _offset, _index); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + targets.push({ + x: (__utils_39.is.number(target.x) ? target.x : relativeX) + _offset.x, + y: (__utils_39.is.number(target.y) ? target.y : relativeY) + _offset.y, + range: __utils_39.is.number(target.range) ? target.range : options.range, + source: snapTarget, + index: _index, + offset: _offset + }); + } + } + + var closest = { + target: null, + inRange: false, + distance: 0, + range: 0, + delta: { + x: 0, + y: 0 + } + }; + + for (var _i2 = 0; _i2 < targets.length; _i2++) { + var _target = targets[_i2]; + var range = _target.range; + var dx = _target.x - page.x; + var dy = _target.y - page.y; + var distance = __utils_39.hypot(dx, dy); + var inRange = distance <= range; // Infinite targets count as being out of range + // compared to non infinite ones that are in range + + if (range === Infinity && closest.inRange && closest.range !== Infinity) { + inRange = false; + } + + if (!closest.target || (inRange // is the closest target in range? + ? closest.inRange && range !== Infinity // the pointer is relatively deeper in this target + ? distance / range < closest.distance / closest.range // this target has Infinite range and the closest doesn't + : range === Infinity && closest.range !== Infinity || // OR this target is closer that the previous closest + distance < closest.distance : // The other is not in range and the pointer is closer to this target + !closest.inRange && distance < closest.distance)) { + closest.target = _target; + closest.distance = distance; + closest.range = range; + closest.inRange = inRange; + closest.delta.x = dx; + closest.delta.y = dy; + } + } + + if (closest.inRange) { + coords.x = closest.target.x; + coords.y = closest.target.y; + } + + state.closest = closest; + return closest; +} + +function getOrigin(arg) { + var element = arg.interaction.element; + var optionsOrigin = __utils_39.rect.rectToXY(__utils_39.rect.resolveRectLike(arg.state.options.origin, null, null, [element])); + var origin = optionsOrigin || __utils_39.getOriginXY(arg.interactable, element, arg.interaction.prepared.name); + return origin; +} + +var __defaults_39 = { + range: Infinity, + targets: null, + offset: null, + offsetWithOrigin: true, + origin: null, + relativePoints: null, + endOnly: false, + enabled: false +}; +var snap = { + start: __start_39, + set: __set_39, + defaults: __defaults_39 +}; +_$pointer_39.snap = snap; + +var ___default_39 = (0, _$base_32.makeModifier)(snap, 'snap'); + +_$pointer_39["default"] = ___default_39; + +var _$size_40 = {}; +"use strict"; + +function ___typeof_40(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_40 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_40 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_40(obj); } + +Object.defineProperty(_$size_40, "__esModule", { + value: true +}); +_$size_40.snapSize = _$size_40["default"] = void 0; + +var ___extend_40 = ___interopRequireDefault_40(_$extend_55); + +var __is_40 = ___interopRequireWildcard_40(_$is_59); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$pointer_39 = require("./pointer"); */; + +function ___getRequireWildcardCache_40() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_40 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_40(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_40(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_40(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_40(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_40(arr, i) { return ___arrayWithHoles_40(arr) || ___iterableToArrayLimit_40(arr, i) || ___nonIterableRest_40(); } + +function ___nonIterableRest_40() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_40(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_40(arr) { if (Array.isArray(arr)) return arr; } + +function __start_40(arg) { + var state = arg.state, + edges = arg.edges; + var options = state.options; + + if (!edges) { + return null; + } + + arg.state = { + options: { + targets: null, + relativePoints: [{ + x: edges.left ? 0 : 1, + y: edges.top ? 0 : 1 + }], + offset: options.offset || 'self', + origin: { + x: 0, + y: 0 + }, + range: options.range + } + }; + state.targetFields = state.targetFields || [['width', 'height'], ['x', 'y']]; + + _$pointer_39.snap.start(arg); + + state.offsets = arg.state.offsets; + arg.state = state; +} + +function __set_40(arg) { + var interaction = arg.interaction, + state = arg.state, + coords = arg.coords; + var options = state.options, + offsets = state.offsets; + var relative = { + x: coords.x - offsets[0].x, + y: coords.y - offsets[0].y + }; + state.options = (0, ___extend_40["default"])({}, options); + state.options.targets = []; + + for (var _i = 0; _i < (options.targets || []).length; _i++) { + var _ref; + + _ref = (options.targets || [])[_i]; + var snapTarget = _ref; + var target = void 0; + + if (__is_40.func(snapTarget)) { + target = snapTarget(relative.x, relative.y, interaction); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + for (var _i2 = 0; _i2 < state.targetFields.length; _i2++) { + var _ref2; + + _ref2 = state.targetFields[_i2]; + + var _ref3 = _ref2, + _ref4 = ___slicedToArray_40(_ref3, 2), + xField = _ref4[0], + yField = _ref4[1]; + + if (xField in target || yField in target) { + target.x = target[xField]; + target.y = target[yField]; + break; + } + } + + state.options.targets.push(target); + } + + var returnValue = _$pointer_39.snap.set(arg); + + state.options = options; + return returnValue; +} + +var __defaults_40 = { + range: Infinity, + targets: null, + offset: null, + endOnly: false, + enabled: false +}; +var snapSize = { + start: __start_40, + set: __set_40, + defaults: __defaults_40 +}; +_$size_40.snapSize = snapSize; + +var ___default_40 = (0, _$base_32.makeModifier)(snapSize, 'snapSize'); + +_$size_40["default"] = ___default_40; + +var _$edges_38 = {}; +"use strict"; + +Object.defineProperty(_$edges_38, "__esModule", { + value: true +}); +_$edges_38.snapEdges = _$edges_38["default"] = void 0; + +var ___clone_38 = ___interopRequireDefault_38(_$clone_51); + +var ___extend_38 = ___interopRequireDefault_38(_$extend_55); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$size_40 = require("./size"); */; + +function ___interopRequireDefault_38(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** + * @module modifiers/snapEdges + * + * @description + * This module allows snapping of the edges of targets during resize + * interactions. + * + * @example + * interact(target).resizable({ + * snapEdges: { + * targets: [interact.snappers.grid({ x: 100, y: 50 })], + * }, + * }) + * + * interact(target).resizable({ + * snapEdges: { + * targets: [ + * interact.snappers.grid({ + * top: 50, + * left: 50, + * bottom: 100, + * right: 100, + * }), + * ], + * }, + * }) + */ +function __start_38(arg) { + var edges = arg.edges; + + if (!edges) { + return null; + } + + arg.state.targetFields = arg.state.targetFields || [[edges.left ? 'left' : 'right', edges.top ? 'top' : 'bottom']]; + return _$size_40.snapSize.start(arg); +} + +var snapEdges = { + start: __start_38, + set: _$size_40.snapSize.set, + defaults: (0, ___extend_38["default"])((0, ___clone_38["default"])(_$size_40.snapSize.defaults), { + targets: null, + range: null, + offset: { + x: 0, + y: 0 + } + }) +}; +_$edges_38.snapEdges = snapEdges; + +var ___default_38 = (0, _$base_32.makeModifier)(snapEdges, 'snapEdges'); + +_$edges_38["default"] = ___default_38; + +var _$all_30 = {}; +"use strict"; + +Object.defineProperty(_$all_30, "__esModule", { + value: true +}); +Object.defineProperty(_$all_30, "aspectRatio", { + enumerable: true, + get: function get() { + return _aspectRatio["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictEdges", { + enumerable: true, + get: function get() { + return ___edges_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrict", { + enumerable: true, + get: function get() { + return ___pointer_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictRect", { + enumerable: true, + get: function get() { + return ___rect_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictSize", { + enumerable: true, + get: function get() { + return ___size_30["default"]; + } +}); +Object.defineProperty(_$all_30, "snapEdges", { + enumerable: true, + get: function get() { + return _edges2["default"]; + } +}); +Object.defineProperty(_$all_30, "snap", { + enumerable: true, + get: function get() { + return _pointer2["default"]; + } +}); +Object.defineProperty(_$all_30, "snapSize", { + enumerable: true, + get: function get() { + return _size2["default"]; + } +}); + +var _aspectRatio = ___interopRequireDefault_30(_$aspectRatio_31); + +var ___edges_30 = ___interopRequireDefault_30(_$edges_34); + +var ___pointer_30 = ___interopRequireDefault_30(_$pointer_35); + +var ___rect_30 = ___interopRequireDefault_30(_$rect_36); + +var ___size_30 = ___interopRequireDefault_30(_$size_37); + +var _edges2 = ___interopRequireDefault_30(_$edges_38); + +var _pointer2 = ___interopRequireDefault_30(_$pointer_39); + +var _size2 = ___interopRequireDefault_30(_$size_40); + +function ___interopRequireDefault_30(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _$grid_66 = {}; +"use strict"; + +Object.defineProperty(_$grid_66, "__esModule", { + value: true +}); +_$grid_66["default"] = void 0; + +function ___slicedToArray_66(arr, i) { return ___arrayWithHoles_66(arr) || ___iterableToArrayLimit_66(arr, i) || ___nonIterableRest_66(); } + +function ___nonIterableRest_66() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_66(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_66(arr) { if (Array.isArray(arr)) return arr; } + +function createGrid(grid) { + var coordFields = [['x', 'y'], ['left', 'top'], ['right', 'bottom'], ['width', 'height']].filter(function (_ref) { + var _ref2 = ___slicedToArray_66(_ref, 2), + xField = _ref2[0], + yField = _ref2[1]; + + return xField in grid || yField in grid; + }); + + var gridFunc = function gridFunc(x, y) { + var range = grid.range, + _grid$limits = grid.limits, + limits = _grid$limits === void 0 ? { + left: -Infinity, + right: Infinity, + top: -Infinity, + bottom: Infinity + } : _grid$limits, + _grid$offset = grid.offset, + offset = _grid$offset === void 0 ? { + x: 0, + y: 0 + } : _grid$offset; + var result = { + range: range, + grid: grid, + x: null, + y: null + }; + + for (var _i2 = 0; _i2 < coordFields.length; _i2++) { + var _ref3; + + _ref3 = coordFields[_i2]; + + var _ref4 = _ref3, + _ref5 = ___slicedToArray_66(_ref4, 2), + xField = _ref5[0], + yField = _ref5[1]; + + var gridx = Math.round((x - offset.x) / grid[xField]); + var gridy = Math.round((y - offset.y) / grid[yField]); + result[xField] = Math.max(limits.left, Math.min(limits.right, gridx * grid[xField] + offset.x)); + result[yField] = Math.max(limits.top, Math.min(limits.bottom, gridy * grid[yField] + offset.y)); + } + + return result; + }; + + gridFunc.grid = grid; + gridFunc.coordFields = coordFields; + return gridFunc; +} + +var ___default_66 = createGrid; +_$grid_66["default"] = ___default_66; + +var _$index_67 = {}; +"use strict"; + +Object.defineProperty(_$index_67, "__esModule", { + value: true +}); +Object.defineProperty(_$index_67, "grid", { + enumerable: true, + get: function get() { + return _grid["default"]; + } +}); + +var _grid = ___interopRequireDefault_67(_$grid_66); + +function ___interopRequireDefault_67(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _$index_33 = {}; +"use strict"; + +function ___typeof_33(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_33 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_33 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_33(obj); } + +Object.defineProperty(_$index_33, "__esModule", { + value: true +}); +_$index_33["default"] = void 0; + +var ___base_33 = ___interopRequireDefault_33(_$base_32); + +var all = ___interopRequireWildcard_33(_$all_30); + +var ___extend_33 = ___interopRequireDefault_33(_$extend_55); + +var snappers = ___interopRequireWildcard_33(_$index_67); + +function ___getRequireWildcardCache_33() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_33 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_33(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_33(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_33(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_33(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __modifiers_33 = { + id: 'modifiers', + install: function install(scope) { + var interact = scope.interact; + scope.usePlugin(___base_33["default"]); + interact.modifiers = (0, ___extend_33["default"])(interact.modifiers || {}, all); + interact.snappers = (0, ___extend_33["default"])(interact.snappers || {}, snappers); + interact.createSnapGrid = interact.snappers.grid; // for backwrads compatibility + + for (var type in all) { + var _all = all[type], + _defaults = _all._defaults, + _methods = _all._methods; + _defaults._methods = _methods; + scope.defaults.perAction[type] = _defaults; + } + } +}; +var ___default_33 = __modifiers_33; +_$index_33["default"] = ___default_33; + +var _$PointerEvent_42 = {}; +"use strict"; + +Object.defineProperty(_$PointerEvent_42, "__esModule", { + value: true +}); +_$PointerEvent_42.PointerEvent = _$PointerEvent_42["default"] = void 0; + +var ___BaseEvent2_42 = ___interopRequireDefault_42(_$BaseEvent_13); + +var __pointerUtils_42 = ___interopRequireWildcard_42(_$pointerUtils_63); + +function ___getRequireWildcardCache_42() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_42 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_42(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_42(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_42(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_42(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_42(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_42 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_42 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_42(obj); } + +function ___classCallCheck_42(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_42(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_42(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_42(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_42(Constructor, staticProps); return Constructor; } + +function ___possibleConstructorReturn_42(self, call) { if (call && (___typeof_42(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_42(self); } + +function ___getPrototypeOf_42(o) { ___getPrototypeOf_42 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_42(o); } + +function ___assertThisInitialized_42(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ___inherits_42(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_42(subClass, superClass); } + +function ___setPrototypeOf_42(o, p) { ___setPrototypeOf_42 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_42(o, p); } + +function ___defineProperty_42(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var PointerEvent = /*#__PURE__*/function (_BaseEvent) { + ___inherits_42(PointerEvent, _BaseEvent); + + /** */ + function PointerEvent(type, pointer, event, eventTarget, interaction, timeStamp) { + var _this; + + ___classCallCheck_42(this, PointerEvent); + + _this = ___possibleConstructorReturn_42(this, ___getPrototypeOf_42(PointerEvent).call(this, interaction)); + + ___defineProperty_42(___assertThisInitialized_42(_this), "type", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "originalEvent", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pointerId", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pointerType", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "double", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pageX", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pageY", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "clientX", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "clientY", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "dt", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "eventable", void 0); + + __pointerUtils_42.pointerExtend(___assertThisInitialized_42(_this), event); + + if (event !== pointer) { + __pointerUtils_42.pointerExtend(___assertThisInitialized_42(_this), pointer); + } + + _this.timeStamp = timeStamp; + _this.originalEvent = event; + _this.type = type; + _this.pointerId = __pointerUtils_42.getPointerId(pointer); + _this.pointerType = __pointerUtils_42.getPointerType(pointer); + _this.target = eventTarget; + _this.currentTarget = null; + + if (type === 'tap') { + var pointerIndex = interaction.getPointerIndex(pointer); + _this.dt = _this.timeStamp - interaction.pointers[pointerIndex].downTime; + var interval = _this.timeStamp - interaction.tapTime; + _this["double"] = !!(interaction.prevTap && interaction.prevTap.type !== 'doubletap' && interaction.prevTap.target === _this.target && interval < 500); + } else if (type === 'doubletap') { + _this.dt = pointer.timeStamp - interaction.tapTime; + } + + return _this; + } + + ___createClass_42(PointerEvent, [{ + key: "_subtractOrigin", + value: function _subtractOrigin(_ref) { + var originX = _ref.x, + originY = _ref.y; + this.pageX -= originX; + this.pageY -= originY; + this.clientX -= originX; + this.clientY -= originY; + return this; + } + }, { + key: "_addOrigin", + value: function _addOrigin(_ref2) { + var originX = _ref2.x, + originY = _ref2.y; + this.pageX += originX; + this.pageY += originY; + this.clientX += originX; + this.clientY += originY; + return this; + } + /** + * Prevent the default behaviour of the original Event + */ + + }, { + key: "preventDefault", + value: function preventDefault() { + this.originalEvent.preventDefault(); + } + }]); + + return PointerEvent; +}(___BaseEvent2_42["default"]); + +_$PointerEvent_42.PointerEvent = _$PointerEvent_42["default"] = PointerEvent; + +var _$base_43 = {}; +"use strict"; + +function ___typeof_43(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_43 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_43 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_43(obj); } + +Object.defineProperty(_$base_43, "__esModule", { + value: true +}); +_$base_43["default"] = void 0; + +var ___Interaction_43 = ___interopRequireDefault_43(_$Interaction_18); + +var ___scope_43 = _$scope_24({}); + +var __utils_43 = ___interopRequireWildcard_43(_$index_58); + +var _PointerEvent = ___interopRequireDefault_43(_$PointerEvent_42); + +function ___getRequireWildcardCache_43() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_43 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_43(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_43(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_43(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_43(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __defaults_43 = { + holdDuration: 600, + ignoreFrom: null, + allowFrom: null, + origin: { + x: 0, + y: 0 + } +}; +var pointerEvents = { + id: 'pointer-events/base', + install: __install_43, + listeners: { + 'interactions:new': addInteractionProps, + 'interactions:update-pointer': addHoldInfo, + 'interactions:move': moveAndClearHold, + 'interactions:down': function interactionsDown(arg, scope) { + downAndStartHold(arg, scope); + fire(arg, scope); + }, + 'interactions:up': function interactionsUp(arg, scope) { + clearHold(arg); + fire(arg, scope); + tapAfterUp(arg, scope); + }, + 'interactions:cancel': function interactionsCancel(arg, scope) { + clearHold(arg); + fire(arg, scope); + } + }, + PointerEvent: _PointerEvent["default"], + fire: fire, + collectEventTargets: collectEventTargets, + defaults: __defaults_43, + types: { + down: true, + move: true, + up: true, + cancel: true, + tap: true, + doubletap: true, + hold: true + } +}; + +function fire(arg, scope) { + var interaction = arg.interaction, + pointer = arg.pointer, + event = arg.event, + eventTarget = arg.eventTarget, + type = arg.type, + _arg$targets = arg.targets, + targets = _arg$targets === void 0 ? collectEventTargets(arg, scope) : _arg$targets; + var pointerEvent = new _PointerEvent["default"](type, pointer, event, eventTarget, interaction, scope.now()); + scope.fire('pointerEvents:new', { + pointerEvent: pointerEvent + }); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + targets: targets, + type: type, + pointerEvent: pointerEvent + }; + + for (var i = 0; i < targets.length; i++) { + var target = targets[i]; + + for (var prop in target.props || {}) { + pointerEvent[prop] = target.props[prop]; + } + + var origin = __utils_43.getOriginXY(target.eventable, target.node); + + pointerEvent._subtractOrigin(origin); + + pointerEvent.eventable = target.eventable; + pointerEvent.currentTarget = target.node; + target.eventable.fire(pointerEvent); + + pointerEvent._addOrigin(origin); + + if (pointerEvent.immediatePropagationStopped || pointerEvent.propagationStopped && i + 1 < targets.length && targets[i + 1].node !== pointerEvent.currentTarget) { + break; + } + } + + scope.fire('pointerEvents:fired', signalArg); + + if (type === 'tap') { + // if pointerEvent should make a double tap, create and fire a doubletap + // PointerEvent and use that as the prevTap + var prevTap = pointerEvent["double"] ? fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'doubletap' + }, scope) : pointerEvent; + interaction.prevTap = prevTap; + interaction.tapTime = prevTap.timeStamp; + } + + return pointerEvent; +} + +function collectEventTargets(_ref, scope) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget, + type = _ref.type; + var pointerIndex = interaction.getPointerIndex(pointer); + var pointerInfo = interaction.pointers[pointerIndex]; // do not fire a tap event if the pointer was moved before being lifted + + if (type === 'tap' && (interaction.pointerWasMoved || // or if the pointerup target is different to the pointerdown target + !(pointerInfo && pointerInfo.downTarget === eventTarget))) { + return []; + } + + var path = __utils_43.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: type, + path: path, + targets: [], + node: null + }; + + for (var _i = 0; _i < path.length; _i++) { + var _ref2; + + _ref2 = path[_i]; + var node = _ref2; + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (type === 'hold') { + signalArg.targets = signalArg.targets.filter(function (target) { + return target.eventable.options.holdDuration === interaction.pointers[pointerIndex].hold.duration; + }); + } + + return signalArg.targets; +} + +function addInteractionProps(_ref3) { + var interaction = _ref3.interaction; + interaction.prevTap = null; // the most recent tap event on this interaction + + interaction.tapTime = 0; // time of the most recent tap event +} + +function addHoldInfo(_ref4) { + var down = _ref4.down, + pointerInfo = _ref4.pointerInfo; + + if (!down && pointerInfo.hold) { + return; + } + + pointerInfo.hold = { + duration: Infinity, + timeout: null + }; +} + +function clearHold(_ref5) { + var interaction = _ref5.interaction, + pointerIndex = _ref5.pointerIndex; + + if (interaction.pointers[pointerIndex].hold) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } +} + +function moveAndClearHold(_ref6, scope) { + var interaction = _ref6.interaction, + pointer = _ref6.pointer, + event = _ref6.event, + eventTarget = _ref6.eventTarget, + duplicate = _ref6.duplicate; + var pointerIndex = interaction.getPointerIndex(pointer); + + if (!duplicate && (!interaction.pointerIsDown || interaction.pointerWasMoved)) { + if (interaction.pointerIsDown) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } + + fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'move' + }, scope); + } +} + +function downAndStartHold(_ref7, scope) { + var interaction = _ref7.interaction, + pointer = _ref7.pointer, + event = _ref7.event, + eventTarget = _ref7.eventTarget, + pointerIndex = _ref7.pointerIndex; + var timer = interaction.pointers[pointerIndex].hold; + var path = __utils_43.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'hold', + targets: [], + path: path, + node: null + }; + + for (var _i2 = 0; _i2 < path.length; _i2++) { + var _ref8; + + _ref8 = path[_i2]; + var node = _ref8; + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (!signalArg.targets.length) { + return; + } + + var minDuration = Infinity; + + for (var _i3 = 0; _i3 < signalArg.targets.length; _i3++) { + var _ref9; + + _ref9 = signalArg.targets[_i3]; + var target = _ref9; + var holdDuration = target.eventable.options.holdDuration; + + if (holdDuration < minDuration) { + minDuration = holdDuration; + } + } + + timer.duration = minDuration; + timer.timeout = setTimeout(function () { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'hold' + }, scope); + }, minDuration); +} + +function tapAfterUp(_ref10, scope) { + var interaction = _ref10.interaction, + pointer = _ref10.pointer, + event = _ref10.event, + eventTarget = _ref10.eventTarget; + + if (!interaction.pointerWasMoved) { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'tap' + }, scope); + } +} + +function __install_43(scope) { + scope.pointerEvents = pointerEvents; + scope.defaults.actions.pointerEvents = pointerEvents.defaults; + __utils_43.extend(scope.actions.phaselessTypes, pointerEvents.types); +} + +var ___default_43 = pointerEvents; +_$base_43["default"] = ___default_43; + +var _$holdRepeat_44 = {}; +"use strict"; + +Object.defineProperty(_$holdRepeat_44, "__esModule", { + value: true +}); +_$holdRepeat_44["default"] = void 0; + +var ___base_44 = ___interopRequireDefault_44(_$base_43); + +var ___PointerEvent_44 = ___interopRequireDefault_44(_$PointerEvent_42); + +function ___interopRequireDefault_44(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_44(scope) { + scope.usePlugin(___base_44["default"]); + var pointerEvents = scope.pointerEvents; // don't repeat by default + + pointerEvents.defaults.holdRepeatInterval = 0; + pointerEvents.types.holdrepeat = scope.actions.phaselessTypes.holdrepeat = true; +} + +function onNew(_ref) { + var pointerEvent = _ref.pointerEvent; + + if (pointerEvent.type !== 'hold') { + return; + } + + pointerEvent.count = (pointerEvent.count || 0) + 1; +} + +function onFired(_ref2, scope) { + var interaction = _ref2.interaction, + pointerEvent = _ref2.pointerEvent, + eventTarget = _ref2.eventTarget, + targets = _ref2.targets; + + if (pointerEvent.type !== 'hold' || !targets.length) { + return; + } // get the repeat interval from the first eventable + + + var interval = targets[0].eventable.options.holdRepeatInterval; // don't repeat if the interval is 0 or less + + if (interval <= 0) { + return; + } // set a timeout to fire the holdrepeat event + + + interaction.holdIntervalHandle = setTimeout(function () { + scope.pointerEvents.fire({ + interaction: interaction, + eventTarget: eventTarget, + type: 'hold', + pointer: pointerEvent, + event: pointerEvent + }, scope); + }, interval); +} + +function endHoldRepeat(_ref3) { + var interaction = _ref3.interaction; + + // set the interaction's holdStopTime property + // to stop further holdRepeat events + if (interaction.holdIntervalHandle) { + clearInterval(interaction.holdIntervalHandle); + interaction.holdIntervalHandle = null; + } +} + +var holdRepeat = { + id: 'pointer-events/holdRepeat', + install: __install_44, + listeners: ['move', 'up', 'cancel', 'endall'].reduce(function (acc, enderTypes) { + acc["pointerEvents:".concat(enderTypes)] = endHoldRepeat; + return acc; + }, { + 'pointerEvents:new': onNew, + 'pointerEvents:fired': onFired + }) +}; +var ___default_44 = holdRepeat; +_$holdRepeat_44["default"] = ___default_44; + +var _$interactableTargets_46 = {}; +"use strict"; + +Object.defineProperty(_$interactableTargets_46, "__esModule", { + value: true +}); +_$interactableTargets_46["default"] = void 0; + +var ___extend_46 = ___interopRequireDefault_46(_$extend_55); + +function ___interopRequireDefault_46(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_46(scope) { + var Interactable = scope.Interactable; + Interactable.prototype.pointerEvents = pointerEventsMethod; + var __backCompatOption = Interactable.prototype._backCompatOption; + + Interactable.prototype._backCompatOption = function (optionName, newValue) { + var ret = __backCompatOption.call(this, optionName, newValue); + + if (ret === this) { + this.events.options[optionName] = newValue; + } + + return ret; + }; +} + +function pointerEventsMethod(options) { + (0, ___extend_46["default"])(this.events.options, options); + return this; +} + +var plugin = { + id: 'pointer-events/interactableTargets', + install: __install_46, + listeners: { + 'pointerEvents:collect-targets': function pointerEventsCollectTargets(_ref, scope) { + var targets = _ref.targets, + node = _ref.node, + type = _ref.type, + eventTarget = _ref.eventTarget; + scope.interactables.forEachMatch(node, function (interactable) { + var eventable = interactable.events; + var options = eventable.options; + + if (eventable.types[type] && eventable.types[type].length && interactable.testIgnoreAllow(options, node, eventTarget)) { + targets.push({ + node: node, + eventable: eventable, + props: { + interactable: interactable + } + }); + } + }); + }, + 'interactable:new': function interactableNew(_ref2) { + var interactable = _ref2.interactable; + + interactable.events.getRect = function (element) { + return interactable.getRect(element); + }; + }, + 'interactable:set': function interactableSet(_ref3, scope) { + var interactable = _ref3.interactable, + options = _ref3.options; + (0, ___extend_46["default"])(interactable.events.options, scope.pointerEvents.defaults); + (0, ___extend_46["default"])(interactable.events.options, options.pointerEvents || {}); + } + } +}; +var ___default_46 = plugin; +_$interactableTargets_46["default"] = ___default_46; + +var _$index_45 = {}; +"use strict"; + +function ___typeof_45(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_45 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_45 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_45(obj); } + +Object.defineProperty(_$index_45, "__esModule", { + value: true +}); +Object.defineProperty(_$index_45, "holdRepeat", { + enumerable: true, + get: function get() { + return _holdRepeat["default"]; + } +}); +Object.defineProperty(_$index_45, "interactableTargets", { + enumerable: true, + get: function get() { + return _interactableTargets["default"]; + } +}); +_$index_45.pointerEvents = _$index_45["default"] = void 0; + +var __pointerEvents_45 = ___interopRequireWildcard_45(_$base_43); + +_$index_45.pointerEvents = __pointerEvents_45; + +var _holdRepeat = ___interopRequireDefault_45(_$holdRepeat_44); + +var _interactableTargets = ___interopRequireDefault_45(_$interactableTargets_46); + +function ___interopRequireDefault_45(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_45() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_45 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_45(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_45(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_45(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +var ___default_45 = { + id: 'pointer-events', + install: function install(scope) { + scope.usePlugin(__pointerEvents_45); + scope.usePlugin(_holdRepeat["default"]); + scope.usePlugin(_interactableTargets["default"]); + } +}; +_$index_45["default"] = ___default_45; + +var _$index_47 = {}; +"use strict"; + +Object.defineProperty(_$index_47, "__esModule", { + value: true +}); +_$index_47.install = __install_47; +_$index_47["default"] = void 0; + +var ___Interactable_47 = ___interopRequireDefault_47(_$Interactable_16({})); + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +/* removed: var _$index_58 = require("@interactjs/utils/index"); */; + +function ___interopRequireDefault_47(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_47(scope) { + var Interactable = scope.Interactable; + scope.actions.phases.reflow = true; + /** + * ```js + * const interactable = interact(target) + * const drag = { name: drag, axis: 'x' } + * const resize = { name: resize, edges: { left: true, bottom: true } + * + * interactable.reflow(drag) + * interactable.reflow(resize) + * ``` + * + * Start an action sequence to re-apply modifiers, check drops, etc. + * + * @param { Object } action The action to begin + * @param { string } action.name The name of the action + * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended + */ + + Interactable.prototype.reflow = function (action) { + return reflow(this, action, scope); + }; +} + +function reflow(interactable, action, scope) { + var elements = _$index_58.is.string(interactable.target) ? _$index_58.arr.from(interactable._context.querySelectorAll(interactable.target)) : [interactable.target]; // tslint:disable-next-line variable-name + + var Promise = _$index_58.win.window.Promise; + var promises = Promise ? [] : null; + + var _loop = function _loop() { + _ref = elements[_i]; + var element = _ref; + var rect = interactable.getRect(element); + + if (!rect) { + return "break"; + } + + var runningInteraction = _$index_58.arr.find(scope.interactions.list, function (interaction) { + return interaction.interacting() && interaction.interactable === interactable && interaction.element === element && interaction.prepared.name === action.name; + }); + + var reflowPromise = void 0; + + if (runningInteraction) { + runningInteraction.move(); + + if (promises) { + reflowPromise = runningInteraction._reflowPromise || new Promise(function (resolve) { + runningInteraction._reflowResolve = resolve; + }); + } + } else { + var xywh = _$index_58.rect.tlbrToXywh(rect); + + var coords = { + page: { + x: xywh.x, + y: xywh.y + }, + client: { + x: xywh.x, + y: xywh.y + }, + timeStamp: scope.now() + }; + + var event = _$index_58.pointer.coordsToEvent(coords); + + reflowPromise = startReflow(scope, interactable, element, action, event); + } + + if (promises) { + promises.push(reflowPromise); + } + }; + + for (var _i = 0; _i < elements.length; _i++) { + var _ref; + + var _ret = _loop(); + + if (_ret === "break") break; + } + + return promises && Promise.all(promises).then(function () { + return interactable; + }); +} + +function startReflow(scope, interactable, element, action, event) { + var interaction = scope.interactions["new"]({ + pointerType: 'reflow' + }); + var signalArg = { + interaction: interaction, + event: event, + pointer: event, + eventTarget: element, + phase: 'reflow' + }; + interaction.interactable = interactable; + interaction.element = element; + interaction.prepared = (0, _$index_58.extend)({}, action); + interaction.prevEvent = event; + interaction.updatePointer(event, event, element, true); + + interaction._doPhase(signalArg); + + var reflowPromise = _$index_58.win.window.Promise ? new _$index_58.win.window.Promise(function (resolve) { + interaction._reflowResolve = resolve; + }) : null; + interaction._reflowPromise = reflowPromise; + interaction.start(action, interactable, element); + + if (interaction._interacting) { + interaction.move(signalArg); + interaction.end(event); + } else { + interaction.stop(); + } + + interaction.removePointer(event, event); + interaction.pointerIsDown = false; + return reflowPromise; +} + +var ___default_47 = { + id: 'reflow', + install: __install_47, + listeners: { + // remove completed reflow interactions + 'interactions:stop': function interactionsStop(_ref2, scope) { + var interaction = _ref2.interaction; + + if (interaction.pointerType === 'reflow') { + if (interaction._reflowResolve) { + interaction._reflowResolve(); + } + + _$index_58.arr.remove(scope.interactions.list, interaction); + } + } + } +}; +_$index_47["default"] = ___default_47; + +var _$index_27 = {}; +"use strict"; + +function ___typeof_27(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_27 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_27 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_27(obj); } + +Object.defineProperty(_$index_27, "__esModule", { + value: true +}); +_$index_27.init = __init_27; +_$index_27["default"] = _$index_27.scope = _$index_27.interact = void 0; + +_$index_48; + +var ___scope_27 = _$scope_24({}); + +var ___browser_27 = ___interopRequireDefault_27(_$browser_50); + +var ___events_27 = ___interopRequireDefault_27(_$events_54); + +var __utils_27 = ___interopRequireWildcard_27(_$index_58); + +function ___getRequireWildcardCache_27() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_27 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_27(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_27(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_27(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_27(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** @module interact */ +var globalEvents = {}; +var scope = new ___scope_27.Scope(); +_$index_27.scope = scope; + +function __init_27(win) { + scope.init(win); + return interact; +} +/** + * ```js + * interact('#draggable').draggable(true) + * + * var rectables = interact('rect') + * rectables + * .gesturable(true) + * .on('gesturemove', function (event) { + * // ... + * }) + * ``` + * + * The methods of this variable can be used to set elements as interactables + * and also to change various default settings. + * + * Calling it as a function and passing an element or a valid CSS selector + * string returns an Interactable object which has various methods to configure + * it. + * + * @global + * + * @param {Element | string} target The HTML or SVG Element to interact with + * or CSS selector + * @return {Interactable} + */ + + +var interact = function interact(target, options) { + var interactable = scope.interactables.get(target, options); + + if (!interactable) { + interactable = scope.interactables["new"](target, options); + interactable.events.global = globalEvents; + } + + return interactable; +}; +/** + * Use a plugin + * + * @alias module:interact.use + * + * @param {Object} plugin + * @param {function} plugin.install + * @return {interact} + */ + + +_$index_27.interact = interact; +interact.use = use; + +function use(plugin, options) { + scope.usePlugin(plugin, options); + return interact; +} +/** + * Check if an element or selector has been set with the {@link interact} + * function + * + * @alias module:interact.isSet + * + * @param {Element} element The Element being searched for + * @return {boolean} Indicates if the element or CSS selector was previously + * passed to interact + */ + + +interact.isSet = isSet; + +function isSet(target, options) { + return !!scope.interactables.get(target, options && options.context); +} +/** + * Add a global listener for an InteractEvent or adds a DOM event to `document` + * + * @alias module:interact.on + * + * @param {string | array | object} type The types of events to listen for + * @param {function} listener The function event (s) + * @param {object | boolean} [options] object or useCapture flag for + * addEventListener + * @return {object} interact + */ + + +interact.on = on; + +function on(type, listener, options) { + if (__utils_27.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_27.is.array(type)) { + for (var _i = 0; _i < type.length; _i++) { + var _ref; + + _ref = type[_i]; + var eventType = _ref; + interact.on(eventType, listener, options); + } + + return interact; + } + + if (__utils_27.is.object(type)) { + for (var prop in type) { + interact.on(prop, type[prop], listener); + } + + return interact; + } // if it is an InteractEvent type, add listener to globalEvents + + + if ((0, ___scope_27.isNonNativeEvent)(type, scope.actions)) { + // if this type of event was never bound + if (!globalEvents[type]) { + globalEvents[type] = [listener]; + } else { + globalEvents[type].push(listener); + } + } // If non InteractEvent type, addEventListener to document + else { + ___events_27["default"].add(scope.document, type, listener, { + options: options + }); + } + + return interact; +} +/** + * Removes a global InteractEvent listener or DOM event from `document` + * + * @alias module:interact.off + * + * @param {string | array | object} type The types of events that were listened + * for + * @param {function} listener The listener function to be removed + * @param {object | boolean} options [options] object or useCapture flag for + * removeEventListener + * @return {object} interact + */ + + +interact.off = off; + +function off(type, listener, options) { + if (__utils_27.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_27.is.array(type)) { + for (var _i2 = 0; _i2 < type.length; _i2++) { + var _ref2; + + _ref2 = type[_i2]; + var eventType = _ref2; + interact.off(eventType, listener, options); + } + + return interact; + } + + if (__utils_27.is.object(type)) { + for (var prop in type) { + interact.off(prop, type[prop], listener); + } + + return interact; + } + + if ((0, ___scope_27.isNonNativeEvent)(type, scope.actions)) { + var index; + + if (type in globalEvents && (index = globalEvents[type].indexOf(listener)) !== -1) { + globalEvents[type].splice(index, 1); + } + } else { + ___events_27["default"].remove(scope.document, type, listener, options); + } + + return interact; +} + +interact.debug = debug; + +function debug() { + return scope; +} // expose the functions used to calculate multi-touch properties + + +interact.getPointerAverage = __utils_27.pointer.pointerAverage; +interact.getTouchBBox = __utils_27.pointer.touchBBox; +interact.getTouchDistance = __utils_27.pointer.touchDistance; +interact.getTouchAngle = __utils_27.pointer.touchAngle; +interact.getElementRect = __utils_27.dom.getElementRect; +interact.getElementClientRect = __utils_27.dom.getElementClientRect; +interact.matchesSelector = __utils_27.dom.matchesSelector; +interact.closest = __utils_27.dom.closest; +/** + * @alias module:interact.supportsTouch + * + * @return {boolean} Whether or not the browser supports touch input + */ + +interact.supportsTouch = supportsTouch; + +function supportsTouch() { + return ___browser_27["default"].supportsTouch; +} +/** + * @alias module:interact.supportsPointerEvent + * + * @return {boolean} Whether or not the browser supports PointerEvents + */ + + +interact.supportsPointerEvent = supportsPointerEvent; + +function supportsPointerEvent() { + return ___browser_27["default"].supportsPointerEvent; +} +/** + * Cancels all interactions (end events are not fired) + * + * @alias module:interact.stop + * + * @return {object} interact + */ + + +interact.stop = __stop_27; + +function __stop_27() { + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref3; + + _ref3 = scope.interactions.list[_i3]; + var interaction = _ref3; + interaction.stop(); + } + + return interact; +} +/** + * Returns or sets the distance the pointer must be moved before an action + * sequence occurs. This also affects tolerance for tap events. + * + * @alias module:interact.pointerMoveTolerance + * + * @param {number} [newValue] The movement from the start position must be greater than this value + * @return {interact | number} + */ + + +interact.pointerMoveTolerance = pointerMoveTolerance; + +function pointerMoveTolerance(newValue) { + if (__utils_27.is.number(newValue)) { + scope.interactions.pointerMoveTolerance = newValue; + return interact; + } + + return scope.interactions.pointerMoveTolerance; +} + +interact.addDocument = function (doc, options) { + return scope.addDocument(doc, options); +}; + +interact.removeDocument = function (doc) { + return scope.removeDocument(doc); +}; // eslint-disable-next-line no-undef + + +interact.version = "1.9.4"; +scope.interact = interact; +var ___default_27 = interact; +_$index_27["default"] = ___default_27; + +var _$index_28 = {}; +"use strict"; + +Object.defineProperty(_$index_28, "__esModule", { + value: true +}); +_$index_28.init = __init_28; +_$index_28["default"] = void 0; + +_$index_48; + +var _index2 = ___interopRequireDefault_28(_$index_5); + +var _index3 = ___interopRequireDefault_28(_$index_7); + +var _index4 = ___interopRequireDefault_28(_$index_12); + +var _index5 = ___interopRequireDefault_28(_$index_25); + +var _index6 = ___interopRequireDefault_28(_$index_26); + +var _index7 = ___interopRequireDefault_28(_$index_33); + +var _offset = ___interopRequireDefault_28(_$index_41); + +var _index8 = ___interopRequireDefault_28(_$index_45); + +var _index9 = ___interopRequireDefault_28(_$index_47); + +var _index10 = ___interopRequireWildcard_28(_$index_27); + +function ___getRequireWildcardCache_28() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_28 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_28(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_28(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_28(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_28(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_28(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_28 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_28 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_28(obj); } + +if ((typeof window === "undefined" ? "undefined" : ___typeof_28(window)) === 'object' && !!window) { + __init_28(window); +} + +var ___default_28 = _index10["default"]; +_$index_28["default"] = ___default_28; + +function __init_28(win) { + (0, _index10.init)(win); + + _index10["default"].use(_offset["default"]); // pointerEvents + + + _index10["default"].use(_index8["default"]); // inertia + + + _index10["default"].use(_index6["default"]); // snap, resize, etc. + + + _index10["default"].use(_index7["default"]); // autoStart, hold + + + _index10["default"].use(_index4["default"]); // drag and drop, resize, gesture + + + _index10["default"].use(_index2["default"]); // autoScroll + + + _index10["default"].use(_index3["default"]); // reflow + + + _index10["default"].use(_index9["default"]); // eslint-disable-next-line no-undef + + + if ("production" !== 'production') { + _index10["default"].use(_index5["default"]); + } + + return _index10["default"]; +} + +var _$index_69 = { exports: {} }; +"use strict"; + +Object.defineProperty(_$index_69.exports, "__esModule", { + value: true +}); +Object.defineProperty(_$index_69.exports, "init", { + enumerable: true, + get: function get() { + return ___index_69.init; + } +}); +_$index_69.exports["default"] = void 0; + +var ___index_69 = ___interopRequireWildcard_69(_$index_28); + +function ___getRequireWildcardCache_69() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_69 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_69(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_69(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_69(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___typeof_69(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_69 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_69 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_69(obj); } + +if (("object" === "undefined" ? "undefined" : ___typeof_69(_$index_69)) === 'object' && !!_$index_69) { + try { + _$index_69.exports = ___index_69["default"]; + } catch (_unused) {} +} + +___index_69["default"]["default"] = ___index_69["default"]; +___index_69["default"].init = ___index_69.init; +var ___default_69 = ___index_69["default"]; +_$index_69.exports["default"] = ___default_69; + +_$index_69 = _$index_69.exports +return _$index_69; + +}); + +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2stZmxhdC9fcHJlbHVkZSIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9zY29wZS50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvaW50ZXJhY3Rpb25zLnRzIiwiLi4vQGludGVyYWN0anMvdHlwZXMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9pc1dpbmRvdy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL3dpbmRvdy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2lzLnRzIiwiLi4vQGludGVyYWN0anMvYWN0aW9ucy9kcmFnLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvYXJyLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZG9tT2JqZWN0cy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2Jyb3dzZXIudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9jbG9uZS50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvcG9pbnRlckV4dGVuZC50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2h5cG90LnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvcG9pbnRlclV0aWxzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZXZlbnRzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvbm9ybWFsaXplTGlzdGVuZXJzLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9FdmVudGFibGUudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9yZWN0LnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZ2V0T3JpZ2luWFkudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9yYWYudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMudHMiLCIuLi9AaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZVNldC50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvQmFzZUV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9Qb2ludGVySW5mby50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24udHMiLCIuLi9AaW50ZXJhY3Rqcy9jb3JlL2ludGVyYWN0aW9uRmluZGVyLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9pbnRlcmFjdGFibGVQcmV2ZW50RGVmYXVsdC50cyIsIi4uL0BpbnRlcmFjdGpzL2FjdGlvbnMvZHJvcC9Ecm9wRXZlbnQudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL2Ryb3AvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL2dlc3R1cmUudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL3Jlc2l6ZS50cyIsIi4uL0BpbnRlcmFjdGpzL2FjdGlvbnMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXNjcm9sbC9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvSW50ZXJhY3RhYmxlTWV0aG9kcy50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvYmFzZS50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvZHJhZ0F4aXMudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXN0YXJ0L2hvbGQudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXN0YXJ0L2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvZGV2LXRvb2xzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL01vZGlmaWNhdGlvbi50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9iYXNlLnRzIiwiLi4vQGludGVyYWN0anMvb2Zmc2V0L2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvaW5lcnRpYS9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9hc3BlY3RSYXRpby50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9yZXN0cmljdC9wb2ludGVyLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3Jlc3RyaWN0L2VkZ2VzLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3Jlc3RyaWN0L3JlY3QudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvcmVzdHJpY3Qvc2l6ZS50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9zbmFwL3BvaW50ZXIudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvc25hcC9zaXplLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3NuYXAvZWRnZXMudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvYWxsLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvc25hcHBlcnMvZ3JpZC50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL3NuYXBwZXJzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvUG9pbnRlckV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvYmFzZS50cyIsIi4uL0BpbnRlcmFjdGpzL3BvaW50ZXItZXZlbnRzL2hvbGRSZXBlYXQudHMiLCIuLi9AaW50ZXJhY3Rqcy9wb2ludGVyLWV2ZW50cy9pbnRlcmFjdGFibGVUYXJnZXRzLnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9yZWZsb3cvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9pbnRlcmFjdC9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2ludGVyYWN0anMvaW5kZXgudHMiLCJpbmRleC50cyIsIi4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2stZmxh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QSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsZUFBQSxFQXhDb0IsSUF3Q3BCLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsU0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsU0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxVQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLE9BQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLElBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxJQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxVQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsVUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxPQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsT0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFdBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxXQUFBLEVBQUEsS0FBQSxD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QUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7Ozs7Ozs7QUFFQSxJQUFJLENBQUEsUUFBQSxLQUFBLFdBQUEsR0FBQSxXQUFBLEdBQUEsWUFBQSxDQUFPLFVBQVAsQ0FBQSxNQUFrQixRQUFsQixJQUE4QixDQUFDLENBQUMsVUFBcEMsRUFBNEM7RUFDMUMsSUFBSTtJQUFFLGtCQUFBLEdBQWlCLFdBQUEsQ0FBQSxTQUFBLENBQWpCLENBQUE7R0FBTixDQUNBLE9BQUEsT0FBQSxFQUFNLEVBQUU7Q0FDVDs7QUFFQSxXQUFBLENBQUEsU0FBQSxDQUFELENBQUEsU0FBQSxDQUFBLEdBQTRCLFdBQUEsQ0FBQSxTQUFBLENBQTVCLENBQUE7QUFDRSxXQUFBLENBQUEsU0FBQSxDQUFELENBQWtCLElBQWxCLEdBQXlCLFdBQUEsQ0FBQSxJQUF6QixDQUFBO29CQUVjLFdBQUEsQ0FBQSxTQUFBOzs7QUNWZjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5pbnRlcmFjdCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7XG52YXIgY3JlYXRlTW9kdWxlRmFjdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZU1vZHVsZUZhY3RvcnkodCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBlfHx0KGU9e2V4cG9ydHM6e30scGFyZW50OnJ9LGUuZXhwb3J0cyksZS5leHBvcnRzfX07XG4iLCJpbXBvcnQgKiBhcyBhcnIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYXJyJ1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcidcbmltcG9ydCBjbG9uZSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9jbG9uZSdcbmltcG9ydCB7IGdldEVsZW1lbnRSZWN0LCBtYXRjaGVzVXBUbywgbm9kZUNvbnRhaW5zLCB0cnlTZWxlY3RvciB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV2ZW50cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ldmVudHMnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IG5vcm1hbGl6ZUxpc3RlbmVycyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ub3JtYWxpemVMaXN0ZW5lcnMnXG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy93aW5kb3cnXG5pbXBvcnQgeyBBY3Rpb25EZWZhdWx0cywgRGVmYXVsdHMsIE9wdGlvbnMgfSBmcm9tICcuL2RlZmF1bHRPcHRpb25zJ1xuaW1wb3J0IEV2ZW50YWJsZSBmcm9tICcuL0V2ZW50YWJsZSdcbmltcG9ydCB7IEFjdGlvbnMsIGlzTm9uTmF0aXZlRXZlbnQgfSBmcm9tICcuL3Njb3BlJ1xuXG50eXBlIElnbm9yZVZhbHVlID0gc3RyaW5nIHwgSW50ZXJhY3QuRWxlbWVudCB8IGJvb2xlYW5cblxuLyoqICovXG5leHBvcnQgY2xhc3MgSW50ZXJhY3RhYmxlIGltcGxlbWVudHMgUGFydGlhbDxFdmVudGFibGU+IHtcbiAgcHJvdGVjdGVkIGdldCBfZGVmYXVsdHMgKCk6IERlZmF1bHRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmFzZToge30sXG4gICAgICBwZXJBY3Rpb246IHt9LFxuICAgICAgYWN0aW9uczoge30gYXMgQWN0aW9uRGVmYXVsdHMsXG4gICAgfVxuICB9XG5cbiAgcmVhZG9ubHkgb3B0aW9ucyE6IFJlcXVpcmVkPE9wdGlvbnM+XG4gIHJlYWRvbmx5IF9hY3Rpb25zOiBBY3Rpb25zXG4gIHJlYWRvbmx5IHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0XG4gIHJlYWRvbmx5IGV2ZW50cyA9IG5ldyBFdmVudGFibGUoKVxuICByZWFkb25seSBfY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50XG4gIHJlYWRvbmx5IF93aW46IFdpbmRvd1xuICByZWFkb25seSBfZG9jOiBEb2N1bWVudFxuXG4gIC8qKiAqL1xuICBjb25zdHJ1Y3RvciAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM6IGFueSwgZGVmYXVsdENvbnRleHQ6IERvY3VtZW50IHwgSW50ZXJhY3QuRWxlbWVudCkge1xuICAgIHRoaXMuX2FjdGlvbnMgPSBvcHRpb25zLmFjdGlvbnNcbiAgICB0aGlzLnRhcmdldCAgID0gdGFyZ2V0XG4gICAgdGhpcy5fY29udGV4dCA9IG9wdGlvbnMuY29udGV4dCB8fCBkZWZhdWx0Q29udGV4dFxuICAgIHRoaXMuX3dpbiAgICAgPSBnZXRXaW5kb3codHJ5U2VsZWN0b3IodGFyZ2V0KSA/IHRoaXMuX2NvbnRleHQgOiB0YXJnZXQpXG4gICAgdGhpcy5fZG9jICAgICA9IHRoaXMuX3dpbi5kb2N1bWVudFxuXG4gICAgdGhpcy5zZXQob3B0aW9ucylcbiAgfVxuXG4gIHNldE9uRXZlbnRzIChhY3Rpb25OYW1lOiBJbnRlcmFjdC5BY3Rpb25OYW1lLCBwaGFzZXM6IE5vbk51bGxhYmxlPGFueT4pIHtcbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25zdGFydCkpIHsgdGhpcy5vbihgJHthY3Rpb25OYW1lfXN0YXJ0YCwgcGhhc2VzLm9uc3RhcnQpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25tb3ZlKSkgeyB0aGlzLm9uKGAke2FjdGlvbk5hbWV9bW92ZWAsIHBoYXNlcy5vbm1vdmUpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25lbmQpKSB7IHRoaXMub24oYCR7YWN0aW9uTmFtZX1lbmRgLCBwaGFzZXMub25lbmQpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25pbmVydGlhc3RhcnQpKSB7IHRoaXMub24oYCR7YWN0aW9uTmFtZX1pbmVydGlhc3RhcnRgLCBwaGFzZXMub25pbmVydGlhc3RhcnQpIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1cGRhdGVQZXJBY3Rpb25MaXN0ZW5lcnMgKGFjdGlvbk5hbWU6IEludGVyYWN0LkFjdGlvbk5hbWUsIHByZXY6IEludGVyYWN0Lkxpc3RlbmVycywgY3VyOiBJbnRlcmFjdC5MaXN0ZW5lcnMpIHtcbiAgICBpZiAoaXMuYXJyYXkocHJldikgfHwgaXMub2JqZWN0KHByZXYpKSB7XG4gICAgICB0aGlzLm9mZihhY3Rpb25OYW1lLCBwcmV2KVxuICAgIH1cblxuICAgIGlmIChpcy5hcnJheShjdXIpIHx8IGlzLm9iamVjdChjdXIpKSB7XG4gICAgICB0aGlzLm9uKGFjdGlvbk5hbWUsIGN1cilcbiAgICB9XG4gIH1cblxuICBzZXRQZXJBY3Rpb24gKGFjdGlvbk5hbWU6IEludGVyYWN0LkFjdGlvbk5hbWUsIG9wdGlvbnM6IEludGVyYWN0Lk9yQm9vbGVhbjxPcHRpb25zPikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5fZGVmYXVsdHNcblxuICAgIC8vIGZvciBhbGwgdGhlIGRlZmF1bHQgcGVyLWFjdGlvbiBvcHRpb25zXG4gICAgZm9yIChjb25zdCBvcHRpb25OYW1lXyBpbiBvcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHRpb25OYW1lID0gb3B0aW9uTmFtZV8gYXMga2V5b2YgSW50ZXJhY3QuUGVyQWN0aW9uRGVmYXVsdHNcbiAgICAgIGNvbnN0IGFjdGlvbk9wdGlvbnMgPSB0aGlzLm9wdGlvbnNbYWN0aW9uTmFtZV1cbiAgICAgIGNvbnN0IG9wdGlvblZhbHVlOiBhbnkgPSBvcHRpb25zW29wdGlvbk5hbWVdXG5cbiAgICAgIC8vIHJlbW92ZSBvbGQgZXZlbnQgbGlzdGVuZXJzIGFuZCBhZGQgbmV3IG9uZXNcbiAgICAgIGlmIChvcHRpb25OYW1lID09PSAnbGlzdGVuZXJzJykge1xuICAgICAgICB0aGlzLnVwZGF0ZVBlckFjdGlvbkxpc3RlbmVycyhhY3Rpb25OYW1lLCBhY3Rpb25PcHRpb25zLmxpc3RlbmVycywgb3B0aW9uVmFsdWUgYXMgSW50ZXJhY3QuTGlzdGVuZXJzKVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgb3B0aW9uIHZhbHVlIGlzIGFuIGFycmF5XG4gICAgICBpZiAoaXMuYXJyYXk8YW55PihvcHRpb25WYWx1ZSkpIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IGFyci5mcm9tKG9wdGlvblZhbHVlKVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBhbiBvYmplY3RcbiAgICAgIGVsc2UgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvblZhbHVlKSkge1xuICAgICAgICAvLyBjb3B5IHRoZSBvYmplY3RcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IGV4dGVuZChcbiAgICAgICAgICBhY3Rpb25PcHRpb25zW29wdGlvbk5hbWVdIHx8IHt9IGFzIGFueSxcbiAgICAgICAgICBjbG9uZShvcHRpb25WYWx1ZSkpXG5cbiAgICAgICAgLy8gc2V0IGFuYWJsZWQgZmllbGQgdG8gdHJ1ZSBpZiBpdCBleGlzdHMgaW4gdGhlIGRlZmF1bHRzXG4gICAgICAgIGlmIChpcy5vYmplY3QoZGVmYXVsdHMucGVyQWN0aW9uW29wdGlvbk5hbWVdKSAmJiAnZW5hYmxlZCcgaW4gKGRlZmF1bHRzLnBlckFjdGlvbltvcHRpb25OYW1lXSBhcyBhbnkpKSB7XG4gICAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KS5lbmFibGVkID0gb3B0aW9uVmFsdWUuZW5hYmxlZCAhPT0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBhIGJvb2xlYW4gYW5kIHRoZSBkZWZhdWx0IGlzIGFuIG9iamVjdFxuICAgICAgZWxzZSBpZiAoaXMuYm9vbChvcHRpb25WYWx1ZSkgJiYgaXMub2JqZWN0KGRlZmF1bHRzLnBlckFjdGlvbltvcHRpb25OYW1lXSkpIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KS5lbmFibGVkID0gb3B0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIGlmIGl0J3MgYW55dGhpbmcgZWxzZSwgZG8gYSBwbGFpbiBhc3NpZ25tZW50XG4gICAgICBlbHNlIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IG9wdGlvblZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHRvIGdldCBhbiBJbnRlcmFjdGFibGVzIGJvdW5kaW5nIHJlY3QuIENhbiBiZVxuICAgKiBvdmVycmlkZGVuIHVzaW5nIHtAbGluayBJbnRlcmFjdGFibGUucmVjdENoZWNrZXJ9LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbGVtZW50XSBUaGUgZWxlbWVudCB0byBtZWFzdXJlLlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBvYmplY3QncyBib3VuZGluZyByZWN0YW5nbGUuXG4gICAqL1xuICBnZXRSZWN0IChlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gICAgZWxlbWVudCA9IGVsZW1lbnQgfHwgKGlzLmVsZW1lbnQodGhpcy50YXJnZXQpXG4gICAgICA/IHRoaXMudGFyZ2V0XG4gICAgICA6IG51bGwpXG5cbiAgICBpZiAoaXMuc3RyaW5nKHRoaXMudGFyZ2V0KSkge1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnQgfHwgdGhpcy5fY29udGV4dC5xdWVyeVNlbGVjdG9yKHRoaXMudGFyZ2V0KVxuICAgIH1cblxuICAgIHJldHVybiBnZXRFbGVtZW50UmVjdChlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBjYWxjdWxhdGUgdGhlIGludGVyYWN0YWJsZSdzXG4gICAqIGVsZW1lbnQncyByZWN0YW5nbGVcbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NoZWNrZXJdIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGlzIEludGVyYWN0YWJsZSdzXG4gICAqIGJvdW5kaW5nIHJlY3RhbmdsZS4gU2VlIHtAbGluayBJbnRlcmFjdGFibGUuZ2V0UmVjdH1cbiAgICogQHJldHVybiB7ZnVuY3Rpb24gfCBvYmplY3R9IFRoZSBjaGVja2VyIGZ1bmN0aW9uIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICByZWN0Q2hlY2tlciAoY2hlY2tlcjogKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpID0+IGFueSkge1xuICAgIGlmIChpcy5mdW5jKGNoZWNrZXIpKSB7XG4gICAgICB0aGlzLmdldFJlY3QgPSBjaGVja2VyXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrZXIgPT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmdldFJlY3RcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRSZWN0XG4gIH1cblxuICBfYmFja0NvbXBhdE9wdGlvbiAob3B0aW9uTmFtZToga2V5b2YgSW50ZXJhY3QuT3B0aW9ucywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0cnlTZWxlY3RvcihuZXdWYWx1ZSkgfHwgaXMub2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgKHRoaXMub3B0aW9uc1tvcHRpb25OYW1lXSBhcyBhbnkpID0gbmV3VmFsdWVcblxuICAgICAgZm9yIChjb25zdCBhY3Rpb24gaW4gdGhpcy5fYWN0aW9ucy5tYXApIHtcbiAgICAgICAgKHRoaXMub3B0aW9uc1thY3Rpb25dW29wdGlvbk5hbWVdIGFzIGFueSkgPSBuZXdWYWx1ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbb3B0aW9uTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWdpbiBvZiB0aGUgSW50ZXJhY3RhYmxlJ3MgZWxlbWVudC4gIFRoZSB4IGFuZCB5XG4gICAqIG9mIHRoZSBvcmlnaW4gd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gYWN0aW9uIGV2ZW50IGNvb3JkaW5hdGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnQgfCBvYmplY3QgfCBzdHJpbmd9IFtvcmlnaW5dIEFuIEhUTUwgb3IgU1ZHIEVsZW1lbnQgd2hvc2VcbiAgICogcmVjdCB3aWxsIGJlIHVzZWQsIGFuIG9iamVjdCBlZy4geyB4OiAwLCB5OiAwIH0gb3Igc3RyaW5nICdwYXJlbnQnLCAnc2VsZidcbiAgICogb3IgYW55IENTUyBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBjdXJyZW50IG9yaWdpbiBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgb3JpZ2luIChuZXdWYWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tDb21wYXRPcHRpb24oJ29yaWdpbicsIG5ld1ZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB0aGUgbW91c2UgY29vcmRpbmF0ZSB0eXBlcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGVcbiAgICogbW92ZW1lbnQgb2YgdGhlIHBvaW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmV3VmFsdWVdIFVzZSAnY2xpZW50JyBpZiB5b3Ugd2lsbCBiZSBzY3JvbGxpbmcgd2hpbGVcbiAgICogaW50ZXJhY3Rpbmc7IFVzZSAncGFnZScgaWYgeW91IHdhbnQgYXV0b1Njcm9sbCB0byB3b3JrXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IG9iamVjdH0gVGhlIGN1cnJlbnQgZGVsdGFTb3VyY2Ugb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIGRlbHRhU291cmNlIChuZXdWYWx1ZT86IHN0cmluZykge1xuICAgIGlmIChuZXdWYWx1ZSA9PT0gJ3BhZ2UnIHx8IG5ld1ZhbHVlID09PSAnY2xpZW50Jykge1xuICAgICAgdGhpcy5vcHRpb25zLmRlbHRhU291cmNlID0gbmV3VmFsdWVcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRlbHRhU291cmNlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2VsZWN0b3IgY29udGV4dCBOb2RlIG9mIHRoZSBJbnRlcmFjdGFibGUuIFRoZSBkZWZhdWx0IGlzXG4gICAqIGB3aW5kb3cuZG9jdW1lbnRgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtOb2RlfSBUaGUgY29udGV4dCBOb2RlIG9mIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBjb250ZXh0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dFxuICB9XG5cbiAgaW5Db250ZXh0IChlbGVtZW50OiBEb2N1bWVudCB8IE5vZGUpIHtcbiAgICByZXR1cm4gKHRoaXMuX2NvbnRleHQgPT09IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fFxuICAgICAgICAgICAgbm9kZUNvbnRhaW5zKHRoaXMuX2NvbnRleHQsIGVsZW1lbnQpKVxuICB9XG5cbiAgdGVzdElnbm9yZUFsbG93IChcbiAgICB0aGlzOiBJbnRlcmFjdGFibGUsXG4gICAgb3B0aW9uczogeyBpZ25vcmVGcm9tPzogSWdub3JlVmFsdWUsIGFsbG93RnJvbT86IElnbm9yZVZhbHVlIH0sXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsXG4gICkge1xuICAgIHJldHVybiAoIXRoaXMudGVzdElnbm9yZShvcHRpb25zLmlnbm9yZUZyb20sIHRhcmdldE5vZGUsIGV2ZW50VGFyZ2V0KSAmJlxuICAgICAgICAgICAgdGhpcy50ZXN0QWxsb3cob3B0aW9ucy5hbGxvd0Zyb20sIHRhcmdldE5vZGUsIGV2ZW50VGFyZ2V0KSlcbiAgfVxuXG4gIHRlc3RBbGxvdyAoXG4gICAgdGhpczogSW50ZXJhY3RhYmxlLFxuICAgIGFsbG93RnJvbTogSWdub3JlVmFsdWUsXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgKSB7XG4gICAgaWYgKCFhbGxvd0Zyb20pIHsgcmV0dXJuIHRydWUgfVxuXG4gICAgaWYgKCFpcy5lbGVtZW50KGVsZW1lbnQpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoaXMuc3RyaW5nKGFsbG93RnJvbSkpIHtcbiAgICAgIHJldHVybiBtYXRjaGVzVXBUbyhlbGVtZW50LCBhbGxvd0Zyb20sIHRhcmdldE5vZGUpXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLmVsZW1lbnQoYWxsb3dGcm9tKSkge1xuICAgICAgcmV0dXJuIG5vZGVDb250YWlucyhhbGxvd0Zyb20sIGVsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB0ZXN0SWdub3JlIChcbiAgICB0aGlzOiBJbnRlcmFjdGFibGUsXG4gICAgaWdub3JlRnJvbTogSWdub3JlVmFsdWUsXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgKSB7XG4gICAgaWYgKCFpZ25vcmVGcm9tIHx8ICFpcy5lbGVtZW50KGVsZW1lbnQpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoaXMuc3RyaW5nKGlnbm9yZUZyb20pKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlc1VwVG8oZWxlbWVudCwgaWdub3JlRnJvbSwgdGFyZ2V0Tm9kZSlcbiAgICB9XG4gICAgZWxzZSBpZiAoaXMuZWxlbWVudChpZ25vcmVGcm9tKSkge1xuICAgICAgcmV0dXJuIG5vZGVDb250YWlucyhpZ25vcmVGcm9tLCBlbGVtZW50KVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIEludGVyYWN0RXZlbnQgdHlwZSBib3VuZCBnbG9iYWxseVxuICAgKiBhbmQgZGlyZWN0bHkgdG8gdGhpcyBJbnRlcmFjdGFibGVcbiAgICpcbiAgICogQHBhcmFtIHtJbnRlcmFjdEV2ZW50fSBpRXZlbnQgVGhlIEludGVyYWN0RXZlbnQgb2JqZWN0IHRvIGJlIGZpcmVkIG9uIHRoaXNcbiAgICogSW50ZXJhY3RhYmxlXG4gICAqIEByZXR1cm4ge0ludGVyYWN0YWJsZX0gdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIGZpcmUgKGlFdmVudDogb2JqZWN0KSB7XG4gICAgdGhpcy5ldmVudHMuZmlyZShpRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX29uT2ZmIChtZXRob2Q6ICdvbicgfCAnb2ZmJywgdHlwZUFyZzogSW50ZXJhY3QuRXZlbnRUeXBlcywgbGlzdGVuZXJBcmc/OiBJbnRlcmFjdC5MaXN0ZW5lcnNBcmcgfCBudWxsLCBvcHRpb25zPzogYW55KSB7XG4gICAgaWYgKGlzLm9iamVjdCh0eXBlQXJnKSAmJiAhaXMuYXJyYXkodHlwZUFyZykpIHtcbiAgICAgIG9wdGlvbnMgPSBsaXN0ZW5lckFyZ1xuICAgICAgbGlzdGVuZXJBcmcgPSBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgYWRkUmVtb3ZlID0gbWV0aG9kID09PSAnb24nID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5vcm1hbGl6ZUxpc3RlbmVycyh0eXBlQXJnLCBsaXN0ZW5lckFyZylcblxuICAgIGZvciAobGV0IHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ3doZWVsJykgeyB0eXBlID0gYnJvd3Nlci53aGVlbEV2ZW50IH1cblxuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgLy8gaWYgaXQgaXMgYW4gYWN0aW9uIGV2ZW50IHR5cGVcbiAgICAgICAgaWYgKGlzTm9uTmF0aXZlRXZlbnQodHlwZSwgdGhpcy5fYWN0aW9ucykpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50c1ttZXRob2RdKHR5cGUsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICAgIC8vIGRlbGVnYXRlZCBldmVudFxuICAgICAgICBlbHNlIGlmIChpcy5zdHJpbmcodGhpcy50YXJnZXQpKSB7XG4gICAgICAgICAgZXZlbnRzW2Ake2FkZFJlbW92ZX1EZWxlZ2F0ZWAgYXMgJ2FkZERlbGVnYXRlJyB8ICdyZW1vdmVEZWxlZ2F0ZSddKHRoaXMudGFyZ2V0LCB0aGlzLl9jb250ZXh0LCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgbGlzdGVuZXIgZnJvbSB0aGlzIEludGVyYWN0YWJsZSdzIGVsZW1lbnRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgKGV2ZW50c1thZGRSZW1vdmVdIGFzIHR5cGVvZiBldmVudHMucmVtb3ZlKSh0aGlzLnRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgbGlzdGVuZXIgZm9yIGFuIEludGVyYWN0RXZlbnQsIHBvaW50ZXJFdmVudCBvciBET00gZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGVzIFRoZSB0eXBlcyBvZiBldmVudHMgdG8gbGlzdGVuXG4gICAqIGZvclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgYXJyYXkgfCBvYmplY3R9IFtsaXN0ZW5lcl0gVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uKHMpXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAgICogYWRkRXZlbnRMaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBvbiAodHlwZXM6IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyPzogSW50ZXJhY3QuTGlzdGVuZXJzQXJnLCBvcHRpb25zPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uT2ZmKCdvbicsIHR5cGVzLCBsaXN0ZW5lciwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIEludGVyYWN0RXZlbnQsIHBvaW50ZXJFdmVudCBvciBET00gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGVzIFRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCB3ZXJlXG4gICAqIGxpc3RlbmVkIGZvclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgYXJyYXkgfCBvYmplY3R9IFtsaXN0ZW5lcl0gVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uKHMpXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAgICogcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBvZmYgKHR5cGVzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyPzogSW50ZXJhY3QuTGlzdGVuZXJzQXJnLCBvcHRpb25zPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uT2ZmKCdvZmYnLCB0eXBlcywgbGlzdGVuZXIsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIG9wdGlvbnMgb2YgdGhpcyBJbnRlcmFjdGFibGVcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG5ldyBzZXR0aW5ncyB0byBhcHBseVxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBzZXQgKG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnNBcmcpIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuX2RlZmF1bHRzXG5cbiAgICBpZiAoIWlzLm9iamVjdChvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgKHRoaXMub3B0aW9ucyBhcyBSZXF1aXJlZDxPcHRpb25zPikgPSBjbG9uZShkZWZhdWx0cy5iYXNlKSBhcyBSZXF1aXJlZDxPcHRpb25zPlxuXG4gICAgZm9yIChjb25zdCBhY3Rpb25OYW1lXyBpbiB0aGlzLl9hY3Rpb25zLm1ldGhvZERpY3QpIHtcbiAgICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBhY3Rpb25OYW1lXyBhcyBJbnRlcmFjdC5BY3Rpb25OYW1lXG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gdGhpcy5fYWN0aW9ucy5tZXRob2REaWN0W2FjdGlvbk5hbWVdXG5cbiAgICAgIHRoaXMub3B0aW9uc1thY3Rpb25OYW1lXSA9IHt9XG4gICAgICB0aGlzLnNldFBlckFjdGlvbihhY3Rpb25OYW1lLCBleHRlbmQoZXh0ZW5kKHt9LCBkZWZhdWx0cy5wZXJBY3Rpb24pLCBkZWZhdWx0cy5hY3Rpb25zW2FjdGlvbk5hbWVdKSlcblxuICAgICAgdGhpc1ttZXRob2ROYW1lXShvcHRpb25zW2FjdGlvbk5hbWVdKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoaXMuZnVuYyh0aGlzW3NldHRpbmddKSkge1xuICAgICAgICB0aGlzW3NldHRpbmddKG9wdGlvbnNbc2V0dGluZ10pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyBpbnRlcmFjdGFibGUgZnJvbSB0aGUgbGlzdCBvZiBpbnRlcmFjdGFibGVzIGFuZCByZW1vdmUgaXQnc1xuICAgKiBhY3Rpb24gY2FwYWJpbGl0aWVzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICpcbiAgICogQHJldHVybiB7aW50ZXJhY3R9XG4gICAqL1xuICB1bnNldCAoKSB7XG4gICAgZXZlbnRzLnJlbW92ZSh0aGlzLnRhcmdldCBhcyBOb2RlLCAnYWxsJylcblxuICAgIGlmIChpcy5zdHJpbmcodGhpcy50YXJnZXQpKSB7XG4gICAgICAvLyByZW1vdmUgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgZm9yIChjb25zdCB0eXBlIGluIGV2ZW50cy5kZWxlZ2F0ZWRFdmVudHMpIHtcbiAgICAgICAgY29uc3QgZGVsZWdhdGVkID0gZXZlbnRzLmRlbGVnYXRlZEV2ZW50c1t0eXBlXVxuXG4gICAgICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzWzBdID09PSB0aGlzLnRhcmdldCAmJlxuICAgICAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzWzBdID09PSB0aGlzLl9jb250ZXh0KSB7XG4gICAgICAgICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5zcGxpY2UoMCwgMSlcbiAgICAgICAgICBkZWxlZ2F0ZWQuY29udGV4dHMuc3BsaWNlKDAsIDEpXG4gICAgICAgICAgZGVsZWdhdGVkLmxpc3RlbmVycy5zcGxpY2UoMCwgMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50cy5yZW1vdmUodGhpcy5fY29udGV4dCwgdHlwZSwgZXZlbnRzLmRlbGVnYXRlTGlzdGVuZXIpXG4gICAgICAgIGV2ZW50cy5yZW1vdmUodGhpcy5fY29udGV4dCwgdHlwZSwgZXZlbnRzLmRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBldmVudHMucmVtb3ZlKHRoaXMudGFyZ2V0IGFzIE5vZGUsICdhbGwnKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcmFjdGFibGVcbiIsImltcG9ydCBkb21PYmplY3RzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbU9iamVjdHMnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRPcHRpb25zJ1xuaW1wb3J0IEV2ZW50YWJsZSBmcm9tICcuL0V2ZW50YWJsZSdcbmltcG9ydCBJbnRlcmFjdGFibGVCYXNlIGZyb20gJy4vSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IEludGVyYWN0YWJsZVNldCBmcm9tICcuL0ludGVyYWN0YWJsZVNldCdcbmltcG9ydCBJbnRlcmFjdEV2ZW50LCB7IFBoYXNlTWFwIH0gZnJvbSAnLi9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0IGludGVyYWN0aW9ucyBmcm9tICcuL2ludGVyYWN0aW9ucydcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBcmdzIHtcbiAgJ3Njb3BlOmFkZC1kb2N1bWVudCc6IERvY1NpZ25hbEFyZ1xuICAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JzogRG9jU2lnbmFsQXJnXG4gICdpbnRlcmFjdGFibGU6dW5zZXQnOiB7IGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlQmFzZSB9XG4gICdpbnRlcmFjdGFibGU6c2V0JzogeyBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZUJhc2UsIG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnMgfVxuICAnaW50ZXJhY3Rpb25zOmRlc3Ryb3knOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9XG59XG5cbmV4cG9ydCB0eXBlIExpc3RlbmVyTmFtZSA9IGtleW9mIFNpZ25hbEFyZ3NcblxuZXhwb3J0IHR5cGUgTGlzdGVuZXJNYXAgPSB7XG4gIFtQIGluIExpc3RlbmVyTmFtZV0/OiAoYXJnOiBTaWduYWxBcmdzW1BdLCBzY29wZTogU2NvcGUsIHNpZ25hbE5hbWU6IFApID0+IHZvaWQgfCBib29sZWFuXG59XG5cbmludGVyZmFjZSBEb2NTaWduYWxBcmcge1xuICBkb2M6IERvY3VtZW50XG4gIHdpbmRvdzogV2luZG93XG4gIHNjb3BlOiBTY29wZVxuICBvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9XG59XG5cbmNvbnN0IHtcbiAgd2luLFxuICBicm93c2VyLFxuICByYWYsXG4gIGV2ZW50cyxcbn0gPSB1dGlsc1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25NYXAgeyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lIG5vLWVtcHR5LWludGVyZmFjZVxufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25OYW1lID0ga2V5b2YgQWN0aW9uTWFwXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9ucyB7XG4gIG1hcDogQWN0aW9uTWFwXG4gIHBoYXNlczogUGhhc2VNYXBcbiAgbWV0aG9kRGljdDogeyBbUCBpbiBBY3Rpb25OYW1lXT86IHN0cmluZyB9XG4gIHBoYXNlbGVzc1R5cGVzOiB7IFt0eXBlOiBzdHJpbmddOiB0cnVlIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjb3BlICgpIHtcbiAgcmV0dXJuIG5ldyBTY29wZSgpXG59XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRzID0gdHlwZW9mIGRlZmF1bHRzXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIGlkPzogc3RyaW5nXG4gIGxpc3RlbmVycz86IExpc3RlbmVyTWFwXG4gIGJlZm9yZT86IHN0cmluZ1tdXG4gIGluc3RhbGw/IChzY29wZTogU2NvcGUsIG9wdGlvbnM/OiBhbnkpOiB2b2lkXG59XG5cbmV4cG9ydCBjbGFzcyBTY29wZSB7XG4gIGlkID0gYF9faW50ZXJhY3Rfc2NvcGVfJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDApfWBcbiAgaXNJbml0aWFsaXplZCA9IGZhbHNlXG4gIGxpc3RlbmVyTWFwczogQXJyYXk8e1xuICAgIG1hcDogTGlzdGVuZXJNYXBcbiAgICBpZDogc3RyaW5nXG4gIH0+ID0gW11cblxuICBicm93c2VyID0gYnJvd3NlclxuICBldmVudHMgPSBldmVudHNcbiAgdXRpbHMgPSB1dGlsc1xuICBkZWZhdWx0czogRGVmYXVsdHMgPSB1dGlscy5jbG9uZShkZWZhdWx0cykgYXMgRGVmYXVsdHNcbiAgRXZlbnRhYmxlID0gRXZlbnRhYmxlXG4gIGFjdGlvbnM6IEFjdGlvbnMgPSB7XG4gICAgbWFwOiB7fSxcbiAgICBwaGFzZXM6IHtcbiAgICAgIHN0YXJ0OiB0cnVlLFxuICAgICAgbW92ZTogdHJ1ZSxcbiAgICAgIGVuZDogdHJ1ZSxcbiAgICB9LFxuICAgIG1ldGhvZERpY3Q6IHt9LFxuICAgIHBoYXNlbGVzc1R5cGVzOiB7fSxcbiAgfVxuXG4gIEludGVyYWN0RXZlbnQgPSBJbnRlcmFjdEV2ZW50XG4gIEludGVyYWN0YWJsZSE6IHR5cGVvZiBJbnRlcmFjdGFibGVCYXNlXG4gIGludGVyYWN0YWJsZXMgPSBuZXcgSW50ZXJhY3RhYmxlU2V0KHRoaXMpXG5cbiAgLy8gbWFpbiB3aW5kb3dcbiAgX3dpbiE6IFdpbmRvd1xuXG4gIC8vIG1haW4gZG9jdW1lbnRcbiAgZG9jdW1lbnQhOiBEb2N1bWVudFxuXG4gIC8vIG1haW4gd2luZG93XG4gIHdpbmRvdyE6IFdpbmRvd1xuXG4gIC8vIGFsbCBkb2N1bWVudHMgYmVpbmcgbGlzdGVuZWQgdG9cbiAgZG9jdW1lbnRzOiBBcnJheTx7IGRvYzogRG9jdW1lbnQsIG9wdGlvbnM6IGFueSB9PiA9IFtdXG5cbiAgX3BsdWdpbnM6IHtcbiAgICBsaXN0OiBQbHVnaW5bXVxuICAgIG1hcDogeyBbaWQ6IHN0cmluZ106IFBsdWdpbiB9XG4gIH0gPSB7XG4gICAgbGlzdDogW10sXG4gICAgbWFwOiB7fSxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXNcblxuICAgIHRoaXMuSW50ZXJhY3RhYmxlID0gY2xhc3MgZXh0ZW5kcyBJbnRlcmFjdGFibGVCYXNlIHtcbiAgICAgIGdldCBfZGVmYXVsdHMgKCkgeyByZXR1cm4gc2NvcGUuZGVmYXVsdHMgfVxuXG4gICAgICBzZXQgKG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIuc2V0KG9wdGlvbnMpXG5cbiAgICAgICAgc2NvcGUuZmlyZSgnaW50ZXJhY3RhYmxlOnNldCcsIHtcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGludGVyYWN0YWJsZTogdGhpcyxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfVxuXG4gICAgICB1bnNldCAoKSB7XG4gICAgICAgIHN1cGVyLnVuc2V0KClcbiAgICAgICAgc2NvcGUuaW50ZXJhY3RhYmxlcy5saXN0LnNwbGljZShzY29wZS5pbnRlcmFjdGFibGVzLmxpc3QuaW5kZXhPZih0aGlzKSwgMSlcblxuICAgICAgICBzY29wZS5maXJlKCdpbnRlcmFjdGFibGU6dW5zZXQnLCB7IGludGVyYWN0YWJsZTogdGhpcyB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZExpc3RlbmVycyAobWFwOiBMaXN0ZW5lck1hcCwgaWQ/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxpc3RlbmVyTWFwcy5wdXNoKHsgaWQsIG1hcCB9KVxuICB9XG5cbiAgZmlyZTxUIGV4dGVuZHMgTGlzdGVuZXJOYW1lPiAobmFtZTogVCwgYXJnOiBTaWduYWxBcmdzW1RdKTogdm9pZCB8IGZhbHNlIHtcbiAgICBmb3IgKGNvbnN0IHsgbWFwOiB7IFtuYW1lXTogbGlzdGVuZXIgfSB9IG9mIHRoaXMubGlzdGVuZXJNYXBzKSB7XG4gICAgICBpZiAoISFsaXN0ZW5lciAmJiBsaXN0ZW5lcihhcmcgYXMgYW55LCB0aGlzLCBuYW1lIGFzIG5ldmVyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25XaW5kb3dVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB0aGlzLnJlbW92ZURvY3VtZW50KGV2ZW50LnRhcmdldCBhcyBEb2N1bWVudClcblxuICBpbml0ICh3aW5kb3c6IFdpbmRvdykge1xuICAgIHJldHVybiB0aGlzLmlzSW5pdGlhbGl6ZWRcbiAgICAgID8gdGhpc1xuICAgICAgOiBpbml0U2NvcGUodGhpcywgd2luZG93KVxuICB9XG5cbiAgcGx1Z2luSXNJbnN0YWxsZWQgKHBsdWdpbjogUGx1Z2luKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsdWdpbnMubWFwW3BsdWdpbi5pZF0gfHwgdGhpcy5fcGx1Z2lucy5saXN0LmluZGV4T2YocGx1Z2luKSAhPT0gLTFcbiAgfVxuXG4gIHVzZVBsdWdpbiAocGx1Z2luOiBQbHVnaW4sIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gICAgaWYgKHRoaXMucGx1Z2luSXNJbnN0YWxsZWQocGx1Z2luKSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmlkKSB7IHRoaXMuX3BsdWdpbnMubWFwW3BsdWdpbi5pZF0gPSBwbHVnaW4gfVxuICAgIHRoaXMuX3BsdWdpbnMubGlzdC5wdXNoKHBsdWdpbilcblxuICAgIGlmIChwbHVnaW4uaW5zdGFsbCkge1xuICAgICAgcGx1Z2luLmluc3RhbGwodGhpcywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmxpc3RlbmVycyAmJiBwbHVnaW4uYmVmb3JlKSB7XG4gICAgICBsZXQgaW5kZXggPSAwXG4gICAgICBjb25zdCBsZW4gPSB0aGlzLmxpc3RlbmVyTWFwcy5sZW5ndGhcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHBsdWdpbi5iZWZvcmUucmVkdWNlKChhY2MsIGlkKSA9PiB7XG4gICAgICAgIGFjY1tpZF0gPSB0cnVlXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIHt9KVxuXG4gICAgICBmb3IgKDsgaW5kZXggPCBsZW47IGluZGV4KyspIHtcbiAgICAgICAgY29uc3Qgb3RoZXJJZCA9IHRoaXMubGlzdGVuZXJNYXBzW2luZGV4XS5pZFxuXG4gICAgICAgIGlmIChiZWZvcmVbb3RoZXJJZF0pIHsgYnJlYWsgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmxpc3RlbmVyTWFwcy5zcGxpY2UoaW5kZXgsIDAsIHsgaWQ6IHBsdWdpbi5pZCwgbWFwOiBwbHVnaW4ubGlzdGVuZXJzIH0pXG4gICAgfVxuICAgIGVsc2UgaWYgKHBsdWdpbi5saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJNYXBzLnB1c2goeyBpZDogcGx1Z2luLmlkLCBtYXA6IHBsdWdpbi5saXN0ZW5lcnMgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgYWRkRG9jdW1lbnQgKGRvYzogRG9jdW1lbnQsIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHwgZmFsc2Uge1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgZG9jdW1lbnQgaXMgYWxyZWFkeSBrbm93blxuICAgIGlmICh0aGlzLmdldERvY0luZGV4KGRvYykgIT09IC0xKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBjb25zdCB3aW5kb3cgPSB3aW4uZ2V0V2luZG93KGRvYylcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zID8gdXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IHt9XG5cbiAgICB0aGlzLmRvY3VtZW50cy5wdXNoKHsgZG9jLCBvcHRpb25zIH0pXG4gICAgZXZlbnRzLmRvY3VtZW50cy5wdXNoKGRvYylcblxuICAgIC8vIGRvbid0IGFkZCBhbiB1bmxvYWQgZXZlbnQgZm9yIHRoZSBtYWluIGRvY3VtZW50XG4gICAgLy8gc28gdGhhdCB0aGUgcGFnZSBtYXkgYmUgY2FjaGVkIGluIGJyb3dzZXIgaGlzdG9yeVxuICAgIGlmIChkb2MgIT09IHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgIGV2ZW50cy5hZGQod2luZG93LCAndW5sb2FkJywgdGhpcy5vbldpbmRvd1VubG9hZClcbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoJ3Njb3BlOmFkZC1kb2N1bWVudCcsIHsgZG9jLCB3aW5kb3csIHNjb3BlOiB0aGlzLCBvcHRpb25zIH0pXG4gIH1cblxuICByZW1vdmVEb2N1bWVudCAoZG9jOiBEb2N1bWVudCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXREb2NJbmRleChkb2MpXG5cbiAgICBjb25zdCB3aW5kb3cgPSB3aW4uZ2V0V2luZG93KGRvYylcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kb2N1bWVudHNbaW5kZXhdLm9wdGlvbnNcblxuICAgIGV2ZW50cy5yZW1vdmUod2luZG93LCAndW5sb2FkJywgdGhpcy5vbldpbmRvd1VubG9hZClcblxuICAgIHRoaXMuZG9jdW1lbnRzLnNwbGljZShpbmRleCwgMSlcbiAgICBldmVudHMuZG9jdW1lbnRzLnNwbGljZShpbmRleCwgMSlcblxuICAgIHRoaXMuZmlyZSgnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JywgeyBkb2MsIHdpbmRvdywgc2NvcGU6IHRoaXMsIG9wdGlvbnMgfSlcbiAgfVxuXG4gIGdldERvY0luZGV4IChkb2M6IERvY3VtZW50KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRvY3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZG9jdW1lbnRzW2ldLmRvYyA9PT0gZG9jKSB7XG4gICAgICAgIHJldHVybiBpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICBnZXREb2NPcHRpb25zIChkb2M6IERvY3VtZW50KSB7XG4gICAgY29uc3QgZG9jSW5kZXggPSB0aGlzLmdldERvY0luZGV4KGRvYylcblxuICAgIHJldHVybiBkb2NJbmRleCA9PT0gLTEgPyBudWxsIDogdGhpcy5kb2N1bWVudHNbZG9jSW5kZXhdLm9wdGlvbnNcbiAgfVxuXG4gIG5vdyAoKSB7XG4gICAgcmV0dXJuICgodGhpcy53aW5kb3cgYXMgYW55KS5EYXRlIGFzIHR5cGVvZiBEYXRlIHx8IERhdGUpLm5vdygpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uTmF0aXZlRXZlbnQgKHR5cGU6IHN0cmluZywgYWN0aW9uczogQWN0aW9ucykge1xuICBpZiAoYWN0aW9ucy5waGFzZWxlc3NUeXBlc1t0eXBlXSkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgZm9yIChjb25zdCBuYW1lIGluIGFjdGlvbnMubWFwKSB7XG4gICAgaWYgKHR5cGUuaW5kZXhPZihuYW1lKSA9PT0gMCAmJiB0eXBlLnN1YnN0cihuYW1lLmxlbmd0aCkgaW4gYWN0aW9ucy5waGFzZXMpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2NvcGUgKHNjb3BlOiBTY29wZSwgd2luZG93OiBXaW5kb3cpIHtcbiAgc2NvcGUuaXNJbml0aWFsaXplZCA9IHRydWVcbiAgd2luLmluaXQod2luZG93KVxuICBkb21PYmplY3RzLmluaXQod2luZG93KVxuICBicm93c2VyLmluaXQod2luZG93KVxuICByYWYuaW5pdCh3aW5kb3cpXG4gIGV2ZW50cy5pbml0KHdpbmRvdylcblxuICBzY29wZS51c2VQbHVnaW4oaW50ZXJhY3Rpb25zKVxuICBzY29wZS5kb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudFxuICBzY29wZS53aW5kb3cgPSB3aW5kb3dcblxuICByZXR1cm4gc2NvcGVcbn1cbiIsImltcG9ydCBicm93c2VyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2Jyb3dzZXInXG5pbXBvcnQgZG9tT2JqZWN0cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21PYmplY3RzJ1xuaW1wb3J0IHsgbm9kZUNvbnRhaW5zIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZG9tVXRpbHMnXG5pbXBvcnQgZXZlbnRzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V2ZW50cydcbmltcG9ydCAqIGFzIHBvaW50ZXJVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9wb2ludGVyVXRpbHMnXG5pbXBvcnQgSW50ZXJhY3Rpb25CYXNlIGZyb20gJy4vSW50ZXJhY3Rpb24nXG5pbXBvcnQgZmluZGVyLCB7IFNlYXJjaERldGFpbHMgfSBmcm9tICcuL2ludGVyYWN0aW9uRmluZGVyJ1xuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICcuL3Njb3BlJ1xuaW1wb3J0IGludGVyYWN0YWJsZVByZXZlbnREZWZhdWx0IGZyb20gJy4vaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgSW50ZXJhY3Rpb246IHR5cGVvZiBJbnRlcmFjdGlvbkJhc2VcbiAgICBpbnRlcmFjdGlvbnM6IHtcbiAgICAgIG5ldzogPFQgZXh0ZW5kcyBBY3Rpb25OYW1lPiAob3B0aW9uczogYW55KSA9PiBJbnRlcmFjdGlvbkJhc2U8VD5cbiAgICAgIGxpc3Q6IEludGVyYWN0aW9uQmFzZVtdXG4gICAgICBsaXN0ZW5lcnM6IHsgW3R5cGU6IHN0cmluZ106IEludGVyYWN0Lkxpc3RlbmVyIH1cbiAgICAgIGRvY0V2ZW50czogQXJyYXk8eyB0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBJbnRlcmFjdC5MaXN0ZW5lciB9PlxuICAgICAgcG9pbnRlck1vdmVUb2xlcmFuY2U6IG51bWJlclxuICAgIH1cbiAgICBwcmV2VG91Y2hUaW1lOiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2ludGVyYWN0aW9uczpmaW5kJzoge1xuICAgICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uQmFzZVxuICAgICAgc2VhcmNoRGV0YWlsczogU2VhcmNoRGV0YWlsc1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXRob2ROYW1lcyA9IFtcbiAgJ3BvaW50ZXJEb3duJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJVcCcsXG4gICd1cGRhdGVQb2ludGVyJywgJ3JlbW92ZVBvaW50ZXInLCAnd2luZG93Qmx1cicsXG5dXG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCBsaXN0ZW5lcnMgPSB7fSBhcyBhbnlcblxuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2ROYW1lcykge1xuICAgIGxpc3RlbmVyc1ttZXRob2RdID0gZG9PbkludGVyYWN0aW9ucyhtZXRob2QsIHNjb3BlKVxuICB9XG5cbiAgY29uc3QgcEV2ZW50VHlwZXMgPSBicm93c2VyLnBFdmVudFR5cGVzXG4gIGxldCBkb2NFdmVudHM6IHR5cGVvZiBzY29wZS5pbnRlcmFjdGlvbnMuZG9jRXZlbnRzXG5cbiAgaWYgKGRvbU9iamVjdHMuUG9pbnRlckV2ZW50KSB7XG4gICAgZG9jRXZlbnRzID0gW1xuICAgICAgeyB0eXBlOiBwRXZlbnRUeXBlcy5kb3duLCAgIGxpc3RlbmVyOiByZWxlYXNlUG9pbnRlcnNPblJlbW92ZWRFbHMgfSxcbiAgICAgIHsgdHlwZTogcEV2ZW50VHlwZXMuZG93biwgICBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJEb3duIH0sXG4gICAgICB7IHR5cGU6IHBFdmVudFR5cGVzLm1vdmUsICAgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiBwRXZlbnRUeXBlcy51cCwgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcnMucG9pbnRlclVwIH0sXG4gICAgICB7IHR5cGU6IHBFdmVudFR5cGVzLmNhbmNlbCwgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyVXAgfSxcbiAgICBdXG4gIH1cbiAgZWxzZSB7XG4gICAgZG9jRXZlbnRzID0gW1xuICAgICAgeyB0eXBlOiAnbW91c2Vkb3duJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyRG93biB9LFxuICAgICAgeyB0eXBlOiAnbW91c2Vtb3ZlJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiAnbW91c2V1cCcsIGxpc3RlbmVyOiBsaXN0ZW5lcnMucG9pbnRlclVwIH0sXG5cbiAgICAgIHsgdHlwZTogJ3RvdWNoc3RhcnQnLCBsaXN0ZW5lcjogcmVsZWFzZVBvaW50ZXJzT25SZW1vdmVkRWxzIH0sXG4gICAgICB7IHR5cGU6ICd0b3VjaHN0YXJ0JywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyRG93biB9LFxuICAgICAgeyB0eXBlOiAndG91Y2htb3ZlJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiAndG91Y2hlbmQnLCBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJVcCB9LFxuICAgICAgeyB0eXBlOiAndG91Y2hjYW5jZWwnLCBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJVcCB9LFxuICAgIF1cbiAgfVxuXG4gIGRvY0V2ZW50cy5wdXNoKHtcbiAgICB0eXBlOiAnYmx1cicsXG4gICAgbGlzdGVuZXIgKGV2ZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICAgIGludGVyYWN0aW9uLmRvY3VtZW50Qmx1cihldmVudClcbiAgICAgIH1cbiAgICB9LFxuICB9KVxuXG4gIC8vIGZvciBpZ25vcmluZyBicm93c2VyJ3Mgc2ltdWxhdGVkIG1vdXNlIGV2ZW50c1xuICBzY29wZS5wcmV2VG91Y2hUaW1lID0gMFxuXG4gIHNjb3BlLkludGVyYWN0aW9uID0gY2xhc3MgPFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiBleHRlbmRzIEludGVyYWN0aW9uQmFzZTxUPiB7XG4gICAgZ2V0IHBvaW50ZXJNb3ZlVG9sZXJhbmNlICgpIHtcbiAgICAgIHJldHVybiBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2VcbiAgICB9XG5cbiAgICBzZXQgcG9pbnRlck1vdmVUb2xlcmFuY2UgKHZhbHVlKSB7XG4gICAgICBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2UgPSB2YWx1ZVxuICAgIH1cblxuICAgIF9ub3cgKCkgeyByZXR1cm4gc2NvcGUubm93KCkgfVxuICB9XG5cbiAgc2NvcGUuaW50ZXJhY3Rpb25zID0ge1xuICAgIC8vIGFsbCBhY3RpdmUgYW5kIGlkbGUgaW50ZXJhY3Rpb25zXG4gICAgbGlzdDogW10sXG4gICAgbmV3PFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiAob3B0aW9uczogeyBwb2ludGVyVHlwZT86IHN0cmluZywgc2NvcGVGaXJlPzogU2NvcGVbJ2ZpcmUnXSB9KSB7XG4gICAgICBvcHRpb25zLnNjb3BlRmlyZSA9IChuYW1lLCBhcmcpID0+IHNjb3BlLmZpcmUobmFtZSwgYXJnKVxuXG4gICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IG5ldyBzY29wZS5JbnRlcmFjdGlvbjxUPihvcHRpb25zIGFzIFJlcXVpcmVkPHR5cGVvZiBvcHRpb25zPilcblxuICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QucHVzaChpbnRlcmFjdGlvbilcbiAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgIH0sXG4gICAgbGlzdGVuZXJzLFxuICAgIGRvY0V2ZW50cyxcbiAgICBwb2ludGVyTW92ZVRvbGVyYW5jZTogMSxcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbGVhc2VQb2ludGVyc09uUmVtb3ZlZEVscyAoKSB7XG4gICAgLy8gZm9yIGFsbCBpbmFjdGl2ZSB0b3VjaCBpbnRlcmFjdGlvbnMgd2l0aCBwb2ludGVycyBkb3duXG4gICAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgICAgaWYgKCFpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duIHx8XG4gICAgICAgIGludGVyYWN0aW9uLnBvaW50ZXJUeXBlICE9PSAndG91Y2gnIHx8XG4gICAgICAgIGludGVyYWN0aW9uLl9pbnRlcmFjdGluZykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBhIHBvaW50ZXIgaXMgZG93biBvbiBhbiBlbGVtZW50IHRoYXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBET00gdHJlZVxuICAgICAgZm9yIChjb25zdCBwb2ludGVyIG9mIGludGVyYWN0aW9uLnBvaW50ZXJzKSB7XG4gICAgICAgIGlmICghc2NvcGUuZG9jdW1lbnRzLnNvbWUoKHsgZG9jIH0pID0+IG5vZGVDb250YWlucyhkb2MsIHBvaW50ZXIuZG93blRhcmdldCkpKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwb2ludGVyIGZyb20gdGhlIGludGVyYWN0aW9uXG4gICAgICAgICAgaW50ZXJhY3Rpb24ucmVtb3ZlUG9pbnRlcihwb2ludGVyLnBvaW50ZXIsIHBvaW50ZXIuZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzY29wZS51c2VQbHVnaW4oaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQpXG59XG5cbmZ1bmN0aW9uIGRvT25JbnRlcmFjdGlvbnMgKG1ldGhvZCwgc2NvcGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGludGVyYWN0aW9ucyA9IHNjb3BlLmludGVyYWN0aW9ucy5saXN0XG5cbiAgICBjb25zdCBwb2ludGVyVHlwZSA9IHBvaW50ZXJVdGlscy5nZXRQb2ludGVyVHlwZShldmVudClcbiAgICBjb25zdCBbZXZlbnRUYXJnZXQsIGN1ckV2ZW50VGFyZ2V0XSA9IHBvaW50ZXJVdGlscy5nZXRFdmVudFRhcmdldHMoZXZlbnQpXG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdIC8vIFsgW3BvaW50ZXIsIGludGVyYWN0aW9uXSwgLi4uXVxuXG4gICAgaWYgKC9edG91Y2gvLnRlc3QoZXZlbnQudHlwZSkpIHtcbiAgICAgIHNjb3BlLnByZXZUb3VjaFRpbWUgPSBzY29wZS5ub3coKVxuXG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRUb3VjaCBvZiBldmVudC5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgICBjb25zdCBwb2ludGVyID0gY2hhbmdlZFRvdWNoXG4gICAgICAgIGNvbnN0IHBvaW50ZXJJZCA9IHBvaW50ZXJVdGlscy5nZXRQb2ludGVySWQocG9pbnRlcilcbiAgICAgICAgY29uc3Qgc2VhcmNoRGV0YWlsczogU2VhcmNoRGV0YWlscyA9IHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHBvaW50ZXJJZCxcbiAgICAgICAgICBwb2ludGVyVHlwZSxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICAgICAgY3VyRXZlbnRUYXJnZXQsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb24gPSBnZXRJbnRlcmFjdGlvbihzZWFyY2hEZXRhaWxzKVxuXG4gICAgICAgIG1hdGNoZXMucHVzaChbXG4gICAgICAgICAgc2VhcmNoRGV0YWlscy5wb2ludGVyLFxuICAgICAgICAgIHNlYXJjaERldGFpbHMuZXZlbnRUYXJnZXQsXG4gICAgICAgICAgc2VhcmNoRGV0YWlscy5jdXJFdmVudFRhcmdldCxcbiAgICAgICAgICBpbnRlcmFjdGlvbixcbiAgICAgICAgXSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsZXQgaW52YWxpZFBvaW50ZXIgPSBmYWxzZVxuXG4gICAgICBpZiAoIWJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnQgJiYgL21vdXNlLy50ZXN0KGV2ZW50LnR5cGUpKSB7XG4gICAgICAgIC8vIGlnbm9yZSBtb3VzZSBldmVudHMgd2hpbGUgdG91Y2ggaW50ZXJhY3Rpb25zIGFyZSBhY3RpdmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcmFjdGlvbnMubGVuZ3RoICYmICFpbnZhbGlkUG9pbnRlcjsgaSsrKSB7XG4gICAgICAgICAgaW52YWxpZFBvaW50ZXIgPSBpbnRlcmFjdGlvbnNbaV0ucG9pbnRlclR5cGUgIT09ICdtb3VzZScgJiYgaW50ZXJhY3Rpb25zW2ldLnBvaW50ZXJJc0Rvd25cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyeSB0byBpZ25vcmUgbW91c2UgZXZlbnRzIHRoYXQgYXJlIHNpbXVsYXRlZCBieSB0aGUgYnJvd3NlclxuICAgICAgICAvLyBhZnRlciBhIHRvdWNoIGV2ZW50XG4gICAgICAgIGludmFsaWRQb2ludGVyID0gaW52YWxpZFBvaW50ZXIgfHxcbiAgICAgICAgICAoc2NvcGUubm93KCkgLSBzY29wZS5wcmV2VG91Y2hUaW1lIDwgNTAwKSB8fFxuICAgICAgICAgIC8vIG9uIGlPUyBhbmQgRmlyZWZveCBNb2JpbGUsIE1vdXNlRXZlbnQudGltZVN0YW1wIGlzIHplcm8gaWYgc2ltdWxhdGVkXG4gICAgICAgICAgZXZlbnQudGltZVN0YW1wID09PSAwXG4gICAgICB9XG5cbiAgICAgIGlmICghaW52YWxpZFBvaW50ZXIpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRGV0YWlscyA9IHtcbiAgICAgICAgICBwb2ludGVyOiBldmVudCxcbiAgICAgICAgICBwb2ludGVySWQ6IHBvaW50ZXJVdGlscy5nZXRQb2ludGVySWQoZXZlbnQpLFxuICAgICAgICAgIHBvaW50ZXJUeXBlLFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQudHlwZSxcbiAgICAgICAgICBjdXJFdmVudFRhcmdldCxcbiAgICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZ2V0SW50ZXJhY3Rpb24oc2VhcmNoRGV0YWlscylcblxuICAgICAgICBtYXRjaGVzLnB1c2goW1xuICAgICAgICAgIHNlYXJjaERldGFpbHMucG9pbnRlcixcbiAgICAgICAgICBzZWFyY2hEZXRhaWxzLmV2ZW50VGFyZ2V0LFxuICAgICAgICAgIHNlYXJjaERldGFpbHMuY3VyRXZlbnRUYXJnZXQsXG4gICAgICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICAgIF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZvciAoY29uc3QgW3BvaW50ZXIsIGV2ZW50VGFyZ2V0LCBjdXJFdmVudFRhcmdldCwgaW50ZXJhY3Rpb25dIG9mIG1hdGNoZXMpIHtcbiAgICAgIGludGVyYWN0aW9uW21ldGhvZF0ocG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBjdXJFdmVudFRhcmdldClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJhY3Rpb24gKHNlYXJjaERldGFpbHM6IFNlYXJjaERldGFpbHMpIHtcbiAgY29uc3QgeyBwb2ludGVyVHlwZSwgc2NvcGUgfSA9IHNlYXJjaERldGFpbHNcblxuICBjb25zdCBmb3VuZEludGVyYWN0aW9uID0gZmluZGVyLnNlYXJjaChzZWFyY2hEZXRhaWxzKVxuICBjb25zdCBzaWduYWxBcmcgPSB7IGludGVyYWN0aW9uOiBmb3VuZEludGVyYWN0aW9uLCBzZWFyY2hEZXRhaWxzIH1cblxuICBzY29wZS5maXJlKCdpbnRlcmFjdGlvbnM6ZmluZCcsIHNpZ25hbEFyZylcblxuICByZXR1cm4gc2lnbmFsQXJnLmludGVyYWN0aW9uIHx8IHNjb3BlLmludGVyYWN0aW9ucy5uZXcoeyBwb2ludGVyVHlwZSB9KVxufVxuXG5mdW5jdGlvbiBvbkRvY1NpZ25hbDxUIGV4dGVuZHMgJ3Njb3BlOmFkZC1kb2N1bWVudCcgfCAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50Jz4gKHsgZG9jLCBzY29wZSwgb3B0aW9ucyB9OiBJbnRlcmFjdC5TaWduYWxBcmdzW1RdLCBldmVudE1ldGhvZE5hbWU6ICdhZGQnIHwgJ3JlbW92ZScpIHtcbiAgY29uc3QgeyBkb2NFdmVudHMgfSA9IHNjb3BlLmludGVyYWN0aW9uc1xuICBjb25zdCBldmVudE1ldGhvZCA9IGV2ZW50c1tldmVudE1ldGhvZE5hbWVdXG5cbiAgaWYgKHNjb3BlLmJyb3dzZXIuaXNJT1MgJiYgIW9wdGlvbnMuZXZlbnRzKSB7XG4gICAgb3B0aW9ucy5ldmVudHMgPSB7IHBhc3NpdmU6IGZhbHNlIH1cbiAgfVxuXG4gIC8vIGRlbGVnYXRlIGV2ZW50IGxpc3RlbmVyXG4gIGZvciAoY29uc3QgZXZlbnRUeXBlIGluIGV2ZW50cy5kZWxlZ2F0ZWRFdmVudHMpIHtcbiAgICBldmVudE1ldGhvZChkb2MsIGV2ZW50VHlwZSwgZXZlbnRzLmRlbGVnYXRlTGlzdGVuZXIpXG4gICAgZXZlbnRNZXRob2QoZG9jLCBldmVudFR5cGUsIGV2ZW50cy5kZWxlZ2F0ZVVzZUNhcHR1cmUsIHRydWUpXG4gIH1cblxuICBjb25zdCBldmVudE9wdGlvbnMgPSBvcHRpb25zICYmIG9wdGlvbnMuZXZlbnRzXG5cbiAgZm9yIChjb25zdCB7IHR5cGUsIGxpc3RlbmVyIH0gb2YgZG9jRXZlbnRzKSB7XG4gICAgZXZlbnRNZXRob2QoZG9jLCB0eXBlLCBsaXN0ZW5lciwgZXZlbnRPcHRpb25zKVxuICB9XG59XG5cbmNvbnN0IGludGVyYWN0aW9uczogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ2NvcmUvaW50ZXJhY3Rpb25zJyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ3Njb3BlOmFkZC1kb2N1bWVudCc6IGFyZyA9PiBvbkRvY1NpZ25hbChhcmcsICdhZGQnKSxcbiAgICAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JzogYXJnID0+IG9uRG9jU2lnbmFsKGFyZywgJ3JlbW92ZScpLFxuICAgICdpbnRlcmFjdGFibGU6dW5zZXQnOiAoeyBpbnRlcmFjdGFibGUgfSwgc2NvcGUpID0+IHtcbiAgICAgIC8vIFN0b3AgYW5kIGRlc3Ryb3kgcmVsYXRlZCBpbnRlcmFjdGlvbnMgd2hlbiBhbiBJbnRlcmFjdGFibGUgaXMgdW5zZXRcbiAgICAgIGZvciAobGV0IGkgPSBzY29wZS5pbnRlcmFjdGlvbnMubGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IHNjb3BlLmludGVyYWN0aW9ucy5saXN0W2ldXG5cbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSAhPT0gaW50ZXJhY3RhYmxlKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICBpbnRlcmFjdGlvbi5zdG9wKClcbiAgICAgICAgc2NvcGUuZmlyZSgnaW50ZXJhY3Rpb25zOmRlc3Ryb3knLCB7IGludGVyYWN0aW9uIH0pXG4gICAgICAgIGludGVyYWN0aW9uLmRlc3Ryb3koKVxuXG4gICAgICAgIGlmIChzY29wZS5pbnRlcmFjdGlvbnMubGlzdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3Quc3BsaWNlKGksIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBvbkRvY1NpZ25hbCxcbiAgZG9PbkludGVyYWN0aW9ucyxcbiAgbWV0aG9kTmFtZXMsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGludGVyYWN0aW9uc1xuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwZXMuZC50c1wiIC8+XG4iLCJleHBvcnQgZGVmYXVsdCAodGhpbmc6IGFueSkgPT4gISEodGhpbmcgJiYgdGhpbmcuV2luZG93KSAmJiAodGhpbmcgaW5zdGFuY2VvZiB0aGluZy5XaW5kb3cpXG4iLCJpbXBvcnQgaXNXaW5kb3cgZnJvbSAnLi9pc1dpbmRvdydcblxuY29uc3Qgd2luID0ge1xuICByZWFsV2luZG93OiB1bmRlZmluZWQgYXMgV2luZG93LFxuICB3aW5kb3c6IHVuZGVmaW5lZCBhcyBXaW5kb3csXG4gIGdldFdpbmRvdyxcbiAgaW5pdCxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKHdpbmRvdzogV2luZG93ICYgeyB3cmFwPzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgfSkge1xuICAvLyBnZXQgd3JhcHBlZCB3aW5kb3cgaWYgdXNpbmcgU2hhZG93IERPTSBwb2x5ZmlsbFxuXG4gIHdpbi5yZWFsV2luZG93ID0gd2luZG93XG5cbiAgLy8gY3JlYXRlIGEgVGV4dE5vZGVcbiAgY29uc3QgZWwgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpXG5cbiAgLy8gY2hlY2sgaWYgaXQncyB3cmFwcGVkIGJ5IGEgcG9seWZpbGxcbiAgaWYgKGVsLm93bmVyRG9jdW1lbnQgIT09IHdpbmRvdy5kb2N1bWVudCAmJlxuICAgICAgdHlwZW9mIHdpbmRvdy53cmFwID09PSAnZnVuY3Rpb24nICYmXG4gICAgd2luZG93LndyYXAoZWwpID09PSBlbCkge1xuICAgIC8vIHVzZSB3cmFwcGVkIHdpbmRvd1xuICAgIHdpbmRvdyA9IHdpbmRvdy53cmFwKHdpbmRvdylcbiAgfVxuXG4gIHdpbi53aW5kb3cgPSB3aW5kb3dcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbi53aW5kb3cgICAgID0gdW5kZWZpbmVkXG4gIHdpbi5yZWFsV2luZG93ID0gdW5kZWZpbmVkXG59XG5lbHNlIHtcbiAgaW5pdCh3aW5kb3cpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3cgKG5vZGU6IGFueSkge1xuICBpZiAoaXNXaW5kb3cobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgY29uc3Qgcm9vdE5vZGUgPSAobm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUpXG5cbiAgcmV0dXJuIHJvb3ROb2RlLmRlZmF1bHRWaWV3IHx8IHdpbi53aW5kb3dcbn1cblxud2luLmluaXQgPSBpbml0XG5cbmV4cG9ydCBkZWZhdWx0IHdpblxuIiwiLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxuXG5pbXBvcnQgaXNXaW5kb3cgZnJvbSAnLi9pc1dpbmRvdydcbmltcG9ydCB3aW4gZnJvbSAnLi93aW5kb3cnXG5cbmV4cG9ydCBjb25zdCB3aW5kb3cgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIFdpbmRvdyA9PlxuICB0aGluZyA9PT0gd2luLndpbmRvdyB8fCBpc1dpbmRvdyh0aGluZylcblxuZXhwb3J0IGNvbnN0IGRvY0ZyYWcgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIERvY3VtZW50RnJhZ21lbnQgPT5cbiAgb2JqZWN0KHRoaW5nKSAmJiB0aGluZy5ub2RlVHlwZSA9PT0gMTFcblxuZXhwb3J0IGNvbnN0IG9iamVjdCA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0+XG4gICEhdGhpbmcgJiYgKHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCcpXG5cbmV4cG9ydCBjb25zdCBmdW5jID0gKHRoaW5nOiBhbnkpOiB0aGluZyBpcyAoLi4uYXJnczogYW55W10pID0+IGFueSA9PlxuICB0eXBlb2YgdGhpbmcgPT09ICdmdW5jdGlvbidcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgbnVtYmVyID0+XG4gIHR5cGVvZiB0aGluZyA9PT0gJ251bWJlcidcblxuZXhwb3J0IGNvbnN0IGJvb2wgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIGJvb2xlYW4gPT5cbiAgdHlwZW9mIHRoaW5nID09PSAnYm9vbGVhbidcblxuZXhwb3J0IGNvbnN0IHN0cmluZyA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgc3RyaW5nID0+XG4gIHR5cGVvZiB0aGluZyA9PT0gJ3N0cmluZydcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnQgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIEludGVyYWN0LkVsZW1lbnQgPT4ge1xuICBpZiAoIXRoaW5nIHx8ICh0eXBlb2YgdGhpbmcgIT09ICdvYmplY3QnKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IF93aW5kb3cgPSB3aW4uZ2V0V2luZG93KHRoaW5nKSB8fCB3aW4ud2luZG93XG5cbiAgcmV0dXJuICgvb2JqZWN0fGZ1bmN0aW9uLy50ZXN0KHR5cGVvZiBfd2luZG93LkVsZW1lbnQpXG4gICAgPyB0aGluZyBpbnN0YW5jZW9mIF93aW5kb3cuRWxlbWVudCAvLyBET00yXG4gICAgOiB0aGluZy5ub2RlVHlwZSA9PT0gMSAmJiB0eXBlb2YgdGhpbmcubm9kZU5hbWUgPT09ICdzdHJpbmcnKVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5PYmplY3Q6IHR5cGVvZiBvYmplY3QgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9PlxuICBvYmplY3QodGhpbmcpICYmXG4gICEhdGhpbmcuY29uc3RydWN0b3IgJiZcbiAgL2Z1bmN0aW9uIE9iamVjdFxcYi8udGVzdCh0aGluZy5jb25zdHJ1Y3Rvci50b1N0cmluZygpKVxuXG5leHBvcnQgY29uc3QgYXJyYXkgPSA8VCBleHRlbmRzIHVua25vd24+KHRoaW5nOiBhbnkpOiB0aGluZyBpcyBUW10gPT5cbiAgKG9iamVjdCh0aGluZykgJiZcbiAgKHR5cGVvZiB0aGluZy5sZW5ndGggIT09ICd1bmRlZmluZWQnKSAmJlxuICBmdW5jKHRoaW5nLnNwbGljZSkpXG4iLCJpbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIGRyYWdnYWJsZTogRHJhZ2dhYmxlTWV0aG9kXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBkcmFnOiBJbnRlcmFjdC5EcmFnZ2FibGVPcHRpb25zXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbk1hcCB7XG4gICAgZHJhZz86IHR5cGVvZiBkcmFnXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgRHJhZ0V2ZW50ID0gSW50ZXJhY3QuSW50ZXJhY3RFdmVudDwnZHJhZyc+XG5cbmV4cG9ydCB0eXBlIERyYWdnYWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5EcmFnZ2FibGVPcHRpb25zPlxuXG5mdW5jdGlvbiBpbnN0YWxsIChzY29wZTogU2NvcGUpIHtcbiAgY29uc3Qge1xuICAgIGFjdGlvbnMsXG4gICAgSW50ZXJhY3RhYmxlLFxuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyYWdnYWJsZSA9IGRyYWcuZHJhZ2dhYmxlXG5cbiAgYWN0aW9ucy5tYXAuZHJhZyA9IGRyYWdcbiAgYWN0aW9ucy5tZXRob2REaWN0LmRyYWcgPSAnZHJhZ2dhYmxlJ1xuXG4gIGRlZmF1bHRzLmFjdGlvbnMuZHJhZyA9IGRyYWcuZGVmYXVsdHNcbn1cblxuZnVuY3Rpb24gYmVmb3JlTW92ZSAoeyBpbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICBjb25zdCBheGlzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpc1xuXG4gIGlmIChheGlzID09PSAneCcpIHtcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnBhZ2UueSAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueVxuICAgIGludGVyYWN0aW9uLmNvb3Jkcy5jdXIuY2xpZW50LnkgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQuY2xpZW50LnlcblxuICAgIGludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eS5jbGllbnQueSA9IDBcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHkucGFnZS55ICAgPSAwXG4gIH1cbiAgZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgaW50ZXJhY3Rpb24uY29vcmRzLmN1ci5wYWdlLnggICA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5wYWdlLnhcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLmNsaWVudC54ID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LmNsaWVudC54XG5cbiAgICBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHkuY2xpZW50LnggPSAwXG4gICAgaW50ZXJhY3Rpb24uY29vcmRzLnZlbG9jaXR5LnBhZ2UueCAgID0gMFxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdmUgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICBjb25zdCBheGlzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpc1xuXG4gIGlmIChheGlzID09PSAneCcgfHwgYXhpcyA9PT0gJ3knKSB7XG4gICAgY29uc3Qgb3Bwb3NpdGUgPSBheGlzID09PSAneCcgPyAneScgOiAneCdcblxuICAgIGlFdmVudC5wYWdlW29wcG9zaXRlXSAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2Vbb3Bwb3NpdGVdXG4gICAgaUV2ZW50LmNsaWVudFtvcHBvc2l0ZV0gPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQuY2xpZW50W29wcG9zaXRlXVxuICAgIGlFdmVudC5kZWx0YVtvcHBvc2l0ZV0gPSAwXG4gIH1cbn1cblxuLyoqXG4gKiBgYGBqc1xuICogaW50ZXJhY3QoZWxlbWVudCkuZHJhZ2dhYmxlKHtcbiAqICAgICBvbnN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICogICAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gKiAgICAgb25lbmQgIDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAqXG4gKiAgICAgLy8gdGhlIGF4aXMgaW4gd2hpY2ggdGhlIGZpcnN0IG1vdmVtZW50IG11c3QgYmVcbiAqICAgICAvLyBmb3IgdGhlIGRyYWcgc2VxdWVuY2UgdG8gc3RhcnRcbiAqICAgICAvLyAneHknIGJ5IGRlZmF1bHQgLSBhbnkgZGlyZWN0aW9uXG4gKiAgICAgc3RhcnRBeGlzOiAneCcgfHwgJ3knIHx8ICd4eScsXG4gKlxuICogICAgIC8vICd4eScgYnkgZGVmYXVsdCAtIGRvbid0IHJlc3RyaWN0IHRvIG9uZSBheGlzIChtb3ZlIGluIGFueSBkaXJlY3Rpb24pXG4gKiAgICAgLy8gJ3gnIG9yICd5JyB0byByZXN0cmljdCBtb3ZlbWVudCB0byBlaXRoZXIgYXhpc1xuICogICAgIC8vICdzdGFydCcgdG8gcmVzdHJpY3QgbW92ZW1lbnQgdG8gdGhlIGF4aXMgdGhlIGRyYWcgc3RhcnRlZCBpblxuICogICAgIGxvY2tBeGlzOiAneCcgfHwgJ3knIHx8ICd4eScgfHwgJ3N0YXJ0JyxcbiAqXG4gKiAgICAgLy8gbWF4IG51bWJlciBvZiBkcmFncyB0aGF0IGNhbiBoYXBwZW4gY29uY3VycmVudGx5XG4gKiAgICAgLy8gd2l0aCBlbGVtZW50cyBvZiB0aGlzIEludGVyYWN0YWJsZS4gSW5maW5pdHkgYnkgZGVmYXVsdFxuICogICAgIG1heDogSW5maW5pdHksXG4gKlxuICogICAgIC8vIG1heCBudW1iZXIgb2YgZHJhZ3MgdGhhdCBjYW4gdGFyZ2V0IHRoZSBzYW1lIGVsZW1lbnQrSW50ZXJhY3RhYmxlXG4gKiAgICAgLy8gMSBieSBkZWZhdWx0XG4gKiAgICAgbWF4UGVyRWxlbWVudDogMlxuICogfSlcbiAqXG4gKiB2YXIgaXNEcmFnZ2FibGUgPSBpbnRlcmFjdCgnZWxlbWVudCcpLmRyYWdnYWJsZSgpOyAvLyB0cnVlXG4gKiBgYGBcbiAqXG4gKiBHZXQgb3Igc2V0IHdoZXRoZXIgZHJhZyBhY3Rpb25zIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHRhcmdldFxuICpcbiAqIEBhbGlhcyBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyYWdnYWJsZVxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAqIGxpc3RlbmVycyB0byBiZSBmaXJlZCBvbiBkcmFnIGV2ZW50cyAob2JqZWN0IG1ha2VzIHRoZSBJbnRlcmFjdGFibGVcbiAqIGRyYWdnYWJsZSlcbiAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIGNhbiBiZSB0aGVcbiAqIHRhcmdldCBvZiBkcmFnIGV2ZW50cywgb3IgdGhpcyBJbnRlcmN0YWJsZVxuICovXG5jb25zdCBkcmFnZ2FibGU6IERyYWdnYWJsZU1ldGhvZCA9IGZ1bmN0aW9uIGRyYWdnYWJsZSAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zPzogSW50ZXJhY3QuRHJhZ2dhYmxlT3B0aW9ucyB8IGJvb2xlYW4pOiBhbnkge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgdGhpcy5vcHRpb25zLmRyYWcuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcbiAgICB0aGlzLnNldFBlckFjdGlvbignZHJhZycsIG9wdGlvbnMpXG4gICAgdGhpcy5zZXRPbkV2ZW50cygnZHJhZycsIG9wdGlvbnMpXG5cbiAgICBpZiAoL14oeHl8eHx5fHN0YXJ0KSQvLnRlc3Qob3B0aW9ucy5sb2NrQXhpcykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5kcmFnLmxvY2tBeGlzID0gb3B0aW9ucy5sb2NrQXhpc1xuICAgIH1cbiAgICBpZiAoL14oeHl8eHx5KSQvLnRlc3Qob3B0aW9ucy5zdGFydEF4aXMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZHJhZy5zdGFydEF4aXMgPSBvcHRpb25zLnN0YXJ0QXhpc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoaXMuYm9vbChvcHRpb25zKSkge1xuICAgIHRoaXMub3B0aW9ucy5kcmFnLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcmV0dXJuIHRoaXMub3B0aW9ucy5kcmFnXG59XG5cbmNvbnN0IGRyYWc6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhY3Rpb25zL2RyYWcnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGJlZm9yZU1vdmUsXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tcmVzdW1lJzogYmVmb3JlTW92ZSxcblxuICAgIC8vIGRyYWdtb3ZlXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IG1vdmUsXG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBhcmcgPT4ge1xuICAgICAgY29uc3QgeyBpbnRlcmFjdGlvbiwgaW50ZXJhY3RhYmxlLCBidXR0b25zIH0gPSBhcmdcbiAgICAgIGNvbnN0IGRyYWdPcHRpb25zID0gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJhZ1xuXG4gICAgICBpZiAoXG4gICAgICAgICEoZHJhZ09wdGlvbnMgJiYgZHJhZ09wdGlvbnMuZW5hYmxlZCkgfHxcbiAgICAgICAgLy8gY2hlY2sgbW91c2VCdXR0b24gc2V0dGluZyBpZiB0aGUgcG9pbnRlciBpcyBkb3duXG4gICAgICAgIChpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duICYmXG4gICAgICAgICAvbW91c2V8cG9pbnRlci8udGVzdChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSkgJiZcbiAgICAgICAoYnV0dG9ucyAmIGludGVyYWN0YWJsZS5vcHRpb25zLmRyYWcubW91c2VCdXR0b25zKSA9PT0gMClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGFyZy5hY3Rpb24gPSB7XG4gICAgICAgIG5hbWU6ICdkcmFnJyxcbiAgICAgICAgYXhpczogKGRyYWdPcHRpb25zLmxvY2tBeGlzID09PSAnc3RhcnQnXG4gICAgICAgICAgPyBkcmFnT3B0aW9ucy5zdGFydEF4aXNcbiAgICAgICAgICA6IGRyYWdPcHRpb25zLmxvY2tBeGlzKSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcbiAgfSxcbiAgZHJhZ2dhYmxlLFxuICBiZWZvcmVNb3ZlLFxuICBtb3ZlLFxuICBkZWZhdWx0czoge1xuICAgIHN0YXJ0QXhpcyA6ICd4eScsXG4gICAgbG9ja0F4aXMgIDogJ3h5JyxcbiAgfSBhcyBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnMsXG5cbiAgZ2V0Q3Vyc29yICgpIHtcbiAgICByZXR1cm4gJ21vdmUnXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWdcbiIsInR5cGUgRmlsdGVyPFQ+ID0gKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IGJvb2xlYW5cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zID0gPFQ+KGFycmF5OiBUW10sIHRhcmdldDogVCkgPT4gYXJyYXkuaW5kZXhPZih0YXJnZXQpICE9PSAtMVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlID0gPFQ+KGFycmF5OiBUW10sIHRhcmdldDogVCkgPT4gYXJyYXkuc3BsaWNlKGFycmF5LmluZGV4T2YodGFyZ2V0KSwgMSlcblxuZXhwb3J0IGNvbnN0IG1lcmdlID0gPFQsIFU+KHRhcmdldDogQXJyYXk8VCB8IFU+LCBzb3VyY2U6IFVbXSkgPT4ge1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKSB7XG4gICAgdGFyZ2V0LnB1c2goaXRlbSlcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRcbn1cblxuZXhwb3J0IGNvbnN0IGZyb20gPSA8VCA9IGFueT4oc291cmNlOiBBcnJheUxpa2U8VD4pID0+IG1lcmdlKFtdIGFzIFRbXSwgc291cmNlIGFzIFRbXSlcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihhcnJheTogVFtdLCBmdW5jOiBGaWx0ZXI8VD4pID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmdW5jKGFycmF5W2ldLCBpLCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbmV4cG9ydCBjb25zdCBmaW5kID0gPFQgPSBhbnk+KGFycmF5OiBUW10sIGZ1bmM6IEZpbHRlcjxUPikgPT4gYXJyYXlbZmluZEluZGV4KGFycmF5LCBmdW5jKV1cbiIsImNvbnN0IGRvbU9iamVjdHM6IHtcbiAgaW5pdDogYW55XG4gIGRvY3VtZW50OiBEb2N1bWVudFxuICBEb2N1bWVudEZyYWdtZW50OiB0eXBlb2YgRG9jdW1lbnRGcmFnbWVudFxuICBTVkdFbGVtZW50OiB0eXBlb2YgU1ZHRWxlbWVudFxuICBTVkdTVkdFbGVtZW50OiB0eXBlb2YgU1ZHU1ZHRWxlbWVudFxuICBTVkdFbGVtZW50SW5zdGFuY2U6IGFueVxuICBFbGVtZW50OiB0eXBlb2YgRWxlbWVudFxuICBIVE1MRWxlbWVudDogdHlwZW9mIEhUTUxFbGVtZW50XG4gIEV2ZW50OiB0eXBlb2YgRXZlbnRcbiAgVG91Y2g6IHR5cGVvZiBUb3VjaFxuICBQb2ludGVyRXZlbnQ6IHR5cGVvZiBQb2ludGVyRXZlbnRcbn0gPVxue1xuICBpbml0LFxuICBkb2N1bWVudDogbnVsbCxcbiAgRG9jdW1lbnRGcmFnbWVudDogbnVsbCxcbiAgU1ZHRWxlbWVudDogbnVsbCxcbiAgU1ZHU1ZHRWxlbWVudDogbnVsbCxcbiAgU1ZHRWxlbWVudEluc3RhbmNlOiBudWxsLFxuICBFbGVtZW50OiBudWxsLFxuICBIVE1MRWxlbWVudDogbnVsbCxcbiAgRXZlbnQ6IG51bGwsXG4gIFRvdWNoOiBudWxsLFxuICBQb2ludGVyRXZlbnQ6IG51bGwsXG59XG5cbmZ1bmN0aW9uIGJsYW5rICgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGRvbU9iamVjdHNcblxuZnVuY3Rpb24gaW5pdCAod2luZG93OiBXaW5kb3cpIHtcbiAgY29uc3Qgd2luID0gd2luZG93IGFzIGFueVxuXG4gIGRvbU9iamVjdHMuZG9jdW1lbnQgICAgICAgICAgID0gd2luLmRvY3VtZW50XG4gIGRvbU9iamVjdHMuRG9jdW1lbnRGcmFnbWVudCAgID0gd2luLkRvY3VtZW50RnJhZ21lbnQgICB8fCBibGFua1xuICBkb21PYmplY3RzLlNWR0VsZW1lbnQgICAgICAgICA9IHdpbi5TVkdFbGVtZW50ICAgICAgICAgfHwgYmxhbmtcbiAgZG9tT2JqZWN0cy5TVkdTVkdFbGVtZW50ICAgICAgPSB3aW4uU1ZHU1ZHRWxlbWVudCAgICAgIHx8IGJsYW5rXG4gIGRvbU9iamVjdHMuU1ZHRWxlbWVudEluc3RhbmNlID0gd2luLlNWR0VsZW1lbnRJbnN0YW5jZSB8fCBibGFua1xuICBkb21PYmplY3RzLkVsZW1lbnQgICAgICAgICAgICA9IHdpbi5FbGVtZW50ICAgICAgICAgICAgfHwgYmxhbmtcbiAgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAgICAgICAgPSB3aW4uSFRNTEVsZW1lbnQgICAgICAgIHx8IGRvbU9iamVjdHMuRWxlbWVudFxuXG4gIGRvbU9iamVjdHMuRXZlbnQgICAgICAgID0gd2luLkV2ZW50XG4gIGRvbU9iamVjdHMuVG91Y2ggICAgICAgID0gd2luLlRvdWNoIHx8IGJsYW5rXG4gIGRvbU9iamVjdHMuUG9pbnRlckV2ZW50ID0gKHdpbi5Qb2ludGVyRXZlbnQgfHwgd2luLk1TUG9pbnRlckV2ZW50KVxufVxuIiwiaW1wb3J0IGRvbU9iamVjdHMgZnJvbSAnLi9kb21PYmplY3RzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCB3aW4gZnJvbSAnLi93aW5kb3cnXG5cbmNvbnN0IGJyb3dzZXIgPSB7XG4gIGluaXQsXG4gIHN1cHBvcnRzVG91Y2g6IG51bGwgYXMgYm9vbGVhbixcbiAgc3VwcG9ydHNQb2ludGVyRXZlbnQ6IG51bGwgYXMgYm9vbGVhbixcbiAgaXNJT1M3OiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzSU9TOiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzSWU5OiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzT3BlcmFNb2JpbGU6IG51bGwgYXMgYm9vbGVhbixcbiAgcHJlZml4ZWRNYXRjaGVzU2VsZWN0b3I6IG51bGwgYXMgc3RyaW5nLFxuICBwRXZlbnRUeXBlczogbnVsbCBhcyB7XG4gICAgdXA6IHN0cmluZ1xuICAgIGRvd246IHN0cmluZ1xuICAgIG92ZXI6IHN0cmluZ1xuICAgIG91dDogc3RyaW5nXG4gICAgbW92ZTogc3RyaW5nXG4gICAgY2FuY2VsOiBzdHJpbmdcbiAgfSxcbiAgd2hlZWxFdmVudDogbnVsbCBhcyBzdHJpbmcsXG59XG5cbmZ1bmN0aW9uIGluaXQgKHdpbmRvdzogYW55KSB7XG4gIGNvbnN0IEVsZW1lbnQgPSBkb21PYmplY3RzLkVsZW1lbnRcbiAgY29uc3QgbmF2aWdhdG9yICA9IHdpbi53aW5kb3cubmF2aWdhdG9yXG5cbiAgLy8gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IHRvdWNoIGlucHV0P1xuICBicm93c2VyLnN1cHBvcnRzVG91Y2ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KSB8fFxuICAgIChpcy5mdW5jKHdpbmRvdy5Eb2N1bWVudFRvdWNoKSAmJiBkb21PYmplY3RzLmRvY3VtZW50IGluc3RhbmNlb2Ygd2luZG93LkRvY3VtZW50VG91Y2gpXG5cbiAgLy8gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IFBvaW50ZXJFdmVudHNcbiAgYnJvd3Nlci5zdXBwb3J0c1BvaW50ZXJFdmVudCA9IG5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCAhPT0gZmFsc2UgJiYgISFkb21PYmplY3RzLlBvaW50ZXJFdmVudFxuXG4gIGJyb3dzZXIuaXNJT1MgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkpXG5cbiAgLy8gc2Nyb2xsaW5nIGRvZXNuJ3QgY2hhbmdlIHRoZSByZXN1bHQgb2YgZ2V0Q2xpZW50UmVjdHMgb24gaU9TIDdcbiAgYnJvd3Nlci5pc0lPUzcgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgJiZcbiAgICAgICAgICAgL09TIDdbXlxcZF0vLnRlc3QobmF2aWdhdG9yLmFwcFZlcnNpb24pKVxuXG4gIGJyb3dzZXIuaXNJZTkgPSAvTVNJRSA5Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgLy8gT3BlcmEgTW9iaWxlIG11c3QgYmUgaGFuZGxlZCBkaWZmZXJlbnRseVxuICBicm93c2VyLmlzT3BlcmFNb2JpbGUgPSAobmF2aWdhdG9yLmFwcE5hbWUgPT09ICdPcGVyYScgJiZcbiAgICBicm93c2VyLnN1cHBvcnRzVG91Y2ggJiZcbiAgICAvUHJlc3RvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKVxuXG4gIC8vIHByZWZpeCBtYXRjaGVzU2VsZWN0b3JcbiAgYnJvd3Nlci5wcmVmaXhlZE1hdGNoZXNTZWxlY3RvciA9ICdtYXRjaGVzJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgID8gJ21hdGNoZXMnXG4gICAgOiAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgICAgPyAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJ1xuICAgICAgOiAnbW96TWF0Y2hlc1NlbGVjdG9yJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgICAgICA/ICdtb3pNYXRjaGVzU2VsZWN0b3InXG4gICAgICAgIDogJ29NYXRjaGVzU2VsZWN0b3InIGluIEVsZW1lbnQucHJvdG90eXBlXG4gICAgICAgICAgPyAnb01hdGNoZXNTZWxlY3RvcidcbiAgICAgICAgICA6ICdtc01hdGNoZXNTZWxlY3RvcidcblxuICBicm93c2VyLnBFdmVudFR5cGVzID0gKGJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnRcbiAgICA/IChkb21PYmplY3RzLlBvaW50ZXJFdmVudCA9PT0gd2luZG93Lk1TUG9pbnRlckV2ZW50XG4gICAgICA/IHtcbiAgICAgICAgdXA6ICAgICAnTVNQb2ludGVyVXAnLFxuICAgICAgICBkb3duOiAgICdNU1BvaW50ZXJEb3duJyxcbiAgICAgICAgb3ZlcjogICAnbW91c2VvdmVyJyxcbiAgICAgICAgb3V0OiAgICAnbW91c2VvdXQnLFxuICAgICAgICBtb3ZlOiAgICdNU1BvaW50ZXJNb3ZlJyxcbiAgICAgICAgY2FuY2VsOiAnTVNQb2ludGVyQ2FuY2VsJyxcbiAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICB1cDogICAgICdwb2ludGVydXAnLFxuICAgICAgICBkb3duOiAgICdwb2ludGVyZG93bicsXG4gICAgICAgIG92ZXI6ICAgJ3BvaW50ZXJvdmVyJyxcbiAgICAgICAgb3V0OiAgICAncG9pbnRlcm91dCcsXG4gICAgICAgIG1vdmU6ICAgJ3BvaW50ZXJtb3ZlJyxcbiAgICAgICAgY2FuY2VsOiAncG9pbnRlcmNhbmNlbCcsXG4gICAgICB9KVxuICAgIDogbnVsbClcblxuICAvLyBiZWNhdXNlIFdlYmtpdCBhbmQgT3BlcmEgc3RpbGwgdXNlICdtb3VzZXdoZWVsJyBldmVudCB0eXBlXG4gIGJyb3dzZXIud2hlZWxFdmVudCA9ICdvbm1vdXNld2hlZWwnIGluIGRvbU9iamVjdHMuZG9jdW1lbnQgPyAnbW91c2V3aGVlbCcgOiAnd2hlZWwnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGJyb3dzZXJcbiIsImltcG9ydCAqIGFzIGFyciBmcm9tICcuL2FycidcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBiYW4tdHlwZXNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsb25lPFQgZXh0ZW5kcyBPYmplY3Q+IChzb3VyY2U6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgZGVzdCA9IHt9IGFzIFBhcnRpYWw8VD5cblxuICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbcHJvcF1cblxuICAgIGlmIChpcy5wbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGRlc3RbcHJvcF0gPSBjbG9uZSh2YWx1ZSkgYXMgYW55XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLmFycmF5KHZhbHVlKSkge1xuICAgICAgZGVzdFtwcm9wXSA9IGFyci5mcm9tKHZhbHVlKSBhcyB0eXBlb2YgdmFsdWVcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkZXN0W3Byb3BdID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVzdFxufVxuIiwiaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi9icm93c2VyJ1xuaW1wb3J0IGRvbU9iamVjdHMgZnJvbSAnLi9kb21PYmplY3RzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCB3aW4sIHsgZ2V0V2luZG93IH0gZnJvbSAnLi93aW5kb3cnXG5cbmV4cG9ydCBmdW5jdGlvbiBub2RlQ29udGFpbnMgKHBhcmVudDogTm9kZSB8IEludGVyYWN0LkV2ZW50VGFyZ2V0LCBjaGlsZDogTm9kZSB8IEludGVyYWN0LkV2ZW50VGFyZ2V0KSB7XG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGlmIChjaGlsZCA9PT0gcGFyZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNoaWxkID0gKGNoaWxkIGFzIE5vZGUpLnBhcmVudE5vZGVcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VzdCAoZWxlbWVudDogTm9kZSwgc2VsZWN0b3I6IHN0cmluZykge1xuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIGlmIChtYXRjaGVzU2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3IpKSB7IHJldHVybiBlbGVtZW50IH1cblxuICAgIGVsZW1lbnQgPSBwYXJlbnROb2RlKGVsZW1lbnQpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyZW50Tm9kZSAobm9kZTogTm9kZSB8IERvY3VtZW50KSB7XG4gIGxldCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGVcblxuICBpZiAoaXMuZG9jRnJhZyhwYXJlbnQpKSB7XG4gICAgLy8gc2tpcCBwYXN0ICNzaGFkby1yb290IGZyYWdtZW50c1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIHdoaWxlICgocGFyZW50ID0gKHBhcmVudCBhcyBhbnkpLmhvc3QpICYmIGlzLmRvY0ZyYWcocGFyZW50KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICByZXR1cm4gcGFyZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgLy8gcmVtb3ZlIC9kZWVwLyBmcm9tIHNlbGVjdG9ycyBpZiBzaGFkb3dET00gcG9seWZpbGwgaXMgdXNlZFxuICBpZiAod2luLndpbmRvdyAhPT0gd2luLnJlYWxXaW5kb3cpIHtcbiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoL1xcL2RlZXBcXC8vZywgJyAnKVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRbYnJvd3Nlci5wcmVmaXhlZE1hdGNoZXNTZWxlY3Rvcl0oc2VsZWN0b3IpXG59XG5cbmNvbnN0IGdldFBhcmVudCA9IGVsID0+IGVsLnBhcmVudE5vZGUgPyBlbC5wYXJlbnROb2RlIDogZWwuaG9zdFxuXG4vLyBUZXN0IGZvciB0aGUgZWxlbWVudCB0aGF0J3MgXCJhYm92ZVwiIGFsbCBvdGhlciBxdWFsaWZpZXJzXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZkRlZXBlc3RFbGVtZW50IChlbGVtZW50czogSW50ZXJhY3QuRWxlbWVudFtdIHwgTm9kZUxpc3RPZjxFbGVtZW50Pikge1xuICBsZXQgZGVlcGVzdFpvbmVQYXJlbnRzID0gW11cbiAgbGV0IGRlZXBlc3Rab25lID0gZWxlbWVudHNbMF1cbiAgbGV0IGluZGV4ID0gZGVlcGVzdFpvbmUgPyAwIDogLTFcbiAgbGV0IGlcbiAgbGV0IG5cblxuICBmb3IgKGkgPSAxOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkcm9wem9uZSA9IGVsZW1lbnRzW2ldXG5cbiAgICAvLyBhbiBlbGVtZW50IG1pZ2h0IGJlbG9uZyB0byBtdWx0aXBsZSBzZWxlY3RvciBkcm9wem9uZXNcbiAgICBpZiAoIWRyb3B6b25lIHx8IGRyb3B6b25lID09PSBkZWVwZXN0Wm9uZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIWRlZXBlc3Rab25lKSB7XG4gICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICBpbmRleCA9IGlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGRlZXBlc3Qgb3IgY3VycmVudCBhcmUgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LnJvb3RFbGVtZW50XG4gICAgLy8gLSBpZiB0aGUgY3VycmVudCBkcm9wem9uZSBpcywgZG8gbm90aGluZyBhbmQgY29udGludWVcbiAgICBpZiAoZHJvcHpvbmUucGFyZW50Tm9kZSA9PT0gZHJvcHpvbmUub3duZXJEb2N1bWVudCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgLy8gLSBpZiBkZWVwZXN0IGlzLCB1cGRhdGUgd2l0aCB0aGUgY3VycmVudCBkcm9wem9uZSBhbmQgY29udGludWUgdG8gbmV4dFxuICAgIGVsc2UgaWYgKGRlZXBlc3Rab25lLnBhcmVudE5vZGUgPT09IGRyb3B6b25lLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIGRlZXBlc3Rab25lID0gZHJvcHpvbmVcbiAgICAgIGluZGV4ID0gaVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHpJbmRleCBvZiBzaWJsaW5nc1xuICAgIGlmIChkcm9wem9uZS5wYXJlbnROb2RlID09PSBkZWVwZXN0Wm9uZS5wYXJlbnROb2RlKSB7XG4gICAgICBjb25zdCBkZWVwZXN0WkluZGV4ID0gcGFyc2VJbnQoZ2V0V2luZG93KGRlZXBlc3Rab25lKS5nZXRDb21wdXRlZFN0eWxlKGRlZXBlc3Rab25lKS56SW5kZXgsIDEwKSB8fCAwXG4gICAgICBjb25zdCBkcm9wem9uZVpJbmRleCA9IHBhcnNlSW50KGdldFdpbmRvdyhkcm9wem9uZSkuZ2V0Q29tcHV0ZWRTdHlsZShkcm9wem9uZSkuekluZGV4LCAxMCkgfHwgMFxuXG4gICAgICBpZiAoZHJvcHpvbmVaSW5kZXggPj0gZGVlcGVzdFpJbmRleCkge1xuICAgICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICAgIGluZGV4ID0gaVxuICAgICAgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIHBvcHVsYXRlIHRoZSBhbmNlc3RyeSBhcnJheSBmb3IgdGhlIGxhdGVzdCBkZWVwZXN0IGRyb3B6b25lXG4gICAgaWYgKCFkZWVwZXN0Wm9uZVBhcmVudHMubGVuZ3RoKSB7XG4gICAgICBsZXQgcGFyZW50ID0gZGVlcGVzdFpvbmVcbiAgICAgIGxldCBwYXJlbnRQYXJlbnRcblxuICAgICAgd2hpbGUgKChwYXJlbnRQYXJlbnQgPSBnZXRQYXJlbnQocGFyZW50KSkgJiYgcGFyZW50UGFyZW50ICE9PSBwYXJlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgICBkZWVwZXN0Wm9uZVBhcmVudHMudW5zaGlmdChwYXJlbnQpXG4gICAgICAgIHBhcmVudCA9IHBhcmVudFBhcmVudFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwYXJlbnRcblxuICAgIC8vIGlmIHRoaXMgZWxlbWVudCBpcyBhbiBzdmcgZWxlbWVudCBhbmQgdGhlIGN1cnJlbnQgZGVlcGVzdCBpcyBhblxuICAgIC8vIEhUTUxFbGVtZW50XG4gICAgaWYgKGRlZXBlc3Rab25lIGluc3RhbmNlb2YgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAmJlxuICAgICAgICBkcm9wem9uZSBpbnN0YW5jZW9mIGRvbU9iamVjdHMuU1ZHRWxlbWVudCAmJlxuICAgICAgICAhKGRyb3B6b25lIGluc3RhbmNlb2YgZG9tT2JqZWN0cy5TVkdTVkdFbGVtZW50KSkge1xuICAgICAgaWYgKGRyb3B6b25lID09PSBkZWVwZXN0Wm9uZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IGRyb3B6b25lLm93bmVyU1ZHRWxlbWVudFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHBhcmVudCA9IGRyb3B6b25lXG4gICAgfVxuXG4gICAgY29uc3QgZHJvcHpvbmVQYXJlbnRzID0gW11cblxuICAgIHdoaWxlIChwYXJlbnQucGFyZW50Tm9kZSAhPT0gcGFyZW50Lm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIGRyb3B6b25lUGFyZW50cy51bnNoaWZ0KHBhcmVudClcbiAgICAgIHBhcmVudCA9IGdldFBhcmVudChwYXJlbnQpXG4gICAgfVxuXG4gICAgbiA9IDBcblxuICAgIC8vIGdldCAocG9zaXRpb24gb2YgbGFzdCBjb21tb24gYW5jZXN0b3IpICsgMVxuICAgIHdoaWxlIChkcm9wem9uZVBhcmVudHNbbl0gJiYgZHJvcHpvbmVQYXJlbnRzW25dID09PSBkZWVwZXN0Wm9uZVBhcmVudHNbbl0pIHtcbiAgICAgIG4rK1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudHMgPSBbXG4gICAgICBkcm9wem9uZVBhcmVudHNbbiAtIDFdLFxuICAgICAgZHJvcHpvbmVQYXJlbnRzW25dLFxuICAgICAgZGVlcGVzdFpvbmVQYXJlbnRzW25dLFxuICAgIF1cblxuICAgIGxldCBjaGlsZCA9IHBhcmVudHNbMF0ubGFzdENoaWxkXG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZCA9PT0gcGFyZW50c1sxXSkge1xuICAgICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICAgIGluZGV4ID0gaVxuICAgICAgICBkZWVwZXN0Wm9uZVBhcmVudHMgPSBkcm9wem9uZVBhcmVudHNcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoY2hpbGQgPT09IHBhcmVudHNbMl0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmdcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5kZXhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNVcFRvIChlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nLCBsaW1pdDogTm9kZSkge1xuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIGlmIChtYXRjaGVzU2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGVsZW1lbnQgPSBwYXJlbnROb2RlKGVsZW1lbnQpIGFzIEludGVyYWN0LkVsZW1lbnRcblxuICAgIGlmIChlbGVtZW50ID09PSBsaW1pdCkge1xuICAgICAgcmV0dXJuIG1hdGNoZXNTZWxlY3RvcihlbGVtZW50LCBzZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdHVhbEVsZW1lbnQgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpIHtcbiAgcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgZG9tT2JqZWN0cy5TVkdFbGVtZW50SW5zdGFuY2VcbiAgICA/IChlbGVtZW50IGFzIFNWR0VsZW1lbnQpLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50XG4gICAgOiBlbGVtZW50KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Nyb2xsWFkgKHJlbGV2YW50V2luZG93KSB7XG4gIHJlbGV2YW50V2luZG93ID0gcmVsZXZhbnRXaW5kb3cgfHwgd2luLndpbmRvd1xuICByZXR1cm4ge1xuICAgIHg6IHJlbGV2YW50V2luZG93LnNjcm9sbFggfHwgcmVsZXZhbnRXaW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgeTogcmVsZXZhbnRXaW5kb3cuc2Nyb2xsWSB8fCByZWxldmFudFdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50Q2xpZW50UmVjdCAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICBjb25zdCBjbGllbnRSZWN0ID0gKGVsZW1lbnQgaW5zdGFuY2VvZiBkb21PYmplY3RzLlNWR0VsZW1lbnRcbiAgICA/IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICA6IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKVswXSlcblxuICByZXR1cm4gY2xpZW50UmVjdCAmJiB7XG4gICAgbGVmdCAgOiBjbGllbnRSZWN0LmxlZnQsXG4gICAgcmlnaHQgOiBjbGllbnRSZWN0LnJpZ2h0LFxuICAgIHRvcCAgIDogY2xpZW50UmVjdC50b3AsXG4gICAgYm90dG9tOiBjbGllbnRSZWN0LmJvdHRvbSxcbiAgICB3aWR0aCA6IGNsaWVudFJlY3Qud2lkdGggIHx8IGNsaWVudFJlY3QucmlnaHQgIC0gY2xpZW50UmVjdC5sZWZ0LFxuICAgIGhlaWdodDogY2xpZW50UmVjdC5oZWlnaHQgfHwgY2xpZW50UmVjdC5ib3R0b20gLSBjbGllbnRSZWN0LnRvcCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudFJlY3QgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpIHtcbiAgY29uc3QgY2xpZW50UmVjdCA9IGdldEVsZW1lbnRDbGllbnRSZWN0KGVsZW1lbnQpXG5cbiAgaWYgKCFicm93c2VyLmlzSU9TNyAmJiBjbGllbnRSZWN0KSB7XG4gICAgY29uc3Qgc2Nyb2xsID0gZ2V0U2Nyb2xsWFkod2luLmdldFdpbmRvdyhlbGVtZW50KSlcblxuICAgIGNsaWVudFJlY3QubGVmdCAgICs9IHNjcm9sbC54XG4gICAgY2xpZW50UmVjdC5yaWdodCAgKz0gc2Nyb2xsLnhcbiAgICBjbGllbnRSZWN0LnRvcCAgICArPSBzY3JvbGwueVxuICAgIGNsaWVudFJlY3QuYm90dG9tICs9IHNjcm9sbC55XG4gIH1cblxuICByZXR1cm4gY2xpZW50UmVjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aCAobm9kZTogTm9kZSB8IERvY3VtZW50KSB7XG4gIGNvbnN0IHBhdGggPSBbXVxuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgcGF0aC5wdXNoKG5vZGUpXG4gICAgbm9kZSA9IHBhcmVudE5vZGUobm9kZSlcbiAgfVxuXG4gIHJldHVybiBwYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlTZWxlY3RvciAodmFsdWUpIHtcbiAgaWYgKCFpcy5zdHJpbmcodmFsdWUpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGlmIGl0IGlzIGludmFsaWRcbiAgZG9tT2JqZWN0cy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHZhbHVlKVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBQb2ludGVyRXh0ZW5kIHtcbiAgd2Via2l0OiBSZWdFeHBcbiAgW3ByZWZpeDogc3RyaW5nXTogUmVnRXhwXG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJFeHRlbmQgKGRlc3QsIHNvdXJjZSkge1xuICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgY29uc3QgcHJlZml4ZWRQcm9wUkVzID0gcG9pbnRlckV4dGVuZC5wcmVmaXhlZFByb3BSRXNcbiAgICBsZXQgZGVwcmVjYXRlZCA9IGZhbHNlXG5cbiAgICAvLyBza2lwIGRlcHJlY2F0ZWQgcHJlZml4ZWQgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3QgdmVuZG9yIGluIHByZWZpeGVkUHJvcFJFcykge1xuICAgICAgaWYgKHByb3AuaW5kZXhPZih2ZW5kb3IpID09PSAwICYmIHByZWZpeGVkUHJvcFJFc1t2ZW5kb3JdLnRlc3QocHJvcCkpIHtcbiAgICAgICAgZGVwcmVjYXRlZCA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWRlcHJlY2F0ZWQgJiYgdHlwZW9mIHNvdXJjZVtwcm9wXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVzdFtwcm9wXSA9IHNvdXJjZVtwcm9wXVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdFxufVxuXG5wb2ludGVyRXh0ZW5kLnByZWZpeGVkUHJvcFJFcyA9IHtcbiAgd2Via2l0OiAvKE1vdmVtZW50W1hZXXxSYWRpdXNbWFldfFJvdGF0aW9uQW5nbGV8Rm9yY2UpJC8sXG4gIG1vejogLyhQcmVzc3VyZSkkLyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcG9pbnRlckV4dGVuZFxuIiwiZXhwb3J0IGRlZmF1bHQgKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiAgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpXG4iLCJpbXBvcnQgYnJvd3NlciBmcm9tICcuL2Jyb3dzZXInXG5pbXBvcnQgZG9tIGZyb20gJy4vZG9tT2JqZWN0cydcbmltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJy4vZG9tVXRpbHMnXG5pbXBvcnQgaHlwb3QgZnJvbSAnLi9oeXBvdCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5pbXBvcnQgcG9pbnRlckV4dGVuZCBmcm9tICcuL3BvaW50ZXJFeHRlbmQnXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5Q29vcmRzIChkZXN0OiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIsIHNyYzogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIGRlc3QucGFnZSA9IGRlc3QucGFnZSB8fCB7fSBhcyBhbnlcbiAgZGVzdC5wYWdlLnggPSBzcmMucGFnZS54XG4gIGRlc3QucGFnZS55ID0gc3JjLnBhZ2UueVxuXG4gIGRlc3QuY2xpZW50ID0gZGVzdC5jbGllbnQgfHwge30gYXMgYW55XG4gIGRlc3QuY2xpZW50LnggPSBzcmMuY2xpZW50LnhcbiAgZGVzdC5jbGllbnQueSA9IHNyYy5jbGllbnQueVxuXG4gIGRlc3QudGltZVN0YW1wID0gc3JjLnRpbWVTdGFtcFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29vcmREZWx0YXMgKHRhcmdldE9iajogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyLCBwcmV2OiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIsIGN1cjogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIHRhcmdldE9iai5wYWdlLnggICAgPSBjdXIucGFnZS54ICAgIC0gcHJldi5wYWdlLnhcbiAgdGFyZ2V0T2JqLnBhZ2UueSAgICA9IGN1ci5wYWdlLnkgICAgLSBwcmV2LnBhZ2UueVxuICB0YXJnZXRPYmouY2xpZW50LnggID0gY3VyLmNsaWVudC54ICAtIHByZXYuY2xpZW50LnhcbiAgdGFyZ2V0T2JqLmNsaWVudC55ICA9IGN1ci5jbGllbnQueSAgLSBwcmV2LmNsaWVudC55XG4gIHRhcmdldE9iai50aW1lU3RhbXAgPSBjdXIudGltZVN0YW1wIC0gcHJldi50aW1lU3RhbXBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb3JkVmVsb2NpdHkgKHRhcmdldE9iajogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyLCBkZWx0YTogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIGNvbnN0IGR0ID0gTWF0aC5tYXgoZGVsdGEudGltZVN0YW1wIC8gMTAwMCwgMC4wMDEpXG5cbiAgdGFyZ2V0T2JqLnBhZ2UueCAgID0gZGVsdGEucGFnZS54IC8gZHRcbiAgdGFyZ2V0T2JqLnBhZ2UueSAgID0gZGVsdGEucGFnZS55IC8gZHRcbiAgdGFyZ2V0T2JqLmNsaWVudC54ID0gZGVsdGEuY2xpZW50LnggLyBkdFxuICB0YXJnZXRPYmouY2xpZW50LnkgPSBkZWx0YS5jbGllbnQueSAvIGR0XG4gIHRhcmdldE9iai50aW1lU3RhbXAgPSBkdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0WmVyb0Nvb3JkcyAodGFyZ2V0T2JqOiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIpIHtcbiAgdGFyZ2V0T2JqLnBhZ2UueCA9IDBcbiAgdGFyZ2V0T2JqLnBhZ2UueSA9IDBcbiAgdGFyZ2V0T2JqLmNsaWVudC54ID0gMFxuICB0YXJnZXRPYmouY2xpZW50LnkgPSAwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05hdGl2ZVBvaW50ZXIgIChwb2ludGVyOiBhbnkpIHtcbiAgcmV0dXJuIChwb2ludGVyIGluc3RhbmNlb2YgZG9tLkV2ZW50IHx8IHBvaW50ZXIgaW5zdGFuY2VvZiBkb20uVG91Y2gpXG59XG5cbi8vIEdldCBzcGVjaWZpZWQgWC9ZIGNvb3JkcyBmb3IgbW91c2Ugb3IgZXZlbnQudG91Y2hlc1swXVxuZXhwb3J0IGZ1bmN0aW9uIGdldFhZICh0eXBlLCBwb2ludGVyLCB4eSkge1xuICB4eSA9IHh5IHx8IHt9XG4gIHR5cGUgPSB0eXBlIHx8ICdwYWdlJ1xuXG4gIHh5LnggPSBwb2ludGVyW3R5cGUgKyAnWCddXG4gIHh5LnkgPSBwb2ludGVyW3R5cGUgKyAnWSddXG5cbiAgcmV0dXJuIHh5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdlWFkgKHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIHwgSW50ZXJhY3QuSW50ZXJhY3RFdmVudCwgcGFnZT86IEludGVyYWN0LlBvaW50KSB7XG4gIHBhZ2UgPSBwYWdlIHx8IHsgeDogMCwgeTogMCB9XG5cbiAgLy8gT3BlcmEgTW9iaWxlIGhhbmRsZXMgdGhlIHZpZXdwb3J0IGFuZCBzY3JvbGxpbmcgb2RkbHlcbiAgaWYgKGJyb3dzZXIuaXNPcGVyYU1vYmlsZSAmJiBpc05hdGl2ZVBvaW50ZXIocG9pbnRlcikpIHtcbiAgICBnZXRYWSgnc2NyZWVuJywgcG9pbnRlciwgcGFnZSlcblxuICAgIHBhZ2UueCArPSB3aW5kb3cuc2Nyb2xsWFxuICAgIHBhZ2UueSArPSB3aW5kb3cuc2Nyb2xsWVxuICB9XG4gIGVsc2Uge1xuICAgIGdldFhZKCdwYWdlJywgcG9pbnRlciwgcGFnZSlcbiAgfVxuXG4gIHJldHVybiBwYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGllbnRYWSAocG9pbnRlciwgY2xpZW50KSB7XG4gIGNsaWVudCA9IGNsaWVudCB8fCB7fVxuXG4gIGlmIChicm93c2VyLmlzT3BlcmFNb2JpbGUgJiYgaXNOYXRpdmVQb2ludGVyKHBvaW50ZXIpKSB7XG4gICAgLy8gT3BlcmEgTW9iaWxlIGhhbmRsZXMgdGhlIHZpZXdwb3J0IGFuZCBzY3JvbGxpbmcgb2RkbHlcbiAgICBnZXRYWSgnc2NyZWVuJywgcG9pbnRlciwgY2xpZW50KVxuICB9XG4gIGVsc2Uge1xuICAgIGdldFhZKCdjbGllbnQnLCBwb2ludGVyLCBjbGllbnQpXG4gIH1cblxuICByZXR1cm4gY2xpZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludGVySWQgKHBvaW50ZXIpIHtcbiAgcmV0dXJuIGlzLm51bWJlcihwb2ludGVyLnBvaW50ZXJJZCkgPyBwb2ludGVyLnBvaW50ZXJJZCA6IHBvaW50ZXIuaWRlbnRpZmllclxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29vcmRzICh0YXJnZXRPYmosIHBvaW50ZXJzOiBhbnlbXSwgdGltZVN0YW1wOiBudW1iZXIpIHtcbiAgY29uc3QgcG9pbnRlciA9IChwb2ludGVycy5sZW5ndGggPiAxXG4gICAgPyBwb2ludGVyQXZlcmFnZShwb2ludGVycylcbiAgICA6IHBvaW50ZXJzWzBdKVxuXG4gIGNvbnN0IHRtcFhZID0ge30gYXMgeyB4OiBudW1iZXIsIHk6IG51bWJlciB9XG5cbiAgZ2V0UGFnZVhZKHBvaW50ZXIsIHRtcFhZKVxuICB0YXJnZXRPYmoucGFnZS54ID0gdG1wWFkueFxuICB0YXJnZXRPYmoucGFnZS55ID0gdG1wWFkueVxuXG4gIGdldENsaWVudFhZKHBvaW50ZXIsIHRtcFhZKVxuICB0YXJnZXRPYmouY2xpZW50LnggPSB0bXBYWS54XG4gIHRhcmdldE9iai5jbGllbnQueSA9IHRtcFhZLnlcblxuICB0YXJnZXRPYmoudGltZVN0YW1wID0gdGltZVN0YW1wXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaFBhaXIgKGV2ZW50KSB7XG4gIGNvbnN0IHRvdWNoZXMgPSBbXVxuXG4gIC8vIGFycmF5IG9mIHRvdWNoZXMgaXMgc3VwcGxpZWRcbiAgaWYgKGlzLmFycmF5KGV2ZW50KSkge1xuICAgIHRvdWNoZXNbMF0gPSBldmVudFswXVxuICAgIHRvdWNoZXNbMV0gPSBldmVudFsxXVxuICB9XG4gIC8vIGFuIGV2ZW50XG4gIGVsc2Uge1xuICAgIGlmIChldmVudC50eXBlID09PSAndG91Y2hlbmQnKSB7XG4gICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdG91Y2hlc1swXSA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgICAgdG91Y2hlc1sxXSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0b3VjaGVzWzBdID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgICAgdG91Y2hlc1sxXSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzFdXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdG91Y2hlc1swXSA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgIHRvdWNoZXNbMV0gPSBldmVudC50b3VjaGVzWzFdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdWNoZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50ZXJBdmVyYWdlIChwb2ludGVyczogUG9pbnRlckV2ZW50W10gfCBFdmVudFtdKSB7XG4gIGNvbnN0IGF2ZXJhZ2UgPSB7XG4gICAgcGFnZVggIDogMCxcbiAgICBwYWdlWSAgOiAwLFxuICAgIGNsaWVudFg6IDAsXG4gICAgY2xpZW50WTogMCxcbiAgICBzY3JlZW5YOiAwLFxuICAgIHNjcmVlblk6IDAsXG4gIH1cblxuICBmb3IgKGNvbnN0IHBvaW50ZXIgb2YgcG9pbnRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gYXZlcmFnZSkge1xuICAgICAgYXZlcmFnZVtwcm9wXSArPSBwb2ludGVyW3Byb3BdXG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgcHJvcCBpbiBhdmVyYWdlKSB7XG4gICAgYXZlcmFnZVtwcm9wXSAvPSBwb2ludGVycy5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiBhdmVyYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b3VjaEJCb3ggKGV2ZW50OiBFdmVudCB8IEFycmF5PChJbnRlcmFjdC5Qb2ludGVyVHlwZSkgfCBUb3VjaEV2ZW50Pikge1xuICBpZiAoIShldmVudCBhcyBhbnkpLmxlbmd0aCAmJlxuICAgICAgISgoZXZlbnQgYXMgVG91Y2hFdmVudCkudG91Y2hlcyAmJlxuICAgICAgICAoZXZlbnQgYXMgVG91Y2hFdmVudCkudG91Y2hlcy5sZW5ndGggPiAxKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB0b3VjaGVzID0gZ2V0VG91Y2hQYWlyKGV2ZW50KVxuICBjb25zdCBtaW5YID0gTWF0aC5taW4odG91Y2hlc1swXS5wYWdlWCwgdG91Y2hlc1sxXS5wYWdlWClcbiAgY29uc3QgbWluWSA9IE1hdGgubWluKHRvdWNoZXNbMF0ucGFnZVksIHRvdWNoZXNbMV0ucGFnZVkpXG4gIGNvbnN0IG1heFggPSBNYXRoLm1heCh0b3VjaGVzWzBdLnBhZ2VYLCB0b3VjaGVzWzFdLnBhZ2VYKVxuICBjb25zdCBtYXhZID0gTWF0aC5tYXgodG91Y2hlc1swXS5wYWdlWSwgdG91Y2hlc1sxXS5wYWdlWSlcblxuICByZXR1cm4ge1xuICAgIHg6IG1pblgsXG4gICAgeTogbWluWSxcbiAgICBsZWZ0OiBtaW5YLFxuICAgIHRvcDogbWluWSxcbiAgICByaWdodDogbWF4WCxcbiAgICBib3R0b206IG1heFksXG4gICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoRGlzdGFuY2UgKGV2ZW50LCBkZWx0YVNvdXJjZSkge1xuICBjb25zdCBzb3VyY2VYID0gZGVsdGFTb3VyY2UgKyAnWCdcbiAgY29uc3Qgc291cmNlWSA9IGRlbHRhU291cmNlICsgJ1knXG4gIGNvbnN0IHRvdWNoZXMgPSBnZXRUb3VjaFBhaXIoZXZlbnQpXG5cbiAgY29uc3QgZHggPSB0b3VjaGVzWzBdW3NvdXJjZVhdIC0gdG91Y2hlc1sxXVtzb3VyY2VYXVxuICBjb25zdCBkeSA9IHRvdWNoZXNbMF1bc291cmNlWV0gLSB0b3VjaGVzWzFdW3NvdXJjZVldXG5cbiAgcmV0dXJuIGh5cG90KGR4LCBkeSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoQW5nbGUgKGV2ZW50LCBkZWx0YVNvdXJjZSkge1xuICBjb25zdCBzb3VyY2VYID0gZGVsdGFTb3VyY2UgKyAnWCdcbiAgY29uc3Qgc291cmNlWSA9IGRlbHRhU291cmNlICsgJ1knXG4gIGNvbnN0IHRvdWNoZXMgPSBnZXRUb3VjaFBhaXIoZXZlbnQpXG4gIGNvbnN0IGR4ID0gdG91Y2hlc1sxXVtzb3VyY2VYXSAtIHRvdWNoZXNbMF1bc291cmNlWF1cbiAgY29uc3QgZHkgPSB0b3VjaGVzWzFdW3NvdXJjZVldIC0gdG91Y2hlc1swXVtzb3VyY2VZXVxuICBjb25zdCBhbmdsZSA9IDE4MCAqIE1hdGguYXRhbjIoZHksIGR4KSAvIE1hdGguUElcblxuICByZXR1cm4gIGFuZ2xlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludGVyVHlwZSAocG9pbnRlcikge1xuICByZXR1cm4gaXMuc3RyaW5nKHBvaW50ZXIucG9pbnRlclR5cGUpXG4gICAgPyBwb2ludGVyLnBvaW50ZXJUeXBlXG4gICAgOiBpcy5udW1iZXIocG9pbnRlci5wb2ludGVyVHlwZSlcbiAgICAgID8gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAndG91Y2gnLCAncGVuJywgJ21vdXNlJ11bcG9pbnRlci5wb2ludGVyVHlwZV1cbiAgICAgIC8vIGlmIHRoZSBQb2ludGVyRXZlbnQgQVBJIGlzbid0IGF2YWlsYWJsZSwgdGhlbiB0aGUgXCJwb2ludGVyXCIgbXVzdFxuICAgICAgLy8gYmUgZWl0aGVyIGEgTW91c2VFdmVudCwgVG91Y2hFdmVudCwgb3IgVG91Y2ggb2JqZWN0XG4gICAgICA6IC90b3VjaC8udGVzdChwb2ludGVyLnR5cGUpIHx8IHBvaW50ZXIgaW5zdGFuY2VvZiBkb20uVG91Y2hcbiAgICAgICAgPyAndG91Y2gnXG4gICAgICAgIDogJ21vdXNlJ1xufVxuXG4vLyBbIGV2ZW50LnRhcmdldCwgZXZlbnQuY3VycmVudFRhcmdldCBdXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXRzIChldmVudCkge1xuICBjb25zdCBwYXRoID0gaXMuZnVuYyhldmVudC5jb21wb3NlZFBhdGgpID8gZXZlbnQuY29tcG9zZWRQYXRoKCkgOiBldmVudC5wYXRoXG5cbiAgcmV0dXJuIFtcbiAgICBkb21VdGlscy5nZXRBY3R1YWxFbGVtZW50KHBhdGggPyBwYXRoWzBdIDogZXZlbnQudGFyZ2V0KSxcbiAgICBkb21VdGlscy5nZXRBY3R1YWxFbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQpLFxuICBdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdDb29yZHMgKCk6IEludGVyYWN0LkNvb3Jkc1NldE1lbWJlciB7XG4gIHJldHVybiB7XG4gICAgcGFnZSAgICAgOiB7IHg6IDAsIHk6IDAgfSxcbiAgICBjbGllbnQgICA6IHsgeDogMCwgeTogMCB9LFxuICAgIHRpbWVTdGFtcDogMCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29vcmRzVG9FdmVudCAoY29vcmRzOiBNb2NrQ29vcmRzKSB7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIGNvb3JkcyxcbiAgICBnZXQgcGFnZSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5wYWdlIH0sXG4gICAgZ2V0IGNsaWVudCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5jbGllbnQgfSxcbiAgICBnZXQgdGltZVN0YW1wICgpIHsgcmV0dXJuIHRoaXMuY29vcmRzLnRpbWVTdGFtcCB9LFxuICAgIGdldCBwYWdlWCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5wYWdlLnggfSxcbiAgICBnZXQgcGFnZVkgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMucGFnZS55IH0sXG4gICAgZ2V0IGNsaWVudFggKCkgeyByZXR1cm4gdGhpcy5jb29yZHMuY2xpZW50LnggfSxcbiAgICBnZXQgY2xpZW50WSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5jbGllbnQueSB9LFxuICAgIGdldCBwb2ludGVySWQgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMucG9pbnRlcklkIH0sXG4gICAgZ2V0IHRhcmdldCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy50YXJnZXQgfSxcbiAgICBnZXQgdHlwZSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy50eXBlIH0sXG4gICAgZ2V0IHBvaW50ZXJUeXBlICgpIHsgcmV0dXJuIHRoaXMuY29vcmRzLnBvaW50ZXJUeXBlIH0sXG4gICAgZ2V0IGJ1dHRvbnMgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMuYnV0dG9ucyB9LFxuICAgIHByZXZlbnREZWZhdWx0ICgpIHt9LFxuICB9XG5cbiAgcmV0dXJuIGV2ZW50IGFzIHR5cGVvZiBldmVudCAmIEludGVyYWN0LlBvaW50ZXJUeXBlICYgSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vY2tDb29yZHMge1xuICBwYWdlOiBJbnRlcmFjdC5Qb2ludFxuICBjbGllbnQ6IEludGVyYWN0LlBvaW50XG4gIHRpbWVTdGFtcD86IG51bWJlclxuICBwb2ludGVySWQ/OiBhbnlcbiAgdGFyZ2V0PzogYW55XG4gIHR5cGU/OiBzdHJpbmdcbiAgcG9pbnRlclR5cGU/OiBzdHJpbmdcbiAgYnV0dG9ucz86IG51bWJlclxufVxuXG5leHBvcnQgeyBwb2ludGVyRXh0ZW5kIH1cbiIsImltcG9ydCB7IGNvbnRhaW5zIH0gZnJvbSAnLi9hcnInXG5pbXBvcnQgKiBhcyBkb21VdGlscyBmcm9tICcuL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCBwRXh0ZW5kIGZyb20gJy4vcG9pbnRlckV4dGVuZCdcbmltcG9ydCAqIGFzIHBvaW50ZXJVdGlscyBmcm9tICcuL3BvaW50ZXJVdGlscydcblxudHlwZSBMaXN0ZW5lciA9IChldmVudDogRXZlbnQgfCBGYWtlRXZlbnQpID0+IGFueVxuXG5jb25zdCBlbGVtZW50czogRXZlbnRUYXJnZXRbXSA9IFtdXG5jb25zdCB0YXJnZXRzOiBBcnJheTx7XG4gIGV2ZW50czogeyBbdHlwZTogc3RyaW5nXTogTGlzdGVuZXJbXSB9XG4gIHR5cGVDb3VudDogbnVtYmVyXG59PiA9IFtdXG5cbmNvbnN0IGRlbGVnYXRlZEV2ZW50czoge1xuICBbdHlwZTogc3RyaW5nXToge1xuICAgIHNlbGVjdG9yczogc3RyaW5nW11cbiAgICBjb250ZXh0czogTm9kZVtdXG4gICAgbGlzdGVuZXJzOiBBcnJheTxBcnJheTxbTGlzdGVuZXIsIGJvb2xlYW4sIGJvb2xlYW5dPj5cbiAgfVxufSA9IHt9XG5jb25zdCBkb2N1bWVudHM6IERvY3VtZW50W10gPSBbXVxuXG5mdW5jdGlvbiBhZGQgKGVsZW1lbnQ6IEV2ZW50VGFyZ2V0LCB0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgb3B0aW9uYWxBcmc/OiBib29sZWFuIHwgYW55KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbmFsQXJnKVxuICBsZXQgZWxlbWVudEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KVxuICBsZXQgdGFyZ2V0ID0gdGFyZ2V0c1tlbGVtZW50SW5kZXhdXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0YXJnZXQgPSB7XG4gICAgICBldmVudHM6IHt9LFxuICAgICAgdHlwZUNvdW50OiAwLFxuICAgIH1cblxuICAgIGVsZW1lbnRJbmRleCA9IGVsZW1lbnRzLnB1c2goZWxlbWVudCkgLSAxXG4gICAgdGFyZ2V0cy5wdXNoKHRhcmdldClcbiAgfVxuXG4gIGlmICghdGFyZ2V0LmV2ZW50c1t0eXBlXSkge1xuICAgIHRhcmdldC5ldmVudHNbdHlwZV0gPSBbXVxuICAgIHRhcmdldC50eXBlQ291bnQrK1xuICB9XG5cbiAgaWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciAmJiAhY29udGFpbnModGFyZ2V0LmV2ZW50c1t0eXBlXSwgbGlzdGVuZXIpKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyIGFzIGFueSwgZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZSlcbiAgICB0YXJnZXQuZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlIChlbGVtZW50OiBFdmVudFRhcmdldCwgdHlwZTogc3RyaW5nLCBsaXN0ZW5lcj86ICdhbGwnIHwgTGlzdGVuZXIsIG9wdGlvbmFsQXJnPzogYm9vbGVhbiB8IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgY29uc3QgZWxlbWVudEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KVxuICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzW2VsZW1lbnRJbmRleF1cblxuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmV2ZW50cykge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdhbGwnKSB7XG4gICAgZm9yICh0eXBlIGluIHRhcmdldC5ldmVudHMpIHtcbiAgICAgIGlmICh0YXJnZXQuZXZlbnRzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICAgIHJlbW92ZShlbGVtZW50LCB0eXBlLCAnYWxsJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGFyZ2V0LmV2ZW50c1t0eXBlXSkge1xuICAgIGNvbnN0IGxlbiA9IHRhcmdldC5ldmVudHNbdHlwZV0ubGVuZ3RoXG5cbiAgICBpZiAobGlzdGVuZXIgPT09ICdhbGwnKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHJlbW92ZShlbGVtZW50LCB0eXBlLCB0YXJnZXQuZXZlbnRzW3R5cGVdW2ldLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyICYmIHRhcmdldC5ldmVudHNbdHlwZV1baV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyIGFzIGFueSwgZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICB0YXJnZXQuZXZlbnRzW3R5cGVdLnNwbGljZShpLCAxKVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YXJnZXQuZXZlbnRzW3R5cGVdICYmIHRhcmdldC5ldmVudHNbdHlwZV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAodGFyZ2V0LmV2ZW50c1t0eXBlXSBhcyBhbnkpID0gbnVsbFxuICAgICAgdGFyZ2V0LnR5cGVDb3VudC0tXG4gICAgfVxuICB9XG5cbiAgaWYgKCF0YXJnZXQudHlwZUNvdW50KSB7XG4gICAgdGFyZ2V0cy5zcGxpY2UoZWxlbWVudEluZGV4LCAxKVxuICAgIGVsZW1lbnRzLnNwbGljZShlbGVtZW50SW5kZXgsIDEpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGVsZWdhdGUgKHNlbGVjdG9yOiBzdHJpbmcsIGNvbnRleHQ6IE5vZGUsIHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IExpc3RlbmVyLCBvcHRpb25hbEFyZz86IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgaWYgKCFkZWxlZ2F0ZWRFdmVudHNbdHlwZV0pIHtcbiAgICBkZWxlZ2F0ZWRFdmVudHNbdHlwZV0gPSB7XG4gICAgICBjb250ZXh0cyA6IFtdLFxuICAgICAgbGlzdGVuZXJzOiBbXSxcbiAgICAgIHNlbGVjdG9yczogW10sXG4gICAgfVxuXG4gICAgLy8gYWRkIGRlbGVnYXRlIGxpc3RlbmVyIGZ1bmN0aW9uc1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3VtZW50cykge1xuICAgICAgYWRkKGRvYywgdHlwZSwgZGVsZWdhdGVMaXN0ZW5lcilcbiAgICAgIGFkZChkb2MsIHR5cGUsIGRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWxlZ2F0ZWQgPSBkZWxlZ2F0ZWRFdmVudHNbdHlwZV1cbiAgbGV0IGluZGV4XG5cbiAgZm9yIChpbmRleCA9IGRlbGVnYXRlZC5zZWxlY3RvcnMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzW2luZGV4XSA9PT0gc2VsZWN0b3IgJiZcbiAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzW2luZGV4XSA9PT0gY29udGV4dCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgaW5kZXggPSBkZWxlZ2F0ZWQuc2VsZWN0b3JzLmxlbmd0aFxuXG4gICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5wdXNoKHNlbGVjdG9yKVxuICAgIGRlbGVnYXRlZC5jb250ZXh0cy5wdXNoKGNvbnRleHQpXG4gICAgZGVsZWdhdGVkLmxpc3RlbmVycy5wdXNoKFtdKVxuICB9XG5cbiAgLy8ga2VlcCBsaXN0ZW5lciBhbmQgY2FwdHVyZSBhbmQgcGFzc2l2ZSBmbGFnc1xuICBkZWxlZ2F0ZWQubGlzdGVuZXJzW2luZGV4XS5wdXNoKFtsaXN0ZW5lciwgISFvcHRpb25zLmNhcHR1cmUsIG9wdGlvbnMucGFzc2l2ZV0pXG59XG5cbmZ1bmN0aW9uIHJlbW92ZURlbGVnYXRlIChcbiAgc2VsZWN0b3I6IHN0cmluZyxcbiAgY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50LFxuICB0eXBlOiBzdHJpbmcsXG4gIGxpc3RlbmVyPzogTGlzdGVuZXIsXG4gIG9wdGlvbmFsQXJnPzogYW55LFxuKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbmFsQXJnKVxuICBjb25zdCBkZWxlZ2F0ZWQgPSBkZWxlZ2F0ZWRFdmVudHNbdHlwZV1cbiAgbGV0IG1hdGNoRm91bmQgPSBmYWxzZVxuICBsZXQgaW5kZXhcblxuICBpZiAoIWRlbGVnYXRlZCkgeyByZXR1cm4gfVxuXG4gIC8vIGNvdW50IGZyb20gbGFzdCBpbmRleCBvZiBkZWxlZ2F0ZWQgdG8gMFxuICBmb3IgKGluZGV4ID0gZGVsZWdhdGVkLnNlbGVjdG9ycy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgLy8gbG9vayBmb3IgbWF0Y2hpbmcgc2VsZWN0b3IgYW5kIGNvbnRleHQgTm9kZVxuICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzW2luZGV4XSA9PT0gc2VsZWN0b3IgJiZcbiAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzW2luZGV4XSA9PT0gY29udGV4dCkge1xuICAgICAgY29uc3QgbGlzdGVuZXJzID0gZGVsZWdhdGVkLmxpc3RlbmVyc1tpbmRleF1cblxuICAgICAgLy8gZWFjaCBpdGVtIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkgaXMgYW4gYXJyYXk6IFtmdW5jdGlvbiwgY2FwdHVyZSwgcGFzc2l2ZV1cbiAgICAgIGZvciAobGV0IGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgW2ZuLCBjYXB0dXJlLCBwYXNzaXZlXSA9IGxpc3RlbmVyc1tpXVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBsaXN0ZW5lciBmdW5jdGlvbnMgYW5kIGNhcHR1cmUgYW5kIHBhc3NpdmUgZmxhZ3MgbWF0Y2hcbiAgICAgICAgaWYgKGZuID09PSBsaXN0ZW5lciAmJiBjYXB0dXJlID09PSAhIW9wdGlvbnMuY2FwdHVyZSAmJiBwYXNzaXZlID09PSBvcHRpb25zLnBhc3NpdmUpIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGFycmF5IG9mIGxpc3RlbmVyc1xuICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSlcblxuICAgICAgICAgIC8vIGlmIGFsbCBsaXN0ZW5lcnMgZm9yIHRoaXMgaW50ZXJhY3RhYmxlIGhhdmUgYmVlbiByZW1vdmVkXG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBpbnRlcmFjdGFibGUgZnJvbSB0aGUgZGVsZWdhdGVkIGFycmF5c1xuICAgICAgICAgIGlmICghbGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICBkZWxlZ2F0ZWQuY29udGV4dHMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgZGVsZWdhdGVkLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpXG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBkZWxlZ2F0ZSBmdW5jdGlvbiBmcm9tIGNvbnRleHRcbiAgICAgICAgICAgIHJlbW92ZShjb250ZXh0LCB0eXBlLCBkZWxlZ2F0ZUxpc3RlbmVyKVxuICAgICAgICAgICAgcmVtb3ZlKGNvbnRleHQsIHR5cGUsIGRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBhcnJheXMgaWYgdGhleSBhcmUgZW1wdHlcbiAgICAgICAgICAgIGlmICghZGVsZWdhdGVkLnNlbGVjdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZGVsZWdhdGVkRXZlbnRzW3R5cGVdID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG9ubHkgcmVtb3ZlIG9uZSBsaXN0ZW5lclxuICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hGb3VuZCkgeyBicmVhayB9XG4gICAgfVxuICB9XG59XG5cbi8vIGJvdW5kIHRvIHRoZSBpbnRlcmFjdGFibGUgY29udGV4dCB3aGVuIGEgRE9NIGV2ZW50XG4vLyBsaXN0ZW5lciBpcyBhZGRlZCB0byBhIHNlbGVjdG9yIGludGVyYWN0YWJsZVxuZnVuY3Rpb24gZGVsZWdhdGVMaXN0ZW5lciAoZXZlbnQ6IEV2ZW50LCBvcHRpb25hbEFyZz86IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgY29uc3QgZmFrZUV2ZW50ID0gbmV3IEZha2VFdmVudChldmVudClcbiAgY29uc3QgZGVsZWdhdGVkID0gZGVsZWdhdGVkRXZlbnRzW2V2ZW50LnR5cGVdXG4gIGNvbnN0IFtldmVudFRhcmdldF0gPSAocG9pbnRlclV0aWxzLmdldEV2ZW50VGFyZ2V0cyhldmVudCkpXG4gIGxldCBlbGVtZW50OiBOb2RlID0gZXZlbnRUYXJnZXRcblxuICAvLyBjbGltYiB1cCBkb2N1bWVudCB0cmVlIGxvb2tpbmcgZm9yIHNlbGVjdG9yIG1hdGNoZXNcbiAgd2hpbGUgKGlzLmVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbGVnYXRlZC5zZWxlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gZGVsZWdhdGVkLnNlbGVjdG9yc1tpXVxuICAgICAgY29uc3QgY29udGV4dCA9IGRlbGVnYXRlZC5jb250ZXh0c1tpXVxuXG4gICAgICBpZiAoZG9tVXRpbHMubWF0Y2hlc1NlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKSAmJlxuICAgICAgICAgIGRvbVV0aWxzLm5vZGVDb250YWlucyhjb250ZXh0LCBldmVudFRhcmdldCkgJiZcbiAgICAgICAgICBkb21VdGlscy5ub2RlQ29udGFpbnMoY29udGV4dCwgZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZGVsZWdhdGVkLmxpc3RlbmVyc1tpXVxuXG4gICAgICAgIGZha2VFdmVudC5jdXJyZW50VGFyZ2V0ID0gZWxlbWVudFxuXG4gICAgICAgIGZvciAoY29uc3QgW2ZuLCBjYXB0dXJlLCBwYXNzaXZlXSBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICBpZiAoY2FwdHVyZSA9PT0gISFvcHRpb25zLmNhcHR1cmUgJiYgcGFzc2l2ZSA9PT0gb3B0aW9ucy5wYXNzaXZlKSB7XG4gICAgICAgICAgICBmbihmYWtlRXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGRvbVV0aWxzLnBhcmVudE5vZGUoZWxlbWVudClcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxlZ2F0ZVVzZUNhcHR1cmUgKGV2ZW50OiBFdmVudCkge1xuICByZXR1cm4gZGVsZWdhdGVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50LCB0cnVlKVxufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zIChwYXJhbTogb2JqZWN0KSB7XG4gIHJldHVybiBpcy5vYmplY3QocGFyYW0pID8gcGFyYW0gOiB7IGNhcHR1cmU6IHBhcmFtIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZha2VFdmVudCBpbXBsZW1lbnRzIFBhcnRpYWw8RXZlbnQ+IHtcbiAgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXRcblxuICBjb25zdHJ1Y3RvciAocHVibGljIG9yaWdpbmFsRXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZHVwbGljYXRlIHRoZSBldmVudCBzbyB0aGF0IGN1cnJlbnRUYXJnZXQgY2FuIGJlIGNoYW5nZWRcbiAgICBwRXh0ZW5kKHRoaXMsIG9yaWdpbmFsRXZlbnQpXG4gIH1cblxuICBwcmV2ZW50T3JpZ2luYWxEZWZhdWx0ICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgc3RvcFByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgfVxuXG4gIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiAoKSB7XG4gICAgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gIH1cbn1cblxuY29uc3QgZXZlbnRzID0ge1xuICBhZGQsXG4gIHJlbW92ZSxcblxuICBhZGREZWxlZ2F0ZSxcbiAgcmVtb3ZlRGVsZWdhdGUsXG5cbiAgZGVsZWdhdGVMaXN0ZW5lcixcbiAgZGVsZWdhdGVVc2VDYXB0dXJlLFxuICBkZWxlZ2F0ZWRFdmVudHMsXG4gIGRvY3VtZW50cyxcblxuICBzdXBwb3J0c09wdGlvbnM6IGZhbHNlLFxuICBzdXBwb3J0c1Bhc3NpdmU6IGZhbHNlLFxuXG4gIF9lbGVtZW50czogZWxlbWVudHMsXG4gIF90YXJnZXRzOiB0YXJnZXRzLFxuXG4gIGluaXQgKHdpbmRvdzogV2luZG93KSB7XG4gICAgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCB7XG4gICAgICBnZXQgY2FwdHVyZSAoKSB7IHJldHVybiAoZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA9IHRydWUpIH0sXG4gICAgICBnZXQgcGFzc2l2ZSAoKSB7IHJldHVybiAoZXZlbnRzLnN1cHBvcnRzUGFzc2l2ZSA9IHRydWUpIH0sXG4gICAgfSlcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXZlbnRzXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRlbmQ8VCwgVSBleHRlbmRzIG9iamVjdD4gKGRlc3Q6IFUgJiBQYXJ0aWFsPFQ+LCBzb3VyY2U6IFQpOiBUICYgVSB7XG4gIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAoZGVzdCBhcyB1bmtub3duIGFzIFQpW3Byb3BdID0gc291cmNlW3Byb3BdXG4gIH1cblxuICBjb25zdCByZXQgPSBkZXN0IGFzIFQgJiBVXG5cbiAgcmV0dXJuIHJldFxufVxuIiwiaW1wb3J0IGV4dGVuZCBmcm9tICcuL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZExpc3RlbmVycyB7XG4gIFt0eXBlOiBzdHJpbmddOiBJbnRlcmFjdC5MaXN0ZW5lcltdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZSAoXG4gIHR5cGU6IEludGVyYWN0LkV2ZW50VHlwZXMsXG4gIGxpc3RlbmVycz86IEludGVyYWN0Lkxpc3RlbmVyc0FyZyB8IEludGVyYWN0Lkxpc3RlbmVyc0FyZ1tdLFxuICByZXN1bHQ/OiBOb3JtYWxpemVkTGlzdGVuZXJzLFxuKTogTm9ybWFsaXplZExpc3RlbmVycyB7XG4gIHJlc3VsdCA9IHJlc3VsdCB8fCB7fVxuXG4gIGlmIChpcy5zdHJpbmcodHlwZSkgJiYgdHlwZS5zZWFyY2goJyAnKSAhPT0gLTEpIHtcbiAgICB0eXBlID0gc3BsaXQodHlwZSlcbiAgfVxuXG4gIGlmIChpcy5hcnJheSh0eXBlKSkge1xuICAgIHJldHVybiB0eXBlLnJlZHVjZTxOb3JtYWxpemVkTGlzdGVuZXJzPihcbiAgICAgIChhY2MsIHQpID0+IGV4dGVuZChhY2MsIG5vcm1hbGl6ZSh0LCBsaXN0ZW5lcnMsIHJlc3VsdCkpLFxuICAgICAgcmVzdWx0LFxuICAgIClcbiAgfVxuXG4gIC8vICh7IHR5cGU6IGZuIH0pIC0+ICgnJywgeyB0eXBlOiBmbiB9KVxuICBpZiAoaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgbGlzdGVuZXJzID0gdHlwZVxuICAgIHR5cGUgPSAnJ1xuICB9XG5cbiAgaWYgKGlzLmZ1bmMobGlzdGVuZXJzKSkge1xuICAgIHJlc3VsdFt0eXBlXSA9IHJlc3VsdFt0eXBlXSB8fCBbXVxuICAgIHJlc3VsdFt0eXBlXS5wdXNoKGxpc3RlbmVycylcbiAgfVxuICBlbHNlIGlmIChpcy5hcnJheShsaXN0ZW5lcnMpKSB7XG4gICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgbm9ybWFsaXplKHR5cGUsIGwsIHJlc3VsdClcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAoaXMub2JqZWN0KGxpc3RlbmVycykpIHtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkVHlwZXMgPSBzcGxpdChwcmVmaXgpLm1hcChwID0+IGAke3R5cGV9JHtwfWApXG5cbiAgICAgIG5vcm1hbGl6ZShjb21iaW5lZFR5cGVzLCBsaXN0ZW5lcnNbcHJlZml4XSwgcmVzdWx0KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgYXMgTm9ybWFsaXplZExpc3RlbmVyc1xufVxuXG5mdW5jdGlvbiBzcGxpdCAodHlwZTogc3RyaW5nKSB7XG4gIHJldHVybiB0eXBlLnRyaW0oKS5zcGxpdCgvICsvKVxufVxuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcbmltcG9ydCBleHRlbmQgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IG5vcm1hbGl6ZSwgeyBOb3JtYWxpemVkTGlzdGVuZXJzIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvbm9ybWFsaXplTGlzdGVuZXJzJ1xuXG5mdW5jdGlvbiBmaXJlVW50aWxJbW1lZGlhdGVTdG9wcGVkPFxuICBUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZSxcbiAgUCBleHRlbmRzIEludGVyYWN0LkV2ZW50UGhhc2UsXG4+IChldmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxULCBQPiwgbGlzdGVuZXJzOiBJbnRlcmFjdC5MaXN0ZW5lcltdKSB7XG4gIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgaWYgKGV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCkgeyBicmVhayB9XG5cbiAgICBsaXN0ZW5lcihldmVudClcbiAgfVxufVxuXG5jbGFzcyBFdmVudGFibGUge1xuICBvcHRpb25zOiBhbnlcbiAgdHlwZXM6IE5vcm1hbGl6ZWRMaXN0ZW5lcnMgPSB7fVxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBnbG9iYWw6IGFueVxuXG4gIGNvbnN0cnVjdG9yIChvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zIHx8IHt9KVxuICB9XG5cbiAgZmlyZSAoZXZlbnQ6IGFueSkge1xuICAgIGxldCBsaXN0ZW5lcnNcbiAgICBjb25zdCBnbG9iYWwgPSB0aGlzLmdsb2JhbFxuXG4gICAgLy8gSW50ZXJhY3RhYmxlI29uKCkgbGlzdGVuZXJzXG4gICAgLy8gdHNsaW50OmRpc2FibGUgbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICAgIGlmICgobGlzdGVuZXJzID0gdGhpcy50eXBlc1tldmVudC50eXBlXSkpIHtcbiAgICAgIGZpcmVVbnRpbEltbWVkaWF0ZVN0b3BwZWQoZXZlbnQsIGxpc3RlbmVycylcbiAgICB9XG5cbiAgICAvLyBpbnRlcmFjdC5vbigpIGxpc3RlbmVyc1xuICAgIGlmICghZXZlbnQucHJvcGFnYXRpb25TdG9wcGVkICYmIGdsb2JhbCAmJiAobGlzdGVuZXJzID0gZ2xvYmFsW2V2ZW50LnR5cGVdKSkgIHtcbiAgICAgIGZpcmVVbnRpbEltbWVkaWF0ZVN0b3BwZWQoZXZlbnQsIGxpc3RlbmVycylcbiAgICB9XG4gIH1cblxuICBvbiAodHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogSW50ZXJhY3QuTGlzdGVuZXJzQXJnKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gbm9ybWFsaXplKHR5cGUsIGxpc3RlbmVyKVxuXG4gICAgZm9yICh0eXBlIGluIGxpc3RlbmVycykge1xuICAgICAgdGhpcy50eXBlc1t0eXBlXSA9IGFyci5tZXJnZSh0aGlzLnR5cGVzW3R5cGVdIHx8IFtdLCBsaXN0ZW5lcnNbdHlwZV0pXG4gICAgfVxuICB9XG5cbiAgb2ZmICh0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBJbnRlcmFjdC5MaXN0ZW5lcnNBcmcpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBub3JtYWxpemUodHlwZSwgbGlzdGVuZXIpXG5cbiAgICBmb3IgKHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBjb25zdCBldmVudExpc3QgPSB0aGlzLnR5cGVzW3R5cGVdXG5cbiAgICAgIGlmICghZXZlbnRMaXN0IHx8ICFldmVudExpc3QubGVuZ3RoKSB7IGNvbnRpbnVlIH1cblxuICAgICAgZm9yIChjb25zdCBzdWJMaXN0ZW5lciBvZiBsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBldmVudExpc3QuaW5kZXhPZihzdWJMaXN0ZW5lcilcblxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZXZlbnRMaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJlY3QgKF9lbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KTogSW50ZXJhY3QuUmVjdCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudGFibGVcbiIsImltcG9ydCB7IGNsb3Nlc3QsIGdldEVsZW1lbnRSZWN0LCBwYXJlbnROb2RlIH0gZnJvbSAnLi9kb21VdGlscydcbmltcG9ydCBleHRlbmQgZnJvbSAnLi9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICcuL2lzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nT3B0aW9uUmVzdWx0ICh2YWx1ZTogYW55LCB0YXJnZXQ6IEludGVyYWN0Lkhhc0dldFJlY3QsIGVsZW1lbnQpIHtcbiAgaWYgKHZhbHVlID09PSAncGFyZW50JykgeyByZXR1cm4gcGFyZW50Tm9kZShlbGVtZW50KSB9XG5cbiAgaWYgKHZhbHVlID09PSAnc2VsZicpIHsgcmV0dXJuIHRhcmdldC5nZXRSZWN0KGVsZW1lbnQpIH1cblxuICByZXR1cm4gY2xvc2VzdChlbGVtZW50LCB2YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWN0TGlrZTxUIGV4dGVuZHMgYW55W10+IChcbiAgdmFsdWU6IEludGVyYWN0LlJlY3RSZXNvbHZhYmxlPFQ+LFxuICB0YXJnZXQ/OiBJbnRlcmFjdC5IYXNHZXRSZWN0LFxuICBlbGVtZW50PzogTm9kZSxcbiAgZnVuY3Rpb25BcmdzPzogVCxcbikge1xuICBsZXQgcmV0dXJuVmFsdWU6IGFueSA9IHZhbHVlXG4gIGlmIChpcy5zdHJpbmcocmV0dXJuVmFsdWUpKSB7XG4gICAgcmV0dXJuVmFsdWUgPSBnZXRTdHJpbmdPcHRpb25SZXN1bHQocmV0dXJuVmFsdWUsIHRhcmdldCwgZWxlbWVudClcbiAgfVxuICBlbHNlIGlmIChpcy5mdW5jKHJldHVyblZhbHVlKSkge1xuICAgIHJldHVyblZhbHVlID0gcmV0dXJuVmFsdWUoLi4uZnVuY3Rpb25BcmdzKVxuICB9XG5cbiAgaWYgKGlzLmVsZW1lbnQocmV0dXJuVmFsdWUpKSB7XG4gICAgcmV0dXJuVmFsdWUgPSBnZXRFbGVtZW50UmVjdChyZXR1cm5WYWx1ZSlcbiAgfVxuXG4gIHJldHVybiByZXR1cm5WYWx1ZSBhcyBJbnRlcmFjdC5SZWN0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWN0VG9YWSAocmVjdCkge1xuICByZXR1cm4gIHJlY3QgJiYge1xuICAgIHg6ICd4JyBpbiByZWN0ID8gcmVjdC54IDogcmVjdC5sZWZ0LFxuICAgIHk6ICd5JyBpbiByZWN0ID8gcmVjdC55IDogcmVjdC50b3AsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHh5d2hUb1RsYnIgKHJlY3QpIHtcbiAgaWYgKHJlY3QgJiYgISgnbGVmdCcgaW4gcmVjdCAmJiAndG9wJyBpbiByZWN0KSkge1xuICAgIHJlY3QgPSBleHRlbmQoe30sIHJlY3QpXG5cbiAgICByZWN0LmxlZnQgICA9IHJlY3QueCB8fCAwXG4gICAgcmVjdC50b3AgICAgPSByZWN0LnkgfHwgMFxuICAgIHJlY3QucmlnaHQgID0gcmVjdC5yaWdodCAgIHx8IChyZWN0LmxlZnQgKyByZWN0LndpZHRoKVxuICAgIHJlY3QuYm90dG9tID0gcmVjdC5ib3R0b20gIHx8IChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0KVxuICB9XG5cbiAgcmV0dXJuIHJlY3Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRsYnJUb1h5d2ggKHJlY3QpIHtcbiAgaWYgKHJlY3QgJiYgISgneCcgaW4gcmVjdCAmJiAneScgaW4gcmVjdCkpIHtcbiAgICByZWN0ID0gZXh0ZW5kKHt9LCByZWN0KVxuXG4gICAgcmVjdC54ICAgICAgPSByZWN0LmxlZnQgfHwgMFxuICAgIHJlY3QueSAgICAgID0gcmVjdC50b3AgIHx8IDBcbiAgICByZWN0LndpZHRoICA9IHJlY3Qud2lkdGggIHx8IChyZWN0LnJpZ2h0IHx8IDAgIC0gcmVjdC54KVxuICAgIHJlY3QuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgfHwgKHJlY3QuYm90dG9tIHx8IDAgLSByZWN0LnkpXG4gIH1cblxuICByZXR1cm4gcmVjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRWRnZXMgKGVkZ2VzOiBJbnRlcmFjdC5FZGdlT3B0aW9ucywgcmVjdDogSW50ZXJhY3QuUmVjdCwgZGVsdGE6IEludGVyYWN0LlBvaW50KSB7XG4gIGlmIChlZGdlcy5sZWZ0KSAgIHsgcmVjdC5sZWZ0ICAgKz0gZGVsdGEueCB9XG4gIGlmIChlZGdlcy5yaWdodCkgIHsgcmVjdC5yaWdodCAgKz0gZGVsdGEueCB9XG4gIGlmIChlZGdlcy50b3ApICAgIHsgcmVjdC50b3AgICAgKz0gZGVsdGEueSB9XG4gIGlmIChlZGdlcy5ib3R0b20pIHsgcmVjdC5ib3R0b20gKz0gZGVsdGEueSB9XG5cbiAgcmVjdC53aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnRcbiAgcmVjdC5oZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG59XG4iLCJpbXBvcnQgeyByZWN0VG9YWSwgcmVzb2x2ZVJlY3RMaWtlIH0gZnJvbSAnLi9yZWN0J1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoXG4gIHRhcmdldDogSW50ZXJhY3QuSGFzR2V0UmVjdCAmIHsgb3B0aW9uczogSW50ZXJhY3QuUGVyQWN0aW9uRGVmYXVsdHMgfSxcbiAgZWxlbWVudDogTm9kZSxcbiAgYWN0aW9uTmFtZT86IEludGVyYWN0LkFjdGlvbk5hbWUsXG4pIHtcbiAgY29uc3QgYWN0aW9uT3B0aW9ucyA9ICh0YXJnZXQub3B0aW9ucyBhcyBhbnkpW2FjdGlvbk5hbWVdXG4gIGNvbnN0IGFjdGlvbk9yaWdpbiA9IGFjdGlvbk9wdGlvbnMgJiYgYWN0aW9uT3B0aW9ucy5vcmlnaW5cbiAgY29uc3Qgb3JpZ2luID0gYWN0aW9uT3JpZ2luIHx8IHRhcmdldC5vcHRpb25zLm9yaWdpblxuXG4gIGNvbnN0IG9yaWdpblJlY3QgPSByZXNvbHZlUmVjdExpa2Uob3JpZ2luLCB0YXJnZXQsIGVsZW1lbnQsIFt0YXJnZXQgJiYgZWxlbWVudF0pXG5cbiAgcmV0dXJuIHJlY3RUb1hZKG9yaWdpblJlY3QpIHx8IHsgeDogMCwgeTogMCB9XG59XG4iLCJsZXQgbGFzdFRpbWUgPSAwXG5sZXQgcmVxdWVzdFxubGV0IGNhbmNlbFxuXG5mdW5jdGlvbiBpbml0ICh3aW5kb3cpIHtcbiAgcmVxdWVzdCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lXG5cbiAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgY29uc3QgdmVuZG9ycyA9IFsnbXMnLCAnbW96JywgJ3dlYmtpdCcsICdvJ11cblxuICAgIGZvciAoY29uc3QgdmVuZG9yIG9mIHZlbmRvcnMpIHtcbiAgICAgIHJlcXVlc3QgPSB3aW5kb3dbYCR7dmVuZG9yfVJlcXVlc3RBbmltYXRpb25GcmFtZWBdXG4gICAgICBjYW5jZWwgPSB3aW5kb3dbYCR7dmVuZG9yfUNhbmNlbEFuaW1hdGlvbkZyYW1lYF0gfHwgd2luZG93W2Ake3ZlbmRvcn1DYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWVgXVxuICAgIH1cbiAgfVxuXG4gIGlmICghcmVxdWVzdCkge1xuICAgIHJlcXVlc3QgPSBjYWxsYmFjayA9PiB7XG4gICAgICBjb25zdCBjdXJyVGltZSA9IERhdGUubm93KClcbiAgICAgIGNvbnN0IHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdGFuZGFyZC9uby1jYWxsYmFjay1saXRlcmFsXG4gICAgICBjb25zdCB0b2tlbiA9IHNldFRpbWVvdXQoKCkgPT4geyBjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpIH0sXG4gICAgICAgIHRpbWVUb0NhbGwpXG5cbiAgICAgIGxhc3RUaW1lID0gY3VyclRpbWUgKyB0aW1lVG9DYWxsXG4gICAgICByZXR1cm4gdG9rZW5cbiAgICB9XG5cbiAgICBjYW5jZWwgPSB0b2tlbiA9PiBjbGVhclRpbWVvdXQodG9rZW4pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICByZXF1ZXN0OiBjYWxsYmFjayA9PiByZXF1ZXN0KGNhbGxiYWNrKSxcbiAgY2FuY2VsOiB0b2tlbiA9PiBjYW5jZWwodG9rZW4pLFxuICBpbml0LFxufVxuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJy4vYXJyJ1xuaW1wb3J0ICogYXMgZG9tIGZyb20gJy4vZG9tVXRpbHMnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICcuL2lzJ1xuaW1wb3J0ICogYXMgcG9pbnRlciBmcm9tICcuL3BvaW50ZXJVdGlscydcbmltcG9ydCAqIGFzIHJlY3QgZnJvbSAnLi9yZWN0J1xuaW1wb3J0IHdpbiBmcm9tICcuL3dpbmRvdydcblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PbmNlPFQ+ICh0aGlzOiBULCBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgbGV0IHdhcm5lZCA9IGZhbHNlXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICByZXR1cm4gZnVuY3Rpb24gKHRoaXM6IFQpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgKHdpbiBhcyBhbnkpLndpbmRvdy5jb25zb2xlLndhcm4obWVzc2FnZSlcbiAgICAgIHdhcm5lZCA9IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUFjdGlvbiAoZGVzdDogSW50ZXJhY3QuQWN0aW9uUHJvcHMsIHNyYzogSW50ZXJhY3QuQWN0aW9uUHJvcHMpIHtcbiAgZGVzdC5uYW1lICA9IHNyYy5uYW1lXG4gIGRlc3QuYXhpcyAgPSBzcmMuYXhpc1xuICBkZXN0LmVkZ2VzID0gc3JjLmVkZ2VzXG5cbiAgcmV0dXJuIGRlc3Rcbn1cblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBicm93c2VyIH0gZnJvbSAnLi9icm93c2VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGV2ZW50cyB9IGZyb20gJy4vZXZlbnRzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBleHRlbmQgfSBmcm9tICcuL2V4dGVuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0T3JpZ2luWFkgfSBmcm9tICcuL2dldE9yaWdpblhZJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoeXBvdCB9IGZyb20gJy4vaHlwb3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vcm1hbGl6ZUxpc3RlbmVycyB9IGZyb20gJy4vbm9ybWFsaXplTGlzdGVuZXJzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByYWYgfSBmcm9tICcuL3JhZidcbmV4cG9ydCB7IHdpbiwgYXJyLCBkb20sIGlzLCBwb2ludGVyLCByZWN0IH1cbiIsIi8vIHRzbGludDpkaXNhYmxlIG5vLWVtcHR5LWludGVyZmFjZVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRzIHtcbiAgYmFzZTogQmFzZURlZmF1bHRzXG4gIHBlckFjdGlvbjogUGVyQWN0aW9uRGVmYXVsdHNcbiAgYWN0aW9uczogQWN0aW9uRGVmYXVsdHNcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VEZWZhdWx0cyB7XG4gIHByZXZlbnREZWZhdWx0PzogJ2F1dG8nIHwgJ25ldmVyJyB8IHN0cmluZ1xuICBkZWx0YVNvdXJjZT86ICdwYWdlJyB8ICdjbGllbnQnXG4gIGNvbnRleHQ/OiBJbnRlcmFjdC5FdmVudFRhcmdldFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlckFjdGlvbkRlZmF1bHRzIHtcbiAgZW5hYmxlZD86IGJvb2xlYW5cbiAgb3JpZ2luPzogSW50ZXJhY3QuUG9pbnQgfCBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGxpc3RlbmVycz86IEludGVyYWN0Lkxpc3RlbmVyc1xuICBhbGxvd0Zyb20/OiBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGlnbm9yZUZyb20/OiBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG59XG5cbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSBQYXJ0aWFsPEJhc2VEZWZhdWx0cz4gJiBQYXJ0aWFsPFBlckFjdGlvbkRlZmF1bHRzPiAmIHtcbiAgW1AgaW4ga2V5b2YgQWN0aW9uRGVmYXVsdHNdPzogUGFydGlhbDxBY3Rpb25EZWZhdWx0c1tQXT5cbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIGV4dGVuZHMgQmFzZURlZmF1bHRzLCBQZXJBY3Rpb25EZWZhdWx0cyB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnNBcmcgZXh0ZW5kcyBCYXNlRGVmYXVsdHMsIEludGVyYWN0Lk9yQm9vbGVhbjxQYXJ0aWFsPEFjdGlvbkRlZmF1bHRzPj4ge31cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBEZWZhdWx0cyA9IHtcbiAgYmFzZToge1xuICAgIHByZXZlbnREZWZhdWx0OiAnYXV0bycsXG4gICAgZGVsdGFTb3VyY2U6ICdwYWdlJyxcbiAgfSxcblxuICBwZXJBY3Rpb246IHtcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBvcmlnaW46IHsgeDogMCwgeTogMCB9LFxuICB9LFxuXG4gIGFjdGlvbnM6IHt9IGFzIEFjdGlvbkRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0c1xuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcbmltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNpZ25hbEFyZ3Mge1xuICAgICdpbnRlcmFjdGFibGU6bmV3Jzoge1xuICAgICAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgICAgIHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0XG4gICAgICBvcHRpb25zOiBJbnRlcmFjdC5PcHRpb25zQXJnXG4gICAgICB3aW46IFdpbmRvd1xuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgSW50ZXJhY3RhYmxlU2NvcGVQcm9wIHtcbiAgY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVyYWN0YWJsZVNldCB7XG4gIC8vIGFsbCBzZXQgaW50ZXJhY3RhYmxlc1xuICBsaXN0OiBJbnRlcmFjdC5JbnRlcmFjdGFibGVbXSA9IFtdXG5cbiAgc2VsZWN0b3JNYXA6IHtcbiAgICBbc2VsZWN0b3I6IHN0cmluZ106IEludGVyYWN0YWJsZVNjb3BlUHJvcFtdXG4gIH0gPSB7fVxuXG4gIGNvbnN0cnVjdG9yIChwcm90ZWN0ZWQgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gICAgc2NvcGUuYWRkTGlzdGVuZXJzKHtcbiAgICAgICdpbnRlcmFjdGFibGU6dW5zZXQnOiAoeyBpbnRlcmFjdGFibGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRhcmdldCwgX2NvbnRleHQ6IGNvbnRleHQgfSA9IGludGVyYWN0YWJsZVxuICAgICAgICBjb25zdCB0YXJnZXRNYXBwaW5nczogSW50ZXJhY3RhYmxlU2NvcGVQcm9wW10gPSBpcy5zdHJpbmcodGFyZ2V0KVxuICAgICAgICAgID8gdGhpcy5zZWxlY3Rvck1hcFt0YXJnZXRdXG4gICAgICAgICAgOiAodGFyZ2V0IGFzIGFueSlbdGhpcy5zY29wZS5pZF1cblxuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IHRhcmdldE1hcHBpbmdzLmZpbmRJbmRleChtID0+IG0uY29udGV4dCA9PT0gY29udGV4dClcbiAgICAgICAgaWYgKHRhcmdldE1hcHBpbmdzW3RhcmdldEluZGV4XSkge1xuICAgICAgICAvLyBEZXN0cm95aW5nIG1hcHBpbmdJbmZvJ3MgY29udGV4dCBhbmQgaW50ZXJhY3RhYmxlXG4gICAgICAgICAgdGFyZ2V0TWFwcGluZ3NbdGFyZ2V0SW5kZXhdLmNvbnRleHQgPSBudWxsXG4gICAgICAgICAgdGFyZ2V0TWFwcGluZ3NbdGFyZ2V0SW5kZXhdLmludGVyYWN0YWJsZSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRNYXBwaW5ncy5zcGxpY2UodGFyZ2V0SW5kZXgsIDEpXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBuZXcgKHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0LCBvcHRpb25zPzogYW55KTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlIHtcbiAgICBvcHRpb25zID0gZXh0ZW5kKG9wdGlvbnMgfHwge30sIHtcbiAgICAgIGFjdGlvbnM6IHRoaXMuc2NvcGUuYWN0aW9ucyxcbiAgICB9KVxuICAgIGNvbnN0IGludGVyYWN0YWJsZSA9IG5ldyB0aGlzLnNjb3BlLkludGVyYWN0YWJsZSh0YXJnZXQsIG9wdGlvbnMsIHRoaXMuc2NvcGUuZG9jdW1lbnQpXG4gICAgY29uc3QgbWFwcGluZ0luZm8gPSB7IGNvbnRleHQ6IGludGVyYWN0YWJsZS5fY29udGV4dCwgaW50ZXJhY3RhYmxlIH1cblxuICAgIHRoaXMuc2NvcGUuYWRkRG9jdW1lbnQoaW50ZXJhY3RhYmxlLl9kb2MpXG4gICAgdGhpcy5saXN0LnB1c2goaW50ZXJhY3RhYmxlKVxuXG4gICAgaWYgKGlzLnN0cmluZyh0YXJnZXQpKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0b3JNYXBbdGFyZ2V0XSkgeyB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldF0gPSBbXSB9XG4gICAgICB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldF0ucHVzaChtYXBwaW5nSW5mbylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEoKGludGVyYWN0YWJsZS50YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXSkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgdGhpcy5zY29wZS5pZCwge1xuICAgICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgICh0YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXS5wdXNoKG1hcHBpbmdJbmZvKVxuICAgIH1cblxuICAgIHRoaXMuc2NvcGUuZmlyZSgnaW50ZXJhY3RhYmxlOm5ldycsIHtcbiAgICAgIHRhcmdldCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpbnRlcmFjdGFibGUsXG4gICAgICB3aW46IHRoaXMuc2NvcGUuX3dpbixcbiAgICB9KVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG5cbiAgZ2V0ICh0YXJnZXQ6IEludGVyYWN0LlRhcmdldCwgb3B0aW9ucz86IEludGVyYWN0Lk9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0KSB8fCB0aGlzLnNjb3BlLmRvY3VtZW50XG4gICAgY29uc3QgaXNTZWxlY3RvciA9IGlzLnN0cmluZyh0YXJnZXQpXG4gICAgY29uc3QgdGFyZ2V0TWFwcGluZ3M6IEludGVyYWN0YWJsZVNjb3BlUHJvcFtdID0gaXNTZWxlY3RvclxuICAgICAgPyB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldCBhcyBzdHJpbmddXG4gICAgICA6ICh0YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXVxuXG4gICAgaWYgKCF0YXJnZXRNYXBwaW5ncykgeyByZXR1cm4gbnVsbCB9XG5cbiAgICBjb25zdCBmb3VuZCA9IGFyci5maW5kKFxuICAgICAgdGFyZ2V0TWFwcGluZ3MsXG4gICAgICBtID0+IG0uY29udGV4dCA9PT0gY29udGV4dCAmJlxuICAgICAgICAoaXNTZWxlY3RvciB8fCBtLmludGVyYWN0YWJsZS5pbkNvbnRleHQodGFyZ2V0IGFzIGFueSkpKVxuXG4gICAgcmV0dXJuIGZvdW5kICYmIGZvdW5kLmludGVyYWN0YWJsZVxuICB9XG5cbiAgZm9yRWFjaE1hdGNoPFQ+IChub2RlOiBOb2RlLCBjYWxsYmFjazogKGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKSA9PiBUKTogVCB8IHZvaWQge1xuICAgIGZvciAoY29uc3QgaW50ZXJhY3RhYmxlIG9mIHRoaXMubGlzdCkge1xuICAgICAgbGV0IHJldFxuXG4gICAgICBpZiAoKGlzLnN0cmluZyhpbnRlcmFjdGFibGUudGFyZ2V0KVxuICAgICAgLy8gdGFyZ2V0IGlzIGEgc2VsZWN0b3IgYW5kIHRoZSBlbGVtZW50IG1hdGNoZXNcbiAgICAgICAgPyAoaXMuZWxlbWVudChub2RlKSAmJiBkb21VdGlscy5tYXRjaGVzU2VsZWN0b3Iobm9kZSwgaW50ZXJhY3RhYmxlLnRhcmdldCkpXG4gICAgICAgIC8vIHRhcmdldCBpcyB0aGUgZWxlbWVudFxuICAgICAgICA6IG5vZGUgPT09IGludGVyYWN0YWJsZS50YXJnZXQpICYmXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIGNvbnRleHRcbiAgICAgICAgKGludGVyYWN0YWJsZS5pbkNvbnRleHQobm9kZSkpKSB7XG4gICAgICAgIHJldCA9IGNhbGxiYWNrKGludGVyYWN0YWJsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXRcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBCYXNlRXZlbnQ8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWUgPSBhbnk+IHtcbiAgdHlwZTogc3RyaW5nXG4gIHRhcmdldDogRXZlbnRUYXJnZXRcbiAgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXRcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgX2ludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbjxUPlxuICB0aW1lU3RhbXA6IGFueVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuXG4gIGdldCBpbnRlcmFjdGlvbiAoKTogSW50ZXJhY3QuSW50ZXJhY3Rpb25Qcm94eTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW9uLl9wcm94eVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICAgIHRoaXMuX2ludGVyYWN0aW9uID0gaW50ZXJhY3Rpb25cbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0ICgpIHt9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgYW55IG90aGVyIGxpc3RlbmVycyAoZXZlbiBvbiB0aGUgY3VycmVudCB0YXJnZXQpXG4gICAqL1xuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgbGlzdGVuZXJzIG9uIHRoZSByZW1haW5pbmcgdGFyZ2V0c1xuICAgKi9cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VFdmVudFxuIiwiaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgZ2V0T3JpZ2luWFkgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZ2V0T3JpZ2luWFknXG5pbXBvcnQgaHlwb3QgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaHlwb3QnXG5pbXBvcnQgQmFzZUV2ZW50IGZyb20gJy4vQmFzZUV2ZW50J1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgSW50ZXJhY3Rpb24gZnJvbSAnLi9JbnRlcmFjdGlvbidcblxuZXhwb3J0IHR5cGUgRXZlbnRQaGFzZSA9IGtleW9mIFBoYXNlTWFwXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGhhc2VNYXAge1xuICBzdGFydDogdHJ1ZVxuICBtb3ZlOiB0cnVlXG4gIGVuZDogdHJ1ZVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJhY3RFdmVudDxcbiAgVCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWUgPSBuZXZlcixcbiAgUCBleHRlbmRzIEV2ZW50UGhhc2UgPSBFdmVudFBoYXNlLFxuPiBleHRlbmRzIEJhc2VFdmVudDxUPiB7XG4gIHRhcmdldDogSW50ZXJhY3QuRWxlbWVudFxuICBjdXJyZW50VGFyZ2V0OiBJbnRlcmFjdC5FbGVtZW50XG4gIHJlbGF0ZWRUYXJnZXQ6IG51bGwgPSBudWxsXG4gIHNjcmVlblg/OiBudW1iZXJcbiAgc2NyZWVuWT86IG51bWJlclxuICBidXR0b246IG51bWJlclxuICBidXR0b25zOiBudW1iZXJcbiAgY3RybEtleTogYm9vbGVhblxuICBzaGlmdEtleTogYm9vbGVhblxuICBhbHRLZXk6IGJvb2xlYW5cbiAgbWV0YUtleTogYm9vbGVhblxuICBwYWdlOiBJbnRlcmFjdC5Qb2ludFxuICBjbGllbnQ6IEludGVyYWN0LlBvaW50XG4gIGRlbHRhOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICB4MDogbnVtYmVyXG4gIHkwOiBudW1iZXJcbiAgdDA6IG51bWJlclxuICBkdDogbnVtYmVyXG4gIGR1cmF0aW9uOiBudW1iZXJcbiAgY2xpZW50WDA6IG51bWJlclxuICBjbGllbnRZMDogbnVtYmVyXG4gIHZlbG9jaXR5OiBJbnRlcmFjdC5Qb2ludFxuICBzcGVlZDogbnVtYmVyXG4gIHN3aXBlOiBSZXR1cm5UeXBlPEludGVyYWN0RXZlbnQ8VD5bJ2dldFN3aXBlJ10+XG4gIHRpbWVTdGFtcDogYW55XG4gIC8vIGRyYWdcbiAgZHJhZ0VudGVyPzogSW50ZXJhY3QuRWxlbWVudFxuICBkcmFnTGVhdmU/OiBJbnRlcmFjdC5FbGVtZW50XG4gIC8vIHJlc2l6ZVxuICBheGVzPzogJ3gnIHwgJ3knIHwgJ3h5J1xuICBwcmVFbmQ/OiBib29sZWFuXG5cbiAgLyoqICovXG4gIGNvbnN0cnVjdG9yIChcbiAgICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24sXG4gICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgYWN0aW9uTmFtZTogVCxcbiAgICBwaGFzZTogUCxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgIHByZUVuZD86IGJvb2xlYW4sXG4gICAgdHlwZT86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoaW50ZXJhY3Rpb24pXG5cbiAgICBlbGVtZW50ID0gZWxlbWVudCB8fCBpbnRlcmFjdGlvbi5lbGVtZW50XG5cbiAgICBjb25zdCB0YXJnZXQgICAgICA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZVxuICAgIGNvbnN0IGRlbHRhU291cmNlID0gKCgodGFyZ2V0ICYmIHRhcmdldC5vcHRpb25zKSB8fCBkZWZhdWx0cykgYXMgYW55KS5kZWx0YVNvdXJjZSBhcyAncGFnZScgfCAnY2xpZW50J1xuICAgIGNvbnN0IG9yaWdpbiAgICAgID0gZ2V0T3JpZ2luWFkodGFyZ2V0LCBlbGVtZW50LCBhY3Rpb25OYW1lKVxuICAgIGNvbnN0IHN0YXJ0aW5nICAgID0gcGhhc2UgPT09ICdzdGFydCdcbiAgICBjb25zdCBlbmRpbmcgICAgICA9IHBoYXNlID09PSAnZW5kJ1xuICAgIGNvbnN0IHByZXZFdmVudCAgID0gc3RhcnRpbmcgPyB0aGlzIDogaW50ZXJhY3Rpb24ucHJldkV2ZW50XG4gICAgY29uc3QgY29vcmRzICAgICAgPSBzdGFydGluZ1xuICAgICAgPyBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnRcbiAgICAgIDogZW5kaW5nXG4gICAgICAgID8geyBwYWdlOiBwcmV2RXZlbnQucGFnZSwgY2xpZW50OiBwcmV2RXZlbnQuY2xpZW50LCB0aW1lU3RhbXA6IGludGVyYWN0aW9uLmNvb3Jkcy5jdXIudGltZVN0YW1wIH1cbiAgICAgICAgOiBpbnRlcmFjdGlvbi5jb29yZHMuY3VyXG5cbiAgICB0aGlzLnBhZ2UgICAgICA9IGV4dGVuZCh7fSwgY29vcmRzLnBhZ2UpXG4gICAgdGhpcy5jbGllbnQgICAgPSBleHRlbmQoe30sIGNvb3Jkcy5jbGllbnQpXG4gICAgdGhpcy5yZWN0ICAgICAgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLnJlY3QpXG4gICAgdGhpcy50aW1lU3RhbXAgPSBjb29yZHMudGltZVN0YW1wXG5cbiAgICBpZiAoIWVuZGluZykge1xuICAgICAgdGhpcy5wYWdlLnggLT0gb3JpZ2luLnhcbiAgICAgIHRoaXMucGFnZS55IC09IG9yaWdpbi55XG5cbiAgICAgIHRoaXMuY2xpZW50LnggLT0gb3JpZ2luLnhcbiAgICAgIHRoaXMuY2xpZW50LnkgLT0gb3JpZ2luLnlcbiAgICB9XG5cbiAgICB0aGlzLmN0cmxLZXkgICAgICAgPSBldmVudC5jdHJsS2V5XG4gICAgdGhpcy5hbHRLZXkgICAgICAgID0gZXZlbnQuYWx0S2V5XG4gICAgdGhpcy5zaGlmdEtleSAgICAgID0gZXZlbnQuc2hpZnRLZXlcbiAgICB0aGlzLm1ldGFLZXkgICAgICAgPSBldmVudC5tZXRhS2V5XG4gICAgdGhpcy5idXR0b24gICAgICAgID0gKGV2ZW50IGFzIE1vdXNlRXZlbnQpLmJ1dHRvblxuICAgIHRoaXMuYnV0dG9ucyAgICAgICA9IChldmVudCBhcyBNb3VzZUV2ZW50KS5idXR0b25zXG4gICAgdGhpcy50YXJnZXQgICAgICAgID0gZWxlbWVudFxuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IGVsZW1lbnRcbiAgICB0aGlzLnByZUVuZCAgICAgICAgPSBwcmVFbmRcbiAgICB0aGlzLnR5cGUgICAgICAgICAgPSB0eXBlIHx8IChhY3Rpb25OYW1lICsgKHBoYXNlIHx8ICcnKSlcbiAgICB0aGlzLmludGVyYWN0YWJsZSAgPSB0YXJnZXRcblxuICAgIHRoaXMudDAgPSBzdGFydGluZ1xuICAgICAgPyBpbnRlcmFjdGlvbi5wb2ludGVyc1tpbnRlcmFjdGlvbi5wb2ludGVycy5sZW5ndGggLSAxXS5kb3duVGltZVxuICAgICAgOiBwcmV2RXZlbnQudDBcblxuICAgIHRoaXMueDAgICAgICAgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQucGFnZS54IC0gb3JpZ2luLnhcbiAgICB0aGlzLnkwICAgICAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueSAtIG9yaWdpbi55XG4gICAgdGhpcy5jbGllbnRYMCA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5jbGllbnQueCAtIG9yaWdpbi54XG4gICAgdGhpcy5jbGllbnRZMCA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5jbGllbnQueSAtIG9yaWdpbi55XG5cbiAgICBpZiAoc3RhcnRpbmcgfHwgZW5kaW5nKSB7XG4gICAgICB0aGlzLmRlbHRhID0geyB4OiAwLCB5OiAwIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRlbHRhID0ge1xuICAgICAgICB4OiB0aGlzW2RlbHRhU291cmNlXS54IC0gcHJldkV2ZW50W2RlbHRhU291cmNlXS54LFxuICAgICAgICB5OiB0aGlzW2RlbHRhU291cmNlXS55IC0gcHJldkV2ZW50W2RlbHRhU291cmNlXS55LFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZHQgICAgICAgID0gaW50ZXJhY3Rpb24uY29vcmRzLmRlbHRhLnRpbWVTdGFtcFxuICAgIHRoaXMuZHVyYXRpb24gID0gdGhpcy50aW1lU3RhbXAgLSB0aGlzLnQwXG5cbiAgICAvLyB2ZWxvY2l0eSBhbmQgc3BlZWQgaW4gcGl4ZWxzIHBlciBzZWNvbmRcbiAgICB0aGlzLnZlbG9jaXR5ID0gZXh0ZW5kKHt9LCBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHlbZGVsdGFTb3VyY2VdKVxuICAgIHRoaXMuc3BlZWQgPSBoeXBvdCh0aGlzLnZlbG9jaXR5LngsIHRoaXMudmVsb2NpdHkueSlcblxuICAgIHRoaXMuc3dpcGUgPSAoZW5kaW5nIHx8IHBoYXNlID09PSAnaW5lcnRpYXN0YXJ0JykgPyB0aGlzLmdldFN3aXBlKCkgOiBudWxsXG4gIH1cblxuICBnZXQgcGFnZVggKCkgeyByZXR1cm4gdGhpcy5wYWdlLnggfVxuICBzZXQgcGFnZVggKHZhbHVlKSB7IHRoaXMucGFnZS54ID0gdmFsdWUgfVxuICBnZXQgcGFnZVkgKCkgeyByZXR1cm4gdGhpcy5wYWdlLnkgfVxuICBzZXQgcGFnZVkgKHZhbHVlKSB7IHRoaXMucGFnZS55ID0gdmFsdWUgfVxuXG4gIGdldCBjbGllbnRYICgpIHsgcmV0dXJuIHRoaXMuY2xpZW50LnggfVxuICBzZXQgY2xpZW50WCAodmFsdWUpIHsgdGhpcy5jbGllbnQueCA9IHZhbHVlIH1cbiAgZ2V0IGNsaWVudFkgKCkgeyByZXR1cm4gdGhpcy5jbGllbnQueSB9XG4gIHNldCBjbGllbnRZICh2YWx1ZSkgeyB0aGlzLmNsaWVudC55ID0gdmFsdWUgfVxuXG4gIGdldCBkeCAoKSB7IHJldHVybiB0aGlzLmRlbHRhLnggfVxuICBzZXQgZHggKHZhbHVlKSB7IHRoaXMuZGVsdGEueCA9IHZhbHVlIH1cbiAgZ2V0IGR5ICgpIHsgcmV0dXJuIHRoaXMuZGVsdGEueSB9XG4gIHNldCBkeSAodmFsdWUpIHsgdGhpcy5kZWx0YS55ID0gdmFsdWUgfVxuXG4gIGdldCB2ZWxvY2l0eVggKCkgeyByZXR1cm4gdGhpcy52ZWxvY2l0eS54IH1cbiAgc2V0IHZlbG9jaXR5WCAodmFsdWUpIHsgdGhpcy52ZWxvY2l0eS54ID0gdmFsdWUgfVxuICBnZXQgdmVsb2NpdHlZICgpIHsgcmV0dXJuIHRoaXMudmVsb2NpdHkueSB9XG4gIHNldCB2ZWxvY2l0eVkgKHZhbHVlKSB7IHRoaXMudmVsb2NpdHkueSA9IHZhbHVlIH1cblxuICBnZXRTd2lwZSAoKSB7XG4gICAgY29uc3QgaW50ZXJhY3Rpb24gPSB0aGlzLl9pbnRlcmFjdGlvblxuXG4gICAgaWYgKGludGVyYWN0aW9uLnByZXZFdmVudC5zcGVlZCA8IDYwMCB8fFxuICAgICAgICB0aGlzLnRpbWVTdGFtcCAtIGludGVyYWN0aW9uLnByZXZFdmVudC50aW1lU3RhbXAgPiAxNTApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGFuZ2xlID0gMTgwICogTWF0aC5hdGFuMihpbnRlcmFjdGlvbi5wcmV2RXZlbnQudmVsb2NpdHlZLCBpbnRlcmFjdGlvbi5wcmV2RXZlbnQudmVsb2NpdHlYKSAvIE1hdGguUElcbiAgICBjb25zdCBvdmVybGFwID0gMjIuNVxuXG4gICAgaWYgKGFuZ2xlIDwgMCkge1xuICAgICAgYW5nbGUgKz0gMzYwXG4gICAgfVxuXG4gICAgY29uc3QgbGVmdCA9IDEzNSAtIG92ZXJsYXAgPD0gYW5nbGUgJiYgYW5nbGUgPCAyMjUgKyBvdmVybGFwXG4gICAgY29uc3QgdXAgICA9IDIyNSAtIG92ZXJsYXAgPD0gYW5nbGUgJiYgYW5nbGUgPCAzMTUgKyBvdmVybGFwXG5cbiAgICBjb25zdCByaWdodCA9ICFsZWZ0ICYmICgzMTUgLSBvdmVybGFwIDw9IGFuZ2xlIHx8IGFuZ2xlIDwgIDQ1ICsgb3ZlcmxhcClcbiAgICBjb25zdCBkb3duICA9ICF1cCAgICYmICAgNDUgLSBvdmVybGFwIDw9IGFuZ2xlICYmIGFuZ2xlIDwgMTM1ICsgb3ZlcmxhcFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVwLFxuICAgICAgZG93bixcbiAgICAgIGxlZnQsXG4gICAgICByaWdodCxcbiAgICAgIGFuZ2xlLFxuICAgICAgc3BlZWQ6IGludGVyYWN0aW9uLnByZXZFdmVudC5zcGVlZCxcbiAgICAgIHZlbG9jaXR5OiB7XG4gICAgICAgIHg6IGludGVyYWN0aW9uLnByZXZFdmVudC52ZWxvY2l0eVgsXG4gICAgICAgIHk6IGludGVyYWN0aW9uLnByZXZFdmVudC52ZWxvY2l0eVksXG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0ICgpIHt9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgbGlzdGVuZXJzIG9uIHRoZSByZW1haW5pbmcgdGFyZ2V0c1xuICAgKi9cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgYW55IG90aGVyIGxpc3RlbmVycyAoZXZlbiBvbiB0aGUgY3VycmVudCB0YXJnZXQpXG4gICAqL1xuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVyYWN0RXZlbnRcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1wYXJhbWV0ZXItcHJvcGVydGllcyAqL1xuZXhwb3J0IGNsYXNzIFBvaW50ZXJJbmZvIHtcbiAgY29uc3RydWN0b3IgKFxuICAgIHB1YmxpYyBpZDogbnVtYmVyLFxuICAgIHB1YmxpYyBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgICBwdWJsaWMgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgcHVibGljIGRvd25UaW1lOiBudW1iZXIsXG4gICAgcHVibGljIGRvd25UYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0LFxuICApIHt9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50ZXJJbmZvXG4iLCJpbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBJbnRlcmFjdGFibGUgZnJvbSAnLi9JbnRlcmFjdGFibGUnXG5pbXBvcnQgSW50ZXJhY3RFdmVudCwgeyBFdmVudFBoYXNlIH0gZnJvbSAnLi9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0IFBvaW50ZXJJbmZvIGZyb20gJy4vUG9pbnRlckluZm8nXG5pbXBvcnQgeyBBY3Rpb25OYW1lIH0gZnJvbSAnLi9zY29wZSdcblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25Qcm9wczxUIGV4dGVuZHMgQWN0aW9uTmFtZSA9IEludGVyYWN0LkFjdGlvbk5hbWU+IHtcbiAgbmFtZTogVFxuICBheGlzPzogJ3gnIHwgJ3knIHwgJ3h5J1xuICBlZGdlcz86IEludGVyYWN0LkVkZ2VPcHRpb25zXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb25Qcm9wcyB7XG4gIG5hbWU6IEFjdGlvbk5hbWVcbn1cblxuZXhwb3J0IGVudW0gX1Byb3h5VmFsdWVzIHtcbiAgaW50ZXJhY3RhYmxlID0gJycsXG4gIGVsZW1lbnQgPSAnJyxcbiAgcHJlcGFyZWQgPSAnJyxcbiAgcG9pbnRlcklzRG93biA9ICcnLFxuICBwb2ludGVyV2FzTW92ZWQgPSAnJyxcbiAgX3Byb3h5ID0gJydcbn1cblxuZXhwb3J0IGVudW0gX1Byb3h5TWV0aG9kcyB7XG4gIHN0YXJ0ID0gJycsXG4gIG1vdmUgPSAnJyxcbiAgZW5kID0gJycsXG4gIHN0b3AgPSAnJyxcbiAgaW50ZXJhY3RpbmcgPSAnJ1xufVxuXG5leHBvcnQgdHlwZSBQb2ludGVyQXJnUHJvcHM8VCBleHRlbmRzIHt9ID0ge30+ID0ge1xuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZVxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgcG9pbnRlckluZGV4OiBudW1iZXJcbiAgcG9pbnRlckluZm86IFBvaW50ZXJJbmZvXG4gIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblxufSAmIFRcblxuZXhwb3J0IGludGVyZmFjZSBEb1BoYXNlQXJnPFQgZXh0ZW5kcyBBY3Rpb25OYW1lLCBQIGV4dGVuZHMgRXZlbnRQaGFzZT4ge1xuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICBwaGFzZTogRXZlbnRQaGFzZVxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb248VD5cbiAgaUV2ZW50OiBJbnRlcmFjdEV2ZW50PFQsIFA+XG4gIHByZUVuZD86IGJvb2xlYW5cbiAgdHlwZT86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBEb0FueVBoYXNlQXJnID0gRG9QaGFzZUFyZzxBY3Rpb25OYW1lLCBFdmVudFBoYXNlPlxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB9XG4gICAgJ2ludGVyYWN0aW9uczpkb3duJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICdkb3duJ1xuICAgIH0+XG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICdtb3ZlJ1xuICAgICAgZHg6IG51bWJlclxuICAgICAgZHk6IG51bWJlclxuICAgICAgZHVwbGljYXRlOiBib29sZWFuXG4gICAgfT5cbiAgICAnaW50ZXJhY3Rpb25zOnVwJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICd1cCdcbiAgICAgIGN1ckV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldFxuICAgIH0+XG4gICAgJ2ludGVyYWN0aW9uczpjYW5jZWwnOiBTaWduYWxBcmdzWydpbnRlcmFjdGlvbnM6dXAnXSAmIHtcbiAgICAgIHR5cGU6ICdjYW5jZWwnXG4gICAgICBjdXJFdmVudFRhcmdldDogRXZlbnRUYXJnZXRcbiAgICB9XG4gICAgJ2ludGVyYWN0aW9uczp1cGRhdGUtcG9pbnRlcic6IFBvaW50ZXJBcmdQcm9wczx7XG4gICAgICBkb3duOiBib29sZWFuXG4gICAgfT5cbiAgICAnaW50ZXJhY3Rpb25zOnJlbW92ZS1wb2ludGVyJzogUG9pbnRlckFyZ1Byb3BzXG4gICAgJ2ludGVyYWN0aW9uczpibHVyJ1xuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1zdGFydCc6IE9taXQ8RG9BbnlQaGFzZUFyZywgJ2lFdmVudCc+XG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tc3RhcnQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tc3RhcnQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczpiZWZvcmUtYWN0aW9uLW1vdmUnOiBPbWl0PERvQW55UGhhc2VBcmcsICdpRXZlbnQnPlxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IERvQW55UGhhc2VBcmdcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogT21pdDxEb0FueVBoYXNlQXJnLCAnaUV2ZW50Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1lbmQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tZW5kJzogRG9BbnlQaGFzZUFyZ1xuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IHsgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBJbnRlcmFjdGlvblByb3h5PFQgZXh0ZW5kcyBBY3Rpb25OYW1lID0gQWN0aW9uTmFtZT4gPSBQaWNrPFxuSW50ZXJhY3Rpb248VD4sXG5rZXlvZiB0eXBlb2YgX1Byb3h5VmFsdWVzIHwga2V5b2YgdHlwZW9mIF9Qcm94eU1ldGhvZHNcbj5cblxubGV0IGlkQ291bnRlciA9IDBcblxuZXhwb3J0IGNsYXNzIEludGVyYWN0aW9uPFQgZXh0ZW5kcyBBY3Rpb25OYW1lID0gQWN0aW9uTmFtZT4ge1xuICAvLyBjdXJyZW50IGludGVyYWN0YWJsZSBiZWluZyBpbnRlcmFjdGVkIHdpdGhcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdGFibGUgPSBudWxsXG5cbiAgLy8gdGhlIHRhcmdldCBlbGVtZW50IG9mIHRoZSBpbnRlcmFjdGFibGVcbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCA9IG51bGxcbiAgcmVjdDogSW50ZXJhY3QuRnVsbFJlY3RcbiAgX3JlY3RzPzoge1xuICAgIHN0YXJ0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICAgIGNvcnJlY3RlZDogSW50ZXJhY3QuRnVsbFJlY3RcbiAgICBwcmV2aW91czogSW50ZXJhY3QuRnVsbFJlY3RcbiAgICBkZWx0YTogSW50ZXJhY3QuRnVsbFJlY3RcbiAgfVxuICBlZGdlczogSW50ZXJhY3QuRWRnZU9wdGlvbnNcblxuICBfc2NvcGVGaXJlOiBJbnRlcmFjdC5TY29wZVsnZmlyZSddXG5cbiAgLy8gYWN0aW9uIHRoYXQncyByZWFkeSB0byBiZSBmaXJlZCBvbiBuZXh0IG1vdmUgZXZlbnRcbiAgcHJlcGFyZWQ6IEFjdGlvblByb3BzPFQ+ID0ge1xuICAgIG5hbWUgOiBudWxsLFxuICAgIGF4aXMgOiBudWxsLFxuICAgIGVkZ2VzOiBudWxsLFxuICB9XG5cbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuXG4gIC8vIGtlZXAgdHJhY2sgb2YgYWRkZWQgcG9pbnRlcnNcbiAgcG9pbnRlcnM6IFBvaW50ZXJJbmZvW10gPSBbXVxuXG4gIC8vIHBvaW50ZXJkb3duL21vdXNlZG93bi90b3VjaHN0YXJ0IGV2ZW50XG4gIGRvd25FdmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSA9IG51bGxcblxuICBkb3duUG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgPSB7fSBhcyBJbnRlcmFjdC5Qb2ludGVyVHlwZVxuXG4gIF9sYXRlc3RQb2ludGVyOiB7XG4gICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGVcbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICAgIGV2ZW50VGFyZ2V0OiBOb2RlXG4gIH0gPSB7XG4gICAgcG9pbnRlcjogbnVsbCxcbiAgICBldmVudDogbnVsbCxcbiAgICBldmVudFRhcmdldDogbnVsbCxcbiAgfVxuXG4gIC8vIHByZXZpb3VzIGFjdGlvbiBldmVudFxuICBwcmV2RXZlbnQ6IEludGVyYWN0RXZlbnQ8VCwgRXZlbnRQaGFzZT4gPSBudWxsXG5cbiAgcG9pbnRlcklzRG93biA9IGZhbHNlXG4gIHBvaW50ZXJXYXNNb3ZlZCA9IGZhbHNlXG4gIF9pbnRlcmFjdGluZyA9IGZhbHNlXG4gIF9lbmRpbmcgPSBmYWxzZVxuICBfc3RvcHBlZCA9IHRydWVcbiAgX3Byb3h5OiBJbnRlcmFjdGlvblByb3h5PFQ+ID0gbnVsbFxuXG4gIHNpbXVsYXRpb24gPSBudWxsXG5cbiAgZ2V0IHBvaW50ZXJNb3ZlVG9sZXJhbmNlICgpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgLyoqXG4gICAqIEBhbGlhcyBJbnRlcmFjdGlvbi5wcm90b3R5cGUubW92ZVxuICAgKi9cbiAgZG9Nb3ZlID0gdXRpbHMud2Fybk9uY2UoXG4gICAgZnVuY3Rpb24gKHRoaXM6IEludGVyYWN0aW9uLCBzaWduYWxBcmc6IGFueSkge1xuICAgICAgdGhpcy5tb3ZlKHNpZ25hbEFyZylcbiAgICB9LFxuICAgICdUaGUgaW50ZXJhY3Rpb24uZG9Nb3ZlKCkgbWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gaW50ZXJhY3Rpb24ubW92ZSgpJylcblxuICBjb29yZHM6IEludGVyYWN0LkNvb3Jkc1NldCA9IHtcbiAgICAvLyBTdGFydGluZyBJbnRlcmFjdEV2ZW50IHBvaW50ZXIgY29vcmRpbmF0ZXNcbiAgICBzdGFydDogdXRpbHMucG9pbnRlci5uZXdDb29yZHMoKSxcbiAgICAvLyBQcmV2aW91cyBuYXRpdmUgcG9pbnRlciBtb3ZlIGV2ZW50IGNvb3JkaW5hdGVzXG4gICAgcHJldjogdXRpbHMucG9pbnRlci5uZXdDb29yZHMoKSxcbiAgICAvLyBjdXJyZW50IG5hdGl2ZSBwb2ludGVyIG1vdmUgZXZlbnQgY29vcmRpbmF0ZXNcbiAgICBjdXI6IHV0aWxzLnBvaW50ZXIubmV3Q29vcmRzKCksXG4gICAgLy8gQ2hhbmdlIGluIGNvb3JkaW5hdGVzIGFuZCB0aW1lIG9mIHRoZSBwb2ludGVyXG4gICAgZGVsdGE6IHV0aWxzLnBvaW50ZXIubmV3Q29vcmRzKCksXG4gICAgLy8gcG9pbnRlciB2ZWxvY2l0eVxuICAgIHZlbG9jaXR5OiB1dGlscy5wb2ludGVyLm5ld0Nvb3JkcygpLFxuICB9XG5cbiAgcmVhZG9ubHkgX2lkOiBudW1iZXIgPSBpZENvdW50ZXIrK1xuXG4gIC8qKiAqL1xuICBjb25zdHJ1Y3RvciAoeyBwb2ludGVyVHlwZSwgc2NvcGVGaXJlIH06IHtcbiAgICBwb2ludGVyVHlwZT86IHN0cmluZ1xuICAgIHNjb3BlRmlyZTogSW50ZXJhY3QuU2NvcGVbJ2ZpcmUnXVxuICB9KSB7XG4gICAgdGhpcy5fc2NvcGVGaXJlID0gc2NvcGVGaXJlXG4gICAgdGhpcy5wb2ludGVyVHlwZSA9IHBvaW50ZXJUeXBlXG5cbiAgICBjb25zdCB0aGF0ID0gdGhpc1xuXG4gICAgdGhpcy5fcHJveHkgPSB7fSBhcyBJbnRlcmFjdGlvblByb3h5PFQ+XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBfUHJveHlWYWx1ZXMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLl9wcm94eSwga2V5LCB7XG4gICAgICAgIGdldCAoKSB7IHJldHVybiB0aGF0W2tleV0gfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gX1Byb3h5TWV0aG9kcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuX3Byb3h5LCBrZXksIHtcbiAgICAgICAgdmFsdWU6ICguLi5hcmdzKSA9PiB0aGF0W2tleV0oLi4uYXJncyksXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOm5ldycsIHsgaW50ZXJhY3Rpb246IHRoaXMgfSlcbiAgfVxuXG4gIHBvaW50ZXJEb3duIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCkge1xuICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IHRoaXMudXBkYXRlUG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHRydWUpXG4gICAgY29uc3QgcG9pbnRlckluZm8gPSB0aGlzLnBvaW50ZXJzW3BvaW50ZXJJbmRleF1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOmRvd24nLCB7XG4gICAgICBwb2ludGVyLFxuICAgICAgZXZlbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHBvaW50ZXJJbmRleCxcbiAgICAgIHBvaW50ZXJJbmZvLFxuICAgICAgdHlwZTogJ2Rvd24nLFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBgYGBqc1xuICAgKiBpbnRlcmFjdCh0YXJnZXQpXG4gICAqICAgLmRyYWdnYWJsZSh7XG4gICAqICAgICAvLyBkaXNhYmxlIHRoZSBkZWZhdWx0IGRyYWcgc3RhcnQgYnkgZG93bi0+bW92ZVxuICAgKiAgICAgbWFudWFsU3RhcnQ6IHRydWVcbiAgICogICB9KVxuICAgKiAgIC8vIHN0YXJ0IGRyYWdnaW5nIGFmdGVyIHRoZSB1c2VyIGhvbGRzIHRoZSBwb2ludGVyIGRvd25cbiAgICogICAub24oJ2hvbGQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICogICAgIHZhciBpbnRlcmFjdGlvbiA9IGV2ZW50LmludGVyYWN0aW9uXG4gICAqXG4gICAqICAgICBpZiAoIWludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICogICAgICAgaW50ZXJhY3Rpb24uc3RhcnQoeyBuYW1lOiAnZHJhZycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW50ZXJhY3RhYmxlLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0KVxuICAgKiAgICAgfVxuICAgKiB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogU3RhcnQgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIEludGVyYWN0YWJsZSBhbmQgRWxlbWVudCBhcyB0YXJ0Z2V0cy4gVGhlXG4gICAqIGFjdGlvbiBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoZSB0YXJnZXQgSW50ZXJhY3RhYmxlIGFuZCBhbiBhcHByb3ByaWF0ZVxuICAgKiBudW1iZXIgb2YgcG9pbnRlcnMgbXVzdCBiZSBoZWxkIGRvd24gLSAxIGZvciBkcmFnL3Jlc2l6ZSwgMiBmb3IgZ2VzdHVyZS5cbiAgICpcbiAgICogVXNlIGl0IHdpdGggYGludGVyYWN0YWJsZS48YWN0aW9uPmFibGUoeyBtYW51YWxTdGFydDogZmFsc2UgfSlgIHRvIGFsd2F5c1xuICAgKiBbc3RhcnQgYWN0aW9ucyBtYW51YWxseV0oaHR0cHM6Ly9naXRodWIuY29tL3RheWUvaW50ZXJhY3QuanMvaXNzdWVzLzExNClcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiAgIFRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIC0gZHJhZywgcmVzaXplLCBldGMuXG4gICAqIEBwYXJhbSB7SW50ZXJhY3RhYmxlfSB0YXJnZXQgIFRoZSBJbnRlcmFjdGFibGUgdG8gdGFyZ2V0XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgRE9NIEVsZW1lbnQgdG8gdGFyZ2V0XG4gICAqIEByZXR1cm4ge29iamVjdH0gaW50ZXJhY3RcbiAgICovXG4gIHN0YXJ0IChhY3Rpb246IFN0YXJ0QWN0aW9uLCBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSwgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAgIGlmICh0aGlzLmludGVyYWN0aW5nKCkgfHxcbiAgICAgICAgIXRoaXMucG9pbnRlcklzRG93biB8fFxuICAgICAgICB0aGlzLnBvaW50ZXJzLmxlbmd0aCA8IChhY3Rpb24ubmFtZSA9PT0gJ2dlc3R1cmUnID8gMiA6IDEpIHx8XG4gICAgICAgICFpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb24ubmFtZV0uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgdXRpbHMuY29weUFjdGlvbih0aGlzLnByZXBhcmVkLCBhY3Rpb24pXG5cbiAgICB0aGlzLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICAgIHRoaXMuZWxlbWVudCAgICAgID0gZWxlbWVudFxuICAgIHRoaXMucmVjdCAgICAgICAgID0gaW50ZXJhY3RhYmxlLmdldFJlY3QoZWxlbWVudClcbiAgICB0aGlzLmVkZ2VzICAgICAgICA9IHRoaXMucHJlcGFyZWQuZWRnZXNcbiAgICAgID8gdXRpbHMuZXh0ZW5kKHt9LCB0aGlzLnByZXBhcmVkLmVkZ2VzKVxuICAgICAgOiB7IGxlZnQ6IHRydWUsIHJpZ2h0OiB0cnVlLCB0b3A6IHRydWUsIGJvdHRvbTogdHJ1ZSB9XG4gICAgdGhpcy5fc3RvcHBlZCAgICAgPSBmYWxzZVxuICAgIHRoaXMuX2ludGVyYWN0aW5nID0gdGhpcy5fZG9QaGFzZSh7XG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICAgIGV2ZW50OiB0aGlzLmRvd25FdmVudCxcbiAgICAgIHBoYXNlOiAnc3RhcnQnLFxuICAgIH0pICYmICF0aGlzLl9zdG9wcGVkXG5cbiAgICByZXR1cm4gdGhpcy5faW50ZXJhY3RpbmdcbiAgfVxuXG4gIHBvaW50ZXJNb3ZlIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCkge1xuICAgIGlmICghdGhpcy5zaW11bGF0aW9uICYmICEodGhpcy5tb2RpZmljYXRpb24gJiYgdGhpcy5tb2RpZmljYXRpb24uZW5kUmVzdWx0KSkge1xuICAgICAgdGhpcy51cGRhdGVQb2ludGVyKHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgZHVwbGljYXRlTW92ZSA9ICh0aGlzLmNvb3Jkcy5jdXIucGFnZS54ID09PSB0aGlzLmNvb3Jkcy5wcmV2LnBhZ2UueCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29yZHMuY3VyLnBhZ2UueSA9PT0gdGhpcy5jb29yZHMucHJldi5wYWdlLnkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzLmN1ci5jbGllbnQueCA9PT0gdGhpcy5jb29yZHMucHJldi5jbGllbnQueCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29yZHMuY3VyLmNsaWVudC55ID09PSB0aGlzLmNvb3Jkcy5wcmV2LmNsaWVudC55KVxuXG4gICAgbGV0IGR4XG4gICAgbGV0IGR5XG5cbiAgICAvLyByZWdpc3RlciBtb3ZlbWVudCBncmVhdGVyIHRoYW4gcG9pbnRlck1vdmVUb2xlcmFuY2VcbiAgICBpZiAodGhpcy5wb2ludGVySXNEb3duICYmICF0aGlzLnBvaW50ZXJXYXNNb3ZlZCkge1xuICAgICAgZHggPSB0aGlzLmNvb3Jkcy5jdXIuY2xpZW50LnggLSB0aGlzLmNvb3Jkcy5zdGFydC5jbGllbnQueFxuICAgICAgZHkgPSB0aGlzLmNvb3Jkcy5jdXIuY2xpZW50LnkgLSB0aGlzLmNvb3Jkcy5zdGFydC5jbGllbnQueVxuXG4gICAgICB0aGlzLnBvaW50ZXJXYXNNb3ZlZCA9IHV0aWxzLmh5cG90KGR4LCBkeSkgPiB0aGlzLnBvaW50ZXJNb3ZlVG9sZXJhbmNlXG4gICAgfVxuXG4gICAgY29uc3QgcG9pbnRlckluZGV4ID0gdGhpcy5nZXRQb2ludGVySW5kZXgocG9pbnRlcilcbiAgICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgICBwb2ludGVyLFxuICAgICAgcG9pbnRlckluZGV4LFxuICAgICAgcG9pbnRlckluZm86IHRoaXMucG9pbnRlcnNbcG9pbnRlckluZGV4XSxcbiAgICAgIGV2ZW50LFxuICAgICAgdHlwZTogJ21vdmUnIGFzIGNvbnN0LFxuICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICBkeCxcbiAgICAgIGR5LFxuICAgICAgZHVwbGljYXRlOiBkdXBsaWNhdGVNb3ZlLFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfVxuXG4gICAgaWYgKCFkdXBsaWNhdGVNb3ZlKSB7XG4gICAgICAvLyBzZXQgcG9pbnRlciBjb29yZGluYXRlLCB0aW1lIGNoYW5nZXMgYW5kIHZlbG9jaXR5XG4gICAgICB1dGlscy5wb2ludGVyLnNldENvb3JkVmVsb2NpdHkodGhpcy5jb29yZHMudmVsb2NpdHksIHRoaXMuY29vcmRzLmRlbHRhKVxuICAgIH1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOm1vdmUnLCBzaWduYWxBcmcpXG5cbiAgICBpZiAoIWR1cGxpY2F0ZU1vdmUgJiYgIXRoaXMuc2ltdWxhdGlvbikge1xuICAgICAgLy8gaWYgaW50ZXJhY3RpbmcsIGZpcmUgYW4gJ2FjdGlvbi1tb3ZlJyBzaWduYWwgZXRjXG4gICAgICBpZiAodGhpcy5pbnRlcmFjdGluZygpKSB7XG4gICAgICAgIHNpZ25hbEFyZy50eXBlID0gbnVsbFxuICAgICAgICB0aGlzLm1vdmUoc2lnbmFsQXJnKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wb2ludGVyV2FzTW92ZWQpIHtcbiAgICAgICAgdXRpbHMucG9pbnRlci5jb3B5Q29vcmRzKHRoaXMuY29vcmRzLnByZXYsIHRoaXMuY29vcmRzLmN1cilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAgIC5kcmFnZ2FibGUodHJ1ZSlcbiAgICogICAub24oJ2RyYWdtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAqICAgICBpZiAoc29tZUNvbmRpdGlvbikge1xuICAgKiAgICAgICAvLyBjaGFuZ2UgdGhlIHNuYXAgc2V0dGluZ3NcbiAgICogICAgICAgZXZlbnQuaW50ZXJhY3RhYmxlLmRyYWdnYWJsZSh7IHNuYXA6IHsgdGFyZ2V0czogW10gfX0pXG4gICAqICAgICAgIC8vIGZpcmUgYW5vdGhlciBtb3ZlIGV2ZW50IHdpdGggcmUtY2FsY3VsYXRlZCBzbmFwXG4gICAqICAgICAgIGV2ZW50LmludGVyYWN0aW9uLm1vdmUoKVxuICAgKiAgICAgfVxuICAgKiAgIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBGb3JjZSBhIG1vdmUgb2YgdGhlIGN1cnJlbnQgYWN0aW9uIGF0IHRoZSBzYW1lIGNvb3JkaW5hdGVzLiBVc2VmdWwgaWZcbiAgICogc25hcC9yZXN0cmljdCBoYXMgYmVlbiBjaGFuZ2VkIGFuZCB5b3Ugd2FudCBhIG1vdmVtZW50IHdpdGggdGhlIG5ld1xuICAgKiBzZXR0aW5ncy5cbiAgICovXG4gIG1vdmUgKHNpZ25hbEFyZz8pIHtcbiAgICBpZiAoIXNpZ25hbEFyZyB8fCAhc2lnbmFsQXJnLmV2ZW50KSB7XG4gICAgICB1dGlscy5wb2ludGVyLnNldFplcm9Db29yZHModGhpcy5jb29yZHMuZGVsdGEpXG4gICAgfVxuXG4gICAgc2lnbmFsQXJnID0gdXRpbHMuZXh0ZW5kKHtcbiAgICAgIHBvaW50ZXI6IHRoaXMuX2xhdGVzdFBvaW50ZXIucG9pbnRlcixcbiAgICAgIGV2ZW50OiB0aGlzLl9sYXRlc3RQb2ludGVyLmV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQsXG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICB9LCBzaWduYWxBcmcgfHwge30pXG5cbiAgICBzaWduYWxBcmcucGhhc2UgPSAnbW92ZSdcblxuICAgIHRoaXMuX2RvUGhhc2Uoc2lnbmFsQXJnKVxuICB9XG5cbiAgLy8gRW5kIGludGVyYWN0IG1vdmUgZXZlbnRzIGFuZCBzdG9wIGF1dG8tc2Nyb2xsIHVubGVzcyBzaW11bGF0aW9uIGlzIHJ1bm5pbmdcbiAgcG9pbnRlclVwIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCwgY3VyRXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0KSB7XG4gICAgbGV0IHBvaW50ZXJJbmRleCA9IHRoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG5cbiAgICBpZiAocG9pbnRlckluZGV4ID09PSAtMSkge1xuICAgICAgcG9pbnRlckluZGV4ID0gdGhpcy51cGRhdGVQb2ludGVyKHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IC9jYW5jZWwkL2kudGVzdChldmVudC50eXBlKSA/ICdjYW5jZWwnIDogJ3VwJ1xuXG4gICAgdGhpcy5fc2NvcGVGaXJlKGBpbnRlcmFjdGlvbnM6JHt0eXBlfWAgYXMgJ2ludGVyYWN0aW9uczp1cCcgfCAnaW50ZXJhY3Rpb25zOmNhbmNlbCcsIHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBwb2ludGVySW5kZXgsXG4gICAgICBwb2ludGVySW5mbzogdGhpcy5wb2ludGVyc1twb2ludGVySW5kZXhdLFxuICAgICAgZXZlbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHR5cGU6IHR5cGUgYXMgYW55LFxuICAgICAgY3VyRXZlbnRUYXJnZXQsXG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICB9KVxuXG4gICAgaWYgKCF0aGlzLnNpbXVsYXRpb24pIHtcbiAgICAgIHRoaXMuZW5kKGV2ZW50KVxuICAgIH1cblxuICAgIHRoaXMucG9pbnRlcklzRG93biA9IGZhbHNlXG4gICAgdGhpcy5yZW1vdmVQb2ludGVyKHBvaW50ZXIsIGV2ZW50KVxuICB9XG5cbiAgZG9jdW1lbnRCbHVyIChldmVudCkge1xuICAgIHRoaXMuZW5kKGV2ZW50KVxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOmJsdXInLCB7IGV2ZW50LCB0eXBlOiAnYmx1cicsIGludGVyYWN0aW9uOiB0aGlzIH0pXG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAgIC5kcmFnZ2FibGUodHJ1ZSlcbiAgICogICAub24oJ21vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICogICAgIGlmIChldmVudC5wYWdlWCA+IDEwMDApIHtcbiAgICogICAgICAgLy8gZW5kIHRoZSBjdXJyZW50IGFjdGlvblxuICAgKiAgICAgICBldmVudC5pbnRlcmFjdGlvbi5lbmQoKVxuICAgKiAgICAgICAvLyBzdG9wIGFsbCBmdXJ0aGVyIGxpc3RlbmVycyBmcm9tIGJlaW5nIGNhbGxlZFxuICAgKiAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgKiAgICAgfVxuICAgKiAgIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gW2V2ZW50XVxuICAgKi9cbiAgZW5kIChldmVudD86IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9lbmRpbmcgPSB0cnVlXG4gICAgZXZlbnQgPSBldmVudCB8fCB0aGlzLl9sYXRlc3RQb2ludGVyLmV2ZW50XG4gICAgbGV0IGVuZFBoYXNlUmVzdWx0XG5cbiAgICBpZiAodGhpcy5pbnRlcmFjdGluZygpKSB7XG4gICAgICBlbmRQaGFzZVJlc3VsdCA9IHRoaXMuX2RvUGhhc2Uoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgICAgIHBoYXNlOiAnZW5kJyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fZW5kaW5nID0gZmFsc2VcblxuICAgIGlmIChlbmRQaGFzZVJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdG9wKClcbiAgICB9XG4gIH1cblxuICBjdXJyZW50QWN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJhY3RpbmcgPyB0aGlzLnByZXBhcmVkLm5hbWUgOiBudWxsXG4gIH1cblxuICBpbnRlcmFjdGluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW5nXG4gIH1cblxuICAvKiogKi9cbiAgc3RvcCAoKSB7XG4gICAgdGhpcy5fc2NvcGVGaXJlKCdpbnRlcmFjdGlvbnM6c3RvcCcsIHsgaW50ZXJhY3Rpb246IHRoaXMgfSlcblxuICAgIHRoaXMuaW50ZXJhY3RhYmxlID0gdGhpcy5lbGVtZW50ID0gbnVsbFxuXG4gICAgdGhpcy5faW50ZXJhY3RpbmcgPSBmYWxzZVxuICAgIHRoaXMuX3N0b3BwZWQgPSB0cnVlXG4gICAgdGhpcy5wcmVwYXJlZC5uYW1lID0gdGhpcy5wcmV2RXZlbnQgPSBudWxsXG4gIH1cblxuICBnZXRQb2ludGVySW5kZXggKHBvaW50ZXIpIHtcbiAgICBjb25zdCBwb2ludGVySWQgPSB1dGlscy5wb2ludGVyLmdldFBvaW50ZXJJZChwb2ludGVyKVxuXG4gICAgLy8gbW91c2UgYW5kIHBlbiBpbnRlcmFjdGlvbnMgbWF5IGhhdmUgb25seSBvbmUgcG9pbnRlclxuICAgIHJldHVybiAodGhpcy5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCB0aGlzLnBvaW50ZXJUeXBlID09PSAncGVuJylcbiAgICAgID8gdGhpcy5wb2ludGVycy5sZW5ndGggLSAxXG4gICAgICA6IHV0aWxzLmFyci5maW5kSW5kZXgodGhpcy5wb2ludGVycywgY3VyUG9pbnRlciA9PiBjdXJQb2ludGVyLmlkID09PSBwb2ludGVySWQpXG4gIH1cblxuICBnZXRQb2ludGVySW5mbyAocG9pbnRlcikge1xuICAgIHJldHVybiB0aGlzLnBvaW50ZXJzW3RoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXVxuICB9XG5cbiAgdXBkYXRlUG9pbnRlciAocG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUsIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLCBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsIGRvd24/OiBib29sZWFuKSB7XG4gICAgY29uc3QgaWQgPSB1dGlscy5wb2ludGVyLmdldFBvaW50ZXJJZChwb2ludGVyKVxuICAgIGxldCBwb2ludGVySW5kZXggPSB0aGlzLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuICAgIGxldCBwb2ludGVySW5mbyA9IHRoaXMucG9pbnRlcnNbcG9pbnRlckluZGV4XVxuXG4gICAgZG93biA9IGRvd24gPT09IGZhbHNlXG4gICAgICA/IGZhbHNlXG4gICAgICA6IGRvd24gfHwgLyhkb3dufHN0YXJ0KSQvaS50ZXN0KGV2ZW50LnR5cGUpXG5cbiAgICBpZiAoIXBvaW50ZXJJbmZvKSB7XG4gICAgICBwb2ludGVySW5mbyA9IG5ldyBQb2ludGVySW5mbyhcbiAgICAgICAgaWQsXG4gICAgICAgIHBvaW50ZXIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKVxuXG4gICAgICBwb2ludGVySW5kZXggPSB0aGlzLnBvaW50ZXJzLmxlbmd0aFxuICAgICAgdGhpcy5wb2ludGVycy5wdXNoKHBvaW50ZXJJbmZvKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHBvaW50ZXJJbmZvLnBvaW50ZXIgPSBwb2ludGVyXG4gICAgfVxuXG4gICAgdXRpbHMucG9pbnRlci5zZXRDb29yZHModGhpcy5jb29yZHMuY3VyLCB0aGlzLnBvaW50ZXJzLm1hcChwID0+IHAucG9pbnRlciksIHRoaXMuX25vdygpKVxuICAgIHV0aWxzLnBvaW50ZXIuc2V0Q29vcmREZWx0YXModGhpcy5jb29yZHMuZGVsdGEsIHRoaXMuY29vcmRzLnByZXYsIHRoaXMuY29vcmRzLmN1cilcblxuICAgIGlmIChkb3duKSB7XG4gICAgICB0aGlzLnBvaW50ZXJJc0Rvd24gPSB0cnVlXG5cbiAgICAgIHBvaW50ZXJJbmZvLmRvd25UaW1lID0gdGhpcy5jb29yZHMuY3VyLnRpbWVTdGFtcFxuICAgICAgcG9pbnRlckluZm8uZG93blRhcmdldCA9IGV2ZW50VGFyZ2V0XG4gICAgICB1dGlscy5wb2ludGVyLnBvaW50ZXJFeHRlbmQodGhpcy5kb3duUG9pbnRlciwgcG9pbnRlcilcblxuICAgICAgaWYgKCF0aGlzLmludGVyYWN0aW5nKCkpIHtcbiAgICAgICAgdXRpbHMucG9pbnRlci5jb3B5Q29vcmRzKHRoaXMuY29vcmRzLnN0YXJ0LCB0aGlzLmNvb3Jkcy5jdXIpXG4gICAgICAgIHV0aWxzLnBvaW50ZXIuY29weUNvb3Jkcyh0aGlzLmNvb3Jkcy5wcmV2LCB0aGlzLmNvb3Jkcy5jdXIpXG5cbiAgICAgICAgdGhpcy5kb3duRXZlbnQgPSBldmVudFxuICAgICAgICB0aGlzLnBvaW50ZXJXYXNNb3ZlZCA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlTGF0ZXN0UG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQpXG5cbiAgICB0aGlzLl9zY29wZUZpcmUoJ2ludGVyYWN0aW9uczp1cGRhdGUtcG9pbnRlcicsIHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBldmVudCxcbiAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgZG93bixcbiAgICAgIHBvaW50ZXJJbmZvLFxuICAgICAgcG9pbnRlckluZGV4LFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfSlcblxuICAgIHJldHVybiBwb2ludGVySW5kZXhcbiAgfVxuXG4gIHJlbW92ZVBvaW50ZXIgKHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLCBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSkge1xuICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IHRoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG5cbiAgICBpZiAocG9pbnRlckluZGV4ID09PSAtMSkgeyByZXR1cm4gfVxuXG4gICAgY29uc3QgcG9pbnRlckluZm8gPSB0aGlzLnBvaW50ZXJzW3BvaW50ZXJJbmRleF1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOnJlbW92ZS1wb2ludGVyJywge1xuICAgICAgcG9pbnRlcixcbiAgICAgIGV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IG51bGwsXG4gICAgICBwb2ludGVySW5kZXgsXG4gICAgICBwb2ludGVySW5mbyxcbiAgICAgIGludGVyYWN0aW9uOiB0aGlzLFxuICAgIH0pXG5cbiAgICB0aGlzLnBvaW50ZXJzLnNwbGljZShwb2ludGVySW5kZXgsIDEpXG4gIH1cblxuICBfdXBkYXRlTGF0ZXN0UG9pbnRlciAocG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5wb2ludGVyID0gcG9pbnRlclxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnQgPSBldmVudFxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldFxuICB9XG5cbiAgZGVzdHJveSAoKSB7XG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5wb2ludGVyID0gbnVsbFxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnQgPSBudWxsXG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5ldmVudFRhcmdldCA9IG51bGxcbiAgfVxuXG4gIF9jcmVhdGVQcmVwYXJlZEV2ZW50PFAgZXh0ZW5kcyBFdmVudFBoYXNlPiAoZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIHBoYXNlOiBQLCBwcmVFbmQ/OiBib29sZWFuLCB0eXBlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBJbnRlcmFjdEV2ZW50PFQsIFA+KHRoaXMsIGV2ZW50LCB0aGlzLnByZXBhcmVkLm5hbWUsIHBoYXNlLCB0aGlzLmVsZW1lbnQsIHByZUVuZCwgdHlwZSlcbiAgfVxuXG4gIF9maXJlRXZlbnQ8UCBleHRlbmRzIEV2ZW50UGhhc2U+IChpRXZlbnQ6IEludGVyYWN0RXZlbnQ8VCwgUD4pIHtcbiAgICB0aGlzLmludGVyYWN0YWJsZS5maXJlKGlFdmVudClcblxuICAgIGlmICghdGhpcy5wcmV2RXZlbnQgfHwgaUV2ZW50LnRpbWVTdGFtcCA+PSB0aGlzLnByZXZFdmVudC50aW1lU3RhbXApIHtcbiAgICAgIHRoaXMucHJldkV2ZW50ID0gaUV2ZW50XG4gICAgfVxuICB9XG5cbiAgX2RvUGhhc2U8UCBleHRlbmRzIEV2ZW50UGhhc2U+IChzaWduYWxBcmc6IE9taXQ8RG9QaGFzZUFyZzxULCBQPiwgJ2lFdmVudCc+ICYgeyBpRXZlbnQ/OiBJbnRlcmFjdEV2ZW50PFQsIFA+IH0pIHtcbiAgICBjb25zdCB7IGV2ZW50LCBwaGFzZSwgcHJlRW5kLCB0eXBlIH0gPSBzaWduYWxBcmdcbiAgICBjb25zdCB7IHJlY3QgfSA9IHRoaXNcblxuICAgIGlmIChyZWN0ICYmIHBoYXNlID09PSAnbW92ZScpIHtcbiAgICAgIC8vIHVwZGF0ZSB0aGUgcmVjdCBjaGFuZ2VzIGR1ZSB0byBwb2ludGVyIG1vdmVcbiAgICAgIHV0aWxzLnJlY3QuYWRkRWRnZXModGhpcy5lZGdlcywgcmVjdCwgdGhpcy5jb29yZHMuZGVsdGFbdGhpcy5pbnRlcmFjdGFibGUub3B0aW9ucy5kZWx0YVNvdXJjZV0pXG5cbiAgICAgIHJlY3Qud2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0XG4gICAgICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgICB9XG5cbiAgICBjb25zdCBiZWZvcmVSZXN1bHQgPSB0aGlzLl9zY29wZUZpcmUoYGludGVyYWN0aW9uczpiZWZvcmUtYWN0aW9uLSR7cGhhc2V9YCBhcyBhbnksIHNpZ25hbEFyZylcblxuICAgIGlmIChiZWZvcmVSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBpRXZlbnQgPSBzaWduYWxBcmcuaUV2ZW50ID0gdGhpcy5fY3JlYXRlUHJlcGFyZWRFdmVudChldmVudCwgcGhhc2UsIHByZUVuZCwgdHlwZSlcblxuICAgIHRoaXMuX3Njb3BlRmlyZShgaW50ZXJhY3Rpb25zOmFjdGlvbi0ke3BoYXNlfWAgYXMgYW55LCBzaWduYWxBcmcpXG5cbiAgICBpZiAocGhhc2UgPT09ICdzdGFydCcpIHsgdGhpcy5wcmV2RXZlbnQgPSBpRXZlbnQgfVxuXG4gICAgdGhpcy5fZmlyZUV2ZW50KGlFdmVudClcblxuICAgIHRoaXMuX3Njb3BlRmlyZShgaW50ZXJhY3Rpb25zOmFmdGVyLWFjdGlvbi0ke3BoYXNlfWAgYXMgYW55LCBzaWduYWxBcmcpXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX25vdyAoKSB7IHJldHVybiBEYXRlLm5vdygpIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJhY3Rpb25cbmV4cG9ydCB7IFBvaW50ZXJJbmZvIH1cbiIsImltcG9ydCAqIGFzIGRvbSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21VdGlscydcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hEZXRhaWxzIHtcbiAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGVcbiAgcG9pbnRlcklkOiBudW1iZXJcbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuICBldmVudFR5cGU6IHN0cmluZ1xuICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgY3VyRXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZVxufVxuXG5jb25zdCBmaW5kZXIgPSB7XG4gIG1ldGhvZE9yZGVyOiBbJ3NpbXVsYXRpb25SZXN1bWUnLCAnbW91c2VPclBlbicsICdoYXNQb2ludGVyJywgJ2lkbGUnXSBhcyBjb25zdCxcblxuICBzZWFyY2ggKGRldGFpbHM6IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBmaW5kZXIubWV0aG9kT3JkZXIpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZmluZGVyW21ldGhvZF0oZGV0YWlscylcblxuICAgICAgaWYgKGludGVyYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgLy8gdHJ5IHRvIHJlc3VtZSBzaW11bGF0aW9uIHdpdGggYSBuZXcgcG9pbnRlclxuICBzaW11bGF0aW9uUmVzdW1lICh7IHBvaW50ZXJUeXBlLCBldmVudFR5cGUsIGV2ZW50VGFyZ2V0LCBzY29wZSB9OiBTZWFyY2hEZXRhaWxzKSB7XG4gICAgaWYgKCEvZG93bnxzdGFydC9pLnRlc3QoZXZlbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICBsZXQgZWxlbWVudCA9IGV2ZW50VGFyZ2V0IGFzIE5vZGVcblxuICAgICAgaWYgKGludGVyYWN0aW9uLnNpbXVsYXRpb24gJiYgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbi5hbGxvd1Jlc3VtZSAmJlxuICAgICAgICAgIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpKSB7XG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XG4gICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgdGhlIGludGVyYWN0aW9uIGVsZW1lbnRcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gaW50ZXJhY3Rpb24uZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGludGVyYWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQgPSBkb20ucGFyZW50Tm9kZShlbGVtZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICAvLyBpZiBpdCdzIGEgbW91c2Ugb3IgcGVuIGludGVyYWN0aW9uXG4gIG1vdXNlT3JQZW4gKHsgcG9pbnRlcklkLCBwb2ludGVyVHlwZSwgZXZlbnRUeXBlLCBzY29wZSB9OiBTZWFyY2hEZXRhaWxzKSB7XG4gICAgaWYgKHBvaW50ZXJUeXBlICE9PSAnbW91c2UnICYmIHBvaW50ZXJUeXBlICE9PSAncGVuJykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBsZXQgZmlyc3ROb25BY3RpdmVcblxuICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpIHtcbiAgICAgICAgLy8gaWYgaXQncyBhIGRvd24gZXZlbnQsIHNraXAgaW50ZXJhY3Rpb25zIHdpdGggcnVubmluZyBzaW11bGF0aW9uc1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiAmJiAhaGFzUG9pbnRlcklkKGludGVyYWN0aW9uLCBwb2ludGVySWQpKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICAvLyBpZiB0aGUgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLCByZXR1cm4gaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2Ugc2F2ZSBpdCBhbmQgbG9vayBmb3IgYW5vdGhlciBhY3RpdmUgaW50ZXJhY3Rpb25cbiAgICAgICAgZWxzZSBpZiAoIWZpcnN0Tm9uQWN0aXZlKSB7XG4gICAgICAgICAgZmlyc3ROb25BY3RpdmUgPSBpbnRlcmFjdGlvblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgbm8gYWN0aXZlIG1vdXNlIGludGVyYWN0aW9uIHdhcyBmb3VuZCB1c2UgdGhlIGZpcnN0IGluYWN0aXZlIG1vdXNlXG4gICAgLy8gaW50ZXJhY3Rpb25cbiAgICBpZiAoZmlyc3ROb25BY3RpdmUpIHtcbiAgICAgIHJldHVybiBmaXJzdE5vbkFjdGl2ZVxuICAgIH1cblxuICAgIC8vIGZpbmQgYW55IG1vdXNlIG9yIHBlbiBpbnRlcmFjdGlvbi5cbiAgICAvLyBpZ25vcmUgdGhlIGludGVyYWN0aW9uIGlmIHRoZSBldmVudFR5cGUgaXMgYSAqZG93biwgYW5kIGEgc2ltdWxhdGlvblxuICAgIC8vIGlzIGFjdGl2ZVxuICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUgJiYgISgvZG93bi9pLnRlc3QoZXZlbnRUeXBlKSAmJiBpbnRlcmFjdGlvbi5zaW11bGF0aW9uKSkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIC8vIGdldCBpbnRlcmFjdGlvbiB0aGF0IGhhcyB0aGlzIHBvaW50ZXJcbiAgaGFzUG9pbnRlciAoeyBwb2ludGVySWQsIHNjb3BlIH06IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICBpZiAoaGFzUG9pbnRlcklkKGludGVyYWN0aW9uLCBwb2ludGVySWQpKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgLy8gZ2V0IGZpcnN0IGlkbGUgaW50ZXJhY3Rpb24gd2l0aCBhIG1hdGNoaW5nIHBvaW50ZXJUeXBlXG4gIGlkbGUgKHsgcG9pbnRlclR5cGUsIHNjb3BlIH06IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICAvLyBpZiB0aGVyZSdzIGFscmVhZHkgYSBwb2ludGVyIGhlbGQgZG93blxuICAgICAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGVcbiAgICAgICAgLy8gZG9uJ3QgYWRkIHRoaXMgcG9pbnRlciBpZiB0aGVyZSBpcyBhIHRhcmdldCBpbnRlcmFjdGFibGUgYW5kIGl0XG4gICAgICAgIC8vIGlzbid0IGdlc3R1cmFibGVcbiAgICAgICAgaWYgKHRhcmdldCAmJiAhKHRhcmdldC5vcHRpb25zLmdlc3R1cmUgJiYgdGFyZ2V0Lm9wdGlvbnMuZ2VzdHVyZS5lbmFibGVkKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG1heGltdW0gb2YgMiBwb2ludGVycyBwZXIgaW50ZXJhY3Rpb25cbiAgICAgIGVsc2UgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSAmJiAocG9pbnRlclR5cGUgPT09IGludGVyYWN0aW9uLnBvaW50ZXJUeXBlKSkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxufVxuXG5mdW5jdGlvbiBoYXNQb2ludGVySWQgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiwgcG9pbnRlcklkOiBudW1iZXIpIHtcbiAgcmV0dXJuIGludGVyYWN0aW9uLnBvaW50ZXJzLnNvbWUoKHsgaWQgfSkgPT4gaWQgPT09IHBvaW50ZXJJZClcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmluZGVyXG4iLCJpbXBvcnQgeyBtYXRjaGVzU2VsZWN0b3IsIG5vZGVDb250YWlucyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV2ZW50cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ldmVudHMnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcbmltcG9ydCB7IGdldFdpbmRvdyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3dpbmRvdydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIHByZXZlbnREZWZhdWx0OiB0eXBlb2YgcHJldmVudERlZmF1bHRcbiAgICBjaGVja0FuZFByZXZlbnREZWZhdWx0OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkXG4gIH1cbn1cblxudHlwZSBQcmV2ZW50RGVmYXVsdFZhbHVlID0gJ2Fsd2F5cycgfCAnbmV2ZXInIHwgJ2F1dG8nXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKTogUHJldmVudERlZmF1bHRWYWx1ZVxuZnVuY3Rpb24gcHJldmVudERlZmF1bHQgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU6IFByZXZlbnREZWZhdWx0VmFsdWUpOiB0eXBlb2YgdGhpc1xuZnVuY3Rpb24gcHJldmVudERlZmF1bHQgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU/OiBQcmV2ZW50RGVmYXVsdFZhbHVlKSB7XG4gIGlmICgvXihhbHdheXN8bmV2ZXJ8YXV0bykkLy50ZXN0KG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCA9IG5ld1ZhbHVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGlmIChpcy5ib29sKG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCA9IG5ld1ZhbHVlID8gJ2Fsd2F5cycgOiAnbmV2ZXInXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMucHJldmVudERlZmF1bHRcbn1cblxuZnVuY3Rpb24gY2hlY2tBbmRQcmV2ZW50RGVmYXVsdCAoaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIHNjb3BlOiBJbnRlcmFjdC5TY29wZSwgZXZlbnQ6IEV2ZW50KSB7XG4gIGNvbnN0IHNldHRpbmcgPSBpbnRlcmFjdGFibGUub3B0aW9ucy5wcmV2ZW50RGVmYXVsdFxuXG4gIGlmIChzZXR0aW5nID09PSAnbmV2ZXInKSB7IHJldHVybiB9XG5cbiAgaWYgKHNldHRpbmcgPT09ICdhbHdheXMnKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gc2V0dGluZyA9PT0gJ2F1dG8nXG5cbiAgLy8gaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMgYW5kIGlzbid0IHJ1bm5pbmcgb24gaU9TLFxuICAvLyBkb24ndCBwcmV2ZW50RGVmYXVsdCBvZiB0b3VjaHtzdGFydCxtb3ZlfSBldmVudHMuIENTUyB0b3VjaC1hY3Rpb24gYW5kXG4gIC8vIHVzZXItc2VsZWN0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgY2FsbGluZyBldmVudC5wcmV2ZW50RGVmYXVsdCgpLlxuICBpZiAoZXZlbnRzLnN1cHBvcnRzUGFzc2l2ZSAmJiAvXnRvdWNoKHN0YXJ0fG1vdmUpJC8udGVzdChldmVudC50eXBlKSkge1xuICAgIGNvbnN0IGRvYyA9IGdldFdpbmRvdyhldmVudC50YXJnZXQpLmRvY3VtZW50XG4gICAgY29uc3QgZG9jT3B0aW9ucyA9IHNjb3BlLmdldERvY09wdGlvbnMoZG9jKVxuXG4gICAgaWYgKCEoZG9jT3B0aW9ucyAmJiBkb2NPcHRpb25zLmV2ZW50cykgfHwgZG9jT3B0aW9ucy5ldmVudHMucGFzc2l2ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8vIGRvbid0IHByZXZlbnREZWZhdWx0IG9mIHBvaW50ZXJkb3duIGV2ZW50c1xuICBpZiAoL14obW91c2V8cG9pbnRlcnx0b3VjaCkqKGRvd258c3RhcnQpL2kudGVzdChldmVudC50eXBlKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gZG9uJ3QgcHJldmVudERlZmF1bHQgb24gZWRpdGFibGUgZWxlbWVudHNcbiAgaWYgKGlzLmVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgbWF0Y2hlc1NlbGVjdG9yKGV2ZW50LnRhcmdldCwgJ2lucHV0LHNlbGVjdCx0ZXh0YXJlYSxbY29udGVudGVkaXRhYmxlPXRydWVdLFtjb250ZW50ZWRpdGFibGU9dHJ1ZV0gKicpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG5cbmZ1bmN0aW9uIG9uSW50ZXJhY3Rpb25FdmVudCAoeyBpbnRlcmFjdGlvbiwgZXZlbnQgfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSkge1xuICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5jaGVja0FuZFByZXZlbnREZWZhdWx0KGV2ZW50IGFzIEV2ZW50KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsIChzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgY29uc3QgeyBJbnRlcmFjdGFibGUgfSA9IHNjb3BlXG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB3aGV0aGVyIHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW91ciBpblxuICAgKiByZXNwb25zZSB0byBwb2ludGVyIGV2ZW50cy4gQ2FuIGJlIHNldCB0bzpcbiAgICogIC0gYCdhbHdheXMnYCB0byBhbHdheXMgcHJldmVudFxuICAgKiAgLSBgJ25ldmVyJ2AgdG8gbmV2ZXIgcHJldmVudFxuICAgKiAgLSBgJ2F1dG8nYCB0byBsZXQgaW50ZXJhY3QuanMgdHJ5IHRvIGRldGVybWluZSB3aGF0IHdvdWxkIGJlIGJlc3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuZXdWYWx1ZV0gYCdhbHdheXMnYCwgYCduZXZlcidgIG9yIGAnYXV0bydgXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IEludGVyYWN0YWJsZX0gVGhlIGN1cnJlbnQgc2V0dGluZyBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IHByZXZlbnREZWZhdWx0XG5cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5jaGVja0FuZFByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGNoZWNrQW5kUHJldmVudERlZmF1bHQodGhpcywgc2NvcGUsIGV2ZW50KVxuICB9XG5cbiAgLy8gcHJldmVudCBuYXRpdmUgSFRNTDUgZHJhZyBvbiBpbnRlcmFjdC5qcyB0YXJnZXQgZWxlbWVudHNcbiAgc2NvcGUuaW50ZXJhY3Rpb25zLmRvY0V2ZW50cy5wdXNoKHtcbiAgICB0eXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICBsaXN0ZW5lciAoZXZlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmVsZW1lbnQgJiZcbiAgICAgICAgICAoaW50ZXJhY3Rpb24uZWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0IHx8XG4gICAgICAgICAgIG5vZGVDb250YWlucyhpbnRlcmFjdGlvbi5lbGVtZW50LCBldmVudC50YXJnZXQpKSkge1xuICAgICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5jaGVja0FuZFByZXZlbnREZWZhdWx0KGV2ZW50KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2NvcmUvaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IFsnZG93bicsICdtb3ZlJywgJ3VwJywgJ2NhbmNlbCddLnJlZHVjZSgoYWNjLCBldmVudFR5cGUpID0+IHtcbiAgICBhY2NbYGludGVyYWN0aW9uczoke2V2ZW50VHlwZX1gXSA9IG9uSW50ZXJhY3Rpb25FdmVudFxuICAgIHJldHVybiBhY2NcbiAgfSwge30gYXMgYW55KSxcbn1cbiIsImltcG9ydCBCYXNlRXZlbnQgZnJvbSAnQGludGVyYWN0anMvY29yZS9CYXNlRXZlbnQnXG5pbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IEludGVyYWN0RXZlbnQgZnJvbSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcblxuY2xhc3MgRHJvcEV2ZW50IGV4dGVuZHMgQmFzZUV2ZW50IHtcbiAgdGFyZ2V0OiBJbnRlcmFjdC5FbGVtZW50XG4gIGRyb3B6b25lOiBJbnRlcmFjdGFibGVcbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdEV2ZW50PCdkcmFnJz5cbiAgcmVsYXRlZFRhcmdldDogSW50ZXJhY3QuRWxlbWVudFxuICBkcmFnZ2FibGU6IEludGVyYWN0YWJsZVxuICB0aW1lU3RhbXA6IG51bWJlclxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBDbGFzcyBvZiBldmVudHMgZmlyZWQgb24gZHJvcHpvbmVzIGR1cmluZyBkcmFncyB3aXRoIGFjY2VwdGFibGUgdGFyZ2V0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChkcm9wU3RhdGU6IGltcG9ydCgnLi8nKS5Ecm9wU3RhdGUsIGRyYWdFdmVudDogSW50ZXJhY3RFdmVudDwnZHJhZyc+LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihkcmFnRXZlbnQuX2ludGVyYWN0aW9uKVxuXG4gICAgY29uc3QgeyBlbGVtZW50LCBkcm9wem9uZSB9ID0gdHlwZSA9PT0gJ2RyYWdsZWF2ZSdcbiAgICAgID8gZHJvcFN0YXRlLnByZXZcbiAgICAgIDogZHJvcFN0YXRlLmN1clxuXG4gICAgdGhpcy50eXBlICAgICAgICAgID0gdHlwZVxuICAgIHRoaXMudGFyZ2V0ICAgICAgICA9IGVsZW1lbnRcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50XG4gICAgdGhpcy5kcm9wem9uZSAgICAgID0gZHJvcHpvbmVcbiAgICB0aGlzLmRyYWdFdmVudCAgICAgPSBkcmFnRXZlbnRcbiAgICB0aGlzLnJlbGF0ZWRUYXJnZXQgPSBkcmFnRXZlbnQudGFyZ2V0XG4gICAgdGhpcy5kcmFnZ2FibGUgICAgID0gZHJhZ0V2ZW50LmludGVyYWN0YWJsZVxuICAgIHRoaXMudGltZVN0YW1wICAgICA9IGRyYWdFdmVudC50aW1lU3RhbXBcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIGEgYGRyb3BhY3RpdmF0ZWAgZXZlbnQsIHRoZSBkcm9wem9uZSBlbGVtZW50IHdpbGwgYmVcbiAgICogZGVhY3RpdmF0ZWQuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYSBgZHJhZ21vdmVgIG9yIGBkcmFnZW50ZXJgLCBhIGBkcmFnbGVhdmVgIHdpbGwgYmUgZmlyZWQgb24gdGhlXG4gICAqIGRyb3B6b25lIGVsZW1lbnQgYW5kIG1vcmUuXG4gICAqL1xuICByZWplY3QgKCkge1xuICAgIGNvbnN0IHsgZHJvcFN0YXRlIH0gPSB0aGlzLl9pbnRlcmFjdGlvblxuXG4gICAgaWYgKFxuICAgICAgKHRoaXMudHlwZSAhPT0gJ2Ryb3BhY3RpdmF0ZScpICYmIChcbiAgICAgICAgIXRoaXMuZHJvcHpvbmUgfHxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSAhPT0gdGhpcy5kcm9wem9uZSB8fFxuICAgICAgICBkcm9wU3RhdGUuY3VyLmVsZW1lbnQgIT09IHRoaXMudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZHJvcFN0YXRlLnByZXYuZHJvcHpvbmUgPSB0aGlzLmRyb3B6b25lXG4gICAgZHJvcFN0YXRlLnByZXYuZWxlbWVudCA9IHRoaXMudGFyZ2V0XG5cbiAgICBkcm9wU3RhdGUucmVqZWN0ZWQgPSB0cnVlXG4gICAgZHJvcFN0YXRlLmV2ZW50cy5lbnRlciA9IG51bGxcblxuICAgIHRoaXMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkcm9wYWN0aXZhdGUnKSB7XG4gICAgICBjb25zdCBhY3RpdmVEcm9wcyA9IGRyb3BTdGF0ZS5hY3RpdmVEcm9wc1xuICAgICAgY29uc3QgaW5kZXggPSBhcnIuZmluZEluZGV4KGFjdGl2ZURyb3BzLCAoeyBkcm9wem9uZSwgZWxlbWVudCB9KSA9PlxuICAgICAgICBkcm9wem9uZSA9PT0gdGhpcy5kcm9wem9uZSAmJiBlbGVtZW50ID09PSB0aGlzLnRhcmdldClcblxuICAgICAgZHJvcFN0YXRlLmFjdGl2ZURyb3BzLnNwbGljZShpbmRleCwgMSlcblxuICAgICAgY29uc3QgZGVhY3RpdmF0ZUV2ZW50ID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIHRoaXMuZHJhZ0V2ZW50LCAnZHJvcGRlYWN0aXZhdGUnKVxuXG4gICAgICBkZWFjdGl2YXRlRXZlbnQuZHJvcHpvbmUgPSB0aGlzLmRyb3B6b25lXG4gICAgICBkZWFjdGl2YXRlRXZlbnQudGFyZ2V0ID0gdGhpcy50YXJnZXRcblxuICAgICAgdGhpcy5kcm9wem9uZS5maXJlKGRlYWN0aXZhdGVFdmVudClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRyb3B6b25lLmZpcmUobmV3IERyb3BFdmVudChkcm9wU3RhdGUsIHRoaXMuZHJhZ0V2ZW50LCAnZHJhZ2xlYXZlJykpXG4gICAgfVxuICB9XG5cbiAgcHJldmVudERlZmF1bHQgKCkge31cblxuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERyb3BFdmVudFxuIiwiaW1wb3J0IEludGVyYWN0YWJsZSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZSdcbmltcG9ydCBJbnRlcmFjdEV2ZW50IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RFdmVudCdcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9zY29wZSdcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0IGRyYWcgZnJvbSAnLi4vZHJhZydcbmltcG9ydCBEcm9wRXZlbnQgZnJvbSAnLi9Ecm9wRXZlbnQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcHpvbmVNZXRob2Qge1xuICAob3B0aW9uczogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zIHwgYm9vbGVhbik6IEludGVyYWN0LkludGVyYWN0YWJsZVxuICAoKTogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBkcm9wem9uZTogRHJvcHpvbmVNZXRob2RcbiAgICBkcm9wQ2hlY2s6IChcbiAgICAgIGRyYWdFdmVudDogSW50ZXJhY3RFdmVudCxcbiAgICAgIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLFxuICAgICAgZHJhZ2dhYmxlOiBJbnRlcmFjdGFibGUsXG4gICAgICBkcmFnZ2FibGVFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgICAgZHJvcEVsZW1lbjogSW50ZXJhY3QuRWxlbWVudCxcbiAgICAgIHJlY3Q6IGFueVxuICAgICkgPT4gYm9vbGVhblxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgZHJvcFN0YXRlPzogRHJvcFN0YXRlXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBkcm9wOiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgQWN0aW9uTWFwIHtcbiAgICBkcm9wPzogdHlwZW9mIGRyb3BcbiAgfVxuXG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgZHluYW1pY0Ryb3A/OiBib29sZWFuXG4gIH1cblxuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2FjdGlvbnMvZHJvcDpzdGFydCc6IERyb3BTaWduYWxBcmdcbiAgICAnYWN0aW9ucy9kcm9wOm1vdmUnOiBEcm9wU2lnbmFsQXJnXG4gICAgJ2FjdGlvbnMvZHJvcDplbmQnOiBEcm9wU2lnbmFsQXJnXG4gIH1cbn1cblxuaW50ZXJmYWNlIERyb3BTaWduYWxBcmcge1xuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdC5EcmFnRXZlbnRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEcm9wU3RhdGUge1xuICBjdXI6IHtcbiAgICBkcm9wem9uZTogSW50ZXJhY3RhYmxlICAgIC8vIHRoZSBkcm9wem9uZSBhIGRyYWcgdGFyZ2V0IG1pZ2h0IGJlIGRyb3BwZWQgaW50b1xuICAgIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQgLy8gdGhlIGVsZW1lbnQgYXQgdGhlIHRpbWUgb2YgY2hlY2tpbmdcbiAgfVxuICBwcmV2OiB7XG4gICAgZHJvcHpvbmU6IEludGVyYWN0YWJsZSAgICAvLyB0aGUgZHJvcHpvbmUgdGhhdCB3YXMgcmVjZW50bHkgZHJhZ2dlZCBhd2F5IGZyb21cbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50IC8vIHRoZSBlbGVtZW50IGF0IHRoZSB0aW1lIG9mIGNoZWNraW5nXG4gIH1cbiAgcmVqZWN0ZWQ6IGJvb2xlYW4gICAgICAgICAgIC8vIHdoZWF0aGVyIHRoZSBwb3RlbnRpYWwgZHJvcCB3YXMgcmVqZWN0ZWQgZnJvbSBhIGxpc3RlbmVyXG4gIGV2ZW50czogYW55ICAgICAgICAgICAgICAgICAvLyB0aGUgZHJvcCBldmVudHMgcmVsYXRlZCB0byB0aGUgY3VycmVudCBkcmFnIGV2ZW50XG4gIGFjdGl2ZURyb3BzOiBBcnJheTx7XG4gICAgZHJvcHpvbmU6IEludGVyYWN0YWJsZVxuICAgIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbiAgICByZWN0OiBJbnRlcmFjdC5SZWN0XG4gIH0+XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgYWN0aW9ucyxcbiAgICAvKiogQGxlbmRzIG1vZHVsZTppbnRlcmFjdCAqL1xuICAgIGludGVyYWN0LFxuICAgIC8qKiBAbGVuZHMgSW50ZXJhY3RhYmxlICovXG4gICAgSW50ZXJhY3RhYmxlLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNoYWRvd1xuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS51c2VQbHVnaW4oZHJhZylcblxuICAvKipcbiAgICpcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QoJy5kcm9wJykuZHJvcHpvbmUoe1xuICAgKiAgIGFjY2VwdDogJy5jYW4tZHJvcCcgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbmdsZS1kcm9wJyksXG4gICAqICAgb3ZlcmxhcDogJ3BvaW50ZXInIHx8ICdjZW50ZXInIHx8IHplcm9Ub09uZVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXR1cm5zIG9yIHNldHMgd2hldGhlciBkcmFnZ2FibGVzIGNhbiBiZSBkcm9wcGVkIG9udG8gdGhpcyB0YXJnZXQgdG9cbiAgICogdHJpZ2dlciBkcm9wIGV2ZW50c1xuICAgKlxuICAgKiBEcm9wem9uZXMgY2FuIHJlY2VpdmUgdGhlIGZvbGxvd2luZyBldmVudHM6XG4gICAqICAtIGBkcm9wYWN0aXZhdGVgIGFuZCBgZHJvcGRlYWN0aXZhdGVgIHdoZW4gYW4gYWNjZXB0YWJsZSBkcmFnIHN0YXJ0cyBhbmQgZW5kc1xuICAgKiAgLSBgZHJhZ2VudGVyYCBhbmQgYGRyYWdsZWF2ZWAgd2hlbiBhIGRyYWdnYWJsZSBlbnRlcnMgYW5kIGxlYXZlcyB0aGUgZHJvcHpvbmVcbiAgICogIC0gYGRyYWdtb3ZlYCB3aGVuIGEgZHJhZ2dhYmxlIHRoYXQgaGFzIGVudGVyZWQgdGhlIGRyb3B6b25lIGlzIG1vdmVkXG4gICAqICAtIGBkcm9wYCB3aGVuIGEgZHJhZ2dhYmxlIGlzIGRyb3BwZWQgaW50byB0aGlzIGRyb3B6b25lXG4gICAqXG4gICAqIFVzZSB0aGUgYGFjY2VwdGAgb3B0aW9uIHRvIGFsbG93IG9ubHkgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gQ1NTXG4gICAqIHNlbGVjdG9yIG9yIGVsZW1lbnQuIFRoZSB2YWx1ZSBjYW4gYmU6XG4gICAqXG4gICAqICAtICoqYW4gRWxlbWVudCoqIC0gb25seSB0aGF0IGVsZW1lbnQgY2FuIGJlIGRyb3BwZWQgaW50byB0aGlzIGRyb3B6b25lLlxuICAgKiAgLSAqKmEgc3RyaW5nKiosIC0gdGhlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZCBtdXN0IG1hdGNoIGl0IGFzIGEgQ1NTIHNlbGVjdG9yLlxuICAgKiAgLSAqKmBudWxsYCoqIC0gYWNjZXB0IG9wdGlvbnMgaXMgY2xlYXJlZCAtIGl0IGFjY2VwdHMgYW55IGVsZW1lbnQuXG4gICAqXG4gICAqIFVzZSB0aGUgYG92ZXJsYXBgIG9wdGlvbiB0byBzZXQgaG93IGRyb3BzIGFyZSBjaGVja2VkIGZvci4gVGhlIGFsbG93ZWRcbiAgICogdmFsdWVzIGFyZTpcbiAgICpcbiAgICogICAtIGAncG9pbnRlcidgLCB0aGUgcG9pbnRlciBtdXN0IGJlIG92ZXIgdGhlIGRyb3B6b25lIChkZWZhdWx0KVxuICAgKiAgIC0gYCdjZW50ZXInYCwgdGhlIGRyYWdnYWJsZSBlbGVtZW50J3MgY2VudGVyIG11c3QgYmUgb3ZlciB0aGUgZHJvcHpvbmVcbiAgICogICAtIGEgbnVtYmVyIGZyb20gMC0xIHdoaWNoIGlzIHRoZSBgKGludGVyc2VjdGlvbiBhcmVhKSAvIChkcmFnZ2FibGUgYXJlYSlgLlxuICAgKiAgIGUuZy4gYDAuNWAgZm9yIGRyb3AgdG8gaGFwcGVuIHdoZW4gaGFsZiBvZiB0aGUgYXJlYSBvZiB0aGUgZHJhZ2dhYmxlIGlzXG4gICAqICAgb3ZlciB0aGUgZHJvcHpvbmVcbiAgICpcbiAgICogVXNlIHRoZSBgY2hlY2tlcmAgb3B0aW9uIHRvIHNwZWNpZnkgYSBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGRyYWdnZWQgZWxlbWVudFxuICAgKiBpcyBvdmVyIHRoaXMgSW50ZXJhY3RhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW4gfCBvYmplY3QgfCBudWxsfSBbb3B0aW9uc10gVGhlIG5ldyBvcHRpb25zIHRvIGJlIHNldC5cbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IEludGVyYWN0YWJsZX0gVGhlIGN1cnJlbnQgc2V0dGluZyBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5kcm9wem9uZSA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIG9wdGlvbnM/OiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnMgfCBib29sZWFuKSB7XG4gICAgcmV0dXJuIGRyb3B6b25lTWV0aG9kKHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAuZHJvcENoZWNrZXIoZnVuY3Rpb24oZHJhZ0V2ZW50LCAgICAgICAgIC8vIHJlbGF0ZWQgZHJhZ21vdmUgb3IgZHJhZ2VuZCBldmVudFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsICAgICAgICAgICAgIC8vIFRvdWNoRXZlbnQvUG9pbnRlckV2ZW50L01vdXNlRXZlbnRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsICAgICAgICAgICAvLyBib29sIHJlc3VsdCBvZiB0aGUgZGVmYXVsdCBjaGVja2VyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcm9wem9uZSwgICAgICAgICAgLy8gZHJvcHpvbmUgSW50ZXJhY3RhYmxlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcm9wRWxlbWVudCwgICAgICAgLy8gZHJvcHpvbmUgZWxlbW50XG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGUsICAgICAgICAgLy8gZHJhZ2dhYmxlIEludGVyYWN0YWJsZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlRWxlbWVudCkgey8vIGRyYWdnYWJsZSBlbGVtZW50XG4gICAqXG4gICAqICAgcmV0dXJuIGRyb3BwZWQgJiYgZXZlbnQudGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnYWxsb3ctZHJvcCcpXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyb3BDaGVjayA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIGRyYWdFdmVudCwgZXZlbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudCwgZHJvcEVsZW1lbnQsIHJlY3QpIHtcbiAgICByZXR1cm4gZHJvcENoZWNrTWV0aG9kKHRoaXMsIGRyYWdFdmVudCwgZXZlbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudCwgZHJvcEVsZW1lbnQsIHJlY3QpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHdoZXRoZXIgdGhlIGRpbWVuc2lvbnMgb2YgZHJvcHpvbmUgZWxlbWVudHMgYXJlIGNhbGN1bGF0ZWRcbiAgICogb24gZXZlcnkgZHJhZ21vdmUgb3Igb25seSBvbiBkcmFnc3RhcnQgZm9yIHRoZSBkZWZhdWx0IGRyb3BDaGVja2VyXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25ld1ZhbHVlXSBUcnVlIHRvIGNoZWNrIG9uIGVhY2ggbW92ZS4gRmFsc2UgdG8gY2hlY2sgb25seVxuICAgKiBiZWZvcmUgc3RhcnRcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IGludGVyYWN0fSBUaGUgY3VycmVudCBzZXR0aW5nIG9yIGludGVyYWN0XG4gICAqL1xuICBpbnRlcmFjdC5keW5hbWljRHJvcCA9IGZ1bmN0aW9uIChuZXdWYWx1ZT86IGJvb2xlYW4pIHtcbiAgICBpZiAodXRpbHMuaXMuYm9vbChuZXdWYWx1ZSkpIHtcbiAgICAgIC8vIGlmIChkcmFnZ2luZyAmJiBzY29wZS5keW5hbWljRHJvcCAhPT0gbmV3VmFsdWUgJiYgIW5ld1ZhbHVlKSB7XG4gICAgICAvLyAgY2FsY1JlY3RzKGRyb3B6b25lcylcbiAgICAgIC8vIH1cblxuICAgICAgc2NvcGUuZHluYW1pY0Ryb3AgPSBuZXdWYWx1ZVxuXG4gICAgICByZXR1cm4gaW50ZXJhY3RcbiAgICB9XG4gICAgcmV0dXJuIHNjb3BlLmR5bmFtaWNEcm9wXG4gIH1cblxuICB1dGlscy5leHRlbmQoYWN0aW9ucy5waGFzZWxlc3NUeXBlcywge1xuICAgIGRyYWdlbnRlcjogdHJ1ZSxcbiAgICBkcmFnbGVhdmU6IHRydWUsXG4gICAgZHJvcGFjdGl2YXRlOiB0cnVlLFxuICAgIGRyb3BkZWFjdGl2YXRlOiB0cnVlLFxuICAgIGRyb3Btb3ZlOiB0cnVlLFxuICAgIGRyb3A6IHRydWUsXG4gIH0pXG4gIGFjdGlvbnMubWV0aG9kRGljdC5kcm9wID0gJ2Ryb3B6b25lJ1xuXG4gIHNjb3BlLmR5bmFtaWNEcm9wID0gZmFsc2VcblxuICBkZWZhdWx0cy5hY3Rpb25zLmRyb3AgPSBkcm9wLmRlZmF1bHRzXG59XG5cbmZ1bmN0aW9uIGNvbGxlY3REcm9wcyAoeyBpbnRlcmFjdGFibGVzIH0sIGRyYWdnYWJsZUVsZW1lbnQpIHtcbiAgY29uc3QgZHJvcHMgPSBbXVxuXG4gIC8vIGNvbGxlY3QgYWxsIGRyb3B6b25lcyBhbmQgdGhlaXIgZWxlbWVudHMgd2hpY2ggcXVhbGlmeSBmb3IgYSBkcm9wXG4gIGZvciAoY29uc3QgZHJvcHpvbmUgb2YgaW50ZXJhY3RhYmxlcy5saXN0KSB7XG4gICAgaWYgKCFkcm9wem9uZS5vcHRpb25zLmRyb3AuZW5hYmxlZCkgeyBjb250aW51ZSB9XG5cbiAgICBjb25zdCBhY2NlcHQgPSBkcm9wem9uZS5vcHRpb25zLmRyb3AuYWNjZXB0XG5cbiAgICAvLyB0ZXN0IHRoZSBkcmFnZ2FibGUgZHJhZ2dhYmxlRWxlbWVudCBhZ2FpbnN0IHRoZSBkcm9wem9uZSdzIGFjY2VwdCBzZXR0aW5nXG4gICAgaWYgKCh1dGlscy5pcy5lbGVtZW50KGFjY2VwdCkgJiYgYWNjZXB0ICE9PSBkcmFnZ2FibGVFbGVtZW50KSB8fFxuICAgICAgICAodXRpbHMuaXMuc3RyaW5nKGFjY2VwdCkgJiZcbiAgICAgICAgIXV0aWxzLmRvbS5tYXRjaGVzU2VsZWN0b3IoZHJhZ2dhYmxlRWxlbWVudCwgYWNjZXB0KSkgfHxcbiAgICAgICAgKHV0aWxzLmlzLmZ1bmMoYWNjZXB0KSAmJiAhYWNjZXB0KHsgZHJvcHpvbmUsIGRyYWdnYWJsZUVsZW1lbnQgfSkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIHF1ZXJ5IGZvciBuZXcgZWxlbWVudHMgaWYgbmVjZXNzYXJ5XG4gICAgY29uc3QgZHJvcEVsZW1lbnRzID0gdXRpbHMuaXMuc3RyaW5nKGRyb3B6b25lLnRhcmdldClcbiAgICAgID8gZHJvcHpvbmUuX2NvbnRleHQucXVlcnlTZWxlY3RvckFsbChkcm9wem9uZS50YXJnZXQpXG4gICAgICA6IHV0aWxzLmlzLmFycmF5KGRyb3B6b25lLnRhcmdldCkgPyBkcm9wem9uZS50YXJnZXQgOiBbZHJvcHpvbmUudGFyZ2V0XVxuXG4gICAgZm9yIChjb25zdCBkcm9wem9uZUVsZW1lbnQgb2YgZHJvcEVsZW1lbnRzKSB7XG4gICAgICBpZiAoZHJvcHpvbmVFbGVtZW50ICE9PSBkcmFnZ2FibGVFbGVtZW50KSB7XG4gICAgICAgIGRyb3BzLnB1c2goe1xuICAgICAgICAgIGRyb3B6b25lLFxuICAgICAgICAgIGVsZW1lbnQ6IGRyb3B6b25lRWxlbWVudCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZHJvcHNcbn1cblxuZnVuY3Rpb24gZmlyZUFjdGl2YXRpb25FdmVudHMgKGFjdGl2ZURyb3BzLCBldmVudCkge1xuICAvLyBsb29wIHRocm91Z2ggYWxsIGFjdGl2ZSBkcm9wem9uZXMgYW5kIHRyaWdnZXIgZXZlbnRcbiAgZm9yIChjb25zdCB7IGRyb3B6b25lLCBlbGVtZW50IH0gb2YgYWN0aXZlRHJvcHMuc2xpY2UoKSkge1xuICAgIGV2ZW50LmRyb3B6b25lID0gZHJvcHpvbmVcblxuICAgIC8vIHNldCBjdXJyZW50IGVsZW1lbnQgYXMgZXZlbnQgdGFyZ2V0XG4gICAgZXZlbnQudGFyZ2V0ID0gZWxlbWVudFxuICAgIGRyb3B6b25lLmZpcmUoZXZlbnQpXG4gICAgZXZlbnQucHJvcGFnYXRpb25TdG9wcGVkID0gZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2VcbiAgfVxufVxuXG4vLyByZXR1cm4gYSBuZXcgYXJyYXkgb2YgcG9zc2libGUgZHJvcHMuIGdldEFjdGl2ZURyb3BzIHNob3VsZCBhbHdheXMgYmVcbi8vIGNhbGxlZCB3aGVuIGEgZHJhZyBoYXMganVzdCBzdGFydGVkIG9yIGEgZHJhZyBldmVudCBoYXBwZW5zIHdoaWxlXG4vLyBkeW5hbWljRHJvcCBpcyB0cnVlXG5mdW5jdGlvbiBnZXRBY3RpdmVEcm9wcyAoc2NvcGU6IFNjb3BlLCBkcmFnRWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAvLyBnZXQgZHJvcHpvbmVzIGFuZCB0aGVpciBlbGVtZW50cyB0aGF0IGNvdWxkIHJlY2VpdmUgdGhlIGRyYWdnYWJsZVxuICBjb25zdCBhY3RpdmVEcm9wcyA9IGNvbGxlY3REcm9wcyhzY29wZSwgZHJhZ0VsZW1lbnQpXG5cbiAgZm9yIChjb25zdCBhY3RpdmVEcm9wIG9mIGFjdGl2ZURyb3BzKSB7XG4gICAgYWN0aXZlRHJvcC5yZWN0ID0gYWN0aXZlRHJvcC5kcm9wem9uZS5nZXRSZWN0KGFjdGl2ZURyb3AuZWxlbWVudClcbiAgfVxuXG4gIHJldHVybiBhY3RpdmVEcm9wc1xufVxuXG5mdW5jdGlvbiBnZXREcm9wICh7IGRyb3BTdGF0ZSwgaW50ZXJhY3RhYmxlOiBkcmFnZ2FibGUsIGVsZW1lbnQ6IGRyYWdFbGVtZW50IH06IFBhcnRpYWw8SW50ZXJhY3QuSW50ZXJhY3Rpb24+LCBkcmFnRXZlbnQsIHBvaW50ZXJFdmVudCkge1xuICBjb25zdCB2YWxpZERyb3BzID0gW11cblxuICAvLyBjb2xsZWN0IGFsbCBkcm9wem9uZXMgYW5kIHRoZWlyIGVsZW1lbnRzIHdoaWNoIHF1YWxpZnkgZm9yIGEgZHJvcFxuICBmb3IgKGNvbnN0IHsgZHJvcHpvbmUsIGVsZW1lbnQ6IGRyb3B6b25lRWxlbWVudCwgcmVjdCB9IG9mIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcykge1xuICAgIHZhbGlkRHJvcHMucHVzaChkcm9wem9uZS5kcm9wQ2hlY2soZHJhZ0V2ZW50LCBwb2ludGVyRXZlbnQsIGRyYWdnYWJsZSwgZHJhZ0VsZW1lbnQsIGRyb3B6b25lRWxlbWVudCwgcmVjdClcbiAgICAgID8gZHJvcHpvbmVFbGVtZW50XG4gICAgICA6IG51bGwpXG4gIH1cblxuICAvLyBnZXQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZHJvcHpvbmUgYmFzZWQgb24gRE9NIGRlcHRoIGFuZCBvcmRlclxuICBjb25zdCBkcm9wSW5kZXggPSB1dGlscy5kb20uaW5kZXhPZkRlZXBlc3RFbGVtZW50KHZhbGlkRHJvcHMpXG5cbiAgcmV0dXJuIGRyb3BTdGF0ZS5hY3RpdmVEcm9wc1tkcm9wSW5kZXhdIHx8IG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0RHJvcEV2ZW50cyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLCBfcG9pbnRlckV2ZW50LCBkcmFnRXZlbnQpIHtcbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IGRyb3BFdmVudHMgPSB7XG4gICAgZW50ZXIgICAgIDogbnVsbCxcbiAgICBsZWF2ZSAgICAgOiBudWxsLFxuICAgIGFjdGl2YXRlICA6IG51bGwsXG4gICAgZGVhY3RpdmF0ZTogbnVsbCxcbiAgICBtb3ZlICAgICAgOiBudWxsLFxuICAgIGRyb3AgICAgICA6IG51bGwsXG4gIH1cblxuICBpZiAoZHJhZ0V2ZW50LnR5cGUgPT09ICdkcmFnc3RhcnQnKSB7XG4gICAgZHJvcEV2ZW50cy5hY3RpdmF0ZSA9IG5ldyBEcm9wRXZlbnQoZHJvcFN0YXRlLCBkcmFnRXZlbnQsICdkcm9wYWN0aXZhdGUnKVxuXG4gICAgZHJvcEV2ZW50cy5hY3RpdmF0ZS50YXJnZXQgICA9IG51bGxcbiAgICBkcm9wRXZlbnRzLmFjdGl2YXRlLmRyb3B6b25lID0gbnVsbFxuICB9XG4gIGlmIChkcmFnRXZlbnQudHlwZSA9PT0gJ2RyYWdlbmQnKSB7XG4gICAgZHJvcEV2ZW50cy5kZWFjdGl2YXRlID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIGRyYWdFdmVudCwgJ2Ryb3BkZWFjdGl2YXRlJylcblxuICAgIGRyb3BFdmVudHMuZGVhY3RpdmF0ZS50YXJnZXQgICA9IG51bGxcbiAgICBkcm9wRXZlbnRzLmRlYWN0aXZhdGUuZHJvcHpvbmUgPSBudWxsXG4gIH1cblxuICBpZiAoZHJvcFN0YXRlLnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIGRyb3BFdmVudHNcbiAgfVxuXG4gIGlmIChkcm9wU3RhdGUuY3VyLmVsZW1lbnQgIT09IGRyb3BTdGF0ZS5wcmV2LmVsZW1lbnQpIHtcbiAgICAvLyBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBkcm9wem9uZSwgY3JlYXRlIGEgZHJhZ2xlYXZlIGV2ZW50XG4gICAgaWYgKGRyb3BTdGF0ZS5wcmV2LmRyb3B6b25lKSB7XG4gICAgICBkcm9wRXZlbnRzLmxlYXZlID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIGRyYWdFdmVudCwgJ2RyYWdsZWF2ZScpXG5cbiAgICAgIGRyYWdFdmVudC5kcmFnTGVhdmUgICAgPSBkcm9wRXZlbnRzLmxlYXZlLnRhcmdldCAgID0gZHJvcFN0YXRlLnByZXYuZWxlbWVudFxuICAgICAgZHJhZ0V2ZW50LnByZXZEcm9wem9uZSA9IGRyb3BFdmVudHMubGVhdmUuZHJvcHpvbmUgPSBkcm9wU3RhdGUucHJldi5kcm9wem9uZVxuICAgIH1cbiAgICAvLyBpZiBkcm9wem9uZSBpcyBub3QgbnVsbCwgY3JlYXRlIGEgZHJhZ2VudGVyIGV2ZW50XG4gICAgaWYgKGRyb3BTdGF0ZS5jdXIuZHJvcHpvbmUpIHtcbiAgICAgIGRyb3BFdmVudHMuZW50ZXIgPSBuZXcgRHJvcEV2ZW50KGRyb3BTdGF0ZSwgZHJhZ0V2ZW50LCAnZHJhZ2VudGVyJylcblxuICAgICAgZHJhZ0V2ZW50LmRyYWdFbnRlciA9IGRyb3BTdGF0ZS5jdXIuZWxlbWVudFxuICAgICAgZHJhZ0V2ZW50LmRyb3B6b25lID0gZHJvcFN0YXRlLmN1ci5kcm9wem9uZVxuICAgIH1cbiAgfVxuXG4gIGlmIChkcmFnRXZlbnQudHlwZSA9PT0gJ2RyYWdlbmQnICYmIGRyb3BTdGF0ZS5jdXIuZHJvcHpvbmUpIHtcbiAgICBkcm9wRXZlbnRzLmRyb3AgPSBuZXcgRHJvcEV2ZW50KGRyb3BTdGF0ZSwgZHJhZ0V2ZW50LCAnZHJvcCcpXG5cbiAgICBkcmFnRXZlbnQuZHJvcHpvbmUgPSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lXG4gICAgZHJhZ0V2ZW50LnJlbGF0ZWRUYXJnZXQgPSBkcm9wU3RhdGUuY3VyLmVsZW1lbnRcbiAgfVxuICBpZiAoZHJhZ0V2ZW50LnR5cGUgPT09ICdkcmFnbW92ZScgJiYgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSkge1xuICAgIGRyb3BFdmVudHMubW92ZSA9IG5ldyBEcm9wRXZlbnQoZHJvcFN0YXRlLCBkcmFnRXZlbnQsICdkcm9wbW92ZScpXG5cbiAgICBkcm9wRXZlbnRzLm1vdmUuZHJhZ21vdmUgPSBkcmFnRXZlbnRcbiAgICBkcmFnRXZlbnQuZHJvcHpvbmUgPSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lXG4gIH1cblxuICByZXR1cm4gZHJvcEV2ZW50c1xufVxuXG5mdW5jdGlvbiBmaXJlRHJvcEV2ZW50cyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLCBldmVudHMpIHtcbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IHtcbiAgICBhY3RpdmVEcm9wcyxcbiAgICBjdXIsXG4gICAgcHJldixcbiAgfSA9IGRyb3BTdGF0ZVxuXG4gIGlmIChldmVudHMubGVhdmUpIHsgcHJldi5kcm9wem9uZS5maXJlKGV2ZW50cy5sZWF2ZSkgfVxuICBpZiAoZXZlbnRzLm1vdmUpIHsgY3VyLmRyb3B6b25lLmZpcmUoZXZlbnRzLm1vdmUpIH1cbiAgaWYgKGV2ZW50cy5lbnRlcikgeyBjdXIuZHJvcHpvbmUuZmlyZShldmVudHMuZW50ZXIpIH1cbiAgaWYgKGV2ZW50cy5kcm9wKSB7IGN1ci5kcm9wem9uZS5maXJlKGV2ZW50cy5kcm9wKSB9XG5cbiAgaWYgKGV2ZW50cy5kZWFjdGl2YXRlKSB7XG4gICAgZmlyZUFjdGl2YXRpb25FdmVudHMoYWN0aXZlRHJvcHMsIGV2ZW50cy5kZWFjdGl2YXRlKVxuICB9XG5cbiAgZHJvcFN0YXRlLnByZXYuZHJvcHpvbmUgID0gY3VyLmRyb3B6b25lXG4gIGRyb3BTdGF0ZS5wcmV2LmVsZW1lbnQgPSBjdXIuZWxlbWVudFxufVxuXG5mdW5jdGlvbiBvbkV2ZW50Q3JlYXRlZCAoeyBpbnRlcmFjdGlvbiwgaUV2ZW50LCBldmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSB7XG4gIGlmIChpRXZlbnQudHlwZSAhPT0gJ2RyYWdtb3ZlJyAmJiBpRXZlbnQudHlwZSAhPT0gJ2RyYWdlbmQnKSB7IHJldHVybiB9XG5cbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG5cbiAgaWYgKHNjb3BlLmR5bmFtaWNEcm9wKSB7XG4gICAgZHJvcFN0YXRlLmFjdGl2ZURyb3BzID0gZ2V0QWN0aXZlRHJvcHMoc2NvcGUsIGludGVyYWN0aW9uLmVsZW1lbnQpXG4gIH1cblxuICBjb25zdCBkcmFnRXZlbnQgPSBpRXZlbnRcbiAgY29uc3QgZHJvcFJlc3VsdCA9IGdldERyb3AoaW50ZXJhY3Rpb24sIGRyYWdFdmVudCwgZXZlbnQpXG5cbiAgLy8gdXBkYXRlIHJlamVjdGVkIHN0YXR1c1xuICBkcm9wU3RhdGUucmVqZWN0ZWQgPSBkcm9wU3RhdGUucmVqZWN0ZWQgJiZcbiAgICAhIWRyb3BSZXN1bHQgJiZcbiAgICBkcm9wUmVzdWx0LmRyb3B6b25lID09PSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lICYmXG4gICAgZHJvcFJlc3VsdC5lbGVtZW50ID09PSBkcm9wU3RhdGUuY3VyLmVsZW1lbnRcblxuICBkcm9wU3RhdGUuY3VyLmRyb3B6b25lICA9IGRyb3BSZXN1bHQgJiYgZHJvcFJlc3VsdC5kcm9wem9uZVxuICBkcm9wU3RhdGUuY3VyLmVsZW1lbnQgPSBkcm9wUmVzdWx0ICYmIGRyb3BSZXN1bHQuZWxlbWVudFxuXG4gIGRyb3BTdGF0ZS5ldmVudHMgPSBnZXREcm9wRXZlbnRzKGludGVyYWN0aW9uLCBldmVudCwgZHJhZ0V2ZW50KVxufVxuXG5mdW5jdGlvbiBkcm9wem9uZU1ldGhvZCAoaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUpOiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnNcbmZ1bmN0aW9uIGRyb3B6b25lTWV0aG9kIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9uczogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zIHwgYm9vbGVhbilcbmZ1bmN0aW9uIGRyb3B6b25lTWV0aG9kIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9ucz86IEludGVyYWN0LkRyb3B6b25lT3B0aW9ucyB8IGJvb2xlYW4pIHtcbiAgaWYgKHV0aWxzLmlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3AuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcblxuICAgIGlmIChvcHRpb25zLmxpc3RlbmVycykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHV0aWxzLm5vcm1hbGl6ZUxpc3RlbmVycyhvcHRpb25zLmxpc3RlbmVycylcbiAgICAgIC8vIHJlbmFtZSAnZHJvcCcgdG8gJycgYXMgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoICdkcm9wJ1xuICAgICAgY29uc3QgY29ycmVjdGVkID0gT2JqZWN0LmtleXMobm9ybWFsaXplZCkucmVkdWNlKChhY2MsIHR5cGUpID0+IHtcbiAgICAgICAgY29uc3QgY29ycmVjdGVkVHlwZSA9IC9eKGVudGVyfGxlYXZlKS8udGVzdCh0eXBlKVxuICAgICAgICAgID8gYGRyYWcke3R5cGV9YFxuICAgICAgICAgIDogL14oYWN0aXZhdGV8ZGVhY3RpdmF0ZXxtb3ZlKS8udGVzdCh0eXBlKVxuICAgICAgICAgICAgPyBgZHJvcCR7dHlwZX1gXG4gICAgICAgICAgICA6IHR5cGVcblxuICAgICAgICBhY2NbY29ycmVjdGVkVHlwZV0gPSBub3JtYWxpemVkW3R5cGVdXG5cbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfSwge30pXG5cbiAgICAgIGludGVyYWN0YWJsZS5vZmYoaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5saXN0ZW5lcnMpXG4gICAgICBpbnRlcmFjdGFibGUub24oY29ycmVjdGVkKVxuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5saXN0ZW5lcnMgPSBjb3JyZWN0ZWRcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcCkpIHsgaW50ZXJhY3RhYmxlLm9uKCdkcm9wJywgb3B0aW9ucy5vbmRyb3ApIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcGFjdGl2YXRlKSkgeyBpbnRlcmFjdGFibGUub24oJ2Ryb3BhY3RpdmF0ZScsIG9wdGlvbnMub25kcm9wYWN0aXZhdGUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcGRlYWN0aXZhdGUpKSB7IGludGVyYWN0YWJsZS5vbignZHJvcGRlYWN0aXZhdGUnLCBvcHRpb25zLm9uZHJvcGRlYWN0aXZhdGUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJhZ2VudGVyKSkgeyBpbnRlcmFjdGFibGUub24oJ2RyYWdlbnRlcicsIG9wdGlvbnMub25kcmFnZW50ZXIpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJhZ2xlYXZlKSkgeyBpbnRlcmFjdGFibGUub24oJ2RyYWdsZWF2ZScsIG9wdGlvbnMub25kcmFnbGVhdmUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcG1vdmUpKSB7IGludGVyYWN0YWJsZS5vbignZHJvcG1vdmUnLCBvcHRpb25zLm9uZHJvcG1vdmUpIH1cblxuICAgIGlmICgvXihwb2ludGVyfGNlbnRlcikkLy50ZXN0KG9wdGlvbnMub3ZlcmxhcCBhcyBzdHJpbmcpKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLm92ZXJsYXAgPSBvcHRpb25zLm92ZXJsYXBcbiAgICB9XG4gICAgZWxzZSBpZiAodXRpbHMuaXMubnVtYmVyKG9wdGlvbnMub3ZlcmxhcCkpIHtcbiAgICAgIGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3Aub3ZlcmxhcCA9IE1hdGgubWF4KE1hdGgubWluKDEsIG9wdGlvbnMub3ZlcmxhcCksIDApXG4gICAgfVxuICAgIGlmICgnYWNjZXB0JyBpbiBvcHRpb25zKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmFjY2VwdCA9IG9wdGlvbnMuYWNjZXB0XG4gICAgfVxuICAgIGlmICgnY2hlY2tlcicgaW4gb3B0aW9ucykge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyID0gb3B0aW9ucy5jaGVja2VyXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG5cbiAgaWYgKHV0aWxzLmlzLmJvb2wob3B0aW9ucykpIHtcbiAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gaW50ZXJhY3RhYmxlXG4gIH1cblxuICByZXR1cm4gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcFxufVxuXG5mdW5jdGlvbiBkcm9wQ2hlY2tNZXRob2QgKFxuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdEV2ZW50LFxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgZHJhZ2dhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsXG4gIGRyYWdnYWJsZUVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsXG4gIGRyb3BFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICByZWN0OiBhbnksXG4pIHtcbiAgbGV0IGRyb3BwZWQgPSBmYWxzZVxuXG4gIC8vIGlmIHRoZSBkcm9wem9uZSBoYXMgbm8gcmVjdCAoZWcuIGRpc3BsYXk6IG5vbmUpXG4gIC8vIGNhbGwgdGhlIGN1c3RvbSBkcm9wQ2hlY2tlciBvciBqdXN0IHJldHVybiBmYWxzZVxuICBpZiAoIShyZWN0ID0gcmVjdCB8fCBpbnRlcmFjdGFibGUuZ2V0UmVjdChkcm9wRWxlbWVudCkpKSB7XG4gICAgcmV0dXJuIChpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmNoZWNrZXJcbiAgICAgID8gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyKGRyYWdFdmVudCwgZXZlbnQsIGRyb3BwZWQsIGludGVyYWN0YWJsZSwgZHJvcEVsZW1lbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudClcbiAgICAgIDogZmFsc2UpXG4gIH1cblxuICBjb25zdCBkcm9wT3ZlcmxhcCA9IGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3Aub3ZlcmxhcFxuXG4gIGlmIChkcm9wT3ZlcmxhcCA9PT0gJ3BvaW50ZXInKSB7XG4gICAgY29uc3Qgb3JpZ2luID0gdXRpbHMuZ2V0T3JpZ2luWFkoZHJhZ2dhYmxlLCBkcmFnZ2FibGVFbGVtZW50LCAnZHJhZycpXG4gICAgY29uc3QgcGFnZSA9IHV0aWxzLnBvaW50ZXIuZ2V0UGFnZVhZKGRyYWdFdmVudClcblxuICAgIHBhZ2UueCArPSBvcmlnaW4ueFxuICAgIHBhZ2UueSArPSBvcmlnaW4ueVxuXG4gICAgY29uc3QgaG9yaXpvbnRhbCA9IChwYWdlLnggPiByZWN0LmxlZnQpICYmIChwYWdlLnggPCByZWN0LnJpZ2h0KVxuICAgIGNvbnN0IHZlcnRpY2FsICAgPSAocGFnZS55ID4gcmVjdC50b3ApICYmIChwYWdlLnkgPCByZWN0LmJvdHRvbSlcblxuICAgIGRyb3BwZWQgPSBob3Jpem9udGFsICYmIHZlcnRpY2FsXG4gIH1cblxuICBjb25zdCBkcmFnUmVjdCA9IGRyYWdnYWJsZS5nZXRSZWN0KGRyYWdnYWJsZUVsZW1lbnQpXG5cbiAgaWYgKGRyYWdSZWN0ICYmIGRyb3BPdmVybGFwID09PSAnY2VudGVyJykge1xuICAgIGNvbnN0IGN4ID0gZHJhZ1JlY3QubGVmdCArIGRyYWdSZWN0LndpZHRoICAvIDJcbiAgICBjb25zdCBjeSA9IGRyYWdSZWN0LnRvcCAgKyBkcmFnUmVjdC5oZWlnaHQgLyAyXG5cbiAgICBkcm9wcGVkID0gY3ggPj0gcmVjdC5sZWZ0ICYmIGN4IDw9IHJlY3QucmlnaHQgJiYgY3kgPj0gcmVjdC50b3AgJiYgY3kgPD0gcmVjdC5ib3R0b21cbiAgfVxuXG4gIGlmIChkcmFnUmVjdCAmJiB1dGlscy5pcy5udW1iZXIoZHJvcE92ZXJsYXApKSB7XG4gICAgY29uc3Qgb3ZlcmxhcEFyZWEgID0gKE1hdGgubWF4KDAsIE1hdGgubWluKHJlY3QucmlnaHQsIGRyYWdSZWN0LnJpZ2h0KSAtIE1hdGgubWF4KHJlY3QubGVmdCwgZHJhZ1JlY3QubGVmdCkpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgTWF0aC5taW4ocmVjdC5ib3R0b20sIGRyYWdSZWN0LmJvdHRvbSkgLSBNYXRoLm1heChyZWN0LnRvcCwgZHJhZ1JlY3QudG9wKSkpXG5cbiAgICBjb25zdCBvdmVybGFwUmF0aW8gPSBvdmVybGFwQXJlYSAvIChkcmFnUmVjdC53aWR0aCAqIGRyYWdSZWN0LmhlaWdodClcblxuICAgIGRyb3BwZWQgPSBvdmVybGFwUmF0aW8gPj0gZHJvcE92ZXJsYXBcbiAgfVxuXG4gIGlmIChpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmNoZWNrZXIpIHtcbiAgICBkcm9wcGVkID0gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyKGRyYWdFdmVudCwgZXZlbnQsIGRyb3BwZWQsIGludGVyYWN0YWJsZSwgZHJvcEVsZW1lbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudClcbiAgfVxuXG4gIHJldHVybiBkcm9wcGVkXG59XG5cbmNvbnN0IGRyb3A6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhY3Rpb25zL2Ryb3AnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tc3RhcnQnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGludGVyYWN0aW9uLmRyb3BTdGF0ZSA9IHtcbiAgICAgICAgY3VyOiB7XG4gICAgICAgICAgZHJvcHpvbmU6IG51bGwsXG4gICAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJldjoge1xuICAgICAgICAgIGRyb3B6b25lOiBudWxsLFxuICAgICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdGVkOiBudWxsLFxuICAgICAgICBldmVudHM6IG51bGwsXG4gICAgICAgIGFjdGl2ZURyb3BzOiBbXSxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tc3RhcnQnOiAoeyBpbnRlcmFjdGlvbiwgZXZlbnQsIGlFdmVudDogZHJhZ0V2ZW50IH06IEludGVyYWN0LkRvUGhhc2VBcmc8J2RyYWcnLCBJbnRlcmFjdC5FdmVudFBoYXNlPiwgc2NvcGUpID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICAgICAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG5cbiAgICAgIC8vIHJlc2V0IGFjdGl2ZSBkcm9wem9uZXNcbiAgICAgIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcyA9IG51bGxcbiAgICAgIGRyb3BTdGF0ZS5ldmVudHMgPSBudWxsXG4gICAgICBkcm9wU3RhdGUuYWN0aXZlRHJvcHMgPSBnZXRBY3RpdmVEcm9wcyhzY29wZSwgaW50ZXJhY3Rpb24uZWxlbWVudClcbiAgICAgIGRyb3BTdGF0ZS5ldmVudHMgPSBnZXREcm9wRXZlbnRzKGludGVyYWN0aW9uLCBldmVudCwgZHJhZ0V2ZW50KVxuXG4gICAgICBpZiAoZHJvcFN0YXRlLmV2ZW50cy5hY3RpdmF0ZSkge1xuICAgICAgICBmaXJlQWN0aXZhdGlvbkV2ZW50cyhkcm9wU3RhdGUuYWN0aXZlRHJvcHMsIGRyb3BTdGF0ZS5ldmVudHMuYWN0aXZhdGUpXG4gICAgICAgIHNjb3BlLmZpcmUoJ2FjdGlvbnMvZHJvcDpzdGFydCcsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBGSVhNRSBwcm9wZXIgc2lnbmFsIHR5cGVzXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IG9uRXZlbnRDcmVhdGVkLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLWVuZCc6IG9uRXZlbnRDcmVhdGVkLFxuXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IGZ1bmN0aW9uIGZpcmVEcm9wQWZ0ZXJNb3ZlICh7IGludGVyYWN0aW9uLCBpRXZlbnQ6IGRyYWdFdmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGZpcmVEcm9wRXZlbnRzKGludGVyYWN0aW9uLCBpbnRlcmFjdGlvbi5kcm9wU3RhdGUuZXZlbnRzKVxuXG4gICAgICBzY29wZS5maXJlKCdhY3Rpb25zL2Ryb3A6bW92ZScsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgICAgaW50ZXJhY3Rpb24uZHJvcFN0YXRlLmV2ZW50cyA9IHt9XG4gICAgfSxcblxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLWVuZCc6ICh7IGludGVyYWN0aW9uLCBpRXZlbnQ6IGRyYWdFdmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGZpcmVEcm9wRXZlbnRzKGludGVyYWN0aW9uLCBpbnRlcmFjdGlvbi5kcm9wU3RhdGUuZXZlbnRzKVxuICAgICAgc2NvcGUuZmlyZSgnYWN0aW9ucy9kcm9wOmVuZCcsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOnN0b3AnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGNvbnN0IHsgZHJvcFN0YXRlIH0gPSBpbnRlcmFjdGlvblxuXG4gICAgICBpZiAoZHJvcFN0YXRlKSB7XG4gICAgICAgIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcyA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmV2ZW50cyA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5lbGVtZW50ID0gbnVsbFxuICAgICAgICBkcm9wU3RhdGUucHJldi5kcm9wem9uZSA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLnByZXYuZWxlbWVudCA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLnJlamVjdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBnZXRBY3RpdmVEcm9wcyxcbiAgZ2V0RHJvcCxcbiAgZ2V0RHJvcEV2ZW50cyxcbiAgZmlyZURyb3BFdmVudHMsXG4gIGRlZmF1bHRzOiB7XG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgYWNjZXB0IDogbnVsbCxcbiAgICBvdmVybGFwOiAncG9pbnRlcicsXG4gIH0gYXMgSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zLFxufVxuXG5leHBvcnQgZGVmYXVsdCBkcm9wXG4iLCJpbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcblxuZXhwb3J0IHR5cGUgR2VzdHVyYWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9ucz5cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBnZXN0dXJlPzoge1xuICAgICAgYW5nbGU6IG51bWJlciAgICAgICAgICAgLy8gYW5nbGUgZnJvbSBmaXJzdCB0byBzZWNvbmQgdG91Y2hcbiAgICAgIGRpc3RhbmNlOiBudW1iZXJcbiAgICAgIHNjYWxlOiBudW1iZXIgICAgICAgICAgIC8vIGdlc3R1cmUuZGlzdGFuY2UgLyBnZXN0dXJlLnN0YXJ0RGlzdGFuY2VcbiAgICAgIHN0YXJ0QW5nbGU6IG51bWJlciAgICAgIC8vIGFuZ2xlIG9mIGxpbmUgam9pbmluZyB0d28gdG91Y2hlc1xuICAgICAgc3RhcnREaXN0YW5jZTogbnVtYmVyICAgLy8gZGlzdGFuY2UgYmV0d2VlbiB0d28gdG91Y2hlcyBvZiB0b3VjaFN0YXJ0XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBnZXN0dXJhYmxlOiBHZXN0dXJhYmxlTWV0aG9kXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBnZXN0dXJlOiBJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9uc1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBBY3Rpb25NYXAge1xuICAgIGdlc3R1cmU/OiB0eXBlb2YgZ2VzdHVyZVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VzdHVyZUV2ZW50IGV4dGVuZHMgSW50ZXJhY3QuSW50ZXJhY3RFdmVudDwnZ2VzdHVyZSc+IHtcbiAgZGlzdGFuY2U6IG51bWJlclxuICBhbmdsZTogbnVtYmVyXG4gIGRhOiBudW1iZXIgLy8gYW5nbGUgY2hhbmdlXG4gIHNjYWxlOiBudW1iZXIgLy8gcmF0aW8gb2YgZGlzdGFuY2Ugc3RhcnQgdG8gY3VycmVudCBldmVudFxuICBkczogbnVtYmVyIC8vIHNjYWxlIGNoYW5nZVxuICBib3g6IEludGVyYWN0LlJlY3QgLy8gZW5jbG9zaW5nIGJveCBvZiBhbGwgcG9pbnRzXG4gIHRvdWNoZXM6IEludGVyYWN0LlBvaW50ZXJUeXBlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlU2lnbmFsQXJnIGV4dGVuZHMgSW50ZXJhY3QuRG9QaGFzZUFyZzwnZ2VzdHVyZScsIEludGVyYWN0LkV2ZW50UGhhc2U+IHtcbiAgaUV2ZW50OiBHZXN0dXJlRXZlbnRcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uPCdnZXN0dXJlJz5cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBhY3Rpb25zLFxuICAgIEludGVyYWN0YWJsZSxcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGludGVyYWN0KGVsZW1lbnQpLmdlc3R1cmFibGUoe1xuICAgKiAgICAgb25zdGFydDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAgICogICAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gICAqICAgICBvbmVuZCAgOiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICAgKlxuICAgKiAgICAgLy8gbGltaXQgbXVsdGlwbGUgZ2VzdHVyZXMuXG4gICAqICAgICAvLyBTZWUgdGhlIGV4cGxhbmF0aW9uIGluIHtAbGluayBJbnRlcmFjdGFibGUuZHJhZ2dhYmxlfSBleGFtcGxlXG4gICAqICAgICBtYXg6IEluZmluaXR5LFxuICAgKiAgICAgbWF4UGVyRWxlbWVudDogMSxcbiAgICogfSlcbiAgICpcbiAgICogdmFyIGlzR2VzdHVyZWFibGUgPSBpbnRlcmFjdChlbGVtZW50KS5nZXN0dXJhYmxlKClcbiAgICogYGBgXG4gICAqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIG11bHRpdG91Y2ggZ2VzdHVyZXMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAgICogbGlzdGVuZXJzIHRvIGJlIGZpcmVkIG9uIGdlc3R1cmUgZXZlbnRzIChtYWtlcyB0aGUgSW50ZXJhY3RhYmxlIGdlc3R1cmFibGUpXG4gICAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgY2FuIGJlIHRoZVxuICAgKiB0YXJnZXQgb2YgZ2VzdHVyZSBldmVudHMsIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmdlc3R1cmFibGUgPSBmdW5jdGlvbiAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zOiBJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9ucyB8IGJvb2xlYW4pIHtcbiAgICBpZiAodXRpbHMuaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZ2VzdHVyZS5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZVxuICAgICAgdGhpcy5zZXRQZXJBY3Rpb24oJ2dlc3R1cmUnLCBvcHRpb25zKVxuICAgICAgdGhpcy5zZXRPbkV2ZW50cygnZ2VzdHVyZScsIG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzLmJvb2wob3B0aW9ucykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5nZXN0dXJlLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXN0dXJlIGFzIEludGVyYWN0Lk9wdGlvbnNcbiAgfSBhcyBHZXN0dXJhYmxlTWV0aG9kXG5cbiAgYWN0aW9ucy5tYXAuZ2VzdHVyZSA9IGdlc3R1cmVcbiAgYWN0aW9ucy5tZXRob2REaWN0Lmdlc3R1cmUgPSAnZ2VzdHVyYWJsZSdcblxuICBkZWZhdWx0cy5hY3Rpb25zLmdlc3R1cmUgPSBnZXN0dXJlLmRlZmF1bHRzXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUdlc3R1cmVQcm9wcyAoeyBpbnRlcmFjdGlvbiwgaUV2ZW50LCBwaGFzZSB9OiBHZXN0dXJlU2lnbmFsQXJnKSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZ2VzdHVyZScpIHsgcmV0dXJuIH1cblxuICBjb25zdCBwb2ludGVycyA9IGludGVyYWN0aW9uLnBvaW50ZXJzLm1hcChwID0+IHAucG9pbnRlcilcbiAgY29uc3Qgc3RhcnRpbmcgPSBwaGFzZSA9PT0gJ3N0YXJ0J1xuICBjb25zdCBlbmRpbmcgPSBwaGFzZSA9PT0gJ2VuZCdcbiAgY29uc3QgZGVsdGFTb3VyY2UgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5kZWx0YVNvdXJjZVxuXG4gIGlFdmVudC50b3VjaGVzID0gW3BvaW50ZXJzWzBdLCBwb2ludGVyc1sxXV1cblxuICBpZiAoc3RhcnRpbmcpIHtcbiAgICBpRXZlbnQuZGlzdGFuY2UgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2UocG9pbnRlcnMsIGRlbHRhU291cmNlKVxuICAgIGlFdmVudC5ib3ggICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94KHBvaW50ZXJzKVxuICAgIGlFdmVudC5zY2FsZSAgICA9IDFcbiAgICBpRXZlbnQuZHMgICAgICAgPSAwXG4gICAgaUV2ZW50LmFuZ2xlICAgID0gdXRpbHMucG9pbnRlci50b3VjaEFuZ2xlKHBvaW50ZXJzLCBkZWx0YVNvdXJjZSlcbiAgICBpRXZlbnQuZGEgICAgICAgPSAwXG5cbiAgICBpbnRlcmFjdGlvbi5nZXN0dXJlLnN0YXJ0RGlzdGFuY2UgPSBpRXZlbnQuZGlzdGFuY2VcbiAgICBpbnRlcmFjdGlvbi5nZXN0dXJlLnN0YXJ0QW5nbGUgPSBpRXZlbnQuYW5nbGVcbiAgfVxuICBlbHNlIGlmIChlbmRpbmcpIHtcbiAgICBjb25zdCBwcmV2RXZlbnQgPSBpbnRlcmFjdGlvbi5wcmV2RXZlbnQgYXMgR2VzdHVyZUV2ZW50XG5cbiAgICBpRXZlbnQuZGlzdGFuY2UgPSBwcmV2RXZlbnQuZGlzdGFuY2VcbiAgICBpRXZlbnQuYm94ICAgICAgPSBwcmV2RXZlbnQuYm94XG4gICAgaUV2ZW50LnNjYWxlICAgID0gcHJldkV2ZW50LnNjYWxlXG4gICAgaUV2ZW50LmRzICAgICAgID0gMFxuICAgIGlFdmVudC5hbmdsZSAgICA9IHByZXZFdmVudC5hbmdsZVxuICAgIGlFdmVudC5kYSAgICAgICA9IDBcbiAgfVxuICBlbHNlIHtcbiAgICBpRXZlbnQuZGlzdGFuY2UgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2UocG9pbnRlcnMsIGRlbHRhU291cmNlKVxuICAgIGlFdmVudC5ib3ggICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94KHBvaW50ZXJzKVxuICAgIGlFdmVudC5zY2FsZSAgICA9IGlFdmVudC5kaXN0YW5jZSAvIGludGVyYWN0aW9uLmdlc3R1cmUuc3RhcnREaXN0YW5jZVxuICAgIGlFdmVudC5hbmdsZSAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hBbmdsZShwb2ludGVycywgZGVsdGFTb3VyY2UpXG5cbiAgICBpRXZlbnQuZHMgPSBpRXZlbnQuc2NhbGUgLSBpbnRlcmFjdGlvbi5nZXN0dXJlLnNjYWxlXG4gICAgaUV2ZW50LmRhID0gaUV2ZW50LmFuZ2xlIC0gaW50ZXJhY3Rpb24uZ2VzdHVyZS5hbmdsZVxuICB9XG5cbiAgaW50ZXJhY3Rpb24uZ2VzdHVyZS5kaXN0YW5jZSA9IGlFdmVudC5kaXN0YW5jZVxuICBpbnRlcmFjdGlvbi5nZXN0dXJlLmFuZ2xlID0gaUV2ZW50LmFuZ2xlXG5cbiAgaWYgKHV0aWxzLmlzLm51bWJlcihpRXZlbnQuc2NhbGUpICYmXG4gICAgICBpRXZlbnQuc2NhbGUgIT09IEluZmluaXR5ICYmXG4gICAgICAhaXNOYU4oaUV2ZW50LnNjYWxlKSkge1xuICAgIGludGVyYWN0aW9uLmdlc3R1cmUuc2NhbGUgPSBpRXZlbnQuc2NhbGVcbiAgfVxufVxuXG5jb25zdCBnZXN0dXJlOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYWN0aW9ucy9nZXN0dXJlJyxcbiAgYmVmb3JlOiBbJ2FjdGlvbnMvZHJhZycsICdhY3Rpb25zL3Jlc2l6ZSddLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1zdGFydCc6IHVwZGF0ZUdlc3R1cmVQcm9wcyxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1tb3ZlJzogdXBkYXRlR2VzdHVyZVByb3BzLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLWVuZCc6IHVwZGF0ZUdlc3R1cmVQcm9wcyxcblxuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogKHsgaW50ZXJhY3Rpb24gfSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24uZ2VzdHVyZSA9IHtcbiAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgc3RhcnRBbmdsZTogMCxcbiAgICAgICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBhcmcgPT4ge1xuICAgICAgaWYgKGFyZy5pbnRlcmFjdGlvbi5wb2ludGVycy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2VzdHVyZU9wdGlvbnMgPSBhcmcuaW50ZXJhY3RhYmxlLm9wdGlvbnMuZ2VzdHVyZVxuXG4gICAgICBpZiAoIShnZXN0dXJlT3B0aW9ucyAmJiBnZXN0dXJlT3B0aW9ucy5lbmFibGVkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGFyZy5hY3Rpb24gPSB7IG5hbWU6ICdnZXN0dXJlJyB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgfSxcblxuICBnZXRDdXJzb3IgKCkge1xuICAgIHJldHVybiAnJ1xuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBnZXN0dXJlXG4iLCJpbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyBkb20gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZG9tVXRpbHMnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuXG5leHBvcnQgdHlwZSBFZGdlTmFtZSA9ICd0b3AnIHwgJ2xlZnQnIHwgJ2JvdHRvbScgfCAncmlnaHQnXG5cbmV4cG9ydCB0eXBlIFJlc2l6YWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5SZXNpemFibGVPcHRpb25zPlxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0YWJsZSB7XG4gICAgcmVzaXphYmxlOiBSZXNpemFibGVNZXRob2RcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIHJlc2l6ZUF4ZXM6ICd4JyB8ICd5JyB8ICd4eSdcbiAgICByZXNpemVTdGFydEFzcGVjdFJhdGlvOiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xuICAgIHJlc2l6ZTogSW50ZXJhY3QuUmVzaXphYmxlT3B0aW9uc1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBBY3Rpb25NYXAge1xuICAgIHJlc2l6ZT86IHR5cGVvZiByZXNpemVcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2l6ZUV2ZW50PFAgZXh0ZW5kcyBJbnRlcmFjdC5FdmVudFBoYXNlID0gSW50ZXJhY3QuRXZlbnRQaGFzZT4gZXh0ZW5kcyBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PCdyZXNpemUnLCBQPiB7XG4gIGRlbHRhUmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGVkZ2VzPzogSW50ZXJhY3QuQWN0aW9uUHJvcHNbJ2VkZ2VzJ11cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IFNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBhY3Rpb25zLFxuICAgIGJyb3dzZXIsXG4gICAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgICBJbnRlcmFjdGFibGUsIC8vIHRzbGludDpkaXNhYmxlLWxpbmUgbm8tc2hhZG93ZWQtdmFyaWFibGVcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgLy8gTGVzcyBQcmVjaXNpb24gd2l0aCB0b3VjaCBpbnB1dFxuXG4gIHJlc2l6ZS5jdXJzb3JzID0gaW5pdEN1cnNvcnMoYnJvd3NlcilcbiAgcmVzaXplLmRlZmF1bHRNYXJnaW4gPSBicm93c2VyLnN1cHBvcnRzVG91Y2ggfHwgYnJvd3Nlci5zdXBwb3J0c1BvaW50ZXJFdmVudCA/IDIwIDogMTBcblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QoZWxlbWVudCkucmVzaXphYmxlKHtcbiAgICogICBvbnN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICAgKiAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gICAqICAgb25lbmQgIDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAgICpcbiAgICogICBlZGdlczoge1xuICAgKiAgICAgdG9wICAgOiB0cnVlLCAgICAgICAvLyBVc2UgcG9pbnRlciBjb29yZHMgdG8gY2hlY2sgZm9yIHJlc2l6ZS5cbiAgICogICAgIGxlZnQgIDogZmFsc2UsICAgICAgLy8gRGlzYWJsZSByZXNpemluZyBmcm9tIGxlZnQgZWRnZS5cbiAgICogICAgIGJvdHRvbTogJy5yZXNpemUtcycsLy8gUmVzaXplIGlmIHBvaW50ZXIgdGFyZ2V0IG1hdGNoZXMgc2VsZWN0b3JcbiAgICogICAgIHJpZ2h0IDogaGFuZGxlRWwgICAgLy8gUmVzaXplIGlmIHBvaW50ZXIgdGFyZ2V0IGlzIHRoZSBnaXZlbiBFbGVtZW50XG4gICAqICAgfSxcbiAgICpcbiAgICogICAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgY2FuIGJlIGFkanVzdGVkIGluZGVwZW5kZW50bHkuIFdoZW4gYHRydWVgLCB3aWR0aCBhbmRcbiAgICogICAgIC8vIGhlaWdodCBhcmUgYWRqdXN0ZWQgYXQgYSAxOjEgcmF0aW8uXG4gICAqICAgICBzcXVhcmU6IGZhbHNlLFxuICAgKlxuICAgKiAgICAgLy8gV2lkdGggYW5kIGhlaWdodCBjYW4gYmUgYWRqdXN0ZWQgaW5kZXBlbmRlbnRseS4gV2hlbiBgdHJ1ZWAsIHdpZHRoIGFuZFxuICAgKiAgICAgLy8gaGVpZ2h0IG1haW50YWluIHRoZSBhc3BlY3QgcmF0aW8gdGhleSBoYWQgd2hlbiByZXNpemluZyBzdGFydGVkLlxuICAgKiAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogZmFsc2UsXG4gICAqXG4gICAqICAgLy8gYSB2YWx1ZSBvZiAnbm9uZScgd2lsbCBsaW1pdCB0aGUgcmVzaXplIHJlY3QgdG8gYSBtaW5pbXVtIG9mIDB4MFxuICAgKiAgIC8vICduZWdhdGUnIHdpbGwgYWxsb3cgdGhlIHJlY3QgdG8gaGF2ZSBuZWdhdGl2ZSB3aWR0aC9oZWlnaHRcbiAgICogICAvLyAncmVwb3NpdGlvbicgd2lsbCBrZWVwIHRoZSB3aWR0aC9oZWlnaHQgcG9zaXRpdmUgYnkgc3dhcHBpbmdcbiAgICogICAvLyB0aGUgdG9wIGFuZCBib3R0b20gZWRnZXMgYW5kL29yIHN3YXBwaW5nIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlc1xuICAgKiAgIGludmVydDogJ25vbmUnIHx8ICduZWdhdGUnIHx8ICdyZXBvc2l0aW9uJ1xuICAgKlxuICAgKiAgIC8vIGxpbWl0IG11bHRpcGxlIHJlc2l6ZXMuXG4gICAqICAgLy8gU2VlIHRoZSBleHBsYW5hdGlvbiBpbiB0aGUge0BsaW5rIEludGVyYWN0YWJsZS5kcmFnZ2FibGV9IGV4YW1wbGVcbiAgICogICBtYXg6IEluZmluaXR5LFxuICAgKiAgIG1heFBlckVsZW1lbnQ6IDEsXG4gICAqIH0pXG4gICAqXG4gICAqIHZhciBpc1Jlc2l6ZWFibGUgPSBpbnRlcmFjdChlbGVtZW50KS5yZXNpemFibGUoKVxuICAgKiBgYGBcbiAgICpcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgcmVzaXplIGFjdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAgICogbGlzdGVuZXJzIHRvIGJlIGZpcmVkIG9uIHJlc2l6ZSBldmVudHMgKG9iamVjdCBtYWtlcyB0aGUgSW50ZXJhY3RhYmxlXG4gICAqIHJlc2l6YWJsZSlcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IEludGVyYWN0YWJsZX0gQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBjYW4gYmUgdGhlXG4gICAqIHRhcmdldCBvZiByZXNpemUgZWxlbWVudHMsIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLnJlc2l6YWJsZSA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIG9wdGlvbnM6IEludGVyYWN0LlJlc2l6YWJsZU9wdGlvbnMgfCBib29sZWFuKSB7XG4gICAgcmV0dXJuIHJlc2l6YWJsZSh0aGlzLCBvcHRpb25zLCBzY29wZSlcbiAgfSBhcyBSZXNpemFibGVNZXRob2RcblxuICBhY3Rpb25zLm1hcC5yZXNpemUgPSByZXNpemVcbiAgYWN0aW9ucy5tZXRob2REaWN0LnJlc2l6ZSA9ICdyZXNpemFibGUnXG5cbiAgZGVmYXVsdHMuYWN0aW9ucy5yZXNpemUgPSByZXNpemUuZGVmYXVsdHNcbn1cblxuZnVuY3Rpb24gcmVzaXplQ2hlY2tlciAoYXJnKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgcmVjdCwgYnV0dG9ucyB9ID0gYXJnXG5cbiAgaWYgKCFyZWN0KSB7IHJldHVybiB1bmRlZmluZWQgfVxuXG4gIGNvbnN0IHBhZ2UgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZSlcbiAgY29uc3QgcmVzaXplT3B0aW9ucyA9IGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZVxuXG4gIGlmIChcbiAgICAhKHJlc2l6ZU9wdGlvbnMgJiYgcmVzaXplT3B0aW9ucy5lbmFibGVkKSB8fFxuICAgIC8vIGNoZWNrIG1vdXNlQnV0dG9uIHNldHRpbmcgaWYgdGhlIHBvaW50ZXIgaXMgZG93blxuICAgIChpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duICYmXG4gICAgIC9tb3VzZXxwb2ludGVyLy50ZXN0KGludGVyYWN0aW9uLnBvaW50ZXJUeXBlKSAmJlxuICAgKGJ1dHRvbnMgJiByZXNpemVPcHRpb25zLm1vdXNlQnV0dG9ucykgPT09IDApXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIGlmIHVzaW5nIHJlc2l6ZS5lZGdlc1xuICBpZiAoaXMub2JqZWN0KHJlc2l6ZU9wdGlvbnMuZWRnZXMpKSB7XG4gICAgY29uc3QgcmVzaXplRWRnZXMgPSB7XG4gICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgIHJpZ2h0OiBmYWxzZSxcbiAgICAgIHRvcDogZmFsc2UsXG4gICAgICBib3R0b206IGZhbHNlLFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWRnZSBpbiByZXNpemVFZGdlcykge1xuICAgICAgcmVzaXplRWRnZXNbZWRnZV0gPSBjaGVja1Jlc2l6ZUVkZ2UoZWRnZSxcbiAgICAgICAgcmVzaXplT3B0aW9ucy5lZGdlc1tlZGdlXSxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgaW50ZXJhY3Rpb24uX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHJlY3QsXG4gICAgICAgIHJlc2l6ZU9wdGlvbnMubWFyZ2luIHx8IHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuICAgIH1cblxuICAgIHJlc2l6ZUVkZ2VzLmxlZnQgPSByZXNpemVFZGdlcy5sZWZ0ICYmICFyZXNpemVFZGdlcy5yaWdodFxuICAgIHJlc2l6ZUVkZ2VzLnRvcCAgPSByZXNpemVFZGdlcy50b3AgICYmICFyZXNpemVFZGdlcy5ib3R0b21cblxuICAgIGlmIChyZXNpemVFZGdlcy5sZWZ0IHx8IHJlc2l6ZUVkZ2VzLnJpZ2h0IHx8IHJlc2l6ZUVkZ2VzLnRvcCB8fCByZXNpemVFZGdlcy5ib3R0b20pIHtcbiAgICAgIGFyZy5hY3Rpb24gPSB7XG4gICAgICAgIG5hbWU6ICdyZXNpemUnLFxuICAgICAgICBlZGdlczogcmVzaXplRWRnZXMsXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGNvbnN0IHJpZ2h0ICA9IHJlc2l6ZU9wdGlvbnMuYXhpcyAhPT0gJ3knICYmIHBhZ2UueCA+IChyZWN0LnJpZ2h0ICAtIHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuICAgIGNvbnN0IGJvdHRvbSA9IHJlc2l6ZU9wdGlvbnMuYXhpcyAhPT0gJ3gnICYmIHBhZ2UueSA+IChyZWN0LmJvdHRvbSAtIHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuXG4gICAgaWYgKHJpZ2h0IHx8IGJvdHRvbSkge1xuICAgICAgYXJnLmFjdGlvbiA9IHtcbiAgICAgICAgbmFtZTogJ3Jlc2l6ZScsXG4gICAgICAgIGF4ZXM6IChyaWdodCA/ICd4JyA6ICcnKSArIChib3R0b20gPyAneScgOiAnJyksXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyZy5hY3Rpb24gPyBmYWxzZSA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiByZXNpemFibGUgKGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zOiBJbnRlcmFjdC5PckJvb2xlYW48SW50ZXJhY3QuUmVzaXphYmxlT3B0aW9ucz4gfCBib29sZWFuLCBzY29wZTogU2NvcGUpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZS5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZVxuICAgIGludGVyYWN0YWJsZS5zZXRQZXJBY3Rpb24oJ3Jlc2l6ZScsIG9wdGlvbnMpXG4gICAgaW50ZXJhY3RhYmxlLnNldE9uRXZlbnRzKCdyZXNpemUnLCBvcHRpb25zKVxuXG4gICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmF4aXMpICYmIC9eeCR8XnkkfF54eSQvLnRlc3Qob3B0aW9ucy5heGlzKSkge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLmF4aXMgPSBvcHRpb25zLmF4aXNcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5heGlzID09PSBudWxsKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemUuYXhpcyA9IHNjb3BlLmRlZmF1bHRzLmFjdGlvbnMucmVzaXplLmF4aXNcbiAgICB9XG5cbiAgICBpZiAoaXMuYm9vbChvcHRpb25zLnByZXNlcnZlQXNwZWN0UmF0aW8pKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemUucHJlc2VydmVBc3BlY3RSYXRpbyA9IG9wdGlvbnMucHJlc2VydmVBc3BlY3RSYXRpb1xuICAgIH1cbiAgICBlbHNlIGlmIChpcy5ib29sKG9wdGlvbnMuc3F1YXJlKSkge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLnNxdWFyZSA9IG9wdGlvbnMuc3F1YXJlXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG4gIGlmIChpcy5ib29sKG9wdGlvbnMpKSB7XG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gaW50ZXJhY3RhYmxlXG4gIH1cbiAgcmV0dXJuIGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZVxufVxuXG5mdW5jdGlvbiBjaGVja1Jlc2l6ZUVkZ2UgKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHBhZ2U6IEludGVyYWN0LlBvaW50LFxuICBlbGVtZW50OiBOb2RlLFxuICBpbnRlcmFjdGFibGVFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICByZWN0OiBJbnRlcmFjdC5SZWN0LFxuICBtYXJnaW46IG51bWJlcixcbikge1xuICAvLyBmYWxzZSwgJycsIHVuZGVmaW5lZCwgbnVsbFxuICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gdHJ1ZSB2YWx1ZSwgdXNlIHBvaW50ZXIgY29vcmRzIGFuZCBlbGVtZW50IHJlY3RcbiAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgLy8gaWYgZGltZW5zaW9ucyBhcmUgbmVnYXRpdmUsIFwic3dpdGNoXCIgZWRnZXNcbiAgICBjb25zdCB3aWR0aCAgPSBpcy5udW1iZXIocmVjdC53aWR0aCkgPyByZWN0LndpZHRoICA6IHJlY3QucmlnaHQgIC0gcmVjdC5sZWZ0XG4gICAgY29uc3QgaGVpZ2h0ID0gaXMubnVtYmVyKHJlY3QuaGVpZ2h0KSA/IHJlY3QuaGVpZ2h0IDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuXG4gICAgLy8gZG9uJ3QgdXNlIG1hcmdpbiBncmVhdGVyIHRoYW4gaGFsZiB0aGUgcmVsZXZlbnQgZGltZW5zaW9uXG4gICAgbWFyZ2luID0gTWF0aC5taW4obWFyZ2luLCAobmFtZSA9PT0gJ2xlZnQnIHx8IG5hbWUgPT09ICdyaWdodCcgPyB3aWR0aCA6IGhlaWdodCkgLyAyKVxuXG4gICAgaWYgKHdpZHRoIDwgMCkge1xuICAgICAgaWYgICAgICAobmFtZSA9PT0gJ2xlZnQnKSAgeyBuYW1lID0gJ3JpZ2h0JyB9XG4gICAgICBlbHNlIGlmIChuYW1lID09PSAncmlnaHQnKSB7IG5hbWUgPSAnbGVmdCcgIH1cbiAgICB9XG4gICAgaWYgKGhlaWdodCA8IDApIHtcbiAgICAgIGlmICAgICAgKG5hbWUgPT09ICd0b3AnKSAgICB7IG5hbWUgPSAnYm90dG9tJyB9XG4gICAgICBlbHNlIGlmIChuYW1lID09PSAnYm90dG9tJykgeyBuYW1lID0gJ3RvcCcgICAgfVxuICAgIH1cblxuICAgIGlmIChuYW1lID09PSAnbGVmdCcpIHsgcmV0dXJuIHBhZ2UueCA8ICgod2lkdGggID49IDAgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0KSArIG1hcmdpbikgfVxuICAgIGlmIChuYW1lID09PSAndG9wJykgeyByZXR1cm4gcGFnZS55IDwgKChoZWlnaHQgPj0gMCA/IHJlY3QudG9wIDogcmVjdC5ib3R0b20pICsgbWFyZ2luKSB9XG5cbiAgICBpZiAobmFtZSA9PT0gJ3JpZ2h0JykgeyByZXR1cm4gcGFnZS54ID4gKCh3aWR0aCAgPj0gMCA/IHJlY3QucmlnaHQgOiByZWN0LmxlZnQpIC0gbWFyZ2luKSB9XG4gICAgaWYgKG5hbWUgPT09ICdib3R0b20nKSB7IHJldHVybiBwYWdlLnkgPiAoKGhlaWdodCA+PSAwID8gcmVjdC5ib3R0b20gOiByZWN0LnRvcCkgLSBtYXJnaW4pIH1cbiAgfVxuXG4gIC8vIHRoZSByZW1haW5pbmcgY2hlY2tzIHJlcXVpcmUgYW4gZWxlbWVudFxuICBpZiAoIWlzLmVsZW1lbnQoZWxlbWVudCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICByZXR1cm4gaXMuZWxlbWVudCh2YWx1ZSlcbiAgLy8gdGhlIHZhbHVlIGlzIGFuIGVsZW1lbnQgdG8gdXNlIGFzIGEgcmVzaXplIGhhbmRsZVxuICAgID8gdmFsdWUgPT09IGVsZW1lbnRcbiAgICAvLyBvdGhlcndpc2UgY2hlY2sgaWYgZWxlbWVudCBtYXRjaGVzIHZhbHVlIGFzIHNlbGVjdG9yXG4gICAgOiBkb20ubWF0Y2hlc1VwVG8oZWxlbWVudCwgdmFsdWUsIGludGVyYWN0YWJsZUVsZW1lbnQpXG59XG5cbmZ1bmN0aW9uIGluaXRDdXJzb3JzIChicm93c2VyOiB0eXBlb2YgaW1wb3J0ICgnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcicpLmRlZmF1bHQpIHtcbiAgcmV0dXJuIChicm93c2VyLmlzSWU5ID8ge1xuICAgIHggOiAnZS1yZXNpemUnLFxuICAgIHkgOiAncy1yZXNpemUnLFxuICAgIHh5OiAnc2UtcmVzaXplJyxcblxuICAgIHRvcCAgICAgICAgOiAnbi1yZXNpemUnLFxuICAgIGxlZnQgICAgICAgOiAndy1yZXNpemUnLFxuICAgIGJvdHRvbSAgICAgOiAncy1yZXNpemUnLFxuICAgIHJpZ2h0ICAgICAgOiAnZS1yZXNpemUnLFxuICAgIHRvcGxlZnQgICAgOiAnc2UtcmVzaXplJyxcbiAgICBib3R0b21yaWdodDogJ3NlLXJlc2l6ZScsXG4gICAgdG9wcmlnaHQgICA6ICduZS1yZXNpemUnLFxuICAgIGJvdHRvbWxlZnQgOiAnbmUtcmVzaXplJyxcbiAgfSA6IHtcbiAgICB4IDogJ2V3LXJlc2l6ZScsXG4gICAgeSA6ICducy1yZXNpemUnLFxuICAgIHh5OiAnbndzZS1yZXNpemUnLFxuXG4gICAgdG9wICAgICAgICA6ICducy1yZXNpemUnLFxuICAgIGxlZnQgICAgICAgOiAnZXctcmVzaXplJyxcbiAgICBib3R0b20gICAgIDogJ25zLXJlc2l6ZScsXG4gICAgcmlnaHQgICAgICA6ICdldy1yZXNpemUnLFxuICAgIHRvcGxlZnQgICAgOiAnbndzZS1yZXNpemUnLFxuICAgIGJvdHRvbXJpZ2h0OiAnbndzZS1yZXNpemUnLFxuICAgIHRvcHJpZ2h0ICAgOiAnbmVzdy1yZXNpemUnLFxuICAgIGJvdHRvbWxlZnQgOiAnbmVzdy1yZXNpemUnLFxuICB9KVxufVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpRXZlbnQsIGludGVyYWN0aW9uIH06IHsgaUV2ZW50OiBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PGFueSwgYW55PiwgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUgIT09ICdyZXNpemUnIHx8ICFpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzaXplRXZlbnQgPSBpRXZlbnQgYXMgUmVzaXplRXZlbnRcbiAgY29uc3QgcmVjdCA9IGludGVyYWN0aW9uLnJlY3RcblxuICBpbnRlcmFjdGlvbi5fcmVjdHMgPSB7XG4gICAgc3RhcnQ6IGV4dGVuZCh7fSwgcmVjdCksXG4gICAgY29ycmVjdGVkOiBleHRlbmQoe30sIHJlY3QpLFxuICAgIHByZXZpb3VzOiBleHRlbmQoe30sIHJlY3QpLFxuICAgIGRlbHRhOiB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQgOiAwLFxuICAgICAgd2lkdGggOiAwLFxuICAgICAgdG9wIDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICB9LFxuICB9XG5cbiAgcmVzaXplRXZlbnQuZWRnZXMgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlc1xuICByZXNpemVFdmVudC5yZWN0ID0gaW50ZXJhY3Rpb24uX3JlY3RzLmNvcnJlY3RlZFxuICByZXNpemVFdmVudC5kZWx0YVJlY3QgPSBpbnRlcmFjdGlvbi5fcmVjdHMuZGVsdGFcbn1cblxuZnVuY3Rpb24gbW92ZSAoeyBpRXZlbnQsIGludGVyYWN0aW9uIH06IHsgaUV2ZW50OiBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PGFueSwgYW55PiwgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUgIT09ICdyZXNpemUnIHx8ICFpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlcykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IHJlc2l6ZUV2ZW50ID0gaUV2ZW50IGFzIFJlc2l6ZUV2ZW50XG4gIGNvbnN0IHJlc2l6ZU9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemVcbiAgY29uc3QgaW52ZXJ0ID0gcmVzaXplT3B0aW9ucy5pbnZlcnRcbiAgY29uc3QgaW52ZXJ0aWJsZSA9IGludmVydCA9PT0gJ3JlcG9zaXRpb24nIHx8IGludmVydCA9PT0gJ25lZ2F0ZSdcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGNvbnN0IGN1cnJlbnQgPSBpbnRlcmFjdGlvbi5yZWN0XG4gIGNvbnN0IHsgc3RhcnQ6IHN0YXJ0UmVjdCwgY29ycmVjdGVkLCBkZWx0YTogZGVsdGFSZWN0LCBwcmV2aW91cyB9ID0gaW50ZXJhY3Rpb24uX3JlY3RzXG5cbiAgZXh0ZW5kKHByZXZpb3VzLCBjb3JyZWN0ZWQpXG5cbiAgaWYgKGludmVydGlibGUpIHtcbiAgICAvLyBpZiBpbnZlcnRpYmxlLCBjb3B5IHRoZSBjdXJyZW50IHJlY3RcbiAgICBleHRlbmQoY29ycmVjdGVkLCBjdXJyZW50KVxuXG4gICAgaWYgKGludmVydCA9PT0gJ3JlcG9zaXRpb24nKSB7XG4gICAgICAvLyBzd2FwIGVkZ2UgdmFsdWVzIGlmIG5lY2Vzc2FyeSB0byBrZWVwIHdpZHRoL2hlaWdodCBwb3NpdGl2ZVxuICAgICAgaWYgKGNvcnJlY3RlZC50b3AgPiBjb3JyZWN0ZWQuYm90dG9tKSB7XG4gICAgICAgIGNvbnN0IHN3YXAgPSBjb3JyZWN0ZWQudG9wXG5cbiAgICAgICAgY29ycmVjdGVkLnRvcCA9IGNvcnJlY3RlZC5ib3R0b21cbiAgICAgICAgY29ycmVjdGVkLmJvdHRvbSA9IHN3YXBcbiAgICAgIH1cbiAgICAgIGlmIChjb3JyZWN0ZWQubGVmdCA+IGNvcnJlY3RlZC5yaWdodCkge1xuICAgICAgICBjb25zdCBzd2FwID0gY29ycmVjdGVkLmxlZnRcblxuICAgICAgICBjb3JyZWN0ZWQubGVmdCA9IGNvcnJlY3RlZC5yaWdodFxuICAgICAgICBjb3JyZWN0ZWQucmlnaHQgPSBzd2FwXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIGlmIG5vdCBpbnZlcnRpYmxlLCByZXN0cmljdCB0byBtaW5pbXVtIG9mIDB4MCByZWN0XG4gICAgY29ycmVjdGVkLnRvcCAgICA9IE1hdGgubWluKGN1cnJlbnQudG9wLCBzdGFydFJlY3QuYm90dG9tKVxuICAgIGNvcnJlY3RlZC5ib3R0b20gPSBNYXRoLm1heChjdXJyZW50LmJvdHRvbSwgc3RhcnRSZWN0LnRvcClcbiAgICBjb3JyZWN0ZWQubGVmdCAgID0gTWF0aC5taW4oY3VycmVudC5sZWZ0LCBzdGFydFJlY3QucmlnaHQpXG4gICAgY29ycmVjdGVkLnJpZ2h0ICA9IE1hdGgubWF4KGN1cnJlbnQucmlnaHQsIHN0YXJ0UmVjdC5sZWZ0KVxuICB9XG5cbiAgY29ycmVjdGVkLndpZHRoICA9IGNvcnJlY3RlZC5yaWdodCAgLSBjb3JyZWN0ZWQubGVmdFxuICBjb3JyZWN0ZWQuaGVpZ2h0ID0gY29ycmVjdGVkLmJvdHRvbSAtIGNvcnJlY3RlZC50b3BcblxuICBmb3IgKGNvbnN0IGVkZ2UgaW4gY29ycmVjdGVkKSB7XG4gICAgZGVsdGFSZWN0W2VkZ2VdID0gY29ycmVjdGVkW2VkZ2VdIC0gcHJldmlvdXNbZWRnZV1cbiAgfVxuXG4gIHJlc2l6ZUV2ZW50LmVkZ2VzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuZWRnZXNcbiAgcmVzaXplRXZlbnQucmVjdCA9IGNvcnJlY3RlZFxuICByZXNpemVFdmVudC5kZWx0YVJlY3QgPSBkZWx0YVJlY3Rcbn1cblxuZnVuY3Rpb24gZW5kICh7IGlFdmVudCwgaW50ZXJhY3Rpb24gfTogeyBpRXZlbnQ6IEludGVyYWN0LkludGVyYWN0RXZlbnQ8YW55LCBhbnk+LCBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24gfSkge1xuICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ3Jlc2l6ZScgfHwgIWludGVyYWN0aW9uLnByZXBhcmVkLmVkZ2VzKSB7IHJldHVybiB9XG5cbiAgY29uc3QgcmVzaXplRXZlbnQgPSBpRXZlbnQgYXMgUmVzaXplRXZlbnRcblxuICByZXNpemVFdmVudC5lZGdlcyA9IGludGVyYWN0aW9uLnByZXBhcmVkLmVkZ2VzXG4gIHJlc2l6ZUV2ZW50LnJlY3QgPSBpbnRlcmFjdGlvbi5fcmVjdHMuY29ycmVjdGVkXG4gIHJlc2l6ZUV2ZW50LmRlbHRhUmVjdCA9IGludGVyYWN0aW9uLl9yZWN0cy5kZWx0YVxufVxuXG5mdW5jdGlvbiB1cGRhdGVFdmVudEF4ZXMgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbiB9OiB7IGlFdmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxhbnksIGFueT4sIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAncmVzaXplJyB8fCAhaW50ZXJhY3Rpb24ucmVzaXplQXhlcykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9uc1xuICBjb25zdCByZXNpemVFdmVudCA9IGlFdmVudCBhcyBSZXNpemVFdmVudFxuXG4gIGlmIChvcHRpb25zLnJlc2l6ZS5zcXVhcmUpIHtcbiAgICBpZiAoaW50ZXJhY3Rpb24ucmVzaXplQXhlcyA9PT0gJ3knKSB7XG4gICAgICByZXNpemVFdmVudC5kZWx0YS54ID0gcmVzaXplRXZlbnQuZGVsdGEueVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJlc2l6ZUV2ZW50LmRlbHRhLnkgPSByZXNpemVFdmVudC5kZWx0YS54XG4gICAgfVxuICAgIHJlc2l6ZUV2ZW50LmF4ZXMgPSAneHknXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzaXplRXZlbnQuYXhlcyA9IGludGVyYWN0aW9uLnJlc2l6ZUF4ZXNcblxuICAgIGlmIChpbnRlcmFjdGlvbi5yZXNpemVBeGVzID09PSAneCcpIHtcbiAgICAgIHJlc2l6ZUV2ZW50LmRlbHRhLnkgPSAwXG4gICAgfVxuICAgIGVsc2UgaWYgKGludGVyYWN0aW9uLnJlc2l6ZUF4ZXMgPT09ICd5Jykge1xuICAgICAgcmVzaXplRXZlbnQuZGVsdGEueCA9IDBcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcmVzaXplOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYWN0aW9ucy9yZXNpemUnLFxuICBiZWZvcmU6IFsnYWN0aW9ucy9kcmFnJ10sXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogKHsgaW50ZXJhY3Rpb24gfSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24ucmVzaXplQXhlcyA9ICd4eSdcbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tc3RhcnQnOiBhcmcgPT4ge1xuICAgICAgc3RhcnQoYXJnKVxuICAgICAgdXBkYXRlRXZlbnRBeGVzKGFyZylcbiAgICB9LFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBhcmcgPT4ge1xuICAgICAgbW92ZShhcmcpXG4gICAgICB1cGRhdGVFdmVudEF4ZXMoYXJnKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tZW5kJzogZW5kLFxuICAgICdhdXRvLXN0YXJ0OmNoZWNrJzogcmVzaXplQ2hlY2tlcixcbiAgfSxcblxuICBkZWZhdWx0czoge1xuICAgIHNxdWFyZTogZmFsc2UsXG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgYXhpczogJ3h5JyxcblxuICAgIC8vIHVzZSBkZWZhdWx0IG1hcmdpblxuICAgIG1hcmdpbjogTmFOLFxuXG4gICAgLy8gb2JqZWN0IHdpdGggcHJvcHMgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIHdoaWNoIGFyZVxuICAgIC8vIHRydWUvZmFsc2UgdmFsdWVzIHRvIHJlc2l6ZSB3aGVuIHRoZSBwb2ludGVyIGlzIG92ZXIgdGhhdCBlZGdlLFxuICAgIC8vIENTUyBzZWxlY3RvcnMgdG8gbWF0Y2ggdGhlIGhhbmRsZXMgZm9yIGVhY2ggZGlyZWN0aW9uXG4gICAgLy8gb3IgdGhlIEVsZW1lbnRzIGZvciBlYWNoIGhhbmRsZVxuICAgIGVkZ2VzOiBudWxsLFxuXG4gICAgLy8gYSB2YWx1ZSBvZiAnbm9uZScgd2lsbCBsaW1pdCB0aGUgcmVzaXplIHJlY3QgdG8gYSBtaW5pbXVtIG9mIDB4MFxuICAgIC8vICduZWdhdGUnIHdpbGwgYWxvdyB0aGUgcmVjdCB0byBoYXZlIG5lZ2F0aXZlIHdpZHRoL2hlaWdodFxuICAgIC8vICdyZXBvc2l0aW9uJyB3aWxsIGtlZXAgdGhlIHdpZHRoL2hlaWdodCBwb3NpdGl2ZSBieSBzd2FwcGluZ1xuICAgIC8vIHRoZSB0b3AgYW5kIGJvdHRvbSBlZGdlcyBhbmQvb3Igc3dhcHBpbmcgdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzXG4gICAgaW52ZXJ0OiAnbm9uZScsXG4gIH0gYXMgSW50ZXJhY3QuUmVzaXphYmxlT3B0aW9ucyxcblxuICBjdXJzb3JzOiBudWxsIGFzIFJldHVyblR5cGU8dHlwZW9mIGluaXRDdXJzb3JzPixcblxuICBnZXRDdXJzb3IgKHsgZWRnZXMsIGF4aXMsIG5hbWUgfTogSW50ZXJhY3QuQWN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjdXJzb3JzID0gcmVzaXplLmN1cnNvcnNcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsXG5cbiAgICBpZiAoYXhpcykge1xuICAgICAgcmVzdWx0ID0gY3Vyc29yc1tuYW1lICsgYXhpc11cbiAgICB9XG4gICAgZWxzZSBpZiAoZWRnZXMpIHtcbiAgICAgIGxldCBjdXJzb3JLZXkgPSAnJ1xuXG4gICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgWyd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnXSkge1xuICAgICAgICBpZiAoZWRnZXNbZWRnZV0pIHtcbiAgICAgICAgICBjdXJzb3JLZXkgKz0gZWRnZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCA9IGN1cnNvcnNbY3Vyc29yS2V5XVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfSxcblxuICBkZWZhdWx0TWFyZ2luOiBudWxsIGFzIG51bWJlcixcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVzaXplXG4iLCJpbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgZHJhZyBmcm9tICcuL2RyYWcnXG5pbXBvcnQgZHJvcCBmcm9tICcuL2Ryb3AvaW5kZXgnXG5pbXBvcnQgZ2VzdHVyZSBmcm9tICcuL2dlc3R1cmUnXG5pbXBvcnQgcmVzaXplIGZyb20gJy4vcmVzaXplJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnYWN0aW9ucycsXG4gIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICAgIHNjb3BlLnVzZVBsdWdpbihnZXN0dXJlKVxuICAgIHNjb3BlLnVzZVBsdWdpbihyZXNpemUpXG4gICAgc2NvcGUudXNlUGx1Z2luKGRyYWcpXG4gICAgc2NvcGUudXNlUGx1Z2luKGRyb3ApXG4gIH0sXG59XG5cbmV4cG9ydCB7XG4gIGdlc3R1cmUsXG4gIHJlc2l6ZSxcbiAgZHJhZyxcbiAgZHJvcCxcbn1cbiIsImltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5pbXBvcnQgcmFmIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JhZidcbmltcG9ydCB7IGdldFN0cmluZ09wdGlvblJlc3VsdCB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JlY3QnXG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy93aW5kb3cnXG5cbnR5cGUgU2NvcGUgPSBpbXBvcnQgKCdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJykuU2NvcGVcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNjb3BlIHtcbiAgICBhdXRvU2Nyb2xsOiB0eXBlb2YgYXV0b1Njcm9sbFxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgYXV0b1Njcm9sbD86IHR5cGVvZiBhdXRvU2Nyb2xsXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIFBlckFjdGlvbkRlZmF1bHRzIHtcbiAgICBhdXRvU2Nyb2xsPzogQXV0b1Njcm9sbE9wdGlvbnNcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TY3JvbGxPcHRpb25zIHtcbiAgY29udGFpbmVyPzogV2luZG93IHwgSFRNTEVsZW1lbnRcbiAgbWFyZ2luPzogbnVtYmVyXG4gIGRpc3RhbmNlPzogbnVtYmVyXG4gIGludGVydmFsPzogbnVtYmVyXG4gIHNwZWVkPzogbnVtYmVyXG4gIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgZGVmYXVsdHMsXG4gICAgYWN0aW9ucyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUuYXV0b1Njcm9sbCA9IGF1dG9TY3JvbGxcbiAgYXV0b1Njcm9sbC5ub3cgPSAoKSA9PiBzY29wZS5ub3coKVxuXG4gIGFjdGlvbnMucGhhc2VsZXNzVHlwZXMuYXV0b3Njcm9sbCA9IHRydWVcbiAgZGVmYXVsdHMucGVyQWN0aW9uLmF1dG9TY3JvbGwgPSBhdXRvU2Nyb2xsLmRlZmF1bHRzXG59XG5cbmNvbnN0IGF1dG9TY3JvbGwgPSB7XG4gIGRlZmF1bHRzOiB7XG4gICAgZW5hYmxlZCAgOiBmYWxzZSxcbiAgICBtYXJnaW4gICA6IDYwLFxuXG4gICAgLy8gdGhlIGl0ZW0gdGhhdCBpcyBzY3JvbGxlZCAoV2luZG93IG9yIEhUTUxFbGVtZW50KVxuICAgIGNvbnRhaW5lcjogbnVsbCBhcyBBdXRvU2Nyb2xsT3B0aW9uc1snY29udGFpbmVyJ10sXG5cbiAgICAvLyB0aGUgc2Nyb2xsIHNwZWVkIGluIHBpeGVscyBwZXIgc2Vjb25kXG4gICAgc3BlZWQgICAgOiAzMDAsXG4gIH0gYXMgQXV0b1Njcm9sbE9wdGlvbnMsXG5cbiAgbm93OiBEYXRlLm5vdyxcblxuICBpbnRlcmFjdGlvbjogbnVsbCBhcyBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgaTogMCwgLy8gdGhlIGhhbmRsZSByZXR1cm5lZCBieSB3aW5kb3cuc2V0SW50ZXJ2YWxcblxuICAvLyBEaXJlY3Rpb24gZWFjaCBwdWxzZSBpcyB0byBzY3JvbGwgaW5cbiAgeDogMCxcbiAgeTogMCxcblxuICBpc1Njcm9sbGluZzogZmFsc2UsXG4gIHByZXZUaW1lOiAwLFxuICBtYXJnaW46IDAsXG4gIHNwZWVkOiAwLFxuXG4gIHN0YXJ0IChpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24pIHtcbiAgICBhdXRvU2Nyb2xsLmlzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgIHJhZi5jYW5jZWwoYXV0b1Njcm9sbC5pKVxuXG4gICAgaW50ZXJhY3Rpb24uYXV0b1Njcm9sbCA9IGF1dG9TY3JvbGxcbiAgICBhdXRvU2Nyb2xsLmludGVyYWN0aW9uID0gaW50ZXJhY3Rpb25cbiAgICBhdXRvU2Nyb2xsLnByZXZUaW1lID0gYXV0b1Njcm9sbC5ub3coKVxuICAgIGF1dG9TY3JvbGwuaSA9IHJhZi5yZXF1ZXN0KGF1dG9TY3JvbGwuc2Nyb2xsKVxuICB9LFxuXG4gIHN0b3AgKCkge1xuICAgIGF1dG9TY3JvbGwuaXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgIGlmIChhdXRvU2Nyb2xsLmludGVyYWN0aW9uKSB7XG4gICAgICBhdXRvU2Nyb2xsLmludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgfVxuICAgIHJhZi5jYW5jZWwoYXV0b1Njcm9sbC5pKVxuICB9LFxuXG4gIC8vIHNjcm9sbCB0aGUgd2luZG93IGJ5IHRoZSB2YWx1ZXMgaW4gc2Nyb2xsLngveVxuICBzY3JvbGwgKCkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGF1dG9TY3JvbGxcbiAgICBjb25zdCB7IGludGVyYWN0YWJsZSwgZWxlbWVudCB9ID0gaW50ZXJhY3Rpb25cbiAgICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb25OYW1lXS5hdXRvU2Nyb2xsXG4gICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbnMuY29udGFpbmVyLCBpbnRlcmFjdGFibGUsIGVsZW1lbnQpXG4gICAgY29uc3Qgbm93ID0gYXV0b1Njcm9sbC5ub3coKVxuICAgIC8vIGNoYW5nZSBpbiB0aW1lIGluIHNlY29uZHNcbiAgICBjb25zdCBkdCA9IChub3cgLSBhdXRvU2Nyb2xsLnByZXZUaW1lKSAvIDEwMDBcbiAgICAvLyBkaXNwbGFjZW1lbnRcbiAgICBjb25zdCBzID0gb3B0aW9ucy5zcGVlZCAqIGR0XG5cbiAgICBpZiAocyA+PSAxKSB7XG4gICAgICBjb25zdCBzY3JvbGxCeSA9IHtcbiAgICAgICAgeDogYXV0b1Njcm9sbC54ICogcyxcbiAgICAgICAgeTogYXV0b1Njcm9sbC55ICogcyxcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbEJ5LnggfHwgc2Nyb2xsQnkueSkge1xuICAgICAgICBjb25zdCBwcmV2U2Nyb2xsID0gZ2V0U2Nyb2xsKGNvbnRhaW5lcilcblxuICAgICAgICBpZiAoaXMud2luZG93KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICBjb250YWluZXIuc2Nyb2xsQnkoc2Nyb2xsQnkueCwgc2Nyb2xsQnkueSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICBjb250YWluZXIuc2Nyb2xsTGVmdCArPSBzY3JvbGxCeS54XG4gICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCAgKz0gc2Nyb2xsQnkueVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VyU2Nyb2xsID0gZ2V0U2Nyb2xsKGNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgZGVsdGEgPSB7XG4gICAgICAgICAgeDogY3VyU2Nyb2xsLnggLSBwcmV2U2Nyb2xsLngsXG4gICAgICAgICAgeTogY3VyU2Nyb2xsLnkgLSBwcmV2U2Nyb2xsLnksXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsdGEueCB8fCBkZWx0YS55KSB7XG4gICAgICAgICAgaW50ZXJhY3RhYmxlLmZpcmUoe1xuICAgICAgICAgICAgdHlwZTogJ2F1dG9zY3JvbGwnLFxuICAgICAgICAgICAgdGFyZ2V0OiBlbGVtZW50LFxuICAgICAgICAgICAgaW50ZXJhY3RhYmxlLFxuICAgICAgICAgICAgZGVsdGEsXG4gICAgICAgICAgICBpbnRlcmFjdGlvbixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF1dG9TY3JvbGwucHJldlRpbWUgPSBub3dcbiAgICB9XG5cbiAgICBpZiAoYXV0b1Njcm9sbC5pc1Njcm9sbGluZykge1xuICAgICAgcmFmLmNhbmNlbChhdXRvU2Nyb2xsLmkpXG4gICAgICBhdXRvU2Nyb2xsLmkgPSByYWYucmVxdWVzdChhdXRvU2Nyb2xsLnNjcm9sbClcbiAgICB9XG4gIH0sXG4gIGNoZWNrIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgYWN0aW9uTmFtZTogSW50ZXJhY3QuQWN0aW9uTmFtZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1xuXG4gICAgcmV0dXJuIG9wdGlvbnNbYWN0aW9uTmFtZV0uYXV0b1Njcm9sbCAmJiBvcHRpb25zW2FjdGlvbk5hbWVdLmF1dG9TY3JvbGwuZW5hYmxlZFxuICB9LFxuICBvbkludGVyYWN0aW9uTW92ZTxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKHsgaW50ZXJhY3Rpb24sIHBvaW50ZXIgfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb248VD4sIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIH0pIHtcbiAgICBpZiAoIShpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpICYmXG4gICAgICAgICAgYXV0b1Njcm9sbC5jaGVjayhpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLnNpbXVsYXRpb24pIHtcbiAgICAgIGF1dG9TY3JvbGwueCA9IGF1dG9TY3JvbGwueSA9IDBcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCB0b3BcbiAgICBsZXQgcmlnaHRcbiAgICBsZXQgYm90dG9tXG4gICAgbGV0IGxlZnRcblxuICAgIGNvbnN0IHsgaW50ZXJhY3RhYmxlLCBlbGVtZW50IH0gPSBpbnRlcmFjdGlvblxuICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lXG4gICAgY29uc3Qgb3B0aW9ucyA9IGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbk5hbWVdLmF1dG9TY3JvbGxcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXIob3B0aW9ucy5jb250YWluZXIsIGludGVyYWN0YWJsZSwgZWxlbWVudClcblxuICAgIGlmIChpcy53aW5kb3coY29udGFpbmVyKSkge1xuICAgICAgbGVmdCAgID0gcG9pbnRlci5jbGllbnRYIDwgYXV0b1Njcm9sbC5tYXJnaW5cbiAgICAgIHRvcCAgICA9IHBvaW50ZXIuY2xpZW50WSA8IGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICByaWdodCAgPSBwb2ludGVyLmNsaWVudFggPiBjb250YWluZXIuaW5uZXJXaWR0aCAgLSBhdXRvU2Nyb2xsLm1hcmdpblxuICAgICAgYm90dG9tID0gcG9pbnRlci5jbGllbnRZID4gY29udGFpbmVyLmlubmVySGVpZ2h0IC0gYXV0b1Njcm9sbC5tYXJnaW5cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCByZWN0ID0gZG9tVXRpbHMuZ2V0RWxlbWVudENsaWVudFJlY3QoY29udGFpbmVyKVxuXG4gICAgICBsZWZ0ICAgPSBwb2ludGVyLmNsaWVudFggPCByZWN0LmxlZnQgICArIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICB0b3AgICAgPSBwb2ludGVyLmNsaWVudFkgPCByZWN0LnRvcCAgICArIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICByaWdodCAgPSBwb2ludGVyLmNsaWVudFggPiByZWN0LnJpZ2h0ICAtIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICBib3R0b20gPSBwb2ludGVyLmNsaWVudFkgPiByZWN0LmJvdHRvbSAtIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgfVxuXG4gICAgYXV0b1Njcm9sbC54ID0gKHJpZ2h0ID8gMSA6IGxlZnQgPyAtMSA6IDApXG4gICAgYXV0b1Njcm9sbC55ID0gKGJvdHRvbSA/IDEgOiAgdG9wID8gLTEgOiAwKVxuXG4gICAgaWYgKCFhdXRvU2Nyb2xsLmlzU2Nyb2xsaW5nKSB7XG4gICAgICAvLyBzZXQgdGhlIGF1dG9TY3JvbGwgcHJvcGVydGllcyB0byB0aG9zZSBvZiB0aGUgdGFyZ2V0XG4gICAgICBhdXRvU2Nyb2xsLm1hcmdpbiA9IG9wdGlvbnMubWFyZ2luXG4gICAgICBhdXRvU2Nyb2xsLnNwZWVkICA9IG9wdGlvbnMuc3BlZWRcblxuICAgICAgYXV0b1Njcm9sbC5zdGFydChpbnRlcmFjdGlvbilcbiAgICB9XG4gIH0sXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250YWluZXIgKHZhbHVlOiBhbnksIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gIHJldHVybiAoaXMuc3RyaW5nKHZhbHVlKSA/IGdldFN0cmluZ09wdGlvblJlc3VsdCh2YWx1ZSwgaW50ZXJhY3RhYmxlLCBlbGVtZW50KSA6IHZhbHVlKSB8fCBnZXRXaW5kb3coZWxlbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjcm9sbCAoY29udGFpbmVyOiBhbnkpIHtcbiAgaWYgKGlzLndpbmRvdyhjb250YWluZXIpKSB7IGNvbnRhaW5lciA9IHdpbmRvdy5kb2N1bWVudC5ib2R5IH1cblxuICByZXR1cm4geyB4OiBjb250YWluZXIuc2Nyb2xsTGVmdCwgeTogY29udGFpbmVyLnNjcm9sbFRvcCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxTaXplIChjb250YWluZXI6IGFueSkge1xuICBpZiAoaXMud2luZG93KGNvbnRhaW5lcikpIHsgY29udGFpbmVyID0gd2luZG93LmRvY3VtZW50LmJvZHkgfVxuXG4gIHJldHVybiB7IHg6IGNvbnRhaW5lci5zY3JvbGxXaWR0aCwgeTogY29udGFpbmVyLnNjcm9sbEhlaWdodCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxTaXplRGVsdGE8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+ICh7IGludGVyYWN0aW9uLCBlbGVtZW50IH06IHtcbiAgaW50ZXJhY3Rpb246IFBhcnRpYWw8SW50ZXJhY3QuSW50ZXJhY3Rpb248VD4+XG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbn0sIGZ1bmM6IGFueSkge1xuICBjb25zdCBzY3JvbGxPcHRpb25zID0gaW50ZXJhY3Rpb24gJiYgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLm9wdGlvbnNbaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZV0uYXV0b1Njcm9sbFxuXG4gIGlmICghc2Nyb2xsT3B0aW9ucyB8fCAhc2Nyb2xsT3B0aW9ucy5lbmFibGVkKSB7XG4gICAgZnVuYygpXG4gICAgcmV0dXJuIHsgeDogMCwgeTogMCB9XG4gIH1cblxuICBjb25zdCBzY3JvbGxDb250YWluZXIgPSBnZXRDb250YWluZXIoXG4gICAgc2Nyb2xsT3B0aW9ucy5jb250YWluZXIsXG4gICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLFxuICAgIGVsZW1lbnQsXG4gIClcblxuICBjb25zdCBwcmV2U2l6ZSA9IGdldFNjcm9sbChzY3JvbGxDb250YWluZXIpXG4gIGZ1bmMoKVxuICBjb25zdCBjdXJTaXplID0gZ2V0U2Nyb2xsKHNjcm9sbENvbnRhaW5lcilcblxuICByZXR1cm4ge1xuICAgIHg6IGN1clNpemUueCAtIHByZXZTaXplLngsXG4gICAgeTogY3VyU2l6ZS55IC0gcHJldlNpemUueSxcbiAgfVxufVxuXG5jb25zdCBhdXRvU2Nyb2xsUGx1Z2luOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYXV0by1zY3JvbGwnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgfSxcblxuICAgICdpbnRlcmFjdGlvbnM6ZGVzdHJveSc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgICBhdXRvU2Nyb2xsLnN0b3AoKVxuICAgICAgaWYgKGF1dG9TY3JvbGwuaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgYXV0b1Njcm9sbC5pbnRlcmFjdGlvbiA9IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogYXV0b1Njcm9sbC5zdG9wLFxuXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IChhcmc6IGFueSkgPT4gYXV0b1Njcm9sbC5vbkludGVyYWN0aW9uTW92ZShhcmcpLFxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBhdXRvU2Nyb2xsUGx1Z2luXG4iLCJpbXBvcnQgeyB3YXJuT25jZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBnZXRBY3Rpb246IChcbiAgICAgIHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLFxuICAgICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sXG4gICAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgICkgPT4gSW50ZXJhY3QuQWN0aW9uUHJvcHMgfCBudWxsXG4gICAgc3R5bGVDdXJzb3I6IHR5cGVvZiBzdHlsZUN1cnNvclxuICAgIGFjdGlvbkNoZWNrZXI6IHR5cGVvZiBhY3Rpb25DaGVja2VyXG4gICAgaWdub3JlRnJvbToge1xuICAgICAgKC4uLmFyZ3M6IGFueVtdKTogSW50ZXJhY3RhYmxlXG4gICAgICAoKTogYm9vbGVhblxuICAgIH1cbiAgICBhbGxvd0Zyb206IHtcbiAgICAgICguLi5hcmdzOiBhbnlbXSk6IEludGVyYWN0YWJsZVxuICAgICAgKCk6IGJvb2xlYW5cbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBwb2ludGVySXNEb3duOiBib29sZWFuXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICAvKiogQGxlbmRzIEludGVyYWN0YWJsZSAqL1xuICAgIEludGVyYWN0YWJsZSwgLy8gdHNsaW50OmRpc2FibGUtbGluZSBuby1zaGFkb3dlZC12YXJpYWJsZVxuICB9ID0gc2NvcGVcblxuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmdldEFjdGlvbiA9IGZ1bmN0aW9uIGdldEFjdGlvbiAoXG4gICAgdGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLFxuICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLFxuICAgIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLFxuICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICApOiBJbnRlcmFjdC5BY3Rpb25Qcm9wcyB7XG4gICAgY29uc3QgYWN0aW9uID0gZGVmYXVsdEFjdGlvbkNoZWNrZXIodGhpcywgZXZlbnQsIGludGVyYWN0aW9uLCBlbGVtZW50LCBzY29wZSlcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlcikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hY3Rpb25DaGVja2VyKHBvaW50ZXIsIGV2ZW50LCBhY3Rpb24sIHRoaXMsIGVsZW1lbnQsIGludGVyYWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBgYGBqc1xuICAgKiBpbnRlcmFjdChlbGVtZW50LCB7IGlnbm9yZUZyb206IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduby1hY3Rpb24nKSB9KVxuICAgKiAvLyBvclxuICAgKiBpbnRlcmFjdChlbGVtZW50KS5pZ25vcmVGcm9tKCdpbnB1dCwgdGV4dGFyZWEsIGEnKVxuICAgKiBgYGBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogSWYgdGhlIHRhcmdldCBvZiB0aGUgYG1vdXNlZG93bmAsIGBwb2ludGVyZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50IG9yIGFueVxuICAgKiBvZiBpdCdzIHBhcmVudHMgbWF0Y2ggdGhlIGdpdmVuIENTUyBzZWxlY3RvciBvciBFbGVtZW50LCBub1xuICAgKiBkcmFnL3Jlc2l6ZS9nZXN0dXJlIGlzIHN0YXJ0ZWQuXG4gICAqXG4gICAqIERvbid0IHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCBzZXQgdGhlIGBpZ25vcmVGcm9tYCBvcHRpb24gZm9yIGVhY2ggYWN0aW9uXG4gICAqIG9yIGZvciBgcG9pbnRlckV2ZW50c2BcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogaW50ZXJhY3QodGFyZ2V0dClcbiAgICogICAuZHJhZ2dhYmxlKHtcbiAgICogICAgIGlnbm9yZUZyb206ICdpbnB1dCwgdGV4dGFyZWEsIGFbaHJlZl0nJyxcbiAgICogICB9KVxuICAgKiAgIC5wb2ludGVyRXZlbnRzKHtcbiAgICogICAgIGlnbm9yZUZyb206ICdbbm8tcG9pbnRlcl0nLFxuICAgKiAgIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRWxlbWVudCB8IG51bGx9IFtuZXdWYWx1ZV0gYSBDU1Mgc2VsZWN0b3Igc3RyaW5nLCBhblxuICAgKiBFbGVtZW50IG9yIGBudWxsYCB0byBub3QgaWdub3JlIGFueSBlbGVtZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBFbGVtZW50IHwgb2JqZWN0fSBUaGUgY3VycmVudCBpZ25vcmVGcm9tIHZhbHVlIG9yIHRoaXNcbiAgICogSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmlnbm9yZUZyb20gPSB3YXJuT25jZShmdW5jdGlvbiAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBuZXdWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrQ29tcGF0T3B0aW9uKCdpZ25vcmVGcm9tJywgbmV3VmFsdWUpXG4gIH0sICdJbnRlcmFjdGFibGUuaWdub3JlRnJvbSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBJbnRlcmFjdGJsZS5kcmFnZ2FibGUoe2lnbm9yZUZyb206IG5ld1ZhbHVlfSkuJylcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICpcbiAgICogQSBkcmFnL3Jlc2l6ZS9nZXN0dXJlIGlzIHN0YXJ0ZWQgb25seSBJZiB0aGUgdGFyZ2V0IG9mIHRoZSBgbW91c2Vkb3duYCxcbiAgICogYHBvaW50ZXJkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQgb3IgYW55IG9mIGl0J3MgcGFyZW50cyBtYXRjaCB0aGUgZ2l2ZW5cbiAgICogQ1NTIHNlbGVjdG9yIG9yIEVsZW1lbnQuXG4gICAqXG4gICAqIERvbid0IHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCBzZXQgdGhlIGBhbGxvd0Zyb21gIG9wdGlvbiBmb3IgZWFjaCBhY3Rpb25cbiAgICogb3IgZm9yIGBwb2ludGVyRXZlbnRzYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpbnRlcmFjdCh0YXJnZXR0KVxuICAgKiAgIC5yZXNpemFibGUoe1xuICAgKiAgICAgYWxsb3dGcm9tOiAnLnJlc2l6ZS1oYW5kbGUnLFxuICAgKiAgIC5wb2ludGVyRXZlbnRzKHtcbiAgICogICAgIGFsbG93RnJvbTogJy5oYW5kbGUnLCxcbiAgICogICB9KVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEVsZW1lbnQgfCBudWxsfSBbbmV3VmFsdWVdIGEgQ1NTIHNlbGVjdG9yIHN0cmluZywgYW5cbiAgICogRWxlbWVudCBvciBgbnVsbGAgdG8gYWxsb3cgZnJvbSBhbnkgZWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBFbGVtZW50IHwgb2JqZWN0fSBUaGUgY3VycmVudCBhbGxvd0Zyb20gdmFsdWUgb3IgdGhpc1xuICAgKiBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuYWxsb3dGcm9tID0gd2Fybk9uY2UoZnVuY3Rpb24gKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja0NvbXBhdE9wdGlvbignYWxsb3dGcm9tJywgbmV3VmFsdWUpXG4gIH0sICdJbnRlcmFjdGFibGUuYWxsb3dGcm9tKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIEludGVyYWN0YmxlLmRyYWdnYWJsZSh7YWxsb3dGcm9tOiBuZXdWYWx1ZX0pLicpXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGludGVyYWN0KCcucmVzaXplLWRyYWcnKVxuICAgKiAgIC5yZXNpemFibGUodHJ1ZSlcbiAgICogICAuZHJhZ2dhYmxlKHRydWUpXG4gICAqICAgLmFjdGlvbkNoZWNrZXIoZnVuY3Rpb24gKHBvaW50ZXIsIGV2ZW50LCBhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgaW50ZXJhY3Rpb24pIHtcbiAgICpcbiAgICogICBpZiAoaW50ZXJhY3QubWF0Y2hlc1NlbGVjdG9yKGV2ZW50LnRhcmdldCwgJy5kcmFnLWhhbmRsZScpKSB7XG4gICAqICAgICAvLyBmb3JjZSBkcmFnIHdpdGggaGFuZGxlIHRhcmdldFxuICAgKiAgICAgYWN0aW9uLm5hbWUgPSBkcmFnXG4gICAqICAgfVxuICAgKiAgIGVsc2Uge1xuICAgKiAgICAgLy8gcmVzaXplIGZyb20gdGhlIHRvcCBhbmQgcmlnaHQgZWRnZXNcbiAgICogICAgIGFjdGlvbi5uYW1lICA9ICdyZXNpemUnXG4gICAqICAgICBhY3Rpb24uZWRnZXMgPSB7IHRvcDogdHJ1ZSwgcmlnaHQ6IHRydWUgfVxuICAgKiAgIH1cbiAgICpcbiAgICogICByZXR1cm4gYWN0aW9uXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXR1cm5zIG9yIHNldHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvblxuICAgKiBwb2ludGVyRG93blxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgbnVsbH0gW2NoZWNrZXJdIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBwb2ludGVyIGV2ZW50LFxuICAgKiBkZWZhdWx0QWN0aW9uIHN0cmluZywgaW50ZXJhY3RhYmxlLCBlbGVtZW50IGFuZCBpbnRlcmFjdGlvbiBhcyBwYXJhbWV0ZXJzXG4gICAqIGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIG5hbWUgcHJvcGVydHkgJ2RyYWcnICdyZXNpemUnIG9yICdnZXN0dXJlJyBhbmRcbiAgICogb3B0aW9uYWxseSBhbiBgZWRnZXNgIG9iamVjdCB3aXRoIGJvb2xlYW4gJ3RvcCcsICdsZWZ0JywgJ2JvdHRvbScgYW5kIHJpZ2h0XG4gICAqIHByb3BzLlxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbiB8IEludGVyYWN0YWJsZX0gVGhlIGNoZWNrZXIgZnVuY3Rpb24gb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuYWN0aW9uQ2hlY2tlciA9IGFjdGlvbkNoZWNrZXJcblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHdoZXRoZXIgdGhlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGNoYW5nZWQgZGVwZW5kaW5nIG9uIHRoZVxuICAgKiBhY3Rpb24gdGhhdCB3b3VsZCBiZSBwZXJmb3JtZWQgaWYgdGhlIG1vdXNlIHdlcmUgcHJlc3NlZCBhbmQgZHJhZ2dlZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbbmV3VmFsdWVdXG4gICAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IFRoZSBjdXJyZW50IHNldHRpbmcgb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuc3R5bGVDdXJzb3IgPSBzdHlsZUN1cnNvclxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QWN0aW9uQ2hlY2tlciAoXG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLFxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICBzY29wZTogSW50ZXJhY3QuU2NvcGUsXG4pIHtcbiAgY29uc3QgcmVjdCA9IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQpXG4gIGNvbnN0IGJ1dHRvbnMgPSAoZXZlbnQgYXMgTW91c2VFdmVudCkuYnV0dG9ucyB8fCAoe1xuICAgIDA6IDEsXG4gICAgMTogNCxcbiAgICAzOiA4LFxuICAgIDQ6IDE2LFxuICB9KVsoZXZlbnQgYXMgTW91c2VFdmVudCkuYnV0dG9uIGFzIDAgfCAxIHwgMyB8IDRdXG4gIGNvbnN0IGFyZyA9IHtcbiAgICBhY3Rpb246IG51bGwsXG4gICAgaW50ZXJhY3RhYmxlLFxuICAgIGludGVyYWN0aW9uLFxuICAgIGVsZW1lbnQsXG4gICAgcmVjdCxcbiAgICBidXR0b25zLFxuICB9XG5cbiAgc2NvcGUuZmlyZSgnYXV0by1zdGFydDpjaGVjaycsIGFyZylcblxuICByZXR1cm4gYXJnLmFjdGlvblxufVxuXG5mdW5jdGlvbiBzdHlsZUN1cnNvciAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKTogYm9vbGVhblxuZnVuY3Rpb24gc3R5bGVDdXJzb3IgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU6IGJvb2xlYW4pOiB0eXBlb2YgdGhpc1xuZnVuY3Rpb24gc3R5bGVDdXJzb3IgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU/OiBib29sZWFuKSB7XG4gIGlmIChpcy5ib29sKG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5zdHlsZUN1cnNvciA9IG5ld1ZhbHVlXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgaWYgKG5ld1ZhbHVlID09PSBudWxsKSB7XG4gICAgZGVsZXRlIHRoaXMub3B0aW9ucy5zdHlsZUN1cnNvclxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMuc3R5bGVDdXJzb3Jcbn1cblxuZnVuY3Rpb24gYWN0aW9uQ2hlY2tlciAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBjaGVja2VyOiBhbnkpIHtcbiAgaWYgKGlzLmZ1bmMoY2hlY2tlcikpIHtcbiAgICB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlciA9IGNoZWNrZXJcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoY2hlY2tlciA9PT0gbnVsbCkge1xuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlclxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlclxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnYXV0by1zdGFydC9pbnRlcmFjdGFibGVNZXRob2RzJyxcbiAgaW5zdGFsbCxcbn1cbiIsImltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0IEludGVyYWN0YWJsZU1ldGhvZHMgZnJvbSAnLi9JbnRlcmFjdGFibGVNZXRob2RzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvaW50ZXJhY3QvaW5kZXgnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0U3RhdGljIHtcbiAgICBtYXhJbnRlcmFjdGlvbnM6IChuZXdWYWx1ZTogYW55KSA9PiBhbnlcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2NvcGUge1xuICAgIGF1dG9TdGFydDogQXV0b1N0YXJ0XG4gICAgbWF4SW50ZXJhY3Rpb25zOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICB9XG5cbiAgaW50ZXJmYWNlIFNpZ25hbEFyZ3Mge1xuICAgICdhdXRvU3RhcnQ6YmVmb3JlLXN0YXJ0JzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXVxuICAgICdhdXRvU3RhcnQ6cHJlcGFyZWQnOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9XG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBDaGVja1NpZ25hbEFyZ1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBCYXNlRGVmYXVsdHMge1xuICAgIGFjdGlvbkNoZWNrZXI/OiBhbnlcbiAgICBjdXJzb3JDaGVja2VyPzogYW55XG4gICAgc3R5bGVDdXJzb3I/OiBhbnlcbiAgfVxuXG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgbWFudWFsU3RhcnQ/OiBib29sZWFuXG4gICAgbWF4PzogbnVtYmVyXG4gICAgbWF4UGVyRWxlbWVudD86IG51bWJlclxuICAgIGFsbG93RnJvbT86IHN0cmluZyB8IEludGVyYWN0LkVsZW1lbnRcbiAgICBpZ25vcmVGcm9tPzogc3RyaW5nIHwgSW50ZXJhY3QuRWxlbWVudFxuICAgIGN1cnNvckNoZWNrZXI/OiBJbnRlcmFjdC5DdXJzb3JDaGVja2VyXG5cbiAgICAvLyBvbmx5IGFsbG93IGxlZnQgYnV0dG9uIGJ5IGRlZmF1bHRcbiAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9ucyNSZXR1cm5fdmFsdWVcbiAgICBtb3VzZUJ1dHRvbnM/OiAwIHwgMSB8IDIgfCA0IHwgMTZcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2hlY2tTaWduYWxBcmcge1xuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZVxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudFxuICBhY3Rpb246IEludGVyYWN0LkFjdGlvblByb3BzXG4gIGJ1dHRvbnM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TdGFydCB7XG4gIC8vIEFsbG93IHRoaXMgbWFueSBpbnRlcmFjdGlvbnMgdG8gaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gIG1heEludGVyYWN0aW9uczogbnVtYmVyXG4gIHdpdGhpbkludGVyYWN0aW9uTGltaXQ6IHR5cGVvZiB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0XG4gIGN1cnNvckVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlcmFjdCxcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKEludGVyYWN0YWJsZU1ldGhvZHMpXG5cbiAgZGVmYXVsdHMuYmFzZS5hY3Rpb25DaGVja2VyID0gbnVsbFxuICBkZWZhdWx0cy5iYXNlLnN0eWxlQ3Vyc29yID0gdHJ1ZVxuXG4gIHV0aWxzLmV4dGVuZChkZWZhdWx0cy5wZXJBY3Rpb24sIHtcbiAgICBtYW51YWxTdGFydDogZmFsc2UsXG4gICAgbWF4OiBJbmZpbml0eSxcbiAgICBtYXhQZXJFbGVtZW50OiAxLFxuICAgIGFsbG93RnJvbTogIG51bGwsXG4gICAgaWdub3JlRnJvbTogbnVsbCxcblxuICAgIC8vIG9ubHkgYWxsb3cgbGVmdCBidXR0b24gYnkgZGVmYXVsdFxuICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTW91c2VFdmVudC9idXR0b25zI1JldHVybl92YWx1ZVxuICAgIG1vdXNlQnV0dG9uczogMSxcbiAgfSlcblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGludGVyYWN0aW9ucyBhbGxvd2VkLiAgQnlcbiAgICogZGVmYXVsdCBvbmx5IDEgaW50ZXJhY3Rpb24gaXMgYWxsb3dlZCBhdCBhIHRpbWUgKGZvciBiYWNrd2FyZHNcbiAgICogY29tcGF0aWJpbGl0eSkuIFRvIGFsbG93IG11bHRpcGxlIGludGVyYWN0aW9ucyBvbiB0aGUgc2FtZSBJbnRlcmFjdGFibGVzIGFuZFxuICAgKiBlbGVtZW50cywgeW91IG5lZWQgdG8gZW5hYmxlIGl0IGluIHRoZSBkcmFnZ2FibGUsIHJlc2l6YWJsZSBhbmQgZ2VzdHVyYWJsZVxuICAgKiBgJ21heCdgIGFuZCBgJ21heFBlckVsZW1lbnQnYCBvcHRpb25zLlxuICAgKlxuICAgKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0Lm1heEludGVyYWN0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW25ld1ZhbHVlXSBBbnkgbnVtYmVyLiBuZXdWYWx1ZSA8PSAwIG1lYW5zIG5vIGludGVyYWN0aW9ucy5cbiAgICovXG4gIGludGVyYWN0Lm1heEludGVyYWN0aW9ucyA9IG5ld1ZhbHVlID0+IG1heEludGVyYWN0aW9ucyhuZXdWYWx1ZSwgc2NvcGUpXG5cbiAgc2NvcGUuYXV0b1N0YXJ0ID0ge1xuICAgIC8vIEFsbG93IHRoaXMgbWFueSBpbnRlcmFjdGlvbnMgdG8gaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gICAgbWF4SW50ZXJhY3Rpb25zOiBJbmZpbml0eSxcbiAgICB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0LFxuICAgIGN1cnNvckVsZW1lbnQ6IG51bGwsXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZU9uRG93biAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IH06IEludGVyYWN0LlNpZ25hbEFyZ3NbJ2ludGVyYWN0aW9uczpkb3duJ10sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBpZiAoaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSkgeyByZXR1cm4gfVxuXG4gIGNvbnN0IGFjdGlvbkluZm8gPSBnZXRBY3Rpb25JbmZvKGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHNjb3BlKVxuICBwcmVwYXJlKGludGVyYWN0aW9uLCBhY3Rpb25JbmZvLCBzY29wZSlcbn1cblxuZnVuY3Rpb24gcHJlcGFyZU9uTW92ZSAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IH06IEludGVyYWN0LlNpZ25hbEFyZ3NbJ2ludGVyYWN0aW9uczptb3ZlJ10sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBpZiAoaW50ZXJhY3Rpb24ucG9pbnRlclR5cGUgIT09ICdtb3VzZScgfHxcbiAgICAgIGludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24gfHxcbiAgICAgIGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHsgcmV0dXJuIH1cblxuICBjb25zdCBhY3Rpb25JbmZvID0gZ2V0QWN0aW9uSW5mbyhpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnQsIHNjb3BlKVxuICBwcmVwYXJlKGludGVyYWN0aW9uLCBhY3Rpb25JbmZvLCBzY29wZSlcbn1cblxuZnVuY3Rpb24gc3RhcnRPbk1vdmUgKGFyZzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGFyZ1xuXG4gIGlmICghaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93biB8fFxuICAgICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSB8fFxuICAgICAgIWludGVyYWN0aW9uLnBvaW50ZXJXYXNNb3ZlZCB8fFxuICAgICAgIWludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNjb3BlLmZpcmUoJ2F1dG9TdGFydDpiZWZvcmUtc3RhcnQnLCBhcmcpXG5cbiAgY29uc3QgeyBpbnRlcmFjdGFibGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lXG5cbiAgaWYgKGFjdGlvbk5hbWUgJiYgaW50ZXJhY3RhYmxlKSB7XG4gICAgLy8gY2hlY2sgbWFudWFsU3RhcnQgYW5kIGludGVyYWN0aW9uIGxpbWl0XG4gICAgaWYgKGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbk5hbWVdLm1hbnVhbFN0YXJ0IHx8XG4gICAgICAgICF3aXRoaW5JbnRlcmFjdGlvbkxpbWl0KGludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudCwgaW50ZXJhY3Rpb24ucHJlcGFyZWQsIHNjb3BlKSkge1xuICAgICAgaW50ZXJhY3Rpb24uc3RvcCgpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaW50ZXJhY3Rpb24uc3RhcnQoaW50ZXJhY3Rpb24ucHJlcGFyZWQsIGludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudClcbiAgICAgIHNldEludGVyYWN0aW9uQ3Vyc29yKGludGVyYWN0aW9uLCBzY29wZSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJDdXJzb3JPblN0b3AgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3RhYmxlIH0gPSBpbnRlcmFjdGlvblxuXG4gIGlmIChpbnRlcmFjdGFibGUgJiYgaW50ZXJhY3RhYmxlLm9wdGlvbnMuc3R5bGVDdXJzb3IpIHtcbiAgICBzZXRDdXJzb3IoaW50ZXJhY3Rpb24uZWxlbWVudCwgJycsIHNjb3BlKVxuICB9XG59XG5cbi8vIENoZWNrIGlmIHRoZSBjdXJyZW50IGludGVyYWN0YWJsZSBzdXBwb3J0cyB0aGUgYWN0aW9uLlxuLy8gSWYgc28sIHJldHVybiB0aGUgdmFsaWRhdGVkIGFjdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbFxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpb248VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+IChcbiAgYWN0aW9uOiBJbnRlcmFjdC5BY3Rpb25Qcm9wczxUPixcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsXG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGlmIChpbnRlcmFjdGFibGUudGVzdElnbm9yZUFsbG93KGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbi5uYW1lXSwgZWxlbWVudCwgZXZlbnRUYXJnZXQpICYmXG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb24ubmFtZV0uZW5hYmxlZCAmJlxuICAgICAgd2l0aGluSW50ZXJhY3Rpb25MaW1pdChpbnRlcmFjdGFibGUsIGVsZW1lbnQsIGFjdGlvbiwgc2NvcGUpKSB7XG4gICAgcmV0dXJuIGFjdGlvblxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNYXRjaGVzIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gIG1hdGNoZXM6IEludGVyYWN0LkludGVyYWN0YWJsZVtdLFxuICBtYXRjaEVsZW1lbnRzOiBJbnRlcmFjdC5FbGVtZW50W10sXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtYXRjaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2ldXG4gICAgY29uc3QgbWF0Y2hFbGVtZW50ID0gbWF0Y2hFbGVtZW50c1tpXVxuICAgIGNvbnN0IG1hdGNoQWN0aW9uID0gbWF0Y2guZ2V0QWN0aW9uKHBvaW50ZXIsIGV2ZW50LCBpbnRlcmFjdGlvbiwgbWF0Y2hFbGVtZW50KVxuXG4gICAgaWYgKCFtYXRjaEFjdGlvbikgeyBjb250aW51ZSB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSB2YWxpZGF0ZUFjdGlvbihcbiAgICAgIG1hdGNoQWN0aW9uLFxuICAgICAgbWF0Y2gsXG4gICAgICBtYXRjaEVsZW1lbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHNjb3BlKVxuXG4gICAgaWYgKGFjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBpbnRlcmFjdGFibGU6IG1hdGNoLFxuICAgICAgICBlbGVtZW50OiBtYXRjaEVsZW1lbnQsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBudWxsLCBpbnRlcmFjdGFibGU6IG51bGwsIGVsZW1lbnQ6IG51bGwgfVxufVxuXG5mdW5jdGlvbiBnZXRBY3Rpb25JbmZvIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGxldCBtYXRjaGVzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVbXSA9IFtdXG4gIGxldCBtYXRjaEVsZW1lbnRzOiBJbnRlcmFjdC5FbGVtZW50W10gPSBbXVxuXG4gIGxldCBlbGVtZW50ID0gZXZlbnRUYXJnZXQgYXMgSW50ZXJhY3QuRWxlbWVudFxuXG4gIGZ1bmN0aW9uIHB1c2hNYXRjaGVzIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSkge1xuICAgIG1hdGNoZXMucHVzaChpbnRlcmFjdGFibGUpXG4gICAgbWF0Y2hFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gIH1cblxuICB3aGlsZSAodXRpbHMuaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIG1hdGNoZXMgPSBbXVxuICAgIG1hdGNoRWxlbWVudHMgPSBbXVxuXG4gICAgc2NvcGUuaW50ZXJhY3RhYmxlcy5mb3JFYWNoTWF0Y2goZWxlbWVudCwgcHVzaE1hdGNoZXMpXG5cbiAgICBjb25zdCBhY3Rpb25JbmZvID0gdmFsaWRhdGVNYXRjaGVzKGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgbWF0Y2hlcywgbWF0Y2hFbGVtZW50cywgZXZlbnRUYXJnZXQsIHNjb3BlKVxuXG4gICAgaWYgKGFjdGlvbkluZm8uYWN0aW9uICYmXG4gICAgICAhYWN0aW9uSW5mby5pbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb25JbmZvLmFjdGlvbi5uYW1lXS5tYW51YWxTdGFydCkge1xuICAgICAgcmV0dXJuIGFjdGlvbkluZm9cbiAgICB9XG5cbiAgICBlbGVtZW50ID0gdXRpbHMuZG9tLnBhcmVudE5vZGUoZWxlbWVudCkgYXMgSW50ZXJhY3QuRWxlbWVudFxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBudWxsLCBpbnRlcmFjdGFibGU6IG51bGwsIGVsZW1lbnQ6IG51bGwgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICB7IGFjdGlvbiwgaW50ZXJhY3RhYmxlLCBlbGVtZW50IH06IHtcbiAgICBhY3Rpb246IEludGVyYWN0LkFjdGlvblByb3BzXG4gICAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50XG4gIH0sXG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZSxcbikge1xuICBhY3Rpb24gPSBhY3Rpb24gfHwgeyBuYW1lOiBudWxsIH1cblxuICBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUgPSBpbnRlcmFjdGFibGVcbiAgaW50ZXJhY3Rpb24uZWxlbWVudCA9IGVsZW1lbnRcbiAgdXRpbHMuY29weUFjdGlvbihpbnRlcmFjdGlvbi5wcmVwYXJlZCwgYWN0aW9uKVxuXG4gIGludGVyYWN0aW9uLnJlY3QgPSBpbnRlcmFjdGFibGUgJiYgYWN0aW9uLm5hbWVcbiAgICA/IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQpXG4gICAgOiBudWxsXG5cbiAgc2V0SW50ZXJhY3Rpb25DdXJzb3IoaW50ZXJhY3Rpb24sIHNjb3BlKVxuXG4gIHNjb3BlLmZpcmUoJ2F1dG9TdGFydDpwcmVwYXJlZCcsIHsgaW50ZXJhY3Rpb24gfSlcbn1cblxuZnVuY3Rpb24gd2l0aGluSW50ZXJhY3Rpb25MaW1pdDxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKFxuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCxcbiAgYWN0aW9uOiBJbnRlcmFjdC5BY3Rpb25Qcm9wczxUPixcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1xuICBjb25zdCBtYXhBY3Rpb25zID0gb3B0aW9uc1thY3Rpb24ubmFtZV0ubWF4XG4gIGNvbnN0IG1heFBlckVsZW1lbnQgPSBvcHRpb25zW2FjdGlvbi5uYW1lXS5tYXhQZXJFbGVtZW50XG4gIGNvbnN0IGF1dG9TdGFydE1heCA9IHNjb3BlLmF1dG9TdGFydC5tYXhJbnRlcmFjdGlvbnNcbiAgbGV0IGFjdGl2ZUludGVyYWN0aW9ucyA9IDBcbiAgbGV0IGludGVyYWN0YWJsZUNvdW50ID0gMFxuICBsZXQgZWxlbWVudENvdW50ID0gMFxuXG4gIC8vIG5vIGFjdGlvbnMgaWYgYW55IG9mIHRoZXNlIHZhbHVlcyA9PSAwXG4gIGlmICghKG1heEFjdGlvbnMgJiYgbWF4UGVyRWxlbWVudCAmJiBhdXRvU3RhcnRNYXgpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgIGNvbnN0IG90aGVyQWN0aW9uID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuXG4gICAgaWYgKCFpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpKSB7IGNvbnRpbnVlIH1cblxuICAgIGFjdGl2ZUludGVyYWN0aW9ucysrXG5cbiAgICBpZiAoYWN0aXZlSW50ZXJhY3Rpb25zID49IGF1dG9TdGFydE1heCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSAhPT0gaW50ZXJhY3RhYmxlKSB7IGNvbnRpbnVlIH1cblxuICAgIGludGVyYWN0YWJsZUNvdW50ICs9IG90aGVyQWN0aW9uID09PSBhY3Rpb24ubmFtZSA/IDEgOiAwXG5cbiAgICBpZiAoaW50ZXJhY3RhYmxlQ291bnQgPj0gbWF4QWN0aW9ucykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLmVsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnRDb3VudCsrXG5cbiAgICAgIGlmIChvdGhlckFjdGlvbiA9PT0gYWN0aW9uLm5hbWUgJiYgZWxlbWVudENvdW50ID49IG1heFBlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF1dG9TdGFydE1heCA+IDBcbn1cblxuZnVuY3Rpb24gbWF4SW50ZXJhY3Rpb25zIChuZXdWYWx1ZTogYW55LCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgaWYgKHV0aWxzLmlzLm51bWJlcihuZXdWYWx1ZSkpIHtcbiAgICBzY29wZS5hdXRvU3RhcnQubWF4SW50ZXJhY3Rpb25zID0gbmV3VmFsdWVcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICByZXR1cm4gc2NvcGUuYXV0b1N0YXJ0Lm1heEludGVyYWN0aW9uc1xufVxuXG5mdW5jdGlvbiBzZXRDdXJzb3IgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIGN1cnNvcjogc3RyaW5nLCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgY29uc3QgeyBjdXJzb3JFbGVtZW50OiBwcmV2Q3Vyc29yRWxlbWVudCB9ID0gc2NvcGUuYXV0b1N0YXJ0XG5cbiAgaWYgKHByZXZDdXJzb3JFbGVtZW50ICYmIHByZXZDdXJzb3JFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgcHJldkN1cnNvckVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJydcbiAgfVxuXG4gIGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3Vyc29yID0gY3Vyc29yXG4gIGVsZW1lbnQuc3R5bGUuY3Vyc29yID0gY3Vyc29yXG4gIHNjb3BlLmF1dG9TdGFydC5jdXJzb3JFbGVtZW50ID0gY3Vyc29yID8gZWxlbWVudCA6IG51bGxcbn1cblxuZnVuY3Rpb24gc2V0SW50ZXJhY3Rpb25DdXJzb3I8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+IChpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb248VD4sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBjb25zdCB7IGludGVyYWN0YWJsZSwgZWxlbWVudCwgcHJlcGFyZWQgfSA9IGludGVyYWN0aW9uXG5cbiAgaWYgKCEoaW50ZXJhY3Rpb24ucG9pbnRlclR5cGUgPT09ICdtb3VzZScgJiYgaW50ZXJhY3RhYmxlICYmIGludGVyYWN0YWJsZS5vcHRpb25zLnN0eWxlQ3Vyc29yKSkge1xuICAgIC8vIGNsZWFyIHByZXZpb3VzIHRhcmdldCBlbGVtZW50IGN1cnNvclxuICAgIGlmIChzY29wZS5hdXRvU3RhcnQuY3Vyc29yRWxlbWVudCkge1xuICAgICAgc2V0Q3Vyc29yKHNjb3BlLmF1dG9TdGFydC5jdXJzb3JFbGVtZW50LCAnJywgc2NvcGUpXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgY3Vyc29yID0gJydcblxuICBpZiAocHJlcGFyZWQubmFtZSkge1xuICAgIGNvbnN0IGN1cnNvckNoZWNrZXI6IEludGVyYWN0LkN1cnNvckNoZWNrZXIgPSBpbnRlcmFjdGFibGUub3B0aW9uc1twcmVwYXJlZC5uYW1lXS5jdXJzb3JDaGVja2VyXG5cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhjdXJzb3JDaGVja2VyKSkge1xuICAgICAgY3Vyc29yID0gY3Vyc29yQ2hlY2tlcihwcmVwYXJlZCwgaW50ZXJhY3RhYmxlLCBlbGVtZW50LCBpbnRlcmFjdGlvbi5faW50ZXJhY3RpbmcpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY3Vyc29yID0gc2NvcGUuYWN0aW9ucy5tYXBbcHJlcGFyZWQubmFtZV0uZ2V0Q3Vyc29yKHByZXBhcmVkKVxuICAgIH1cbiAgfVxuXG4gIHNldEN1cnNvcihpbnRlcmFjdGlvbi5lbGVtZW50LCBjdXJzb3IgfHwgJycsIHNjb3BlKVxufVxuXG5jb25zdCBhdXRvU3RhcnQ6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0L2Jhc2UnLFxuICBiZWZvcmU6IFsnYWN0aW9ucycsICdhY3Rpb25zL2RyYWcnLCAnYWN0aW9ucy9yZXNpemUnLCAnYWN0aW9ucy9nZXN0dXJlJ10sXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6ZG93bic6IHByZXBhcmVPbkRvd24sXG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogKGFyZywgc2NvcGUpID0+IHtcbiAgICAgIHByZXBhcmVPbk1vdmUoYXJnLCBzY29wZSlcbiAgICAgIHN0YXJ0T25Nb3ZlKGFyZywgc2NvcGUpXG4gICAgfSxcbiAgICAnaW50ZXJhY3Rpb25zOnN0b3AnOiBjbGVhckN1cnNvck9uU3RvcCxcbiAgfSxcbiAgbWF4SW50ZXJhY3Rpb25zLFxuICB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0LFxuICB2YWxpZGF0ZUFjdGlvbixcbn0gYXMgSW50ZXJhY3QuUGx1Z2luXG5cbmV4cG9ydCBkZWZhdWx0IGF1dG9TdGFydFxuIiwiaW1wb3J0IHsgcGFyZW50Tm9kZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5pbXBvcnQgYXV0b1N0YXJ0IGZyb20gJy4vYmFzZSdcblxuZnVuY3Rpb24gYmVmb3JlU3RhcnQgKHsgaW50ZXJhY3Rpb24sIGV2ZW50VGFyZ2V0LCBkeCwgZHkgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICAvLyBjaGVjayBpZiBhIGRyYWcgaXMgaW4gdGhlIGNvcnJlY3QgYXhpc1xuICBjb25zdCBhYnNYID0gTWF0aC5hYnMoZHgpXG4gIGNvbnN0IGFic1kgPSBNYXRoLmFicyhkeSlcbiAgY29uc3QgdGFyZ2V0T3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zLmRyYWdcbiAgY29uc3Qgc3RhcnRBeGlzID0gdGFyZ2V0T3B0aW9ucy5zdGFydEF4aXNcbiAgY29uc3QgY3VycmVudEF4aXMgPSAoYWJzWCA+IGFic1kgPyAneCcgOiBhYnNYIDwgYWJzWSA/ICd5JyA6ICd4eScpXG5cbiAgaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpcyA9IHRhcmdldE9wdGlvbnMubG9ja0F4aXMgPT09ICdzdGFydCdcbiAgICA/IGN1cnJlbnRBeGlzWzBdICBhcyAneCcgfCAneScgLy8gYWx3YXlzIGxvY2sgdG8gb25lIGF4aXMgZXZlbiBpZiBjdXJyZW50QXhpcyA9PT0gJ3h5J1xuICAgIDogdGFyZ2V0T3B0aW9ucy5sb2NrQXhpc1xuXG4gIC8vIGlmIHRoZSBtb3ZlbWVudCBpc24ndCBpbiB0aGUgc3RhcnRBeGlzIG9mIHRoZSBpbnRlcmFjdGFibGVcbiAgaWYgKGN1cnJlbnRBeGlzICE9PSAneHknICYmIHN0YXJ0QXhpcyAhPT0gJ3h5JyAmJiBzdGFydEF4aXMgIT09IGN1cnJlbnRBeGlzKSB7XG4gICAgLy8gY2FuY2VsIHRoZSBwcmVwYXJlZCBhY3Rpb25cbiAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gbnVsbFxuXG4gICAgLy8gdGhlbiB0cnkgdG8gZ2V0IGEgZHJhZyBmcm9tIGFub3RoZXIgaW5lcmFjdGFibGVcbiAgICBsZXQgZWxlbWVudCA9IGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnRcblxuICAgIGNvbnN0IGdldERyYWdnYWJsZSA9IGZ1bmN0aW9uIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSk6IEludGVyYWN0LkludGVyYWN0YWJsZSB8IHZvaWQge1xuICAgICAgaWYgKGludGVyYWN0YWJsZSA9PT0gaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlKSB7IHJldHVybiB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5kcmFnXG5cbiAgICAgIGlmICghb3B0aW9ucy5tYW51YWxTdGFydCAmJlxuICAgICAgICAgIGludGVyYWN0YWJsZS50ZXN0SWdub3JlQWxsb3cob3B0aW9ucywgZWxlbWVudCwgZXZlbnRUYXJnZXQpKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGludGVyYWN0YWJsZS5nZXRBY3Rpb24oXG4gICAgICAgICAgaW50ZXJhY3Rpb24uZG93blBvaW50ZXIsIGludGVyYWN0aW9uLmRvd25FdmVudCwgaW50ZXJhY3Rpb24sIGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKGFjdGlvbiAmJlxuICAgICAgICAgICAgYWN0aW9uLm5hbWUgPT09ICdkcmFnJyAmJlxuICAgICAgICAgICAgY2hlY2tTdGFydEF4aXMoY3VycmVudEF4aXMsIGludGVyYWN0YWJsZSkgJiZcbiAgICAgICAgICAgIGF1dG9TdGFydC52YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgZXZlbnRUYXJnZXQsIHNjb3BlKSkge1xuICAgICAgICAgIHJldHVybiBpbnRlcmFjdGFibGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoZWNrIGFsbCBpbnRlcmFjdGFibGVzXG4gICAgd2hpbGUgKGlzLmVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMuZm9yRWFjaE1hdGNoKGVsZW1lbnQsIGdldERyYWdnYWJsZSlcblxuICAgICAgaWYgKGludGVyYWN0YWJsZSkge1xuICAgICAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gJ2RyYWcnXG4gICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICAgICAgICBpbnRlcmFjdGlvbi5lbGVtZW50ID0gZWxlbWVudFxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50ID0gcGFyZW50Tm9kZShlbGVtZW50KSBhcyBJbnRlcmFjdC5FbGVtZW50XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrU3RhcnRBeGlzIChzdGFydEF4aXM6IHN0cmluZywgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUpIHtcbiAgaWYgKCFpbnRlcmFjdGFibGUpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCB0aGlzQXhpcyA9IGludGVyYWN0YWJsZS5vcHRpb25zLmRyYWcuc3RhcnRBeGlzXG5cbiAgcmV0dXJuIChzdGFydEF4aXMgPT09ICd4eScgfHwgdGhpc0F4aXMgPT09ICd4eScgfHwgdGhpc0F4aXMgPT09IHN0YXJ0QXhpcylcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2F1dG8tc3RhcnQvZHJhZ0F4aXMnLFxuICBsaXN0ZW5lcnM6IHsgJ2F1dG9TdGFydDpiZWZvcmUtc3RhcnQnOiBiZWZvcmVTdGFydCB9LFxufVxuIiwiaW1wb3J0IGJhc2VQbHVnaW4gZnJvbSAnLi9iYXNlJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgUGVyQWN0aW9uRGVmYXVsdHMge1xuICAgIGhvbGQ/OiBudW1iZXJcbiAgICBkZWxheT86IG51bWJlclxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgYXV0b1N0YXJ0SG9sZFRpbWVyPzogYW55XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKGJhc2VQbHVnaW4pXG5cbiAgZGVmYXVsdHMucGVyQWN0aW9uLmhvbGQgPSAwXG4gIGRlZmF1bHRzLnBlckFjdGlvbi5kZWxheSA9IDBcbn1cblxuZnVuY3Rpb24gZ2V0SG9sZER1cmF0aW9uIChpbnRlcmFjdGlvbikge1xuICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQgJiYgaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuXG4gIGlmICghYWN0aW9uTmFtZSkgeyByZXR1cm4gbnVsbCB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zXG5cbiAgcmV0dXJuIG9wdGlvbnNbYWN0aW9uTmFtZV0uaG9sZCB8fCBvcHRpb25zW2FjdGlvbk5hbWVdLmRlbGF5XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0L2hvbGQnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TdGFydEhvbGRUaW1lciA9IG51bGxcbiAgICB9LFxuXG4gICAgJ2F1dG9TdGFydDpwcmVwYXJlZCc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGhvbGQgPSBnZXRIb2xkRHVyYXRpb24oaW50ZXJhY3Rpb24pXG5cbiAgICAgIGlmIChob2xkID4gMCkge1xuICAgICAgICBpbnRlcmFjdGlvbi5hdXRvU3RhcnRIb2xkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5zdGFydChpbnRlcmFjdGlvbi5wcmVwYXJlZCwgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLCBpbnRlcmFjdGlvbi5lbGVtZW50KVxuICAgICAgICB9LCBob2xkKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOm1vdmUnOiAoeyBpbnRlcmFjdGlvbiwgZHVwbGljYXRlIH0pID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyV2FzTW92ZWQgJiYgIWR1cGxpY2F0ZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaW50ZXJhY3Rpb24uYXV0b1N0YXJ0SG9sZFRpbWVyKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBwcmV2ZW50IHJlZ3VsYXIgZG93bi0+bW92ZSBhdXRvU3RhcnRcbiAgICAnYXV0b1N0YXJ0OmJlZm9yZS1zdGFydCc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGhvbGQgPSBnZXRIb2xkRHVyYXRpb24oaW50ZXJhY3Rpb24pXG5cbiAgICAgIGlmIChob2xkID4gMCkge1xuICAgICAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gbnVsbFxuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGdldEhvbGREdXJhdGlvbixcbn1cbiIsImltcG9ydCBhdXRvU3RhcnQgZnJvbSAnLi9iYXNlJ1xuaW1wb3J0IGRyYWdBeGlzIGZyb20gJy4vZHJhZ0F4aXMnXG5pbXBvcnQgaG9sZCBmcm9tICcuL2hvbGQnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0JyxcbiAgaW5zdGFsbCAoc2NvcGUpIHtcbiAgICBzY29wZS51c2VQbHVnaW4oYXV0b1N0YXJ0KVxuICAgIHNjb3BlLnVzZVBsdWdpbihob2xkKVxuICAgIHNjb3BlLnVzZVBsdWdpbihkcmFnQXhpcylcbiAgfSxcbn1cblxuZXhwb3J0IHtcbiAgYXV0b1N0YXJ0LFxuICBob2xkLFxuICBkcmFnQXhpcyxcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbi8qIGdsb2JhbCBwcm9jZXNzICovXG5pbXBvcnQgZG9tT2JqZWN0cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21PYmplY3RzJ1xuaW1wb3J0IHsgcGFyZW50Tm9kZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcbmltcG9ydCB3aW4gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvd2luZG93J1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2NvcGUge1xuICAgIGxvZ2dlcjogTG9nZ2VyXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEJhc2VEZWZhdWx0cyB7XG4gICAgZGV2VG9vbHM/OiBEZXZUb29sc09wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0YWJsZSB7XG4gICAgZGV2VG9vbHM/OiBJbnRlcmFjdC5PcHRpb25NZXRob2Q8RGV2VG9vbHNPcHRpb25zPlxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2VG9vbHNPcHRpb25zIHtcbiAgaWdub3JlOiB7IFtQIGluIGtleW9mIHR5cGVvZiBDaGVja05hbWVdPzogYm9vbGVhbiB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgd2FybjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG4gIGVycm9yOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbiAgbG9nOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGVjayB7XG4gIG5hbWU6IENoZWNrTmFtZVxuICB0ZXh0OiBzdHJpbmdcbiAgcGVyZm9ybTogKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikgPT4gYm9vbGVhblxuICBnZXRJbmZvOiAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uKSA9PiBhbnlbXVxufVxuXG5lbnVtIENoZWNrTmFtZSB7XG4gIHRvdWNoQWN0aW9uID0gJ3RvdWNoQWN0aW9uJyxcbiAgYm94U2l6aW5nID0gJ2JveFNpemluZycsXG4gIG5vTGlzdGVuZXJzID0gJ25vTGlzdGVuZXJzJyxcbn1cblxuY29uc3QgcHJlZml4ICA9ICdbaW50ZXJhY3QuanNdICdcbmNvbnN0IGxpbmtzID0ge1xuICB0b3VjaEFjdGlvbjogJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy90b3VjaC1hY3Rpb24nLFxuICBib3hTaXppbmc6ICdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYm94LXNpemluZycsXG59XG5cbmNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbidcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5mdW5jdGlvbiBpbnN0YWxsIChzY29wZTogSW50ZXJhY3QuU2NvcGUsIHsgbG9nZ2VyIH06IHsgbG9nZ2VyPzogTG9nZ2VyIH0gPSB7fSkge1xuICBjb25zdCB7XG4gICAgSW50ZXJhY3RhYmxlLFxuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS5sb2dnZXIgPSBsb2dnZXIgfHwgY29uc29sZVxuXG4gIGRlZmF1bHRzLmJhc2UuZGV2VG9vbHMgPSB7XG4gICAgaWdub3JlOiB7fSxcbiAgfVxuXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuZGV2VG9vbHMgPSBmdW5jdGlvbiAob3B0aW9ucz86IG9iamVjdCkge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBleHRlbmQodGhpcy5vcHRpb25zLmRldlRvb2xzLCBvcHRpb25zKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRldlRvb2xzXG4gIH1cbn1cblxuY29uc3QgY2hlY2tzOiBDaGVja1tdID0gW1xuICB7XG4gICAgbmFtZTogQ2hlY2tOYW1lLnRvdWNoQWN0aW9uLFxuICAgIHBlcmZvcm0gKHsgZWxlbWVudCB9KSB7XG4gICAgICByZXR1cm4gIXBhcmVudEhhc1N0eWxlKGVsZW1lbnQsICd0b3VjaEFjdGlvbicsIC9wYW4tfHBpbmNofG5vbmUvKVxuICAgIH0sXG4gICAgZ2V0SW5mbyAoeyBlbGVtZW50IH0pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGxpbmtzLnRvdWNoQWN0aW9uLFxuICAgICAgXVxuICAgIH0sXG4gICAgdGV4dDogJ0NvbnNpZGVyIGFkZGluZyBDU1MgXCJ0b3VjaC1hY3Rpb246IG5vbmVcIiB0byB0aGlzIGVsZW1lbnRcXG4nLFxuICB9LFxuXG4gIHtcbiAgICBuYW1lOiBDaGVja05hbWUuYm94U2l6aW5nLFxuICAgIHBlcmZvcm0gKGludGVyYWN0aW9uKSB7XG4gICAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGludGVyYWN0aW9uXG5cbiAgICAgIHJldHVybiBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID09PSAncmVzaXplJyAmJlxuICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAmJlxuICAgICAgICAhaGFzU3R5bGUoZWxlbWVudCwgJ2JveFNpemluZycsIC9ib3JkZXItYm94LylcbiAgICB9LFxuICAgIHRleHQ6ICdDb25zaWRlciBhZGRpbmcgQ1NTIFwiYm94LXNpemluZzogYm9yZGVyLWJveFwiIHRvIHRoaXMgcmVzaXphYmxlIGVsZW1lbnQnLFxuICAgIGdldEluZm8gKHsgZWxlbWVudCB9KSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBlbGVtZW50LFxuICAgICAgICBsaW5rcy5ib3hTaXppbmcsXG4gICAgICBdXG4gICAgfSxcbiAgfSxcblxuICB7XG4gICAgbmFtZTogQ2hlY2tOYW1lLm5vTGlzdGVuZXJzLFxuICAgIHBlcmZvcm0gKGludGVyYWN0aW9uKSB7XG4gICAgICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuICAgICAgY29uc3QgbW92ZUxpc3RlbmVycyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5ldmVudHMudHlwZXNbYCR7YWN0aW9uTmFtZX1tb3ZlYF0gfHwgW11cblxuICAgICAgcmV0dXJuICFtb3ZlTGlzdGVuZXJzLmxlbmd0aFxuICAgIH0sXG4gICAgZ2V0SW5mbyAoaW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUsXG4gICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSxcbiAgICAgIF1cbiAgICB9LFxuICAgIHRleHQ6ICdUaGVyZSBhcmUgbm8gbGlzdGVuZXJzIHNldCBmb3IgdGhpcyBhY3Rpb24nLFxuICB9LFxuXVxuXG5mdW5jdGlvbiBoYXNTdHlsZSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIHByb3A6IGtleW9mIENTU1N0eWxlRGVjbGFyYXRpb24sIHN0eWxlUmU6IFJlZ0V4cCkge1xuICByZXR1cm4gc3R5bGVSZS50ZXN0KGVsZW1lbnQuc3R5bGVbcHJvcF0gfHwgd2luLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW3Byb3BdKVxufVxuXG5mdW5jdGlvbiBwYXJlbnRIYXNTdHlsZSAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCwgcHJvcDoga2V5b2YgQ1NTU3R5bGVEZWNsYXJhdGlvbiwgc3R5bGVSZTogUmVnRXhwKSB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50IGFzIEhUTUxFbGVtZW50XG5cbiAgd2hpbGUgKGlzLmVsZW1lbnQocGFyZW50KSkge1xuICAgIGlmIChoYXNTdHlsZShwYXJlbnQsIHByb3AsIHN0eWxlUmUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudE5vZGUocGFyZW50KSBhcyBIVE1MRWxlbWVudFxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IGlkID0gJ2Rldi10b29scydcbmNvbnN0IGRlZmF1bHRFeHBvcnQ6IEludGVyYWN0LlBsdWdpbiA9IGlzUHJvZHVjdGlvblxuICA/IHsgaWQsIGluc3RhbGw6ICgpID0+IHt9IH1cbiAgOiB7XG4gICAgaWQsXG4gICAgaW5zdGFsbCxcbiAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLXN0YXJ0JzogKHsgaW50ZXJhY3Rpb24gfSwgc2NvcGUpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiBjaGVja3MpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlICYmIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zXG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKG9wdGlvbnMgJiYgb3B0aW9ucy5kZXZUb29scyAmJiBvcHRpb25zLmRldlRvb2xzLmlnbm9yZVtjaGVjay5uYW1lXSkgJiZcbiAgICAgICAgICAgIGNoZWNrLnBlcmZvcm0oaW50ZXJhY3Rpb24pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzY29wZS5sb2dnZXIud2FybihwcmVmaXggKyBjaGVjay50ZXh0LCAuLi5jaGVjay5nZXRJbmZvKGludGVyYWN0aW9uKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBjaGVja3MsXG4gICAgQ2hlY2tOYW1lLFxuICAgIGxpbmtzLFxuICAgIHByZWZpeCxcbiAgfVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0XG4iLCJpbXBvcnQgY2xvbmUgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvY2xvbmUnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXIsIE1vZGlmaWVyQXJnLCBNb2RpZmllclN0YXRlIH0gZnJvbSAnLi9iYXNlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWNhdGlvblJlc3VsdCB7XG4gIGRlbHRhOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0RGVsdGE6IEludGVyYWN0LlJlY3RcbiAgY29vcmRzOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICBldmVudFByb3BzOiBhbnlbXVxuICBjaGFuZ2VkOiBib29sZWFuXG59XG5cbmludGVyZmFjZSBNZXRob2RBcmcge1xuICBwaGFzZTogSW50ZXJhY3QuRXZlbnRQaGFzZVxuICBwYWdlQ29vcmRzPzogSW50ZXJhY3QuUG9pbnRcbiAgcmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHByZUVuZD86IGJvb2xlYW5cbiAgc2tpcE1vZGlmaWVycz86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2RpZmljYXRpb24ge1xuICBzdGF0ZXM6IE1vZGlmaWVyU3RhdGVbXSA9IFtdXG4gIHN0YXJ0T2Zmc2V0OiBJbnRlcmFjdC5SZWN0ID0geyBsZWZ0OiAwLCByaWdodDogMCwgdG9wOiAwLCBib3R0b206IDAgfVxuICBzdGFydERlbHRhOiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgcmVzdWx0PzogTW9kaWZpY2F0aW9uUmVzdWx0ID0gbnVsbFxuICBlbmRSZXN1bHQ/OiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgZWRnZXM6IEludGVyYWN0LkVkZ2VPcHRpb25zXG5cbiAgY29uc3RydWN0b3IgKHJlYWRvbmx5IGludGVyYWN0aW9uOiBSZWFkb25seTxJbnRlcmFjdC5JbnRlcmFjdGlvbj4pIHtcbiAgICB0aGlzLnJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpXG4gIH1cblxuICBzdGFydCAoXG4gICAgeyBwaGFzZSB9OiBNZXRob2RBcmcsXG4gICAgcGFnZUNvb3JkczogSW50ZXJhY3QuUG9pbnQsXG4gICkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCBtb2RpZmllckxpc3QgPSBnZXRNb2RpZmllckxpc3QoaW50ZXJhY3Rpb24pXG4gICAgdGhpcy5wcmVwYXJlU3RhdGVzKG1vZGlmaWVyTGlzdClcblxuICAgIHRoaXMuZWRnZXMgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLmVkZ2VzKVxuICAgIHRoaXMuc3RhcnRPZmZzZXQgPSBnZXRSZWN0T2Zmc2V0KGludGVyYWN0aW9uLnJlY3QsIHBhZ2VDb29yZHMpXG4gICAgdGhpcy5zdGFydERlbHRhID0geyB4OiAwLCB5OiAwIH1cblxuICAgIGNvbnN0IGFyZzogTWV0aG9kQXJnID0ge1xuICAgICAgcGhhc2UsXG4gICAgICBwYWdlQ29vcmRzLFxuICAgICAgcHJlRW5kOiBmYWxzZSxcbiAgICB9XG5cbiAgICB0aGlzLnJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpXG4gICAgdGhpcy5zdGFydEFsbChhcmcpXG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdCA9IHRoaXMuc2V0QWxsKGFyZylcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZpbGxBcmcgKGFyZzogUGFydGlhbDxNb2RpZmllckFyZz4pIHtcbiAgICBjb25zdCB7IGludGVyYWN0aW9uIH0gPSB0aGlzXG5cbiAgICBhcmcuaW50ZXJhY3Rpb24gPSBpbnRlcmFjdGlvblxuICAgIGFyZy5pbnRlcmFjdGFibGUgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGVcbiAgICBhcmcuZWxlbWVudCA9IGludGVyYWN0aW9uLmVsZW1lbnRcbiAgICBhcmcucmVjdCA9IGFyZy5yZWN0IHx8IGludGVyYWN0aW9uLnJlY3RcbiAgICBhcmcuZWRnZXMgPSB0aGlzLmVkZ2VzXG4gICAgYXJnLnN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldFxuICB9XG5cbiAgc3RhcnRBbGwgKGFyZzogTWV0aG9kQXJnICYgUGFydGlhbDxNb2RpZmllckFyZz4pIHtcbiAgICB0aGlzLmZpbGxBcmcoYXJnKVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgaWYgKHN0YXRlLm1ldGhvZHMuc3RhcnQpIHtcbiAgICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgICAgc3RhdGUubWV0aG9kcy5zdGFydChhcmcgYXMgTW9kaWZpZXJBcmcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QWxsIChhcmc6IE1ldGhvZEFyZyAmIFBhcnRpYWw8TW9kaWZpZXJBcmc+KTogTW9kaWZpY2F0aW9uUmVzdWx0IHtcbiAgICB0aGlzLmZpbGxBcmcoYXJnKVxuXG4gICAgY29uc3Qge1xuICAgICAgcGhhc2UsXG4gICAgICBwcmVFbmQsXG4gICAgICBza2lwTW9kaWZpZXJzLFxuICAgICAgcmVjdDogdW5tb2RpZmllZFJlY3QsXG4gICAgfSA9IGFyZ1xuXG4gICAgYXJnLmNvb3JkcyA9IGV4dGVuZCh7fSwgYXJnLnBhZ2VDb29yZHMpXG4gICAgYXJnLnJlY3QgPSBleHRlbmQoe30sIHVubW9kaWZpZWRSZWN0KVxuXG4gICAgY29uc3Qgc3RhdGVzID0gc2tpcE1vZGlmaWVyc1xuICAgICAgPyB0aGlzLnN0YXRlcy5zbGljZShza2lwTW9kaWZpZXJzKVxuICAgICAgOiB0aGlzLnN0YXRlc1xuXG4gICAgY29uc3QgbmV3UmVzdWx0ID0gY3JlYXRlUmVzdWx0KGFyZy5jb29yZHMsIGFyZy5yZWN0KVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiBzdGF0ZXMpIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcbiAgICAgIGNvbnN0IGxhc3RNb2RpZmllckNvb3JkcyA9IGV4dGVuZCh7fSwgYXJnLmNvb3JkcylcbiAgICAgIGxldCByZXR1cm5WYWx1ZSA9IG51bGxcblxuICAgICAgaWYgKHN0YXRlLm1ldGhvZHMuc2V0ICYmIHRoaXMuc2hvdWxkRG8ob3B0aW9ucywgcHJlRW5kLCBwaGFzZSkpIHtcbiAgICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBzdGF0ZS5tZXRob2RzLnNldChhcmcgYXMgTW9kaWZpZXJBcmcpXG5cbiAgICAgICAgcmVjdFV0aWxzLmFkZEVkZ2VzKHRoaXMuaW50ZXJhY3Rpb24uZWRnZXMsIGFyZy5yZWN0LCB7IHg6IGFyZy5jb29yZHMueCAtIGxhc3RNb2RpZmllckNvb3Jkcy54LCB5OiBhcmcuY29vcmRzLnkgLSBsYXN0TW9kaWZpZXJDb29yZHMueSB9KVxuICAgICAgfVxuXG4gICAgICBuZXdSZXN1bHQuZXZlbnRQcm9wcy5wdXNoKHJldHVyblZhbHVlKVxuICAgIH1cblxuICAgIG5ld1Jlc3VsdC5kZWx0YS54ID0gYXJnLmNvb3Jkcy54IC0gYXJnLnBhZ2VDb29yZHMueFxuICAgIG5ld1Jlc3VsdC5kZWx0YS55ID0gYXJnLmNvb3Jkcy55IC0gYXJnLnBhZ2VDb29yZHMueVxuXG4gICAgbmV3UmVzdWx0LnJlY3REZWx0YS5sZWZ0ICAgPSBhcmcucmVjdC5sZWZ0IC0gdW5tb2RpZmllZFJlY3QubGVmdFxuICAgIG5ld1Jlc3VsdC5yZWN0RGVsdGEucmlnaHQgID0gYXJnLnJlY3QucmlnaHQgLSB1bm1vZGlmaWVkUmVjdC5yaWdodFxuICAgIG5ld1Jlc3VsdC5yZWN0RGVsdGEudG9wICAgID0gYXJnLnJlY3QudG9wIC0gdW5tb2RpZmllZFJlY3QudG9wXG4gICAgbmV3UmVzdWx0LnJlY3REZWx0YS5ib3R0b20gPSBhcmcucmVjdC5ib3R0b20gLSB1bm1vZGlmaWVkUmVjdC5ib3R0b21cblxuICAgIGNvbnN0IHByZXZDb29yZHMgPSB0aGlzLnJlc3VsdC5jb29yZHNcbiAgICBjb25zdCBwcmV2UmVjdCA9IHRoaXMucmVzdWx0LnJlY3RcblxuICAgIGlmIChwcmV2Q29vcmRzICYmIHByZXZSZWN0KSB7XG4gICAgICBjb25zdCByZWN0Q2hhbmdlZCA9IG5ld1Jlc3VsdC5yZWN0LmxlZnQgIT09IHByZXZSZWN0LmxlZnQgfHxcbiAgICAgICAgbmV3UmVzdWx0LnJlY3QucmlnaHQgIT09IHByZXZSZWN0LnJpZ2h0IHx8XG4gICAgICAgIG5ld1Jlc3VsdC5yZWN0LnRvcCAhPT0gcHJldlJlY3QudG9wIHx8XG4gICAgICAgIG5ld1Jlc3VsdC5yZWN0LmJvdHRvbSAhPT0gcHJldlJlY3QuYm90dG9tXG5cbiAgICAgIG5ld1Jlc3VsdC5jaGFuZ2VkID0gcmVjdENoYW5nZWQgfHxcbiAgICAgICAgcHJldkNvb3Jkcy54ICE9PSBuZXdSZXN1bHQuY29vcmRzLnggfHxcbiAgICAgICAgcHJldkNvb3Jkcy55ICE9PSBuZXdSZXN1bHQuY29vcmRzLnlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3UmVzdWx0XG4gIH1cblxuICBhcHBseVRvSW50ZXJhY3Rpb24gKGFyZzogeyBwaGFzZTogSW50ZXJhY3QuRXZlbnRQaGFzZSwgcmVjdD86IEludGVyYWN0LlJlY3QgfSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCB7IHBoYXNlIH0gPSBhcmdcbiAgICBjb25zdCBjdXJDb29yZHMgPSBpbnRlcmFjdGlvbi5jb29yZHMuY3VyXG4gICAgY29uc3Qgc3RhcnRDb29yZHMgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnRcbiAgICBjb25zdCB7IHJlc3VsdCwgc3RhcnREZWx0YSB9ID0gdGhpc1xuICAgIGNvbnN0IGN1ckRlbHRhID0gcmVzdWx0LmRlbHRhXG5cbiAgICBpZiAocGhhc2UgPT09ICdzdGFydCcpIHtcbiAgICAgIGV4dGVuZCh0aGlzLnN0YXJ0RGVsdGEsIHJlc3VsdC5kZWx0YSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb29yZHNTZXQsIGRlbHRhXSBvZiBbW3N0YXJ0Q29vcmRzLCBzdGFydERlbHRhXSwgW2N1ckNvb3JkcywgY3VyRGVsdGFdXSBhcyBjb25zdCkge1xuICAgICAgY29vcmRzU2V0LnBhZ2UueCAgICs9IGRlbHRhLnhcbiAgICAgIGNvb3Jkc1NldC5wYWdlLnkgICArPSBkZWx0YS55XG4gICAgICBjb29yZHNTZXQuY2xpZW50LnggKz0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LmNsaWVudC55ICs9IGRlbHRhLnlcbiAgICB9XG5cbiAgICBjb25zdCB7IHJlY3REZWx0YSB9ID0gdGhpcy5yZXN1bHRcbiAgICBjb25zdCByZWN0ID0gYXJnLnJlY3QgfHwgaW50ZXJhY3Rpb24ucmVjdFxuXG4gICAgcmVjdC5sZWZ0ICAgKz0gcmVjdERlbHRhLmxlZnRcbiAgICByZWN0LnJpZ2h0ICArPSByZWN0RGVsdGEucmlnaHRcbiAgICByZWN0LnRvcCAgICArPSByZWN0RGVsdGEudG9wXG4gICAgcmVjdC5ib3R0b20gKz0gcmVjdERlbHRhLmJvdHRvbVxuXG4gICAgcmVjdC53aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnRcbiAgICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgfVxuXG4gIHNldEFuZEFwcGx5IChhcmc6IFBhcnRpYWw8SW50ZXJhY3QuRG9BbnlQaGFzZUFyZz4gJiB7XG4gICAgcGhhc2U6IEludGVyYWN0LkV2ZW50UGhhc2VcbiAgICBwcmVFbmQ/OiBib29sZWFuXG4gICAgc2tpcE1vZGlmaWVycz86IG51bWJlclxuICAgIG1vZGlmaWVkQ29vcmRzPzogSW50ZXJhY3QuUG9pbnRcbiAgfSk6IHZvaWQgfCBmYWxzZSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdGlvbiB9ID0gdGhpc1xuICAgIGNvbnN0IHsgcGhhc2UsIHByZUVuZCwgc2tpcE1vZGlmaWVycyB9ID0gYXJnXG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNldEFsbCh7XG4gICAgICBwcmVFbmQsXG4gICAgICBwaGFzZSxcbiAgICAgIHBhZ2VDb29yZHM6IGFyZy5tb2RpZmllZENvb3JkcyB8fCBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnBhZ2UsXG4gICAgfSlcblxuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0XG5cbiAgICAvLyBkb24ndCBmaXJlIGFuIGFjdGlvbiBtb3ZlIGlmIGEgbW9kaWZpZXIgd291bGQga2VlcCB0aGUgZXZlbnQgaW4gdGhlIHNhbWVcbiAgICAvLyBjb3JkaW5hdGVzIGFzIGJlZm9yZVxuICAgIGlmICghcmVzdWx0LmNoYW5nZWQgJiYgKCFza2lwTW9kaWZpZXJzIHx8IHNraXBNb2RpZmllcnMgPCB0aGlzLnN0YXRlcy5sZW5ndGgpICYmIGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChhcmcubW9kaWZpZWRDb29yZHMpIHtcbiAgICAgIGNvbnN0IHsgcGFnZSB9ID0gaW50ZXJhY3Rpb24uY29vcmRzLmN1clxuICAgICAgY29uc3QgYWRqdXN0bWVudCA9IHtcbiAgICAgICAgeDogYXJnLm1vZGlmaWVkQ29vcmRzLnggLSBwYWdlLngsXG4gICAgICAgIHk6IGFyZy5tb2RpZmllZENvb3Jkcy55IC0gcGFnZS55LFxuICAgICAgfVxuXG4gICAgICByZXN1bHQuY29vcmRzLnggKz0gYWRqdXN0bWVudC54XG4gICAgICByZXN1bHQuY29vcmRzLnkgKz0gYWRqdXN0bWVudC55XG4gICAgICByZXN1bHQuZGVsdGEueCArPSBhZGp1c3RtZW50LnhcbiAgICAgIHJlc3VsdC5kZWx0YS55ICs9IGFkanVzdG1lbnQueVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlUb0ludGVyYWN0aW9uKGFyZylcbiAgfVxuXG4gIGJlZm9yZUVuZCAoYXJnOiBPbWl0PEludGVyYWN0LkRvQW55UGhhc2VBcmcsICdpRXZlbnQnPiAmIHsgc3RhdGU/OiBNb2RpZmllclN0YXRlIH0pOiB2b2lkIHwgZmFsc2Uge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGV2ZW50IH0gPSBhcmdcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0YXRlc1xuXG4gICAgaWYgKCFzdGF0ZXMgfHwgIXN0YXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBkb1ByZWVuZCA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHN0YXRlcykge1xuICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgIGNvbnN0IHsgb3B0aW9ucywgbWV0aG9kcyB9ID0gc3RhdGVcblxuICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBtZXRob2RzLmJlZm9yZUVuZCAmJiBtZXRob2RzLmJlZm9yZUVuZChhcmcgYXMgdW5rbm93biBhcyBNb2RpZmllckFyZylcblxuICAgICAgaWYgKGVuZFBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZW5kUmVzdWx0ID0gZW5kUG9zaXRpb25cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGRvUHJlZW5kID0gZG9QcmVlbmQgfHwgKCFkb1ByZWVuZCAmJiB0aGlzLnNob3VsZERvKG9wdGlvbnMsIHRydWUsIGFyZy5waGFzZSwgdHJ1ZSkpXG4gICAgfVxuXG4gICAgaWYgKGRvUHJlZW5kKSB7XG4gICAgICAvLyB0cmlnZ2VyIGEgZmluYWwgbW9kaWZpZWQgbW92ZSBiZWZvcmUgZW5kaW5nXG4gICAgICBpbnRlcmFjdGlvbi5tb3ZlKHsgZXZlbnQsIHByZUVuZDogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIHN0b3AgKGFyZzogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGFyZ1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlcyB8fCAhdGhpcy5zdGF0ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBtb2RpZmllckFyZzogUGFydGlhbDxNb2RpZmllckFyZz4gPSBleHRlbmQoe1xuICAgICAgc3RhdGVzOiB0aGlzLnN0YXRlcyxcbiAgICAgIGludGVyYWN0YWJsZTogaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLFxuICAgICAgZWxlbWVudDogaW50ZXJhY3Rpb24uZWxlbWVudCxcbiAgICAgIHJlY3Q6IG51bGwsXG4gICAgfSwgYXJnKVxuXG4gICAgdGhpcy5maWxsQXJnKG1vZGlmaWVyQXJnKVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgbW9kaWZpZXJBcmcuc3RhdGUgPSBzdGF0ZVxuXG4gICAgICBpZiAoc3RhdGUubWV0aG9kcy5zdG9wKSB7IHN0YXRlLm1ldGhvZHMuc3RvcChtb2RpZmllckFyZyBhcyBNb2RpZmllckFyZykgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGVzID0gbnVsbFxuICAgIHRoaXMuZW5kUmVzdWx0ID0gbnVsbFxuICB9XG5cbiAgcHJlcGFyZVN0YXRlcyAobW9kaWZpZXJMaXN0OiBNb2RpZmllcltdKSB7XG4gICAgdGhpcy5zdGF0ZXMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1vZGlmaWVyTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucywgbWV0aG9kcywgbmFtZSB9ID0gbW9kaWZpZXJMaXN0W2luZGV4XVxuXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVuYWJsZWQgPT09IGZhbHNlKSB7IGNvbnRpbnVlIH1cblxuICAgICAgdGhpcy5zdGF0ZXMucHVzaCh7XG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIG1ldGhvZHMsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBuYW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZXNcbiAgfVxuXG4gIHJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyAoeyBpbnRlcmFjdGlvbjogeyBjb29yZHMsIHJlY3QsIG1vZGlmaWNhdGlvbiB9IH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgICBpZiAoIW1vZGlmaWNhdGlvbi5yZXN1bHQpIHsgcmV0dXJuIH1cblxuICAgIGNvbnN0IHsgc3RhcnREZWx0YSB9ID0gbW9kaWZpY2F0aW9uXG4gICAgY29uc3QgeyBkZWx0YTogY3VyRGVsdGEsIHJlY3REZWx0YSB9ID0gbW9kaWZpY2F0aW9uLnJlc3VsdFxuXG4gICAgY29uc3QgY29vcmRzQW5kRGVsdGFzID0gW1xuICAgICAgW2Nvb3Jkcy5zdGFydCwgc3RhcnREZWx0YV0sXG4gICAgICBbY29vcmRzLmN1ciwgY3VyRGVsdGFdLFxuICAgIF1cblxuICAgIGZvciAoY29uc3QgW2Nvb3Jkc1NldCwgZGVsdGFdIG9mIGNvb3Jkc0FuZERlbHRhcyBhcyBhbnkpIHtcbiAgICAgIGNvb3Jkc1NldC5wYWdlLnggLT0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LnBhZ2UueSAtPSBkZWx0YS55XG4gICAgICBjb29yZHNTZXQuY2xpZW50LnggLT0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LmNsaWVudC55IC09IGRlbHRhLnlcbiAgICB9XG5cbiAgICByZWN0LmxlZnQgLT0gcmVjdERlbHRhLmxlZnRcbiAgICByZWN0LnJpZ2h0IC09IHJlY3REZWx0YS5yaWdodFxuICAgIHJlY3QudG9wIC09IHJlY3REZWx0YS50b3BcbiAgICByZWN0LmJvdHRvbSAtPSByZWN0RGVsdGEuYm90dG9tXG4gIH1cblxuICBzaG91bGREbyAob3B0aW9ucywgcHJlRW5kPzogYm9vbGVhbiwgcGhhc2U/OiBzdHJpbmcsIHJlcXVpcmVFbmRPbmx5PzogYm9vbGVhbikge1xuICAgIGlmIChcbiAgICAgIC8vIGlnbm9yZSBkaXNhYmxlZCBtb2RpZmllcnNcbiAgICAgICghb3B0aW9ucyB8fCBvcHRpb25zLmVuYWJsZWQgPT09IGZhbHNlKSB8fFxuICAgICAgLy8gY2hlY2sgaWYgd2UgcmVxdWlyZSBlbmRPbmx5IG9wdGlvbiB0byBmaXJlIG1vdmUgYmVmb3JlIGVuZFxuICAgICAgKHJlcXVpcmVFbmRPbmx5ICYmICFvcHRpb25zLmVuZE9ubHkpIHx8XG4gICAgICAvLyBkb24ndCBhcHBseSBlbmRPbmx5IG1vZGlmaWVycyB3aGVuIG5vdCBlbmRpbmdcbiAgICAgIChvcHRpb25zLmVuZE9ubHkgJiYgIXByZUVuZCkgfHxcbiAgICAgIC8vIGNoZWNrIGlmIG1vZGlmaWVyIHNob3VsZCBydW4gYmUgYXBwbGllZCBvbiBzdGFydFxuICAgICAgKHBoYXNlID09PSAnc3RhcnQnICYmICFvcHRpb25zLnNldFN0YXJ0KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvcHlGcm9tIChvdGhlcjogTW9kaWZpY2F0aW9uKSB7XG4gICAgdGhpcy5zdGFydE9mZnNldCA9IG90aGVyLnN0YXJ0T2Zmc2V0XG4gICAgdGhpcy5zdGFydERlbHRhID0gb3RoZXIuc3RhcnREZWx0YVxuICAgIHRoaXMuZWRnZXMgPSBvdGhlci5lZGdlc1xuICAgIHRoaXMuc3RhdGVzID0gb3RoZXIuc3RhdGVzLm1hcChzID0+IGNsb25lKHMpIGFzIE1vZGlmaWVyU3RhdGUpXG4gICAgdGhpcy5yZXN1bHQgPSBjcmVhdGVSZXN1bHQoZXh0ZW5kKHt9LCBvdGhlci5yZXN1bHQuY29vcmRzKSwgZXh0ZW5kKHt9LCBvdGhlci5yZXN1bHQucmVjdCkpXG4gIH1cblxuICBkZXN0cm95ICgpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcykge1xuICAgICAgdGhpc1twcm9wXSA9IG51bGxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVzdWx0IChjb29yZHM/OiBJbnRlcmFjdC5Qb2ludCwgcmVjdD86IEludGVyYWN0LkZ1bGxSZWN0KTogTW9kaWZpY2F0aW9uUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICByZWN0LFxuICAgIGNvb3JkcyxcbiAgICBkZWx0YTogeyB4OiAwLCB5OiAwIH0sXG4gICAgcmVjdERlbHRhOiB7XG4gICAgICBsZWZ0ICA6IDAsXG4gICAgICByaWdodCA6IDAsXG4gICAgICB0b3AgICA6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgfSxcbiAgICBldmVudFByb3BzOiBbXSxcbiAgICBjaGFuZ2VkOiB0cnVlLFxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyTGlzdCAoaW50ZXJhY3Rpb24pIHtcbiAgY29uc3QgYWN0aW9uT3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zW2ludGVyYWN0aW9uLnByZXBhcmVkLm5hbWVdXG4gIGNvbnN0IGFjdGlvbk1vZGlmaWVycyA9IGFjdGlvbk9wdGlvbnMubW9kaWZpZXJzXG5cbiAgaWYgKGFjdGlvbk1vZGlmaWVycyAmJiBhY3Rpb25Nb2RpZmllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFjdGlvbk1vZGlmaWVycy5maWx0ZXIoXG4gICAgICBtb2RpZmllciA9PiAhbW9kaWZpZXIub3B0aW9ucyB8fCBtb2RpZmllci5vcHRpb25zLmVuYWJsZWQgIT09IGZhbHNlLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBbJ3NuYXAnLCAnc25hcFNpemUnLCAnc25hcEVkZ2VzJywgJ3Jlc3RyaWN0JywgJ3Jlc3RyaWN0RWRnZXMnLCAncmVzdHJpY3RTaXplJ11cbiAgICAubWFwKHR5cGUgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGFjdGlvbk9wdGlvbnNbdHlwZV1cblxuICAgICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5lbmFibGVkICYmIHtcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgbWV0aG9kczogb3B0aW9ucy5fbWV0aG9kcyxcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIobSA9PiAhIW0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN0T2Zmc2V0IChyZWN0LCBjb29yZHMpIHtcbiAgcmV0dXJuIHJlY3RcbiAgICA/IHtcbiAgICAgIGxlZnQgIDogY29vcmRzLnggLSByZWN0LmxlZnQsXG4gICAgICB0b3AgICA6IGNvb3Jkcy55IC0gcmVjdC50b3AsXG4gICAgICByaWdodCA6IHJlY3QucmlnaHQgIC0gY29vcmRzLngsXG4gICAgICBib3R0b206IHJlY3QuYm90dG9tIC0gY29vcmRzLnksXG4gICAgfVxuICAgIDoge1xuICAgICAgbGVmdCAgOiAwLFxuICAgICAgdG9wICAgOiAwLFxuICAgICAgcmlnaHQgOiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgIH1cbn1cbiIsImltcG9ydCBNb2RpZmljYXRpb24gZnJvbSAnLi9Nb2RpZmljYXRpb24nXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgbW9kaWZpY2F0aW9uPzogTW9kaWZpY2F0aW9uXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RFdmVudCcge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RFdmVudCB7XG4gICAgbW9kaWZpZXJzPzogQXJyYXk8e1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9PlxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgbW9kaWZpZXJzPzogTW9kaWZpZXJbXVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZXI8XG4gIERlZmF1bHRzID0gYW55LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUgPSBhbnksXG4gIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBhbnlcbj4ge1xuICBvcHRpb25zPzogRGVmYXVsdHNcbiAgbWV0aG9kczoge1xuICAgIHN0YXJ0PzogKGFyZzogTW9kaWZpZXJBcmc8U3RhdGU+KSA9PiB2b2lkXG4gICAgc2V0OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IHZvaWRcbiAgICBiZWZvcmVFbmQ/OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IEludGVyYWN0LlBvaW50IHwgdm9pZFxuICAgIHN0b3A/OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IHZvaWRcbiAgfVxuICBuYW1lPzogTmFtZVxufVxuXG5leHBvcnQgdHlwZSBNb2RpZmllclN0YXRlPFxuICBEZWZhdWx0cyA9IHt9LFxuICBTdGF0ZVByb3BzIGV4dGVuZHMgeyBbcHJvcDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgTmFtZSBleHRlbmRzIHN0cmluZyA9IGFueVxuPiA9IHtcbiAgb3B0aW9uczogRGVmYXVsdHNcbiAgbWV0aG9kcz86IE1vZGlmaWVyPERlZmF1bHRzPlsnbWV0aG9kcyddXG4gIGluZGV4PzogbnVtYmVyXG4gIG5hbWU/OiBOYW1lXG59ICYgU3RhdGVQcm9wc1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWVyQXJnPFN0YXRlIGV4dGVuZHMgTW9kaWZpZXJTdGF0ZSA9IE1vZGlmaWVyU3RhdGU+IHtcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uXG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlXG4gIHBoYXNlOiBJbnRlcmFjdC5FdmVudFBoYXNlXG4gIHJlY3Q6IEludGVyYWN0LkZ1bGxSZWN0XG4gIGVkZ2VzOiBJbnRlcmFjdC5FZGdlT3B0aW9uc1xuICBzdGF0ZT86IFN0YXRlXG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbiAgcGFnZUNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHByZXZDb29yZHM/OiBJbnRlcmFjdC5Qb2ludFxuICBwcmV2UmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHN0YXJ0T2Zmc2V0PzogSW50ZXJhY3QuUmVjdFxuICBwcmVFbmQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZXJNb2R1bGU8XG4gIERlZmF1bHRzIGV4dGVuZHMgeyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUsXG4+IHtcbiAgZGVmYXVsdHM/OiBEZWZhdWx0c1xuICBzdGFydD8gKGFyZzogTW9kaWZpZXJBcmc8U3RhdGU+KTogdm9pZFxuICBzZXQ/IChhcmc6IE1vZGlmaWVyQXJnPFN0YXRlPik6IGFueVxuICBiZWZvcmVFbmQ/IChhcmc6IE1vZGlmaWVyQXJnPFN0YXRlPik6IEludGVyYWN0LlBvaW50IHwgdm9pZFxuICBzdG9wPyAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pOiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTW9kaWZpZXI8XG4gIERlZmF1bHRzIGV4dGVuZHMgeyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUsXG4gIE5hbWUgZXh0ZW5kcyBzdHJpbmdcbj4gKFxuICBtb2R1bGU6IE1vZGlmaWVyTW9kdWxlPERlZmF1bHRzLCBTdGF0ZT4sXG4gIG5hbWU/OiBOYW1lLFxuKSB7XG4gIGNvbnN0IHsgZGVmYXVsdHMgfSA9IG1vZHVsZVxuICBjb25zdCBtZXRob2RzID0ge1xuICAgIHN0YXJ0OiBtb2R1bGUuc3RhcnQsXG4gICAgc2V0OiBtb2R1bGUuc2V0LFxuICAgIGJlZm9yZUVuZDogbW9kdWxlLmJlZm9yZUVuZCxcbiAgICBzdG9wOiBtb2R1bGUuc3RvcCxcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVyID0gKF9vcHRpb25zPzogUGFydGlhbDxEZWZhdWx0cz4pID0+IHtcbiAgICBjb25zdCBvcHRpb25zOiBEZWZhdWx0cyA9IChfb3B0aW9ucyB8fCB7fSkgYXMgRGVmYXVsdHNcblxuICAgIG9wdGlvbnMuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcblxuICAgIC8vIGFkZCBtaXNzaW5nIGRlZmF1bHRzIHRvIG9wdGlvbnNcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGVmYXVsdHMpIHtcbiAgICAgIGlmICghKHByb3AgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IGRlZmF1bHRzW3Byb3BdXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbTogTW9kaWZpZXI8RGVmYXVsdHMsIFN0YXRlLCBOYW1lPiA9IHsgb3B0aW9ucywgbWV0aG9kcywgbmFtZSB9XG5cbiAgICByZXR1cm4gbVxuICB9XG5cbiAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZm9yIGJhY2t3cmFkcyBjb21wYXRpYmlsaXR5XG4gICAgbW9kaWZpZXIuX2RlZmF1bHRzID0gZGVmYXVsdHNcbiAgICBtb2RpZmllci5fbWV0aG9kcyA9IG1ldGhvZHNcbiAgfVxuXG4gIHJldHVybiBtb2RpZmllclxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRXZlbnRNb2RpZmllcnMgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbjogeyBtb2RpZmljYXRpb246IHsgcmVzdWx0IH0gfSB9OiB7XG4gIGlFdmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxJbnRlcmFjdC5BY3Rpb25OYW1lLCBJbnRlcmFjdC5FdmVudFBoYXNlPlxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbn0pIHtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGlFdmVudC5tb2RpZmllcnMgPSByZXN1bHQuZXZlbnRQcm9wc1xuICB9XG59XG5cbmNvbnN0IG1vZGlmaWVyc0Jhc2U6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdtb2RpZmllcnMvYmFzZScsXG4gIGluc3RhbGw6IHNjb3BlID0+IHtcbiAgICBzY29wZS5kZWZhdWx0cy5wZXJBY3Rpb24ubW9kaWZpZXJzID0gW11cbiAgfSxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGlvbi5tb2RpZmljYXRpb24gPSBuZXcgTW9kaWZpY2F0aW9uKGludGVyYWN0aW9uKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tc3RhcnQnOiBhcmcgPT4ge1xuICAgICAgY29uc3QgeyBtb2RpZmljYXRpb24gfSA9IGFyZy5pbnRlcmFjdGlvblxuXG4gICAgICBtb2RpZmljYXRpb24uc3RhcnQoYXJnLCBhcmcuaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UpXG4gICAgICBhcmcuaW50ZXJhY3Rpb24uZWRnZXMgPSBtb2RpZmljYXRpb24uZWRnZXNcbiAgICAgIG1vZGlmaWNhdGlvbi5hcHBseVRvSW50ZXJhY3Rpb24oYXJnKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnNldEFuZEFwcGx5KGFyZyksXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uYmVmb3JlRW5kKGFyZyksXG5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1zdGFydCc6IGFkZEV2ZW50TW9kaWZpZXJzLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBhZGRFdmVudE1vZGlmaWVycyxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1lbmQnOiBhZGRFdmVudE1vZGlmaWVycyxcblxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXN0YXJ0JzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24ucmVzdG9yZUludGVyYWN0aW9uQ29vcmRzKGFyZyksXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uc3RvcChhcmcpLFxuICB9LFxuICBiZWZvcmU6IFsnYWN0aW9ucycsICdhY3Rpb24vZHJhZycsICdhY3Rpb25zL3Jlc2l6ZScsICdhY3Rpb25zL2dlc3R1cmUnXSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbW9kaWZpZXJzQmFzZVxuIiwiaW1wb3J0IHsgX1Byb3h5TWV0aG9kcyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgKiBhcyByZWN0VXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmVjdCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBvZmZzZXRCeT86IHR5cGVvZiBvZmZzZXRCeVxuICAgIG9mZnNldDoge1xuICAgICAgdG90YWw6IEludGVyYWN0LlBvaW50XG4gICAgICBwZW5kaW5nOiBJbnRlcmFjdC5Qb2ludFxuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZW51bSBfUHJveHlNZXRob2RzIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgb2Zmc2V0QnkgPSAnJ1xuICB9XG59XG5cbihfUHJveHlNZXRob2RzIGFzIGFueSkub2Zmc2V0QnkgPSAnJ1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkVG90YWwgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICBpZiAoIWludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24pIHsgcmV0dXJuIH1cblxuICBhZGRUb0Nvb3JkcyhpbnRlcmFjdGlvbi5jb29yZHMuY3VyLCBpbnRlcmFjdGlvbi5vZmZzZXQudG90YWwpXG5cbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueCA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueSA9IDBcbn1cblxuZnVuY3Rpb24gYmVmb3JlQWN0aW9uICh7IGludGVyYWN0aW9uIH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgYXBwbHlQZW5kaW5nKGludGVyYWN0aW9uKVxufVxuXG5mdW5jdGlvbiBiZWZvcmVFbmQgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSk6IGJvb2xlYW4gfCB2b2lkIHtcbiAgY29uc3QgaGFkUGVuZGluZyA9IGFwcGx5UGVuZGluZyhpbnRlcmFjdGlvbilcblxuICBpZiAoIWhhZFBlbmRpbmcpIHsgcmV0dXJuIH1cblxuICBpbnRlcmFjdGlvbi5tb3ZlKHsgb2Zmc2V0OiB0cnVlIH0pXG4gIGludGVyYWN0aW9uLmVuZCgpXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGVuZCAoeyBpbnRlcmFjdGlvbiB9OiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9KSB7XG4gIGludGVyYWN0aW9uLm9mZnNldC50b3RhbC54ID0gMFxuICBpbnRlcmFjdGlvbi5vZmZzZXQudG90YWwueSA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueCA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueSA9IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGVuZGluZyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uKSB7XG4gIGlmICghaGFzUGVuZGluZyhpbnRlcmFjdGlvbikpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IHsgcGVuZGluZyB9ID0gaW50ZXJhY3Rpb24ub2Zmc2V0XG5cbiAgYWRkVG9Db29yZHMoaW50ZXJhY3Rpb24uY29vcmRzLmN1ciwgcGVuZGluZylcbiAgYWRkVG9Db29yZHMoaW50ZXJhY3Rpb24uY29vcmRzLmRlbHRhLCBwZW5kaW5nKVxuICByZWN0VXRpbHMuYWRkRWRnZXMoaW50ZXJhY3Rpb24uZWRnZXMsIGludGVyYWN0aW9uLnJlY3QsIHBlbmRpbmcpXG5cbiAgcGVuZGluZy54ID0gMFxuICBwZW5kaW5nLnkgPSAwXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gb2Zmc2V0QnkgKHRoaXM6IEludGVyYWN0LkludGVyYWN0aW9uLCB7IHgsIHkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgdGhpcy5vZmZzZXQucGVuZGluZy54ICs9IHhcbiAgdGhpcy5vZmZzZXQucGVuZGluZy55ICs9IHlcblxuICB0aGlzLm9mZnNldC50b3RhbC54ICs9IHhcbiAgdGhpcy5vZmZzZXQudG90YWwueSArPSB5XG59XG5cbmZ1bmN0aW9uIGFkZFRvQ29vcmRzICh7IHBhZ2UsIGNsaWVudCB9LCB7IHgsIHkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgcGFnZS54ICs9IHhcbiAgcGFnZS55ICs9IHlcbiAgY2xpZW50LnggKz0geFxuICBjbGllbnQueSArPSB5XG59XG5cbmZ1bmN0aW9uIGhhc1BlbmRpbmcgKGludGVyYWN0aW9uKSB7XG4gIHJldHVybiAhIShpbnRlcmFjdGlvbi5vZmZzZXQucGVuZGluZy54IHx8IGludGVyYWN0aW9uLm9mZnNldC5wZW5kaW5nLnkpXG59XG5cbmNvbnN0IG9mZnNldDogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ29mZnNldCcsXG4gIGluc3RhbGwgKHNjb3BlKSB7XG4gICAgc2NvcGUuSW50ZXJhY3Rpb24ucHJvdG90eXBlLm9mZnNldEJ5ID0gb2Zmc2V0QnlcbiAgfSxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGlvbi5vZmZzZXQgPSB7XG4gICAgICAgIHRvdGFsOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgcGVuZGluZzogeyB4OiAwLCB5OiAwIH0sXG4gICAgICB9XG4gICAgfSxcbiAgICAnaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJzogKHsgaW50ZXJhY3Rpb24gfSkgPT4gYWRkVG90YWwoaW50ZXJhY3Rpb24pLFxuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1zdGFydCc6IGJlZm9yZUFjdGlvbixcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGJlZm9yZUFjdGlvbixcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogYmVmb3JlRW5kLFxuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IGVuZCxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgb2Zmc2V0XG4iLCJpbXBvcnQgKiBhcyBtb2RpZmllcnMgZnJvbSAnQGludGVyYWN0anMvbW9kaWZpZXJzL2Jhc2UnXG5pbXBvcnQgTW9kaWZpY2F0aW9uIGZyb20gJ0BpbnRlcmFjdGpzL21vZGlmaWVycy9Nb2RpZmljYXRpb24nXG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0BpbnRlcmFjdGpzL29mZnNldC9pbmRleCdcbmltcG9ydCAqIGFzIGRvbSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21VdGlscydcbmltcG9ydCBoeXBvdCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9oeXBvdCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IHsgY29weUNvb3JkcyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3BvaW50ZXJVdGlscydcbmltcG9ydCByYWYgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmFmJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50JyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgaW50ZXJmYWNlIFBoYXNlTWFwIHtcbiAgICByZXN1bWU/OiB0cnVlXG4gICAgaW5lcnRpYXN0YXJ0PzogdHJ1ZVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgaW5lcnRpYT86IEluZXJ0aWFTdGF0ZVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgaW5lcnRpYT86IHtcbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICByZXNpc3RhbmNlPzogbnVtYmVyICAgICAgICAvLyB0aGUgbGFtYmRhIGluIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgICBtaW5TcGVlZD86IG51bWJlciAgICAgICAgICAvLyB0YXJnZXQgc3BlZWQgbXVzdCBiZSBhYm92ZSB0aGlzIGZvciBpbmVydGlhIHRvIHN0YXJ0XG4gICAgICBlbmRTcGVlZD86IG51bWJlciAgICAgICAgICAvLyB0aGUgc3BlZWQgYXQgd2hpY2ggaW5lcnRpYSBpcyBzbG93IGVub3VnaCB0byBzdG9wXG4gICAgICBhbGxvd1Jlc3VtZT86IHRydWUgICAgICAgICAvLyBhbGxvdyByZXN1bWluZyBhbiBhY3Rpb24gaW4gaW5lcnRpYSBwaGFzZVxuICAgICAgc21vb3RoRW5kRHVyYXRpb24/OiBudW1iZXIgLy8gYW5pbWF0ZSB0byBzbmFwL3Jlc3RyaWN0IGVuZE9ubHkgaWYgdGhlcmUncyBubyBpbmVydGlhXG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTaWduYWxBcmdzIHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24taW5lcnRpYXN0YXJ0JzogT21pdDxJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdpbmVydGlhc3RhcnQnPiwgJ2lFdmVudCc+XG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24taW5lcnRpYXN0YXJ0JzogSW50ZXJhY3QuRG9QaGFzZUFyZzxJbnRlcmFjdC5BY3Rpb25OYW1lLCAnaW5lcnRpYXN0YXJ0Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFmdGVyLWFjdGlvbi1pbmVydGlhc3RhcnQnOiBJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdpbmVydGlhc3RhcnQnPlxuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1yZXN1bWUnOiBPbWl0PEludGVyYWN0LkRvUGhhc2VBcmc8SW50ZXJhY3QuQWN0aW9uTmFtZSwgJ3Jlc3VtZSc+LCAnaUV2ZW50Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1yZXN1bWUnOiBJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdyZXN1bWUnPlxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXJlc3VtZSc6IEludGVyYWN0LkRvUGhhc2VBcmc8SW50ZXJhY3QuQWN0aW9uTmFtZSwgJ3Jlc3VtZSc+XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKG9mZnNldClcbiAgc2NvcGUudXNlUGx1Z2luKG1vZGlmaWVycy5kZWZhdWx0KVxuICBzY29wZS5hY3Rpb25zLnBoYXNlcy5pbmVydGlhc3RhcnQgPSB0cnVlXG4gIHNjb3BlLmFjdGlvbnMucGhhc2VzLnJlc3VtZSA9IHRydWVcblxuICBkZWZhdWx0cy5wZXJBY3Rpb24uaW5lcnRpYSA9IHtcbiAgICBlbmFibGVkICAgICAgICAgIDogZmFsc2UsXG4gICAgcmVzaXN0YW5jZSAgICAgICA6IDEwLCAgICAvLyB0aGUgbGFtYmRhIGluIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgbWluU3BlZWQgICAgICAgICA6IDEwMCwgICAvLyB0YXJnZXQgc3BlZWQgbXVzdCBiZSBhYm92ZSB0aGlzIGZvciBpbmVydGlhIHRvIHN0YXJ0XG4gICAgZW5kU3BlZWQgICAgICAgICA6IDEwLCAgICAvLyB0aGUgc3BlZWQgYXQgd2hpY2ggaW5lcnRpYSBpcyBzbG93IGVub3VnaCB0byBzdG9wXG4gICAgYWxsb3dSZXN1bWUgICAgICA6IHRydWUsICAvLyBhbGxvdyByZXN1bWluZyBhbiBhY3Rpb24gaW4gaW5lcnRpYSBwaGFzZVxuICAgIHNtb290aEVuZER1cmF0aW9uOiAzMDAsICAgLy8gYW5pbWF0ZSB0byBzbmFwL3Jlc3RyaWN0IGVuZE9ubHkgaWYgdGhlcmUncyBubyBpbmVydGlhXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZXJ0aWFTdGF0ZSB7XG4gIGFjdGl2ZSA9IGZhbHNlXG4gIGlzTW9kaWZpZWQgPSBmYWxzZVxuICBzbW9vdGhFbmQgPSBmYWxzZVxuICBhbGxvd1Jlc3VtZSA9IGZhbHNlXG5cbiAgbW9kaWZpY2F0aW9uOiBNb2RpZmljYXRpb24gPSBudWxsXG4gIG1vZGlmaWVyQ291bnQgPSAwXG4gIG1vZGlmaWVyQXJnOiBtb2RpZmllcnMuTW9kaWZpZXJBcmcgPSBudWxsXG5cbiAgc3RhcnRDb29yZHM6IEludGVyYWN0LlBvaW50ID0gbnVsbFxuICB0MCA9IDBcbiAgdjAgPSAwXG5cbiAgdGUgPSAwXG4gIHRhcmdldE9mZnNldDogSW50ZXJhY3QuUG9pbnQgPSBudWxsXG4gIG1vZGlmaWVkT2Zmc2V0OiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgY3VycmVudE9mZnNldDogSW50ZXJhY3QuUG9pbnQgPSBudWxsXG5cbiAgbGFtYmRhX3YwPyA9IDAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgb25lX3ZlX3YwPyA9IDAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgdGltZW91dDogbnVtYmVyID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yIChcbiAgICBwcml2YXRlIHJlYWRvbmx5IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgKSB7fVxuXG4gIHN0YXJ0IChldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhpbnRlcmFjdGlvbilcblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudDogdmVsb2NpdHlDbGllbnQgfSA9IGludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eVxuICAgIGNvbnN0IHBvaW50ZXJTcGVlZCA9IGh5cG90KHZlbG9jaXR5Q2xpZW50LngsIHZlbG9jaXR5Q2xpZW50LnkpXG4gICAgY29uc3QgbW9kaWZpY2F0aW9uID0gdGhpcy5tb2RpZmljYXRpb24gfHwgKHRoaXMubW9kaWZpY2F0aW9uID0gbmV3IE1vZGlmaWNhdGlvbihpbnRlcmFjdGlvbikpXG5cbiAgICBtb2RpZmljYXRpb24uY29weUZyb20oaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uKVxuXG4gICAgdGhpcy50MCA9IGludGVyYWN0aW9uLl9ub3coKVxuICAgIHRoaXMuYWxsb3dSZXN1bWUgPSBvcHRpb25zLmFsbG93UmVzdW1lXG4gICAgdGhpcy52MCA9IHBvaW50ZXJTcGVlZFxuICAgIHRoaXMuY3VycmVudE9mZnNldCA9IHsgeDogMCwgeTogMCB9XG4gICAgdGhpcy5zdGFydENvb3JkcyA9IGludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZVxuXG4gICAgdGhpcy5tb2RpZmllckFyZyA9IHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgaW50ZXJhY3RhYmxlOiBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsXG4gICAgICBlbGVtZW50OiBpbnRlcmFjdGlvbi5lbGVtZW50LFxuICAgICAgcmVjdDogaW50ZXJhY3Rpb24ucmVjdCxcbiAgICAgIGVkZ2VzOiBpbnRlcmFjdGlvbi5lZGdlcyxcbiAgICAgIHBhZ2VDb29yZHM6IHRoaXMuc3RhcnRDb29yZHMsXG4gICAgICBwcmVFbmQ6IHRydWUsXG4gICAgICBwaGFzZTogJ2luZXJ0aWFzdGFydCcsXG4gICAgfVxuXG4gICAgY29uc3QgdGhyb3duID0gKFxuICAgICAgKHRoaXMudDAgLSBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnRpbWVTdGFtcCkgPCA1MCAmJlxuICAgICAgcG9pbnRlclNwZWVkID4gb3B0aW9ucy5taW5TcGVlZCAmJlxuICAgICAgcG9pbnRlclNwZWVkID4gb3B0aW9ucy5lbmRTcGVlZFxuICAgIClcblxuICAgIGlmICh0aHJvd24pIHtcbiAgICAgIHRoaXMuc3RhcnRJbmVydGlhKClcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kaWZpY2F0aW9uLnJlc3VsdCA9IG1vZGlmaWNhdGlvbi5zZXRBbGwodGhpcy5tb2RpZmllckFyZylcblxuICAgICAgaWYgKCFtb2RpZmljYXRpb24ucmVzdWx0LmNoYW5nZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhcnRTbW9vdGhFbmQoKVxuICAgIH1cblxuICAgIC8vIGZvcmNlIG1vZGlmaWNhdGlvbiBjaGFuZ2VcbiAgICBpbnRlcmFjdGlvbi5tb2RpZmljYXRpb24ucmVzdWx0LnJlY3QgPSBudWxsXG5cbiAgICAvLyBicmluZyBpbmVydGlhc3RhcnQgZXZlbnQgdG8gdGhlIHRhcmdldCBjb29yZHNcbiAgICBpbnRlcmFjdGlvbi5vZmZzZXRCeSh0aGlzLnRhcmdldE9mZnNldClcbiAgICBpbnRlcmFjdGlvbi5fZG9QaGFzZSh7XG4gICAgICBpbnRlcmFjdGlvbixcbiAgICAgIGV2ZW50LFxuICAgICAgcGhhc2U6ICdpbmVydGlhc3RhcnQnLFxuICAgIH0pXG4gICAgaW50ZXJhY3Rpb24ub2Zmc2V0QnkoeyB4OiAtdGhpcy50YXJnZXRPZmZzZXQueCwgeTogLXRoaXMudGFyZ2V0T2Zmc2V0LnkgfSlcbiAgICAvLyBmb3JjZSBtb2RpZmljYXRpb24gY2hhbmdlXG4gICAgaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3VsdC5yZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlXG4gICAgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiA9IHRoaXNcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzdGFydEluZXJ0aWEgKCkge1xuICAgIGNvbnN0IHN0YXJ0VmVsb2NpdHkgPSB0aGlzLmludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eS5jbGllbnRcbiAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyh0aGlzLmludGVyYWN0aW9uKVxuICAgIGNvbnN0IGxhbWJkYSA9IG9wdGlvbnMucmVzaXN0YW5jZVxuICAgIGNvbnN0IGluZXJ0aWFEdXIgPSAtTWF0aC5sb2cob3B0aW9ucy5lbmRTcGVlZCAvIHRoaXMudjApIC8gbGFtYmRhXG5cbiAgICB0aGlzLnRhcmdldE9mZnNldCA9IHtcbiAgICAgIHg6IChzdGFydFZlbG9jaXR5LnggLSBpbmVydGlhRHVyKSAvIGxhbWJkYSxcbiAgICAgIHk6IChzdGFydFZlbG9jaXR5LnkgLSBpbmVydGlhRHVyKSAvIGxhbWJkYSxcbiAgICB9XG5cbiAgICB0aGlzLnRlID0gaW5lcnRpYUR1clxuICAgIHRoaXMubGFtYmRhX3YwID0gbGFtYmRhIC8gdGhpcy52MFxuICAgIHRoaXMub25lX3ZlX3YwID0gMSAtIG9wdGlvbnMuZW5kU3BlZWQgLyB0aGlzLnYwXG5cbiAgICBjb25zdCB7IG1vZGlmaWNhdGlvbiwgbW9kaWZpZXJBcmcgfSA9IHRoaXNcblxuICAgIG1vZGlmaWVyQXJnLnBhZ2VDb29yZHMgPSB7XG4gICAgICB4OiB0aGlzLnN0YXJ0Q29vcmRzLnggKyB0aGlzLnRhcmdldE9mZnNldC54LFxuICAgICAgeTogdGhpcy5zdGFydENvb3Jkcy55ICsgdGhpcy50YXJnZXRPZmZzZXQueSxcbiAgICB9XG5cbiAgICBtb2RpZmljYXRpb24ucmVzdWx0ID0gbW9kaWZpY2F0aW9uLnNldEFsbChtb2RpZmllckFyZylcblxuICAgIGlmIChtb2RpZmljYXRpb24ucmVzdWx0LmNoYW5nZWQpIHtcbiAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWVcbiAgICAgIHRoaXMubW9kaWZpZWRPZmZzZXQgPSB7XG4gICAgICAgIHg6IHRoaXMudGFyZ2V0T2Zmc2V0LnggKyBtb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLngsXG4gICAgICAgIHk6IHRoaXMudGFyZ2V0T2Zmc2V0LnkgKyBtb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLnksXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5pbmVydGlhVGljaygpKVxuICB9XG5cbiAgc3RhcnRTbW9vdGhFbmQgKCkge1xuICAgIHRoaXMuc21vb3RoRW5kID0gdHJ1ZVxuICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWVcbiAgICB0aGlzLnRhcmdldE9mZnNldCA9IHtcbiAgICAgIHg6IHRoaXMubW9kaWZpY2F0aW9uLnJlc3VsdC5kZWx0YS54LFxuICAgICAgeTogdGhpcy5tb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLnksXG4gICAgfVxuXG4gICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5zbW9vdGhFbmRUaWNrKCkpXG4gIH1cblxuICBpbmVydGlhVGljayAoKSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdGlvbiB9ID0gdGhpc1xuICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGludGVyYWN0aW9uKVxuICAgIGNvbnN0IGxhbWJkYSA9IG9wdGlvbnMucmVzaXN0YW5jZVxuICAgIGNvbnN0IHQgPSAoaW50ZXJhY3Rpb24uX25vdygpIC0gdGhpcy50MCkgLyAxMDAwXG5cbiAgICBpZiAodCA8IHRoaXMudGUpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gIDEgLSAoTWF0aC5leHAoLWxhbWJkYSAqIHQpIC0gdGhpcy5sYW1iZGFfdjApIC8gdGhpcy5vbmVfdmVfdjBcbiAgICAgIGxldCBuZXdPZmZzZXQ6IEludGVyYWN0LlBvaW50XG5cbiAgICAgIGlmICh0aGlzLmlzTW9kaWZpZWQpIHtcbiAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0UXVhZHJhdGljQ3VydmVQb2ludChcbiAgICAgICAgICAwLCAwLFxuICAgICAgICAgIHRoaXMudGFyZ2V0T2Zmc2V0LngsIHRoaXMudGFyZ2V0T2Zmc2V0LnksXG4gICAgICAgICAgdGhpcy5tb2RpZmllZE9mZnNldC54LCB0aGlzLm1vZGlmaWVkT2Zmc2V0LnksXG4gICAgICAgICAgcHJvZ3Jlc3MsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBuZXdPZmZzZXQgPSB7XG4gICAgICAgICAgeDogdGhpcy50YXJnZXRPZmZzZXQueCAqIHByb2dyZXNzLFxuICAgICAgICAgIHk6IHRoaXMudGFyZ2V0T2Zmc2V0LnkgKiBwcm9ncmVzcyxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWx0YSA9IHsgeDogbmV3T2Zmc2V0LnggLSB0aGlzLmN1cnJlbnRPZmZzZXQueCwgeTogbmV3T2Zmc2V0LnkgLSB0aGlzLmN1cnJlbnRPZmZzZXQueSB9XG5cbiAgICAgIHRoaXMuY3VycmVudE9mZnNldC54ICs9IGRlbHRhLnhcbiAgICAgIHRoaXMuY3VycmVudE9mZnNldC55ICs9IGRlbHRhLnlcblxuICAgICAgaW50ZXJhY3Rpb24ub2Zmc2V0QnkoZGVsdGEpXG4gICAgICBpbnRlcmFjdGlvbi5tb3ZlKClcblxuICAgICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5pbmVydGlhVGljaygpKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KHtcbiAgICAgICAgeDogdGhpcy5tb2RpZmllZE9mZnNldC54IC0gdGhpcy5jdXJyZW50T2Zmc2V0LngsXG4gICAgICAgIHk6IHRoaXMubW9kaWZpZWRPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIHNtb290aEVuZFRpY2sgKCkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCB0ID0gaW50ZXJhY3Rpb24uX25vdygpIC0gdGhpcy50MFxuICAgIGNvbnN0IHsgc21vb3RoRW5kRHVyYXRpb246IGR1cmF0aW9uIH0gPSBnZXRPcHRpb25zKGludGVyYWN0aW9uKVxuXG4gICAgaWYgKHQgPCBkdXJhdGlvbikge1xuICAgICAgY29uc3QgbmV3T2Zmc2V0ID0ge1xuICAgICAgICB4OiBlYXNlT3V0UXVhZCh0LCAwLCB0aGlzLnRhcmdldE9mZnNldC54LCBkdXJhdGlvbiksXG4gICAgICAgIHk6IGVhc2VPdXRRdWFkKHQsIDAsIHRoaXMudGFyZ2V0T2Zmc2V0LnksIGR1cmF0aW9uKSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbHRhID0ge1xuICAgICAgICB4OiBuZXdPZmZzZXQueCAtIHRoaXMuY3VycmVudE9mZnNldC54LFxuICAgICAgICB5OiBuZXdPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRPZmZzZXQueCArPSBkZWx0YS54XG4gICAgICB0aGlzLmN1cnJlbnRPZmZzZXQueSArPSBkZWx0YS55XG5cbiAgICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KGRlbHRhKVxuICAgICAgaW50ZXJhY3Rpb24ubW92ZSh7IHNraXBNb2RpZmllcnM6IHRoaXMubW9kaWZpZXJDb3VudCB9KVxuXG4gICAgICB0aGlzLnRpbWVvdXQgPSByYWYucmVxdWVzdCgoKSA9PiB0aGlzLnNtb290aEVuZFRpY2soKSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpbnRlcmFjdGlvbi5vZmZzZXRCeSh7XG4gICAgICAgIHg6IHRoaXMudGFyZ2V0T2Zmc2V0LnggLSB0aGlzLmN1cnJlbnRPZmZzZXQueCxcbiAgICAgICAgeTogdGhpcy50YXJnZXRPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIHJlc3VtZSAoeyBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcblxuICAgIC8vIHVuZG8gaW5lcnRpYSBjaGFuZ2VzIHRvIGludGVyYWN0aW9uIGNvb3Jkc1xuICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KHtcbiAgICAgIHg6IC10aGlzLmN1cnJlbnRPZmZzZXQueCxcbiAgICAgIHk6IC10aGlzLmN1cnJlbnRPZmZzZXQueSxcbiAgICB9KVxuXG4gICAgLy8gdXBkYXRlIHBvaW50ZXIgYXQgcG9pbnRlciBkb3duIHBvc2l0aW9uXG4gICAgaW50ZXJhY3Rpb24udXBkYXRlUG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHRydWUpXG5cbiAgICAvLyBmaXJlIHJlc3VtZSBzaWduYWxzIGFuZCBldmVudFxuICAgIGludGVyYWN0aW9uLl9kb1BoYXNlKHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgZXZlbnQsXG4gICAgICBwaGFzZTogJ3Jlc3VtZScsXG4gICAgfSlcbiAgICBjb3B5Q29vcmRzKGludGVyYWN0aW9uLmNvb3Jkcy5wcmV2LCBpbnRlcmFjdGlvbi5jb29yZHMuY3VyKVxuXG4gICAgdGhpcy5zdG9wKClcbiAgfVxuXG4gIGVuZCAoKSB7XG4gICAgdGhpcy5pbnRlcmFjdGlvbi5tb3ZlKClcbiAgICB0aGlzLmludGVyYWN0aW9uLmVuZCgpXG4gICAgdGhpcy5zdG9wKClcbiAgfVxuXG4gIHN0b3AgKCkge1xuICAgIHRoaXMuYWN0aXZlID0gdGhpcy5zbW9vdGhFbmQgPSBmYWxzZVxuICAgIHRoaXMuaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiA9IG51bGxcbiAgICByYWYuY2FuY2VsKHRoaXMudGltZW91dClcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpbnRlcmFjdGlvbiwgZXZlbnQgfTogSW50ZXJhY3QuRG9QaGFzZUFyZzxJbnRlcmFjdC5BY3Rpb25OYW1lLCAnZW5kJz4pIHtcbiAgaWYgKCFpbnRlcmFjdGlvbi5faW50ZXJhY3RpbmcgfHwgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBzdGFydGVkID0gaW50ZXJhY3Rpb24uaW5lcnRpYS5zdGFydChldmVudClcblxuICAvLyBwcmV2ZW50IGFjdGlvbiBlbmQgaWYgaW5lcnRpYSBvciBzbW9vdGhFbmRcbiAgcmV0dXJuIHN0YXJ0ZWQgPyBmYWxzZSA6IG51bGxcbn1cblxuLy8gQ2hlY2sgaWYgdGhlIGRvd24gZXZlbnQgaGl0cyB0aGUgY3VycmVudCBpbmVydGlhIHRhcmdldFxuLy8gY29udHJvbCBzaG91bGQgYmUgcmV0dXJuIHRvIHRoZSB1c2VyXG5mdW5jdGlvbiByZXN1bWUgKGFyZzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSkge1xuICBjb25zdCB7IGludGVyYWN0aW9uLCBldmVudFRhcmdldCB9ID0gYXJnXG4gIGNvbnN0IHN0YXRlID0gaW50ZXJhY3Rpb24uaW5lcnRpYVxuXG4gIGlmICghc3RhdGUuYWN0aXZlKSB7IHJldHVybiB9XG5cbiAgbGV0IGVsZW1lbnQgPSBldmVudFRhcmdldCBhcyBOb2RlXG5cbiAgLy8gY2xpbWIgdXAgdGhlIERPTSB0cmVlIGZyb20gdGhlIGV2ZW50IHRhcmdldFxuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIGlmIGludGVyYWN0aW9uIGVsZW1lbnQgaXMgdGhlIGN1cnJlbnQgaW5lcnRpYSB0YXJnZXQgZWxlbWVudFxuICAgIGlmIChlbGVtZW50ID09PSBpbnRlcmFjdGlvbi5lbGVtZW50KSB7XG4gICAgICBzdGF0ZS5yZXN1bWUoYXJnKVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZG9tLnBhcmVudE5vZGUoZWxlbWVudClcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wICh7IGludGVyYWN0aW9uIH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgY29uc3Qgc3RhdGUgPSBpbnRlcmFjdGlvbi5pbmVydGlhXG5cbiAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgIHN0YXRlLnN0b3AoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvbnMgKHsgaW50ZXJhY3RhYmxlLCBwcmVwYXJlZCB9OiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICByZXR1cm4gaW50ZXJhY3RhYmxlICYmXG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMgJiZcbiAgICBwcmVwYXJlZC5uYW1lICYmXG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnNbcHJlcGFyZWQubmFtZV0uaW5lcnRpYVxufVxuXG5jb25zdCBpbmVydGlhOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnaW5lcnRpYScsXG4gIGJlZm9yZTogWydtb2RpZmllcnMvYmFzZSddLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmluZXJ0aWEgPSBuZXcgSW5lcnRpYVN0YXRlKGludGVyYWN0aW9uKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogc3RhcnQsXG4gICAgJ2ludGVyYWN0aW9uczpkb3duJzogcmVzdW1lLFxuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IHN0b3AsXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tcmVzdW1lJzogYXJnID0+IHtcbiAgICAgIGNvbnN0IHsgbW9kaWZpY2F0aW9uIH0gPSBhcmcuaW50ZXJhY3Rpb25cblxuICAgICAgbW9kaWZpY2F0aW9uLnN0b3AoYXJnKVxuICAgICAgbW9kaWZpY2F0aW9uLnN0YXJ0KGFyZywgYXJnLmludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZSlcbiAgICAgIG1vZGlmaWNhdGlvbi5hcHBseVRvSW50ZXJhY3Rpb24oYXJnKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24taW5lcnRpYXN0YXJ0JzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uc2V0QW5kQXBwbHkoYXJnKSxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1yZXN1bWUnOiBtb2RpZmllcnMuYWRkRXZlbnRNb2RpZmllcnMsXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24taW5lcnRpYXN0YXJ0JzogbW9kaWZpZXJzLmFkZEV2ZW50TW9kaWZpZXJzLFxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLWluZXJ0aWFzdGFydCc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXJlc3VtZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuICB9LFxufVxuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81NjM0NTI4LzIyODA4ODhcbmZ1bmN0aW9uIF9nZXRRQmV6aWVyVmFsdWUgKHQ6IG51bWJlciwgcDE6IG51bWJlciwgcDI6IG51bWJlciwgcDM6IG51bWJlcikge1xuICBjb25zdCBpVCA9IDEgLSB0XG4gIHJldHVybiBpVCAqIGlUICogcDEgKyAyICogaVQgKiB0ICogcDIgKyB0ICogdCAqIHAzXG59XG5cbmZ1bmN0aW9uIGdldFF1YWRyYXRpY0N1cnZlUG9pbnQgKFxuICBzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIGNwWDogbnVtYmVyLCBjcFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAgX2dldFFCZXppZXJWYWx1ZShwb3NpdGlvbiwgc3RhcnRYLCBjcFgsIGVuZFgpLFxuICAgIHk6ICBfZ2V0UUJlemllclZhbHVlKHBvc2l0aW9uLCBzdGFydFksIGNwWSwgZW5kWSksXG4gIH1cbn1cblxuLy8gaHR0cDovL2dpem1hLmNvbS9lYXNpbmcvXG5mdW5jdGlvbiBlYXNlT3V0UXVhZCAodDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIHQgLz0gZFxuICByZXR1cm4gLWMgKiB0ICogKHQgLSAyKSArIGJcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5lcnRpYVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIG1vZGlmaWVycy9hc3BlY3RSYXRpb1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgZm9yY2VzIGVsZW1lbnRzIHRvIGJlIHJlc2l6ZWQgd2l0aCBhIHNwZWNpZmllZCBkeC9keSByYXRpby5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJhY3QodGFyZ2V0KS5yZXNpemFibGUoe1xuICogICBtb2RpZmllcnM6IFtcbiAqICAgICBpbnRlcmFjdC5tb2RpZmllcnMuc25hcFNpemUoe1xuICogICAgICAgdGFyZ2V0czogWyBpbnRlcmFjdC5jcmVhdGVTbmFwR3JpZCh7IHg6IDIwLCB5OiAyMCB9KSBdLFxuICogICAgIH0pLFxuICogICAgIGludGVyYWN0LmFzcGVjdFJhdGlvKHsgcmF0aW86ICdwcmVzZXJ2ZScgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqL1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCB7IGFkZEVkZ2VzIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmVjdCdcbmltcG9ydCB7IE1vZGlmaWVyLCBNb2RpZmllck1vZHVsZSwgTW9kaWZpZXJTdGF0ZSB9IGZyb20gJy4vYmFzZSdcbmltcG9ydCBNb2RpZmljYXRpb24gZnJvbSAnLi9Nb2RpZmljYXRpb24nXG5pbXBvcnQgeyBtYWtlTW9kaWZpZXIgfSBmcm9tICcuL2Jhc2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNwZWN0UmF0aW9PcHRpb25zIHtcbiAgcmF0aW8/OiBudW1iZXIgfCAncHJlc2VydmUnXG4gIGVxdWFsRGVsdGE/OiBib29sZWFuXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW11cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgQXNwZWN0UmF0aW9TdGF0ZSA9IE1vZGlmaWVyU3RhdGU8QXNwZWN0UmF0aW9PcHRpb25zLCB7XG4gIHN0YXJ0Q29vcmRzOiBJbnRlcmFjdC5Qb2ludFxuICBzdGFydFJlY3Q6IEludGVyYWN0LlJlY3RcbiAgbGlua2VkRWRnZXM6IEludGVyYWN0LkVkZ2VPcHRpb25zXG4gIHJhdGlvOiBudW1iZXJcbiAgZXF1YWxEZWx0YTogYm9vbGVhblxuICB4SXNQcmltYXJ5QXhpczogYm9vbGVhblxuICBlZGdlU2lnbjogMSB8IC0xXG4gIHN1Yk1vZGlmaWNhdGlvbjogTW9kaWZpY2F0aW9uXG59PlxuXG5jb25zdCBhc3BlY3RSYXRpbzogTW9kaWZpZXJNb2R1bGU8QXNwZWN0UmF0aW9PcHRpb25zLCBBc3BlY3RSYXRpb1N0YXRlPiA9IHtcbiAgc3RhcnQgKGFyZykge1xuICAgIGNvbnN0IHsgc3RhdGUsIHJlY3QsIGVkZ2VzOiBvcmlnaW5hbEVkZ2VzLCBwYWdlQ29vcmRzOiBjb29yZHMgfSA9IGFyZ1xuICAgIGxldCB7IHJhdGlvIH0gPSBzdGF0ZS5vcHRpb25zXG4gICAgY29uc3QgeyBlcXVhbERlbHRhLCBtb2RpZmllcnMgfSA9IHN0YXRlLm9wdGlvbnNcblxuICAgIGlmIChyYXRpbyA9PT0gJ3ByZXNlcnZlJykge1xuICAgICAgcmF0aW8gPSByZWN0LndpZHRoIC8gcmVjdC5oZWlnaHRcbiAgICB9XG5cbiAgICBzdGF0ZS5zdGFydENvb3JkcyA9IGV4dGVuZCh7fSwgY29vcmRzKVxuICAgIHN0YXRlLnN0YXJ0UmVjdCA9IGV4dGVuZCh7fSwgcmVjdClcbiAgICBzdGF0ZS5yYXRpbyA9IHJhdGlvXG4gICAgc3RhdGUuZXF1YWxEZWx0YSA9IGVxdWFsRGVsdGFcblxuICAgIGNvbnN0IGxpbmtlZEVkZ2VzID0gc3RhdGUubGlua2VkRWRnZXMgPSB7XG4gICAgICB0b3AgICA6IG9yaWdpbmFsRWRnZXMudG9wICAgIHx8IChvcmlnaW5hbEVkZ2VzLmxlZnQgICAmJiAhb3JpZ2luYWxFZGdlcy5ib3R0b20pLFxuICAgICAgbGVmdCAgOiBvcmlnaW5hbEVkZ2VzLmxlZnQgICB8fCAob3JpZ2luYWxFZGdlcy50b3AgICAgJiYgIW9yaWdpbmFsRWRnZXMucmlnaHQpLFxuICAgICAgYm90dG9tOiBvcmlnaW5hbEVkZ2VzLmJvdHRvbSB8fCAob3JpZ2luYWxFZGdlcy5yaWdodCAgJiYgIW9yaWdpbmFsRWRnZXMudG9wKSxcbiAgICAgIHJpZ2h0IDogb3JpZ2luYWxFZGdlcy5yaWdodCAgfHwgKG9yaWdpbmFsRWRnZXMuYm90dG9tICYmICFvcmlnaW5hbEVkZ2VzLmxlZnQpLFxuICAgIH1cblxuICAgIHN0YXRlLnhJc1ByaW1hcnlBeGlzID0gISEob3JpZ2luYWxFZGdlcy5sZWZ0IHx8IG9yaWdpbmFsRWRnZXMucmlnaHQpXG5cbiAgICBpZiAoc3RhdGUuZXF1YWxEZWx0YSkge1xuICAgICAgc3RhdGUuZWRnZVNpZ24gPSAobGlua2VkRWRnZXMubGVmdCA/IDEgOiAtMSkgKiAobGlua2VkRWRnZXMudG9wID8gMSA6IC0xKSBhcyAxIHwgLTFcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZVNlY29uZGFyeUVkZ2UgPSBzdGF0ZS54SXNQcmltYXJ5QXhpcyA/IGxpbmtlZEVkZ2VzLnRvcCA6IGxpbmtlZEVkZ2VzLmxlZnRcbiAgICAgIHN0YXRlLmVkZ2VTaWduID0gbmVnYXRpdmVTZWNvbmRhcnlFZGdlID8gLTEgOiAxXG4gICAgfVxuXG4gICAgZXh0ZW5kKGFyZy5lZGdlcywgbGlua2VkRWRnZXMpXG5cbiAgICBpZiAoIW1vZGlmaWVycyB8fCAhbW9kaWZpZXJzLmxlbmd0aCkgeyByZXR1cm4gfVxuXG4gICAgY29uc3Qgc3ViTW9kaWZpY2F0aW9uID0gbmV3IE1vZGlmaWNhdGlvbihhcmcuaW50ZXJhY3Rpb24pXG5cbiAgICBzdWJNb2RpZmljYXRpb24uY29weUZyb20oYXJnLmludGVyYWN0aW9uLm1vZGlmaWNhdGlvbilcbiAgICBzdWJNb2RpZmljYXRpb24ucHJlcGFyZVN0YXRlcyhtb2RpZmllcnMpXG5cbiAgICBzdGF0ZS5zdWJNb2RpZmljYXRpb24gPSBzdWJNb2RpZmljYXRpb25cbiAgICBzdWJNb2RpZmljYXRpb24uc3RhcnRBbGwoeyAuLi5hcmcgfSlcbiAgfSxcblxuICBzZXQgKGFyZykge1xuICAgIGNvbnN0IHsgc3RhdGUsIHJlY3QsIGNvb3JkcyB9ID0gYXJnXG4gICAgY29uc3QgaW5pdGlhbENvb3JkcyA9IGV4dGVuZCh7fSwgY29vcmRzKVxuICAgIGNvbnN0IGFzcGVjdE1ldGhvZCA9IHN0YXRlLmVxdWFsRGVsdGEgPyBzZXRFcXVhbERlbHRhIDogc2V0UmF0aW9cblxuICAgIGFzcGVjdE1ldGhvZChzdGF0ZSwgc3RhdGUueElzUHJpbWFyeUF4aXMsIGNvb3JkcywgcmVjdClcblxuICAgIGlmICghc3RhdGUuc3ViTW9kaWZpY2F0aW9uKSB7IHJldHVybiBudWxsIH1cblxuICAgIGNvbnN0IGNvcnJlY3RlZFJlY3QgPSBleHRlbmQoe30sIHJlY3QpXG5cbiAgICBhZGRFZGdlcyhzdGF0ZS5saW5rZWRFZGdlcywgY29ycmVjdGVkUmVjdCwgeyB4OiBjb29yZHMueCAtIGluaXRpYWxDb29yZHMueCwgeTogY29vcmRzLnkgLSBpbml0aWFsQ29vcmRzLnkgfSlcblxuICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLnN1Yk1vZGlmaWNhdGlvbi5zZXRBbGwoe1xuICAgICAgLi4uYXJnLFxuICAgICAgcmVjdDogY29ycmVjdGVkUmVjdCxcbiAgICAgIGVkZ2VzOiBzdGF0ZS5saW5rZWRFZGdlcyxcbiAgICAgIHBhZ2VDb29yZHM6IGNvb3JkcyxcbiAgICAgIHByZXZDb29yZHM6IGNvb3JkcyxcbiAgICAgIHByZXZSZWN0OiBjb3JyZWN0ZWRSZWN0LFxuICAgIH0pXG5cbiAgICBjb25zdCB7IGRlbHRhIH0gPSByZXN1bHRcblxuICAgIGlmIChyZXN1bHQuY2hhbmdlZCkge1xuICAgICAgY29uc3QgeElzQ3JpdGljYWxBeGlzID0gTWF0aC5hYnMoZGVsdGEueCkgPiBNYXRoLmFicyhkZWx0YS55KVxuXG4gICAgICAvLyBkbyBhc3BlY3QgbW9kaWZpY2F0aW9uIGFnYWluIHdpdGggY3JpdGljYWwgZWRnZSBheGlzIGFzIHByaW1hcnlcbiAgICAgIGFzcGVjdE1ldGhvZChzdGF0ZSwgeElzQ3JpdGljYWxBeGlzLCByZXN1bHQuY29vcmRzLCByZXN1bHQucmVjdClcbiAgICAgIGV4dGVuZChjb29yZHMsIHJlc3VsdC5jb29yZHMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5ldmVudFByb3BzXG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICByYXRpbzogJ3ByZXNlcnZlJyxcbiAgICBlcXVhbERlbHRhOiBmYWxzZSxcbiAgICBtb2RpZmllcnM6IFtdLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICB9LFxufVxuXG5mdW5jdGlvbiBzZXRFcXVhbERlbHRhICh7IHN0YXJ0Q29vcmRzLCBlZGdlU2lnbiB9OiBBc3BlY3RSYXRpb1N0YXRlLCB4SXNQcmltYXJ5QXhpczogYm9vbGVhbiwgY29vcmRzOiBJbnRlcmFjdC5Qb2ludCkge1xuICBpZiAoeElzUHJpbWFyeUF4aXMpIHtcbiAgICBjb29yZHMueSA9IHN0YXJ0Q29vcmRzLnkgKyAoY29vcmRzLnggLSBzdGFydENvb3Jkcy54KSAqIGVkZ2VTaWduXG4gIH1cbiAgZWxzZSB7XG4gICAgY29vcmRzLnggPSBzdGFydENvb3Jkcy54ICsgKGNvb3Jkcy55IC0gc3RhcnRDb29yZHMueSkgKiBlZGdlU2lnblxuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJhdGlvICh7IHN0YXJ0UmVjdCwgc3RhcnRDb29yZHMsIHJhdGlvLCBlZGdlU2lnbiB9OiBBc3BlY3RSYXRpb1N0YXRlLCB4SXNQcmltYXJ5QXhpczogYm9vbGVhbiwgY29vcmRzOiBJbnRlcmFjdC5Qb2ludCwgcmVjdDogSW50ZXJhY3QuUmVjdCkge1xuICBpZiAoeElzUHJpbWFyeUF4aXMpIHtcbiAgICBjb25zdCBuZXdIZWlnaHQgPSByZWN0LndpZHRoIC8gcmF0aW9cblxuICAgIGNvb3Jkcy55ID0gc3RhcnRDb29yZHMueSArIChuZXdIZWlnaHQgLSBzdGFydFJlY3QuaGVpZ2h0KSAqIGVkZ2VTaWduXG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc3QgbmV3V2lkdGggPSByZWN0LmhlaWdodCAqIHJhdGlvXG5cbiAgICBjb29yZHMueCA9IHN0YXJ0Q29vcmRzLnggKyAobmV3V2lkdGggLSBzdGFydFJlY3Qud2lkdGgpICogZWRnZVNpZ25cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIoYXNwZWN0UmF0aW8sICdhc3BlY3RSYXRpbycpXG5leHBvcnQgeyBhc3BlY3RSYXRpbyB9XG4iLCJpbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0ICogYXMgcmVjdFV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JlY3QnXG5pbXBvcnQgeyBNb2RpZmllckFyZywgTW9kaWZpZXJNb2R1bGUsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdHJpY3RPcHRpb25zIHtcbiAgLy8gd2hlcmUgdG8gZHJhZyBvdmVyXG4gIHJlc3RyaWN0aW9uOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbbnVtYmVyLCBudW1iZXIsIEludGVyYWN0LkludGVyYWN0aW9uXT5cbiAgLy8gd2hhdCBwYXJ0IG9mIHNlbGYgaXMgYWxsb3dlZCB0byBkcmFnIG92ZXJcbiAgZWxlbWVudFJlY3Q6IEludGVyYWN0LlJlY3RcbiAgb2Zmc2V0OiBJbnRlcmFjdC5SZWN0XG4gIC8vIHJlc3RyaWN0IGp1c3QgYmVmb3JlIHRoZSBlbmQgZHJhZ1xuICBlbmRPbmx5OiBib29sZWFuXG4gIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0U3RhdGUgPSBNb2RpZmllclN0YXRlPFJlc3RyaWN0T3B0aW9ucywge1xuICBvZmZzZXQ6IEludGVyYWN0LlJlY3Rcbn0+XG5cbmZ1bmN0aW9uIHN0YXJ0ICh7IHJlY3QsIHN0YXJ0T2Zmc2V0LCBzdGF0ZSwgaW50ZXJhY3Rpb24sIHBhZ2VDb29yZHMgfTogTW9kaWZpZXJBcmc8UmVzdHJpY3RTdGF0ZT4pIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBjb25zdCB7IGVsZW1lbnRSZWN0IH0gPSBvcHRpb25zXG4gIGNvbnN0IG9mZnNldDogSW50ZXJhY3QuUmVjdCA9IGV4dGVuZCh7XG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICB9LCBvcHRpb25zLm9mZnNldCB8fCB7fSlcblxuICBpZiAocmVjdCAmJiBlbGVtZW50UmVjdCkge1xuICAgIGNvbnN0IHJlc3RyaWN0aW9uID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMucmVzdHJpY3Rpb24sIGludGVyYWN0aW9uLCBwYWdlQ29vcmRzKVxuXG4gICAgaWYgKHJlc3RyaWN0aW9uKSB7XG4gICAgICBjb25zdCB3aWR0aERpZmYgPSAocmVzdHJpY3Rpb24ucmlnaHQgLSByZXN0cmljdGlvbi5sZWZ0KSAtIHJlY3Qud2lkdGhcbiAgICAgIGNvbnN0IGhlaWdodERpZmYgPSAocmVzdHJpY3Rpb24uYm90dG9tIC0gcmVzdHJpY3Rpb24udG9wKSAtIHJlY3QuaGVpZ2h0XG5cbiAgICAgIGlmICh3aWR0aERpZmYgPCAwKSB7XG4gICAgICAgIG9mZnNldC5sZWZ0ICs9IHdpZHRoRGlmZlxuICAgICAgICBvZmZzZXQucmlnaHQgKz0gd2lkdGhEaWZmXG4gICAgICB9XG4gICAgICBpZiAoaGVpZ2h0RGlmZiA8IDApIHtcbiAgICAgICAgb2Zmc2V0LnRvcCArPSBoZWlnaHREaWZmXG4gICAgICAgIG9mZnNldC5ib3R0b20gKz0gaGVpZ2h0RGlmZlxuICAgICAgfVxuICAgIH1cblxuICAgIG9mZnNldC5sZWZ0ICs9IHN0YXJ0T2Zmc2V0LmxlZnQgLSAocmVjdC53aWR0aCAgKiBlbGVtZW50UmVjdC5sZWZ0KVxuICAgIG9mZnNldC50b3AgICs9IHN0YXJ0T2Zmc2V0LnRvcCAgLSAocmVjdC5oZWlnaHQgKiBlbGVtZW50UmVjdC50b3ApXG5cbiAgICBvZmZzZXQucmlnaHQgICs9IHN0YXJ0T2Zmc2V0LnJpZ2h0ICAtIChyZWN0LndpZHRoICAqICgxIC0gZWxlbWVudFJlY3QucmlnaHQpKVxuICAgIG9mZnNldC5ib3R0b20gKz0gc3RhcnRPZmZzZXQuYm90dG9tIC0gKHJlY3QuaGVpZ2h0ICogKDEgLSBlbGVtZW50UmVjdC5ib3R0b20pKVxuICB9XG5cbiAgc3RhdGUub2Zmc2V0ID0gb2Zmc2V0XG59XG5cbmZ1bmN0aW9uIHNldCAoeyBjb29yZHMsIGludGVyYWN0aW9uLCBzdGF0ZSB9OiBNb2RpZmllckFyZzxSZXN0cmljdFN0YXRlPikge1xuICBjb25zdCB7IG9wdGlvbnMsIG9mZnNldCB9ID0gc3RhdGVcblxuICBjb25zdCByZXN0cmljdGlvbiA9IGdldFJlc3RyaWN0aW9uUmVjdChvcHRpb25zLnJlc3RyaWN0aW9uLCBpbnRlcmFjdGlvbiwgY29vcmRzKVxuXG4gIGlmICghcmVzdHJpY3Rpb24pIHsgcmV0dXJuIH1cblxuICBjb25zdCByZWN0ID0gcmVjdFV0aWxzLnh5d2hUb1RsYnIocmVzdHJpY3Rpb24pXG5cbiAgY29vcmRzLnggPSBNYXRoLm1heChNYXRoLm1pbihyZWN0LnJpZ2h0ICAtIG9mZnNldC5yaWdodCwgY29vcmRzLngpLCByZWN0LmxlZnQgKyBvZmZzZXQubGVmdClcbiAgY29vcmRzLnkgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0LmJvdHRvbSAtIG9mZnNldC5ib3R0b20sIGNvb3Jkcy55KSwgcmVjdC50b3AgICsgb2Zmc2V0LnRvcClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc3RyaWN0aW9uUmVjdCAoXG4gIHZhbHVlOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbbnVtYmVyLCBudW1iZXIsIEludGVyYWN0LkludGVyYWN0aW9uXT4sXG4gIGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgY29vcmRzPzogSW50ZXJhY3QuUG9pbnQsXG4pIHtcbiAgaWYgKGlzLmZ1bmModmFsdWUpKSB7XG4gICAgcmV0dXJuIHJlY3RVdGlscy5yZXNvbHZlUmVjdExpa2UodmFsdWUsIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudCwgW2Nvb3Jkcy54LCBjb29yZHMueSwgaW50ZXJhY3Rpb25dKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZWN0VXRpbHMucmVzb2x2ZVJlY3RMaWtlKHZhbHVlLCBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLmVsZW1lbnQpXG4gIH1cbn1cblxuY29uc3QgZGVmYXVsdHM6IFJlc3RyaWN0T3B0aW9ucyA9IHtcbiAgcmVzdHJpY3Rpb246IG51bGwsXG4gIGVsZW1lbnRSZWN0OiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3Q6IE1vZGlmaWVyTW9kdWxlPFJlc3RyaWN0T3B0aW9ucywgUmVzdHJpY3RTdGF0ZT4gPSB7XG4gIHN0YXJ0LFxuICBzZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIocmVzdHJpY3QsICdyZXN0cmljdCcpXG5leHBvcnQgeyByZXN0cmljdCB9XG4iLCIvLyBUaGlzIG1vZHVsZSBhZGRzIHRoZSBvcHRpb25zLnJlc2l6ZS5yZXN0cmljdEVkZ2VzIHNldHRpbmcgd2hpY2ggc2V0cyBtaW4gYW5kXG4vLyBtYXggZm9yIHRoZSB0b3AsIGxlZnQsIGJvdHRvbSBhbmQgcmlnaHQgZWRnZXMgb2YgdGhlIHRhcmdldCBiZWluZyByZXNpemVkLlxuLy9cbi8vIGludGVyYWN0KHRhcmdldCkucmVzaXplKHtcbi8vICAgZWRnZXM6IHsgdG9wOiB0cnVlLCBsZWZ0OiB0cnVlIH0sXG4vLyAgIHJlc3RyaWN0RWRnZXM6IHtcbi8vICAgICBpbm5lcjogeyB0b3A6IDIwMCwgbGVmdDogMjAwLCByaWdodDogNDAwLCBib3R0b206IDQwMCB9LFxuLy8gICAgIG91dGVyOiB7IHRvcDogICAwLCBsZWZ0OiAgIDAsIHJpZ2h0OiA2MDAsIGJvdHRvbTogNjAwIH0sXG4vLyAgIH0sXG4vLyB9KVxuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBnZXRSZXN0cmljdGlvblJlY3QsIFJlc3RyaWN0T3B0aW9ucyB9IGZyb20gJy4vcG9pbnRlcidcblxuZXhwb3J0IGludGVyZmFjZSBSZXN0cmljdEVkZ2VzT3B0aW9ucyB7XG4gIGlubmVyOiBSZXN0cmljdE9wdGlvbnNbJ3Jlc3RyaWN0aW9uJ11cbiAgb3V0ZXI6IFJlc3RyaWN0T3B0aW9uc1sncmVzdHJpY3Rpb24nXVxuICBvZmZzZXQ/OiBSZXN0cmljdE9wdGlvbnNbJ29mZnNldCddXG4gIGVuZE9ubHk6IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgUmVzdHJpY3RFZGdlc1N0YXRlID0gTW9kaWZpZXJTdGF0ZTxSZXN0cmljdEVkZ2VzT3B0aW9ucywge1xuICBpbm5lcjogSW50ZXJhY3QuUmVjdFxuICBvdXRlcjogSW50ZXJhY3QuUmVjdFxuICBvZmZzZXQ6IFJlc3RyaWN0RWRnZXNPcHRpb25zWydvZmZzZXQnXVxufT5cblxuY29uc3Qgbm9Jbm5lciA9IHsgdG9wOiArSW5maW5pdHksIGxlZnQ6ICtJbmZpbml0eSwgYm90dG9tOiAtSW5maW5pdHksIHJpZ2h0OiAtSW5maW5pdHkgfVxuY29uc3Qgbm9PdXRlciA9IHsgdG9wOiAtSW5maW5pdHksIGxlZnQ6IC1JbmZpbml0eSwgYm90dG9tOiArSW5maW5pdHksIHJpZ2h0OiArSW5maW5pdHkgfVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpbnRlcmFjdGlvbiwgc3RhcnRPZmZzZXQsIHN0YXRlIH06IE1vZGlmaWVyQXJnPFJlc3RyaWN0RWRnZXNTdGF0ZT4pIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBsZXQgb2Zmc2V0XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBjb25zdCBvZmZzZXRSZWN0ID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMub2Zmc2V0LCBpbnRlcmFjdGlvbiwgaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UpXG5cbiAgICBvZmZzZXQgPSByZWN0VXRpbHMucmVjdFRvWFkob2Zmc2V0UmVjdClcbiAgfVxuXG4gIG9mZnNldCA9IG9mZnNldCB8fCB7IHg6IDAsIHk6IDAgfVxuXG4gIHN0YXRlLm9mZnNldCA9IHtcbiAgICB0b3A6ICAgIG9mZnNldC55ICsgc3RhcnRPZmZzZXQudG9wLFxuICAgIGxlZnQ6ICAgb2Zmc2V0LnggKyBzdGFydE9mZnNldC5sZWZ0LFxuICAgIGJvdHRvbTogb2Zmc2V0LnkgLSBzdGFydE9mZnNldC5ib3R0b20sXG4gICAgcmlnaHQ6ICBvZmZzZXQueCAtIHN0YXJ0T2Zmc2V0LnJpZ2h0LFxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCAoeyBjb29yZHMsIGVkZ2VzLCBpbnRlcmFjdGlvbiwgc3RhdGUgfTogTW9kaWZpZXJBcmc8UmVzdHJpY3RFZGdlc1N0YXRlPikge1xuICBjb25zdCB7IG9mZnNldCwgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYWdlID0gZXh0ZW5kKHt9LCBjb29yZHMpXG4gIGNvbnN0IGlubmVyID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMuaW5uZXIsIGludGVyYWN0aW9uLCBwYWdlKSB8fCB7fSBhcyBJbnRlcmFjdC5SZWN0XG4gIGNvbnN0IG91dGVyID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMub3V0ZXIsIGludGVyYWN0aW9uLCBwYWdlKSB8fCB7fSBhcyBJbnRlcmFjdC5SZWN0XG5cbiAgZml4UmVjdChpbm5lciwgbm9Jbm5lcilcbiAgZml4UmVjdChvdXRlciwgbm9PdXRlcilcblxuICBpZiAoZWRnZXMudG9wKSB7XG4gICAgY29vcmRzLnkgPSBNYXRoLm1pbihNYXRoLm1heChvdXRlci50b3AgICAgKyBvZmZzZXQudG9wLCAgICBwYWdlLnkpLCBpbm5lci50b3AgICAgKyBvZmZzZXQudG9wKVxuICB9XG4gIGVsc2UgaWYgKGVkZ2VzLmJvdHRvbSkge1xuICAgIGNvb3Jkcy55ID0gTWF0aC5tYXgoTWF0aC5taW4ob3V0ZXIuYm90dG9tICsgb2Zmc2V0LmJvdHRvbSwgcGFnZS55KSwgaW5uZXIuYm90dG9tICsgb2Zmc2V0LmJvdHRvbSlcbiAgfVxuICBpZiAoZWRnZXMubGVmdCkge1xuICAgIGNvb3Jkcy54ID0gTWF0aC5taW4oTWF0aC5tYXgob3V0ZXIubGVmdCAgICsgb2Zmc2V0LmxlZnQsICAgcGFnZS54KSwgaW5uZXIubGVmdCAgICsgb2Zmc2V0LmxlZnQpXG4gIH1cbiAgZWxzZSBpZiAoZWRnZXMucmlnaHQpIHtcbiAgICBjb29yZHMueCA9IE1hdGgubWF4KE1hdGgubWluKG91dGVyLnJpZ2h0ICArIG9mZnNldC5yaWdodCwgIHBhZ2UueCksIGlubmVyLnJpZ2h0ICArIG9mZnNldC5yaWdodClcbiAgfVxufVxuXG5mdW5jdGlvbiBmaXhSZWN0IChyZWN0LCBkZWZhdWx0cykge1xuICBmb3IgKGNvbnN0IGVkZ2Ugb2YgWyd0b3AnLCAnbGVmdCcsICdib3R0b20nLCAncmlnaHQnXSkge1xuICAgIGlmICghKGVkZ2UgaW4gcmVjdCkpIHtcbiAgICAgIHJlY3RbZWRnZV0gPSBkZWZhdWx0c1tlZGdlXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWN0XG59XG5cbmNvbnN0IGRlZmF1bHRzOiBSZXN0cmljdEVkZ2VzT3B0aW9ucyA9IHtcbiAgaW5uZXI6IG51bGwsXG4gIG91dGVyOiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3RFZGdlcyA9IHtcbiAgbm9Jbm5lcixcbiAgbm9PdXRlcixcbiAgc3RhcnQsXG4gIHNldCxcbiAgZGVmYXVsdHMsXG59XG5cbmV4cG9ydCBkZWZhdWx0IG1ha2VNb2RpZmllcihyZXN0cmljdEVkZ2VzLCAncmVzdHJpY3RFZGdlcycpXG5leHBvcnQgeyByZXN0cmljdEVkZ2VzIH1cbiIsImltcG9ydCBleHRlbmQgZnJvbSAnLi4vLi4vdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IHsgcmVzdHJpY3QgfSBmcm9tICcuL3BvaW50ZXInXG5pbXBvcnQgeyBtYWtlTW9kaWZpZXIgfSBmcm9tICcuLi9iYXNlJ1xuXG5jb25zdCBkZWZhdWx0cyA9IGV4dGVuZCh7XG4gIGdldCBlbGVtZW50UmVjdCAoKSB7XG4gICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IDEsIHJpZ2h0OiAxIH1cbiAgfSxcbiAgc2V0IGVsZW1lbnRSZWN0IChfKSB7fSxcbn0sIHJlc3RyaWN0LmRlZmF1bHRzKVxuXG5jb25zdCByZXN0cmljdFJlY3QgPSB7XG4gIHN0YXJ0OiByZXN0cmljdC5zdGFydCxcbiAgc2V0OiByZXN0cmljdC5zZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIocmVzdHJpY3RSZWN0LCAncmVzdHJpY3RSZWN0JylcbmV4cG9ydCB7IHJlc3RyaWN0UmVjdCB9XG4iLCJpbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBSZXN0cmljdEVkZ2VzU3RhdGUsIHJlc3RyaWN0RWRnZXMgfSBmcm9tICcuL2VkZ2VzJ1xuaW1wb3J0IHsgZ2V0UmVzdHJpY3Rpb25SZWN0LCBSZXN0cmljdE9wdGlvbnMgfSBmcm9tICcuL3BvaW50ZXInXG5cbmNvbnN0IG5vTWluID0geyB3aWR0aDogLUluZmluaXR5LCBoZWlnaHQ6IC1JbmZpbml0eSB9XG5jb25zdCBub01heCA9IHsgd2lkdGg6ICtJbmZpbml0eSwgaGVpZ2h0OiArSW5maW5pdHkgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RyaWN0U2l6ZU9wdGlvbnMge1xuICBtaW4/OiBJbnRlcmFjdC5TaXplIHwgSW50ZXJhY3QuUG9pbnQgfCBSZXN0cmljdE9wdGlvbnNbJ3Jlc3RyaWN0aW9uJ11cbiAgbWF4PzogSW50ZXJhY3QuU2l6ZSB8IEludGVyYWN0LlBvaW50IHwgUmVzdHJpY3RPcHRpb25zWydyZXN0cmljdGlvbiddXG4gIGVuZE9ubHk6IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gc3RhcnQgKGFyZzogTW9kaWZpZXJBcmc8UmVzdHJpY3RFZGdlc1N0YXRlPikge1xuICByZXR1cm4gcmVzdHJpY3RFZGdlcy5zdGFydChhcmcpXG59XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0U2l6ZVN0YXRlID1cbiAgUmVzdHJpY3RFZGdlc1N0YXRlICYgTW9kaWZpZXJTdGF0ZTxSZXN0cmljdFNpemVPcHRpb25zICYgeyBpbm5lcjogSW50ZXJhY3QuUmVjdCwgb3V0ZXI6IEludGVyYWN0LlJlY3QgfSwge1xuICAgIG1pbjogSW50ZXJhY3QuUmVjdFxuICAgIG1heDogSW50ZXJhY3QuUmVjdFxuICB9PlxuXG5mdW5jdGlvbiBzZXQgKGFyZzogTW9kaWZpZXJBcmc8UmVzdHJpY3RTaXplU3RhdGU+KSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIHN0YXRlLCByZWN0LCBlZGdlcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtaW5TaXplID0gcmVjdFV0aWxzLnRsYnJUb1h5d2goZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMubWluIGFzIGFueSwgaW50ZXJhY3Rpb24sIGFyZy5jb29yZHMpKSB8fCBub01pblxuICBjb25zdCBtYXhTaXplID0gcmVjdFV0aWxzLnRsYnJUb1h5d2goZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMubWF4IGFzIGFueSwgaW50ZXJhY3Rpb24sIGFyZy5jb29yZHMpKSB8fCBub01heFxuXG4gIHN0YXRlLm9wdGlvbnMgPSB7XG4gICAgZW5kT25seTogb3B0aW9ucy5lbmRPbmx5LFxuICAgIGlubmVyOiBleHRlbmQoe30sIHJlc3RyaWN0RWRnZXMubm9Jbm5lciksXG4gICAgb3V0ZXI6IGV4dGVuZCh7fSwgcmVzdHJpY3RFZGdlcy5ub091dGVyKSxcbiAgfVxuXG4gIGlmIChlZGdlcy50b3ApIHtcbiAgICBzdGF0ZS5vcHRpb25zLmlubmVyLnRvcCA9IHJlY3QuYm90dG9tIC0gbWluU2l6ZS5oZWlnaHRcbiAgICBzdGF0ZS5vcHRpb25zLm91dGVyLnRvcCA9IHJlY3QuYm90dG9tIC0gbWF4U2l6ZS5oZWlnaHRcbiAgfVxuICBlbHNlIGlmIChlZGdlcy5ib3R0b20pIHtcbiAgICBzdGF0ZS5vcHRpb25zLmlubmVyLmJvdHRvbSA9IHJlY3QudG9wICsgbWluU2l6ZS5oZWlnaHRcbiAgICBzdGF0ZS5vcHRpb25zLm91dGVyLmJvdHRvbSA9IHJlY3QudG9wICsgbWF4U2l6ZS5oZWlnaHRcbiAgfVxuICBpZiAoZWRnZXMubGVmdCkge1xuICAgIHN0YXRlLm9wdGlvbnMuaW5uZXIubGVmdCA9IHJlY3QucmlnaHQgLSBtaW5TaXplLndpZHRoXG4gICAgc3RhdGUub3B0aW9ucy5vdXRlci5sZWZ0ID0gcmVjdC5yaWdodCAtIG1heFNpemUud2lkdGhcbiAgfVxuICBlbHNlIGlmIChlZGdlcy5yaWdodCkge1xuICAgIHN0YXRlLm9wdGlvbnMuaW5uZXIucmlnaHQgPSByZWN0LmxlZnQgKyBtaW5TaXplLndpZHRoXG4gICAgc3RhdGUub3B0aW9ucy5vdXRlci5yaWdodCA9IHJlY3QubGVmdCArIG1heFNpemUud2lkdGhcbiAgfVxuXG4gIHJlc3RyaWN0RWRnZXMuc2V0KGFyZylcblxuICBzdGF0ZS5vcHRpb25zID0gb3B0aW9uc1xufVxuXG5jb25zdCBkZWZhdWx0czogUmVzdHJpY3RTaXplT3B0aW9ucyA9IHtcbiAgbWluOiBudWxsLFxuICBtYXg6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3RTaXplID0ge1xuICBzdGFydCxcbiAgc2V0LFxuICBkZWZhdWx0cyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHJlc3RyaWN0U2l6ZSwgJ3Jlc3RyaWN0U2l6ZScpXG5leHBvcnQgeyByZXN0cmljdFNpemUgfVxuIiwiaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaW5kZXgnXG5pbXBvcnQgeyBNb2RpZmllckFyZywgTW9kaWZpZXJTdGF0ZSwgbWFrZU1vZGlmaWVyIH0gZnJvbSAnLi4vYmFzZSdcblxuZXhwb3J0IGludGVyZmFjZSBPZmZzZXQge1xuICB4OiBudW1iZXJcbiAgeTogbnVtYmVyXG4gIGluZGV4OiBudW1iZXJcbiAgcmVsYXRpdmVQb2ludD86IEludGVyYWN0LlBvaW50XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU25hcFBvc2l0aW9uIHtcbiAgeD86IG51bWJlclxuICB5PzogbnVtYmVyXG4gIHJhbmdlPzogbnVtYmVyXG4gIG9mZnNldD86IE9mZnNldFxuICBbaW5kZXg6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgdHlwZSBTbmFwRnVuY3Rpb24gPSAoXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sXG4gIG9mZnNldDogT2Zmc2V0LFxuICBpbmRleDogbnVtYmVyXG4pID0+IFNuYXBQb3NpdGlvblxuZXhwb3J0IHR5cGUgU25hcFRhcmdldCA9IFNuYXBQb3NpdGlvbiB8IFNuYXBGdW5jdGlvblxuZXhwb3J0IGludGVyZmFjZSBTbmFwT3B0aW9ucyB7XG4gIHRhcmdldHM6IFNuYXBUYXJnZXRbXVxuICAvLyB0YXJnZXQgcmFuZ2VcbiAgcmFuZ2U6IG51bWJlclxuICAvLyBzZWxmIHBvaW50cyBmb3Igc25hcHBpbmcuIFswLDBdID0gdG9wIGxlZnQsIFsxLDFdID0gYm90dG9tIHJpZ2h0XG4gIHJlbGF0aXZlUG9pbnRzOiBJbnRlcmFjdC5Qb2ludFtdXG4gIC8vIHN0YXJ0Q29vcmRzID0gb2Zmc2V0IHNuYXBwaW5nIGZyb20gZHJhZyBzdGFydCBwYWdlIHBvc2l0aW9uXG4gIG9mZnNldDogSW50ZXJhY3QuUG9pbnQgfCBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbSW50ZXJhY3QuSW50ZXJhY3Rpb25dPiB8ICdzdGFydENvb3JkcydcbiAgb2Zmc2V0V2l0aE9yaWdpbj86IGJvb2xlYW5cbiAgb3JpZ2luOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbSW50ZXJhY3QuRWxlbWVudF0+IHwgSW50ZXJhY3QuUG9pbnRcbiAgZW5kT25seT86IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgU25hcFN0YXRlID0gTW9kaWZpZXJTdGF0ZTxTbmFwT3B0aW9ucywge1xuICBvZmZzZXRzPzogT2Zmc2V0W11cbiAgY2xvc2VzdD86IGFueVxuICB0YXJnZXRGaWVsZHM/OiBzdHJpbmdbXVtdXG59PlxuXG5mdW5jdGlvbiBzdGFydCAoYXJnOiBNb2RpZmllckFyZzxTbmFwU3RhdGU+KSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgcmVjdCwgc3RhdGUsIHN0YXJ0T2Zmc2V0IH0gPSBhcmdcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBjb25zdCBvcmlnaW4gPSBvcHRpb25zLm9mZnNldFdpdGhPcmlnaW5cbiAgICA/IGdldE9yaWdpbihhcmcpXG4gICAgOiB7IHg6IDAsIHk6IDAgfVxuXG4gIGxldCBzbmFwT2Zmc2V0OiBJbnRlcmFjdC5Qb2ludFxuXG4gIGlmIChvcHRpb25zLm9mZnNldCA9PT0gJ3N0YXJ0Q29vcmRzJykge1xuICAgIHNuYXBPZmZzZXQgPSB7XG4gICAgICB4OiBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQucGFnZS54LFxuICAgICAgeTogaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueSxcbiAgICB9XG4gIH1cbiAgZWxzZSAge1xuICAgIGNvbnN0IG9mZnNldFJlY3QgPSB1dGlscy5yZWN0LnJlc29sdmVSZWN0TGlrZShvcHRpb25zLm9mZnNldCBhcyBhbnksIGludGVyYWN0YWJsZSwgZWxlbWVudCwgW2ludGVyYWN0aW9uXSlcblxuICAgIHNuYXBPZmZzZXQgPSB1dGlscy5yZWN0LnJlY3RUb1hZKG9mZnNldFJlY3QpIHx8IHsgeDogMCwgeTogMCB9XG4gICAgc25hcE9mZnNldC54ICs9IG9yaWdpbi54XG4gICAgc25hcE9mZnNldC55ICs9IG9yaWdpbi55XG4gIH1cblxuICBjb25zdCB7IHJlbGF0aXZlUG9pbnRzIH0gPSBvcHRpb25zXG5cbiAgc3RhdGUub2Zmc2V0cyA9IHJlY3QgJiYgcmVsYXRpdmVQb2ludHMgJiYgcmVsYXRpdmVQb2ludHMubGVuZ3RoXG4gICAgPyAgcmVsYXRpdmVQb2ludHMubWFwKChyZWxhdGl2ZVBvaW50LCBpbmRleCkgPT4gKHtcbiAgICAgIGluZGV4LFxuICAgICAgcmVsYXRpdmVQb2ludCxcbiAgICAgIHg6IHN0YXJ0T2Zmc2V0LmxlZnQgLSAocmVjdC53aWR0aCAgKiByZWxhdGl2ZVBvaW50LngpICsgc25hcE9mZnNldC54LFxuICAgICAgeTogc3RhcnRPZmZzZXQudG9wICAtIChyZWN0LmhlaWdodCAqIHJlbGF0aXZlUG9pbnQueSkgKyBzbmFwT2Zmc2V0LnksXG4gICAgfSkpXG4gICAgOiBbdXRpbHMuZXh0ZW5kKHtcbiAgICAgIGluZGV4OiAwLFxuICAgICAgcmVsYXRpdmVQb2ludDogbnVsbCxcbiAgICB9LCBzbmFwT2Zmc2V0KV1cbn1cblxuZnVuY3Rpb24gc2V0IChhcmc6IE1vZGlmaWVyQXJnPFNuYXBTdGF0ZT4pIHtcbiAgY29uc3QgeyBpbnRlcmFjdGlvbiwgY29vcmRzLCBzdGF0ZSB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucywgb2Zmc2V0cyB9ID0gc3RhdGVcblxuICBjb25zdCBvcmlnaW4gPSB1dGlscy5nZXRPcmlnaW5YWShpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLmVsZW1lbnQsIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpXG4gIGNvbnN0IHBhZ2UgPSB1dGlscy5leHRlbmQoe30sIGNvb3JkcylcbiAgY29uc3QgdGFyZ2V0cyA9IFtdXG5cbiAgaWYgKCFvcHRpb25zLm9mZnNldFdpdGhPcmlnaW4pIHtcbiAgICBwYWdlLnggLT0gb3JpZ2luLnhcbiAgICBwYWdlLnkgLT0gb3JpZ2luLnlcbiAgfVxuXG4gIGZvciAoY29uc3Qgb2Zmc2V0IG9mIG9mZnNldHMpIHtcbiAgICBjb25zdCByZWxhdGl2ZVggPSBwYWdlLnggLSBvZmZzZXQueFxuICAgIGNvbnN0IHJlbGF0aXZlWSA9IHBhZ2UueSAtIG9mZnNldC55XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDAsIGxlbiA9IG9wdGlvbnMudGFyZ2V0cy5sZW5ndGg7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzbmFwVGFyZ2V0ID0gb3B0aW9ucy50YXJnZXRzW2luZGV4XVxuICAgICAgbGV0IHRhcmdldFxuXG4gICAgICBpZiAodXRpbHMuaXMuZnVuYyhzbmFwVGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0KHJlbGF0aXZlWCwgcmVsYXRpdmVZLCBpbnRlcmFjdGlvbiwgb2Zmc2V0LCBpbmRleClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0XG4gICAgICB9XG5cbiAgICAgIGlmICghdGFyZ2V0KSB7IGNvbnRpbnVlIH1cblxuICAgICAgdGFyZ2V0cy5wdXNoKHtcbiAgICAgICAgeDogKHV0aWxzLmlzLm51bWJlcih0YXJnZXQueCkgPyB0YXJnZXQueCA6IHJlbGF0aXZlWCkgKyBvZmZzZXQueCxcbiAgICAgICAgeTogKHV0aWxzLmlzLm51bWJlcih0YXJnZXQueSkgPyB0YXJnZXQueSA6IHJlbGF0aXZlWSkgKyBvZmZzZXQueSxcblxuICAgICAgICByYW5nZTogdXRpbHMuaXMubnVtYmVyKHRhcmdldC5yYW5nZSkgPyB0YXJnZXQucmFuZ2UgOiBvcHRpb25zLnJhbmdlLFxuICAgICAgICBzb3VyY2U6IHNuYXBUYXJnZXQsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBvZmZzZXQsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNsb3Nlc3QgPSB7XG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIGluUmFuZ2U6IGZhbHNlLFxuICAgIGRpc3RhbmNlOiAwLFxuICAgIHJhbmdlOiAwLFxuICAgIGRlbHRhOiB7IHg6IDAsIHk6IDAgfSxcbiAgfVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCByYW5nZSA9IHRhcmdldC5yYW5nZVxuICAgIGNvbnN0IGR4ID0gdGFyZ2V0LnggLSBwYWdlLnhcbiAgICBjb25zdCBkeSA9IHRhcmdldC55IC0gcGFnZS55XG4gICAgY29uc3QgZGlzdGFuY2UgPSB1dGlscy5oeXBvdChkeCwgZHkpXG4gICAgbGV0IGluUmFuZ2UgPSBkaXN0YW5jZSA8PSByYW5nZVxuXG4gICAgLy8gSW5maW5pdGUgdGFyZ2V0cyBjb3VudCBhcyBiZWluZyBvdXQgb2YgcmFuZ2VcbiAgICAvLyBjb21wYXJlZCB0byBub24gaW5maW5pdGUgb25lcyB0aGF0IGFyZSBpbiByYW5nZVxuICAgIGlmIChyYW5nZSA9PT0gSW5maW5pdHkgJiYgY2xvc2VzdC5pblJhbmdlICYmIGNsb3Nlc3QucmFuZ2UgIT09IEluZmluaXR5KSB7XG4gICAgICBpblJhbmdlID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIWNsb3Nlc3QudGFyZ2V0IHx8IChpblJhbmdlXG4gICAgICAvLyBpcyB0aGUgY2xvc2VzdCB0YXJnZXQgaW4gcmFuZ2U/XG4gICAgICA/IChjbG9zZXN0LmluUmFuZ2UgJiYgcmFuZ2UgIT09IEluZmluaXR5XG4gICAgICAgIC8vIHRoZSBwb2ludGVyIGlzIHJlbGF0aXZlbHkgZGVlcGVyIGluIHRoaXMgdGFyZ2V0XG4gICAgICAgID8gZGlzdGFuY2UgLyByYW5nZSA8IGNsb3Nlc3QuZGlzdGFuY2UgLyBjbG9zZXN0LnJhbmdlXG4gICAgICAgIC8vIHRoaXMgdGFyZ2V0IGhhcyBJbmZpbml0ZSByYW5nZSBhbmQgdGhlIGNsb3Nlc3QgZG9lc24ndFxuICAgICAgICA6IChyYW5nZSA9PT0gSW5maW5pdHkgJiYgY2xvc2VzdC5yYW5nZSAhPT0gSW5maW5pdHkpIHx8XG4gICAgICAgICAgLy8gT1IgdGhpcyB0YXJnZXQgaXMgY2xvc2VyIHRoYXQgdGhlIHByZXZpb3VzIGNsb3Nlc3RcbiAgICAgICAgICBkaXN0YW5jZSA8IGNsb3Nlc3QuZGlzdGFuY2UpXG4gICAgICAvLyBUaGUgb3RoZXIgaXMgbm90IGluIHJhbmdlIGFuZCB0aGUgcG9pbnRlciBpcyBjbG9zZXIgdG8gdGhpcyB0YXJnZXRcbiAgICAgIDogKCFjbG9zZXN0LmluUmFuZ2UgJiYgZGlzdGFuY2UgPCBjbG9zZXN0LmRpc3RhbmNlKSkpIHtcbiAgICAgIGNsb3Nlc3QudGFyZ2V0ID0gdGFyZ2V0XG4gICAgICBjbG9zZXN0LmRpc3RhbmNlID0gZGlzdGFuY2VcbiAgICAgIGNsb3Nlc3QucmFuZ2UgPSByYW5nZVxuICAgICAgY2xvc2VzdC5pblJhbmdlID0gaW5SYW5nZVxuICAgICAgY2xvc2VzdC5kZWx0YS54ID0gZHhcbiAgICAgIGNsb3Nlc3QuZGVsdGEueSA9IGR5XG4gICAgfVxuICB9XG5cbiAgaWYgKGNsb3Nlc3QuaW5SYW5nZSkge1xuICAgIGNvb3Jkcy54ID0gY2xvc2VzdC50YXJnZXQueFxuICAgIGNvb3Jkcy55ID0gY2xvc2VzdC50YXJnZXQueVxuICB9XG5cbiAgc3RhdGUuY2xvc2VzdCA9IGNsb3Nlc3RcbiAgcmV0dXJuIGNsb3Nlc3Rcbn1cblxuZnVuY3Rpb24gZ2V0T3JpZ2luIChhcmc6IFBhcnRpYWw8TW9kaWZpZXJBcmc8U25hcFN0YXRlPj4pIHtcbiAgY29uc3QgeyBlbGVtZW50IH0gPSBhcmcuaW50ZXJhY3Rpb25cbiAgY29uc3Qgb3B0aW9uc09yaWdpbiA9IHV0aWxzLnJlY3QucmVjdFRvWFkoXG4gICAgdXRpbHMucmVjdC5yZXNvbHZlUmVjdExpa2UoYXJnLnN0YXRlLm9wdGlvbnMub3JpZ2luIGFzIGFueSwgbnVsbCwgbnVsbCwgW2VsZW1lbnRdKSxcbiAgKVxuICBjb25zdCBvcmlnaW4gPSBvcHRpb25zT3JpZ2luIHx8IHV0aWxzLmdldE9yaWdpblhZKFxuICAgIGFyZy5pbnRlcmFjdGFibGUsXG4gICAgZWxlbWVudCxcbiAgICBhcmcuaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSxcbiAgKVxuXG4gIHJldHVybiBvcmlnaW5cbn1cblxuY29uc3QgZGVmYXVsdHM6IFNuYXBPcHRpb25zID0ge1xuICByYW5nZSAgOiBJbmZpbml0eSxcbiAgdGFyZ2V0czogbnVsbCxcbiAgb2Zmc2V0OiBudWxsLFxuICBvZmZzZXRXaXRoT3JpZ2luOiB0cnVlLFxuICBvcmlnaW46IG51bGwsXG4gIHJlbGF0aXZlUG9pbnRzOiBudWxsLFxuICBlbmRPbmx5OiBmYWxzZSxcbiAgZW5hYmxlZDogZmFsc2UsXG59XG5jb25zdCBzbmFwID0ge1xuICBzdGFydCxcbiAgc2V0LFxuICBkZWZhdWx0cyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHNuYXAsICdzbmFwJylcbmV4cG9ydCB7IHNuYXAgfVxuIiwiLy8gVGhpcyBtb2R1bGUgYWxsb3dzIHNuYXBwaW5nIG9mIHRoZSBzaXplIG9mIHRhcmdldHMgZHVyaW5nIHJlc2l6ZVxuLy8gaW50ZXJhY3Rpb25zLlxuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBTbmFwT3B0aW9ucywgU25hcFN0YXRlLCBzbmFwIH0gZnJvbSAnLi9wb2ludGVyJ1xuXG5leHBvcnQgdHlwZSBTbmFwU2l6ZU9wdGlvbnMgPSBQaWNrPFxuU25hcE9wdGlvbnMsXG4ndGFyZ2V0cycgfCAnb2Zmc2V0JyB8ICdlbmRPbmx5JyB8ICdyYW5nZScgfCAnZW5hYmxlZCdcbj5cblxuZnVuY3Rpb24gc3RhcnQgKGFyZzogTW9kaWZpZXJBcmc8U25hcFN0YXRlPikge1xuICBjb25zdCB7IHN0YXRlLCBlZGdlcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7IHJldHVybiBudWxsIH1cblxuICBhcmcuc3RhdGUgPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgdGFyZ2V0czogbnVsbCxcbiAgICAgIHJlbGF0aXZlUG9pbnRzOiBbe1xuICAgICAgICB4OiBlZGdlcy5sZWZ0ID8gMCA6IDEsXG4gICAgICAgIHk6IGVkZ2VzLnRvcCA/IDAgOiAxLFxuICAgICAgfV0sXG4gICAgICBvZmZzZXQ6IG9wdGlvbnMub2Zmc2V0IHx8ICdzZWxmJyxcbiAgICAgIG9yaWdpbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICByYW5nZTogb3B0aW9ucy5yYW5nZSxcbiAgICB9LFxuICB9XG5cbiAgc3RhdGUudGFyZ2V0RmllbGRzID0gc3RhdGUudGFyZ2V0RmllbGRzIHx8IFtcbiAgICBbJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgIFsneCcsICd5J10sXG4gIF1cblxuICBzbmFwLnN0YXJ0KGFyZylcbiAgc3RhdGUub2Zmc2V0cyA9IGFyZy5zdGF0ZS5vZmZzZXRzXG5cbiAgYXJnLnN0YXRlID0gc3RhdGVcbn1cblxuZnVuY3Rpb24gc2V0IChhcmcpIHtcbiAgY29uc3QgeyBpbnRlcmFjdGlvbiwgc3RhdGUsIGNvb3JkcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucywgb2Zmc2V0cyB9ID0gc3RhdGVcbiAgY29uc3QgcmVsYXRpdmUgPSB7XG4gICAgeDogY29vcmRzLnggLSBvZmZzZXRzWzBdLngsXG4gICAgeTogY29vcmRzLnkgLSBvZmZzZXRzWzBdLnksXG4gIH1cblxuICBzdGF0ZS5vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKVxuICBzdGF0ZS5vcHRpb25zLnRhcmdldHMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc25hcFRhcmdldCBvZiAob3B0aW9ucy50YXJnZXRzIHx8IFtdKSkge1xuICAgIGxldCB0YXJnZXRcblxuICAgIGlmIChpcy5mdW5jKHNuYXBUYXJnZXQpKSB7XG4gICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0KHJlbGF0aXZlLngsIHJlbGF0aXZlLnksIGludGVyYWN0aW9uKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRhcmdldCA9IHNuYXBUYXJnZXRcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCkgeyBjb250aW51ZSB9XG5cbiAgICBmb3IgKGNvbnN0IFt4RmllbGQsIHlGaWVsZF0gb2Ygc3RhdGUudGFyZ2V0RmllbGRzKSB7XG4gICAgICBpZiAoeEZpZWxkIGluIHRhcmdldCB8fCB5RmllbGQgaW4gdGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC54ID0gdGFyZ2V0W3hGaWVsZF1cbiAgICAgICAgdGFyZ2V0LnkgPSB0YXJnZXRbeUZpZWxkXVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGUub3B0aW9ucy50YXJnZXRzLnB1c2godGFyZ2V0KVxuICB9XG5cbiAgY29uc3QgcmV0dXJuVmFsdWUgPSBzbmFwLnNldChhcmcpXG5cbiAgc3RhdGUub3B0aW9ucyA9IG9wdGlvbnNcblxuICByZXR1cm4gcmV0dXJuVmFsdWVcbn1cblxuY29uc3QgZGVmYXVsdHM6IFNuYXBTaXplT3B0aW9ucyA9IHtcbiAgcmFuZ2U6IEluZmluaXR5LFxuICB0YXJnZXRzOiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3Qgc25hcFNpemUgPSB7XG4gIHN0YXJ0LFxuICBzZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIoc25hcFNpemUsICdzbmFwU2l6ZScpXG5leHBvcnQgeyBzbmFwU2l6ZSB9XG4iLCIvKipcbiAqIEBtb2R1bGUgbW9kaWZpZXJzL3NuYXBFZGdlc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgYWxsb3dzIHNuYXBwaW5nIG9mIHRoZSBlZGdlcyBvZiB0YXJnZXRzIGR1cmluZyByZXNpemVcbiAqIGludGVyYWN0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJhY3QodGFyZ2V0KS5yZXNpemFibGUoe1xuICogICBzbmFwRWRnZXM6IHtcbiAqICAgICB0YXJnZXRzOiBbaW50ZXJhY3Quc25hcHBlcnMuZ3JpZCh7IHg6IDEwMCwgeTogNTAgfSldLFxuICogICB9LFxuICogfSlcbiAqXG4gKiBpbnRlcmFjdCh0YXJnZXQpLnJlc2l6YWJsZSh7XG4gKiAgIHNuYXBFZGdlczoge1xuICogICAgIHRhcmdldHM6IFtcbiAqICAgICAgIGludGVyYWN0LnNuYXBwZXJzLmdyaWQoe1xuICogICAgICAgIHRvcDogNTAsXG4gKiAgICAgICAgbGVmdDogNTAsXG4gKiAgICAgICAgYm90dG9tOiAxMDAsXG4gKiAgICAgICAgcmlnaHQ6IDEwMCxcbiAqICAgICAgIH0pLFxuICogICAgIF0sXG4gKiAgIH0sXG4gKiB9KVxuICovXG5cbmltcG9ydCBjbG9uZSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9jbG9uZSdcbmltcG9ydCBleHRlbmQgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyTW9kdWxlLCBtYWtlTW9kaWZpZXIgfSBmcm9tICcuLi9iYXNlJ1xuaW1wb3J0IHsgU25hcE9wdGlvbnMsIFNuYXBTdGF0ZSB9IGZyb20gJy4vcG9pbnRlcidcbmltcG9ydCB7IHNuYXBTaXplIH0gZnJvbSAnLi9zaXplJ1xuXG5leHBvcnQgdHlwZSBTbmFwRWRnZXNPcHRpb25zID0gUGljazxTbmFwT3B0aW9ucywgJ3RhcmdldHMnIHwgJ3JhbmdlJyB8ICdvZmZzZXQnIHwgJ2VuZE9ubHknIHwgJ2VuYWJsZWQnPlxuXG5mdW5jdGlvbiBzdGFydCAoYXJnOiBNb2RpZmllckFyZzxTbmFwU3RhdGU+KSB7XG4gIGNvbnN0IHsgZWRnZXMgfSA9IGFyZ1xuXG4gIGlmICghZWRnZXMpIHsgcmV0dXJuIG51bGwgfVxuXG4gIGFyZy5zdGF0ZS50YXJnZXRGaWVsZHMgPSBhcmcuc3RhdGUudGFyZ2V0RmllbGRzIHx8IFtcbiAgICBbZWRnZXMubGVmdCA/ICdsZWZ0JyA6ICdyaWdodCcsIGVkZ2VzLnRvcCA/ICd0b3AnIDogJ2JvdHRvbSddLFxuICBdXG5cbiAgcmV0dXJuIHNuYXBTaXplLnN0YXJ0KGFyZylcbn1cblxuY29uc3Qgc25hcEVkZ2VzOiBNb2RpZmllck1vZHVsZTxTbmFwRWRnZXNPcHRpb25zLCBTbmFwU3RhdGU+ID0ge1xuICBzdGFydCxcbiAgc2V0OiBzbmFwU2l6ZS5zZXQsXG4gIGRlZmF1bHRzOiBleHRlbmQoXG4gICAgY2xvbmUoc25hcFNpemUuZGVmYXVsdHMpLFxuICAgIHtcbiAgICAgIHRhcmdldHM6IG51bGwsXG4gICAgICByYW5nZTogbnVsbCxcbiAgICAgIG9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gICAgfSBhcyBjb25zdCxcbiAgKSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHNuYXBFZGdlcywgJ3NuYXBFZGdlcycpXG5leHBvcnQgeyBzbmFwRWRnZXMgfVxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3BlY3RSYXRpbyB9IGZyb20gJy4vYXNwZWN0UmF0aW8nXG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlc3RyaWN0RWRnZXMgfSBmcm9tICcuL3Jlc3RyaWN0L2VkZ2VzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXN0cmljdCB9IGZyb20gJy4vcmVzdHJpY3QvcG9pbnRlcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVzdHJpY3RSZWN0IH0gZnJvbSAnLi9yZXN0cmljdC9yZWN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXN0cmljdFNpemUgfSBmcm9tICcuL3Jlc3RyaWN0L3NpemUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHNuYXBFZGdlcyB9IGZyb20gJy4vc25hcC9lZGdlcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc25hcCB9IGZyb20gJy4vc25hcC9wb2ludGVyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzbmFwU2l6ZSB9IGZyb20gJy4vc25hcC9zaXplJ1xuIiwiZnVuY3Rpb24gY3JlYXRlR3JpZCAoZ3JpZDogKFBhcnRpYWw8SW50ZXJhY3QuUmVjdD4gfCBJbnRlcmFjdC5Qb2ludCkgJiB7IHJhbmdlPzogbnVtYmVyLCBsaW1pdHM/OiBJbnRlcmFjdC5SZWN0LCBvZmZzZXQ/OiBJbnRlcmFjdC5Qb2ludCB9KSB7XG4gIGNvbnN0IGNvb3JkRmllbGRzID0gKFtcbiAgICBbJ3gnLCAneSddLFxuICAgIFsnbGVmdCcsICd0b3AnXSxcbiAgICBbJ3JpZ2h0JywgJ2JvdHRvbSddLFxuICAgIFsnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIF0gYXMgY29uc3QpLmZpbHRlcigoW3hGaWVsZCwgeUZpZWxkXSkgPT4geEZpZWxkIGluIGdyaWQgfHwgeUZpZWxkIGluIGdyaWQpXG5cbiAgY29uc3QgZ3JpZEZ1bmM6IEludGVyYWN0LlNuYXBGdW5jdGlvbiAmIHtcbiAgICBncmlkOiB0eXBlb2YgZ3JpZFxuICAgIGNvb3JkRmllbGRzOiB0eXBlb2YgY29vcmRGaWVsZHNcbiAgfSA9ICh4LCB5KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmFuZ2UsXG4gICAgICBsaW1pdHMgPSB7XG4gICAgICAgIGxlZnQgIDogLUluZmluaXR5LFxuICAgICAgICByaWdodCA6ICBJbmZpbml0eSxcbiAgICAgICAgdG9wICAgOiAtSW5maW5pdHksXG4gICAgICAgIGJvdHRvbTogIEluZmluaXR5LFxuICAgICAgfSxcbiAgICAgIG9mZnNldCA9IHsgeDogMCwgeTogMCB9LFxuICAgIH0gPSBncmlkXG5cbiAgICBjb25zdCByZXN1bHQ6IEludGVyYWN0LlNuYXBUYXJnZXQgJiB7XG4gICAgICBncmlkOiB0eXBlb2YgZ3JpZFxuICAgIH0gPSB7IHJhbmdlLCBncmlkLCB4OiBudWxsIGFzIG51bWJlciwgeTogbnVsbCBhcyBudW1iZXIgfVxuXG4gICAgZm9yIChjb25zdCBbeEZpZWxkLCB5RmllbGRdIG9mIGNvb3JkRmllbGRzKSB7XG4gICAgICBjb25zdCBncmlkeCA9IE1hdGgucm91bmQoKHggLSBvZmZzZXQueCkgLyAoZ3JpZCBhcyBhbnkpW3hGaWVsZF0pXG4gICAgICBjb25zdCBncmlkeSA9IE1hdGgucm91bmQoKHkgLSBvZmZzZXQueSkgLyAoZ3JpZCBhcyBhbnkpW3lGaWVsZF0pXG5cbiAgICAgIHJlc3VsdFt4RmllbGRdID0gTWF0aC5tYXgobGltaXRzLmxlZnQsIE1hdGgubWluKGxpbWl0cy5yaWdodCwgZ3JpZHggKiAoZ3JpZCBhcyBhbnkpW3hGaWVsZF0gKyBvZmZzZXQueCkpXG4gICAgICByZXN1bHRbeUZpZWxkXSA9IE1hdGgubWF4KGxpbWl0cy50b3AsIE1hdGgubWluKGxpbWl0cy5ib3R0b20sIGdyaWR5ICogKGdyaWQgYXMgYW55KVt5RmllbGRdICsgb2Zmc2V0LnkpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGdyaWRGdW5jLmdyaWQgPSBncmlkXG4gIGdyaWRGdW5jLmNvb3JkRmllbGRzID0gY29vcmRGaWVsZHNcblxuICByZXR1cm4gZ3JpZEZ1bmNcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlR3JpZFxuIiwiaW1wb3J0IGdyaWQgZnJvbSAnLi9ncmlkJ1xuXG5leHBvcnQgeyBncmlkIH1cbiIsImltcG9ydCBiYXNlIGZyb20gJy4vYmFzZSdcblxuaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vYWxsJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBzbmFwcGVycyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9zbmFwcGVycy9pbmRleCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2ludGVyYWN0L2luZGV4JyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdFN0YXRpYyB7XG4gICAgbW9kaWZpZXJzOiB0eXBlb2YgYWxsXG4gICAgc25hcHBlcnM6IHR5cGVvZiBzbmFwcGVyc1xuICAgIGNyZWF0ZVNuYXBHcmlkOiB0eXBlb2Ygc25hcHBlcnMuZ3JpZFxuICB9XG59XG5cbmNvbnN0IG1vZGlmaWVyczogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ21vZGlmaWVycycsXG4gIGluc3RhbGwgKHNjb3BlKSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdCB9ID0gc2NvcGVcblxuICAgIHNjb3BlLnVzZVBsdWdpbihiYXNlKVxuXG4gICAgaW50ZXJhY3QubW9kaWZpZXJzID0gZXh0ZW5kKGludGVyYWN0Lm1vZGlmaWVycyB8fCB7fSwgYWxsKVxuICAgIGludGVyYWN0LnNuYXBwZXJzID0gZXh0ZW5kKGludGVyYWN0LnNuYXBwZXJzIHx8IHt9LCBzbmFwcGVycylcbiAgICBpbnRlcmFjdC5jcmVhdGVTbmFwR3JpZCA9IGludGVyYWN0LnNuYXBwZXJzLmdyaWRcblxuICAgIC8vIGZvciBiYWNrd3JhZHMgY29tcGF0aWJpbGl0eVxuICAgIGZvciAoY29uc3QgdHlwZSBpbiBhbGwpIHtcbiAgICAgIGNvbnN0IHsgX2RlZmF1bHRzLCBfbWV0aG9kcyB9ID0gYWxsW3R5cGUgYXMga2V5b2YgdHlwZW9mIGFsbF1cblxuICAgICAgOyhfZGVmYXVsdHMgYXMgYW55KS5fbWV0aG9kcyA9IF9tZXRob2RzXG4gICAgICA7KHNjb3BlLmRlZmF1bHRzLnBlckFjdGlvbiBhcyBhbnkpW3R5cGVdID0gX2RlZmF1bHRzXG4gICAgfVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBtb2RpZmllcnNcbiIsImltcG9ydCBCYXNlRXZlbnQgZnJvbSAnLi4vY29yZS9CYXNlRXZlbnQnXG5pbXBvcnQgKiBhcyBwb2ludGVyVXRpbHMgZnJvbSAnLi4vdXRpbHMvcG9pbnRlclV0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2ludGVyRXZlbnQ8VCBleHRlbmRzIHN0cmluZyA9IGFueT4gZXh0ZW5kcyBCYXNlRXZlbnQge1xuICB0eXBlOiBUXG4gIG9yaWdpbmFsRXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGVcbiAgcG9pbnRlcklkOiBudW1iZXJcbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuICBkb3VibGU6IGJvb2xlYW5cbiAgcGFnZVg6IG51bWJlclxuICBwYWdlWTogbnVtYmVyXG4gIGNsaWVudFg6IG51bWJlclxuICBjbGllbnRZOiBudW1iZXJcbiAgZHQ6IG51bWJlclxuICBldmVudGFibGU6IGFueVxuICBba2V5OiBzdHJpbmddOiBhbnlcblxuICAvKiogKi9cbiAgY29uc3RydWN0b3IgKFxuICAgIHR5cGU6IFQsXG4gICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PixcbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsXG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICAgIHRpbWVTdGFtcDogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcihpbnRlcmFjdGlvbilcbiAgICBwb2ludGVyVXRpbHMucG9pbnRlckV4dGVuZCh0aGlzLCBldmVudClcblxuICAgIGlmIChldmVudCAhPT0gcG9pbnRlcikge1xuICAgICAgcG9pbnRlclV0aWxzLnBvaW50ZXJFeHRlbmQodGhpcywgcG9pbnRlcilcbiAgICB9XG5cbiAgICB0aGlzLnRpbWVTdGFtcCAgICAgPSB0aW1lU3RhbXBcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBldmVudFxuICAgIHRoaXMudHlwZSAgICAgICAgICA9IHR5cGVcbiAgICB0aGlzLnBvaW50ZXJJZCAgICAgPSBwb2ludGVyVXRpbHMuZ2V0UG9pbnRlcklkKHBvaW50ZXIpXG4gICAgdGhpcy5wb2ludGVyVHlwZSAgID0gcG9pbnRlclV0aWxzLmdldFBvaW50ZXJUeXBlKHBvaW50ZXIpXG4gICAgdGhpcy50YXJnZXQgICAgICAgID0gZXZlbnRUYXJnZXRcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsXG5cbiAgICBpZiAodHlwZSA9PT0gJ3RhcCcpIHtcbiAgICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IGludGVyYWN0aW9uLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuICAgICAgdGhpcy5kdCA9IHRoaXMudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XS5kb3duVGltZVxuXG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24udGFwVGltZVxuXG4gICAgICB0aGlzLmRvdWJsZSA9ICEhKGludGVyYWN0aW9uLnByZXZUYXAgJiZcbiAgICAgICAgaW50ZXJhY3Rpb24ucHJldlRhcC50eXBlICE9PSAnZG91YmxldGFwJyAmJlxuICAgICAgICBpbnRlcmFjdGlvbi5wcmV2VGFwLnRhcmdldCA9PT0gdGhpcy50YXJnZXQgJiZcbiAgICAgICAgaW50ZXJ2YWwgPCA1MDApXG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdkb3VibGV0YXAnKSB7XG4gICAgICB0aGlzLmR0ID0gKHBvaW50ZXIgYXMgUG9pbnRlckV2ZW50PCd0YXAnPikudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24udGFwVGltZVxuICAgIH1cbiAgfVxuXG4gIF9zdWJ0cmFjdE9yaWdpbiAoeyB4OiBvcmlnaW5YLCB5OiBvcmlnaW5ZIH06IEludGVyYWN0LlBvaW50KSB7XG4gICAgdGhpcy5wYWdlWCAgIC09IG9yaWdpblhcbiAgICB0aGlzLnBhZ2VZICAgLT0gb3JpZ2luWVxuICAgIHRoaXMuY2xpZW50WCAtPSBvcmlnaW5YXG4gICAgdGhpcy5jbGllbnRZIC09IG9yaWdpbllcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBfYWRkT3JpZ2luICh7IHg6IG9yaWdpblgsIHk6IG9yaWdpblkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgICB0aGlzLnBhZ2VYICAgKz0gb3JpZ2luWFxuICAgIHRoaXMucGFnZVkgICArPSBvcmlnaW5ZXG4gICAgdGhpcy5jbGllbnRYICs9IG9yaWdpblhcbiAgICB0aGlzLmNsaWVudFkgKz0gb3JpZ2luWVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgb3JpZ2luYWwgRXZlbnRcbiAgICovXG4gIHByZXZlbnREZWZhdWx0ICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG59XG5cbmV4cG9ydCB7IFBvaW50ZXJFdmVudCB9XG4iLCJpbXBvcnQgeyBQZXJBY3Rpb25EZWZhdWx0cyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgRXZlbnRhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvRXZlbnRhYmxlJ1xuaW1wb3J0IEludGVyYWN0aW9uIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBQb2ludGVyRXZlbnQgZnJvbSAnLi9Qb2ludGVyRXZlbnQnXG5cbmV4cG9ydCB0eXBlIEV2ZW50VGFyZ2V0TGlzdCA9IEFycmF5PHtcbiAgbm9kZTogTm9kZVxuICBldmVudGFibGU6IEV2ZW50YWJsZVxuICBwcm9wczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufT5cblxuZXhwb3J0IGludGVyZmFjZSBQb2ludGVyRXZlbnRPcHRpb25zIGV4dGVuZHMgUGVyQWN0aW9uRGVmYXVsdHMge1xuICBlbmFibGVkPzogdW5kZWZpbmVkIC8vIG5vdCB1c2VkXG4gIGhvbGREdXJhdGlvbj86IG51bWJlclxuICBpZ25vcmVGcm9tPzogYW55XG4gIGFsbG93RnJvbT86IGFueVxuICBvcmlnaW4/OiBJbnRlcmFjdC5Qb2ludCB8IHN0cmluZyB8IEludGVyYWN0LkVsZW1lbnRcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNjb3BlIHtcbiAgICBwb2ludGVyRXZlbnRzOiB0eXBlb2YgcG9pbnRlckV2ZW50c1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgcHJldlRhcD86IFBvaW50ZXJFdmVudDxzdHJpbmc+XG4gICAgdGFwVGltZT86IG51bWJlclxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL1BvaW50ZXJJbmZvJyB7XG4gIGludGVyZmFjZSBQb2ludGVySW5mbyB7XG4gICAgaG9sZD86IHtcbiAgICAgIGR1cmF0aW9uOiBudW1iZXJcbiAgICAgIHRpbWVvdXQ6IGFueVxuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xuICAgIHBvaW50ZXJFdmVudHM6IEludGVyYWN0Lk9wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ3BvaW50ZXJFdmVudHM6bmV3JzogeyBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+IH1cbiAgICAncG9pbnRlckV2ZW50czpmaXJlZCc6IHtcbiAgICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblxuICAgICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICAgICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICAgICAgZXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gICAgICBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICB0YXJnZXRzPzogRXZlbnRUYXJnZXRMaXN0XG4gICAgICB0eXBlOiBzdHJpbmdcbiAgICB9XG4gICAgJ3BvaW50ZXJFdmVudHM6Y29sbGVjdC10YXJnZXRzJzoge1xuICAgICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uXG4gICAgICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgICAgIHRhcmdldHM/OiBFdmVudFRhcmdldExpc3RcbiAgICAgIHR5cGU6IHN0cmluZ1xuICAgICAgcGF0aDogTm9kZVtdXG4gICAgICBub2RlOiBudWxsXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlZmF1bHRzOiBQb2ludGVyRXZlbnRPcHRpb25zID0ge1xuICBob2xkRHVyYXRpb246IDYwMCxcbiAgaWdub3JlRnJvbSAgOiBudWxsLFxuICBhbGxvd0Zyb20gICA6IG51bGwsXG4gIG9yaWdpbiAgICAgIDogeyB4OiAwLCB5OiAwIH0sXG59XG5cbmNvbnN0IHBvaW50ZXJFdmVudHMgPSB7XG4gIGlkOiAncG9pbnRlci1ldmVudHMvYmFzZScsXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogYWRkSW50ZXJhY3Rpb25Qcm9wcyxcbiAgICAnaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJzogYWRkSG9sZEluZm8sXG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogbW92ZUFuZENsZWFySG9sZCxcbiAgICAnaW50ZXJhY3Rpb25zOmRvd24nOiAoYXJnLCBzY29wZSkgPT4ge1xuICAgICAgZG93bkFuZFN0YXJ0SG9sZChhcmcsIHNjb3BlKVxuICAgICAgZmlyZShhcmcsIHNjb3BlKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczp1cCc6IChhcmcsIHNjb3BlKSA9PiB7XG4gICAgICBjbGVhckhvbGQoYXJnKVxuICAgICAgZmlyZShhcmcsIHNjb3BlKVxuICAgICAgdGFwQWZ0ZXJVcChhcmcsIHNjb3BlKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczpjYW5jZWwnOiAoYXJnLCBzY29wZSkgPT4ge1xuICAgICAgY2xlYXJIb2xkKGFyZylcbiAgICAgIGZpcmUoYXJnLCBzY29wZSlcbiAgICB9LFxuICB9LFxuICBQb2ludGVyRXZlbnQsXG4gIGZpcmUsXG4gIGNvbGxlY3RFdmVudFRhcmdldHMsXG4gIGRlZmF1bHRzLFxuICB0eXBlczoge1xuICAgIGRvd246IHRydWUsXG4gICAgbW92ZTogdHJ1ZSxcbiAgICB1cDogdHJ1ZSxcbiAgICBjYW5jZWw6IHRydWUsXG4gICAgdGFwOiB0cnVlLFxuICAgIGRvdWJsZXRhcDogdHJ1ZSxcbiAgICBob2xkOiB0cnVlLFxuICB9IGFzIHsgW3R5cGU6IHN0cmluZ106IHRydWUgfSxcbn1cblxuZnVuY3Rpb24gZmlyZTxUIGV4dGVuZHMgc3RyaW5nPiAoXG4gIGFyZzoge1xuICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIHwgUG9pbnRlckV2ZW50PGFueT5cbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgZXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uXG4gICAgdHlwZTogVFxuICAgIHRhcmdldHM/OiBFdmVudFRhcmdldExpc3RcbiAgfSxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlcmFjdGlvbixcbiAgICBwb2ludGVyLFxuICAgIGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0LFxuICAgIHR5cGUsXG4gICAgdGFyZ2V0cyA9IGNvbGxlY3RFdmVudFRhcmdldHMoYXJnLCBzY29wZSksXG4gIH0gPSBhcmdcblxuICBjb25zdCBwb2ludGVyRXZlbnQgPSBuZXcgUG9pbnRlckV2ZW50KHR5cGUsIHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgaW50ZXJhY3Rpb24sIHNjb3BlLm5vdygpKVxuXG4gIHNjb3BlLmZpcmUoJ3BvaW50ZXJFdmVudHM6bmV3JywgeyBwb2ludGVyRXZlbnQgfSlcblxuICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgaW50ZXJhY3Rpb24sXG4gICAgcG9pbnRlcixcbiAgICBldmVudCxcbiAgICBldmVudFRhcmdldCxcbiAgICB0YXJnZXRzLFxuICAgIHR5cGUsXG4gICAgcG9pbnRlckV2ZW50LFxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0c1tpXVxuXG4gICAgZm9yIChjb25zdCBwcm9wIGluIHRhcmdldC5wcm9wcyB8fCB7fSkge1xuICAgICAgKHBvaW50ZXJFdmVudCBhcyBhbnkpW3Byb3BdID0gdGFyZ2V0LnByb3BzW3Byb3BdXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luID0gdXRpbHMuZ2V0T3JpZ2luWFkodGFyZ2V0LmV2ZW50YWJsZSwgdGFyZ2V0Lm5vZGUpXG5cbiAgICBwb2ludGVyRXZlbnQuX3N1YnRyYWN0T3JpZ2luKG9yaWdpbilcbiAgICBwb2ludGVyRXZlbnQuZXZlbnRhYmxlID0gdGFyZ2V0LmV2ZW50YWJsZVxuICAgIHBvaW50ZXJFdmVudC5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0Lm5vZGVcblxuICAgIHRhcmdldC5ldmVudGFibGUuZmlyZShwb2ludGVyRXZlbnQpXG5cbiAgICBwb2ludGVyRXZlbnQuX2FkZE9yaWdpbihvcmlnaW4pXG5cbiAgICBpZiAocG9pbnRlckV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCB8fFxuICAgICAgICAocG9pbnRlckV2ZW50LnByb3BhZ2F0aW9uU3RvcHBlZCAmJlxuICAgICAgICAgICAgKGkgKyAxKSA8IHRhcmdldHMubGVuZ3RoICYmIHRhcmdldHNbaSArIDFdLm5vZGUgIT09IHBvaW50ZXJFdmVudC5jdXJyZW50VGFyZ2V0KSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBzY29wZS5maXJlKCdwb2ludGVyRXZlbnRzOmZpcmVkJywgc2lnbmFsQXJnKVxuXG4gIGlmICh0eXBlID09PSAndGFwJykge1xuICAgIC8vIGlmIHBvaW50ZXJFdmVudCBzaG91bGQgbWFrZSBhIGRvdWJsZSB0YXAsIGNyZWF0ZSBhbmQgZmlyZSBhIGRvdWJsZXRhcFxuICAgIC8vIFBvaW50ZXJFdmVudCBhbmQgdXNlIHRoYXQgYXMgdGhlIHByZXZUYXBcbiAgICBjb25zdCBwcmV2VGFwID0gcG9pbnRlckV2ZW50LmRvdWJsZVxuICAgICAgPyBmaXJlKHtcbiAgICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICAgIHBvaW50ZXIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgdHlwZTogJ2RvdWJsZXRhcCcsXG4gICAgICB9LCBzY29wZSlcbiAgICAgIDogcG9pbnRlckV2ZW50XG5cbiAgICBpbnRlcmFjdGlvbi5wcmV2VGFwID0gcHJldlRhcFxuICAgIGludGVyYWN0aW9uLnRhcFRpbWUgPSBwcmV2VGFwLnRpbWVTdGFtcFxuICB9XG5cbiAgcmV0dXJuIHBvaW50ZXJFdmVudFxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RXZlbnRUYXJnZXRzPFQgZXh0ZW5kcyBzdHJpbmc+ICh7IGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHR5cGUgfToge1xuICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb25cbiAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldFxuICB0eXBlOiBUXG59LCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgY29uc3QgcG9pbnRlckluZGV4ID0gaW50ZXJhY3Rpb24uZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG4gIGNvbnN0IHBvaW50ZXJJbmZvID0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XVxuXG4gIC8vIGRvIG5vdCBmaXJlIGEgdGFwIGV2ZW50IGlmIHRoZSBwb2ludGVyIHdhcyBtb3ZlZCBiZWZvcmUgYmVpbmcgbGlmdGVkXG4gIGlmICh0eXBlID09PSAndGFwJyAmJiAoaW50ZXJhY3Rpb24ucG9pbnRlcldhc01vdmVkIHx8XG4gICAgICAvLyBvciBpZiB0aGUgcG9pbnRlcnVwIHRhcmdldCBpcyBkaWZmZXJlbnQgdG8gdGhlIHBvaW50ZXJkb3duIHRhcmdldFxuICAgICAgIShwb2ludGVySW5mbyAmJiBwb2ludGVySW5mby5kb3duVGFyZ2V0ID09PSBldmVudFRhcmdldCkpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBwYXRoID0gdXRpbHMuZG9tLmdldFBhdGgoZXZlbnRUYXJnZXQgYXMgSW50ZXJhY3QuRWxlbWVudCB8IERvY3VtZW50KVxuICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgaW50ZXJhY3Rpb24sXG4gICAgcG9pbnRlcixcbiAgICBldmVudCxcbiAgICBldmVudFRhcmdldCxcbiAgICB0eXBlLFxuICAgIHBhdGgsXG4gICAgdGFyZ2V0czogW10gYXMgRXZlbnRUYXJnZXRMaXN0LFxuICAgIG5vZGU6IG51bGwsXG4gIH1cblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgcGF0aCkge1xuICAgIHNpZ25hbEFyZy5ub2RlID0gbm9kZVxuXG4gICAgc2NvcGUuZmlyZSgncG9pbnRlckV2ZW50czpjb2xsZWN0LXRhcmdldHMnLCBzaWduYWxBcmcpXG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ2hvbGQnKSB7XG4gICAgc2lnbmFsQXJnLnRhcmdldHMgPSBzaWduYWxBcmcudGFyZ2V0cy5maWx0ZXIodGFyZ2V0ID0+XG4gICAgICB0YXJnZXQuZXZlbnRhYmxlLm9wdGlvbnMuaG9sZER1cmF0aW9uID09PSBpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQuZHVyYXRpb24pXG4gIH1cblxuICByZXR1cm4gc2lnbmFsQXJnLnRhcmdldHNcbn1cblxuZnVuY3Rpb24gYWRkSW50ZXJhY3Rpb25Qcm9wcyAoeyBpbnRlcmFjdGlvbiB9KSB7XG4gIGludGVyYWN0aW9uLnByZXZUYXAgPSBudWxsICAgLy8gdGhlIG1vc3QgcmVjZW50IHRhcCBldmVudCBvbiB0aGlzIGludGVyYWN0aW9uXG4gIGludGVyYWN0aW9uLnRhcFRpbWUgPSAwICAgICAvLyB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCB0YXAgZXZlbnRcbn1cblxuZnVuY3Rpb24gYWRkSG9sZEluZm8gKHsgZG93biwgcG9pbnRlckluZm8gfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJ10pIHtcbiAgaWYgKCFkb3duICYmIHBvaW50ZXJJbmZvLmhvbGQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHBvaW50ZXJJbmZvLmhvbGQgPSB7IGR1cmF0aW9uOiBJbmZpbml0eSwgdGltZW91dDogbnVsbCB9XG59XG5cbmZ1bmN0aW9uIGNsZWFySG9sZCAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlckluZGV4IH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzW3BvaW50ZXJJbmRleF0uaG9sZCkge1xuICAgIGNsZWFyVGltZW91dChpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQudGltZW91dClcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQW5kQ2xlYXJIb2xkIChcbiAgeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBkdXBsaWNhdGUgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IHBvaW50ZXJJbmRleCA9IGludGVyYWN0aW9uLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuXG4gIGlmICghZHVwbGljYXRlICYmICghaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93biB8fCBpbnRlcmFjdGlvbi5wb2ludGVyV2FzTW92ZWQpKSB7XG4gICAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24pIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQudGltZW91dClcbiAgICB9XG5cbiAgICBmaXJlKHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgcG9pbnRlcixcbiAgICAgIGV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnQsXG4gICAgICB0eXBlOiAnbW92ZScsXG4gICAgfSwgc2NvcGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gZG93bkFuZFN0YXJ0SG9sZCAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBwb2ludGVySW5kZXggfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHRpbWVyID0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XS5ob2xkXG4gIGNvbnN0IHBhdGggPSB1dGlscy5kb20uZ2V0UGF0aChldmVudFRhcmdldCBhcyBJbnRlcmFjdC5FbGVtZW50IHwgRG9jdW1lbnQpXG4gIGNvbnN0IHNpZ25hbEFyZyA9IHtcbiAgICBpbnRlcmFjdGlvbixcbiAgICBwb2ludGVyLFxuICAgIGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0LFxuICAgIHR5cGU6ICdob2xkJyxcbiAgICB0YXJnZXRzOiBbXSBhcyBFdmVudFRhcmdldExpc3QsXG4gICAgcGF0aCxcbiAgICBub2RlOiBudWxsLFxuICB9XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIHBhdGgpIHtcbiAgICBzaWduYWxBcmcubm9kZSA9IG5vZGVcblxuICAgIHNjb3BlLmZpcmUoJ3BvaW50ZXJFdmVudHM6Y29sbGVjdC10YXJnZXRzJywgc2lnbmFsQXJnKVxuICB9XG5cbiAgaWYgKCFzaWduYWxBcmcudGFyZ2V0cy5sZW5ndGgpIHsgcmV0dXJuIH1cblxuICBsZXQgbWluRHVyYXRpb24gPSBJbmZpbml0eVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHNpZ25hbEFyZy50YXJnZXRzKSB7XG4gICAgY29uc3QgaG9sZER1cmF0aW9uID0gdGFyZ2V0LmV2ZW50YWJsZS5vcHRpb25zLmhvbGREdXJhdGlvblxuXG4gICAgaWYgKGhvbGREdXJhdGlvbiA8IG1pbkR1cmF0aW9uKSB7XG4gICAgICBtaW5EdXJhdGlvbiA9IGhvbGREdXJhdGlvblxuICAgIH1cbiAgfVxuXG4gIHRpbWVyLmR1cmF0aW9uID0gbWluRHVyYXRpb25cbiAgdGltZXIudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGZpcmUoe1xuICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHBvaW50ZXIsXG4gICAgICBldmVudCxcbiAgICAgIHR5cGU6ICdob2xkJyxcbiAgICB9LCBzY29wZSlcbiAgfSwgbWluRHVyYXRpb24pXG59XG5cbmZ1bmN0aW9uIHRhcEFmdGVyVXAgKHsgaW50ZXJhY3Rpb24sIHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCB9OiBJbnRlcmFjdC5TaWduYWxBcmdzWydpbnRlcmFjdGlvbnM6dXAnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGlmICghaW50ZXJhY3Rpb24ucG9pbnRlcldhc01vdmVkKSB7XG4gICAgZmlyZSh7IGludGVyYWN0aW9uLCBldmVudFRhcmdldCwgcG9pbnRlciwgZXZlbnQsIHR5cGU6ICd0YXAnIH0sIHNjb3BlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBzY29wZS5wb2ludGVyRXZlbnRzID0gcG9pbnRlckV2ZW50c1xuICBzY29wZS5kZWZhdWx0cy5hY3Rpb25zLnBvaW50ZXJFdmVudHMgPSBwb2ludGVyRXZlbnRzLmRlZmF1bHRzXG4gIHV0aWxzLmV4dGVuZChzY29wZS5hY3Rpb25zLnBoYXNlbGVzc1R5cGVzLCBwb2ludGVyRXZlbnRzLnR5cGVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCBwb2ludGVyRXZlbnRzXG4iLCJpbXBvcnQgeyBMaXN0ZW5lck1hcCB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgYmFzZVBsdWdpbiBmcm9tICcuL2Jhc2UnXG5pbXBvcnQgUG9pbnRlckV2ZW50IGZyb20gJy4vUG9pbnRlckV2ZW50J1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIGhvbGRJbnRlcnZhbEhhbmRsZT86IGFueVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9wb2ludGVyLWV2ZW50cy9Qb2ludGVyRXZlbnQnIHtcbiAgaW50ZXJmYWNlIFBvaW50ZXJFdmVudDxUIGV4dGVuZHMgc3RyaW5nID0gYW55PiB7XG4gICAgY291bnQ/OiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvYmFzZScge1xuICBpbnRlcmZhY2UgUG9pbnRlckV2ZW50T3B0aW9ucyB7XG4gICAgaG9sZFJlcGVhdEludGVydmFsPzogbnVtYmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIHNjb3BlLnVzZVBsdWdpbihiYXNlUGx1Z2luKVxuXG4gIGNvbnN0IHtcbiAgICBwb2ludGVyRXZlbnRzLFxuICB9ID0gc2NvcGVcblxuICAvLyBkb24ndCByZXBlYXQgYnkgZGVmYXVsdFxuICBwb2ludGVyRXZlbnRzLmRlZmF1bHRzLmhvbGRSZXBlYXRJbnRlcnZhbCA9IDBcbiAgcG9pbnRlckV2ZW50cy50eXBlcy5ob2xkcmVwZWF0ID0gc2NvcGUuYWN0aW9ucy5waGFzZWxlc3NUeXBlcy5ob2xkcmVwZWF0ID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBvbk5ldyAoeyBwb2ludGVyRXZlbnQgfTogeyBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+IH0pIHtcbiAgaWYgKHBvaW50ZXJFdmVudC50eXBlICE9PSAnaG9sZCcpIHsgcmV0dXJuIH1cblxuICBwb2ludGVyRXZlbnQuY291bnQgPSAocG9pbnRlckV2ZW50LmNvdW50IHx8IDApICsgMVxufVxuXG5mdW5jdGlvbiBvbkZpcmVkIChcbiAgeyBpbnRlcmFjdGlvbiwgcG9pbnRlckV2ZW50LCBldmVudFRhcmdldCwgdGFyZ2V0cyB9OiBJbnRlcmFjdC5TaWduYWxBcmdzWydwb2ludGVyRXZlbnRzOmZpcmVkJ10sXG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZSxcbikge1xuICBpZiAocG9pbnRlckV2ZW50LnR5cGUgIT09ICdob2xkJyB8fCAhdGFyZ2V0cy5sZW5ndGgpIHsgcmV0dXJuIH1cblxuICAvLyBnZXQgdGhlIHJlcGVhdCBpbnRlcnZhbCBmcm9tIHRoZSBmaXJzdCBldmVudGFibGVcbiAgY29uc3QgaW50ZXJ2YWwgPSB0YXJnZXRzWzBdLmV2ZW50YWJsZS5vcHRpb25zLmhvbGRSZXBlYXRJbnRlcnZhbFxuXG4gIC8vIGRvbid0IHJlcGVhdCBpZiB0aGUgaW50ZXJ2YWwgaXMgMCBvciBsZXNzXG4gIGlmIChpbnRlcnZhbCA8PSAwKSB7IHJldHVybiB9XG5cbiAgLy8gc2V0IGEgdGltZW91dCB0byBmaXJlIHRoZSBob2xkcmVwZWF0IGV2ZW50XG4gIGludGVyYWN0aW9uLmhvbGRJbnRlcnZhbEhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHNjb3BlLnBvaW50ZXJFdmVudHMuZmlyZSh7XG4gICAgICBpbnRlcmFjdGlvbixcbiAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgdHlwZTogJ2hvbGQnLFxuICAgICAgcG9pbnRlcjogcG9pbnRlckV2ZW50LFxuICAgICAgZXZlbnQ6IHBvaW50ZXJFdmVudCxcbiAgICB9LCBzY29wZSlcbiAgfSwgaW50ZXJ2YWwpXG59XG5cbmZ1bmN0aW9uIGVuZEhvbGRSZXBlYXQgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSkge1xuICAvLyBzZXQgdGhlIGludGVyYWN0aW9uJ3MgaG9sZFN0b3BUaW1lIHByb3BlcnR5XG4gIC8vIHRvIHN0b3AgZnVydGhlciBob2xkUmVwZWF0IGV2ZW50c1xuICBpZiAoaW50ZXJhY3Rpb24uaG9sZEludGVydmFsSGFuZGxlKSB7XG4gICAgY2xlYXJJbnRlcnZhbChpbnRlcmFjdGlvbi5ob2xkSW50ZXJ2YWxIYW5kbGUpXG4gICAgaW50ZXJhY3Rpb24uaG9sZEludGVydmFsSGFuZGxlID0gbnVsbFxuICB9XG59XG5cbmNvbnN0IGhvbGRSZXBlYXQ6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdwb2ludGVyLWV2ZW50cy9ob2xkUmVwZWF0JyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiBbJ21vdmUnLCAndXAnLCAnY2FuY2VsJywgJ2VuZGFsbCddLnJlZHVjZShcbiAgICAoYWNjLCBlbmRlclR5cGVzKSA9PiB7XG4gICAgICAoYWNjIGFzIGFueSlbYHBvaW50ZXJFdmVudHM6JHtlbmRlclR5cGVzfWBdID0gZW5kSG9sZFJlcGVhdFxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sXG4gICAge1xuICAgICAgJ3BvaW50ZXJFdmVudHM6bmV3Jzogb25OZXcsXG4gICAgICAncG9pbnRlckV2ZW50czpmaXJlZCc6IG9uRmlyZWQsXG4gICAgfSBhcyBMaXN0ZW5lck1hcCxcbiAgKSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgaG9sZFJlcGVhdFxuIiwiaW1wb3J0IHsgU2NvcGUgfSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5cbnR5cGUgSW50ZXJhY3RhYmxlID0gaW1wb3J0ICgnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnKS5kZWZhdWx0XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBwb2ludGVyRXZlbnRzOiB0eXBlb2YgcG9pbnRlckV2ZW50c01ldGhvZFxuICAgIF9fYmFja0NvbXBhdE9wdGlvbjogKG9wdGlvbk5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkgPT4gYW55XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IFNjb3BlKSB7XG4gIGNvbnN0IHsgSW50ZXJhY3RhYmxlIH0gPSBzY29wZVxuXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUucG9pbnRlckV2ZW50cyA9IHBvaW50ZXJFdmVudHNNZXRob2RcblxuICBjb25zdCBfX2JhY2tDb21wYXRPcHRpb24gPSBJbnRlcmFjdGFibGUucHJvdG90eXBlLl9iYWNrQ29tcGF0T3B0aW9uXG5cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5fYmFja0NvbXBhdE9wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25OYW1lLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IHJldCA9IF9fYmFja0NvbXBhdE9wdGlvbi5jYWxsKHRoaXMsIG9wdGlvbk5hbWUsIG5ld1ZhbHVlKVxuXG4gICAgaWYgKHJldCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5ldmVudHMub3B0aW9uc1tvcHRpb25OYW1lXSA9IG5ld1ZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJFdmVudHNNZXRob2QgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9uczogYW55KSB7XG4gIGV4dGVuZCh0aGlzLmV2ZW50cy5vcHRpb25zLCBvcHRpb25zKVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmNvbnN0IHBsdWdpbjogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ3BvaW50ZXItZXZlbnRzL2ludGVyYWN0YWJsZVRhcmdldHMnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAncG9pbnRlckV2ZW50czpjb2xsZWN0LXRhcmdldHMnOiAoe1xuICAgICAgdGFyZ2V0cyxcbiAgICAgIG5vZGUsXG4gICAgICB0eXBlLFxuICAgICAgZXZlbnRUYXJnZXQsXG4gICAgfSwgc2NvcGUpID0+IHtcbiAgICAgIHNjb3BlLmludGVyYWN0YWJsZXMuZm9yRWFjaE1hdGNoKG5vZGUsIChpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSkgPT4ge1xuICAgICAgICBjb25zdCBldmVudGFibGUgPSBpbnRlcmFjdGFibGUuZXZlbnRzXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBldmVudGFibGUub3B0aW9uc1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBldmVudGFibGUudHlwZXNbdHlwZV0gJiZcbiAgICAgICAgICBldmVudGFibGUudHlwZXNbdHlwZV0ubGVuZ3RoICYmXG4gICAgICAgIGludGVyYWN0YWJsZS50ZXN0SWdub3JlQWxsb3cob3B0aW9ucywgbm9kZSwgZXZlbnRUYXJnZXQpKSB7XG4gICAgICAgICAgdGFyZ2V0cy5wdXNoKHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBldmVudGFibGUsXG4gICAgICAgICAgICBwcm9wczogeyBpbnRlcmFjdGFibGUgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3RhYmxlOm5ldyc6ICh7IGludGVyYWN0YWJsZSB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGFibGUuZXZlbnRzLmdldFJlY3QgPSBmdW5jdGlvbiAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3RhYmxlLmdldFJlY3QoZWxlbWVudClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0YWJsZTpzZXQnOiAoeyBpbnRlcmFjdGFibGUsIG9wdGlvbnMgfSwgc2NvcGUpID0+IHtcbiAgICAgIGV4dGVuZChpbnRlcmFjdGFibGUuZXZlbnRzLm9wdGlvbnMsIHNjb3BlLnBvaW50ZXJFdmVudHMuZGVmYXVsdHMpXG4gICAgICBleHRlbmQoaW50ZXJhY3RhYmxlLmV2ZW50cy5vcHRpb25zLCBvcHRpb25zLnBvaW50ZXJFdmVudHMgfHwge30pXG4gICAgfSxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcGx1Z2luXG4iLCJpbXBvcnQgKiBhcyBwb2ludGVyRXZlbnRzIGZyb20gJy4vYmFzZSdcbmltcG9ydCBob2xkUmVwZWF0IGZyb20gJy4vaG9sZFJlcGVhdCdcbmltcG9ydCBpbnRlcmFjdGFibGVUYXJnZXRzIGZyb20gJy4vaW50ZXJhY3RhYmxlVGFyZ2V0cydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ3BvaW50ZXItZXZlbnRzJyxcbiAgaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gICAgc2NvcGUudXNlUGx1Z2luKHBvaW50ZXJFdmVudHMpXG4gICAgc2NvcGUudXNlUGx1Z2luKGhvbGRSZXBlYXQpXG4gICAgc2NvcGUudXNlUGx1Z2luKGludGVyYWN0YWJsZVRhcmdldHMpXG4gIH0sXG59XG5cbmV4cG9ydCB7XG4gIHBvaW50ZXJFdmVudHMsXG4gIGhvbGRSZXBlYXQsXG4gIGludGVyYWN0YWJsZVRhcmdldHMsXG59XG4iLCJpbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IHsgQWN0aW9uUHJvcHMsIEludGVyYWN0aW9uIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbidcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9zY29wZSdcbmltcG9ydCB7IGFyciwgZXh0ZW5kLCBpcywgcG9pbnRlciBhcyBwb2ludGVyVXRpbHMsIHJlY3QgYXMgcmVjdFV0aWxzLCB3aW4gfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIHJlZmxvdzogKGFjdGlvbjogQWN0aW9uUHJvcHMpID0+IFJldHVyblR5cGU8dHlwZW9mIHJlZmxvdz5cbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIF9yZWZsb3dQcm9taXNlOiBQcm9taXNlPHZvaWQ+XG4gICAgX3JlZmxvd1Jlc29sdmU6ICgpID0+IHZvaWRcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50JyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgaW50ZXJmYWNlIFBoYXNlTWFwIHtcbiAgICByZWZsb3c/OiB0cnVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgSW50ZXJhY3RhYmxlLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS5hY3Rpb25zLnBoYXNlcy5yZWZsb3cgPSB0cnVlXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IGludGVyYWN0YWJsZSA9IGludGVyYWN0KHRhcmdldClcbiAgICogY29uc3QgZHJhZyA9IHsgbmFtZTogZHJhZywgYXhpczogJ3gnIH1cbiAgICogY29uc3QgcmVzaXplID0geyBuYW1lOiByZXNpemUsIGVkZ2VzOiB7IGxlZnQ6IHRydWUsIGJvdHRvbTogdHJ1ZSB9XG4gICAqXG4gICAqIGludGVyYWN0YWJsZS5yZWZsb3coZHJhZylcbiAgICogaW50ZXJhY3RhYmxlLnJlZmxvdyhyZXNpemUpXG4gICAqIGBgYFxuICAgKlxuICAgKiBTdGFydCBhbiBhY3Rpb24gc2VxdWVuY2UgdG8gcmUtYXBwbHkgbW9kaWZpZXJzLCBjaGVjayBkcm9wcywgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0geyBPYmplY3QgfSBhY3Rpb24gVGhlIGFjdGlvbiB0byBiZWdpblxuICAgKiBAcGFyYW0geyBzdHJpbmcgfSBhY3Rpb24ubmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG4gICAqIEByZXR1cm5zIHsgUHJvbWlzZSB9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBgSW50ZXJhY3RhYmxlYCB3aGVuIGFjdGlvbnMgb24gYWxsIHRhcmdldHMgaGF2ZSBlbmRlZFxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5yZWZsb3cgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgcmV0dXJuIHJlZmxvdyh0aGlzLCBhY3Rpb24sIHNjb3BlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlZmxvdzxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlLCBhY3Rpb246IEFjdGlvblByb3BzPFQ+LCBzY29wZTogU2NvcGUpOiBQcm9taXNlPEludGVyYWN0YWJsZT4ge1xuICBjb25zdCBlbGVtZW50cyA9IChpcy5zdHJpbmcoaW50ZXJhY3RhYmxlLnRhcmdldClcbiAgICA/IGFyci5mcm9tKGludGVyYWN0YWJsZS5fY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKGludGVyYWN0YWJsZS50YXJnZXQpKVxuICAgIDogW2ludGVyYWN0YWJsZS50YXJnZXRdKSBhcyBJbnRlcmFjdC5FbGVtZW50W11cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgdmFyaWFibGUtbmFtZVxuICBjb25zdCBQcm9taXNlID0gKHdpbi53aW5kb3cgYXMgYW55KS5Qcm9taXNlXG4gIGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlPG51bGw+PiB8IG51bGwgPSBQcm9taXNlID8gW10gOiBudWxsXG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgcmVjdCA9IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50KVxuXG4gICAgaWYgKCFyZWN0KSB7IGJyZWFrIH1cblxuICAgIGNvbnN0IHJ1bm5pbmdJbnRlcmFjdGlvbiA9IGFyci5maW5kKFxuICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QsXG4gICAgICAoaW50ZXJhY3Rpb246IEludGVyYWN0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpICYmXG4gICAgICAgICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlID09PSBpbnRlcmFjdGFibGUgJiZcbiAgICAgICAgICBpbnRlcmFjdGlvbi5lbGVtZW50ID09PSBlbGVtZW50ICYmXG4gICAgICAgICAgaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSA9PT0gYWN0aW9uLm5hbWVcbiAgICAgIH0pXG4gICAgbGV0IHJlZmxvd1Byb21pc2U6IFByb21pc2U8bnVsbD5cblxuICAgIGlmIChydW5uaW5nSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJ1bm5pbmdJbnRlcmFjdGlvbi5tb3ZlKClcblxuICAgICAgaWYgKHByb21pc2VzKSB7XG4gICAgICAgIHJlZmxvd1Byb21pc2UgPSBydW5uaW5nSW50ZXJhY3Rpb24uX3JlZmxvd1Byb21pc2UgfHwgbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgIHJ1bm5pbmdJbnRlcmFjdGlvbi5fcmVmbG93UmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB4eXdoID0gcmVjdFV0aWxzLnRsYnJUb1h5d2gocmVjdClcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgcGFnZSAgICAgOiB7IHg6IHh5d2gueCwgeTogeHl3aC55IH0sXG4gICAgICAgIGNsaWVudCAgIDogeyB4OiB4eXdoLngsIHk6IHh5d2gueSB9LFxuICAgICAgICB0aW1lU3RhbXA6IHNjb3BlLm5vdygpLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBldmVudCA9IHBvaW50ZXJVdGlscy5jb29yZHNUb0V2ZW50KGNvb3JkcylcbiAgICAgIHJlZmxvd1Byb21pc2UgPSBzdGFydFJlZmxvdzxUPihzY29wZSwgaW50ZXJhY3RhYmxlLCBlbGVtZW50LCBhY3Rpb24sIGV2ZW50KVxuICAgIH1cblxuICAgIGlmIChwcm9taXNlcykge1xuICAgICAgcHJvbWlzZXMucHVzaChyZWZsb3dQcm9taXNlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcm9taXNlcyAmJiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiBpbnRlcmFjdGFibGUpXG59XG5cbmZ1bmN0aW9uIHN0YXJ0UmVmbG93PFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiAoc2NvcGU6IFNjb3BlLCBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSwgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCwgYWN0aW9uOiBBY3Rpb25Qcm9wczxUPiwgZXZlbnQ6IGFueSkge1xuICBjb25zdCBpbnRlcmFjdGlvbiA9IHNjb3BlLmludGVyYWN0aW9ucy5uZXcoeyBwb2ludGVyVHlwZTogJ3JlZmxvdycgfSlcbiAgY29uc3Qgc2lnbmFsQXJnID0ge1xuICAgIGludGVyYWN0aW9uLFxuICAgIGV2ZW50LFxuICAgIHBvaW50ZXI6IGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0OiBlbGVtZW50LFxuICAgIHBoYXNlOiAncmVmbG93JyxcbiAgfSBhcyBjb25zdFxuXG4gIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICBpbnRlcmFjdGlvbi5lbGVtZW50ID0gZWxlbWVudFxuICBpbnRlcmFjdGlvbi5wcmVwYXJlZCA9IGV4dGVuZCh7fSwgYWN0aW9uKVxuICBpbnRlcmFjdGlvbi5wcmV2RXZlbnQgPSBldmVudFxuICBpbnRlcmFjdGlvbi51cGRhdGVQb2ludGVyKGV2ZW50LCBldmVudCwgZWxlbWVudCwgdHJ1ZSlcblxuICBpbnRlcmFjdGlvbi5fZG9QaGFzZShzaWduYWxBcmcpXG5cbiAgY29uc3QgcmVmbG93UHJvbWlzZSA9ICh3aW4ud2luZG93IGFzIHVua25vd24gYXMgYW55KS5Qcm9taXNlXG4gICAgPyBuZXcgKHdpbi53aW5kb3cgYXMgdW5rbm93biBhcyBhbnkpLlByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24uX3JlZmxvd1Jlc29sdmUgPSByZXNvbHZlXG4gICAgfSlcbiAgICA6IG51bGxcblxuICBpbnRlcmFjdGlvbi5fcmVmbG93UHJvbWlzZSA9IHJlZmxvd1Byb21pc2VcbiAgaW50ZXJhY3Rpb24uc3RhcnQoYWN0aW9uLCBpbnRlcmFjdGFibGUsIGVsZW1lbnQpXG5cbiAgaWYgKGludGVyYWN0aW9uLl9pbnRlcmFjdGluZykge1xuICAgIGludGVyYWN0aW9uLm1vdmUoc2lnbmFsQXJnKVxuICAgIGludGVyYWN0aW9uLmVuZChldmVudClcbiAgfVxuICBlbHNlIHtcbiAgICBpbnRlcmFjdGlvbi5zdG9wKClcbiAgfVxuXG4gIGludGVyYWN0aW9uLnJlbW92ZVBvaW50ZXIoZXZlbnQsIGV2ZW50KVxuICBpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duID0gZmFsc2VcblxuICByZXR1cm4gcmVmbG93UHJvbWlzZVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAncmVmbG93JyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiB7XG4gICAgLy8gcmVtb3ZlIGNvbXBsZXRlZCByZWZsb3cgaW50ZXJhY3Rpb25zXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogKHsgaW50ZXJhY3Rpb24gfSwgc2NvcGUpID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gJ3JlZmxvdycpIHtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLl9yZWZsb3dSZXNvbHZlKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX3JlZmxvd1Jlc29sdmUoKVxuICAgICAgICB9XG5cbiAgICAgICAgYXJyLnJlbW92ZShzY29wZS5pbnRlcmFjdGlvbnMubGlzdCwgaW50ZXJhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn0gYXMgSW50ZXJhY3QuUGx1Z2luXG4iLCIvKiogQG1vZHVsZSBpbnRlcmFjdCAqL1xuXG5pbXBvcnQgJ0BpbnRlcmFjdGpzL3R5cGVzL2luZGV4J1xuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IHsgaXNOb25OYXRpdmVFdmVudCwgU2NvcGUgfSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJ1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcidcbmltcG9ydCBldmVudHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXZlbnRzJ1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaW5kZXgnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgaW50ZXJhY3Q/OiBJbnRlcmFjdFN0YXRpY1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3RTdGF0aWMge1xuICAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM/OiBPcHRpb25zKTogSW50ZXJhY3RhYmxlXG4gIG9uOiB0eXBlb2Ygb25cbiAgcG9pbnRlck1vdmVUb2xlcmFuY2U6IHR5cGVvZiBwb2ludGVyTW92ZVRvbGVyYW5jZVxuICBzdG9wOiB0eXBlb2Ygc3RvcFxuICBzdXBwb3J0c1BvaW50ZXJFdmVudDogdHlwZW9mIHN1cHBvcnRzUG9pbnRlckV2ZW50XG4gIHN1cHBvcnRzVG91Y2g6IHR5cGVvZiBzdXBwb3J0c1RvdWNoXG4gIGRlYnVnOiB0eXBlb2YgZGVidWdcbiAgb2ZmOiB0eXBlb2Ygb2ZmXG4gIGlzU2V0OiB0eXBlb2YgaXNTZXRcbiAgdXNlOiB0eXBlb2YgdXNlXG4gIGdldFBvaW50ZXJBdmVyYWdlOiB0eXBlb2YgdXRpbHMucG9pbnRlci5wb2ludGVyQXZlcmFnZVxuICBnZXRUb3VjaEJCb3g6IHR5cGVvZiB1dGlscy5wb2ludGVyLnRvdWNoQkJveFxuICBnZXRUb3VjaERpc3RhbmNlOiB0eXBlb2YgdXRpbHMucG9pbnRlci50b3VjaERpc3RhbmNlXG4gIGdldFRvdWNoQW5nbGU6IHR5cGVvZiB1dGlscy5wb2ludGVyLnRvdWNoQW5nbGVcbiAgZ2V0RWxlbWVudFJlY3Q6IHR5cGVvZiB1dGlscy5kb20uZ2V0RWxlbWVudFJlY3RcbiAgZ2V0RWxlbWVudENsaWVudFJlY3Q6IHR5cGVvZiB1dGlscy5kb20uZ2V0RWxlbWVudENsaWVudFJlY3RcbiAgbWF0Y2hlc1NlbGVjdG9yOiB0eXBlb2YgdXRpbHMuZG9tLm1hdGNoZXNTZWxlY3RvclxuICBjbG9zZXN0OiB0eXBlb2YgdXRpbHMuZG9tLmNsb3Nlc3RcbiAgYWRkRG9jdW1lbnQ6IHR5cGVvZiBzY29wZS5hZGREb2N1bWVudFxuICByZW1vdmVEb2N1bWVudDogdHlwZW9mIHNjb3BlLnJlbW92ZURvY3VtZW50XG4gIGR5bmFtaWNEcm9wOiAobmV3VmFsdWU/OiBib29sZWFuKSA9PiBib29sZWFuIHwgSW50ZXJhY3QuaW50ZXJhY3RcbiAgdmVyc2lvbjogc3RyaW5nXG59XG5cbmNvbnN0IGdsb2JhbEV2ZW50czogYW55ID0ge31cbmNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKClcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKHdpbjogV2luZG93KSB7XG4gIHNjb3BlLmluaXQod2luKVxuXG4gIHJldHVybiBpbnRlcmFjdFxufVxuXG4vKipcbiAqIGBgYGpzXG4gKiBpbnRlcmFjdCgnI2RyYWdnYWJsZScpLmRyYWdnYWJsZSh0cnVlKVxuICpcbiAqIHZhciByZWN0YWJsZXMgPSBpbnRlcmFjdCgncmVjdCcpXG4gKiByZWN0YWJsZXNcbiAqICAgLmdlc3R1cmFibGUodHJ1ZSlcbiAqICAgLm9uKCdnZXN0dXJlbW92ZScsIGZ1bmN0aW9uIChldmVudCkge1xuICogICAgICAgLy8gLi4uXG4gKiAgIH0pXG4gKiBgYGBcbiAqXG4gKiBUaGUgbWV0aG9kcyBvZiB0aGlzIHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIHNldCBlbGVtZW50cyBhcyBpbnRlcmFjdGFibGVzXG4gKiBhbmQgYWxzbyB0byBjaGFuZ2UgdmFyaW91cyBkZWZhdWx0IHNldHRpbmdzLlxuICpcbiAqIENhbGxpbmcgaXQgYXMgYSBmdW5jdGlvbiBhbmQgcGFzc2luZyBhbiBlbGVtZW50IG9yIGEgdmFsaWQgQ1NTIHNlbGVjdG9yXG4gKiBzdHJpbmcgcmV0dXJucyBhbiBJbnRlcmFjdGFibGUgb2JqZWN0IHdoaWNoIGhhcyB2YXJpb3VzIG1ldGhvZHMgdG8gY29uZmlndXJlXG4gKiBpdC5cbiAqXG4gKiBAZ2xvYmFsXG4gKlxuICogQHBhcmFtIHtFbGVtZW50IHwgc3RyaW5nfSB0YXJnZXQgVGhlIEhUTUwgb3IgU1ZHIEVsZW1lbnQgdG8gaW50ZXJhY3Qgd2l0aFxuICogb3IgQ1NTIHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9XG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcmFjdDogSW50ZXJhY3RTdGF0aWMgPSBmdW5jdGlvbiBpbnRlcmFjdCAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgbGV0IGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMuZ2V0KHRhcmdldCwgb3B0aW9ucylcblxuICBpZiAoIWludGVyYWN0YWJsZSkge1xuICAgIGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMubmV3KHRhcmdldCwgb3B0aW9ucylcbiAgICBpbnRlcmFjdGFibGUuZXZlbnRzLmdsb2JhbCA9IGdsb2JhbEV2ZW50c1xuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0YWJsZVxufSBhcyBJbnRlcmFjdFN0YXRpY1xuXG4vKipcbiAqIFVzZSBhIHBsdWdpblxuICpcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3QudXNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBsdWdpblxuICogQHBhcmFtIHtmdW5jdGlvbn0gcGx1Z2luLmluc3RhbGxcbiAqIEByZXR1cm4ge2ludGVyYWN0fVxuICovXG5pbnRlcmFjdC51c2UgPSB1c2VcbmZ1bmN0aW9uIHVzZSAocGx1Z2luOiBJbnRlcmFjdC5QbHVnaW4sIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIHNjb3BlLnVzZVBsdWdpbihwbHVnaW4sIG9wdGlvbnMpXG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZWxlbWVudCBvciBzZWxlY3RvciBoYXMgYmVlbiBzZXQgd2l0aCB0aGUge0BsaW5rIGludGVyYWN0fVxuICogZnVuY3Rpb25cbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0LmlzU2V0XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBFbGVtZW50IGJlaW5nIHNlYXJjaGVkIGZvclxuICogQHJldHVybiB7Ym9vbGVhbn0gSW5kaWNhdGVzIGlmIHRoZSBlbGVtZW50IG9yIENTUyBzZWxlY3RvciB3YXMgcHJldmlvdXNseVxuICogcGFzc2VkIHRvIGludGVyYWN0XG4gKi9cbmludGVyYWN0LmlzU2V0ID0gaXNTZXRcbmZ1bmN0aW9uIGlzU2V0ICh0YXJnZXQ6IEludGVyYWN0LkVsZW1lbnQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgcmV0dXJuICEhc2NvcGUuaW50ZXJhY3RhYmxlcy5nZXQodGFyZ2V0LCBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dClcbn1cblxuLyoqXG4gKiBBZGQgYSBnbG9iYWwgbGlzdGVuZXIgZm9yIGFuIEludGVyYWN0RXZlbnQgb3IgYWRkcyBhIERPTSBldmVudCB0byBgZG9jdW1lbnRgXG4gKlxuICogQGFsaWFzIG1vZHVsZTppbnRlcmFjdC5vblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGUgVGhlIHR5cGVzIG9mIGV2ZW50cyB0byBsaXN0ZW4gZm9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gZXZlbnQgKHMpXG4gKiBAcGFyYW0ge29iamVjdCB8IGJvb2xlYW59IFtvcHRpb25zXSBvYmplY3Qgb3IgdXNlQ2FwdHVyZSBmbGFnIGZvclxuICogYWRkRXZlbnRMaXN0ZW5lclxuICogQHJldHVybiB7b2JqZWN0fSBpbnRlcmFjdFxuICovXG5pbnRlcmFjdC5vbiA9IG9uXG5mdW5jdGlvbiBvbiAodHlwZTogc3RyaW5nIHwgSW50ZXJhY3QuRXZlbnRUeXBlcywgbGlzdGVuZXI6IEludGVyYWN0Lkxpc3RlbmVyc0FyZywgb3B0aW9ucz86IG9iamVjdCkge1xuICBpZiAodXRpbHMuaXMuc3RyaW5nKHR5cGUpICYmIHR5cGUuc2VhcmNoKCcgJykgIT09IC0xKSB7XG4gICAgdHlwZSA9IHR5cGUudHJpbSgpLnNwbGl0KC8gKy8pXG4gIH1cblxuICBpZiAodXRpbHMuaXMuYXJyYXkodHlwZSkpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiAodHlwZSBhcyBhbnlbXSkpIHtcbiAgICAgIGludGVyYWN0Lm9uKGV2ZW50VHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0XG4gIH1cblxuICBpZiAodXRpbHMuaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIHR5cGUpIHtcbiAgICAgIGludGVyYWN0Lm9uKHByb3AsICh0eXBlIGFzIGFueSlbcHJvcF0sIGxpc3RlbmVyKVxuICAgIH1cblxuICAgIHJldHVybiBpbnRlcmFjdFxuICB9XG5cbiAgLy8gaWYgaXQgaXMgYW4gSW50ZXJhY3RFdmVudCB0eXBlLCBhZGQgbGlzdGVuZXIgdG8gZ2xvYmFsRXZlbnRzXG4gIGlmIChpc05vbk5hdGl2ZUV2ZW50KHR5cGUsIHNjb3BlLmFjdGlvbnMpKSB7XG4gICAgLy8gaWYgdGhpcyB0eXBlIG9mIGV2ZW50IHdhcyBuZXZlciBib3VuZFxuICAgIGlmICghZ2xvYmFsRXZlbnRzW3R5cGVdKSB7XG4gICAgICBnbG9iYWxFdmVudHNbdHlwZV0gPSBbbGlzdGVuZXJdXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZ2xvYmFsRXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpXG4gICAgfVxuICB9XG4gIC8vIElmIG5vbiBJbnRlcmFjdEV2ZW50IHR5cGUsIGFkZEV2ZW50TGlzdGVuZXIgdG8gZG9jdW1lbnRcbiAgZWxzZSB7XG4gICAgZXZlbnRzLmFkZChzY29wZS5kb2N1bWVudCwgdHlwZSwgbGlzdGVuZXIgYXMgSW50ZXJhY3QuTGlzdGVuZXIsIHsgb3B0aW9ucyB9KVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGdsb2JhbCBJbnRlcmFjdEV2ZW50IGxpc3RlbmVyIG9yIERPTSBldmVudCBmcm9tIGBkb2N1bWVudGBcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0Lm9mZlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGUgVGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHdlcmUgbGlzdGVuZWRcbiAqIGZvclxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIGJlIHJlbW92ZWRcbiAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gb3B0aW9ucyBbb3B0aW9uc10gb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAqIHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAqIEByZXR1cm4ge29iamVjdH0gaW50ZXJhY3RcbiAqL1xuaW50ZXJhY3Qub2ZmID0gb2ZmXG5mdW5jdGlvbiBvZmYgKHR5cGU6IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyOiBhbnksIG9wdGlvbnM/OiBvYmplY3QpIHtcbiAgaWYgKHV0aWxzLmlzLnN0cmluZyh0eXBlKSAmJiB0eXBlLnNlYXJjaCgnICcpICE9PSAtMSkge1xuICAgIHR5cGUgPSB0eXBlLnRyaW0oKS5zcGxpdCgvICsvKVxuICB9XG5cbiAgaWYgKHV0aWxzLmlzLmFycmF5KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgdHlwZSkge1xuICAgICAgaW50ZXJhY3Qub2ZmKGV2ZW50VHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0XG4gIH1cblxuICBpZiAodXRpbHMuaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIHR5cGUpIHtcbiAgICAgIGludGVyYWN0Lm9mZihwcm9wLCB0eXBlW3Byb3BdLCBsaXN0ZW5lcilcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJhY3RcbiAgfVxuXG4gIGlmIChpc05vbk5hdGl2ZUV2ZW50KHR5cGUsIHNjb3BlLmFjdGlvbnMpKSB7XG4gICAgbGV0IGluZGV4XG5cbiAgICBpZiAodHlwZSBpbiBnbG9iYWxFdmVudHMgJiZcbiAgICAgICAgKGluZGV4ID0gZ2xvYmFsRXZlbnRzW3R5cGVdLmluZGV4T2YobGlzdGVuZXIpKSAhPT0gLTEpIHtcbiAgICAgIGdsb2JhbEV2ZW50c1t0eXBlXS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGV2ZW50cy5yZW1vdmUoc2NvcGUuZG9jdW1lbnQsIHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbmludGVyYWN0LmRlYnVnID0gZGVidWdcbmZ1bmN0aW9uIGRlYnVnICgpIHtcbiAgcmV0dXJuIHNjb3BlXG59XG5cbi8vIGV4cG9zZSB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gY2FsY3VsYXRlIG11bHRpLXRvdWNoIHByb3BlcnRpZXNcbmludGVyYWN0LmdldFBvaW50ZXJBdmVyYWdlICA9IHV0aWxzLnBvaW50ZXIucG9pbnRlckF2ZXJhZ2VcbmludGVyYWN0LmdldFRvdWNoQkJveCAgICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94XG5pbnRlcmFjdC5nZXRUb3VjaERpc3RhbmNlICAgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2VcbmludGVyYWN0LmdldFRvdWNoQW5nbGUgICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hBbmdsZVxuXG5pbnRlcmFjdC5nZXRFbGVtZW50UmVjdCAgICAgICA9IHV0aWxzLmRvbS5nZXRFbGVtZW50UmVjdFxuaW50ZXJhY3QuZ2V0RWxlbWVudENsaWVudFJlY3QgPSB1dGlscy5kb20uZ2V0RWxlbWVudENsaWVudFJlY3RcbmludGVyYWN0Lm1hdGNoZXNTZWxlY3RvciAgICAgID0gdXRpbHMuZG9tLm1hdGNoZXNTZWxlY3RvclxuaW50ZXJhY3QuY2xvc2VzdCAgICAgICAgICAgICAgPSB1dGlscy5kb20uY2xvc2VzdFxuXG4vKipcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3Quc3VwcG9ydHNUb3VjaFxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBicm93c2VyIHN1cHBvcnRzIHRvdWNoIGlucHV0XG4gKi9cbmludGVyYWN0LnN1cHBvcnRzVG91Y2ggPSBzdXBwb3J0c1RvdWNoXG5mdW5jdGlvbiBzdXBwb3J0c1RvdWNoICgpIHtcbiAgcmV0dXJuIGJyb3dzZXIuc3VwcG9ydHNUb3VjaFxufVxuXG4vKipcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3Quc3VwcG9ydHNQb2ludGVyRXZlbnRcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgYnJvd3NlciBzdXBwb3J0cyBQb2ludGVyRXZlbnRzXG4gKi9cbmludGVyYWN0LnN1cHBvcnRzUG9pbnRlckV2ZW50ID0gc3VwcG9ydHNQb2ludGVyRXZlbnRcbmZ1bmN0aW9uIHN1cHBvcnRzUG9pbnRlckV2ZW50ICgpIHtcbiAgcmV0dXJuIGJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnRcbn1cblxuLyoqXG4gKiBDYW5jZWxzIGFsbCBpbnRlcmFjdGlvbnMgKGVuZCBldmVudHMgYXJlIG5vdCBmaXJlZClcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0LnN0b3BcbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9IGludGVyYWN0XG4gKi9cbmludGVyYWN0LnN0b3AgPSBzdG9wXG5mdW5jdGlvbiBzdG9wICgpIHtcbiAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgIGludGVyYWN0aW9uLnN0b3AoKVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogUmV0dXJucyBvciBzZXRzIHRoZSBkaXN0YW5jZSB0aGUgcG9pbnRlciBtdXN0IGJlIG1vdmVkIGJlZm9yZSBhbiBhY3Rpb25cbiAqIHNlcXVlbmNlIG9jY3Vycy4gVGhpcyBhbHNvIGFmZmVjdHMgdG9sZXJhbmNlIGZvciB0YXAgZXZlbnRzLlxuICpcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3QucG9pbnRlck1vdmVUb2xlcmFuY2VcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW25ld1ZhbHVlXSBUaGUgbW92ZW1lbnQgZnJvbSB0aGUgc3RhcnQgcG9zaXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZVxuICogQHJldHVybiB7aW50ZXJhY3QgfCBudW1iZXJ9XG4gKi9cbmludGVyYWN0LnBvaW50ZXJNb3ZlVG9sZXJhbmNlID0gcG9pbnRlck1vdmVUb2xlcmFuY2VcbmZ1bmN0aW9uIHBvaW50ZXJNb3ZlVG9sZXJhbmNlIChuZXdWYWx1ZT86IG51bWJlcikge1xuICBpZiAodXRpbHMuaXMubnVtYmVyKG5ld1ZhbHVlKSkge1xuICAgIHNjb3BlLmludGVyYWN0aW9ucy5wb2ludGVyTW92ZVRvbGVyYW5jZSA9IG5ld1ZhbHVlXG5cbiAgICByZXR1cm4gaW50ZXJhY3RcbiAgfVxuXG4gIHJldHVybiBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2Vcbn1cblxuaW50ZXJhY3QuYWRkRG9jdW1lbnQgPSAoZG9jLCBvcHRpb25zKSA9PiBzY29wZS5hZGREb2N1bWVudChkb2MsIG9wdGlvbnMpXG5pbnRlcmFjdC5yZW1vdmVEb2N1bWVudCA9IGRvYyA9PiBzY29wZS5yZW1vdmVEb2N1bWVudChkb2MpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuaW50ZXJhY3QudmVyc2lvbiA9IHByb2Nlc3MuZW52Lm5wbV9wYWNrYWdlX3ZlcnNpb25cblxuc2NvcGUuaW50ZXJhY3QgPSBpbnRlcmFjdFxuXG5leHBvcnQgeyBzY29wZSB9XG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuIiwiaW1wb3J0ICdAaW50ZXJhY3Rqcy90eXBlcy9pbmRleCdcbmltcG9ydCBhY3Rpb25zIGZyb20gJ0BpbnRlcmFjdGpzL2FjdGlvbnMvaW5kZXgnXG5pbXBvcnQgYXV0b1Njcm9sbCBmcm9tICdAaW50ZXJhY3Rqcy9hdXRvLXNjcm9sbC9pbmRleCdcbmltcG9ydCBhdXRvU3RhcnQgZnJvbSAnQGludGVyYWN0anMvYXV0by1zdGFydC9pbmRleCdcbmltcG9ydCBkZXZUb29scyBmcm9tICdAaW50ZXJhY3Rqcy9kZXYtdG9vbHMvaW5kZXgnXG5pbXBvcnQgaW5lcnRpYSBmcm9tICdAaW50ZXJhY3Rqcy9pbmVydGlhL2luZGV4J1xuaW1wb3J0IG1vZGlmaWVycyBmcm9tICdAaW50ZXJhY3Rqcy9tb2RpZmllcnMvaW5kZXgnXG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0BpbnRlcmFjdGpzL29mZnNldCdcbmltcG9ydCBwb2ludGVyRXZlbnRzIGZyb20gJ0BpbnRlcmFjdGpzL3BvaW50ZXItZXZlbnRzL2luZGV4J1xuaW1wb3J0IHJlZmxvdyBmcm9tICdAaW50ZXJhY3Rqcy9yZWZsb3cvaW5kZXgnXG5pbXBvcnQgaW50ZXJhY3QsIHsgaW5pdCBhcyBpbml0SW50ZXJhY3QgfSBmcm9tICdAaW50ZXJhY3Rqcy9pbnRlcmFjdC9pbmRleCdcblxuaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmICEhd2luZG93KSB7XG4gIGluaXQod2luZG93KVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCAod2luOiBXaW5kb3cpIHtcbiAgaW5pdEludGVyYWN0KHdpbilcblxuICBpbnRlcmFjdC51c2Uob2Zmc2V0KVxuXG4gIC8vIHBvaW50ZXJFdmVudHNcbiAgaW50ZXJhY3QudXNlKHBvaW50ZXJFdmVudHMpXG5cbiAgLy8gaW5lcnRpYVxuICBpbnRlcmFjdC51c2UoaW5lcnRpYSlcblxuICAvLyBzbmFwLCByZXNpemUsIGV0Yy5cbiAgaW50ZXJhY3QudXNlKG1vZGlmaWVycylcblxuICAvLyBhdXRvU3RhcnQsIGhvbGRcbiAgaW50ZXJhY3QudXNlKGF1dG9TdGFydClcblxuICAvLyBkcmFnIGFuZCBkcm9wLCByZXNpemUsIGdlc3R1cmVcbiAgaW50ZXJhY3QudXNlKGFjdGlvbnMpXG5cbiAgLy8gYXV0b1Njcm9sbFxuICBpbnRlcmFjdC51c2UoYXV0b1Njcm9sbClcblxuICAvLyByZWZsb3dcbiAgaW50ZXJhY3QudXNlKHJlZmxvdylcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpbnRlcmFjdC51c2UoZGV2VG9vbHMpXG4gIH1cblxuICByZXR1cm4gaW50ZXJhY3Rcbn1cbiIsImltcG9ydCBpbnRlcmFjdCwgeyBpbml0IH0gZnJvbSAnQGludGVyYWN0anMvaW50ZXJhY3Rqcy9pbmRleCdcblxuaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmICEhbW9kdWxlKSB7XG4gIHRyeSB7IG1vZHVsZS5leHBvcnRzID0gaW50ZXJhY3QgfVxuICBjYXRjaCB7fVxufVxuXG4oaW50ZXJhY3QgYXMgYW55KS5kZWZhdWx0ID0gaW50ZXJhY3RcbjsoaW50ZXJhY3QgYXMgYW55KS5pbml0ID0gaW5pdFxuXG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuZXhwb3J0IHsgaW5pdCB9XG4iLCJcbnJldHVybiBfJGluZGV4XzY5O1xuXG59KTtcbiJdfQ== diff --git a/interactjs/dist/interact.js.map.map b/interactjs/dist/interact.js.map.map new file mode 100644 index 000000000..5899104e4 --- /dev/null +++ b/interactjs/dist/interact.js.map.map @@ -0,0 +1 @@ +{"sources":[],"file":"interact.js.map"} \ No newline at end of file diff --git a/interactjs/dist/interact.min.js b/interactjs/dist/interact.min.js new file mode 100644 index 000000000..aa7d5afa2 --- /dev/null +++ b/interactjs/dist/interact.min.js @@ -0,0 +1,10803 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.interact = f()}})(function(){var define,module,exports; +var createModuleFactory = function createModuleFactory(t){var e;return function(r){return e||t(e={exports:{},parent:r},e.exports),e.exports}}; +var _$Interactable_16 = createModuleFactory(function (module, exports) { +"use strict"; + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = exports.Interactable = void 0; + +var arr = _interopRequireWildcard(_$arr_49); + +var _browser = _interopRequireDefault(_$browser_50); + +var _clone = _interopRequireDefault(_$clone_51); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var _events = _interopRequireDefault(_$events_54); + +var _extend = _interopRequireDefault(_$extend_55); + +var is = _interopRequireWildcard(_$is_59); + +var _normalizeListeners = _interopRequireDefault(_$normalizeListeners_61); + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +var _Eventable = _interopRequireDefault(_$Eventable_14); + +var _scope = _$scope_24({}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/** */ +var Interactable = /*#__PURE__*/function () { + _createClass(Interactable, [{ + key: "_defaults", + get: function get() { + return { + base: {}, + perAction: {}, + actions: {} + }; + } + }]); + + /** */ + function Interactable(target, options, defaultContext) { + _classCallCheck(this, Interactable); + + _defineProperty(this, "options", void 0); + + _defineProperty(this, "_actions", void 0); + + _defineProperty(this, "target", void 0); + + _defineProperty(this, "events", new _Eventable["default"]()); + + _defineProperty(this, "_context", void 0); + + _defineProperty(this, "_win", void 0); + + _defineProperty(this, "_doc", void 0); + + this._actions = options.actions; + this.target = target; + this._context = options.context || defaultContext; + this._win = (0, _$window_68.getWindow)((0, _$domUtils_53.trySelector)(target) ? this._context : target); + this._doc = this._win.document; + this.set(options); + } + + _createClass(Interactable, [{ + key: "setOnEvents", + value: function setOnEvents(actionName, phases) { + if (is.func(phases.onstart)) { + this.on("".concat(actionName, "start"), phases.onstart); + } + + if (is.func(phases.onmove)) { + this.on("".concat(actionName, "move"), phases.onmove); + } + + if (is.func(phases.onend)) { + this.on("".concat(actionName, "end"), phases.onend); + } + + if (is.func(phases.oninertiastart)) { + this.on("".concat(actionName, "inertiastart"), phases.oninertiastart); + } + + return this; + } + }, { + key: "updatePerActionListeners", + value: function updatePerActionListeners(actionName, prev, cur) { + if (is.array(prev) || is.object(prev)) { + this.off(actionName, prev); + } + + if (is.array(cur) || is.object(cur)) { + this.on(actionName, cur); + } + } + }, { + key: "setPerAction", + value: function setPerAction(actionName, options) { + var defaults = this._defaults; // for all the default per-action options + + for (var optionName_ in options) { + var optionName = optionName_; + var actionOptions = this.options[actionName]; + var optionValue = options[optionName]; // remove old event listeners and add new ones + + if (optionName === 'listeners') { + this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue); + } // if the option value is an array + + + if (is.array(optionValue)) { + actionOptions[optionName] = arr.from(optionValue); + } // if the option value is an object + else if (is.plainObject(optionValue)) { + // copy the object + actionOptions[optionName] = (0, _extend["default"])(actionOptions[optionName] || {}, (0, _clone["default"])(optionValue)); // set anabled field to true if it exists in the defaults + + if (is.object(defaults.perAction[optionName]) && 'enabled' in defaults.perAction[optionName]) { + actionOptions[optionName].enabled = optionValue.enabled !== false; + } + } // if the option value is a boolean and the default is an object + else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) { + actionOptions[optionName].enabled = optionValue; + } // if it's anything else, do a plain assignment + else { + actionOptions[optionName] = optionValue; + } + } + } + /** + * The default function to get an Interactables bounding rect. Can be + * overridden using {@link Interactable.rectChecker}. + * + * @param {Element} [element] The element to measure. + * @return {object} The object's bounding rectangle. + */ + + }, { + key: "getRect", + value: function getRect(element) { + element = element || (is.element(this.target) ? this.target : null); + + if (is.string(this.target)) { + element = element || this._context.querySelector(this.target); + } + + return (0, _$domUtils_53.getElementRect)(element); + } + /** + * Returns or sets the function used to calculate the interactable's + * element's rectangle + * + * @param {function} [checker] A function which returns this Interactable's + * bounding rectangle. See {@link Interactable.getRect} + * @return {function | object} The checker function or this Interactable + */ + + }, { + key: "rectChecker", + value: function rectChecker(checker) { + if (is.func(checker)) { + this.getRect = checker; + return this; + } + + if (checker === null) { + delete this.getRect; + return this; + } + + return this.getRect; + } + }, { + key: "_backCompatOption", + value: function _backCompatOption(optionName, newValue) { + if ((0, _$domUtils_53.trySelector)(newValue) || is.object(newValue)) { + this.options[optionName] = newValue; + + for (var action in this._actions.map) { + this.options[action][optionName] = newValue; + } + + return this; + } + + return this.options[optionName]; + } + /** + * Gets or sets the origin of the Interactable's element. The x and y + * of the origin will be subtracted from action event coordinates. + * + * @param {Element | object | string} [origin] An HTML or SVG Element whose + * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self' + * or any CSS selector + * + * @return {object} The current origin or this Interactable + */ + + }, { + key: "origin", + value: function origin(newValue) { + return this._backCompatOption('origin', newValue); + } + /** + * Returns or sets the mouse coordinate types used to calculate the + * movement of the pointer. + * + * @param {string} [newValue] Use 'client' if you will be scrolling while + * interacting; Use 'page' if you want autoScroll to work + * @return {string | object} The current deltaSource or this Interactable + */ + + }, { + key: "deltaSource", + value: function deltaSource(newValue) { + if (newValue === 'page' || newValue === 'client') { + this.options.deltaSource = newValue; + return this; + } + + return this.options.deltaSource; + } + /** + * Gets the selector context Node of the Interactable. The default is + * `window.document`. + * + * @return {Node} The context Node of this Interactable + */ + + }, { + key: "context", + value: function context() { + return this._context; + } + }, { + key: "inContext", + value: function inContext(element) { + return this._context === element.ownerDocument || (0, _$domUtils_53.nodeContains)(this._context, element); + } + }, { + key: "testIgnoreAllow", + value: function testIgnoreAllow(options, targetNode, eventTarget) { + return !this.testIgnore(options.ignoreFrom, targetNode, eventTarget) && this.testAllow(options.allowFrom, targetNode, eventTarget); + } + }, { + key: "testAllow", + value: function testAllow(allowFrom, targetNode, element) { + if (!allowFrom) { + return true; + } + + if (!is.element(element)) { + return false; + } + + if (is.string(allowFrom)) { + return (0, _$domUtils_53.matchesUpTo)(element, allowFrom, targetNode); + } else if (is.element(allowFrom)) { + return (0, _$domUtils_53.nodeContains)(allowFrom, element); + } + + return false; + } + }, { + key: "testIgnore", + value: function testIgnore(ignoreFrom, targetNode, element) { + if (!ignoreFrom || !is.element(element)) { + return false; + } + + if (is.string(ignoreFrom)) { + return (0, _$domUtils_53.matchesUpTo)(element, ignoreFrom, targetNode); + } else if (is.element(ignoreFrom)) { + return (0, _$domUtils_53.nodeContains)(ignoreFrom, element); + } + + return false; + } + /** + * Calls listeners for the given InteractEvent type bound globally + * and directly to this Interactable + * + * @param {InteractEvent} iEvent The InteractEvent object to be fired on this + * Interactable + * @return {Interactable} this Interactable + */ + + }, { + key: "fire", + value: function fire(iEvent) { + this.events.fire(iEvent); + return this; + } + }, { + key: "_onOff", + value: function _onOff(method, typeArg, listenerArg, options) { + if (is.object(typeArg) && !is.array(typeArg)) { + options = listenerArg; + listenerArg = null; + } + + var addRemove = method === 'on' ? 'add' : 'remove'; + var listeners = (0, _normalizeListeners["default"])(typeArg, listenerArg); + + for (var type in listeners) { + if (type === 'wheel') { + type = _browser["default"].wheelEvent; + } + + for (var _i = 0; _i < listeners[type].length; _i++) { + var _ref; + + _ref = listeners[type][_i]; + var listener = _ref; + + // if it is an action event type + if ((0, _scope.isNonNativeEvent)(type, this._actions)) { + this.events[method](type, listener); + } // delegated event + else if (is.string(this.target)) { + _events["default"]["".concat(addRemove, "Delegate")](this.target, this._context, type, listener, options); + } // remove listener from this Interactable's element + else { + _events["default"][addRemove](this.target, type, listener, options); + } + } + } + + return this; + } + /** + * Binds a listener for an InteractEvent, pointerEvent or DOM event. + * + * @param {string | array | object} types The types of events to listen + * for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * addEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "on", + value: function on(types, listener, options) { + return this._onOff('on', types, listener, options); + } + /** + * Removes an InteractEvent, pointerEvent or DOM event listener. + * + * @param {string | array | object} types The types of events that were + * listened for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * removeEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "off", + value: function off(types, listener, options) { + return this._onOff('off', types, listener, options); + } + /** + * Reset the options of this Interactable + * + * @param {object} options The new settings to apply + * @return {object} This Interactable + */ + + }, { + key: "set", + value: function set(options) { + var defaults = this._defaults; + + if (!is.object(options)) { + options = {}; + } + + this.options = (0, _clone["default"])(defaults.base); + + for (var actionName_ in this._actions.methodDict) { + var actionName = actionName_; + var methodName = this._actions.methodDict[actionName]; + this.options[actionName] = {}; + this.setPerAction(actionName, (0, _extend["default"])((0, _extend["default"])({}, defaults.perAction), defaults.actions[actionName])); + this[methodName](options[actionName]); + } + + for (var setting in options) { + if (is.func(this[setting])) { + this[setting](options[setting]); + } + } + + return this; + } + /** + * Remove this interactable from the list of interactables and remove it's + * action capabilities and event listeners + * + * @return {interact} + */ + + }, { + key: "unset", + value: function unset() { + _events["default"].remove(this.target, 'all'); + + if (is.string(this.target)) { + // remove delegated events + for (var type in _events["default"].delegatedEvents) { + var delegated = _events["default"].delegatedEvents[type]; + + if (delegated.selectors[0] === this.target && delegated.contexts[0] === this._context) { + delegated.selectors.splice(0, 1); + delegated.contexts.splice(0, 1); + delegated.listeners.splice(0, 1); + } + + _events["default"].remove(this._context, type, _events["default"].delegateListener); + + _events["default"].remove(this._context, type, _events["default"].delegateUseCapture, true); + } + } else { + _events["default"].remove(this.target, 'all'); + } + } + }]); + + return Interactable; +}(); + +exports.Interactable = Interactable; +var _default = Interactable; +exports["default"] = _default; + +}); +var _$scope_24 = createModuleFactory(function (module, exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +/* common-shake removed: exports.createScope = */ void createScope; +exports.isNonNativeEvent = isNonNativeEvent; +/* common-shake removed: exports.initScope = */ void initScope; +exports.Scope = void 0; + +var _domObjects = _interopRequireDefault(_$domObjects_52); + +var utils = _interopRequireWildcard(_$index_58); + +var _defaultOptions = _interopRequireDefault(_$defaultOptions_20); + +var _Eventable = _interopRequireDefault(_$Eventable_14); + +var _Interactable = _interopRequireDefault(_$Interactable_16({})); + +var _InteractableSet = _interopRequireDefault(_$InteractableSet_17); + +var _InteractEvent = _interopRequireDefault(_$InteractEvent_15); + +var _interactions = _interopRequireDefault(_$interactions_23({})); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var win = utils.win, + browser = utils.browser, + raf = utils.raf, + events = utils.events; // eslint-disable-next-line @typescript-eslint/no-empty-interface + +function createScope() { + return new Scope(); +} + +var Scope = /*#__PURE__*/function () { + // main window + // main document + // main window + // all documents being listened to + function Scope() { + var _this = this; + + _classCallCheck(this, Scope); + + _defineProperty(this, "id", "__interact_scope_".concat(Math.floor(Math.random() * 100))); + + _defineProperty(this, "isInitialized", false); + + _defineProperty(this, "listenerMaps", []); + + _defineProperty(this, "browser", browser); + + _defineProperty(this, "events", events); + + _defineProperty(this, "utils", utils); + + _defineProperty(this, "defaults", utils.clone(_defaultOptions["default"])); + + _defineProperty(this, "Eventable", _Eventable["default"]); + + _defineProperty(this, "actions", { + map: {}, + phases: { + start: true, + move: true, + end: true + }, + methodDict: {}, + phaselessTypes: {} + }); + + _defineProperty(this, "InteractEvent", _InteractEvent["default"]); + + _defineProperty(this, "Interactable", void 0); + + _defineProperty(this, "interactables", new _InteractableSet["default"](this)); + + _defineProperty(this, "_win", void 0); + + _defineProperty(this, "document", void 0); + + _defineProperty(this, "window", void 0); + + _defineProperty(this, "documents", []); + + _defineProperty(this, "_plugins", { + list: [], + map: {} + }); + + _defineProperty(this, "onWindowUnload", function (event) { + return _this.removeDocument(event.target); + }); + + var scope = this; + + this.Interactable = /*#__PURE__*/function (_InteractableBase) { + _inherits(_class, _InteractableBase); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "set", + value: function set(options) { + _get(_getPrototypeOf(_class.prototype), "set", this).call(this, options); + + scope.fire('interactable:set', { + options: options, + interactable: this + }); + return this; + } + }, { + key: "unset", + value: function unset() { + _get(_getPrototypeOf(_class.prototype), "unset", this).call(this); + + scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1); + scope.fire('interactable:unset', { + interactable: this + }); + } + }, { + key: "_defaults", + get: function get() { + return scope.defaults; + } + }]); + + return _class; + }(_Interactable["default"]); + } + + _createClass(Scope, [{ + key: "addListeners", + value: function addListeners(map, id) { + this.listenerMaps.push({ + id: id, + map: map + }); + } + }, { + key: "fire", + value: function fire(name, arg) { + for (var _i = 0; _i < this.listenerMaps.length; _i++) { + var _ref; + + _ref = this.listenerMaps[_i]; + var _ref2 = _ref, + listener = _ref2.map[name]; + + if (!!listener && listener(arg, this, name) === false) { + return false; + } + } + } + }, { + key: "init", + value: function init(window) { + return this.isInitialized ? this : initScope(this, window); + } + }, { + key: "pluginIsInstalled", + value: function pluginIsInstalled(plugin) { + return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1; + } + }, { + key: "usePlugin", + value: function usePlugin(plugin, options) { + if (this.pluginIsInstalled(plugin)) { + return this; + } + + if (plugin.id) { + this._plugins.map[plugin.id] = plugin; + } + + this._plugins.list.push(plugin); + + if (plugin.install) { + plugin.install(this, options); + } + + if (plugin.listeners && plugin.before) { + var _index = 0; + var len = this.listenerMaps.length; + var before = plugin.before.reduce(function (acc, id) { + acc[id] = true; + return acc; + }, {}); + + for (; _index < len; _index++) { + var otherId = this.listenerMaps[_index].id; + + if (before[otherId]) { + break; + } + } + + this.listenerMaps.splice(_index, 0, { + id: plugin.id, + map: plugin.listeners + }); + } else if (plugin.listeners) { + this.listenerMaps.push({ + id: plugin.id, + map: plugin.listeners + }); + } + + return this; + } + }, { + key: "addDocument", + value: function addDocument(doc, options) { + // do nothing if document is already known + if (this.getDocIndex(doc) !== -1) { + return false; + } + + var window = win.getWindow(doc); + options = options ? utils.extend({}, options) : {}; + this.documents.push({ + doc: doc, + options: options + }); + events.documents.push(doc); // don't add an unload event for the main document + // so that the page may be cached in browser history + + if (doc !== this.document) { + events.add(window, 'unload', this.onWindowUnload); + } + + this.fire('scope:add-document', { + doc: doc, + window: window, + scope: this, + options: options + }); + } + }, { + key: "removeDocument", + value: function removeDocument(doc) { + var index = this.getDocIndex(doc); + var window = win.getWindow(doc); + var options = this.documents[index].options; + events.remove(window, 'unload', this.onWindowUnload); + this.documents.splice(index, 1); + events.documents.splice(index, 1); + this.fire('scope:remove-document', { + doc: doc, + window: window, + scope: this, + options: options + }); + } + }, { + key: "getDocIndex", + value: function getDocIndex(doc) { + for (var i = 0; i < this.documents.length; i++) { + if (this.documents[i].doc === doc) { + return i; + } + } + + return -1; + } + }, { + key: "getDocOptions", + value: function getDocOptions(doc) { + var docIndex = this.getDocIndex(doc); + return docIndex === -1 ? null : this.documents[docIndex].options; + } + }, { + key: "now", + value: function now() { + return (this.window.Date || Date).now(); + } + }]); + + return Scope; +}(); + +exports.Scope = Scope; + +function isNonNativeEvent(type, actions) { + if (actions.phaselessTypes[type]) { + return true; + } + + for (var name in actions.map) { + if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) { + return true; + } + } + + return false; +} + +function initScope(scope, window) { + scope.isInitialized = true; + win.init(window); + + _domObjects["default"].init(window); + + browser.init(window); + raf.init(window); + events.init(window); + scope.usePlugin(_interactions["default"]); + scope.document = window.document; + scope.window = window; + return scope; +} + +}); +var _$interactions_23 = createModuleFactory(function (module, exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _browser = _interopRequireDefault(_$browser_50); + +var _domObjects = _interopRequireDefault(_$domObjects_52); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var _events = _interopRequireDefault(_$events_54); + +var pointerUtils = _interopRequireWildcard(_$pointerUtils_63); + +var _Interaction = _interopRequireDefault(_$Interaction_18); + +var _interactionFinder = _interopRequireDefault(_$interactionFinder_22); + +var _scope = _$scope_24({}); + +var _interactablePreventDefault = _interopRequireDefault(_$interactablePreventDefault_21); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +var methodNames = ['pointerDown', 'pointerMove', 'pointerUp', 'updatePointer', 'removePointer', 'windowBlur']; + +function install(scope) { + var listeners = {}; + + for (var _i = 0; _i < methodNames.length; _i++) { + var _ref; + + _ref = methodNames[_i]; + var method = _ref; + listeners[method] = doOnInteractions(method, scope); + } + + var pEventTypes = _browser["default"].pEventTypes; + var docEvents; + + if (_domObjects["default"].PointerEvent) { + docEvents = [{ + type: pEventTypes.down, + listener: releasePointersOnRemovedEls + }, { + type: pEventTypes.down, + listener: listeners.pointerDown + }, { + type: pEventTypes.move, + listener: listeners.pointerMove + }, { + type: pEventTypes.up, + listener: listeners.pointerUp + }, { + type: pEventTypes.cancel, + listener: listeners.pointerUp + }]; + } else { + docEvents = [{ + type: 'mousedown', + listener: listeners.pointerDown + }, { + type: 'mousemove', + listener: listeners.pointerMove + }, { + type: 'mouseup', + listener: listeners.pointerUp + }, { + type: 'touchstart', + listener: releasePointersOnRemovedEls + }, { + type: 'touchstart', + listener: listeners.pointerDown + }, { + type: 'touchmove', + listener: listeners.pointerMove + }, { + type: 'touchend', + listener: listeners.pointerUp + }, { + type: 'touchcancel', + listener: listeners.pointerUp + }]; + } + + docEvents.push({ + type: 'blur', + listener: function listener(event) { + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref2; + + _ref2 = scope.interactions.list[_i2]; + var interaction = _ref2; + interaction.documentBlur(event); + } + } + }); // for ignoring browser's simulated mouse events + + scope.prevTouchTime = 0; + + scope.Interaction = /*#__PURE__*/function (_InteractionBase) { + _inherits(_class, _InteractionBase); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "_now", + value: function _now() { + return scope.now(); + } + }, { + key: "pointerMoveTolerance", + get: function get() { + return scope.interactions.pointerMoveTolerance; + }, + set: function set(value) { + scope.interactions.pointerMoveTolerance = value; + } + }]); + + return _class; + }(_Interaction["default"]); + + scope.interactions = { + // all active and idle interactions + list: [], + "new": function _new(options) { + options.scopeFire = function (name, arg) { + return scope.fire(name, arg); + }; + + var interaction = new scope.Interaction(options); + scope.interactions.list.push(interaction); + return interaction; + }, + listeners: listeners, + docEvents: docEvents, + pointerMoveTolerance: 1 + }; + + function releasePointersOnRemovedEls() { + // for all inactive touch interactions with pointers down + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref3; + + _ref3 = scope.interactions.list[_i3]; + var interaction = _ref3; + + if (!interaction.pointerIsDown || interaction.pointerType !== 'touch' || interaction._interacting) { + continue; + } // if a pointer is down on an element that is no longer in the DOM tree + + + var _loop = function _loop() { + _ref4 = interaction.pointers[_i4]; + var pointer = _ref4; + + if (!scope.documents.some(function (_ref5) { + var doc = _ref5.doc; + return (0, _$domUtils_53.nodeContains)(doc, pointer.downTarget); + })) { + // remove the pointer from the interaction + interaction.removePointer(pointer.pointer, pointer.event); + } + }; + + for (var _i4 = 0; _i4 < interaction.pointers.length; _i4++) { + var _ref4; + + _loop(); + } + } + } + + scope.usePlugin(_interactablePreventDefault["default"]); +} + +function doOnInteractions(method, scope) { + return function (event) { + var interactions = scope.interactions.list; + var pointerType = pointerUtils.getPointerType(event); + + var _pointerUtils$getEven = pointerUtils.getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 2), + eventTarget = _pointerUtils$getEven2[0], + curEventTarget = _pointerUtils$getEven2[1]; + + var matches = []; // [ [pointer, interaction], ...] + + if (/^touch/.test(event.type)) { + scope.prevTouchTime = scope.now(); + + for (var _i5 = 0; _i5 < event.changedTouches.length; _i5++) { + var _ref6; + + _ref6 = event.changedTouches[_i5]; + var changedTouch = _ref6; + var pointer = changedTouch; + var pointerId = pointerUtils.getPointerId(pointer); + var searchDetails = { + pointer: pointer, + pointerId: pointerId, + pointerType: pointerType, + eventType: event.type, + eventTarget: eventTarget, + curEventTarget: curEventTarget, + scope: scope + }; + var interaction = getInteraction(searchDetails); + matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]); + } + } else { + var invalidPointer = false; + + if (!_browser["default"].supportsPointerEvent && /mouse/.test(event.type)) { + // ignore mouse events while touch interactions are active + for (var i = 0; i < interactions.length && !invalidPointer; i++) { + invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown; + } // try to ignore mouse events that are simulated by the browser + // after a touch event + + + invalidPointer = invalidPointer || scope.now() - scope.prevTouchTime < 500 || // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated + event.timeStamp === 0; + } + + if (!invalidPointer) { + var _searchDetails = { + pointer: event, + pointerId: pointerUtils.getPointerId(event), + pointerType: pointerType, + eventType: event.type, + curEventTarget: curEventTarget, + eventTarget: eventTarget, + scope: scope + }; + + var _interaction = getInteraction(_searchDetails); + + matches.push([_searchDetails.pointer, _searchDetails.eventTarget, _searchDetails.curEventTarget, _interaction]); + } + } // eslint-disable-next-line no-shadow + + + for (var _i6 = 0; _i6 < matches.length; _i6++) { + var _matches$_i = _slicedToArray(matches[_i6], 4), + _pointer = _matches$_i[0], + _eventTarget = _matches$_i[1], + _curEventTarget = _matches$_i[2], + _interaction2 = _matches$_i[3]; + + _interaction2[method](_pointer, event, _eventTarget, _curEventTarget); + } + }; +} + +function getInteraction(searchDetails) { + var pointerType = searchDetails.pointerType, + scope = searchDetails.scope; + + var foundInteraction = _interactionFinder["default"].search(searchDetails); + + var signalArg = { + interaction: foundInteraction, + searchDetails: searchDetails + }; + scope.fire('interactions:find', signalArg); + return signalArg.interaction || scope.interactions["new"]({ + pointerType: pointerType + }); +} + +function onDocSignal(_ref7, eventMethodName) { + var doc = _ref7.doc, + scope = _ref7.scope, + options = _ref7.options; + var docEvents = scope.interactions.docEvents; + var eventMethod = _events["default"][eventMethodName]; + + if (scope.browser.isIOS && !options.events) { + options.events = { + passive: false + }; + } // delegate event listener + + + for (var eventType in _events["default"].delegatedEvents) { + eventMethod(doc, eventType, _events["default"].delegateListener); + eventMethod(doc, eventType, _events["default"].delegateUseCapture, true); + } + + var eventOptions = options && options.events; + + for (var _i7 = 0; _i7 < docEvents.length; _i7++) { + var _ref8; + + _ref8 = docEvents[_i7]; + var _ref9 = _ref8, + _type = _ref9.type, + listener = _ref9.listener; + eventMethod(doc, _type, listener, eventOptions); + } +} + +var interactions = { + id: 'core/interactions', + install: install, + listeners: { + 'scope:add-document': function scopeAddDocument(arg) { + return onDocSignal(arg, 'add'); + }, + 'scope:remove-document': function scopeRemoveDocument(arg) { + return onDocSignal(arg, 'remove'); + }, + 'interactable:unset': function interactableUnset(_ref10, scope) { + var interactable = _ref10.interactable; + + // Stop and destroy related interactions when an Interactable is unset + for (var i = scope.interactions.list.length - 1; i >= 0; i--) { + var interaction = scope.interactions.list[i]; + + if (interaction.interactable !== interactable) { + continue; + } + + interaction.stop(); + scope.fire('interactions:destroy', { + interaction: interaction + }); + interaction.destroy(); + + if (scope.interactions.list.length > 2) { + scope.interactions.list.splice(i, 1); + } + } + } + }, + onDocSignal: onDocSignal, + doOnInteractions: doOnInteractions, + methodNames: methodNames +}; +var _default = interactions; +exports["default"] = _default; + +}); +var _$index_48 = {}; +/// +"use strict"; + +var _$isWindow_60 = {}; +"use strict"; + +Object.defineProperty(_$isWindow_60, "__esModule", { + value: true +}); +_$isWindow_60["default"] = void 0; + +var _default = function _default(thing) { + return !!(thing && thing.Window) && thing instanceof thing.Window; +}; + +_$isWindow_60["default"] = _default; + +var _$window_68 = {}; +"use strict"; + +Object.defineProperty(_$window_68, "__esModule", { + value: true +}); +_$window_68.init = init; +_$window_68.getWindow = getWindow; +_$window_68["default"] = void 0; + +var _isWindow = _interopRequireDefault(_$isWindow_60); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var win = { + realWindow: undefined, + window: undefined, + getWindow: getWindow, + init: init +}; + +function init(window) { + // get wrapped window if using Shadow DOM polyfill + win.realWindow = window; // create a TextNode + + var el = window.document.createTextNode(''); // check if it's wrapped by a polyfill + + if (el.ownerDocument !== window.document && typeof window.wrap === 'function' && window.wrap(el) === el) { + // use wrapped window + window = window.wrap(window); + } + + win.window = window; +} + +if (typeof window === 'undefined') { + win.window = undefined; + win.realWindow = undefined; +} else { + init(window); +} + +function getWindow(node) { + if ((0, _isWindow["default"])(node)) { + return node; + } + + var rootNode = node.ownerDocument || node; + return rootNode.defaultView || win.window; +} + +win.init = init; +var ___default_68 = win; +_$window_68["default"] = ___default_68; + +var _$is_59 = {}; +"use strict"; + +Object.defineProperty(_$is_59, "__esModule", { + value: true +}); +_$is_59.array = _$is_59.plainObject = _$is_59.element = _$is_59.string = _$is_59.bool = _$is_59.number = _$is_59.func = _$is_59.object = _$is_59.docFrag = _$is_59.window = void 0; + +var ___isWindow_59 = ___interopRequireDefault_59(_$isWindow_60); + +var _window2 = ___interopRequireDefault_59(_$window_68); + +function ___interopRequireDefault_59(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var __window_59 = function window(thing) { + return thing === _window2["default"].window || (0, ___isWindow_59["default"])(thing); +}; + +_$is_59.window = __window_59; + +var docFrag = function docFrag(thing) { + return object(thing) && thing.nodeType === 11; +}; + +_$is_59.docFrag = docFrag; + +var object = function object(thing) { + return !!thing && _typeof(thing) === 'object'; +}; + +_$is_59.object = object; + +var func = function func(thing) { + return typeof thing === 'function'; +}; + +_$is_59.func = func; + +var number = function number(thing) { + return typeof thing === 'number'; +}; + +_$is_59.number = number; + +var bool = function bool(thing) { + return typeof thing === 'boolean'; +}; + +_$is_59.bool = bool; + +var string = function string(thing) { + return typeof thing === 'string'; +}; + +_$is_59.string = string; + +var element = function element(thing) { + if (!thing || _typeof(thing) !== 'object') { + return false; + } + + var _window = _window2["default"].getWindow(thing) || _window2["default"].window; + + return /object|function/.test(_typeof(_window.Element)) ? thing instanceof _window.Element // DOM2 + : thing.nodeType === 1 && typeof thing.nodeName === 'string'; +}; + +_$is_59.element = element; + +var plainObject = function plainObject(thing) { + return object(thing) && !!thing.constructor && /function Object\b/.test(thing.constructor.toString()); +}; + +_$is_59.plainObject = plainObject; + +var array = function array(thing) { + return object(thing) && typeof thing.length !== 'undefined' && func(thing.splice); +}; + +_$is_59.array = array; + +var _$drag_1 = {}; +"use strict"; + +function ___typeof_1(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_1 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_1 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_1(obj); } + +Object.defineProperty(_$drag_1, "__esModule", { + value: true +}); +_$drag_1["default"] = void 0; + +var is = _interopRequireWildcard(_$is_59); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_1(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function install(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + defaults = scope.defaults; + Interactable.prototype.draggable = drag.draggable; + actions.map.drag = drag; + actions.methodDict.drag = 'draggable'; + defaults.actions.drag = drag.defaults; +} + +function beforeMove(_ref) { + var interaction = _ref.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x') { + interaction.coords.cur.page.y = interaction.coords.start.page.y; + interaction.coords.cur.client.y = interaction.coords.start.client.y; + interaction.coords.velocity.client.y = 0; + interaction.coords.velocity.page.y = 0; + } else if (axis === 'y') { + interaction.coords.cur.page.x = interaction.coords.start.page.x; + interaction.coords.cur.client.x = interaction.coords.start.client.x; + interaction.coords.velocity.client.x = 0; + interaction.coords.velocity.page.x = 0; + } +} + +function move(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x' || axis === 'y') { + var opposite = axis === 'x' ? 'y' : 'x'; + iEvent.page[opposite] = interaction.coords.start.page[opposite]; + iEvent.client[opposite] = interaction.coords.start.client[opposite]; + iEvent.delta[opposite] = 0; + } +} +/** + * ```js + * interact(element).draggable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // the axis in which the first movement must be + * // for the drag sequence to start + * // 'xy' by default - any direction + * startAxis: 'x' || 'y' || 'xy', + * + * // 'xy' by default - don't restrict to one axis (move in any direction) + * // 'x' or 'y' to restrict movement to either axis + * // 'start' to restrict movement to the axis the drag started in + * lockAxis: 'x' || 'y' || 'xy' || 'start', + * + * // max number of drags that can happen concurrently + * // with elements of this Interactable. Infinity by default + * max: Infinity, + * + * // max number of drags that can target the same element+Interactable + * // 1 by default + * maxPerElement: 2 + * }) + * + * var isDraggable = interact('element').draggable(); // true + * ``` + * + * Get or set whether drag actions can be performed on the target + * + * @alias Interactable.prototype.draggable + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on drag events (object makes the Interactable + * draggable) + * @return {boolean | Interactable} boolean indicating if this can be the + * target of drag events, or this Interctable + */ + + +var draggable = function draggable(options) { + if (is.object(options)) { + this.options.drag.enabled = options.enabled !== false; + this.setPerAction('drag', options); + this.setOnEvents('drag', options); + + if (/^(xy|x|y|start)$/.test(options.lockAxis)) { + this.options.drag.lockAxis = options.lockAxis; + } + + if (/^(xy|x|y)$/.test(options.startAxis)) { + this.options.drag.startAxis = options.startAxis; + } + + return this; + } + + if (is.bool(options)) { + this.options.drag.enabled = options; + return this; + } + + return this.options.drag; +}; + +var drag = { + id: 'actions/drag', + install: install, + listeners: { + 'interactions:before-action-move': beforeMove, + 'interactions:action-resume': beforeMove, + // dragmove + 'interactions:action-move': move, + 'auto-start:check': function autoStartCheck(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + buttons = arg.buttons; + var dragOptions = interactable.options.drag; + + if (!(dragOptions && dragOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & interactable.options.drag.mouseButtons) === 0) { + return undefined; + } + + arg.action = { + name: 'drag', + axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis + }; + return false; + } + }, + draggable: draggable, + beforeMove: beforeMove, + move: move, + defaults: { + startAxis: 'xy', + lockAxis: 'xy' + }, + getCursor: function getCursor() { + return 'move'; + } +}; +var ___default_1 = drag; +_$drag_1["default"] = ___default_1; + +var _$arr_49 = {}; +"use strict"; + +Object.defineProperty(_$arr_49, "__esModule", { + value: true +}); +_$arr_49.find = _$arr_49.findIndex = _$arr_49.from = _$arr_49.merge = _$arr_49.remove = _$arr_49.contains = void 0; + +var contains = function contains(array, target) { + return array.indexOf(target) !== -1; +}; + +_$arr_49.contains = contains; + +var remove = function remove(array, target) { + return array.splice(array.indexOf(target), 1); +}; + +_$arr_49.remove = remove; + +var merge = function merge(target, source) { + for (var _i = 0; _i < source.length; _i++) { + var _ref; + + _ref = source[_i]; + var item = _ref; + target.push(item); + } + + return target; +}; + +_$arr_49.merge = merge; + +var from = function from(source) { + return merge([], source); +}; + +_$arr_49.from = from; + +var findIndex = function findIndex(array, func) { + for (var i = 0; i < array.length; i++) { + if (func(array[i], i, array)) { + return i; + } + } + + return -1; +}; + +_$arr_49.findIndex = findIndex; + +var find = function find(array, func) { + return array[findIndex(array, func)]; +}; + +_$arr_49.find = find; + +var _$domObjects_52 = {}; +"use strict"; + +Object.defineProperty(_$domObjects_52, "__esModule", { + value: true +}); +_$domObjects_52["default"] = void 0; +var domObjects = { + init: __init_52, + document: null, + DocumentFragment: null, + SVGElement: null, + SVGSVGElement: null, + SVGElementInstance: null, + Element: null, + HTMLElement: null, + Event: null, + Touch: null, + PointerEvent: null +}; + +function blank() {} + +var ___default_52 = domObjects; +_$domObjects_52["default"] = ___default_52; + +function __init_52(window) { + var win = window; + domObjects.document = win.document; + domObjects.DocumentFragment = win.DocumentFragment || blank; + domObjects.SVGElement = win.SVGElement || blank; + domObjects.SVGSVGElement = win.SVGSVGElement || blank; + domObjects.SVGElementInstance = win.SVGElementInstance || blank; + domObjects.Element = win.Element || blank; + domObjects.HTMLElement = win.HTMLElement || domObjects.Element; + domObjects.Event = win.Event; + domObjects.Touch = win.Touch || blank; + domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent; +} + +var _$browser_50 = {}; +"use strict"; + +function ___typeof_50(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_50 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_50 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_50(obj); } + +Object.defineProperty(_$browser_50, "__esModule", { + value: true +}); +_$browser_50["default"] = void 0; + +var _domObjects = ___interopRequireDefault_50(_$domObjects_52); + +var __is_50 = ___interopRequireWildcard_50(_$is_59); + +var _window = ___interopRequireDefault_50(_$window_68); + +function ___getRequireWildcardCache_50() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_50 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_50(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_50(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_50(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_50(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var browser = { + init: __init_50, + supportsTouch: null, + supportsPointerEvent: null, + isIOS7: null, + isIOS: null, + isIe9: null, + isOperaMobile: null, + prefixedMatchesSelector: null, + pEventTypes: null, + wheelEvent: null +}; + +function __init_50(window) { + var Element = _domObjects["default"].Element; + var navigator = _window["default"].window.navigator; // Does the browser support touch input? + + browser.supportsTouch = 'ontouchstart' in window || __is_50.func(window.DocumentTouch) && _domObjects["default"].document instanceof window.DocumentTouch; // Does the browser support PointerEvents + + browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!_domObjects["default"].PointerEvent; + browser.isIOS = /iP(hone|od|ad)/.test(navigator.platform); // scrolling doesn't change the result of getClientRects on iOS 7 + + browser.isIOS7 = /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\d]/.test(navigator.appVersion); + browser.isIe9 = /MSIE 9/.test(navigator.userAgent); // Opera Mobile must be handled differently + + browser.isOperaMobile = navigator.appName === 'Opera' && browser.supportsTouch && /Presto/.test(navigator.userAgent); // prefix matchesSelector + + browser.prefixedMatchesSelector = 'matches' in Element.prototype ? 'matches' : 'webkitMatchesSelector' in Element.prototype ? 'webkitMatchesSelector' : 'mozMatchesSelector' in Element.prototype ? 'mozMatchesSelector' : 'oMatchesSelector' in Element.prototype ? 'oMatchesSelector' : 'msMatchesSelector'; + browser.pEventTypes = browser.supportsPointerEvent ? _domObjects["default"].PointerEvent === window.MSPointerEvent ? { + up: 'MSPointerUp', + down: 'MSPointerDown', + over: 'mouseover', + out: 'mouseout', + move: 'MSPointerMove', + cancel: 'MSPointerCancel' + } : { + up: 'pointerup', + down: 'pointerdown', + over: 'pointerover', + out: 'pointerout', + move: 'pointermove', + cancel: 'pointercancel' + } : null; // because Webkit and Opera still use 'mousewheel' event type + + browser.wheelEvent = 'onmousewheel' in _domObjects["default"].document ? 'mousewheel' : 'wheel'; +} + +var ___default_50 = browser; +_$browser_50["default"] = ___default_50; + +var _$clone_51 = {}; +"use strict"; + +function ___typeof_51(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_51 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_51 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_51(obj); } + +Object.defineProperty(_$clone_51, "__esModule", { + value: true +}); +_$clone_51["default"] = clone; + +var arr = ___interopRequireWildcard_51(_$arr_49); + +var __is_51 = ___interopRequireWildcard_51(_$is_59); + +function ___getRequireWildcardCache_51() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_51 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_51(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_51(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_51(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +// tslint:disable-next-line ban-types +function clone(source) { + var dest = {}; + + for (var prop in source) { + var value = source[prop]; + + if (__is_51.plainObject(value)) { + dest[prop] = clone(value); + } else if (__is_51.array(value)) { + dest[prop] = arr.from(value); + } else { + dest[prop] = value; + } + } + + return dest; +} + +var _$domUtils_53 = {}; +"use strict"; + +function ___typeof_53(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_53 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_53 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_53(obj); } + +Object.defineProperty(_$domUtils_53, "__esModule", { + value: true +}); +_$domUtils_53.nodeContains = nodeContains; +_$domUtils_53.closest = closest; +_$domUtils_53.parentNode = parentNode; +_$domUtils_53.matchesSelector = matchesSelector; +_$domUtils_53.indexOfDeepestElement = indexOfDeepestElement; +_$domUtils_53.matchesUpTo = matchesUpTo; +_$domUtils_53.getActualElement = getActualElement; +_$domUtils_53.getScrollXY = getScrollXY; +_$domUtils_53.getElementClientRect = getElementClientRect; +_$domUtils_53.getElementRect = getElementRect; +_$domUtils_53.getPath = getPath; +_$domUtils_53.trySelector = trySelector; + +var _browser = ___interopRequireDefault_53(_$browser_50); + +var ___domObjects_53 = ___interopRequireDefault_53(_$domObjects_52); + +var __is_53 = ___interopRequireWildcard_53(_$is_59); + +var ___window_53 = ___interopRequireWildcard_53(_$window_68); + +function ___getRequireWildcardCache_53() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_53 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_53(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_53(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_53(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_53(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function nodeContains(parent, child) { + while (child) { + if (child === parent) { + return true; + } + + child = child.parentNode; + } + + return false; +} + +function closest(element, selector) { + while (__is_53.element(element)) { + if (matchesSelector(element, selector)) { + return element; + } + + element = parentNode(element); + } + + return null; +} + +function parentNode(node) { + var parent = node.parentNode; + + if (__is_53.docFrag(parent)) { + // skip past #shado-root fragments + // tslint:disable-next-line + while ((parent = parent.host) && __is_53.docFrag(parent)) { + continue; + } + + return parent; + } + + return parent; +} + +function matchesSelector(element, selector) { + // remove /deep/ from selectors if shadowDOM polyfill is used + if (___window_53["default"].window !== ___window_53["default"].realWindow) { + selector = selector.replace(/\/deep\//g, ' '); + } + + return element[_browser["default"].prefixedMatchesSelector](selector); +} + +var getParent = function getParent(el) { + return el.parentNode ? el.parentNode : el.host; +}; // Test for the element that's "above" all other qualifiers + + +function indexOfDeepestElement(elements) { + var deepestZoneParents = []; + var deepestZone = elements[0]; + var index = deepestZone ? 0 : -1; + var i; + var n; + + for (i = 1; i < elements.length; i++) { + var dropzone = elements[i]; // an element might belong to multiple selector dropzones + + if (!dropzone || dropzone === deepestZone) { + continue; + } + + if (!deepestZone) { + deepestZone = dropzone; + index = i; + continue; + } // check if the deepest or current are document.documentElement or document.rootElement + // - if the current dropzone is, do nothing and continue + + + if (dropzone.parentNode === dropzone.ownerDocument) { + continue; + } // - if deepest is, update with the current dropzone and continue to next + else if (deepestZone.parentNode === dropzone.ownerDocument) { + deepestZone = dropzone; + index = i; + continue; + } // compare zIndex of siblings + + + if (dropzone.parentNode === deepestZone.parentNode) { + var deepestZIndex = parseInt((0, ___window_53.getWindow)(deepestZone).getComputedStyle(deepestZone).zIndex, 10) || 0; + var dropzoneZIndex = parseInt((0, ___window_53.getWindow)(dropzone).getComputedStyle(dropzone).zIndex, 10) || 0; + + if (dropzoneZIndex >= deepestZIndex) { + deepestZone = dropzone; + index = i; + } + + continue; + } // populate the ancestry array for the latest deepest dropzone + + + if (!deepestZoneParents.length) { + var _parent = deepestZone; + var parentParent = void 0; + + while ((parentParent = getParent(_parent)) && parentParent !== _parent.ownerDocument) { + deepestZoneParents.unshift(_parent); + _parent = parentParent; + } + } + + var parent = void 0; // if this element is an svg element and the current deepest is an + // HTMLElement + + if (deepestZone instanceof ___domObjects_53["default"].HTMLElement && dropzone instanceof ___domObjects_53["default"].SVGElement && !(dropzone instanceof ___domObjects_53["default"].SVGSVGElement)) { + if (dropzone === deepestZone.parentNode) { + continue; + } + + parent = dropzone.ownerSVGElement; + } else { + parent = dropzone; + } + + var dropzoneParents = []; + + while (parent.parentNode !== parent.ownerDocument) { + dropzoneParents.unshift(parent); + parent = getParent(parent); + } + + n = 0; // get (position of last common ancestor) + 1 + + while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) { + n++; + } + + var parents = [dropzoneParents[n - 1], dropzoneParents[n], deepestZoneParents[n]]; + var child = parents[0].lastChild; + + while (child) { + if (child === parents[1]) { + deepestZone = dropzone; + index = i; + deepestZoneParents = dropzoneParents; + break; + } else if (child === parents[2]) { + break; + } + + child = child.previousSibling; + } + } + + return index; +} + +function matchesUpTo(element, selector, limit) { + while (__is_53.element(element)) { + if (matchesSelector(element, selector)) { + return true; + } + + element = parentNode(element); + + if (element === limit) { + return matchesSelector(element, selector); + } + } + + return false; +} + +function getActualElement(element) { + return element instanceof ___domObjects_53["default"].SVGElementInstance ? element.correspondingUseElement : element; +} + +function getScrollXY(relevantWindow) { + relevantWindow = relevantWindow || ___window_53["default"].window; + return { + x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft, + y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop + }; +} + +function getElementClientRect(element) { + var clientRect = element instanceof ___domObjects_53["default"].SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0]; + return clientRect && { + left: clientRect.left, + right: clientRect.right, + top: clientRect.top, + bottom: clientRect.bottom, + width: clientRect.width || clientRect.right - clientRect.left, + height: clientRect.height || clientRect.bottom - clientRect.top + }; +} + +function getElementRect(element) { + var clientRect = getElementClientRect(element); + + if (!_browser["default"].isIOS7 && clientRect) { + var scroll = getScrollXY(___window_53["default"].getWindow(element)); + clientRect.left += scroll.x; + clientRect.right += scroll.x; + clientRect.top += scroll.y; + clientRect.bottom += scroll.y; + } + + return clientRect; +} + +function getPath(node) { + var path = []; + + while (node) { + path.push(node); + node = parentNode(node); + } + + return path; +} + +function trySelector(value) { + if (!__is_53.string(value)) { + return false; + } // an exception will be raised if it is invalid + + + ___domObjects_53["default"].document.querySelector(value); + + return true; +} + +var _$pointerExtend_62 = {}; +"use strict"; + +Object.defineProperty(_$pointerExtend_62, "__esModule", { + value: true +}); +_$pointerExtend_62["default"] = void 0; + +function pointerExtend(dest, source) { + for (var prop in source) { + var prefixedPropREs = pointerExtend.prefixedPropREs; + var deprecated = false; // skip deprecated prefixed properties + + for (var vendor in prefixedPropREs) { + if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) { + deprecated = true; + break; + } + } + + if (!deprecated && typeof source[prop] !== 'function') { + dest[prop] = source[prop]; + } + } + + return dest; +} + +pointerExtend.prefixedPropREs = { + webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/, + moz: /(Pressure)$/ +}; +var ___default_62 = pointerExtend; +_$pointerExtend_62["default"] = ___default_62; + +var _$hypot_57 = {}; +"use strict"; + +Object.defineProperty(_$hypot_57, "__esModule", { + value: true +}); +_$hypot_57["default"] = void 0; + +var ___default_57 = function _default(x, y) { + return Math.sqrt(x * x + y * y); +}; + +_$hypot_57["default"] = ___default_57; + +var _$pointerUtils_63 = {}; +"use strict"; + +function ___typeof_63(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_63 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_63 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_63(obj); } + +Object.defineProperty(_$pointerUtils_63, "__esModule", { + value: true +}); +_$pointerUtils_63.copyCoords = copyCoords; +_$pointerUtils_63.setCoordDeltas = setCoordDeltas; +_$pointerUtils_63.setCoordVelocity = setCoordVelocity; +_$pointerUtils_63.setZeroCoords = setZeroCoords; +_$pointerUtils_63.isNativePointer = isNativePointer; +_$pointerUtils_63.getXY = getXY; +_$pointerUtils_63.getPageXY = getPageXY; +_$pointerUtils_63.getClientXY = getClientXY; +_$pointerUtils_63.getPointerId = getPointerId; +_$pointerUtils_63.setCoords = setCoords; +_$pointerUtils_63.getTouchPair = getTouchPair; +_$pointerUtils_63.pointerAverage = pointerAverage; +_$pointerUtils_63.touchBBox = touchBBox; +_$pointerUtils_63.touchDistance = touchDistance; +_$pointerUtils_63.touchAngle = touchAngle; +_$pointerUtils_63.getPointerType = getPointerType; +_$pointerUtils_63.getEventTargets = getEventTargets; +_$pointerUtils_63.newCoords = newCoords; +_$pointerUtils_63.coordsToEvent = coordsToEvent; +Object.defineProperty(_$pointerUtils_63, "pointerExtend", { + enumerable: true, + get: function get() { + return _pointerExtend["default"]; + } +}); + +var ___browser_63 = ___interopRequireDefault_63(_$browser_50); + +var ___domObjects_63 = ___interopRequireDefault_63(_$domObjects_52); + +var domUtils = ___interopRequireWildcard_63(_$domUtils_53); + +var _hypot = ___interopRequireDefault_63(_$hypot_57); + +var __is_63 = ___interopRequireWildcard_63(_$is_59); + +var _pointerExtend = ___interopRequireDefault_63(_$pointerExtend_62); + +function ___getRequireWildcardCache_63() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_63 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_63(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_63(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_63(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_63(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function copyCoords(dest, src) { + dest.page = dest.page || {}; + dest.page.x = src.page.x; + dest.page.y = src.page.y; + dest.client = dest.client || {}; + dest.client.x = src.client.x; + dest.client.y = src.client.y; + dest.timeStamp = src.timeStamp; +} + +function setCoordDeltas(targetObj, prev, cur) { + targetObj.page.x = cur.page.x - prev.page.x; + targetObj.page.y = cur.page.y - prev.page.y; + targetObj.client.x = cur.client.x - prev.client.x; + targetObj.client.y = cur.client.y - prev.client.y; + targetObj.timeStamp = cur.timeStamp - prev.timeStamp; +} + +function setCoordVelocity(targetObj, delta) { + var dt = Math.max(delta.timeStamp / 1000, 0.001); + targetObj.page.x = delta.page.x / dt; + targetObj.page.y = delta.page.y / dt; + targetObj.client.x = delta.client.x / dt; + targetObj.client.y = delta.client.y / dt; + targetObj.timeStamp = dt; +} + +function setZeroCoords(targetObj) { + targetObj.page.x = 0; + targetObj.page.y = 0; + targetObj.client.x = 0; + targetObj.client.y = 0; +} + +function isNativePointer(pointer) { + return pointer instanceof ___domObjects_63["default"].Event || pointer instanceof ___domObjects_63["default"].Touch; +} // Get specified X/Y coords for mouse or event.touches[0] + + +function getXY(type, pointer, xy) { + xy = xy || {}; + type = type || 'page'; + xy.x = pointer[type + 'X']; + xy.y = pointer[type + 'Y']; + return xy; +} + +function getPageXY(pointer, page) { + page = page || { + x: 0, + y: 0 + }; // Opera Mobile handles the viewport and scrolling oddly + + if (___browser_63["default"].isOperaMobile && isNativePointer(pointer)) { + getXY('screen', pointer, page); + page.x += window.scrollX; + page.y += window.scrollY; + } else { + getXY('page', pointer, page); + } + + return page; +} + +function getClientXY(pointer, client) { + client = client || {}; + + if (___browser_63["default"].isOperaMobile && isNativePointer(pointer)) { + // Opera Mobile handles the viewport and scrolling oddly + getXY('screen', pointer, client); + } else { + getXY('client', pointer, client); + } + + return client; +} + +function getPointerId(pointer) { + return __is_63.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier; +} + +function setCoords(targetObj, pointers, timeStamp) { + var pointer = pointers.length > 1 ? pointerAverage(pointers) : pointers[0]; + var tmpXY = {}; + getPageXY(pointer, tmpXY); + targetObj.page.x = tmpXY.x; + targetObj.page.y = tmpXY.y; + getClientXY(pointer, tmpXY); + targetObj.client.x = tmpXY.x; + targetObj.client.y = tmpXY.y; + targetObj.timeStamp = timeStamp; +} + +function getTouchPair(event) { + var touches = []; // array of touches is supplied + + if (__is_63.array(event)) { + touches[0] = event[0]; + touches[1] = event[1]; + } // an event + else { + if (event.type === 'touchend') { + if (event.touches.length === 1) { + touches[0] = event.touches[0]; + touches[1] = event.changedTouches[0]; + } else if (event.touches.length === 0) { + touches[0] = event.changedTouches[0]; + touches[1] = event.changedTouches[1]; + } + } else { + touches[0] = event.touches[0]; + touches[1] = event.touches[1]; + } + } + + return touches; +} + +function pointerAverage(pointers) { + var average = { + pageX: 0, + pageY: 0, + clientX: 0, + clientY: 0, + screenX: 0, + screenY: 0 + }; + + for (var _i = 0; _i < pointers.length; _i++) { + var _ref; + + _ref = pointers[_i]; + var pointer = _ref; + + for (var _prop in average) { + average[_prop] += pointer[_prop]; + } + } + + for (var prop in average) { + average[prop] /= pointers.length; + } + + return average; +} + +function touchBBox(event) { + if (!event.length && !(event.touches && event.touches.length > 1)) { + return null; + } + + var touches = getTouchPair(event); + var minX = Math.min(touches[0].pageX, touches[1].pageX); + var minY = Math.min(touches[0].pageY, touches[1].pageY); + var maxX = Math.max(touches[0].pageX, touches[1].pageX); + var maxY = Math.max(touches[0].pageY, touches[1].pageY); + return { + x: minX, + y: minY, + left: minX, + top: minY, + right: maxX, + bottom: maxY, + width: maxX - minX, + height: maxY - minY + }; +} + +function touchDistance(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = getTouchPair(event); + var dx = touches[0][sourceX] - touches[1][sourceX]; + var dy = touches[0][sourceY] - touches[1][sourceY]; + return (0, _hypot["default"])(dx, dy); +} + +function touchAngle(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = getTouchPair(event); + var dx = touches[1][sourceX] - touches[0][sourceX]; + var dy = touches[1][sourceY] - touches[0][sourceY]; + var angle = 180 * Math.atan2(dy, dx) / Math.PI; + return angle; +} + +function getPointerType(pointer) { + return __is_63.string(pointer.pointerType) ? pointer.pointerType : __is_63.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof ___domObjects_63["default"].Touch ? 'touch' : 'mouse'; +} // [ event.target, event.currentTarget ] + + +function getEventTargets(event) { + var path = __is_63.func(event.composedPath) ? event.composedPath() : event.path; + return [domUtils.getActualElement(path ? path[0] : event.target), domUtils.getActualElement(event.currentTarget)]; +} + +function newCoords() { + return { + page: { + x: 0, + y: 0 + }, + client: { + x: 0, + y: 0 + }, + timeStamp: 0 + }; +} + +function coordsToEvent(coords) { + var event = { + coords: coords, + + get page() { + return this.coords.page; + }, + + get client() { + return this.coords.client; + }, + + get timeStamp() { + return this.coords.timeStamp; + }, + + get pageX() { + return this.coords.page.x; + }, + + get pageY() { + return this.coords.page.y; + }, + + get clientX() { + return this.coords.client.x; + }, + + get clientY() { + return this.coords.client.y; + }, + + get pointerId() { + return this.coords.pointerId; + }, + + get target() { + return this.coords.target; + }, + + get type() { + return this.coords.type; + }, + + get pointerType() { + return this.coords.pointerType; + }, + + get buttons() { + return this.coords.buttons; + }, + + preventDefault: function preventDefault() {} + }; + return event; +} + +var _$events_54 = {}; +"use strict"; + +function ___typeof_54(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_54 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_54 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_54(obj); } + +Object.defineProperty(_$events_54, "__esModule", { + value: true +}); +_$events_54["default"] = _$events_54.FakeEvent = void 0; + +/* removed: var _$arr_49 = require("./arr"); */; + +var __domUtils_54 = ___interopRequireWildcard_54(_$domUtils_53); + +var __is_54 = ___interopRequireWildcard_54(_$is_59); + +var ___pointerExtend_54 = ___interopRequireDefault_54(_$pointerExtend_62); + +var pointerUtils = ___interopRequireWildcard_54(_$pointerUtils_63); + +function ___interopRequireDefault_54(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_54() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_54 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_54(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_54(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_54(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var elements = []; +var targets = []; +var delegatedEvents = {}; +var documents = []; + +function add(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; + + if (!target) { + target = { + events: {}, + typeCount: 0 + }; + elementIndex = elements.push(element) - 1; + targets.push(target); + } + + if (!target.events[type]) { + target.events[type] = []; + target.typeCount++; + } + + if (element.removeEventListener && !(0, _$arr_49.contains)(target.events[type], listener)) { + element.addEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].push(listener); + } +} + +function __remove_54(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; + + if (!target || !target.events) { + return; + } + + if (type === 'all') { + for (type in target.events) { + if (target.events.hasOwnProperty(type)) { + __remove_54(element, type, 'all'); + } + } + + return; + } + + if (target.events[type]) { + var len = target.events[type].length; + + if (listener === 'all') { + for (var i = 0; i < len; i++) { + __remove_54(element, type, target.events[type][i], options); + } + + return; + } else { + for (var _i = 0; _i < len; _i++) { + if (element.removeEventListener && target.events[type][_i] === listener) { + element.removeEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].splice(_i, 1); + break; + } + } + } + + if (target.events[type] && target.events[type].length === 0) { + target.events[type] = null; + target.typeCount--; + } + } + + if (!target.typeCount) { + targets.splice(elementIndex, 1); + elements.splice(elementIndex, 1); + } +} + +function addDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + + if (!delegatedEvents[type]) { + delegatedEvents[type] = { + contexts: [], + listeners: [], + selectors: [] + }; // add delegate listener functions + + for (var _i2 = 0; _i2 < documents.length; _i2++) { + var _ref; + + _ref = documents[_i2]; + var doc = _ref; + add(doc, type, delegateListener); + add(doc, type, delegateUseCapture, true); + } + } + + var delegated = delegatedEvents[type]; + var index; + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + break; + } + } + + if (index === -1) { + index = delegated.selectors.length; + delegated.selectors.push(selector); + delegated.contexts.push(context); + delegated.listeners.push([]); + } // keep listener and capture and passive flags + + + delegated.listeners[index].push([listener, !!options.capture, options.passive]); +} + +function removeDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var delegated = delegatedEvents[type]; + var matchFound = false; + var index; + + if (!delegated) { + return; + } // count from last index of delegated to 0 + + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + // look for matching selector and context Node + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + var listeners = delegated.listeners[index]; // each item of the listeners array is an array: [function, capture, passive] + + for (var i = listeners.length - 1; i >= 0; i--) { + var _listeners$i = _slicedToArray(listeners[i], 3), + fn = _listeners$i[0], + capture = _listeners$i[1], + passive = _listeners$i[2]; // check if the listener functions and capture and passive flags match + + + if (fn === listener && capture === !!options.capture && passive === options.passive) { + // remove the listener from the array of listeners + listeners.splice(i, 1); // if all listeners for this interactable have been removed + // remove the interactable from the delegated arrays + + if (!listeners.length) { + delegated.selectors.splice(index, 1); + delegated.contexts.splice(index, 1); + delegated.listeners.splice(index, 1); // remove delegate function from context + + __remove_54(context, type, delegateListener); + __remove_54(context, type, delegateUseCapture, true); // remove the arrays if they are empty + + if (!delegated.selectors.length) { + delegatedEvents[type] = null; + } + } // only remove one listener + + + matchFound = true; + break; + } + } + + if (matchFound) { + break; + } + } + } +} // bound to the interactable context when a DOM event +// listener is added to a selector interactable + + +function delegateListener(event, optionalArg) { + var options = getOptions(optionalArg); + var fakeEvent = new FakeEvent(event); + var delegated = delegatedEvents[event.type]; + + var _pointerUtils$getEven = pointerUtils.getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 1), + eventTarget = _pointerUtils$getEven2[0]; + + var element = eventTarget; // climb up document tree looking for selector matches + + while (__is_54.element(element)) { + for (var i = 0; i < delegated.selectors.length; i++) { + var selector = delegated.selectors[i]; + var context = delegated.contexts[i]; + + if (__domUtils_54.matchesSelector(element, selector) && __domUtils_54.nodeContains(context, eventTarget) && __domUtils_54.nodeContains(context, element)) { + var listeners = delegated.listeners[i]; + fakeEvent.currentTarget = element; + + for (var _i3 = 0; _i3 < listeners.length; _i3++) { + var _ref2; + + _ref2 = listeners[_i3]; + + var _ref3 = _ref2, + _ref4 = _slicedToArray(_ref3, 3), + fn = _ref4[0], + capture = _ref4[1], + passive = _ref4[2]; + + if (capture === !!options.capture && passive === options.passive) { + fn(fakeEvent); + } + } + } + } + + element = __domUtils_54.parentNode(element); + } +} + +function delegateUseCapture(event) { + return delegateListener.call(this, event, true); +} + +function getOptions(param) { + return __is_54.object(param) ? param : { + capture: param + }; +} + +var FakeEvent = /*#__PURE__*/function () { + function FakeEvent(originalEvent) { + _classCallCheck(this, FakeEvent); + + this.originalEvent = originalEvent; + + _defineProperty(this, "currentTarget", void 0); + + // duplicate the event so that currentTarget can be changed + (0, ___pointerExtend_54["default"])(this, originalEvent); + } + + _createClass(FakeEvent, [{ + key: "preventOriginalDefault", + value: function preventOriginalDefault() { + this.originalEvent.preventDefault(); + } + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.originalEvent.stopPropagation(); + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.originalEvent.stopImmediatePropagation(); + } + }]); + + return FakeEvent; +}(); + +_$events_54.FakeEvent = FakeEvent; +var events = { + add: add, + remove: __remove_54, + addDelegate: addDelegate, + removeDelegate: removeDelegate, + delegateListener: delegateListener, + delegateUseCapture: delegateUseCapture, + delegatedEvents: delegatedEvents, + documents: documents, + supportsOptions: false, + supportsPassive: false, + _elements: elements, + _targets: targets, + init: function init(window) { + window.document.createElement('div').addEventListener('test', null, { + get capture() { + return events.supportsOptions = true; + }, + + get passive() { + return events.supportsPassive = true; + } + + }); + } +}; +var ___default_54 = events; +_$events_54["default"] = ___default_54; + +var _$extend_55 = {}; +"use strict"; + +Object.defineProperty(_$extend_55, "__esModule", { + value: true +}); +_$extend_55["default"] = extend; + +function extend(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } + + var ret = dest; + return ret; +} + +var _$normalizeListeners_61 = {}; +"use strict"; + +function ___typeof_61(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_61 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_61 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_61(obj); } + +Object.defineProperty(_$normalizeListeners_61, "__esModule", { + value: true +}); +_$normalizeListeners_61["default"] = normalize; + +var _extend = ___interopRequireDefault_61(_$extend_55); + +var __is_61 = ___interopRequireWildcard_61(_$is_59); + +function ___getRequireWildcardCache_61() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_61 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_61(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_61(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_61(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_61(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function normalize(type, listeners, result) { + result = result || {}; + + if (__is_61.string(type) && type.search(' ') !== -1) { + type = split(type); + } + + if (__is_61.array(type)) { + return type.reduce(function (acc, t) { + return (0, _extend["default"])(acc, normalize(t, listeners, result)); + }, result); + } // ({ type: fn }) -> ('', { type: fn }) + + + if (__is_61.object(type)) { + listeners = type; + type = ''; + } + + if (__is_61.func(listeners)) { + result[type] = result[type] || []; + result[type].push(listeners); + } else if (__is_61.array(listeners)) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; + + _ref = listeners[_i]; + var l = _ref; + normalize(type, l, result); + } + } else if (__is_61.object(listeners)) { + for (var prefix in listeners) { + var combinedTypes = split(prefix).map(function (p) { + return "".concat(type).concat(p); + }); + normalize(combinedTypes, listeners[prefix], result); + } + } + + return result; +} + +function split(type) { + return type.trim().split(/ +/); +} + +var _$Eventable_14 = {}; +"use strict"; + +function ___typeof_14(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_14 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_14 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_14(obj); } + +Object.defineProperty(_$Eventable_14, "__esModule", { + value: true +}); +_$Eventable_14["default"] = void 0; + +var __arr_14 = ___interopRequireWildcard_14(_$arr_49); + +var ___extend_14 = ___interopRequireDefault_14(_$extend_55); + +var _normalizeListeners = ___interopRequireDefault_14(_$normalizeListeners_61); + +function ___interopRequireDefault_14(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_14() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_14 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_14(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_14(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_14(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_14(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_14(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_14(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_14(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_14(Constructor, staticProps); return Constructor; } + +function ___defineProperty_14(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function fireUntilImmediateStopped(event, listeners) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; + + _ref = listeners[_i]; + var listener = _ref; + + if (event.immediatePropagationStopped) { + break; + } + + listener(event); + } +} + +var Eventable = /*#__PURE__*/function () { + function Eventable(options) { + ___classCallCheck_14(this, Eventable); + + ___defineProperty_14(this, "options", void 0); + + ___defineProperty_14(this, "types", {}); + + ___defineProperty_14(this, "propagationStopped", false); + + ___defineProperty_14(this, "immediatePropagationStopped", false); + + ___defineProperty_14(this, "global", void 0); + + this.options = (0, ___extend_14["default"])({}, options || {}); + } + + ___createClass_14(Eventable, [{ + key: "fire", + value: function fire(event) { + var listeners; + var global = this.global; // Interactable#on() listeners + // tslint:disable no-conditional-assignment + + if (listeners = this.types[event.type]) { + fireUntilImmediateStopped(event, listeners); + } // interact.on() listeners + + + if (!event.propagationStopped && global && (listeners = global[event.type])) { + fireUntilImmediateStopped(event, listeners); + } + } + }, { + key: "on", + value: function on(type, listener) { + var listeners = (0, _normalizeListeners["default"])(type, listener); + + for (type in listeners) { + this.types[type] = __arr_14.merge(this.types[type] || [], listeners[type]); + } + } + }, { + key: "off", + value: function off(type, listener) { + var listeners = (0, _normalizeListeners["default"])(type, listener); + + for (type in listeners) { + var eventList = this.types[type]; + + if (!eventList || !eventList.length) { + continue; + } + + for (var _i2 = 0; _i2 < listeners[type].length; _i2++) { + var _ref2; + + _ref2 = listeners[type][_i2]; + var subListener = _ref2; + + var _index = eventList.indexOf(subListener); + + if (_index !== -1) { + eventList.splice(_index, 1); + } + } + } + } + }, { + key: "getRect", + value: function getRect(_element) { + return null; + } + }]); + + return Eventable; +}(); + +var ___default_14 = Eventable; +_$Eventable_14["default"] = ___default_14; + +var _$rect_65 = {}; +"use strict"; + +function ___typeof_65(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_65 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_65 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_65(obj); } + +Object.defineProperty(_$rect_65, "__esModule", { + value: true +}); +_$rect_65.getStringOptionResult = getStringOptionResult; +_$rect_65.resolveRectLike = resolveRectLike; +_$rect_65.rectToXY = rectToXY; +_$rect_65.xywhToTlbr = xywhToTlbr; +_$rect_65.tlbrToXywh = tlbrToXywh; +_$rect_65.addEdges = addEdges; + +/* removed: var _$domUtils_53 = require("./domUtils"); */; + +var ___extend_65 = ___interopRequireDefault_65(_$extend_55); + +var __is_65 = ___interopRequireWildcard_65(_$is_59); + +function ___getRequireWildcardCache_65() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_65 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_65(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_65(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_65(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_65(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +function getStringOptionResult(value, target, element) { + if (value === 'parent') { + return (0, _$domUtils_53.parentNode)(element); + } + + if (value === 'self') { + return target.getRect(element); + } + + return (0, _$domUtils_53.closest)(element, value); +} + +function resolveRectLike(value, target, element, functionArgs) { + var returnValue = value; + + if (__is_65.string(returnValue)) { + returnValue = getStringOptionResult(returnValue, target, element); + } else if (__is_65.func(returnValue)) { + returnValue = returnValue.apply(void 0, _toConsumableArray(functionArgs)); + } + + if (__is_65.element(returnValue)) { + returnValue = (0, _$domUtils_53.getElementRect)(returnValue); + } + + return returnValue; +} + +function rectToXY(rect) { + return rect && { + x: 'x' in rect ? rect.x : rect.left, + y: 'y' in rect ? rect.y : rect.top + }; +} + +function xywhToTlbr(rect) { + if (rect && !('left' in rect && 'top' in rect)) { + rect = (0, ___extend_65["default"])({}, rect); + rect.left = rect.x || 0; + rect.top = rect.y || 0; + rect.right = rect.right || rect.left + rect.width; + rect.bottom = rect.bottom || rect.top + rect.height; + } + + return rect; +} + +function tlbrToXywh(rect) { + if (rect && !('x' in rect && 'y' in rect)) { + rect = (0, ___extend_65["default"])({}, rect); + rect.x = rect.left || 0; + rect.y = rect.top || 0; + rect.width = rect.width || rect.right || 0 - rect.x; + rect.height = rect.height || rect.bottom || 0 - rect.y; + } + + return rect; +} + +function addEdges(edges, rect, delta) { + if (edges.left) { + rect.left += delta.x; + } + + if (edges.right) { + rect.right += delta.x; + } + + if (edges.top) { + rect.top += delta.y; + } + + if (edges.bottom) { + rect.bottom += delta.y; + } + + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; +} + +var _$getOriginXY_56 = {}; +"use strict"; + +Object.defineProperty(_$getOriginXY_56, "__esModule", { + value: true +}); +_$getOriginXY_56["default"] = ___default_56; + +/* removed: var _$rect_65 = require("./rect"); */; + +function ___default_56(target, element, actionName) { + var actionOptions = target.options[actionName]; + var actionOrigin = actionOptions && actionOptions.origin; + var origin = actionOrigin || target.options.origin; + var originRect = (0, _$rect_65.resolveRectLike)(origin, target, element, [target && element]); + return (0, _$rect_65.rectToXY)(originRect) || { + x: 0, + y: 0 + }; +} + +var _$raf_64 = {}; +"use strict"; + +Object.defineProperty(_$raf_64, "__esModule", { + value: true +}); +_$raf_64["default"] = void 0; +var lastTime = 0; + +var _request; + +var _cancel; + +function __init_64(window) { + _request = window.requestAnimationFrame; + _cancel = window.cancelAnimationFrame; + + if (!_request) { + var vendors = ['ms', 'moz', 'webkit', 'o']; + + for (var _i = 0; _i < vendors.length; _i++) { + var vendor = vendors[_i]; + _request = window["".concat(vendor, "RequestAnimationFrame")]; + _cancel = window["".concat(vendor, "CancelAnimationFrame")] || window["".concat(vendor, "CancelRequestAnimationFrame")]; + } + } + + if (!_request) { + _request = function request(callback) { + var currTime = Date.now(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); // eslint-disable-next-line standard/no-callback-literal + + var token = setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return token; + }; + + _cancel = function cancel(token) { + return clearTimeout(token); + }; + } +} + +var ___default_64 = { + request: function request(callback) { + return _request(callback); + }, + cancel: function cancel(token) { + return _cancel(token); + }, + init: __init_64 +}; +_$raf_64["default"] = ___default_64; + +var _$index_58 = {}; +"use strict"; + +function ___typeof_58(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_58 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_58 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_58(obj); } + +Object.defineProperty(_$index_58, "__esModule", { + value: true +}); +_$index_58.warnOnce = warnOnce; +_$index_58.copyAction = copyAction; +Object.defineProperty(_$index_58, "win", { + enumerable: true, + get: function get() { + return ___window_58["default"]; + } +}); +Object.defineProperty(_$index_58, "browser", { + enumerable: true, + get: function get() { + return ___browser_58["default"]; + } +}); +Object.defineProperty(_$index_58, "clone", { + enumerable: true, + get: function get() { + return _clone["default"]; + } +}); +Object.defineProperty(_$index_58, "events", { + enumerable: true, + get: function get() { + return _events["default"]; + } +}); +Object.defineProperty(_$index_58, "extend", { + enumerable: true, + get: function get() { + return ___extend_58["default"]; + } +}); +Object.defineProperty(_$index_58, "getOriginXY", { + enumerable: true, + get: function get() { + return _getOriginXY["default"]; + } +}); +Object.defineProperty(_$index_58, "hypot", { + enumerable: true, + get: function get() { + return ___hypot_58["default"]; + } +}); +Object.defineProperty(_$index_58, "normalizeListeners", { + enumerable: true, + get: function get() { + return ___normalizeListeners_58["default"]; + } +}); +Object.defineProperty(_$index_58, "raf", { + enumerable: true, + get: function get() { + return _raf["default"]; + } +}); +_$index_58.rect = _$index_58.pointer = _$index_58.is = _$index_58.dom = _$index_58.arr = void 0; + +var __arr_58 = ___interopRequireWildcard_58(_$arr_49); + +_$index_58.arr = __arr_58; + +var dom = ___interopRequireWildcard_58(_$domUtils_53); + +_$index_58.dom = dom; + +var __is_58 = ___interopRequireWildcard_58(_$is_59); + +_$index_58.is = __is_58; + +var pointer = ___interopRequireWildcard_58(_$pointerUtils_63); + +_$index_58.pointer = pointer; + +var rect = ___interopRequireWildcard_58(_$rect_65); + +_$index_58.rect = rect; + +var ___window_58 = ___interopRequireDefault_58(_$window_68); + +var ___browser_58 = ___interopRequireDefault_58(_$browser_50); + +var _clone = ___interopRequireDefault_58(_$clone_51); + +var _events = ___interopRequireDefault_58(_$events_54); + +var ___extend_58 = ___interopRequireDefault_58(_$extend_55); + +var _getOriginXY = ___interopRequireDefault_58(_$getOriginXY_56); + +var ___hypot_58 = ___interopRequireDefault_58(_$hypot_57); + +var ___normalizeListeners_58 = ___interopRequireDefault_58(_$normalizeListeners_61); + +var _raf = ___interopRequireDefault_58(_$raf_64); + +function ___interopRequireDefault_58(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_58() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_58 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_58(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_58(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_58(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function warnOnce(method, message) { + var warned = false; // eslint-disable-next-line no-shadow + + return function () { + if (!warned) { + ___window_58["default"].window.console.warn(message); + + warned = true; + } + + return method.apply(this, arguments); + }; +} + +function copyAction(dest, src) { + dest.name = src.name; + dest.axis = src.axis; + dest.edges = src.edges; + return dest; +} + +var _$defaultOptions_20 = {}; +"use strict"; + +Object.defineProperty(_$defaultOptions_20, "__esModule", { + value: true +}); +_$defaultOptions_20["default"] = _$defaultOptions_20.defaults = void 0; +// tslint:disable no-empty-interface +// eslint-disable-next-line @typescript-eslint/no-empty-interface +// export interface Options extends BaseDefaults, PerActionDefaults {} +var defaults = { + base: { + preventDefault: 'auto', + deltaSource: 'page' + }, + perAction: { + enabled: false, + origin: { + x: 0, + y: 0 + } + }, + actions: {} +}; +_$defaultOptions_20.defaults = defaults; +var ___default_20 = defaults; +_$defaultOptions_20["default"] = ___default_20; + +var _$InteractableSet_17 = {}; +"use strict"; + +function ___typeof_17(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_17 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_17 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_17(obj); } + +Object.defineProperty(_$InteractableSet_17, "__esModule", { + value: true +}); +_$InteractableSet_17["default"] = void 0; + +var __arr_17 = ___interopRequireWildcard_17(_$arr_49); + +var __domUtils_17 = ___interopRequireWildcard_17(_$domUtils_53); + +var ___extend_17 = ___interopRequireDefault_17(_$extend_55); + +var __is_17 = ___interopRequireWildcard_17(_$is_59); + +function ___interopRequireDefault_17(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_17() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_17 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_17(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_17(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_17(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_17(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_17(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_17(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_17(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_17(Constructor, staticProps); return Constructor; } + +function ___defineProperty_17(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var InteractableSet = /*#__PURE__*/function () { + // all set interactables + function InteractableSet(scope) { + var _this = this; + + ___classCallCheck_17(this, InteractableSet); + + this.scope = scope; + + ___defineProperty_17(this, "list", []); + + ___defineProperty_17(this, "selectorMap", {}); + + scope.addListeners({ + 'interactable:unset': function interactableUnset(_ref) { + var interactable = _ref.interactable; + var target = interactable.target, + context = interactable._context; + var targetMappings = __is_17.string(target) ? _this.selectorMap[target] : target[_this.scope.id]; + var targetIndex = targetMappings.findIndex(function (m) { + return m.context === context; + }); + + if (targetMappings[targetIndex]) { + // Destroying mappingInfo's context and interactable + targetMappings[targetIndex].context = null; + targetMappings[targetIndex].interactable = null; + } + + targetMappings.splice(targetIndex, 1); + } + }); + } + + ___createClass_17(InteractableSet, [{ + key: "new", + value: function _new(target, options) { + options = (0, ___extend_17["default"])(options || {}, { + actions: this.scope.actions + }); + var interactable = new this.scope.Interactable(target, options, this.scope.document); + var mappingInfo = { + context: interactable._context, + interactable: interactable + }; + this.scope.addDocument(interactable._doc); + this.list.push(interactable); + + if (__is_17.string(target)) { + if (!this.selectorMap[target]) { + this.selectorMap[target] = []; + } + + this.selectorMap[target].push(mappingInfo); + } else { + if (!interactable.target[this.scope.id]) { + Object.defineProperty(target, this.scope.id, { + value: [], + configurable: true + }); + } + + target[this.scope.id].push(mappingInfo); + } + + this.scope.fire('interactable:new', { + target: target, + options: options, + interactable: interactable, + win: this.scope._win + }); + return interactable; + } + }, { + key: "get", + value: function get(target, options) { + var context = options && options.context || this.scope.document; + var isSelector = __is_17.string(target); + var targetMappings = isSelector ? this.selectorMap[target] : target[this.scope.id]; + + if (!targetMappings) { + return null; + } + + var found = __arr_17.find(targetMappings, function (m) { + return m.context === context && (isSelector || m.interactable.inContext(target)); + }); + return found && found.interactable; + } + }, { + key: "forEachMatch", + value: function forEachMatch(node, callback) { + for (var _i = 0; _i < this.list.length; _i++) { + var _ref2; + + _ref2 = this.list[_i]; + var _interactable = _ref2; + var ret = void 0; + + if ((__is_17.string(_interactable.target) // target is a selector and the element matches + ? __is_17.element(node) && __domUtils_17.matchesSelector(node, _interactable.target) : // target is the element + node === _interactable.target) && // the element is in context + _interactable.inContext(node)) { + ret = callback(_interactable); + } + + if (ret !== undefined) { + return ret; + } + } + } + }]); + + return InteractableSet; +}(); + +_$InteractableSet_17["default"] = InteractableSet; + +var _$BaseEvent_13 = {}; +"use strict"; + +Object.defineProperty(_$BaseEvent_13, "__esModule", { + value: true +}); +_$BaseEvent_13["default"] = _$BaseEvent_13.BaseEvent = void 0; + +function ___classCallCheck_13(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_13(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_13(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_13(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_13(Constructor, staticProps); return Constructor; } + +function ___defineProperty_13(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var BaseEvent = /*#__PURE__*/function () { + ___createClass_13(BaseEvent, [{ + key: "interaction", + get: function get() { + return this._interaction._proxy; + } + }]); + + function BaseEvent(interaction) { + ___classCallCheck_13(this, BaseEvent); + + ___defineProperty_13(this, "type", void 0); + + ___defineProperty_13(this, "target", void 0); + + ___defineProperty_13(this, "currentTarget", void 0); + + ___defineProperty_13(this, "interactable", void 0); + + ___defineProperty_13(this, "_interaction", void 0); + + ___defineProperty_13(this, "timeStamp", void 0); + + ___defineProperty_13(this, "immediatePropagationStopped", false); + + ___defineProperty_13(this, "propagationStopped", false); + + this._interaction = interaction; + } + + ___createClass_13(BaseEvent, [{ + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call any other listeners (even on the current target) + */ + + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }]); + + return BaseEvent; +}(); + +_$BaseEvent_13.BaseEvent = BaseEvent; +var ___default_13 = BaseEvent; +_$BaseEvent_13["default"] = ___default_13; + +var _$InteractEvent_15 = {}; +"use strict"; + +Object.defineProperty(_$InteractEvent_15, "__esModule", { + value: true +}); +_$InteractEvent_15["default"] = _$InteractEvent_15.InteractEvent = void 0; + +var ___extend_15 = ___interopRequireDefault_15(_$extend_55); + +var ___getOriginXY_15 = ___interopRequireDefault_15(_$getOriginXY_56); + +var ___hypot_15 = ___interopRequireDefault_15(_$hypot_57); + +var _BaseEvent2 = ___interopRequireDefault_15(_$BaseEvent_13); + +var _defaultOptions = ___interopRequireDefault_15(_$defaultOptions_20); + +function ___interopRequireDefault_15(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_15(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_15 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_15 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_15(obj); } + +function ___classCallCheck_15(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_15(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_15(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_15(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_15(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (___typeof_15(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function ___defineProperty_15(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var InteractEvent = /*#__PURE__*/function (_BaseEvent) { + _inherits(InteractEvent, _BaseEvent); + + // drag + // resize + + /** */ + function InteractEvent(interaction, event, actionName, phase, element, preEnd, type) { + var _this; + + ___classCallCheck_15(this, InteractEvent); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(InteractEvent).call(this, interaction)); + + ___defineProperty_15(_assertThisInitialized(_this), "target", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "currentTarget", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "relatedTarget", null); + + ___defineProperty_15(_assertThisInitialized(_this), "screenX", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "screenY", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "button", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "buttons", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "ctrlKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "shiftKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "altKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "metaKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "page", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "client", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "delta", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "rect", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "x0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "y0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "t0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dt", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "duration", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "clientX0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "clientY0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "velocity", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "speed", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "swipe", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "timeStamp", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dragEnter", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dragLeave", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "axes", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "preEnd", void 0); + + element = element || interaction.element; + var target = interaction.interactable; + var deltaSource = (target && target.options || _defaultOptions["default"]).deltaSource; + var origin = (0, ___getOriginXY_15["default"])(target, element, actionName); + var starting = phase === 'start'; + var ending = phase === 'end'; + var prevEvent = starting ? _assertThisInitialized(_this) : interaction.prevEvent; + var coords = starting ? interaction.coords.start : ending ? { + page: prevEvent.page, + client: prevEvent.client, + timeStamp: interaction.coords.cur.timeStamp + } : interaction.coords.cur; + _this.page = (0, ___extend_15["default"])({}, coords.page); + _this.client = (0, ___extend_15["default"])({}, coords.client); + _this.rect = (0, ___extend_15["default"])({}, interaction.rect); + _this.timeStamp = coords.timeStamp; + + if (!ending) { + _this.page.x -= origin.x; + _this.page.y -= origin.y; + _this.client.x -= origin.x; + _this.client.y -= origin.y; + } + + _this.ctrlKey = event.ctrlKey; + _this.altKey = event.altKey; + _this.shiftKey = event.shiftKey; + _this.metaKey = event.metaKey; + _this.button = event.button; + _this.buttons = event.buttons; + _this.target = element; + _this.currentTarget = element; + _this.preEnd = preEnd; + _this.type = type || actionName + (phase || ''); + _this.interactable = target; + _this.t0 = starting ? interaction.pointers[interaction.pointers.length - 1].downTime : prevEvent.t0; + _this.x0 = interaction.coords.start.page.x - origin.x; + _this.y0 = interaction.coords.start.page.y - origin.y; + _this.clientX0 = interaction.coords.start.client.x - origin.x; + _this.clientY0 = interaction.coords.start.client.y - origin.y; + + if (starting || ending) { + _this.delta = { + x: 0, + y: 0 + }; + } else { + _this.delta = { + x: _this[deltaSource].x - prevEvent[deltaSource].x, + y: _this[deltaSource].y - prevEvent[deltaSource].y + }; + } + + _this.dt = interaction.coords.delta.timeStamp; + _this.duration = _this.timeStamp - _this.t0; // velocity and speed in pixels per second + + _this.velocity = (0, ___extend_15["default"])({}, interaction.coords.velocity[deltaSource]); + _this.speed = (0, ___hypot_15["default"])(_this.velocity.x, _this.velocity.y); + _this.swipe = ending || phase === 'inertiastart' ? _this.getSwipe() : null; + return _this; + } + + ___createClass_15(InteractEvent, [{ + key: "getSwipe", + value: function getSwipe() { + var interaction = this._interaction; + + if (interaction.prevEvent.speed < 600 || this.timeStamp - interaction.prevEvent.timeStamp > 150) { + return null; + } + + var angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI; + var overlap = 22.5; + + if (angle < 0) { + angle += 360; + } + + var left = 135 - overlap <= angle && angle < 225 + overlap; + var up = 225 - overlap <= angle && angle < 315 + overlap; + var right = !left && (315 - overlap <= angle || angle < 45 + overlap); + var down = !up && 45 - overlap <= angle && angle < 135 + overlap; + return { + up: up, + down: down, + left: left, + right: right, + angle: angle, + speed: interaction.prevEvent.speed, + velocity: { + x: interaction.prevEvent.velocityX, + y: interaction.prevEvent.velocityY + } + }; + } + }, { + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + /** + * Don't call any other listeners (even on the current target) + */ + + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "pageX", + get: function get() { + return this.page.x; + }, + set: function set(value) { + this.page.x = value; + } + }, { + key: "pageY", + get: function get() { + return this.page.y; + }, + set: function set(value) { + this.page.y = value; + } + }, { + key: "clientX", + get: function get() { + return this.client.x; + }, + set: function set(value) { + this.client.x = value; + } + }, { + key: "clientY", + get: function get() { + return this.client.y; + }, + set: function set(value) { + this.client.y = value; + } + }, { + key: "dx", + get: function get() { + return this.delta.x; + }, + set: function set(value) { + this.delta.x = value; + } + }, { + key: "dy", + get: function get() { + return this.delta.y; + }, + set: function set(value) { + this.delta.y = value; + } + }, { + key: "velocityX", + get: function get() { + return this.velocity.x; + }, + set: function set(value) { + this.velocity.x = value; + } + }, { + key: "velocityY", + get: function get() { + return this.velocity.y; + }, + set: function set(value) { + this.velocity.y = value; + } + }]); + + return InteractEvent; +}(_BaseEvent2["default"]); + +_$InteractEvent_15.InteractEvent = InteractEvent; +var ___default_15 = InteractEvent; +_$InteractEvent_15["default"] = ___default_15; + +var _$PointerInfo_19 = {}; +"use strict"; + +Object.defineProperty(_$PointerInfo_19, "__esModule", { + value: true +}); +_$PointerInfo_19["default"] = _$PointerInfo_19.PointerInfo = void 0; + +function ___classCallCheck_19(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* eslint-disable @typescript-eslint/no-parameter-properties */ +var PointerInfo = function PointerInfo(id, pointer, event, downTime, downTarget) { + ___classCallCheck_19(this, PointerInfo); + + this.id = id; + this.pointer = pointer; + this.event = event; + this.downTime = downTime; + this.downTarget = downTarget; +}; + +_$PointerInfo_19.PointerInfo = PointerInfo; +var ___default_19 = PointerInfo; +_$PointerInfo_19["default"] = ___default_19; + +var _$Interaction_18 = {}; +"use strict"; + +function ___typeof_18(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_18 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_18 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_18(obj); } + +Object.defineProperty(_$Interaction_18, "__esModule", { + value: true +}); +Object.defineProperty(_$Interaction_18, "PointerInfo", { + enumerable: true, + get: function get() { + return _PointerInfo["default"]; + } +}); +_$Interaction_18["default"] = _$Interaction_18.Interaction = _$Interaction_18._ProxyMethods = _$Interaction_18._ProxyValues = void 0; + +var utils = ___interopRequireWildcard_18(_$index_58); + +var _InteractEvent = ___interopRequireDefault_18(_$InteractEvent_15); + +var _PointerInfo = ___interopRequireDefault_18(_$PointerInfo_19); + +function ___interopRequireDefault_18(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_18() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_18 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_18(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_18(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_18(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_18(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_18(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_18(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_18(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_18(Constructor, staticProps); return Constructor; } + +function ___defineProperty_18(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _ProxyValues; + +_$Interaction_18._ProxyValues = _ProxyValues; + +(function (_ProxyValues) { + _ProxyValues["interactable"] = ""; + _ProxyValues["element"] = ""; + _ProxyValues["prepared"] = ""; + _ProxyValues["pointerIsDown"] = ""; + _ProxyValues["pointerWasMoved"] = ""; + _ProxyValues["_proxy"] = ""; +})(_ProxyValues || (_$Interaction_18._ProxyValues = _ProxyValues = {})); + +var _ProxyMethods; + +_$Interaction_18._ProxyMethods = _ProxyMethods; + +(function (_ProxyMethods) { + _ProxyMethods["start"] = ""; + _ProxyMethods["move"] = ""; + _ProxyMethods["end"] = ""; + _ProxyMethods["stop"] = ""; + _ProxyMethods["interacting"] = ""; +})(_ProxyMethods || (_$Interaction_18._ProxyMethods = _ProxyMethods = {})); + +var idCounter = 0; + +var Interaction = /*#__PURE__*/function () { + ___createClass_18(Interaction, [{ + key: "pointerMoveTolerance", + // current interactable being interacted with + // the target element of the interactable + // action that's ready to be fired on next move event + // keep track of added pointers + // pointerdown/mousedown/touchstart event + // previous action event + get: function get() { + return 1; + } + /** + * @alias Interaction.prototype.move + */ + + }]); + + /** */ + function Interaction(_ref) { + var _this = this; + + var pointerType = _ref.pointerType, + scopeFire = _ref.scopeFire; + + ___classCallCheck_18(this, Interaction); + + ___defineProperty_18(this, "interactable", null); + + ___defineProperty_18(this, "element", null); + + ___defineProperty_18(this, "rect", void 0); + + ___defineProperty_18(this, "_rects", void 0); + + ___defineProperty_18(this, "edges", void 0); + + ___defineProperty_18(this, "_scopeFire", void 0); + + ___defineProperty_18(this, "prepared", { + name: null, + axis: null, + edges: null + }); + + ___defineProperty_18(this, "pointerType", void 0); + + ___defineProperty_18(this, "pointers", []); + + ___defineProperty_18(this, "downEvent", null); + + ___defineProperty_18(this, "downPointer", {}); + + ___defineProperty_18(this, "_latestPointer", { + pointer: null, + event: null, + eventTarget: null + }); + + ___defineProperty_18(this, "prevEvent", null); + + ___defineProperty_18(this, "pointerIsDown", false); + + ___defineProperty_18(this, "pointerWasMoved", false); + + ___defineProperty_18(this, "_interacting", false); + + ___defineProperty_18(this, "_ending", false); + + ___defineProperty_18(this, "_stopped", true); + + ___defineProperty_18(this, "_proxy", null); + + ___defineProperty_18(this, "simulation", null); + + ___defineProperty_18(this, "doMove", utils.warnOnce(function (signalArg) { + this.move(signalArg); + }, 'The interaction.doMove() method has been renamed to interaction.move()')); + + ___defineProperty_18(this, "coords", { + // Starting InteractEvent pointer coordinates + start: utils.pointer.newCoords(), + // Previous native pointer move event coordinates + prev: utils.pointer.newCoords(), + // current native pointer move event coordinates + cur: utils.pointer.newCoords(), + // Change in coordinates and time of the pointer + delta: utils.pointer.newCoords(), + // pointer velocity + velocity: utils.pointer.newCoords() + }); + + ___defineProperty_18(this, "_id", idCounter++); + + this._scopeFire = scopeFire; + this.pointerType = pointerType; + var that = this; + this._proxy = {}; + + var _loop = function _loop(key) { + Object.defineProperty(_this._proxy, key, { + get: function get() { + return that[key]; + } + }); + }; + + for (var key in _ProxyValues) { + _loop(key); + } + + var _loop2 = function _loop2(_key) { + Object.defineProperty(_this._proxy, _key, { + value: function value() { + return that[_key].apply(that, arguments); + } + }); + }; + + for (var _key in _ProxyMethods) { + _loop2(_key); + } + + this._scopeFire('interactions:new', { + interaction: this + }); + } + + ___createClass_18(Interaction, [{ + key: "pointerDown", + value: function pointerDown(pointer, event, eventTarget) { + var pointerIndex = this.updatePointer(pointer, event, eventTarget, true); + var pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:down', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + pointerIndex: pointerIndex, + pointerInfo: pointerInfo, + type: 'down', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable({ + * // disable the default drag start by down->move + * manualStart: true + * }) + * // start dragging after the user holds the pointer down + * .on('hold', function (event) { + * var interaction = event.interaction + * + * if (!interaction.interacting()) { + * interaction.start({ name: 'drag' }, + * event.interactable, + * event.currentTarget) + * } + * }) + * ``` + * + * Start an action with the given Interactable and Element as tartgets. The + * action must be enabled for the target Interactable and an appropriate + * number of pointers must be held down - 1 for drag/resize, 2 for gesture. + * + * Use it with `interactable.able({ manualStart: false })` to always + * [start actions manually](https://github.com/taye/interact.js/issues/114) + * + * @param {object} action The action to be performed - drag, resize, etc. + * @param {Interactable} target The Interactable to target + * @param {Element} element The DOM Element to target + * @return {object} interact + */ + + }, { + key: "start", + value: function start(action, interactable, element) { + if (this.interacting() || !this.pointerIsDown || this.pointers.length < (action.name === 'gesture' ? 2 : 1) || !interactable.options[action.name].enabled) { + return false; + } + + utils.copyAction(this.prepared, action); + this.interactable = interactable; + this.element = element; + this.rect = interactable.getRect(element); + this.edges = this.prepared.edges ? utils.extend({}, this.prepared.edges) : { + left: true, + right: true, + top: true, + bottom: true + }; + this._stopped = false; + this._interacting = this._doPhase({ + interaction: this, + event: this.downEvent, + phase: 'start' + }) && !this._stopped; + return this._interacting; + } + }, { + key: "pointerMove", + value: function pointerMove(pointer, event, eventTarget) { + if (!this.simulation && !(this.modification && this.modification.endResult)) { + this.updatePointer(pointer, event, eventTarget, false); + } + + var duplicateMove = this.coords.cur.page.x === this.coords.prev.page.x && this.coords.cur.page.y === this.coords.prev.page.y && this.coords.cur.client.x === this.coords.prev.client.x && this.coords.cur.client.y === this.coords.prev.client.y; + var dx; + var dy; // register movement greater than pointerMoveTolerance + + if (this.pointerIsDown && !this.pointerWasMoved) { + dx = this.coords.cur.client.x - this.coords.start.client.x; + dy = this.coords.cur.client.y - this.coords.start.client.y; + this.pointerWasMoved = utils.hypot(dx, dy) > this.pointerMoveTolerance; + } + + var pointerIndex = this.getPointerIndex(pointer); + var signalArg = { + pointer: pointer, + pointerIndex: pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event: event, + type: 'move', + eventTarget: eventTarget, + dx: dx, + dy: dy, + duplicate: duplicateMove, + interaction: this + }; + + if (!duplicateMove) { + // set pointer coordinate, time changes and velocity + utils.pointer.setCoordVelocity(this.coords.velocity, this.coords.delta); + } + + this._scopeFire('interactions:move', signalArg); + + if (!duplicateMove && !this.simulation) { + // if interacting, fire an 'action-move' signal etc + if (this.interacting()) { + signalArg.type = null; + this.move(signalArg); + } + + if (this.pointerWasMoved) { + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + } + } + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('dragmove', function (event) { + * if (someCondition) { + * // change the snap settings + * event.interactable.draggable({ snap: { targets: [] }}) + * // fire another move event with re-calculated snap + * event.interaction.move() + * } + * }) + * ``` + * + * Force a move of the current action at the same coordinates. Useful if + * snap/restrict has been changed and you want a movement with the new + * settings. + */ + + }, { + key: "move", + value: function move(signalArg) { + if (!signalArg || !signalArg.event) { + utils.pointer.setZeroCoords(this.coords.delta); + } + + signalArg = utils.extend({ + pointer: this._latestPointer.pointer, + event: this._latestPointer.event, + eventTarget: this._latestPointer.eventTarget, + interaction: this + }, signalArg || {}); + signalArg.phase = 'move'; + + this._doPhase(signalArg); + } // End interact move events and stop auto-scroll unless simulation is running + + }, { + key: "pointerUp", + value: function pointerUp(pointer, event, eventTarget, curEventTarget) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + pointerIndex = this.updatePointer(pointer, event, eventTarget, false); + } + + var type = /cancel$/i.test(event.type) ? 'cancel' : 'up'; + + this._scopeFire("interactions:".concat(type), { + pointer: pointer, + pointerIndex: pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event: event, + eventTarget: eventTarget, + type: type, + curEventTarget: curEventTarget, + interaction: this + }); + + if (!this.simulation) { + this.end(event); + } + + this.pointerIsDown = false; + this.removePointer(pointer, event); + } + }, { + key: "documentBlur", + value: function documentBlur(event) { + this.end(event); + + this._scopeFire('interactions:blur', { + event: event, + type: 'blur', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('move', function (event) { + * if (event.pageX > 1000) { + * // end the current action + * event.interaction.end() + * // stop all further listeners from being called + * event.stopImmediatePropagation() + * } + * }) + * ``` + * + * @param {PointerEvent} [event] + */ + + }, { + key: "end", + value: function end(event) { + this._ending = true; + event = event || this._latestPointer.event; + var endPhaseResult; + + if (this.interacting()) { + endPhaseResult = this._doPhase({ + event: event, + interaction: this, + phase: 'end' + }); + } + + this._ending = false; + + if (endPhaseResult === true) { + this.stop(); + } + } + }, { + key: "currentAction", + value: function currentAction() { + return this._interacting ? this.prepared.name : null; + } + }, { + key: "interacting", + value: function interacting() { + return this._interacting; + } + /** */ + + }, { + key: "stop", + value: function stop() { + this._scopeFire('interactions:stop', { + interaction: this + }); + + this.interactable = this.element = null; + this._interacting = false; + this._stopped = true; + this.prepared.name = this.prevEvent = null; + } + }, { + key: "getPointerIndex", + value: function getPointerIndex(pointer) { + var pointerId = utils.pointer.getPointerId(pointer); // mouse and pen interactions may have only one pointer + + return this.pointerType === 'mouse' || this.pointerType === 'pen' ? this.pointers.length - 1 : utils.arr.findIndex(this.pointers, function (curPointer) { + return curPointer.id === pointerId; + }); + } + }, { + key: "getPointerInfo", + value: function getPointerInfo(pointer) { + return this.pointers[this.getPointerIndex(pointer)]; + } + }, { + key: "updatePointer", + value: function updatePointer(pointer, event, eventTarget, down) { + var id = utils.pointer.getPointerId(pointer); + var pointerIndex = this.getPointerIndex(pointer); + var pointerInfo = this.pointers[pointerIndex]; + down = down === false ? false : down || /(down|start)$/i.test(event.type); + + if (!pointerInfo) { + pointerInfo = new _PointerInfo["default"](id, pointer, event, null, null); + pointerIndex = this.pointers.length; + this.pointers.push(pointerInfo); + } else { + pointerInfo.pointer = pointer; + } + + utils.pointer.setCoords(this.coords.cur, this.pointers.map(function (p) { + return p.pointer; + }), this._now()); + utils.pointer.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur); + + if (down) { + this.pointerIsDown = true; + pointerInfo.downTime = this.coords.cur.timeStamp; + pointerInfo.downTarget = eventTarget; + utils.pointer.pointerExtend(this.downPointer, pointer); + + if (!this.interacting()) { + utils.pointer.copyCoords(this.coords.start, this.coords.cur); + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + this.downEvent = event; + this.pointerWasMoved = false; + } + } + + this._updateLatestPointer(pointer, event, eventTarget); + + this._scopeFire('interactions:update-pointer', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + down: down, + pointerInfo: pointerInfo, + pointerIndex: pointerIndex, + interaction: this + }); + + return pointerIndex; + } + }, { + key: "removePointer", + value: function removePointer(pointer, event) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + return; + } + + var pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:remove-pointer', { + pointer: pointer, + event: event, + eventTarget: null, + pointerIndex: pointerIndex, + pointerInfo: pointerInfo, + interaction: this + }); + + this.pointers.splice(pointerIndex, 1); + } + }, { + key: "_updateLatestPointer", + value: function _updateLatestPointer(pointer, event, eventTarget) { + this._latestPointer.pointer = pointer; + this._latestPointer.event = event; + this._latestPointer.eventTarget = eventTarget; + } + }, { + key: "destroy", + value: function destroy() { + this._latestPointer.pointer = null; + this._latestPointer.event = null; + this._latestPointer.eventTarget = null; + } + }, { + key: "_createPreparedEvent", + value: function _createPreparedEvent(event, phase, preEnd, type) { + return new _InteractEvent["default"](this, event, this.prepared.name, phase, this.element, preEnd, type); + } + }, { + key: "_fireEvent", + value: function _fireEvent(iEvent) { + this.interactable.fire(iEvent); + + if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) { + this.prevEvent = iEvent; + } + } + }, { + key: "_doPhase", + value: function _doPhase(signalArg) { + var event = signalArg.event, + phase = signalArg.phase, + preEnd = signalArg.preEnd, + type = signalArg.type; + var rect = this.rect; + + if (rect && phase === 'move') { + // update the rect changes due to pointer move + utils.rect.addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource]); + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + + var beforeResult = this._scopeFire("interactions:before-action-".concat(phase), signalArg); + + if (beforeResult === false) { + return false; + } + + var iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type); + + this._scopeFire("interactions:action-".concat(phase), signalArg); + + if (phase === 'start') { + this.prevEvent = iEvent; + } + + this._fireEvent(iEvent); + + this._scopeFire("interactions:after-action-".concat(phase), signalArg); + + return true; + } + }, { + key: "_now", + value: function _now() { + return Date.now(); + } + }]); + + return Interaction; +}(); + +_$Interaction_18.Interaction = Interaction; +var ___default_18 = Interaction; +_$Interaction_18["default"] = ___default_18; + +var _$interactionFinder_22 = {}; +"use strict"; + +function ___typeof_22(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_22 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_22 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_22(obj); } + +Object.defineProperty(_$interactionFinder_22, "__esModule", { + value: true +}); +_$interactionFinder_22["default"] = void 0; + +var __dom_22 = ___interopRequireWildcard_22(_$domUtils_53); + +function ___getRequireWildcardCache_22() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_22 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_22(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_22(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_22(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +var finder = { + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], + search: function search(details) { + for (var _i = 0; _i < finder.methodOrder.length; _i++) { + var _ref; + + _ref = finder.methodOrder[_i]; + var method = _ref; + var interaction = finder[method](details); + + if (interaction) { + return interaction; + } + } + + return null; + }, + // try to resume simulation with a new pointer + simulationResume: function simulationResume(_ref2) { + var pointerType = _ref2.pointerType, + eventType = _ref2.eventType, + eventTarget = _ref2.eventTarget, + scope = _ref2.scope; + + if (!/down|start/i.test(eventType)) { + return null; + } + + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref3; + + _ref3 = scope.interactions.list[_i2]; + var interaction = _ref3; + var element = eventTarget; + + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { + while (element) { + // if the element is the interaction element + if (element === interaction.element) { + return interaction; + } + + element = __dom_22.parentNode(element); + } + } + } + + return null; + }, + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { + var pointerId = _ref4.pointerId, + pointerType = _ref4.pointerType, + eventType = _ref4.eventType, + scope = _ref4.scope; + + if (pointerType !== 'mouse' && pointerType !== 'pen') { + return null; + } + + var firstNonActive; + + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref5; + + _ref5 = scope.interactions.list[_i3]; + var interaction = _ref5; + + if (interaction.pointerType === pointerType) { + // if it's a down event, skip interactions with running simulations + if (interaction.simulation && !hasPointerId(interaction, pointerId)) { + continue; + } // if the interaction is active, return it immediately + + + if (interaction.interacting()) { + return interaction; + } // otherwise save it and look for another active interaction + else if (!firstNonActive) { + firstNonActive = interaction; + } + } + } // if no active mouse interaction was found use the first inactive mouse + // interaction + + + if (firstNonActive) { + return firstNonActive; + } // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation + // is active + + + for (var _i4 = 0; _i4 < scope.interactions.list.length; _i4++) { + var _ref6; + + _ref6 = scope.interactions.list[_i4]; + var _interaction = _ref6; + + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { + return _interaction; + } + } + + return null; + }, + // get interaction that has this pointer + hasPointer: function hasPointer(_ref7) { + var pointerId = _ref7.pointerId, + scope = _ref7.scope; + + for (var _i5 = 0; _i5 < scope.interactions.list.length; _i5++) { + var _ref8; + + _ref8 = scope.interactions.list[_i5]; + var interaction = _ref8; + + if (hasPointerId(interaction, pointerId)) { + return interaction; + } + } + + return null; + }, + // get first idle interaction with a matching pointerType + idle: function idle(_ref9) { + var pointerType = _ref9.pointerType, + scope = _ref9.scope; + + for (var _i6 = 0; _i6 < scope.interactions.list.length; _i6++) { + var _ref10; + + _ref10 = scope.interactions.list[_i6]; + var interaction = _ref10; + + // if there's already a pointer held down + if (interaction.pointers.length === 1) { + var target = interaction.interactable; // don't add this pointer if there is a target interactable and it + // isn't gesturable + + if (target && !(target.options.gesture && target.options.gesture.enabled)) { + continue; + } + } // maximum of 2 pointers per interaction + else if (interaction.pointers.length >= 2) { + continue; + } + + if (!interaction.interacting() && pointerType === interaction.pointerType) { + return interaction; + } + } + + return null; + } +}; + +function hasPointerId(interaction, pointerId) { + return interaction.pointers.some(function (_ref11) { + var id = _ref11.id; + return id === pointerId; + }); +} + +var ___default_22 = finder; +_$interactionFinder_22["default"] = ___default_22; + +var _$interactablePreventDefault_21 = {}; +"use strict"; + +function ___typeof_21(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_21 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_21 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_21(obj); } + +Object.defineProperty(_$interactablePreventDefault_21, "__esModule", { + value: true +}); +_$interactablePreventDefault_21.install = __install_21; +_$interactablePreventDefault_21["default"] = void 0; + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var ___events_21 = ___interopRequireDefault_21(_$events_54); + +var __is_21 = ___interopRequireWildcard_21(_$is_59); + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +function ___getRequireWildcardCache_21() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_21 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_21(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_21(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_21(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_21(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function preventDefault(newValue) { + if (/^(always|never|auto)$/.test(newValue)) { + this.options.preventDefault = newValue; + return this; + } + + if (__is_21.bool(newValue)) { + this.options.preventDefault = newValue ? 'always' : 'never'; + return this; + } + + return this.options.preventDefault; +} + +function checkAndPreventDefault(interactable, scope, event) { + var setting = interactable.options.preventDefault; + + if (setting === 'never') { + return; + } + + if (setting === 'always') { + event.preventDefault(); + return; + } // setting === 'auto' + // if the browser supports passive event listeners and isn't running on iOS, + // don't preventDefault of touch{start,move} events. CSS touch-action and + // user-select should be used instead of calling event.preventDefault(). + + + if (___events_21["default"].supportsPassive && /^touch(start|move)$/.test(event.type)) { + var doc = (0, _$window_68.getWindow)(event.target).document; + var docOptions = scope.getDocOptions(doc); + + if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) { + return; + } + } // don't preventDefault of pointerdown events + + + if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) { + return; + } // don't preventDefault on editable elements + + + if (__is_21.element(event.target) && (0, _$domUtils_53.matchesSelector)(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) { + return; + } + + event.preventDefault(); +} + +function onInteractionEvent(_ref) { + var interaction = _ref.interaction, + event = _ref.event; + + if (interaction.interactable) { + interaction.interactable.checkAndPreventDefault(event); + } +} + +function __install_21(scope) { + /** @lends Interactable */ + var Interactable = scope.Interactable; + /** + * Returns or sets whether to prevent the browser's default behaviour in + * response to pointer events. Can be set to: + * - `'always'` to always prevent + * - `'never'` to never prevent + * - `'auto'` to let interact.js try to determine what would be best + * + * @param {string} [newValue] `'always'`, `'never'` or `'auto'` + * @return {string | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.preventDefault = preventDefault; + + Interactable.prototype.checkAndPreventDefault = function (event) { + return checkAndPreventDefault(this, scope, event); + }; // prevent native HTML5 drag on interact.js target elements + + + scope.interactions.docEvents.push({ + type: 'dragstart', + listener: function listener(event) { + for (var _i = 0; _i < scope.interactions.list.length; _i++) { + var _ref2; + + _ref2 = scope.interactions.list[_i]; + var interaction = _ref2; + + if (interaction.element && (interaction.element === event.target || (0, _$domUtils_53.nodeContains)(interaction.element, event.target))) { + interaction.interactable.checkAndPreventDefault(event); + return; + } + } + } + }); +} + +var ___default_21 = { + id: 'core/interactablePreventDefault', + install: __install_21, + listeners: ['down', 'move', 'up', 'cancel'].reduce(function (acc, eventType) { + acc["interactions:".concat(eventType)] = onInteractionEvent; + return acc; + }, {}) +}; +_$interactablePreventDefault_21["default"] = ___default_21; + +var _$DropEvent_2 = {}; +"use strict"; + +Object.defineProperty(_$DropEvent_2, "__esModule", { + value: true +}); +_$DropEvent_2["default"] = void 0; + +var ___BaseEvent2_2 = ___interopRequireDefault_2(_$BaseEvent_13); + +var __arr_2 = ___interopRequireWildcard_2(_$arr_49); + +function ___getRequireWildcardCache_2() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_2 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_2(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_2(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_2(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_2(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_2(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_2 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_2 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_2(obj); } + +function ___classCallCheck_2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_2(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_2(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_2(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_2(Constructor, staticProps); return Constructor; } + +function ___possibleConstructorReturn_2(self, call) { if (call && (___typeof_2(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_2(self); } + +function ___getPrototypeOf_2(o) { ___getPrototypeOf_2 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_2(o); } + +function ___assertThisInitialized_2(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ___inherits_2(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_2(subClass, superClass); } + +function ___setPrototypeOf_2(o, p) { ___setPrototypeOf_2 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_2(o, p); } + +function ___defineProperty_2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var DropEvent = /*#__PURE__*/function (_BaseEvent) { + ___inherits_2(DropEvent, _BaseEvent); + + /** + * Class of events fired on dropzones during drags with acceptable targets. + */ + function DropEvent(dropState, dragEvent, type) { + var _this; + + ___classCallCheck_2(this, DropEvent); + + _this = ___possibleConstructorReturn_2(this, ___getPrototypeOf_2(DropEvent).call(this, dragEvent._interaction)); + + ___defineProperty_2(___assertThisInitialized_2(_this), "target", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "dropzone", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "dragEvent", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "relatedTarget", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "draggable", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "timeStamp", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "propagationStopped", false); + + ___defineProperty_2(___assertThisInitialized_2(_this), "immediatePropagationStopped", false); + + var _ref = type === 'dragleave' ? dropState.prev : dropState.cur, + element = _ref.element, + dropzone = _ref.dropzone; + + _this.type = type; + _this.target = element; + _this.currentTarget = element; + _this.dropzone = dropzone; + _this.dragEvent = dragEvent; + _this.relatedTarget = dragEvent.target; + _this.draggable = dragEvent.interactable; + _this.timeStamp = dragEvent.timeStamp; + return _this; + } + /** + * If this is a `dropactivate` event, the dropzone element will be + * deactivated. + * + * If this is a `dragmove` or `dragenter`, a `dragleave` will be fired on the + * dropzone element and more. + */ + + + ___createClass_2(DropEvent, [{ + key: "reject", + value: function reject() { + var _this2 = this; + + var dropState = this._interaction.dropState; + + if (this.type !== 'dropactivate' && (!this.dropzone || dropState.cur.dropzone !== this.dropzone || dropState.cur.element !== this.target)) { + return; + } + + dropState.prev.dropzone = this.dropzone; + dropState.prev.element = this.target; + dropState.rejected = true; + dropState.events.enter = null; + this.stopImmediatePropagation(); + + if (this.type === 'dropactivate') { + var activeDrops = dropState.activeDrops; + var index = __arr_2.findIndex(activeDrops, function (_ref2) { + var dropzone = _ref2.dropzone, + element = _ref2.element; + return dropzone === _this2.dropzone && element === _this2.target; + }); + dropState.activeDrops.splice(index, 1); + var deactivateEvent = new DropEvent(dropState, this.dragEvent, 'dropdeactivate'); + deactivateEvent.dropzone = this.dropzone; + deactivateEvent.target = this.target; + this.dropzone.fire(deactivateEvent); + } else { + this.dropzone.fire(new DropEvent(dropState, this.dragEvent, 'dragleave')); + } + } + }, { + key: "preventDefault", + value: function preventDefault() {} + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }]); + + return DropEvent; +}(___BaseEvent2_2["default"]); + +var ___default_2 = DropEvent; +_$DropEvent_2["default"] = ___default_2; + +var _$index_3 = {}; +"use strict"; + +function ___typeof_3(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_3 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_3 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_3(obj); } + +Object.defineProperty(_$index_3, "__esModule", { + value: true +}); +_$index_3["default"] = void 0; + +var ___Interactable_3 = ___interopRequireDefault_3(_$Interactable_16({})); + +var ___scope_3 = _$scope_24({}); + +var __utils_3 = ___interopRequireWildcard_3(_$index_58); + +var _drag = ___interopRequireDefault_3(_$drag_1); + +var _DropEvent = ___interopRequireDefault_3(_$DropEvent_2); + +function ___getRequireWildcardCache_3() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_3 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_3(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_3(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_3(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_3(scope) { + var actions = scope.actions, + interact = scope.interact, + Interactable = scope.Interactable, + defaults = scope.defaults; + scope.usePlugin(_drag["default"]); + /** + * + * ```js + * interact('.drop').dropzone({ + * accept: '.can-drop' || document.getElementById('single-drop'), + * overlap: 'pointer' || 'center' || zeroToOne + * } + * ``` + * + * Returns or sets whether draggables can be dropped onto this target to + * trigger drop events + * + * Dropzones can receive the following events: + * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends + * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone + * - `dragmove` when a draggable that has entered the dropzone is moved + * - `drop` when a draggable is dropped into this dropzone + * + * Use the `accept` option to allow only elements that match the given CSS + * selector or element. The value can be: + * + * - **an Element** - only that element can be dropped into this dropzone. + * - **a string**, - the element being dragged must match it as a CSS selector. + * - **`null`** - accept options is cleared - it accepts any element. + * + * Use the `overlap` option to set how drops are checked for. The allowed + * values are: + * + * - `'pointer'`, the pointer must be over the dropzone (default) + * - `'center'`, the draggable element's center must be over the dropzone + * - a number from 0-1 which is the `(intersection area) / (draggable area)`. + * e.g. `0.5` for drop to happen when half of the area of the draggable is + * over the dropzone + * + * Use the `checker` option to specify a function to check if a dragged element + * is over this Interactable. + * + * @param {boolean | object | null} [options] The new options to be set. + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.dropzone = function (options) { + return dropzoneMethod(this, options); + }; + /** + * ```js + * interact(target) + * .dropChecker(function(dragEvent, // related dragmove or dragend event + * event, // TouchEvent/PointerEvent/MouseEvent + * dropped, // bool result of the default checker + * dropzone, // dropzone Interactable + * dropElement, // dropzone elemnt + * draggable, // draggable Interactable + * draggableElement) {// draggable element + * + * return dropped && event.target.hasAttribute('allow-drop') + * } + * ``` + */ + + + Interactable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) { + return dropCheckMethod(this, dragEvent, event, draggable, draggableElement, dropElement, rect); + }; + /** + * Returns or sets whether the dimensions of dropzone elements are calculated + * on every dragmove or only on dragstart for the default dropChecker + * + * @param {boolean} [newValue] True to check on each move. False to check only + * before start + * @return {boolean | interact} The current setting or interact + */ + + + interact.dynamicDrop = function (newValue) { + if (__utils_3.is.bool(newValue)) { + // if (dragging && scope.dynamicDrop !== newValue && !newValue) { + // calcRects(dropzones) + // } + scope.dynamicDrop = newValue; + return interact; + } + + return scope.dynamicDrop; + }; + + __utils_3.extend(actions.phaselessTypes, { + dragenter: true, + dragleave: true, + dropactivate: true, + dropdeactivate: true, + dropmove: true, + drop: true + }); + actions.methodDict.drop = 'dropzone'; + scope.dynamicDrop = false; + defaults.actions.drop = drop.defaults; +} + +function collectDrops(_ref, draggableElement) { + var interactables = _ref.interactables; + var drops = []; // collect all dropzones and their elements which qualify for a drop + + for (var _i = 0; _i < interactables.list.length; _i++) { + var _ref2; + + _ref2 = interactables.list[_i]; + var dropzone = _ref2; + + if (!dropzone.options.drop.enabled) { + continue; + } + + var accept = dropzone.options.drop.accept; // test the draggable draggableElement against the dropzone's accept setting + + if (__utils_3.is.element(accept) && accept !== draggableElement || __utils_3.is.string(accept) && !__utils_3.dom.matchesSelector(draggableElement, accept) || __utils_3.is.func(accept) && !accept({ + dropzone: dropzone, + draggableElement: draggableElement + })) { + continue; + } // query for new elements if necessary + + + var dropElements = __utils_3.is.string(dropzone.target) ? dropzone._context.querySelectorAll(dropzone.target) : __utils_3.is.array(dropzone.target) ? dropzone.target : [dropzone.target]; + + for (var _i2 = 0; _i2 < dropElements.length; _i2++) { + var _ref3; + + _ref3 = dropElements[_i2]; + var dropzoneElement = _ref3; + + if (dropzoneElement !== draggableElement) { + drops.push({ + dropzone: dropzone, + element: dropzoneElement + }); + } + } + } + + return drops; +} + +function fireActivationEvents(activeDrops, event) { + // loop through all active dropzones and trigger event + for (var _i3 = 0; _i3 < activeDrops.slice().length; _i3++) { + var _ref4; + + _ref4 = activeDrops.slice()[_i3]; + var _ref5 = _ref4, + dropzone = _ref5.dropzone, + element = _ref5.element; + event.dropzone = dropzone; // set current element as event target + + event.target = element; + dropzone.fire(event); + event.propagationStopped = event.immediatePropagationStopped = false; + } +} // return a new array of possible drops. getActiveDrops should always be +// called when a drag has just started or a drag event happens while +// dynamicDrop is true + + +function getActiveDrops(scope, dragElement) { + // get dropzones and their elements that could receive the draggable + var activeDrops = collectDrops(scope, dragElement); + + for (var _i4 = 0; _i4 < activeDrops.length; _i4++) { + var _ref6; + + _ref6 = activeDrops[_i4]; + var activeDrop = _ref6; + activeDrop.rect = activeDrop.dropzone.getRect(activeDrop.element); + } + + return activeDrops; +} + +function getDrop(_ref7, dragEvent, pointerEvent) { + var dropState = _ref7.dropState, + draggable = _ref7.interactable, + dragElement = _ref7.element; + var validDrops = []; // collect all dropzones and their elements which qualify for a drop + + for (var _i5 = 0; _i5 < dropState.activeDrops.length; _i5++) { + var _ref8; + + _ref8 = dropState.activeDrops[_i5]; + var _ref9 = _ref8, + dropzone = _ref9.dropzone, + dropzoneElement = _ref9.element, + _rect = _ref9.rect; + validDrops.push(dropzone.dropCheck(dragEvent, pointerEvent, draggable, dragElement, dropzoneElement, _rect) ? dropzoneElement : null); + } // get the most appropriate dropzone based on DOM depth and order + + + var dropIndex = __utils_3.dom.indexOfDeepestElement(validDrops); + return dropState.activeDrops[dropIndex] || null; +} + +function getDropEvents(interaction, _pointerEvent, dragEvent) { + var dropState = interaction.dropState; + var dropEvents = { + enter: null, + leave: null, + activate: null, + deactivate: null, + move: null, + drop: null + }; + + if (dragEvent.type === 'dragstart') { + dropEvents.activate = new _DropEvent["default"](dropState, dragEvent, 'dropactivate'); + dropEvents.activate.target = null; + dropEvents.activate.dropzone = null; + } + + if (dragEvent.type === 'dragend') { + dropEvents.deactivate = new _DropEvent["default"](dropState, dragEvent, 'dropdeactivate'); + dropEvents.deactivate.target = null; + dropEvents.deactivate.dropzone = null; + } + + if (dropState.rejected) { + return dropEvents; + } + + if (dropState.cur.element !== dropState.prev.element) { + // if there was a previous dropzone, create a dragleave event + if (dropState.prev.dropzone) { + dropEvents.leave = new _DropEvent["default"](dropState, dragEvent, 'dragleave'); + dragEvent.dragLeave = dropEvents.leave.target = dropState.prev.element; + dragEvent.prevDropzone = dropEvents.leave.dropzone = dropState.prev.dropzone; + } // if dropzone is not null, create a dragenter event + + + if (dropState.cur.dropzone) { + dropEvents.enter = new _DropEvent["default"](dropState, dragEvent, 'dragenter'); + dragEvent.dragEnter = dropState.cur.element; + dragEvent.dropzone = dropState.cur.dropzone; + } + } + + if (dragEvent.type === 'dragend' && dropState.cur.dropzone) { + dropEvents.drop = new _DropEvent["default"](dropState, dragEvent, 'drop'); + dragEvent.dropzone = dropState.cur.dropzone; + dragEvent.relatedTarget = dropState.cur.element; + } + + if (dragEvent.type === 'dragmove' && dropState.cur.dropzone) { + dropEvents.move = new _DropEvent["default"](dropState, dragEvent, 'dropmove'); + dropEvents.move.dragmove = dragEvent; + dragEvent.dropzone = dropState.cur.dropzone; + } + + return dropEvents; +} + +function fireDropEvents(interaction, events) { + var dropState = interaction.dropState; + var activeDrops = dropState.activeDrops, + cur = dropState.cur, + prev = dropState.prev; + + if (events.leave) { + prev.dropzone.fire(events.leave); + } + + if (events.move) { + cur.dropzone.fire(events.move); + } + + if (events.enter) { + cur.dropzone.fire(events.enter); + } + + if (events.drop) { + cur.dropzone.fire(events.drop); + } + + if (events.deactivate) { + fireActivationEvents(activeDrops, events.deactivate); + } + + dropState.prev.dropzone = cur.dropzone; + dropState.prev.element = cur.element; +} + +function onEventCreated(_ref10, scope) { + var interaction = _ref10.interaction, + iEvent = _ref10.iEvent, + event = _ref10.event; + + if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { + return; + } + + var dropState = interaction.dropState; + + if (scope.dynamicDrop) { + dropState.activeDrops = getActiveDrops(scope, interaction.element); + } + + var dragEvent = iEvent; + var dropResult = getDrop(interaction, dragEvent, event); // update rejected status + + dropState.rejected = dropState.rejected && !!dropResult && dropResult.dropzone === dropState.cur.dropzone && dropResult.element === dropState.cur.element; + dropState.cur.dropzone = dropResult && dropResult.dropzone; + dropState.cur.element = dropResult && dropResult.element; + dropState.events = getDropEvents(interaction, event, dragEvent); +} + +function dropzoneMethod(interactable, options) { + if (__utils_3.is.object(options)) { + interactable.options.drop.enabled = options.enabled !== false; + + if (options.listeners) { + var normalized = __utils_3.normalizeListeners(options.listeners); // rename 'drop' to '' as it will be prefixed with 'drop' + + var corrected = Object.keys(normalized).reduce(function (acc, type) { + var correctedType = /^(enter|leave)/.test(type) ? "drag".concat(type) : /^(activate|deactivate|move)/.test(type) ? "drop".concat(type) : type; + acc[correctedType] = normalized[type]; + return acc; + }, {}); + interactable.off(interactable.options.drop.listeners); + interactable.on(corrected); + interactable.options.drop.listeners = corrected; + } + + if (__utils_3.is.func(options.ondrop)) { + interactable.on('drop', options.ondrop); + } + + if (__utils_3.is.func(options.ondropactivate)) { + interactable.on('dropactivate', options.ondropactivate); + } + + if (__utils_3.is.func(options.ondropdeactivate)) { + interactable.on('dropdeactivate', options.ondropdeactivate); + } + + if (__utils_3.is.func(options.ondragenter)) { + interactable.on('dragenter', options.ondragenter); + } + + if (__utils_3.is.func(options.ondragleave)) { + interactable.on('dragleave', options.ondragleave); + } + + if (__utils_3.is.func(options.ondropmove)) { + interactable.on('dropmove', options.ondropmove); + } + + if (/^(pointer|center)$/.test(options.overlap)) { + interactable.options.drop.overlap = options.overlap; + } else if (__utils_3.is.number(options.overlap)) { + interactable.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0); + } + + if ('accept' in options) { + interactable.options.drop.accept = options.accept; + } + + if ('checker' in options) { + interactable.options.drop.checker = options.checker; + } + + return interactable; + } + + if (__utils_3.is.bool(options)) { + interactable.options.drop.enabled = options; + return interactable; + } + + return interactable.options.drop; +} + +function dropCheckMethod(interactable, dragEvent, event, draggable, draggableElement, dropElement, rect) { + var dropped = false; // if the dropzone has no rect (eg. display: none) + // call the custom dropChecker or just return false + + if (!(rect = rect || interactable.getRect(dropElement))) { + return interactable.options.drop.checker ? interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement) : false; + } + + var dropOverlap = interactable.options.drop.overlap; + + if (dropOverlap === 'pointer') { + var origin = __utils_3.getOriginXY(draggable, draggableElement, 'drag'); + var page = __utils_3.pointer.getPageXY(dragEvent); + page.x += origin.x; + page.y += origin.y; + var horizontal = page.x > rect.left && page.x < rect.right; + var vertical = page.y > rect.top && page.y < rect.bottom; + dropped = horizontal && vertical; + } + + var dragRect = draggable.getRect(draggableElement); + + if (dragRect && dropOverlap === 'center') { + var cx = dragRect.left + dragRect.width / 2; + var cy = dragRect.top + dragRect.height / 2; + dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom; + } + + if (dragRect && __utils_3.is.number(dropOverlap)) { + var overlapArea = Math.max(0, Math.min(rect.right, dragRect.right) - Math.max(rect.left, dragRect.left)) * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top, dragRect.top)); + var overlapRatio = overlapArea / (dragRect.width * dragRect.height); + dropped = overlapRatio >= dropOverlap; + } + + if (interactable.options.drop.checker) { + dropped = interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement); + } + + return dropped; +} + +var drop = { + id: 'actions/drop', + install: __install_3, + listeners: { + 'interactions:before-action-start': function interactionsBeforeActionStart(_ref11) { + var interaction = _ref11.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + interaction.dropState = { + cur: { + dropzone: null, + element: null + }, + prev: { + dropzone: null, + element: null + }, + rejected: null, + events: null, + activeDrops: [] + }; + }, + 'interactions:after-action-start': function interactionsAfterActionStart(_ref12, scope) { + var interaction = _ref12.interaction, + event = _ref12.event, + dragEvent = _ref12.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var dropState = interaction.dropState; // reset active dropzones + + dropState.activeDrops = null; + dropState.events = null; + dropState.activeDrops = getActiveDrops(scope, interaction.element); + dropState.events = getDropEvents(interaction, event, dragEvent); + + if (dropState.events.activate) { + fireActivationEvents(dropState.activeDrops, dropState.events.activate); + scope.fire('actions/drop:start', { + interaction: interaction, + dragEvent: dragEvent + }); + } + }, + // FIXME proper signal types + 'interactions:action-move': onEventCreated, + 'interactions:action-end': onEventCreated, + 'interactions:after-action-move': function fireDropAfterMove(_ref13, scope) { + var interaction = _ref13.interaction, + dragEvent = _ref13.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + fireDropEvents(interaction, interaction.dropState.events); + scope.fire('actions/drop:move', { + interaction: interaction, + dragEvent: dragEvent + }); + interaction.dropState.events = {}; + }, + 'interactions:after-action-end': function interactionsAfterActionEnd(_ref14, scope) { + var interaction = _ref14.interaction, + dragEvent = _ref14.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + fireDropEvents(interaction, interaction.dropState.events); + scope.fire('actions/drop:end', { + interaction: interaction, + dragEvent: dragEvent + }); + }, + 'interactions:stop': function interactionsStop(_ref15) { + var interaction = _ref15.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var dropState = interaction.dropState; + + if (dropState) { + dropState.activeDrops = null; + dropState.events = null; + dropState.cur.dropzone = null; + dropState.cur.element = null; + dropState.prev.dropzone = null; + dropState.prev.element = null; + dropState.rejected = false; + } + } + }, + getActiveDrops: getActiveDrops, + getDrop: getDrop, + getDropEvents: getDropEvents, + fireDropEvents: fireDropEvents, + defaults: { + enabled: false, + accept: null, + overlap: 'pointer' + } +}; +var ___default_3 = drop; +_$index_3["default"] = ___default_3; + +var _$gesture_4 = {}; +"use strict"; + +function ___typeof_4(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_4 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_4 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_4(obj); } + +Object.defineProperty(_$gesture_4, "__esModule", { + value: true +}); +_$gesture_4["default"] = void 0; + +var __utils_4 = ___interopRequireWildcard_4(_$index_58); + +function ___getRequireWildcardCache_4() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_4 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_4(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_4(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_4(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_4(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + defaults = scope.defaults; + /** + * ```js + * interact(element).gesturable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // limit multiple gestures. + * // See the explanation in {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isGestureable = interact(element).gesturable() + * ``` + * + * Gets or sets whether multitouch gestures can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on gesture events (makes the Interactable gesturable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of gesture events, or this Interactable + */ + + Interactable.prototype.gesturable = function (options) { + if (__utils_4.is.object(options)) { + this.options.gesture.enabled = options.enabled !== false; + this.setPerAction('gesture', options); + this.setOnEvents('gesture', options); + return this; + } + + if (__utils_4.is.bool(options)) { + this.options.gesture.enabled = options; + return this; + } + + return this.options.gesture; + }; + + actions.map.gesture = gesture; + actions.methodDict.gesture = 'gesturable'; + defaults.actions.gesture = gesture.defaults; +} + +function updateGestureProps(_ref) { + var interaction = _ref.interaction, + iEvent = _ref.iEvent, + phase = _ref.phase; + + if (interaction.prepared.name !== 'gesture') { + return; + } + + var pointers = interaction.pointers.map(function (p) { + return p.pointer; + }); + var starting = phase === 'start'; + var ending = phase === 'end'; + var deltaSource = interaction.interactable.options.deltaSource; + iEvent.touches = [pointers[0], pointers[1]]; + + if (starting) { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = 1; + iEvent.ds = 0; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.da = 0; + interaction.gesture.startDistance = iEvent.distance; + interaction.gesture.startAngle = iEvent.angle; + } else if (ending) { + var prevEvent = interaction.prevEvent; + iEvent.distance = prevEvent.distance; + iEvent.box = prevEvent.box; + iEvent.scale = prevEvent.scale; + iEvent.ds = 0; + iEvent.angle = prevEvent.angle; + iEvent.da = 0; + } else { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = iEvent.distance / interaction.gesture.startDistance; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.ds = iEvent.scale - interaction.gesture.scale; + iEvent.da = iEvent.angle - interaction.gesture.angle; + } + + interaction.gesture.distance = iEvent.distance; + interaction.gesture.angle = iEvent.angle; + + if (__utils_4.is.number(iEvent.scale) && iEvent.scale !== Infinity && !isNaN(iEvent.scale)) { + interaction.gesture.scale = iEvent.scale; + } +} + +var gesture = { + id: 'actions/gesture', + before: ['actions/drag', 'actions/resize'], + install: __install_4, + listeners: { + 'interactions:action-start': updateGestureProps, + 'interactions:action-move': updateGestureProps, + 'interactions:action-end': updateGestureProps, + 'interactions:new': function interactionsNew(_ref2) { + var interaction = _ref2.interaction; + interaction.gesture = { + angle: 0, + distance: 0, + scale: 1, + startAngle: 0, + startDistance: 0 + }; + }, + 'auto-start:check': function autoStartCheck(arg) { + if (arg.interaction.pointers.length < 2) { + return undefined; + } + + var gestureOptions = arg.interactable.options.gesture; + + if (!(gestureOptions && gestureOptions.enabled)) { + return undefined; + } + + arg.action = { + name: 'gesture' + }; + return false; + } + }, + defaults: {}, + getCursor: function getCursor() { + return ''; + } +}; +var ___default_4 = gesture; +_$gesture_4["default"] = ___default_4; + +var _$resize_6 = {}; +"use strict"; + +function ___typeof_6(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_6 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_6 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_6(obj); } + +Object.defineProperty(_$resize_6, "__esModule", { + value: true +}); +_$resize_6["default"] = void 0; + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +var __dom_6 = ___interopRequireWildcard_6(_$domUtils_53); + +var ___extend_6 = ___interopRequireDefault_6(_$extend_55); + +var __is_6 = ___interopRequireWildcard_6(_$is_59); + +function ___interopRequireDefault_6(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_6() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_6 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_6(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_6(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_6(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_6(scope) { + var actions = scope.actions, + browser = scope.browser, + Interactable = scope.Interactable, + defaults = scope.defaults; // Less Precision with touch input + + resize.cursors = initCursors(browser); + resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10; + /** + * ```js + * interact(element).resizable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * edges: { + * top : true, // Use pointer coords to check for resize. + * left : false, // Disable resizing from left edge. + * bottom: '.resize-s',// Resize if pointer target matches selector + * right : handleEl // Resize if pointer target is the given Element + * }, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height are adjusted at a 1:1 ratio. + * square: false, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height maintain the aspect ratio they had when resizing started. + * preserveAspectRatio: false, + * + * // a value of 'none' will limit the resize rect to a minimum of 0x0 + * // 'negate' will allow the rect to have negative width/height + * // 'reposition' will keep the width/height positive by swapping + * // the top and bottom edges and/or swapping the left and right edges + * invert: 'none' || 'negate' || 'reposition' + * + * // limit multiple resizes. + * // See the explanation in the {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isResizeable = interact(element).resizable() + * ``` + * + * Gets or sets whether resize actions can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on resize events (object makes the Interactable + * resizable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of resize elements, or this Interactable + */ + + Interactable.prototype.resizable = function (options) { + return resizable(this, options, scope); + }; + + actions.map.resize = resize; + actions.methodDict.resize = 'resizable'; + defaults.actions.resize = resize.defaults; +} + +function resizeChecker(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + element = arg.element, + rect = arg.rect, + buttons = arg.buttons; + + if (!rect) { + return undefined; + } + + var page = (0, ___extend_6["default"])({}, interaction.coords.cur.page); + var resizeOptions = interactable.options.resize; + + if (!(resizeOptions && resizeOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & resizeOptions.mouseButtons) === 0) { + return undefined; + } // if using resize.edges + + + if (__is_6.object(resizeOptions.edges)) { + var resizeEdges = { + left: false, + right: false, + top: false, + bottom: false + }; + + for (var edge in resizeEdges) { + resizeEdges[edge] = checkResizeEdge(edge, resizeOptions.edges[edge], page, interaction._latestPointer.eventTarget, element, rect, resizeOptions.margin || resize.defaultMargin); + } + + resizeEdges.left = resizeEdges.left && !resizeEdges.right; + resizeEdges.top = resizeEdges.top && !resizeEdges.bottom; + + if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) { + arg.action = { + name: 'resize', + edges: resizeEdges + }; + } + } else { + var right = resizeOptions.axis !== 'y' && page.x > rect.right - resize.defaultMargin; + var bottom = resizeOptions.axis !== 'x' && page.y > rect.bottom - resize.defaultMargin; + + if (right || bottom) { + arg.action = { + name: 'resize', + axes: (right ? 'x' : '') + (bottom ? 'y' : '') + }; + } + } + + return arg.action ? false : undefined; +} + +function resizable(interactable, options, scope) { + if (__is_6.object(options)) { + interactable.options.resize.enabled = options.enabled !== false; + interactable.setPerAction('resize', options); + interactable.setOnEvents('resize', options); + + if (__is_6.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) { + interactable.options.resize.axis = options.axis; + } else if (options.axis === null) { + interactable.options.resize.axis = scope.defaults.actions.resize.axis; + } + + if (__is_6.bool(options.preserveAspectRatio)) { + interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio; + } else if (__is_6.bool(options.square)) { + interactable.options.resize.square = options.square; + } + + return interactable; + } + + if (__is_6.bool(options)) { + interactable.options.resize.enabled = options; + return interactable; + } + + return interactable.options.resize; +} + +function checkResizeEdge(name, value, page, element, interactableElement, rect, margin) { + // false, '', undefined, null + if (!value) { + return false; + } // true value, use pointer coords and element rect + + + if (value === true) { + // if dimensions are negative, "switch" edges + var width = __is_6.number(rect.width) ? rect.width : rect.right - rect.left; + var height = __is_6.number(rect.height) ? rect.height : rect.bottom - rect.top; // don't use margin greater than half the relevent dimension + + margin = Math.min(margin, (name === 'left' || name === 'right' ? width : height) / 2); + + if (width < 0) { + if (name === 'left') { + name = 'right'; + } else if (name === 'right') { + name = 'left'; + } + } + + if (height < 0) { + if (name === 'top') { + name = 'bottom'; + } else if (name === 'bottom') { + name = 'top'; + } + } + + if (name === 'left') { + return page.x < (width >= 0 ? rect.left : rect.right) + margin; + } + + if (name === 'top') { + return page.y < (height >= 0 ? rect.top : rect.bottom) + margin; + } + + if (name === 'right') { + return page.x > (width >= 0 ? rect.right : rect.left) - margin; + } + + if (name === 'bottom') { + return page.y > (height >= 0 ? rect.bottom : rect.top) - margin; + } + } // the remaining checks require an element + + + if (!__is_6.element(element)) { + return false; + } + + return __is_6.element(value) // the value is an element to use as a resize handle + ? value === element // otherwise check if element matches value as selector + : __dom_6.matchesUpTo(element, value, interactableElement); +} + +function initCursors(browser) { + return browser.isIe9 ? { + x: 'e-resize', + y: 's-resize', + xy: 'se-resize', + top: 'n-resize', + left: 'w-resize', + bottom: 's-resize', + right: 'e-resize', + topleft: 'se-resize', + bottomright: 'se-resize', + topright: 'ne-resize', + bottomleft: 'ne-resize' + } : { + x: 'ew-resize', + y: 'ns-resize', + xy: 'nwse-resize', + top: 'ns-resize', + left: 'ew-resize', + bottom: 'ns-resize', + right: 'ew-resize', + topleft: 'nwse-resize', + bottomright: 'nwse-resize', + topright: 'nesw-resize', + bottomleft: 'nesw-resize' + }; +} + +function start(_ref) { + var iEvent = _ref.iEvent, + interaction = _ref.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + var rect = interaction.rect; + interaction._rects = { + start: (0, ___extend_6["default"])({}, rect), + corrected: (0, ___extend_6["default"])({}, rect), + previous: (0, ___extend_6["default"])({}, rect), + delta: { + left: 0, + right: 0, + width: 0, + top: 0, + bottom: 0, + height: 0 + } + }; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function __move_6(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + var resizeOptions = interaction.interactable.options.resize; + var invert = resizeOptions.invert; + var invertible = invert === 'reposition' || invert === 'negate'; // eslint-disable-next-line no-shadow + + var current = interaction.rect; + var _interaction$_rects = interaction._rects, + startRect = _interaction$_rects.start, + corrected = _interaction$_rects.corrected, + deltaRect = _interaction$_rects.delta, + previous = _interaction$_rects.previous; + (0, ___extend_6["default"])(previous, corrected); + + if (invertible) { + // if invertible, copy the current rect + (0, ___extend_6["default"])(corrected, current); + + if (invert === 'reposition') { + // swap edge values if necessary to keep width/height positive + if (corrected.top > corrected.bottom) { + var swap = corrected.top; + corrected.top = corrected.bottom; + corrected.bottom = swap; + } + + if (corrected.left > corrected.right) { + var _swap = corrected.left; + corrected.left = corrected.right; + corrected.right = _swap; + } + } + } else { + // if not invertible, restrict to minimum of 0x0 rect + corrected.top = Math.min(current.top, startRect.bottom); + corrected.bottom = Math.max(current.bottom, startRect.top); + corrected.left = Math.min(current.left, startRect.right); + corrected.right = Math.max(current.right, startRect.left); + } + + corrected.width = corrected.right - corrected.left; + corrected.height = corrected.bottom - corrected.top; + + for (var edge in corrected) { + deltaRect[edge] = corrected[edge] - previous[edge]; + } + + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = corrected; + resizeEvent.deltaRect = deltaRect; +} + +function end(_ref3) { + var iEvent = _ref3.iEvent, + interaction = _ref3.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function updateEventAxes(_ref4) { + var iEvent = _ref4.iEvent, + interaction = _ref4.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) { + return; + } + + var options = interaction.interactable.options; + var resizeEvent = iEvent; + + if (options.resize.square) { + if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = resizeEvent.delta.y; + } else { + resizeEvent.delta.y = resizeEvent.delta.x; + } + + resizeEvent.axes = 'xy'; + } else { + resizeEvent.axes = interaction.resizeAxes; + + if (interaction.resizeAxes === 'x') { + resizeEvent.delta.y = 0; + } else if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = 0; + } + } +} + +var resize = { + id: 'actions/resize', + before: ['actions/drag'], + install: __install_6, + listeners: { + 'interactions:new': function interactionsNew(_ref5) { + var interaction = _ref5.interaction; + interaction.resizeAxes = 'xy'; + }, + 'interactions:action-start': function interactionsActionStart(arg) { + start(arg); + updateEventAxes(arg); + }, + 'interactions:action-move': function interactionsActionMove(arg) { + __move_6(arg); + updateEventAxes(arg); + }, + 'interactions:action-end': end, + 'auto-start:check': resizeChecker + }, + defaults: { + square: false, + preserveAspectRatio: false, + axis: 'xy', + // use default margin + margin: NaN, + // object with props left, right, top, bottom which are + // true/false values to resize when the pointer is over that edge, + // CSS selectors to match the handles for each direction + // or the Elements for each handle + edges: null, + // a value of 'none' will limit the resize rect to a minimum of 0x0 + // 'negate' will alow the rect to have negative width/height + // 'reposition' will keep the width/height positive by swapping + // the top and bottom edges and/or swapping the left and right edges + invert: 'none' + }, + cursors: null, + getCursor: function getCursor(_ref6) { + var edges = _ref6.edges, + axis = _ref6.axis, + name = _ref6.name; + var cursors = resize.cursors; + var result = null; + + if (axis) { + result = cursors[name + axis]; + } else if (edges) { + var cursorKey = ''; + var _arr = ['top', 'bottom', 'left', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (edges[edge]) { + cursorKey += edge; + } + } + + result = cursors[cursorKey]; + } + + return result; + }, + defaultMargin: null +}; +var ___default_6 = resize; +_$resize_6["default"] = ___default_6; + +var _$index_5 = {}; +"use strict"; + +Object.defineProperty(_$index_5, "__esModule", { + value: true +}); +Object.defineProperty(_$index_5, "drag", { + enumerable: true, + get: function get() { + return ___drag_5["default"]; + } +}); +Object.defineProperty(_$index_5, "drop", { + enumerable: true, + get: function get() { + return _index["default"]; + } +}); +Object.defineProperty(_$index_5, "gesture", { + enumerable: true, + get: function get() { + return _gesture["default"]; + } +}); +Object.defineProperty(_$index_5, "resize", { + enumerable: true, + get: function get() { + return _resize["default"]; + } +}); +_$index_5["default"] = void 0; + +var ___drag_5 = ___interopRequireDefault_5(_$drag_1); + +var _index = ___interopRequireDefault_5(_$index_3); + +var _gesture = ___interopRequireDefault_5(_$gesture_4); + +var _resize = ___interopRequireDefault_5(_$resize_6); + +function ___interopRequireDefault_5(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var ___default_5 = { + id: 'actions', + install: function install(scope) { + scope.usePlugin(_gesture["default"]); + scope.usePlugin(_resize["default"]); + scope.usePlugin(___drag_5["default"]); + scope.usePlugin(_index["default"]); + } +}; +_$index_5["default"] = ___default_5; + +var _$index_7 = {}; +"use strict"; + +function ___typeof_7(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_7 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_7 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_7(obj); } + +Object.defineProperty(_$index_7, "__esModule", { + value: true +}); +_$index_7.getContainer = getContainer; +_$index_7.getScroll = getScroll; +_$index_7.getScrollSize = getScrollSize; +_$index_7.getScrollSizeDelta = getScrollSizeDelta; +_$index_7["default"] = void 0; + +var __domUtils_7 = ___interopRequireWildcard_7(_$domUtils_53); + +var __is_7 = ___interopRequireWildcard_7(_$is_59); + +var ___raf_7 = ___interopRequireDefault_7(_$raf_64); + +/* removed: var _$rect_65 = require("@interactjs/utils/rect"); */; + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +function ___interopRequireDefault_7(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_7() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_7 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_7(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_7(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_7(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_7(scope) { + var defaults = scope.defaults, + actions = scope.actions; + scope.autoScroll = autoScroll; + + autoScroll.now = function () { + return scope.now(); + }; + + actions.phaselessTypes.autoscroll = true; + defaults.perAction.autoScroll = autoScroll.defaults; +} + +var autoScroll = { + defaults: { + enabled: false, + margin: 60, + // the item that is scrolled (Window or HTMLElement) + container: null, + // the scroll speed in pixels per second + speed: 300 + }, + now: Date.now, + interaction: null, + i: 0, + // the handle returned by window.setInterval + // Direction each pulse is to scroll in + x: 0, + y: 0, + isScrolling: false, + prevTime: 0, + margin: 0, + speed: 0, + start: function start(interaction) { + autoScroll.isScrolling = true; + + ___raf_7["default"].cancel(autoScroll.i); + + interaction.autoScroll = autoScroll; + autoScroll.interaction = interaction; + autoScroll.prevTime = autoScroll.now(); + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + }, + stop: function stop() { + autoScroll.isScrolling = false; + + if (autoScroll.interaction) { + autoScroll.interaction.autoScroll = null; + } + + ___raf_7["default"].cancel(autoScroll.i); + }, + // scroll the window by the values in scroll.x/y + scroll: function scroll() { + var interaction = autoScroll.interaction; + var interactable = interaction.interactable, + element = interaction.element; + var actionName = interaction.prepared.name; + var options = interactable.options[actionName].autoScroll; + var container = getContainer(options.container, interactable, element); + var now = autoScroll.now(); // change in time in seconds + + var dt = (now - autoScroll.prevTime) / 1000; // displacement + + var s = options.speed * dt; + + if (s >= 1) { + var scrollBy = { + x: autoScroll.x * s, + y: autoScroll.y * s + }; + + if (scrollBy.x || scrollBy.y) { + var prevScroll = getScroll(container); + + if (__is_7.window(container)) { + container.scrollBy(scrollBy.x, scrollBy.y); + } else if (container) { + container.scrollLeft += scrollBy.x; + container.scrollTop += scrollBy.y; + } + + var curScroll = getScroll(container); + var delta = { + x: curScroll.x - prevScroll.x, + y: curScroll.y - prevScroll.y + }; + + if (delta.x || delta.y) { + interactable.fire({ + type: 'autoscroll', + target: element, + interactable: interactable, + delta: delta, + interaction: interaction, + container: container + }); + } + } + + autoScroll.prevTime = now; + } + + if (autoScroll.isScrolling) { + ___raf_7["default"].cancel(autoScroll.i); + + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + } + }, + check: function check(interactable, actionName) { + var options = interactable.options; + return options[actionName].autoScroll && options[actionName].autoScroll.enabled; + }, + onInteractionMove: function onInteractionMove(_ref) { + var interaction = _ref.interaction, + pointer = _ref.pointer; + + if (!(interaction.interacting() && autoScroll.check(interaction.interactable, interaction.prepared.name))) { + return; + } + + if (interaction.simulation) { + autoScroll.x = autoScroll.y = 0; + return; + } + + var top; + var right; + var bottom; + var left; + var interactable = interaction.interactable, + element = interaction.element; + var actionName = interaction.prepared.name; + var options = interactable.options[actionName].autoScroll; + var container = getContainer(options.container, interactable, element); + + if (__is_7.window(container)) { + left = pointer.clientX < autoScroll.margin; + top = pointer.clientY < autoScroll.margin; + right = pointer.clientX > container.innerWidth - autoScroll.margin; + bottom = pointer.clientY > container.innerHeight - autoScroll.margin; + } else { + var rect = __domUtils_7.getElementClientRect(container); + left = pointer.clientX < rect.left + autoScroll.margin; + top = pointer.clientY < rect.top + autoScroll.margin; + right = pointer.clientX > rect.right - autoScroll.margin; + bottom = pointer.clientY > rect.bottom - autoScroll.margin; + } + + autoScroll.x = right ? 1 : left ? -1 : 0; + autoScroll.y = bottom ? 1 : top ? -1 : 0; + + if (!autoScroll.isScrolling) { + // set the autoScroll properties to those of the target + autoScroll.margin = options.margin; + autoScroll.speed = options.speed; + autoScroll.start(interaction); + } + } +}; + +function getContainer(value, interactable, element) { + return (__is_7.string(value) ? (0, _$rect_65.getStringOptionResult)(value, interactable, element) : value) || (0, _$window_68.getWindow)(element); +} + +function getScroll(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollLeft, + y: container.scrollTop + }; +} + +function getScrollSize(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollWidth, + y: container.scrollHeight + }; +} + +function getScrollSizeDelta(_ref2, func) { + var interaction = _ref2.interaction, + element = _ref2.element; + var scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll; + + if (!scrollOptions || !scrollOptions.enabled) { + func(); + return { + x: 0, + y: 0 + }; + } + + var scrollContainer = getContainer(scrollOptions.container, interaction.interactable, element); + var prevSize = getScroll(scrollContainer); + func(); + var curSize = getScroll(scrollContainer); + return { + x: curSize.x - prevSize.x, + y: curSize.y - prevSize.y + }; +} + +var autoScrollPlugin = { + id: 'auto-scroll', + install: __install_7, + listeners: { + 'interactions:new': function interactionsNew(_ref3) { + var interaction = _ref3.interaction; + interaction.autoScroll = null; + }, + 'interactions:destroy': function interactionsDestroy(_ref4) { + var interaction = _ref4.interaction; + interaction.autoScroll = null; + autoScroll.stop(); + + if (autoScroll.interaction) { + autoScroll.interaction = null; + } + }, + 'interactions:stop': autoScroll.stop, + 'interactions:action-move': function interactionsActionMove(arg) { + return autoScroll.onInteractionMove(arg); + } + } +}; +var ___default_7 = autoScrollPlugin; +_$index_7["default"] = ___default_7; + +var _$InteractableMethods_8 = {}; +"use strict"; + +function ___typeof_8(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_8 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_8 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_8(obj); } + +Object.defineProperty(_$InteractableMethods_8, "__esModule", { + value: true +}); +_$InteractableMethods_8["default"] = void 0; + +/* removed: var _$index_58 = require("@interactjs/utils/index"); */; + +var __is_8 = ___interopRequireWildcard_8(_$is_59); + +function ___getRequireWildcardCache_8() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_8 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_8(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_8(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_8(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_8(scope) { + var Interactable = scope.Interactable; + + Interactable.prototype.getAction = function getAction(pointer, event, interaction, element) { + var action = defaultActionChecker(this, event, interaction, element, scope); + + if (this.options.actionChecker) { + return this.options.actionChecker(pointer, event, action, this, element, interaction); + } + + return action; + }; + /** + * ```js + * interact(element, { ignoreFrom: document.getElementById('no-action') }) + * // or + * interact(element).ignoreFrom('input, textarea, a') + * ``` + * @deprecated + * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any + * of it's parents match the given CSS selector or Element, no + * drag/resize/gesture is started. + * + * Don't use this method. Instead set the `ignoreFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .draggable({ + * ignoreFrom: 'input, textarea, a[href]'', + * }) + * .pointerEvents({ + * ignoreFrom: '[no-pointer]', + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to not ignore any elements + * @return {string | Element | object} The current ignoreFrom value or this + * Interactable + */ + + + Interactable.prototype.ignoreFrom = (0, _$index_58.warnOnce)(function (newValue) { + return this._backCompatOption('ignoreFrom', newValue); + }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).'); + /** + * @deprecated + * + * A drag/resize/gesture is started only If the target of the `mousedown`, + * `pointerdown` or `touchstart` event or any of it's parents match the given + * CSS selector or Element. + * + * Don't use this method. Instead set the `allowFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .resizable({ + * allowFrom: '.resize-handle', + * .pointerEvents({ + * allowFrom: '.handle',, + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to allow from any element + * @return {string | Element | object} The current allowFrom value or this + * Interactable + */ + + Interactable.prototype.allowFrom = (0, _$index_58.warnOnce)(function (newValue) { + return this._backCompatOption('allowFrom', newValue); + }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).'); + /** + * ```js + * interact('.resize-drag') + * .resizable(true) + * .draggable(true) + * .actionChecker(function (pointer, event, action, interactable, element, interaction) { + * + * if (interact.matchesSelector(event.target, '.drag-handle')) { + * // force drag with handle target + * action.name = drag + * } + * else { + * // resize from the top and right edges + * action.name = 'resize' + * action.edges = { top: true, right: true } + * } + * + * return action + * }) + * ``` + * + * Returns or sets the function used to check action to be performed on + * pointerDown + * + * @param {function | null} [checker] A function which takes a pointer event, + * defaultAction string, interactable, element and interaction as parameters + * and returns an object with name property 'drag' 'resize' or 'gesture' and + * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right + * props. + * @return {Function | Interactable} The checker function or this Interactable + */ + + Interactable.prototype.actionChecker = actionChecker; + /** + * Returns or sets whether the the cursor should be changed depending on the + * action that would be performed if the mouse were pressed and dragged. + * + * @param {boolean} [newValue] + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.styleCursor = styleCursor; +} + +function defaultActionChecker(interactable, event, interaction, element, scope) { + var rect = interactable.getRect(element); + var buttons = event.buttons || { + 0: 1, + 1: 4, + 3: 8, + 4: 16 + }[event.button]; + var arg = { + action: null, + interactable: interactable, + interaction: interaction, + element: element, + rect: rect, + buttons: buttons + }; + scope.fire('auto-start:check', arg); + return arg.action; +} + +function styleCursor(newValue) { + if (__is_8.bool(newValue)) { + this.options.styleCursor = newValue; + return this; + } + + if (newValue === null) { + delete this.options.styleCursor; + return this; + } + + return this.options.styleCursor; +} + +function actionChecker(checker) { + if (__is_8.func(checker)) { + this.options.actionChecker = checker; + return this; + } + + if (checker === null) { + delete this.options.actionChecker; + return this; + } + + return this.options.actionChecker; +} + +var ___default_8 = { + id: 'auto-start/interactableMethods', + install: __install_8 +}; +_$InteractableMethods_8["default"] = ___default_8; + +var _$base_9 = {}; +"use strict"; + +function ___typeof_9(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_9 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_9 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_9(obj); } + +Object.defineProperty(_$base_9, "__esModule", { + value: true +}); +_$base_9["default"] = void 0; + +var __utils_9 = ___interopRequireWildcard_9(_$index_58); + +var _InteractableMethods = ___interopRequireDefault_9(_$InteractableMethods_8); + +function ___interopRequireDefault_9(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_9() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_9 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_9(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_9(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_9(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_9(scope) { + var interact = scope.interact, + defaults = scope.defaults; + scope.usePlugin(_InteractableMethods["default"]); + defaults.base.actionChecker = null; + defaults.base.styleCursor = true; + __utils_9.extend(defaults.perAction, { + manualStart: false, + max: Infinity, + maxPerElement: 1, + allowFrom: null, + ignoreFrom: null, + // only allow left button by default + // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value + mouseButtons: 1 + }); + /** + * Returns or sets the maximum number of concurrent interactions allowed. By + * default only 1 interaction is allowed at a time (for backwards + * compatibility). To allow multiple interactions on the same Interactables and + * elements, you need to enable it in the draggable, resizable and gesturable + * `'max'` and `'maxPerElement'` options. + * + * @alias module:interact.maxInteractions + * + * @param {number} [newValue] Any number. newValue <= 0 means no interactions. + */ + + interact.maxInteractions = function (newValue) { + return maxInteractions(newValue, scope); + }; + + scope.autoStart = { + // Allow this many interactions to happen simultaneously + maxInteractions: Infinity, + withinInteractionLimit: withinInteractionLimit, + cursorElement: null + }; +} + +function prepareOnDown(_ref, scope) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; + + if (interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function prepareOnMove(_ref2, scope) { + var interaction = _ref2.interaction, + pointer = _ref2.pointer, + event = _ref2.event, + eventTarget = _ref2.eventTarget; + + if (interaction.pointerType !== 'mouse' || interaction.pointerIsDown || interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function startOnMove(arg, scope) { + var interaction = arg.interaction; + + if (!interaction.pointerIsDown || interaction.interacting() || !interaction.pointerWasMoved || !interaction.prepared.name) { + return; + } + + scope.fire('autoStart:before-start', arg); + var interactable = interaction.interactable; + var actionName = interaction.prepared.name; + + if (actionName && interactable) { + // check manualStart and interaction limit + if (interactable.options[actionName].manualStart || !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) { + interaction.stop(); + } else { + interaction.start(interaction.prepared, interactable, interaction.element); + setInteractionCursor(interaction, scope); + } + } +} + +function clearCursorOnStop(_ref3, scope) { + var interaction = _ref3.interaction; + var interactable = interaction.interactable; + + if (interactable && interactable.options.styleCursor) { + setCursor(interaction.element, '', scope); + } +} // Check if the current interactable supports the action. +// If so, return the validated action. Otherwise, return null + + +function validateAction(action, interactable, element, eventTarget, scope) { + if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) && interactable.options[action.name].enabled && withinInteractionLimit(interactable, element, action, scope)) { + return action; + } + + return null; +} + +function validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope) { + for (var i = 0, len = matches.length; i < len; i++) { + var match = matches[i]; + var matchElement = matchElements[i]; + var matchAction = match.getAction(pointer, event, interaction, matchElement); + + if (!matchAction) { + continue; + } + + var action = validateAction(matchAction, match, matchElement, eventTarget, scope); + + if (action) { + return { + action: action, + interactable: match, + element: matchElement + }; + } + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function getActionInfo(interaction, pointer, event, eventTarget, scope) { + var matches = []; + var matchElements = []; + var element = eventTarget; + + function pushMatches(interactable) { + matches.push(interactable); + matchElements.push(element); + } + + while (__utils_9.is.element(element)) { + matches = []; + matchElements = []; + scope.interactables.forEachMatch(element, pushMatches); + var actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope); + + if (actionInfo.action && !actionInfo.interactable.options[actionInfo.action.name].manualStart) { + return actionInfo; + } + + element = __utils_9.dom.parentNode(element); + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function prepare(interaction, _ref4, scope) { + var action = _ref4.action, + interactable = _ref4.interactable, + element = _ref4.element; + action = action || { + name: null + }; + interaction.interactable = interactable; + interaction.element = element; + __utils_9.copyAction(interaction.prepared, action); + interaction.rect = interactable && action.name ? interactable.getRect(element) : null; + setInteractionCursor(interaction, scope); + scope.fire('autoStart:prepared', { + interaction: interaction + }); +} + +function withinInteractionLimit(interactable, element, action, scope) { + var options = interactable.options; + var maxActions = options[action.name].max; + var maxPerElement = options[action.name].maxPerElement; + var autoStartMax = scope.autoStart.maxInteractions; + var activeInteractions = 0; + var interactableCount = 0; + var elementCount = 0; // no actions if any of these values == 0 + + if (!(maxActions && maxPerElement && autoStartMax)) { + return false; + } + + for (var _i = 0; _i < scope.interactions.list.length; _i++) { + var _ref5; + + _ref5 = scope.interactions.list[_i]; + var interaction = _ref5; + var otherAction = interaction.prepared.name; + + if (!interaction.interacting()) { + continue; + } + + activeInteractions++; + + if (activeInteractions >= autoStartMax) { + return false; + } + + if (interaction.interactable !== interactable) { + continue; + } + + interactableCount += otherAction === action.name ? 1 : 0; + + if (interactableCount >= maxActions) { + return false; + } + + if (interaction.element === element) { + elementCount++; + + if (otherAction === action.name && elementCount >= maxPerElement) { + return false; + } + } + } + + return autoStartMax > 0; +} + +function maxInteractions(newValue, scope) { + if (__utils_9.is.number(newValue)) { + scope.autoStart.maxInteractions = newValue; + return this; + } + + return scope.autoStart.maxInteractions; +} + +function setCursor(element, cursor, scope) { + var prevCursorElement = scope.autoStart.cursorElement; + + if (prevCursorElement && prevCursorElement !== element) { + prevCursorElement.style.cursor = ''; + } + + element.ownerDocument.documentElement.style.cursor = cursor; + element.style.cursor = cursor; + scope.autoStart.cursorElement = cursor ? element : null; +} + +function setInteractionCursor(interaction, scope) { + var interactable = interaction.interactable, + element = interaction.element, + prepared = interaction.prepared; + + if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) { + // clear previous target element cursor + if (scope.autoStart.cursorElement) { + setCursor(scope.autoStart.cursorElement, '', scope); + } + + return; + } + + var cursor = ''; + + if (prepared.name) { + var cursorChecker = interactable.options[prepared.name].cursorChecker; + + if (__utils_9.is.func(cursorChecker)) { + cursor = cursorChecker(prepared, interactable, element, interaction._interacting); + } else { + cursor = scope.actions.map[prepared.name].getCursor(prepared); + } + } + + setCursor(interaction.element, cursor || '', scope); +} + +var autoStart = { + id: 'auto-start/base', + before: ['actions', 'actions/drag', 'actions/resize', 'actions/gesture'], + install: __install_9, + listeners: { + 'interactions:down': prepareOnDown, + 'interactions:move': function interactionsMove(arg, scope) { + prepareOnMove(arg, scope); + startOnMove(arg, scope); + }, + 'interactions:stop': clearCursorOnStop + }, + maxInteractions: maxInteractions, + withinInteractionLimit: withinInteractionLimit, + validateAction: validateAction +}; +var ___default_9 = autoStart; +_$base_9["default"] = ___default_9; + +var _$dragAxis_10 = {}; +"use strict"; + +function ___typeof_10(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_10 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_10 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_10(obj); } + +Object.defineProperty(_$dragAxis_10, "__esModule", { + value: true +}); +_$dragAxis_10["default"] = void 0; + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var __is_10 = ___interopRequireWildcard_10(_$is_59); + +var _base = ___interopRequireDefault_10(_$base_9); + +function ___interopRequireDefault_10(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_10() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_10 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_10(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_10(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_10(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function beforeStart(_ref, scope) { + var interaction = _ref.interaction, + eventTarget = _ref.eventTarget, + dx = _ref.dx, + dy = _ref.dy; + + if (interaction.prepared.name !== 'drag') { + return; + } // check if a drag is in the correct axis + + + var absX = Math.abs(dx); + var absY = Math.abs(dy); + var targetOptions = interaction.interactable.options.drag; + var startAxis = targetOptions.startAxis; + var currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy'; + interaction.prepared.axis = targetOptions.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy' + : targetOptions.lockAxis; // if the movement isn't in the startAxis of the interactable + + if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) { + // cancel the prepared action + interaction.prepared.name = null; // then try to get a drag from another ineractable + + var element = eventTarget; + + var getDraggable = function getDraggable(interactable) { + if (interactable === interaction.interactable) { + return; + } + + var options = interaction.interactable.options.drag; + + if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) { + var action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element); + + if (action && action.name === 'drag' && checkStartAxis(currentAxis, interactable) && _base["default"].validateAction(action, interactable, element, eventTarget, scope)) { + return interactable; + } + } + }; // check all interactables + + + while (__is_10.element(element)) { + var interactable = scope.interactables.forEachMatch(element, getDraggable); + + if (interactable) { + interaction.prepared.name = 'drag'; + interaction.interactable = interactable; + interaction.element = element; + break; + } + + element = (0, _$domUtils_53.parentNode)(element); + } + } +} + +function checkStartAxis(startAxis, interactable) { + if (!interactable) { + return false; + } + + var thisAxis = interactable.options.drag.startAxis; + return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis; +} + +var ___default_10 = { + id: 'auto-start/dragAxis', + listeners: { + 'autoStart:before-start': beforeStart + } +}; +_$dragAxis_10["default"] = ___default_10; + +var _$hold_11 = {}; +"use strict"; + +Object.defineProperty(_$hold_11, "__esModule", { + value: true +}); +_$hold_11["default"] = void 0; + +var ___base_11 = ___interopRequireDefault_11(_$base_9); + +function ___interopRequireDefault_11(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_11(scope) { + var defaults = scope.defaults; + scope.usePlugin(___base_11["default"]); + defaults.perAction.hold = 0; + defaults.perAction.delay = 0; +} + +function getHoldDuration(interaction) { + var actionName = interaction.prepared && interaction.prepared.name; + + if (!actionName) { + return null; + } + + var options = interaction.interactable.options; + return options[actionName].hold || options[actionName].delay; +} + +var ___default_11 = { + id: 'auto-start/hold', + install: __install_11, + listeners: { + 'interactions:new': function interactionsNew(_ref) { + var interaction = _ref.interaction; + interaction.autoStartHoldTimer = null; + }, + 'autoStart:prepared': function autoStartPrepared(_ref2) { + var interaction = _ref2.interaction; + var hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.autoStartHoldTimer = setTimeout(function () { + interaction.start(interaction.prepared, interaction.interactable, interaction.element); + }, hold); + } + }, + 'interactions:move': function interactionsMove(_ref3) { + var interaction = _ref3.interaction, + duplicate = _ref3.duplicate; + + if (interaction.pointerWasMoved && !duplicate) { + clearTimeout(interaction.autoStartHoldTimer); + } + }, + // prevent regular down->move autoStart + 'autoStart:before-start': function autoStartBeforeStart(_ref4) { + var interaction = _ref4.interaction; + var hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.prepared.name = null; + } + } + }, + getHoldDuration: getHoldDuration +}; +_$hold_11["default"] = ___default_11; + +var _$index_12 = {}; +"use strict"; + +Object.defineProperty(_$index_12, "__esModule", { + value: true +}); +Object.defineProperty(_$index_12, "autoStart", { + enumerable: true, + get: function get() { + return ___base_12["default"]; + } +}); +Object.defineProperty(_$index_12, "dragAxis", { + enumerable: true, + get: function get() { + return _dragAxis["default"]; + } +}); +Object.defineProperty(_$index_12, "hold", { + enumerable: true, + get: function get() { + return _hold["default"]; + } +}); +_$index_12["default"] = void 0; + +var ___base_12 = ___interopRequireDefault_12(_$base_9); + +var _dragAxis = ___interopRequireDefault_12(_$dragAxis_10); + +var _hold = ___interopRequireDefault_12(_$hold_11); + +function ___interopRequireDefault_12(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var ___default_12 = { + id: 'auto-start', + install: function install(scope) { + scope.usePlugin(___base_12["default"]); + scope.usePlugin(_hold["default"]); + scope.usePlugin(_dragAxis["default"]); + } +}; +_$index_12["default"] = ___default_12; + +var _$index_25 = {}; +"use strict"; + +function ___typeof_25(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_25 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_25 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_25(obj); } + +Object.defineProperty(_$index_25, "__esModule", { + value: true +}); +_$index_25["default"] = void 0; + +var ___domObjects_25 = ___interopRequireDefault_25(_$domObjects_52); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var ___extend_25 = ___interopRequireDefault_25(_$extend_55); + +var __is_25 = ___interopRequireWildcard_25(_$is_59); + +var ___window_25 = ___interopRequireDefault_25(_$window_68); + +function ___getRequireWildcardCache_25() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_25 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_25(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_25(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_25(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_25(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___toConsumableArray_25(arr) { return ___arrayWithoutHoles_25(arr) || ___iterableToArray_25(arr) || ___nonIterableSpread_25(); } + +function ___nonIterableSpread_25() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function ___iterableToArray_25(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function ___arrayWithoutHoles_25(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +var CheckName; + +(function (CheckName) { + CheckName["touchAction"] = "touchAction"; + CheckName["boxSizing"] = "boxSizing"; + CheckName["noListeners"] = "noListeners"; +})(CheckName || (CheckName = {})); + +var prefix = '[interact.js] '; +var links = { + touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action', + boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing' +}; +var isProduction = "production" === 'production'; // eslint-disable-next-line no-restricted-syntax + +function __install_25(scope) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + logger = _ref.logger; + + var Interactable = scope.Interactable, + defaults = scope.defaults; + scope.logger = logger || console; + defaults.base.devTools = { + ignore: {} + }; + + Interactable.prototype.devTools = function (options) { + if (options) { + (0, ___extend_25["default"])(this.options.devTools, options); + return this; + } + + return this.options.devTools; + }; +} + +var checks = [{ + name: CheckName.touchAction, + perform: function perform(_ref2) { + var element = _ref2.element; + return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/); + }, + getInfo: function getInfo(_ref3) { + var element = _ref3.element; + return [element, links.touchAction]; + }, + text: 'Consider adding CSS "touch-action: none" to this element\n' +}, { + name: CheckName.boxSizing, + perform: function perform(interaction) { + var element = interaction.element; + return interaction.prepared.name === 'resize' && element instanceof ___domObjects_25["default"].HTMLElement && !hasStyle(element, 'boxSizing', /border-box/); + }, + text: 'Consider adding CSS "box-sizing: border-box" to this resizable element', + getInfo: function getInfo(_ref4) { + var element = _ref4.element; + return [element, links.boxSizing]; + } +}, { + name: CheckName.noListeners, + perform: function perform(interaction) { + var actionName = interaction.prepared.name; + var moveListeners = interaction.interactable.events.types["".concat(actionName, "move")] || []; + return !moveListeners.length; + }, + getInfo: function getInfo(interaction) { + return [interaction.prepared.name, interaction.interactable]; + }, + text: 'There are no listeners set for this action' +}]; + +function hasStyle(element, prop, styleRe) { + return styleRe.test(element.style[prop] || ___window_25["default"].window.getComputedStyle(element)[prop]); +} + +function parentHasStyle(element, prop, styleRe) { + var parent = element; + + while (__is_25.element(parent)) { + if (hasStyle(parent, prop, styleRe)) { + return true; + } + + parent = (0, _$domUtils_53.parentNode)(parent); + } + + return false; +} + +var id = 'dev-tools'; +var defaultExport = isProduction ? { + id: id, + install: function install() {} +} : { + id: id, + install: __install_25, + listeners: { + 'interactions:action-start': function interactionsActionStart(_ref5, scope) { + var interaction = _ref5.interaction; + + for (var _i = 0; _i < checks.length; _i++) { + var _ref6; + + _ref6 = checks[_i]; + var check = _ref6; + var options = interaction.interactable && interaction.interactable.options; + + if (!(options && options.devTools && options.devTools.ignore[check.name]) && check.perform(interaction)) { + var _scope$logger; + + (_scope$logger = scope.logger).warn.apply(_scope$logger, [prefix + check.text].concat(___toConsumableArray_25(check.getInfo(interaction)))); + } + } + } + }, + checks: checks, + CheckName: CheckName, + links: links, + prefix: prefix +}; +var ___default_25 = defaultExport; +_$index_25["default"] = ___default_25; + +var _$Modification_29 = {}; +"use strict"; + +function ___typeof_29(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_29 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_29 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_29(obj); } + +Object.defineProperty(_$Modification_29, "__esModule", { + value: true +}); +_$Modification_29.getRectOffset = getRectOffset; +_$Modification_29["default"] = void 0; + +var ___clone_29 = ___interopRequireDefault_29(_$clone_51); + +var ___extend_29 = ___interopRequireDefault_29(_$extend_55); + +var rectUtils = ___interopRequireWildcard_29(_$rect_65); + +function ___getRequireWildcardCache_29() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_29 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_29(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_29(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_29(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_29(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_29(arr, i) { return ___arrayWithHoles_29(arr) || ___iterableToArrayLimit_29(arr, i) || ___nonIterableRest_29(); } + +function ___nonIterableRest_29() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_29(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_29(arr) { if (Array.isArray(arr)) return arr; } + +function ___classCallCheck_29(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_29(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_29(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_29(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_29(Constructor, staticProps); return Constructor; } + +function ___defineProperty_29(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Modification = /*#__PURE__*/function () { + function Modification(interaction) { + ___classCallCheck_29(this, Modification); + + this.interaction = interaction; + + ___defineProperty_29(this, "states", []); + + ___defineProperty_29(this, "startOffset", { + left: 0, + right: 0, + top: 0, + bottom: 0 + }); + + ___defineProperty_29(this, "startDelta", null); + + ___defineProperty_29(this, "result", null); + + ___defineProperty_29(this, "endResult", null); + + ___defineProperty_29(this, "edges", void 0); + + this.result = createResult(); + } + + ___createClass_29(Modification, [{ + key: "start", + value: function start(_ref, pageCoords) { + var phase = _ref.phase; + var interaction = this.interaction; + var modifierList = getModifierList(interaction); + this.prepareStates(modifierList); + this.edges = (0, ___extend_29["default"])({}, interaction.edges); + this.startOffset = getRectOffset(interaction.rect, pageCoords); + this.startDelta = { + x: 0, + y: 0 + }; + var arg = { + phase: phase, + pageCoords: pageCoords, + preEnd: false + }; + this.result = createResult(); + this.startAll(arg); + var result = this.result = this.setAll(arg); + return result; + } + }, { + key: "fillArg", + value: function fillArg(arg) { + var interaction = this.interaction; + arg.interaction = interaction; + arg.interactable = interaction.interactable; + arg.element = interaction.element; + arg.rect = arg.rect || interaction.rect; + arg.edges = this.edges; + arg.startOffset = this.startOffset; + } + }, { + key: "startAll", + value: function startAll(arg) { + this.fillArg(arg); + + for (var _i = 0; _i < this.states.length; _i++) { + var _ref2; + + _ref2 = this.states[_i]; + var state = _ref2; + + if (state.methods.start) { + arg.state = state; + state.methods.start(arg); + } + } + } + }, { + key: "setAll", + value: function setAll(arg) { + this.fillArg(arg); + var phase = arg.phase, + preEnd = arg.preEnd, + skipModifiers = arg.skipModifiers, + unmodifiedRect = arg.rect; + arg.coords = (0, ___extend_29["default"])({}, arg.pageCoords); + arg.rect = (0, ___extend_29["default"])({}, unmodifiedRect); + var states = skipModifiers ? this.states.slice(skipModifiers) : this.states; + var newResult = createResult(arg.coords, arg.rect); + + for (var _i2 = 0; _i2 < states.length; _i2++) { + var _ref3; + + _ref3 = states[_i2]; + var state = _ref3; + var options = state.options; + var lastModifierCoords = (0, ___extend_29["default"])({}, arg.coords); + var returnValue = null; + + if (state.methods.set && this.shouldDo(options, preEnd, phase)) { + arg.state = state; + returnValue = state.methods.set(arg); + rectUtils.addEdges(this.interaction.edges, arg.rect, { + x: arg.coords.x - lastModifierCoords.x, + y: arg.coords.y - lastModifierCoords.y + }); + } + + newResult.eventProps.push(returnValue); + } + + newResult.delta.x = arg.coords.x - arg.pageCoords.x; + newResult.delta.y = arg.coords.y - arg.pageCoords.y; + newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left; + newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right; + newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top; + newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom; + var prevCoords = this.result.coords; + var prevRect = this.result.rect; + + if (prevCoords && prevRect) { + var rectChanged = newResult.rect.left !== prevRect.left || newResult.rect.right !== prevRect.right || newResult.rect.top !== prevRect.top || newResult.rect.bottom !== prevRect.bottom; + newResult.changed = rectChanged || prevCoords.x !== newResult.coords.x || prevCoords.y !== newResult.coords.y; + } + + return newResult; + } + }, { + key: "applyToInteraction", + value: function applyToInteraction(arg) { + var interaction = this.interaction; + var phase = arg.phase; + var curCoords = interaction.coords.cur; + var startCoords = interaction.coords.start; + var result = this.result, + startDelta = this.startDelta; + var curDelta = result.delta; + + if (phase === 'start') { + (0, ___extend_29["default"])(this.startDelta, result.delta); + } + + for (var _i3 = 0; _i3 < [[startCoords, startDelta], [curCoords, curDelta]].length; _i3++) { + var _ref4; + + _ref4 = [[startCoords, startDelta], [curCoords, curDelta]][_i3]; + + var _ref5 = _ref4, + _ref6 = ___slicedToArray_29(_ref5, 2), + coordsSet = _ref6[0], + delta = _ref6[1]; + + coordsSet.page.x += delta.x; + coordsSet.page.y += delta.y; + coordsSet.client.x += delta.x; + coordsSet.client.y += delta.y; + } + + var rectDelta = this.result.rectDelta; + var rect = arg.rect || interaction.rect; + rect.left += rectDelta.left; + rect.right += rectDelta.right; + rect.top += rectDelta.top; + rect.bottom += rectDelta.bottom; + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + }, { + key: "setAndApply", + value: function setAndApply(arg) { + var interaction = this.interaction; + var phase = arg.phase, + preEnd = arg.preEnd, + skipModifiers = arg.skipModifiers; + var result = this.setAll({ + preEnd: preEnd, + phase: phase, + pageCoords: arg.modifiedCoords || interaction.coords.cur.page + }); + this.result = result; // don't fire an action move if a modifier would keep the event in the same + // cordinates as before + + if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) { + return false; + } + + if (arg.modifiedCoords) { + var page = interaction.coords.cur.page; + var adjustment = { + x: arg.modifiedCoords.x - page.x, + y: arg.modifiedCoords.y - page.y + }; + result.coords.x += adjustment.x; + result.coords.y += adjustment.y; + result.delta.x += adjustment.x; + result.delta.y += adjustment.y; + } + + this.applyToInteraction(arg); + } + }, { + key: "beforeEnd", + value: function beforeEnd(arg) { + var interaction = arg.interaction, + event = arg.event; + var states = this.states; + + if (!states || !states.length) { + return; + } + + var doPreend = false; + + for (var _i4 = 0; _i4 < states.length; _i4++) { + var _ref7; + + _ref7 = states[_i4]; + var state = _ref7; + arg.state = state; + var options = state.options, + methods = state.methods; + var endPosition = methods.beforeEnd && methods.beforeEnd(arg); + + if (endPosition) { + this.endResult = endPosition; + return false; + } + + doPreend = doPreend || !doPreend && this.shouldDo(options, true, arg.phase, true); + } + + if (doPreend) { + // trigger a final modified move before ending + interaction.move({ + event: event, + preEnd: true + }); + } + } + }, { + key: "stop", + value: function stop(arg) { + var interaction = arg.interaction; + + if (!this.states || !this.states.length) { + return; + } + + var modifierArg = (0, ___extend_29["default"])({ + states: this.states, + interactable: interaction.interactable, + element: interaction.element, + rect: null + }, arg); + this.fillArg(modifierArg); + + for (var _i5 = 0; _i5 < this.states.length; _i5++) { + var _ref8; + + _ref8 = this.states[_i5]; + var state = _ref8; + modifierArg.state = state; + + if (state.methods.stop) { + state.methods.stop(modifierArg); + } + } + + this.states = null; + this.endResult = null; + } + }, { + key: "prepareStates", + value: function prepareStates(modifierList) { + this.states = []; + + for (var index = 0; index < modifierList.length; index++) { + var _modifierList$index = modifierList[index], + options = _modifierList$index.options, + methods = _modifierList$index.methods, + name = _modifierList$index.name; + + if (options && options.enabled === false) { + continue; + } + + this.states.push({ + options: options, + methods: methods, + index: index, + name: name + }); + } + + return this.states; + } + }, { + key: "restoreInteractionCoords", + value: function restoreInteractionCoords(_ref9) { + var _ref9$interaction = _ref9.interaction, + coords = _ref9$interaction.coords, + rect = _ref9$interaction.rect, + modification = _ref9$interaction.modification; + + if (!modification.result) { + return; + } + + var startDelta = modification.startDelta; + var _modification$result = modification.result, + curDelta = _modification$result.delta, + rectDelta = _modification$result.rectDelta; + var coordsAndDeltas = [[coords.start, startDelta], [coords.cur, curDelta]]; + + for (var _i6 = 0; _i6 < coordsAndDeltas.length; _i6++) { + var _ref10; + + _ref10 = coordsAndDeltas[_i6]; + + var _ref11 = _ref10, + _ref12 = ___slicedToArray_29(_ref11, 2), + coordsSet = _ref12[0], + delta = _ref12[1]; + + coordsSet.page.x -= delta.x; + coordsSet.page.y -= delta.y; + coordsSet.client.x -= delta.x; + coordsSet.client.y -= delta.y; + } + + rect.left -= rectDelta.left; + rect.right -= rectDelta.right; + rect.top -= rectDelta.top; + rect.bottom -= rectDelta.bottom; + } + }, { + key: "shouldDo", + value: function shouldDo(options, preEnd, phase, requireEndOnly) { + if ( // ignore disabled modifiers + !options || options.enabled === false || // check if we require endOnly option to fire move before end + requireEndOnly && !options.endOnly || // don't apply endOnly modifiers when not ending + options.endOnly && !preEnd || // check if modifier should run be applied on start + phase === 'start' && !options.setStart) { + return false; + } + + return true; + } + }, { + key: "copyFrom", + value: function copyFrom(other) { + this.startOffset = other.startOffset; + this.startDelta = other.startDelta; + this.edges = other.edges; + this.states = other.states.map(function (s) { + return (0, ___clone_29["default"])(s); + }); + this.result = createResult((0, ___extend_29["default"])({}, other.result.coords), (0, ___extend_29["default"])({}, other.result.rect)); + } + }, { + key: "destroy", + value: function destroy() { + for (var prop in this) { + this[prop] = null; + } + } + }]); + + return Modification; +}(); + +_$Modification_29["default"] = Modification; + +function createResult(coords, rect) { + return { + rect: rect, + coords: coords, + delta: { + x: 0, + y: 0 + }, + rectDelta: { + left: 0, + right: 0, + top: 0, + bottom: 0 + }, + eventProps: [], + changed: true + }; +} + +function getModifierList(interaction) { + var actionOptions = interaction.interactable.options[interaction.prepared.name]; + var actionModifiers = actionOptions.modifiers; + + if (actionModifiers && actionModifiers.length) { + return actionModifiers.filter(function (modifier) { + return !modifier.options || modifier.options.enabled !== false; + }); + } + + return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize'].map(function (type) { + var options = actionOptions[type]; + return options && options.enabled && { + options: options, + methods: options._methods + }; + }).filter(function (m) { + return !!m; + }); +} + +function getRectOffset(rect, coords) { + return rect ? { + left: coords.x - rect.left, + top: coords.y - rect.top, + right: rect.right - coords.x, + bottom: rect.bottom - coords.y + } : { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; +} + +var _$base_32 = {}; +"use strict"; + +Object.defineProperty(_$base_32, "__esModule", { + value: true +}); +_$base_32.makeModifier = makeModifier; +_$base_32.addEventModifiers = addEventModifiers; +_$base_32["default"] = void 0; + +var _Modification = ___interopRequireDefault_32(_$Modification_29); + +function ___interopRequireDefault_32(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function makeModifier(module, name) { + var defaults = module.defaults; + var methods = { + start: module.start, + set: module.set, + beforeEnd: module.beforeEnd, + stop: module.stop + }; + + var modifier = function modifier(_options) { + var options = _options || {}; + options.enabled = options.enabled !== false; // add missing defaults to options + + for (var _prop in defaults) { + if (!(_prop in options)) { + options[_prop] = defaults[_prop]; + } + } + + var m = { + options: options, + methods: methods, + name: name + }; + return m; + }; + + if (name && typeof name === 'string') { + // for backwrads compatibility + modifier._defaults = defaults; + modifier._methods = methods; + } + + return modifier; +} + +function addEventModifiers(_ref) { + var iEvent = _ref.iEvent, + result = _ref.interaction.modification.result; + + if (result) { + iEvent.modifiers = result.eventProps; + } +} + +var modifiersBase = { + id: 'modifiers/base', + install: function install(scope) { + scope.defaults.perAction.modifiers = []; + }, + listeners: { + 'interactions:new': function interactionsNew(_ref2) { + var interaction = _ref2.interaction; + interaction.modification = new _Modification["default"](interaction); + }, + 'interactions:before-action-start': function interactionsBeforeActionStart(arg) { + var modification = arg.interaction.modification; + modification.start(arg, arg.interaction.coords.start.page); + arg.interaction.edges = modification.edges; + modification.applyToInteraction(arg); + }, + 'interactions:before-action-move': function interactionsBeforeActionMove(arg) { + return arg.interaction.modification.setAndApply(arg); + }, + 'interactions:before-action-end': function interactionsBeforeActionEnd(arg) { + return arg.interaction.modification.beforeEnd(arg); + }, + 'interactions:action-start': addEventModifiers, + 'interactions:action-move': addEventModifiers, + 'interactions:action-end': addEventModifiers, + 'interactions:after-action-start': function interactionsAfterActionStart(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:after-action-move': function interactionsAfterActionMove(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:stop': function interactionsStop(arg) { + return arg.interaction.modification.stop(arg); + } + }, + before: ['actions', 'action/drag', 'actions/resize', 'actions/gesture'] +}; +var ___default_32 = modifiersBase; +_$base_32["default"] = ___default_32; + +var _$index_41 = {}; +"use strict"; + +function ___typeof_41(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_41 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_41 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_41(obj); } + +Object.defineProperty(_$index_41, "__esModule", { + value: true +}); +_$index_41.addTotal = addTotal; +_$index_41.applyPending = applyPending; +_$index_41["default"] = void 0; + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +var __rectUtils_41 = ___interopRequireWildcard_41(_$rect_65); + +function ___getRequireWildcardCache_41() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_41 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_41(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_41(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_41(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +_$Interaction_18._ProxyMethods.offsetBy = ''; + +function addTotal(interaction) { + if (!interaction.pointerIsDown) { + return; + } + + addToCoords(interaction.coords.cur, interaction.offset.total); + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +function beforeAction(_ref) { + var interaction = _ref.interaction; + applyPending(interaction); +} + +function beforeEnd(_ref2) { + var interaction = _ref2.interaction; + var hadPending = applyPending(interaction); + + if (!hadPending) { + return; + } + + interaction.move({ + offset: true + }); + interaction.end(); + return false; +} + +function __end_41(_ref3) { + var interaction = _ref3.interaction; + interaction.offset.total.x = 0; + interaction.offset.total.y = 0; + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +function applyPending(interaction) { + if (!hasPending(interaction)) { + return false; + } + + var pending = interaction.offset.pending; + addToCoords(interaction.coords.cur, pending); + addToCoords(interaction.coords.delta, pending); + __rectUtils_41.addEdges(interaction.edges, interaction.rect, pending); + pending.x = 0; + pending.y = 0; + return true; +} + +function offsetBy(_ref4) { + var x = _ref4.x, + y = _ref4.y; + this.offset.pending.x += x; + this.offset.pending.y += y; + this.offset.total.x += x; + this.offset.total.y += y; +} + +function addToCoords(_ref5, _ref6) { + var page = _ref5.page, + client = _ref5.client; + var x = _ref6.x, + y = _ref6.y; + page.x += x; + page.y += y; + client.x += x; + client.y += y; +} + +function hasPending(interaction) { + return !!(interaction.offset.pending.x || interaction.offset.pending.y); +} + +var offset = { + id: 'offset', + install: function install(scope) { + scope.Interaction.prototype.offsetBy = offsetBy; + }, + listeners: { + 'interactions:new': function interactionsNew(_ref7) { + var interaction = _ref7.interaction; + interaction.offset = { + total: { + x: 0, + y: 0 + }, + pending: { + x: 0, + y: 0 + } + }; + }, + 'interactions:update-pointer': function interactionsUpdatePointer(_ref8) { + var interaction = _ref8.interaction; + return addTotal(interaction); + }, + 'interactions:before-action-start': beforeAction, + 'interactions:before-action-move': beforeAction, + 'interactions:before-action-end': beforeEnd, + 'interactions:stop': __end_41 + } +}; +var ___default_41 = offset; +_$index_41["default"] = ___default_41; + +var _$index_26 = {}; +"use strict"; + +function ___typeof_26(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_26 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_26 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_26(obj); } + +Object.defineProperty(_$index_26, "__esModule", { + value: true +}); +_$index_26["default"] = _$index_26.InertiaState = void 0; + +var modifiers = ___interopRequireWildcard_26(_$base_32); + +var ___Modification_26 = ___interopRequireDefault_26(_$Modification_29); + +var ___index_26 = ___interopRequireDefault_26(_$index_41); + +var __dom_26 = ___interopRequireWildcard_26(_$domUtils_53); + +var ___hypot_26 = ___interopRequireDefault_26(_$hypot_57); + +var __is_26 = ___interopRequireWildcard_26(_$is_59); + +/* removed: var _$pointerUtils_63 = require("@interactjs/utils/pointerUtils"); */; + +var ___raf_26 = ___interopRequireDefault_26(_$raf_64); + +function ___interopRequireDefault_26(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_26() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_26 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_26(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_26(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_26(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_26(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_26(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_26(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_26(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_26(Constructor, staticProps); return Constructor; } + +function ___defineProperty_26(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function __install_26(scope) { + var defaults = scope.defaults; + scope.usePlugin(___index_26["default"]); + scope.usePlugin(modifiers["default"]); + scope.actions.phases.inertiastart = true; + scope.actions.phases.resume = true; + defaults.perAction.inertia = { + enabled: false, + resistance: 10, + // the lambda in exponential decay + minSpeed: 100, + // target speed must be above this for inertia to start + endSpeed: 10, + // the speed at which inertia is slow enough to stop + allowResume: true, + // allow resuming an action in inertia phase + smoothEndDuration: 300 // animate to snap/restrict endOnly if there's no inertia + + }; +} + +var InertiaState = /*#__PURE__*/function () { + // eslint-disable-line camelcase + // eslint-disable-line camelcase + function InertiaState(interaction) { + ___classCallCheck_26(this, InertiaState); + + this.interaction = interaction; + + ___defineProperty_26(this, "active", false); + + ___defineProperty_26(this, "isModified", false); + + ___defineProperty_26(this, "smoothEnd", false); + + ___defineProperty_26(this, "allowResume", false); + + ___defineProperty_26(this, "modification", null); + + ___defineProperty_26(this, "modifierCount", 0); + + ___defineProperty_26(this, "modifierArg", null); + + ___defineProperty_26(this, "startCoords", null); + + ___defineProperty_26(this, "t0", 0); + + ___defineProperty_26(this, "v0", 0); + + ___defineProperty_26(this, "te", 0); + + ___defineProperty_26(this, "targetOffset", null); + + ___defineProperty_26(this, "modifiedOffset", null); + + ___defineProperty_26(this, "currentOffset", null); + + ___defineProperty_26(this, "lambda_v0", 0); + + ___defineProperty_26(this, "one_ve_v0", 0); + + ___defineProperty_26(this, "timeout", null); + } + + ___createClass_26(InertiaState, [{ + key: "start", + value: function start(event) { + var interaction = this.interaction; + var options = __getOptions_26(interaction); + + if (!options || !options.enabled) { + return false; + } + + var velocityClient = interaction.coords.velocity.client; + var pointerSpeed = (0, ___hypot_26["default"])(velocityClient.x, velocityClient.y); + var modification = this.modification || (this.modification = new ___Modification_26["default"](interaction)); + modification.copyFrom(interaction.modification); + this.t0 = interaction._now(); + this.allowResume = options.allowResume; + this.v0 = pointerSpeed; + this.currentOffset = { + x: 0, + y: 0 + }; + this.startCoords = interaction.coords.cur.page; + this.modifierArg = { + interaction: interaction, + interactable: interaction.interactable, + element: interaction.element, + rect: interaction.rect, + edges: interaction.edges, + pageCoords: this.startCoords, + preEnd: true, + phase: 'inertiastart' + }; + var thrown = this.t0 - interaction.coords.cur.timeStamp < 50 && pointerSpeed > options.minSpeed && pointerSpeed > options.endSpeed; + + if (thrown) { + this.startInertia(); + } else { + modification.result = modification.setAll(this.modifierArg); + + if (!modification.result.changed) { + return false; + } + + this.startSmoothEnd(); + } // force modification change + + + interaction.modification.result.rect = null; // bring inertiastart event to the target coords + + interaction.offsetBy(this.targetOffset); + + interaction._doPhase({ + interaction: interaction, + event: event, + phase: 'inertiastart' + }); + + interaction.offsetBy({ + x: -this.targetOffset.x, + y: -this.targetOffset.y + }); // force modification change + + interaction.modification.result.rect = null; + this.active = true; + interaction.simulation = this; + return true; + } + }, { + key: "startInertia", + value: function startInertia() { + var _this = this; + + var startVelocity = this.interaction.coords.velocity.client; + var options = __getOptions_26(this.interaction); + var lambda = options.resistance; + var inertiaDur = -Math.log(options.endSpeed / this.v0) / lambda; + this.targetOffset = { + x: (startVelocity.x - inertiaDur) / lambda, + y: (startVelocity.y - inertiaDur) / lambda + }; + this.te = inertiaDur; + this.lambda_v0 = lambda / this.v0; + this.one_ve_v0 = 1 - options.endSpeed / this.v0; + var modification = this.modification, + modifierArg = this.modifierArg; + modifierArg.pageCoords = { + x: this.startCoords.x + this.targetOffset.x, + y: this.startCoords.y + this.targetOffset.y + }; + modification.result = modification.setAll(modifierArg); + + if (modification.result.changed) { + this.isModified = true; + this.modifiedOffset = { + x: this.targetOffset.x + modification.result.delta.x, + y: this.targetOffset.y + modification.result.delta.y + }; + } + + this.timeout = ___raf_26["default"].request(function () { + return _this.inertiaTick(); + }); + } + }, { + key: "startSmoothEnd", + value: function startSmoothEnd() { + var _this2 = this; + + this.smoothEnd = true; + this.isModified = true; + this.targetOffset = { + x: this.modification.result.delta.x, + y: this.modification.result.delta.y + }; + this.timeout = ___raf_26["default"].request(function () { + return _this2.smoothEndTick(); + }); + } + }, { + key: "inertiaTick", + value: function inertiaTick() { + var _this3 = this; + + var interaction = this.interaction; + var options = __getOptions_26(interaction); + var lambda = options.resistance; + var t = (interaction._now() - this.t0) / 1000; + + if (t < this.te) { + var progress = 1 - (Math.exp(-lambda * t) - this.lambda_v0) / this.one_ve_v0; + var newOffset; + + if (this.isModified) { + newOffset = getQuadraticCurvePoint(0, 0, this.targetOffset.x, this.targetOffset.y, this.modifiedOffset.x, this.modifiedOffset.y, progress); + } else { + newOffset = { + x: this.targetOffset.x * progress, + y: this.targetOffset.y * progress + }; + } + + var delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move(); + this.timeout = ___raf_26["default"].request(function () { + return _this3.inertiaTick(); + }); + } else { + interaction.offsetBy({ + x: this.modifiedOffset.x - this.currentOffset.x, + y: this.modifiedOffset.y - this.currentOffset.y + }); + this.end(); + } + } + }, { + key: "smoothEndTick", + value: function smoothEndTick() { + var _this4 = this; + + var interaction = this.interaction; + var t = interaction._now() - this.t0; + + var _getOptions = __getOptions_26(interaction), + duration = _getOptions.smoothEndDuration; + + if (t < duration) { + var newOffset = { + x: easeOutQuad(t, 0, this.targetOffset.x, duration), + y: easeOutQuad(t, 0, this.targetOffset.y, duration) + }; + var delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move({ + skipModifiers: this.modifierCount + }); + this.timeout = ___raf_26["default"].request(function () { + return _this4.smoothEndTick(); + }); + } else { + interaction.offsetBy({ + x: this.targetOffset.x - this.currentOffset.x, + y: this.targetOffset.y - this.currentOffset.y + }); + this.end(); + } + } + }, { + key: "resume", + value: function resume(_ref) { + var pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; + var interaction = this.interaction; // undo inertia changes to interaction coords + + interaction.offsetBy({ + x: -this.currentOffset.x, + y: -this.currentOffset.y + }); // update pointer at pointer down position + + interaction.updatePointer(pointer, event, eventTarget, true); // fire resume signals and event + + interaction._doPhase({ + interaction: interaction, + event: event, + phase: 'resume' + }); + + (0, _$pointerUtils_63.copyCoords)(interaction.coords.prev, interaction.coords.cur); + this.stop(); + } + }, { + key: "end", + value: function end() { + this.interaction.move(); + this.interaction.end(); + this.stop(); + } + }, { + key: "stop", + value: function stop() { + this.active = this.smoothEnd = false; + this.interaction.simulation = null; + + ___raf_26["default"].cancel(this.timeout); + } + }]); + + return InertiaState; +}(); + +_$index_26.InertiaState = InertiaState; + +function __start_26(_ref2) { + var interaction = _ref2.interaction, + event = _ref2.event; + + if (!interaction._interacting || interaction.simulation) { + return null; + } + + var started = interaction.inertia.start(event); // prevent action end if inertia or smoothEnd + + return started ? false : null; +} // Check if the down event hits the current inertia target +// control should be return to the user + + +function resume(arg) { + var interaction = arg.interaction, + eventTarget = arg.eventTarget; + var state = interaction.inertia; + + if (!state.active) { + return; + } + + var element = eventTarget; // climb up the DOM tree from the event target + + while (__is_26.element(element)) { + // if interaction element is the current inertia target element + if (element === interaction.element) { + state.resume(arg); + break; + } + + element = __dom_26.parentNode(element); + } +} + +function stop(_ref3) { + var interaction = _ref3.interaction; + var state = interaction.inertia; + + if (state.active) { + state.stop(); + } +} + +function __getOptions_26(_ref4) { + var interactable = _ref4.interactable, + prepared = _ref4.prepared; + return interactable && interactable.options && prepared.name && interactable.options[prepared.name].inertia; +} + +var inertia = { + id: 'inertia', + before: ['modifiers/base'], + install: __install_26, + listeners: { + 'interactions:new': function interactionsNew(_ref5) { + var interaction = _ref5.interaction; + interaction.inertia = new InertiaState(interaction); + }, + 'interactions:before-action-end': __start_26, + 'interactions:down': resume, + 'interactions:stop': stop, + 'interactions:before-action-resume': function interactionsBeforeActionResume(arg) { + var modification = arg.interaction.modification; + modification.stop(arg); + modification.start(arg, arg.interaction.coords.cur.page); + modification.applyToInteraction(arg); + }, + 'interactions:before-action-inertiastart': function interactionsBeforeActionInertiastart(arg) { + return arg.interaction.modification.setAndApply(arg); + }, + 'interactions:action-resume': modifiers.addEventModifiers, + 'interactions:action-inertiastart': modifiers.addEventModifiers, + 'interactions:after-action-inertiastart': function interactionsAfterActionInertiastart(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:after-action-resume': function interactionsAfterActionResume(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + } + } +}; // http://stackoverflow.com/a/5634528/2280888 + +function _getQBezierValue(t, p1, p2, p3) { + var iT = 1 - t; + return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3; +} + +function getQuadraticCurvePoint(startX, startY, cpX, cpY, endX, endY, position) { + return { + x: _getQBezierValue(position, startX, cpX, endX), + y: _getQBezierValue(position, startY, cpY, endY) + }; +} // http://gizma.com/easing/ + + +function easeOutQuad(t, b, c, d) { + t /= d; + return -c * t * (t - 2) + b; +} + +var ___default_26 = inertia; +_$index_26["default"] = ___default_26; + +var _$aspectRatio_31 = {}; +"use strict"; + +Object.defineProperty(_$aspectRatio_31, "__esModule", { + value: true +}); +_$aspectRatio_31.aspectRatio = _$aspectRatio_31["default"] = void 0; + +var ___extend_31 = ___interopRequireDefault_31(_$extend_55); + +/* removed: var _$rect_65 = require("@interactjs/utils/rect"); */; + +var ___Modification_31 = ___interopRequireDefault_31(_$Modification_29); + +/* removed: var _$base_32 = require("./base"); */; + +function ___interopRequireDefault_31(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { ___defineProperty_31(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function ___defineProperty_31(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var aspectRatio = { + start: function start(arg) { + var state = arg.state, + rect = arg.rect, + originalEdges = arg.edges, + coords = arg.pageCoords; + var ratio = state.options.ratio; + var _state$options = state.options, + equalDelta = _state$options.equalDelta, + modifiers = _state$options.modifiers; + + if (ratio === 'preserve') { + ratio = rect.width / rect.height; + } + + state.startCoords = (0, ___extend_31["default"])({}, coords); + state.startRect = (0, ___extend_31["default"])({}, rect); + state.ratio = ratio; + state.equalDelta = equalDelta; + var linkedEdges = state.linkedEdges = { + top: originalEdges.top || originalEdges.left && !originalEdges.bottom, + left: originalEdges.left || originalEdges.top && !originalEdges.right, + bottom: originalEdges.bottom || originalEdges.right && !originalEdges.top, + right: originalEdges.right || originalEdges.bottom && !originalEdges.left + }; + state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right); + + if (state.equalDelta) { + state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1); + } else { + var negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left; + state.edgeSign = negativeSecondaryEdge ? -1 : 1; + } + + (0, ___extend_31["default"])(arg.edges, linkedEdges); + + if (!modifiers || !modifiers.length) { + return; + } + + var subModification = new ___Modification_31["default"](arg.interaction); + subModification.copyFrom(arg.interaction.modification); + subModification.prepareStates(modifiers); + state.subModification = subModification; + subModification.startAll(_objectSpread({}, arg)); + }, + set: function set(arg) { + var state = arg.state, + rect = arg.rect, + coords = arg.coords; + var initialCoords = (0, ___extend_31["default"])({}, coords); + var aspectMethod = state.equalDelta ? setEqualDelta : setRatio; + aspectMethod(state, state.xIsPrimaryAxis, coords, rect); + + if (!state.subModification) { + return null; + } + + var correctedRect = (0, ___extend_31["default"])({}, rect); + (0, _$rect_65.addEdges)(state.linkedEdges, correctedRect, { + x: coords.x - initialCoords.x, + y: coords.y - initialCoords.y + }); + var result = state.subModification.setAll(_objectSpread({}, arg, { + rect: correctedRect, + edges: state.linkedEdges, + pageCoords: coords, + prevCoords: coords, + prevRect: correctedRect + })); + var delta = result.delta; + + if (result.changed) { + var xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y); // do aspect modification again with critical edge axis as primary + + aspectMethod(state, xIsCriticalAxis, result.coords, result.rect); + (0, ___extend_31["default"])(coords, result.coords); + } + + return result.eventProps; + }, + defaults: { + ratio: 'preserve', + equalDelta: false, + modifiers: [], + enabled: false + } +}; +_$aspectRatio_31.aspectRatio = aspectRatio; + +function setEqualDelta(_ref, xIsPrimaryAxis, coords) { + var startCoords = _ref.startCoords, + edgeSign = _ref.edgeSign; + + if (xIsPrimaryAxis) { + coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign; + } else { + coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign; + } +} + +function setRatio(_ref2, xIsPrimaryAxis, coords, rect) { + var startRect = _ref2.startRect, + startCoords = _ref2.startCoords, + ratio = _ref2.ratio, + edgeSign = _ref2.edgeSign; + + if (xIsPrimaryAxis) { + var newHeight = rect.width / ratio; + coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign; + } else { + var newWidth = rect.height * ratio; + coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign; + } +} + +var ___default_31 = (0, _$base_32.makeModifier)(aspectRatio, 'aspectRatio'); + +_$aspectRatio_31["default"] = ___default_31; + +var _$pointer_35 = {}; +"use strict"; + +function ___typeof_35(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_35 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_35 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_35(obj); } + +Object.defineProperty(_$pointer_35, "__esModule", { + value: true +}); +_$pointer_35.getRestrictionRect = getRestrictionRect; +_$pointer_35.restrict = _$pointer_35["default"] = void 0; + +var ___extend_35 = ___interopRequireDefault_35(_$extend_55); + +var __is_35 = ___interopRequireWildcard_35(_$is_59); + +var __rectUtils_35 = ___interopRequireWildcard_35(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +function ___getRequireWildcardCache_35() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_35 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_35(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_35(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_35(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_35(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __start_35(_ref) { + var rect = _ref.rect, + startOffset = _ref.startOffset, + state = _ref.state, + interaction = _ref.interaction, + pageCoords = _ref.pageCoords; + var options = state.options; + var elementRect = options.elementRect; + var offset = (0, ___extend_35["default"])({ + left: 0, + top: 0, + right: 0, + bottom: 0 + }, options.offset || {}); + + if (rect && elementRect) { + var restriction = getRestrictionRect(options.restriction, interaction, pageCoords); + + if (restriction) { + var widthDiff = restriction.right - restriction.left - rect.width; + var heightDiff = restriction.bottom - restriction.top - rect.height; + + if (widthDiff < 0) { + offset.left += widthDiff; + offset.right += widthDiff; + } + + if (heightDiff < 0) { + offset.top += heightDiff; + offset.bottom += heightDiff; + } + } + + offset.left += startOffset.left - rect.width * elementRect.left; + offset.top += startOffset.top - rect.height * elementRect.top; + offset.right += startOffset.right - rect.width * (1 - elementRect.right); + offset.bottom += startOffset.bottom - rect.height * (1 - elementRect.bottom); + } + + state.offset = offset; +} + +function set(_ref2) { + var coords = _ref2.coords, + interaction = _ref2.interaction, + state = _ref2.state; + var options = state.options, + offset = state.offset; + var restriction = getRestrictionRect(options.restriction, interaction, coords); + + if (!restriction) { + return; + } + + var rect = __rectUtils_35.xywhToTlbr(restriction); + coords.x = Math.max(Math.min(rect.right - offset.right, coords.x), rect.left + offset.left); + coords.y = Math.max(Math.min(rect.bottom - offset.bottom, coords.y), rect.top + offset.top); +} + +function getRestrictionRect(value, interaction, coords) { + if (__is_35.func(value)) { + return __rectUtils_35.resolveRectLike(value, interaction.interactable, interaction.element, [coords.x, coords.y, interaction]); + } else { + return __rectUtils_35.resolveRectLike(value, interaction.interactable, interaction.element); + } +} + +var __defaults_35 = { + restriction: null, + elementRect: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrict = { + start: __start_35, + set: set, + defaults: __defaults_35 +}; +_$pointer_35.restrict = restrict; + +var ___default_35 = (0, _$base_32.makeModifier)(restrict, 'restrict'); + +_$pointer_35["default"] = ___default_35; + +var _$edges_34 = {}; +"use strict"; + +function ___typeof_34(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_34 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_34 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_34(obj); } + +Object.defineProperty(_$edges_34, "__esModule", { + value: true +}); +_$edges_34.restrictEdges = _$edges_34["default"] = void 0; + +var ___extend_34 = ___interopRequireDefault_34(_$extend_55); + +var __rectUtils_34 = ___interopRequireWildcard_34(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$pointer_35 = require("./pointer"); */; + +function ___getRequireWildcardCache_34() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_34 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_34(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_34(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_34(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_34(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +// This module adds the options.resize.restrictEdges setting which sets min and +// max for the top, left, bottom and right edges of the target being resized. +// +// interact(target).resize({ +// edges: { top: true, left: true }, +// restrictEdges: { +// inner: { top: 200, left: 200, right: 400, bottom: 400 }, +// outer: { top: 0, left: 0, right: 600, bottom: 600 }, +// }, +// }) +var noInner = { + top: +Infinity, + left: +Infinity, + bottom: -Infinity, + right: -Infinity +}; +var noOuter = { + top: -Infinity, + left: -Infinity, + bottom: +Infinity, + right: +Infinity +}; + +function __start_34(_ref) { + var interaction = _ref.interaction, + startOffset = _ref.startOffset, + state = _ref.state; + var options = state.options; + var offset; + + if (options) { + var offsetRect = (0, _$pointer_35.getRestrictionRect)(options.offset, interaction, interaction.coords.start.page); + offset = __rectUtils_34.rectToXY(offsetRect); + } + + offset = offset || { + x: 0, + y: 0 + }; + state.offset = { + top: offset.y + startOffset.top, + left: offset.x + startOffset.left, + bottom: offset.y - startOffset.bottom, + right: offset.x - startOffset.right + }; +} + +function __set_34(_ref2) { + var coords = _ref2.coords, + edges = _ref2.edges, + interaction = _ref2.interaction, + state = _ref2.state; + var offset = state.offset, + options = state.options; + + if (!edges) { + return; + } + + var page = (0, ___extend_34["default"])({}, coords); + var inner = (0, _$pointer_35.getRestrictionRect)(options.inner, interaction, page) || {}; + var outer = (0, _$pointer_35.getRestrictionRect)(options.outer, interaction, page) || {}; + fixRect(inner, noInner); + fixRect(outer, noOuter); + + if (edges.top) { + coords.y = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top); + } else if (edges.bottom) { + coords.y = Math.max(Math.min(outer.bottom + offset.bottom, page.y), inner.bottom + offset.bottom); + } + + if (edges.left) { + coords.x = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left); + } else if (edges.right) { + coords.x = Math.max(Math.min(outer.right + offset.right, page.x), inner.right + offset.right); + } +} + +function fixRect(rect, defaults) { + var _arr = ['top', 'left', 'bottom', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (!(edge in rect)) { + rect[edge] = defaults[edge]; + } + } + + return rect; +} + +var __defaults_34 = { + inner: null, + outer: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrictEdges = { + noInner: noInner, + noOuter: noOuter, + start: __start_34, + set: __set_34, + defaults: __defaults_34 +}; +_$edges_34.restrictEdges = restrictEdges; + +var ___default_34 = (0, _$base_32.makeModifier)(restrictEdges, 'restrictEdges'); + +_$edges_34["default"] = ___default_34; + +var _$rect_36 = {}; +"use strict"; + +Object.defineProperty(_$rect_36, "__esModule", { + value: true +}); +_$rect_36.restrictRect = _$rect_36["default"] = void 0; + +var ___extend_36 = ___interopRequireDefault_36(_$extend_55); + +/* removed: var _$pointer_35 = require("./pointer"); */; + +/* removed: var _$base_32 = require("../base"); */; + +function ___interopRequireDefault_36(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __defaults_36 = (0, ___extend_36["default"])({ + get elementRect() { + return { + top: 0, + left: 0, + bottom: 1, + right: 1 + }; + }, + + set elementRect(_) {} + +}, _$pointer_35.restrict.defaults); +var restrictRect = { + start: _$pointer_35.restrict.start, + set: _$pointer_35.restrict.set, + defaults: __defaults_36 +}; +_$rect_36.restrictRect = restrictRect; + +var ___default_36 = (0, _$base_32.makeModifier)(restrictRect, 'restrictRect'); + +_$rect_36["default"] = ___default_36; + +var _$size_37 = {}; +"use strict"; + +function ___typeof_37(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_37 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_37 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_37(obj); } + +Object.defineProperty(_$size_37, "__esModule", { + value: true +}); +_$size_37.restrictSize = _$size_37["default"] = void 0; + +var ___extend_37 = ___interopRequireDefault_37(_$extend_55); + +var __rectUtils_37 = ___interopRequireWildcard_37(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$edges_34 = require("./edges"); */; + +/* removed: var _$pointer_35 = require("./pointer"); */; + +function ___getRequireWildcardCache_37() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_37 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_37(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_37(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_37(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_37(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var noMin = { + width: -Infinity, + height: -Infinity +}; +var noMax = { + width: +Infinity, + height: +Infinity +}; + +function __start_37(arg) { + return _$edges_34.restrictEdges.start(arg); +} + +function __set_37(arg) { + var interaction = arg.interaction, + state = arg.state, + rect = arg.rect, + edges = arg.edges; + var options = state.options; + + if (!edges) { + return; + } + + var minSize = __rectUtils_37.tlbrToXywh((0, _$pointer_35.getRestrictionRect)(options.min, interaction, arg.coords)) || noMin; + var maxSize = __rectUtils_37.tlbrToXywh((0, _$pointer_35.getRestrictionRect)(options.max, interaction, arg.coords)) || noMax; + state.options = { + endOnly: options.endOnly, + inner: (0, ___extend_37["default"])({}, _$edges_34.restrictEdges.noInner), + outer: (0, ___extend_37["default"])({}, _$edges_34.restrictEdges.noOuter) + }; + + if (edges.top) { + state.options.inner.top = rect.bottom - minSize.height; + state.options.outer.top = rect.bottom - maxSize.height; + } else if (edges.bottom) { + state.options.inner.bottom = rect.top + minSize.height; + state.options.outer.bottom = rect.top + maxSize.height; + } + + if (edges.left) { + state.options.inner.left = rect.right - minSize.width; + state.options.outer.left = rect.right - maxSize.width; + } else if (edges.right) { + state.options.inner.right = rect.left + minSize.width; + state.options.outer.right = rect.left + maxSize.width; + } + + _$edges_34.restrictEdges.set(arg); + + state.options = options; +} + +var __defaults_37 = { + min: null, + max: null, + endOnly: false, + enabled: false +}; +var restrictSize = { + start: __start_37, + set: __set_37, + defaults: __defaults_37 +}; +_$size_37.restrictSize = restrictSize; + +var ___default_37 = (0, _$base_32.makeModifier)(restrictSize, 'restrictSize'); + +_$size_37["default"] = ___default_37; + +var _$pointer_39 = {}; +"use strict"; + +function ___typeof_39(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_39 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_39 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_39(obj); } + +Object.defineProperty(_$pointer_39, "__esModule", { + value: true +}); +_$pointer_39.snap = _$pointer_39["default"] = void 0; + +var __utils_39 = ___interopRequireWildcard_39(_$index_58); + +/* removed: var _$base_32 = require("../base"); */; + +function ___getRequireWildcardCache_39() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_39 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_39(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_39(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_39(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __start_39(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + element = arg.element, + rect = arg.rect, + state = arg.state, + startOffset = arg.startOffset; + var options = state.options; + var origin = options.offsetWithOrigin ? getOrigin(arg) : { + x: 0, + y: 0 + }; + var snapOffset; + + if (options.offset === 'startCoords') { + snapOffset = { + x: interaction.coords.start.page.x, + y: interaction.coords.start.page.y + }; + } else { + var offsetRect = __utils_39.rect.resolveRectLike(options.offset, interactable, element, [interaction]); + snapOffset = __utils_39.rect.rectToXY(offsetRect) || { + x: 0, + y: 0 + }; + snapOffset.x += origin.x; + snapOffset.y += origin.y; + } + + var relativePoints = options.relativePoints; + state.offsets = rect && relativePoints && relativePoints.length ? relativePoints.map(function (relativePoint, index) { + return { + index: index, + relativePoint: relativePoint, + x: startOffset.left - rect.width * relativePoint.x + snapOffset.x, + y: startOffset.top - rect.height * relativePoint.y + snapOffset.y + }; + }) : [__utils_39.extend({ + index: 0, + relativePoint: null + }, snapOffset)]; +} + +function __set_39(arg) { + var interaction = arg.interaction, + coords = arg.coords, + state = arg.state; + var options = state.options, + offsets = state.offsets; + var origin = __utils_39.getOriginXY(interaction.interactable, interaction.element, interaction.prepared.name); + var page = __utils_39.extend({}, coords); + var targets = []; + + if (!options.offsetWithOrigin) { + page.x -= origin.x; + page.y -= origin.y; + } + + for (var _i = 0; _i < offsets.length; _i++) { + var _ref; + + _ref = offsets[_i]; + var _offset = _ref; + var relativeX = page.x - _offset.x; + var relativeY = page.y - _offset.y; + + for (var _index = 0, len = options.targets.length; _index < len; _index++) { + var snapTarget = options.targets[_index]; + var target = void 0; + + if (__utils_39.is.func(snapTarget)) { + target = snapTarget(relativeX, relativeY, interaction, _offset, _index); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + targets.push({ + x: (__utils_39.is.number(target.x) ? target.x : relativeX) + _offset.x, + y: (__utils_39.is.number(target.y) ? target.y : relativeY) + _offset.y, + range: __utils_39.is.number(target.range) ? target.range : options.range, + source: snapTarget, + index: _index, + offset: _offset + }); + } + } + + var closest = { + target: null, + inRange: false, + distance: 0, + range: 0, + delta: { + x: 0, + y: 0 + } + }; + + for (var _i2 = 0; _i2 < targets.length; _i2++) { + var _target = targets[_i2]; + var range = _target.range; + var dx = _target.x - page.x; + var dy = _target.y - page.y; + var distance = __utils_39.hypot(dx, dy); + var inRange = distance <= range; // Infinite targets count as being out of range + // compared to non infinite ones that are in range + + if (range === Infinity && closest.inRange && closest.range !== Infinity) { + inRange = false; + } + + if (!closest.target || (inRange // is the closest target in range? + ? closest.inRange && range !== Infinity // the pointer is relatively deeper in this target + ? distance / range < closest.distance / closest.range // this target has Infinite range and the closest doesn't + : range === Infinity && closest.range !== Infinity || // OR this target is closer that the previous closest + distance < closest.distance : // The other is not in range and the pointer is closer to this target + !closest.inRange && distance < closest.distance)) { + closest.target = _target; + closest.distance = distance; + closest.range = range; + closest.inRange = inRange; + closest.delta.x = dx; + closest.delta.y = dy; + } + } + + if (closest.inRange) { + coords.x = closest.target.x; + coords.y = closest.target.y; + } + + state.closest = closest; + return closest; +} + +function getOrigin(arg) { + var element = arg.interaction.element; + var optionsOrigin = __utils_39.rect.rectToXY(__utils_39.rect.resolveRectLike(arg.state.options.origin, null, null, [element])); + var origin = optionsOrigin || __utils_39.getOriginXY(arg.interactable, element, arg.interaction.prepared.name); + return origin; +} + +var __defaults_39 = { + range: Infinity, + targets: null, + offset: null, + offsetWithOrigin: true, + origin: null, + relativePoints: null, + endOnly: false, + enabled: false +}; +var snap = { + start: __start_39, + set: __set_39, + defaults: __defaults_39 +}; +_$pointer_39.snap = snap; + +var ___default_39 = (0, _$base_32.makeModifier)(snap, 'snap'); + +_$pointer_39["default"] = ___default_39; + +var _$size_40 = {}; +"use strict"; + +function ___typeof_40(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_40 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_40 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_40(obj); } + +Object.defineProperty(_$size_40, "__esModule", { + value: true +}); +_$size_40.snapSize = _$size_40["default"] = void 0; + +var ___extend_40 = ___interopRequireDefault_40(_$extend_55); + +var __is_40 = ___interopRequireWildcard_40(_$is_59); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$pointer_39 = require("./pointer"); */; + +function ___getRequireWildcardCache_40() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_40 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_40(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_40(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_40(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_40(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_40(arr, i) { return ___arrayWithHoles_40(arr) || ___iterableToArrayLimit_40(arr, i) || ___nonIterableRest_40(); } + +function ___nonIterableRest_40() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_40(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_40(arr) { if (Array.isArray(arr)) return arr; } + +function __start_40(arg) { + var state = arg.state, + edges = arg.edges; + var options = state.options; + + if (!edges) { + return null; + } + + arg.state = { + options: { + targets: null, + relativePoints: [{ + x: edges.left ? 0 : 1, + y: edges.top ? 0 : 1 + }], + offset: options.offset || 'self', + origin: { + x: 0, + y: 0 + }, + range: options.range + } + }; + state.targetFields = state.targetFields || [['width', 'height'], ['x', 'y']]; + + _$pointer_39.snap.start(arg); + + state.offsets = arg.state.offsets; + arg.state = state; +} + +function __set_40(arg) { + var interaction = arg.interaction, + state = arg.state, + coords = arg.coords; + var options = state.options, + offsets = state.offsets; + var relative = { + x: coords.x - offsets[0].x, + y: coords.y - offsets[0].y + }; + state.options = (0, ___extend_40["default"])({}, options); + state.options.targets = []; + + for (var _i = 0; _i < (options.targets || []).length; _i++) { + var _ref; + + _ref = (options.targets || [])[_i]; + var snapTarget = _ref; + var target = void 0; + + if (__is_40.func(snapTarget)) { + target = snapTarget(relative.x, relative.y, interaction); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + for (var _i2 = 0; _i2 < state.targetFields.length; _i2++) { + var _ref2; + + _ref2 = state.targetFields[_i2]; + + var _ref3 = _ref2, + _ref4 = ___slicedToArray_40(_ref3, 2), + xField = _ref4[0], + yField = _ref4[1]; + + if (xField in target || yField in target) { + target.x = target[xField]; + target.y = target[yField]; + break; + } + } + + state.options.targets.push(target); + } + + var returnValue = _$pointer_39.snap.set(arg); + + state.options = options; + return returnValue; +} + +var __defaults_40 = { + range: Infinity, + targets: null, + offset: null, + endOnly: false, + enabled: false +}; +var snapSize = { + start: __start_40, + set: __set_40, + defaults: __defaults_40 +}; +_$size_40.snapSize = snapSize; + +var ___default_40 = (0, _$base_32.makeModifier)(snapSize, 'snapSize'); + +_$size_40["default"] = ___default_40; + +var _$edges_38 = {}; +"use strict"; + +Object.defineProperty(_$edges_38, "__esModule", { + value: true +}); +_$edges_38.snapEdges = _$edges_38["default"] = void 0; + +var ___clone_38 = ___interopRequireDefault_38(_$clone_51); + +var ___extend_38 = ___interopRequireDefault_38(_$extend_55); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$size_40 = require("./size"); */; + +function ___interopRequireDefault_38(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** + * @module modifiers/snapEdges + * + * @description + * This module allows snapping of the edges of targets during resize + * interactions. + * + * @example + * interact(target).resizable({ + * snapEdges: { + * targets: [interact.snappers.grid({ x: 100, y: 50 })], + * }, + * }) + * + * interact(target).resizable({ + * snapEdges: { + * targets: [ + * interact.snappers.grid({ + * top: 50, + * left: 50, + * bottom: 100, + * right: 100, + * }), + * ], + * }, + * }) + */ +function __start_38(arg) { + var edges = arg.edges; + + if (!edges) { + return null; + } + + arg.state.targetFields = arg.state.targetFields || [[edges.left ? 'left' : 'right', edges.top ? 'top' : 'bottom']]; + return _$size_40.snapSize.start(arg); +} + +var snapEdges = { + start: __start_38, + set: _$size_40.snapSize.set, + defaults: (0, ___extend_38["default"])((0, ___clone_38["default"])(_$size_40.snapSize.defaults), { + targets: null, + range: null, + offset: { + x: 0, + y: 0 + } + }) +}; +_$edges_38.snapEdges = snapEdges; + +var ___default_38 = (0, _$base_32.makeModifier)(snapEdges, 'snapEdges'); + +_$edges_38["default"] = ___default_38; + +var _$all_30 = {}; +"use strict"; + +Object.defineProperty(_$all_30, "__esModule", { + value: true +}); +Object.defineProperty(_$all_30, "aspectRatio", { + enumerable: true, + get: function get() { + return _aspectRatio["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictEdges", { + enumerable: true, + get: function get() { + return ___edges_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrict", { + enumerable: true, + get: function get() { + return ___pointer_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictRect", { + enumerable: true, + get: function get() { + return ___rect_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictSize", { + enumerable: true, + get: function get() { + return ___size_30["default"]; + } +}); +Object.defineProperty(_$all_30, "snapEdges", { + enumerable: true, + get: function get() { + return _edges2["default"]; + } +}); +Object.defineProperty(_$all_30, "snap", { + enumerable: true, + get: function get() { + return _pointer2["default"]; + } +}); +Object.defineProperty(_$all_30, "snapSize", { + enumerable: true, + get: function get() { + return _size2["default"]; + } +}); + +var _aspectRatio = ___interopRequireDefault_30(_$aspectRatio_31); + +var ___edges_30 = ___interopRequireDefault_30(_$edges_34); + +var ___pointer_30 = ___interopRequireDefault_30(_$pointer_35); + +var ___rect_30 = ___interopRequireDefault_30(_$rect_36); + +var ___size_30 = ___interopRequireDefault_30(_$size_37); + +var _edges2 = ___interopRequireDefault_30(_$edges_38); + +var _pointer2 = ___interopRequireDefault_30(_$pointer_39); + +var _size2 = ___interopRequireDefault_30(_$size_40); + +function ___interopRequireDefault_30(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _$grid_66 = {}; +"use strict"; + +Object.defineProperty(_$grid_66, "__esModule", { + value: true +}); +_$grid_66["default"] = void 0; + +function ___slicedToArray_66(arr, i) { return ___arrayWithHoles_66(arr) || ___iterableToArrayLimit_66(arr, i) || ___nonIterableRest_66(); } + +function ___nonIterableRest_66() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_66(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_66(arr) { if (Array.isArray(arr)) return arr; } + +function createGrid(grid) { + var coordFields = [['x', 'y'], ['left', 'top'], ['right', 'bottom'], ['width', 'height']].filter(function (_ref) { + var _ref2 = ___slicedToArray_66(_ref, 2), + xField = _ref2[0], + yField = _ref2[1]; + + return xField in grid || yField in grid; + }); + + var gridFunc = function gridFunc(x, y) { + var range = grid.range, + _grid$limits = grid.limits, + limits = _grid$limits === void 0 ? { + left: -Infinity, + right: Infinity, + top: -Infinity, + bottom: Infinity + } : _grid$limits, + _grid$offset = grid.offset, + offset = _grid$offset === void 0 ? { + x: 0, + y: 0 + } : _grid$offset; + var result = { + range: range, + grid: grid, + x: null, + y: null + }; + + for (var _i2 = 0; _i2 < coordFields.length; _i2++) { + var _ref3; + + _ref3 = coordFields[_i2]; + + var _ref4 = _ref3, + _ref5 = ___slicedToArray_66(_ref4, 2), + xField = _ref5[0], + yField = _ref5[1]; + + var gridx = Math.round((x - offset.x) / grid[xField]); + var gridy = Math.round((y - offset.y) / grid[yField]); + result[xField] = Math.max(limits.left, Math.min(limits.right, gridx * grid[xField] + offset.x)); + result[yField] = Math.max(limits.top, Math.min(limits.bottom, gridy * grid[yField] + offset.y)); + } + + return result; + }; + + gridFunc.grid = grid; + gridFunc.coordFields = coordFields; + return gridFunc; +} + +var ___default_66 = createGrid; +_$grid_66["default"] = ___default_66; + +var _$index_67 = {}; +"use strict"; + +Object.defineProperty(_$index_67, "__esModule", { + value: true +}); +Object.defineProperty(_$index_67, "grid", { + enumerable: true, + get: function get() { + return _grid["default"]; + } +}); + +var _grid = ___interopRequireDefault_67(_$grid_66); + +function ___interopRequireDefault_67(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _$index_33 = {}; +"use strict"; + +function ___typeof_33(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_33 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_33 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_33(obj); } + +Object.defineProperty(_$index_33, "__esModule", { + value: true +}); +_$index_33["default"] = void 0; + +var ___base_33 = ___interopRequireDefault_33(_$base_32); + +var all = ___interopRequireWildcard_33(_$all_30); + +var ___extend_33 = ___interopRequireDefault_33(_$extend_55); + +var snappers = ___interopRequireWildcard_33(_$index_67); + +function ___getRequireWildcardCache_33() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_33 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_33(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_33(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_33(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_33(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __modifiers_33 = { + id: 'modifiers', + install: function install(scope) { + var interact = scope.interact; + scope.usePlugin(___base_33["default"]); + interact.modifiers = (0, ___extend_33["default"])(interact.modifiers || {}, all); + interact.snappers = (0, ___extend_33["default"])(interact.snappers || {}, snappers); + interact.createSnapGrid = interact.snappers.grid; // for backwrads compatibility + + for (var type in all) { + var _all = all[type], + _defaults = _all._defaults, + _methods = _all._methods; + _defaults._methods = _methods; + scope.defaults.perAction[type] = _defaults; + } + } +}; +var ___default_33 = __modifiers_33; +_$index_33["default"] = ___default_33; + +var _$PointerEvent_42 = {}; +"use strict"; + +Object.defineProperty(_$PointerEvent_42, "__esModule", { + value: true +}); +_$PointerEvent_42.PointerEvent = _$PointerEvent_42["default"] = void 0; + +var ___BaseEvent2_42 = ___interopRequireDefault_42(_$BaseEvent_13); + +var __pointerUtils_42 = ___interopRequireWildcard_42(_$pointerUtils_63); + +function ___getRequireWildcardCache_42() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_42 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_42(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_42(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_42(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_42(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_42(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_42 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_42 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_42(obj); } + +function ___classCallCheck_42(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_42(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_42(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_42(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_42(Constructor, staticProps); return Constructor; } + +function ___possibleConstructorReturn_42(self, call) { if (call && (___typeof_42(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_42(self); } + +function ___getPrototypeOf_42(o) { ___getPrototypeOf_42 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_42(o); } + +function ___assertThisInitialized_42(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ___inherits_42(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_42(subClass, superClass); } + +function ___setPrototypeOf_42(o, p) { ___setPrototypeOf_42 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_42(o, p); } + +function ___defineProperty_42(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var PointerEvent = /*#__PURE__*/function (_BaseEvent) { + ___inherits_42(PointerEvent, _BaseEvent); + + /** */ + function PointerEvent(type, pointer, event, eventTarget, interaction, timeStamp) { + var _this; + + ___classCallCheck_42(this, PointerEvent); + + _this = ___possibleConstructorReturn_42(this, ___getPrototypeOf_42(PointerEvent).call(this, interaction)); + + ___defineProperty_42(___assertThisInitialized_42(_this), "type", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "originalEvent", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pointerId", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pointerType", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "double", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pageX", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pageY", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "clientX", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "clientY", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "dt", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "eventable", void 0); + + __pointerUtils_42.pointerExtend(___assertThisInitialized_42(_this), event); + + if (event !== pointer) { + __pointerUtils_42.pointerExtend(___assertThisInitialized_42(_this), pointer); + } + + _this.timeStamp = timeStamp; + _this.originalEvent = event; + _this.type = type; + _this.pointerId = __pointerUtils_42.getPointerId(pointer); + _this.pointerType = __pointerUtils_42.getPointerType(pointer); + _this.target = eventTarget; + _this.currentTarget = null; + + if (type === 'tap') { + var pointerIndex = interaction.getPointerIndex(pointer); + _this.dt = _this.timeStamp - interaction.pointers[pointerIndex].downTime; + var interval = _this.timeStamp - interaction.tapTime; + _this["double"] = !!(interaction.prevTap && interaction.prevTap.type !== 'doubletap' && interaction.prevTap.target === _this.target && interval < 500); + } else if (type === 'doubletap') { + _this.dt = pointer.timeStamp - interaction.tapTime; + } + + return _this; + } + + ___createClass_42(PointerEvent, [{ + key: "_subtractOrigin", + value: function _subtractOrigin(_ref) { + var originX = _ref.x, + originY = _ref.y; + this.pageX -= originX; + this.pageY -= originY; + this.clientX -= originX; + this.clientY -= originY; + return this; + } + }, { + key: "_addOrigin", + value: function _addOrigin(_ref2) { + var originX = _ref2.x, + originY = _ref2.y; + this.pageX += originX; + this.pageY += originY; + this.clientX += originX; + this.clientY += originY; + return this; + } + /** + * Prevent the default behaviour of the original Event + */ + + }, { + key: "preventDefault", + value: function preventDefault() { + this.originalEvent.preventDefault(); + } + }]); + + return PointerEvent; +}(___BaseEvent2_42["default"]); + +_$PointerEvent_42.PointerEvent = _$PointerEvent_42["default"] = PointerEvent; + +var _$base_43 = {}; +"use strict"; + +function ___typeof_43(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_43 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_43 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_43(obj); } + +Object.defineProperty(_$base_43, "__esModule", { + value: true +}); +_$base_43["default"] = void 0; + +var ___Interaction_43 = ___interopRequireDefault_43(_$Interaction_18); + +var ___scope_43 = _$scope_24({}); + +var __utils_43 = ___interopRequireWildcard_43(_$index_58); + +var _PointerEvent = ___interopRequireDefault_43(_$PointerEvent_42); + +function ___getRequireWildcardCache_43() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_43 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_43(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_43(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_43(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_43(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __defaults_43 = { + holdDuration: 600, + ignoreFrom: null, + allowFrom: null, + origin: { + x: 0, + y: 0 + } +}; +var pointerEvents = { + id: 'pointer-events/base', + install: __install_43, + listeners: { + 'interactions:new': addInteractionProps, + 'interactions:update-pointer': addHoldInfo, + 'interactions:move': moveAndClearHold, + 'interactions:down': function interactionsDown(arg, scope) { + downAndStartHold(arg, scope); + fire(arg, scope); + }, + 'interactions:up': function interactionsUp(arg, scope) { + clearHold(arg); + fire(arg, scope); + tapAfterUp(arg, scope); + }, + 'interactions:cancel': function interactionsCancel(arg, scope) { + clearHold(arg); + fire(arg, scope); + } + }, + PointerEvent: _PointerEvent["default"], + fire: fire, + collectEventTargets: collectEventTargets, + defaults: __defaults_43, + types: { + down: true, + move: true, + up: true, + cancel: true, + tap: true, + doubletap: true, + hold: true + } +}; + +function fire(arg, scope) { + var interaction = arg.interaction, + pointer = arg.pointer, + event = arg.event, + eventTarget = arg.eventTarget, + type = arg.type, + _arg$targets = arg.targets, + targets = _arg$targets === void 0 ? collectEventTargets(arg, scope) : _arg$targets; + var pointerEvent = new _PointerEvent["default"](type, pointer, event, eventTarget, interaction, scope.now()); + scope.fire('pointerEvents:new', { + pointerEvent: pointerEvent + }); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + targets: targets, + type: type, + pointerEvent: pointerEvent + }; + + for (var i = 0; i < targets.length; i++) { + var target = targets[i]; + + for (var prop in target.props || {}) { + pointerEvent[prop] = target.props[prop]; + } + + var origin = __utils_43.getOriginXY(target.eventable, target.node); + + pointerEvent._subtractOrigin(origin); + + pointerEvent.eventable = target.eventable; + pointerEvent.currentTarget = target.node; + target.eventable.fire(pointerEvent); + + pointerEvent._addOrigin(origin); + + if (pointerEvent.immediatePropagationStopped || pointerEvent.propagationStopped && i + 1 < targets.length && targets[i + 1].node !== pointerEvent.currentTarget) { + break; + } + } + + scope.fire('pointerEvents:fired', signalArg); + + if (type === 'tap') { + // if pointerEvent should make a double tap, create and fire a doubletap + // PointerEvent and use that as the prevTap + var prevTap = pointerEvent["double"] ? fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'doubletap' + }, scope) : pointerEvent; + interaction.prevTap = prevTap; + interaction.tapTime = prevTap.timeStamp; + } + + return pointerEvent; +} + +function collectEventTargets(_ref, scope) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget, + type = _ref.type; + var pointerIndex = interaction.getPointerIndex(pointer); + var pointerInfo = interaction.pointers[pointerIndex]; // do not fire a tap event if the pointer was moved before being lifted + + if (type === 'tap' && (interaction.pointerWasMoved || // or if the pointerup target is different to the pointerdown target + !(pointerInfo && pointerInfo.downTarget === eventTarget))) { + return []; + } + + var path = __utils_43.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: type, + path: path, + targets: [], + node: null + }; + + for (var _i = 0; _i < path.length; _i++) { + var _ref2; + + _ref2 = path[_i]; + var node = _ref2; + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (type === 'hold') { + signalArg.targets = signalArg.targets.filter(function (target) { + return target.eventable.options.holdDuration === interaction.pointers[pointerIndex].hold.duration; + }); + } + + return signalArg.targets; +} + +function addInteractionProps(_ref3) { + var interaction = _ref3.interaction; + interaction.prevTap = null; // the most recent tap event on this interaction + + interaction.tapTime = 0; // time of the most recent tap event +} + +function addHoldInfo(_ref4) { + var down = _ref4.down, + pointerInfo = _ref4.pointerInfo; + + if (!down && pointerInfo.hold) { + return; + } + + pointerInfo.hold = { + duration: Infinity, + timeout: null + }; +} + +function clearHold(_ref5) { + var interaction = _ref5.interaction, + pointerIndex = _ref5.pointerIndex; + + if (interaction.pointers[pointerIndex].hold) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } +} + +function moveAndClearHold(_ref6, scope) { + var interaction = _ref6.interaction, + pointer = _ref6.pointer, + event = _ref6.event, + eventTarget = _ref6.eventTarget, + duplicate = _ref6.duplicate; + var pointerIndex = interaction.getPointerIndex(pointer); + + if (!duplicate && (!interaction.pointerIsDown || interaction.pointerWasMoved)) { + if (interaction.pointerIsDown) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } + + fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'move' + }, scope); + } +} + +function downAndStartHold(_ref7, scope) { + var interaction = _ref7.interaction, + pointer = _ref7.pointer, + event = _ref7.event, + eventTarget = _ref7.eventTarget, + pointerIndex = _ref7.pointerIndex; + var timer = interaction.pointers[pointerIndex].hold; + var path = __utils_43.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'hold', + targets: [], + path: path, + node: null + }; + + for (var _i2 = 0; _i2 < path.length; _i2++) { + var _ref8; + + _ref8 = path[_i2]; + var node = _ref8; + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (!signalArg.targets.length) { + return; + } + + var minDuration = Infinity; + + for (var _i3 = 0; _i3 < signalArg.targets.length; _i3++) { + var _ref9; + + _ref9 = signalArg.targets[_i3]; + var target = _ref9; + var holdDuration = target.eventable.options.holdDuration; + + if (holdDuration < minDuration) { + minDuration = holdDuration; + } + } + + timer.duration = minDuration; + timer.timeout = setTimeout(function () { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'hold' + }, scope); + }, minDuration); +} + +function tapAfterUp(_ref10, scope) { + var interaction = _ref10.interaction, + pointer = _ref10.pointer, + event = _ref10.event, + eventTarget = _ref10.eventTarget; + + if (!interaction.pointerWasMoved) { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'tap' + }, scope); + } +} + +function __install_43(scope) { + scope.pointerEvents = pointerEvents; + scope.defaults.actions.pointerEvents = pointerEvents.defaults; + __utils_43.extend(scope.actions.phaselessTypes, pointerEvents.types); +} + +var ___default_43 = pointerEvents; +_$base_43["default"] = ___default_43; + +var _$holdRepeat_44 = {}; +"use strict"; + +Object.defineProperty(_$holdRepeat_44, "__esModule", { + value: true +}); +_$holdRepeat_44["default"] = void 0; + +var ___base_44 = ___interopRequireDefault_44(_$base_43); + +var ___PointerEvent_44 = ___interopRequireDefault_44(_$PointerEvent_42); + +function ___interopRequireDefault_44(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_44(scope) { + scope.usePlugin(___base_44["default"]); + var pointerEvents = scope.pointerEvents; // don't repeat by default + + pointerEvents.defaults.holdRepeatInterval = 0; + pointerEvents.types.holdrepeat = scope.actions.phaselessTypes.holdrepeat = true; +} + +function onNew(_ref) { + var pointerEvent = _ref.pointerEvent; + + if (pointerEvent.type !== 'hold') { + return; + } + + pointerEvent.count = (pointerEvent.count || 0) + 1; +} + +function onFired(_ref2, scope) { + var interaction = _ref2.interaction, + pointerEvent = _ref2.pointerEvent, + eventTarget = _ref2.eventTarget, + targets = _ref2.targets; + + if (pointerEvent.type !== 'hold' || !targets.length) { + return; + } // get the repeat interval from the first eventable + + + var interval = targets[0].eventable.options.holdRepeatInterval; // don't repeat if the interval is 0 or less + + if (interval <= 0) { + return; + } // set a timeout to fire the holdrepeat event + + + interaction.holdIntervalHandle = setTimeout(function () { + scope.pointerEvents.fire({ + interaction: interaction, + eventTarget: eventTarget, + type: 'hold', + pointer: pointerEvent, + event: pointerEvent + }, scope); + }, interval); +} + +function endHoldRepeat(_ref3) { + var interaction = _ref3.interaction; + + // set the interaction's holdStopTime property + // to stop further holdRepeat events + if (interaction.holdIntervalHandle) { + clearInterval(interaction.holdIntervalHandle); + interaction.holdIntervalHandle = null; + } +} + +var holdRepeat = { + id: 'pointer-events/holdRepeat', + install: __install_44, + listeners: ['move', 'up', 'cancel', 'endall'].reduce(function (acc, enderTypes) { + acc["pointerEvents:".concat(enderTypes)] = endHoldRepeat; + return acc; + }, { + 'pointerEvents:new': onNew, + 'pointerEvents:fired': onFired + }) +}; +var ___default_44 = holdRepeat; +_$holdRepeat_44["default"] = ___default_44; + +var _$interactableTargets_46 = {}; +"use strict"; + +Object.defineProperty(_$interactableTargets_46, "__esModule", { + value: true +}); +_$interactableTargets_46["default"] = void 0; + +var ___extend_46 = ___interopRequireDefault_46(_$extend_55); + +function ___interopRequireDefault_46(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_46(scope) { + var Interactable = scope.Interactable; + Interactable.prototype.pointerEvents = pointerEventsMethod; + var __backCompatOption = Interactable.prototype._backCompatOption; + + Interactable.prototype._backCompatOption = function (optionName, newValue) { + var ret = __backCompatOption.call(this, optionName, newValue); + + if (ret === this) { + this.events.options[optionName] = newValue; + } + + return ret; + }; +} + +function pointerEventsMethod(options) { + (0, ___extend_46["default"])(this.events.options, options); + return this; +} + +var plugin = { + id: 'pointer-events/interactableTargets', + install: __install_46, + listeners: { + 'pointerEvents:collect-targets': function pointerEventsCollectTargets(_ref, scope) { + var targets = _ref.targets, + node = _ref.node, + type = _ref.type, + eventTarget = _ref.eventTarget; + scope.interactables.forEachMatch(node, function (interactable) { + var eventable = interactable.events; + var options = eventable.options; + + if (eventable.types[type] && eventable.types[type].length && interactable.testIgnoreAllow(options, node, eventTarget)) { + targets.push({ + node: node, + eventable: eventable, + props: { + interactable: interactable + } + }); + } + }); + }, + 'interactable:new': function interactableNew(_ref2) { + var interactable = _ref2.interactable; + + interactable.events.getRect = function (element) { + return interactable.getRect(element); + }; + }, + 'interactable:set': function interactableSet(_ref3, scope) { + var interactable = _ref3.interactable, + options = _ref3.options; + (0, ___extend_46["default"])(interactable.events.options, scope.pointerEvents.defaults); + (0, ___extend_46["default"])(interactable.events.options, options.pointerEvents || {}); + } + } +}; +var ___default_46 = plugin; +_$interactableTargets_46["default"] = ___default_46; + +var _$index_45 = {}; +"use strict"; + +function ___typeof_45(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_45 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_45 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_45(obj); } + +Object.defineProperty(_$index_45, "__esModule", { + value: true +}); +Object.defineProperty(_$index_45, "holdRepeat", { + enumerable: true, + get: function get() { + return _holdRepeat["default"]; + } +}); +Object.defineProperty(_$index_45, "interactableTargets", { + enumerable: true, + get: function get() { + return _interactableTargets["default"]; + } +}); +_$index_45.pointerEvents = _$index_45["default"] = void 0; + +var __pointerEvents_45 = ___interopRequireWildcard_45(_$base_43); + +_$index_45.pointerEvents = __pointerEvents_45; + +var _holdRepeat = ___interopRequireDefault_45(_$holdRepeat_44); + +var _interactableTargets = ___interopRequireDefault_45(_$interactableTargets_46); + +function ___interopRequireDefault_45(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_45() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_45 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_45(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_45(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_45(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +var ___default_45 = { + id: 'pointer-events', + install: function install(scope) { + scope.usePlugin(__pointerEvents_45); + scope.usePlugin(_holdRepeat["default"]); + scope.usePlugin(_interactableTargets["default"]); + } +}; +_$index_45["default"] = ___default_45; + +var _$index_47 = {}; +"use strict"; + +Object.defineProperty(_$index_47, "__esModule", { + value: true +}); +_$index_47.install = __install_47; +_$index_47["default"] = void 0; + +var ___Interactable_47 = ___interopRequireDefault_47(_$Interactable_16({})); + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +/* removed: var _$index_58 = require("@interactjs/utils/index"); */; + +function ___interopRequireDefault_47(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_47(scope) { + var Interactable = scope.Interactable; + scope.actions.phases.reflow = true; + /** + * ```js + * const interactable = interact(target) + * const drag = { name: drag, axis: 'x' } + * const resize = { name: resize, edges: { left: true, bottom: true } + * + * interactable.reflow(drag) + * interactable.reflow(resize) + * ``` + * + * Start an action sequence to re-apply modifiers, check drops, etc. + * + * @param { Object } action The action to begin + * @param { string } action.name The name of the action + * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended + */ + + Interactable.prototype.reflow = function (action) { + return reflow(this, action, scope); + }; +} + +function reflow(interactable, action, scope) { + var elements = _$index_58.is.string(interactable.target) ? _$index_58.arr.from(interactable._context.querySelectorAll(interactable.target)) : [interactable.target]; // tslint:disable-next-line variable-name + + var Promise = _$index_58.win.window.Promise; + var promises = Promise ? [] : null; + + var _loop = function _loop() { + _ref = elements[_i]; + var element = _ref; + var rect = interactable.getRect(element); + + if (!rect) { + return "break"; + } + + var runningInteraction = _$index_58.arr.find(scope.interactions.list, function (interaction) { + return interaction.interacting() && interaction.interactable === interactable && interaction.element === element && interaction.prepared.name === action.name; + }); + + var reflowPromise = void 0; + + if (runningInteraction) { + runningInteraction.move(); + + if (promises) { + reflowPromise = runningInteraction._reflowPromise || new Promise(function (resolve) { + runningInteraction._reflowResolve = resolve; + }); + } + } else { + var xywh = _$index_58.rect.tlbrToXywh(rect); + + var coords = { + page: { + x: xywh.x, + y: xywh.y + }, + client: { + x: xywh.x, + y: xywh.y + }, + timeStamp: scope.now() + }; + + var event = _$index_58.pointer.coordsToEvent(coords); + + reflowPromise = startReflow(scope, interactable, element, action, event); + } + + if (promises) { + promises.push(reflowPromise); + } + }; + + for (var _i = 0; _i < elements.length; _i++) { + var _ref; + + var _ret = _loop(); + + if (_ret === "break") break; + } + + return promises && Promise.all(promises).then(function () { + return interactable; + }); +} + +function startReflow(scope, interactable, element, action, event) { + var interaction = scope.interactions["new"]({ + pointerType: 'reflow' + }); + var signalArg = { + interaction: interaction, + event: event, + pointer: event, + eventTarget: element, + phase: 'reflow' + }; + interaction.interactable = interactable; + interaction.element = element; + interaction.prepared = (0, _$index_58.extend)({}, action); + interaction.prevEvent = event; + interaction.updatePointer(event, event, element, true); + + interaction._doPhase(signalArg); + + var reflowPromise = _$index_58.win.window.Promise ? new _$index_58.win.window.Promise(function (resolve) { + interaction._reflowResolve = resolve; + }) : null; + interaction._reflowPromise = reflowPromise; + interaction.start(action, interactable, element); + + if (interaction._interacting) { + interaction.move(signalArg); + interaction.end(event); + } else { + interaction.stop(); + } + + interaction.removePointer(event, event); + interaction.pointerIsDown = false; + return reflowPromise; +} + +var ___default_47 = { + id: 'reflow', + install: __install_47, + listeners: { + // remove completed reflow interactions + 'interactions:stop': function interactionsStop(_ref2, scope) { + var interaction = _ref2.interaction; + + if (interaction.pointerType === 'reflow') { + if (interaction._reflowResolve) { + interaction._reflowResolve(); + } + + _$index_58.arr.remove(scope.interactions.list, interaction); + } + } + } +}; +_$index_47["default"] = ___default_47; + +var _$index_27 = {}; +"use strict"; + +function ___typeof_27(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_27 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_27 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_27(obj); } + +Object.defineProperty(_$index_27, "__esModule", { + value: true +}); +_$index_27.init = __init_27; +_$index_27["default"] = _$index_27.scope = _$index_27.interact = void 0; + +_$index_48; + +var ___scope_27 = _$scope_24({}); + +var ___browser_27 = ___interopRequireDefault_27(_$browser_50); + +var ___events_27 = ___interopRequireDefault_27(_$events_54); + +var __utils_27 = ___interopRequireWildcard_27(_$index_58); + +function ___getRequireWildcardCache_27() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_27 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_27(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_27(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_27(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_27(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** @module interact */ +var globalEvents = {}; +var scope = new ___scope_27.Scope(); +_$index_27.scope = scope; + +function __init_27(win) { + scope.init(win); + return interact; +} +/** + * ```js + * interact('#draggable').draggable(true) + * + * var rectables = interact('rect') + * rectables + * .gesturable(true) + * .on('gesturemove', function (event) { + * // ... + * }) + * ``` + * + * The methods of this variable can be used to set elements as interactables + * and also to change various default settings. + * + * Calling it as a function and passing an element or a valid CSS selector + * string returns an Interactable object which has various methods to configure + * it. + * + * @global + * + * @param {Element | string} target The HTML or SVG Element to interact with + * or CSS selector + * @return {Interactable} + */ + + +var interact = function interact(target, options) { + var interactable = scope.interactables.get(target, options); + + if (!interactable) { + interactable = scope.interactables["new"](target, options); + interactable.events.global = globalEvents; + } + + return interactable; +}; +/** + * Use a plugin + * + * @alias module:interact.use + * + * @param {Object} plugin + * @param {function} plugin.install + * @return {interact} + */ + + +_$index_27.interact = interact; +interact.use = use; + +function use(plugin, options) { + scope.usePlugin(plugin, options); + return interact; +} +/** + * Check if an element or selector has been set with the {@link interact} + * function + * + * @alias module:interact.isSet + * + * @param {Element} element The Element being searched for + * @return {boolean} Indicates if the element or CSS selector was previously + * passed to interact + */ + + +interact.isSet = isSet; + +function isSet(target, options) { + return !!scope.interactables.get(target, options && options.context); +} +/** + * Add a global listener for an InteractEvent or adds a DOM event to `document` + * + * @alias module:interact.on + * + * @param {string | array | object} type The types of events to listen for + * @param {function} listener The function event (s) + * @param {object | boolean} [options] object or useCapture flag for + * addEventListener + * @return {object} interact + */ + + +interact.on = on; + +function on(type, listener, options) { + if (__utils_27.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_27.is.array(type)) { + for (var _i = 0; _i < type.length; _i++) { + var _ref; + + _ref = type[_i]; + var eventType = _ref; + interact.on(eventType, listener, options); + } + + return interact; + } + + if (__utils_27.is.object(type)) { + for (var prop in type) { + interact.on(prop, type[prop], listener); + } + + return interact; + } // if it is an InteractEvent type, add listener to globalEvents + + + if ((0, ___scope_27.isNonNativeEvent)(type, scope.actions)) { + // if this type of event was never bound + if (!globalEvents[type]) { + globalEvents[type] = [listener]; + } else { + globalEvents[type].push(listener); + } + } // If non InteractEvent type, addEventListener to document + else { + ___events_27["default"].add(scope.document, type, listener, { + options: options + }); + } + + return interact; +} +/** + * Removes a global InteractEvent listener or DOM event from `document` + * + * @alias module:interact.off + * + * @param {string | array | object} type The types of events that were listened + * for + * @param {function} listener The listener function to be removed + * @param {object | boolean} options [options] object or useCapture flag for + * removeEventListener + * @return {object} interact + */ + + +interact.off = off; + +function off(type, listener, options) { + if (__utils_27.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_27.is.array(type)) { + for (var _i2 = 0; _i2 < type.length; _i2++) { + var _ref2; + + _ref2 = type[_i2]; + var eventType = _ref2; + interact.off(eventType, listener, options); + } + + return interact; + } + + if (__utils_27.is.object(type)) { + for (var prop in type) { + interact.off(prop, type[prop], listener); + } + + return interact; + } + + if ((0, ___scope_27.isNonNativeEvent)(type, scope.actions)) { + var index; + + if (type in globalEvents && (index = globalEvents[type].indexOf(listener)) !== -1) { + globalEvents[type].splice(index, 1); + } + } else { + ___events_27["default"].remove(scope.document, type, listener, options); + } + + return interact; +} + +interact.debug = debug; + +function debug() { + return scope; +} // expose the functions used to calculate multi-touch properties + + +interact.getPointerAverage = __utils_27.pointer.pointerAverage; +interact.getTouchBBox = __utils_27.pointer.touchBBox; +interact.getTouchDistance = __utils_27.pointer.touchDistance; +interact.getTouchAngle = __utils_27.pointer.touchAngle; +interact.getElementRect = __utils_27.dom.getElementRect; +interact.getElementClientRect = __utils_27.dom.getElementClientRect; +interact.matchesSelector = __utils_27.dom.matchesSelector; +interact.closest = __utils_27.dom.closest; +/** + * @alias module:interact.supportsTouch + * + * @return {boolean} Whether or not the browser supports touch input + */ + +interact.supportsTouch = supportsTouch; + +function supportsTouch() { + return ___browser_27["default"].supportsTouch; +} +/** + * @alias module:interact.supportsPointerEvent + * + * @return {boolean} Whether or not the browser supports PointerEvents + */ + + +interact.supportsPointerEvent = supportsPointerEvent; + +function supportsPointerEvent() { + return ___browser_27["default"].supportsPointerEvent; +} +/** + * Cancels all interactions (end events are not fired) + * + * @alias module:interact.stop + * + * @return {object} interact + */ + + +interact.stop = __stop_27; + +function __stop_27() { + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref3; + + _ref3 = scope.interactions.list[_i3]; + var interaction = _ref3; + interaction.stop(); + } + + return interact; +} +/** + * Returns or sets the distance the pointer must be moved before an action + * sequence occurs. This also affects tolerance for tap events. + * + * @alias module:interact.pointerMoveTolerance + * + * @param {number} [newValue] The movement from the start position must be greater than this value + * @return {interact | number} + */ + + +interact.pointerMoveTolerance = pointerMoveTolerance; + +function pointerMoveTolerance(newValue) { + if (__utils_27.is.number(newValue)) { + scope.interactions.pointerMoveTolerance = newValue; + return interact; + } + + return scope.interactions.pointerMoveTolerance; +} + +interact.addDocument = function (doc, options) { + return scope.addDocument(doc, options); +}; + +interact.removeDocument = function (doc) { + return scope.removeDocument(doc); +}; // eslint-disable-next-line no-undef + + +interact.version = "1.9.4"; +scope.interact = interact; +var ___default_27 = interact; +_$index_27["default"] = ___default_27; + +var _$index_28 = {}; +"use strict"; + +Object.defineProperty(_$index_28, "__esModule", { + value: true +}); +_$index_28.init = __init_28; +_$index_28["default"] = void 0; + +_$index_48; + +var _index2 = ___interopRequireDefault_28(_$index_5); + +var _index3 = ___interopRequireDefault_28(_$index_7); + +var _index4 = ___interopRequireDefault_28(_$index_12); + +var _index5 = ___interopRequireDefault_28(_$index_25); + +var _index6 = ___interopRequireDefault_28(_$index_26); + +var _index7 = ___interopRequireDefault_28(_$index_33); + +var _offset = ___interopRequireDefault_28(_$index_41); + +var _index8 = ___interopRequireDefault_28(_$index_45); + +var _index9 = ___interopRequireDefault_28(_$index_47); + +var _index10 = ___interopRequireWildcard_28(_$index_27); + +function ___getRequireWildcardCache_28() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_28 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_28(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_28(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_28(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_28(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_28(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_28 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_28 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_28(obj); } + +if ((typeof window === "undefined" ? "undefined" : ___typeof_28(window)) === 'object' && !!window) { + __init_28(window); +} + +var ___default_28 = _index10["default"]; +_$index_28["default"] = ___default_28; + +function __init_28(win) { + (0, _index10.init)(win); + + _index10["default"].use(_offset["default"]); // pointerEvents + + + _index10["default"].use(_index8["default"]); // inertia + + + _index10["default"].use(_index6["default"]); // snap, resize, etc. + + + _index10["default"].use(_index7["default"]); // autoStart, hold + + + _index10["default"].use(_index4["default"]); // drag and drop, resize, gesture + + + _index10["default"].use(_index2["default"]); // autoScroll + + + _index10["default"].use(_index3["default"]); // reflow + + + _index10["default"].use(_index9["default"]); // eslint-disable-next-line no-undef + + + if ("production" !== 'production') { + _index10["default"].use(_index5["default"]); + } + + return _index10["default"]; +} + +var _$index_69 = { exports: {} }; +"use strict"; + +Object.defineProperty(_$index_69.exports, "__esModule", { + value: true +}); +Object.defineProperty(_$index_69.exports, "init", { + enumerable: true, + get: function get() { + return ___index_69.init; + } +}); +_$index_69.exports["default"] = void 0; + +var ___index_69 = ___interopRequireWildcard_69(_$index_28); + +function ___getRequireWildcardCache_69() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_69 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_69(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_69(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_69(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___typeof_69(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_69 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_69 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_69(obj); } + +if (("object" === "undefined" ? "undefined" : ___typeof_69(_$index_69)) === 'object' && !!_$index_69) { + try { + _$index_69.exports = ___index_69["default"]; + } catch (_unused) {} +} + +___index_69["default"]["default"] = ___index_69["default"]; +___index_69["default"].init = ___index_69.init; +var ___default_69 = ___index_69["default"]; +_$index_69.exports["default"] = ___default_69; + +_$index_69 = _$index_69.exports +return _$index_69; + +}); + +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2stZmxhdC9fcHJlbHVkZSIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9zY29wZS50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvaW50ZXJhY3Rpb25zLnRzIiwiLi4vQGludGVyYWN0anMvdHlwZXMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9pc1dpbmRvdy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL3dpbmRvdy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2lzLnRzIiwiLi4vQGludGVyYWN0anMvYWN0aW9ucy9kcmFnLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvYXJyLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZG9tT2JqZWN0cy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2Jyb3dzZXIudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9jbG9uZS50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvcG9pbnRlckV4dGVuZC50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2h5cG90LnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvcG9pbnRlclV0aWxzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZXZlbnRzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvbm9ybWFsaXplTGlzdGVuZXJzLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9FdmVudGFibGUudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9yZWN0LnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZ2V0T3JpZ2luWFkudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9yYWYudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMudHMiLCIuLi9AaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZVNldC50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvQmFzZUV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9Qb2ludGVySW5mby50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24udHMiLCIuLi9AaW50ZXJhY3Rqcy9jb3JlL2ludGVyYWN0aW9uRmluZGVyLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9pbnRlcmFjdGFibGVQcmV2ZW50RGVmYXVsdC50cyIsIi4uL0BpbnRlcmFjdGpzL2FjdGlvbnMvZHJvcC9Ecm9wRXZlbnQudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL2Ryb3AvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL2dlc3R1cmUudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL3Jlc2l6ZS50cyIsIi4uL0BpbnRlcmFjdGpzL2FjdGlvbnMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXNjcm9sbC9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvSW50ZXJhY3RhYmxlTWV0aG9kcy50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvYmFzZS50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvZHJhZ0F4aXMudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXN0YXJ0L2hvbGQudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXN0YXJ0L2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvZGV2LXRvb2xzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL01vZGlmaWNhdGlvbi50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9iYXNlLnRzIiwiLi4vQGludGVyYWN0anMvb2Zmc2V0L2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvaW5lcnRpYS9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9hc3BlY3RSYXRpby50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9yZXN0cmljdC9wb2ludGVyLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3Jlc3RyaWN0L2VkZ2VzLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3Jlc3RyaWN0L3JlY3QudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvcmVzdHJpY3Qvc2l6ZS50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9zbmFwL3BvaW50ZXIudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvc25hcC9zaXplLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3NuYXAvZWRnZXMudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvYWxsLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvc25hcHBlcnMvZ3JpZC50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL3NuYXBwZXJzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvUG9pbnRlckV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvYmFzZS50cyIsIi4uL0BpbnRlcmFjdGpzL3BvaW50ZXItZXZlbnRzL2hvbGRSZXBlYXQudHMiLCIuLi9AaW50ZXJhY3Rqcy9wb2ludGVyLWV2ZW50cy9pbnRlcmFjdGFibGVUYXJnZXRzLnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9yZWZsb3cvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9pbnRlcmFjdC9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2ludGVyYWN0anMvaW5kZXgudHMiLCJpbmRleC50cyIsIi4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2stZmxh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QSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsZUFBQSxFQXhDb0IsSUF3Q3BCLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsU0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsU0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxVQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLE9BQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLElBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxJQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxVQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsVUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxPQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsT0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFdBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxXQUFBLEVBQUEsS0FBQSxD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QUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7Ozs7Ozs7QUFFQSxJQUFJLENBQUEsUUFBQSxLQUFBLFdBQUEsR0FBQSxXQUFBLEdBQUEsWUFBQSxDQUFPLFVBQVAsQ0FBQSxNQUFrQixRQUFsQixJQUE4QixDQUFDLENBQUMsVUFBcEMsRUFBNEM7RUFDMUMsSUFBSTtJQUFFLGtCQUFBLEdBQWlCLFdBQUEsQ0FBQSxTQUFBLENBQWpCLENBQUE7R0FBTixDQUNBLE9BQUEsT0FBQSxFQUFNLEVBQUU7Q0FDVDs7QUFFQSxXQUFBLENBQUEsU0FBQSxDQUFELENBQUEsU0FBQSxDQUFBLEdBQTRCLFdBQUEsQ0FBQSxTQUFBLENBQTVCLENBQUE7QUFDRSxXQUFBLENBQUEsU0FBQSxDQUFELENBQWtCLElBQWxCLEdBQXlCLFdBQUEsQ0FBQSxJQUF6QixDQUFBO29CQUVjLFdBQUEsQ0FBQSxTQUFBOzs7QUNWZjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5pbnRlcmFjdCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7XG52YXIgY3JlYXRlTW9kdWxlRmFjdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZU1vZHVsZUZhY3RvcnkodCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBlfHx0KGU9e2V4cG9ydHM6e30scGFyZW50OnJ9LGUuZXhwb3J0cyksZS5leHBvcnRzfX07XG4iLCJpbXBvcnQgKiBhcyBhcnIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYXJyJ1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcidcbmltcG9ydCBjbG9uZSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9jbG9uZSdcbmltcG9ydCB7IGdldEVsZW1lbnRSZWN0LCBtYXRjaGVzVXBUbywgbm9kZUNvbnRhaW5zLCB0cnlTZWxlY3RvciB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV2ZW50cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ldmVudHMnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IG5vcm1hbGl6ZUxpc3RlbmVycyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ub3JtYWxpemVMaXN0ZW5lcnMnXG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy93aW5kb3cnXG5pbXBvcnQgeyBBY3Rpb25EZWZhdWx0cywgRGVmYXVsdHMsIE9wdGlvbnMgfSBmcm9tICcuL2RlZmF1bHRPcHRpb25zJ1xuaW1wb3J0IEV2ZW50YWJsZSBmcm9tICcuL0V2ZW50YWJsZSdcbmltcG9ydCB7IEFjdGlvbnMsIGlzTm9uTmF0aXZlRXZlbnQgfSBmcm9tICcuL3Njb3BlJ1xuXG50eXBlIElnbm9yZVZhbHVlID0gc3RyaW5nIHwgSW50ZXJhY3QuRWxlbWVudCB8IGJvb2xlYW5cblxuLyoqICovXG5leHBvcnQgY2xhc3MgSW50ZXJhY3RhYmxlIGltcGxlbWVudHMgUGFydGlhbDxFdmVudGFibGU+IHtcbiAgcHJvdGVjdGVkIGdldCBfZGVmYXVsdHMgKCk6IERlZmF1bHRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmFzZToge30sXG4gICAgICBwZXJBY3Rpb246IHt9LFxuICAgICAgYWN0aW9uczoge30gYXMgQWN0aW9uRGVmYXVsdHMsXG4gICAgfVxuICB9XG5cbiAgcmVhZG9ubHkgb3B0aW9ucyE6IFJlcXVpcmVkPE9wdGlvbnM+XG4gIHJlYWRvbmx5IF9hY3Rpb25zOiBBY3Rpb25zXG4gIHJlYWRvbmx5IHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0XG4gIHJlYWRvbmx5IGV2ZW50cyA9IG5ldyBFdmVudGFibGUoKVxuICByZWFkb25seSBfY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50XG4gIHJlYWRvbmx5IF93aW46IFdpbmRvd1xuICByZWFkb25seSBfZG9jOiBEb2N1bWVudFxuXG4gIC8qKiAqL1xuICBjb25zdHJ1Y3RvciAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM6IGFueSwgZGVmYXVsdENvbnRleHQ6IERvY3VtZW50IHwgSW50ZXJhY3QuRWxlbWVudCkge1xuICAgIHRoaXMuX2FjdGlvbnMgPSBvcHRpb25zLmFjdGlvbnNcbiAgICB0aGlzLnRhcmdldCAgID0gdGFyZ2V0XG4gICAgdGhpcy5fY29udGV4dCA9IG9wdGlvbnMuY29udGV4dCB8fCBkZWZhdWx0Q29udGV4dFxuICAgIHRoaXMuX3dpbiAgICAgPSBnZXRXaW5kb3codHJ5U2VsZWN0b3IodGFyZ2V0KSA/IHRoaXMuX2NvbnRleHQgOiB0YXJnZXQpXG4gICAgdGhpcy5fZG9jICAgICA9IHRoaXMuX3dpbi5kb2N1bWVudFxuXG4gICAgdGhpcy5zZXQob3B0aW9ucylcbiAgfVxuXG4gIHNldE9uRXZlbnRzIChhY3Rpb25OYW1lOiBJbnRlcmFjdC5BY3Rpb25OYW1lLCBwaGFzZXM6IE5vbk51bGxhYmxlPGFueT4pIHtcbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25zdGFydCkpIHsgdGhpcy5vbihgJHthY3Rpb25OYW1lfXN0YXJ0YCwgcGhhc2VzLm9uc3RhcnQpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25tb3ZlKSkgeyB0aGlzLm9uKGAke2FjdGlvbk5hbWV9bW92ZWAsIHBoYXNlcy5vbm1vdmUpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25lbmQpKSB7IHRoaXMub24oYCR7YWN0aW9uTmFtZX1lbmRgLCBwaGFzZXMub25lbmQpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25pbmVydGlhc3RhcnQpKSB7IHRoaXMub24oYCR7YWN0aW9uTmFtZX1pbmVydGlhc3RhcnRgLCBwaGFzZXMub25pbmVydGlhc3RhcnQpIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1cGRhdGVQZXJBY3Rpb25MaXN0ZW5lcnMgKGFjdGlvbk5hbWU6IEludGVyYWN0LkFjdGlvbk5hbWUsIHByZXY6IEludGVyYWN0Lkxpc3RlbmVycywgY3VyOiBJbnRlcmFjdC5MaXN0ZW5lcnMpIHtcbiAgICBpZiAoaXMuYXJyYXkocHJldikgfHwgaXMub2JqZWN0KHByZXYpKSB7XG4gICAgICB0aGlzLm9mZihhY3Rpb25OYW1lLCBwcmV2KVxuICAgIH1cblxuICAgIGlmIChpcy5hcnJheShjdXIpIHx8IGlzLm9iamVjdChjdXIpKSB7XG4gICAgICB0aGlzLm9uKGFjdGlvbk5hbWUsIGN1cilcbiAgICB9XG4gIH1cblxuICBzZXRQZXJBY3Rpb24gKGFjdGlvbk5hbWU6IEludGVyYWN0LkFjdGlvbk5hbWUsIG9wdGlvbnM6IEludGVyYWN0Lk9yQm9vbGVhbjxPcHRpb25zPikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5fZGVmYXVsdHNcblxuICAgIC8vIGZvciBhbGwgdGhlIGRlZmF1bHQgcGVyLWFjdGlvbiBvcHRpb25zXG4gICAgZm9yIChjb25zdCBvcHRpb25OYW1lXyBpbiBvcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHRpb25OYW1lID0gb3B0aW9uTmFtZV8gYXMga2V5b2YgSW50ZXJhY3QuUGVyQWN0aW9uRGVmYXVsdHNcbiAgICAgIGNvbnN0IGFjdGlvbk9wdGlvbnMgPSB0aGlzLm9wdGlvbnNbYWN0aW9uTmFtZV1cbiAgICAgIGNvbnN0IG9wdGlvblZhbHVlOiBhbnkgPSBvcHRpb25zW29wdGlvbk5hbWVdXG5cbiAgICAgIC8vIHJlbW92ZSBvbGQgZXZlbnQgbGlzdGVuZXJzIGFuZCBhZGQgbmV3IG9uZXNcbiAgICAgIGlmIChvcHRpb25OYW1lID09PSAnbGlzdGVuZXJzJykge1xuICAgICAgICB0aGlzLnVwZGF0ZVBlckFjdGlvbkxpc3RlbmVycyhhY3Rpb25OYW1lLCBhY3Rpb25PcHRpb25zLmxpc3RlbmVycywgb3B0aW9uVmFsdWUgYXMgSW50ZXJhY3QuTGlzdGVuZXJzKVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgb3B0aW9uIHZhbHVlIGlzIGFuIGFycmF5XG4gICAgICBpZiAoaXMuYXJyYXk8YW55PihvcHRpb25WYWx1ZSkpIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IGFyci5mcm9tKG9wdGlvblZhbHVlKVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBhbiBvYmplY3RcbiAgICAgIGVsc2UgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvblZhbHVlKSkge1xuICAgICAgICAvLyBjb3B5IHRoZSBvYmplY3RcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IGV4dGVuZChcbiAgICAgICAgICBhY3Rpb25PcHRpb25zW29wdGlvbk5hbWVdIHx8IHt9IGFzIGFueSxcbiAgICAgICAgICBjbG9uZShvcHRpb25WYWx1ZSkpXG5cbiAgICAgICAgLy8gc2V0IGFuYWJsZWQgZmllbGQgdG8gdHJ1ZSBpZiBpdCBleGlzdHMgaW4gdGhlIGRlZmF1bHRzXG4gICAgICAgIGlmIChpcy5vYmplY3QoZGVmYXVsdHMucGVyQWN0aW9uW29wdGlvbk5hbWVdKSAmJiAnZW5hYmxlZCcgaW4gKGRlZmF1bHRzLnBlckFjdGlvbltvcHRpb25OYW1lXSBhcyBhbnkpKSB7XG4gICAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KS5lbmFibGVkID0gb3B0aW9uVmFsdWUuZW5hYmxlZCAhPT0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBhIGJvb2xlYW4gYW5kIHRoZSBkZWZhdWx0IGlzIGFuIG9iamVjdFxuICAgICAgZWxzZSBpZiAoaXMuYm9vbChvcHRpb25WYWx1ZSkgJiYgaXMub2JqZWN0KGRlZmF1bHRzLnBlckFjdGlvbltvcHRpb25OYW1lXSkpIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KS5lbmFibGVkID0gb3B0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIGlmIGl0J3MgYW55dGhpbmcgZWxzZSwgZG8gYSBwbGFpbiBhc3NpZ25tZW50XG4gICAgICBlbHNlIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IG9wdGlvblZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHRvIGdldCBhbiBJbnRlcmFjdGFibGVzIGJvdW5kaW5nIHJlY3QuIENhbiBiZVxuICAgKiBvdmVycmlkZGVuIHVzaW5nIHtAbGluayBJbnRlcmFjdGFibGUucmVjdENoZWNrZXJ9LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbGVtZW50XSBUaGUgZWxlbWVudCB0byBtZWFzdXJlLlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBvYmplY3QncyBib3VuZGluZyByZWN0YW5nbGUuXG4gICAqL1xuICBnZXRSZWN0IChlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gICAgZWxlbWVudCA9IGVsZW1lbnQgfHwgKGlzLmVsZW1lbnQodGhpcy50YXJnZXQpXG4gICAgICA/IHRoaXMudGFyZ2V0XG4gICAgICA6IG51bGwpXG5cbiAgICBpZiAoaXMuc3RyaW5nKHRoaXMudGFyZ2V0KSkge1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnQgfHwgdGhpcy5fY29udGV4dC5xdWVyeVNlbGVjdG9yKHRoaXMudGFyZ2V0KVxuICAgIH1cblxuICAgIHJldHVybiBnZXRFbGVtZW50UmVjdChlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBjYWxjdWxhdGUgdGhlIGludGVyYWN0YWJsZSdzXG4gICAqIGVsZW1lbnQncyByZWN0YW5nbGVcbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NoZWNrZXJdIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGlzIEludGVyYWN0YWJsZSdzXG4gICAqIGJvdW5kaW5nIHJlY3RhbmdsZS4gU2VlIHtAbGluayBJbnRlcmFjdGFibGUuZ2V0UmVjdH1cbiAgICogQHJldHVybiB7ZnVuY3Rpb24gfCBvYmplY3R9IFRoZSBjaGVja2VyIGZ1bmN0aW9uIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICByZWN0Q2hlY2tlciAoY2hlY2tlcjogKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpID0+IGFueSkge1xuICAgIGlmIChpcy5mdW5jKGNoZWNrZXIpKSB7XG4gICAgICB0aGlzLmdldFJlY3QgPSBjaGVja2VyXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrZXIgPT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmdldFJlY3RcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRSZWN0XG4gIH1cblxuICBfYmFja0NvbXBhdE9wdGlvbiAob3B0aW9uTmFtZToga2V5b2YgSW50ZXJhY3QuT3B0aW9ucywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0cnlTZWxlY3RvcihuZXdWYWx1ZSkgfHwgaXMub2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgKHRoaXMub3B0aW9uc1tvcHRpb25OYW1lXSBhcyBhbnkpID0gbmV3VmFsdWVcblxuICAgICAgZm9yIChjb25zdCBhY3Rpb24gaW4gdGhpcy5fYWN0aW9ucy5tYXApIHtcbiAgICAgICAgKHRoaXMub3B0aW9uc1thY3Rpb25dW29wdGlvbk5hbWVdIGFzIGFueSkgPSBuZXdWYWx1ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbb3B0aW9uTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWdpbiBvZiB0aGUgSW50ZXJhY3RhYmxlJ3MgZWxlbWVudC4gIFRoZSB4IGFuZCB5XG4gICAqIG9mIHRoZSBvcmlnaW4gd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gYWN0aW9uIGV2ZW50IGNvb3JkaW5hdGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnQgfCBvYmplY3QgfCBzdHJpbmd9IFtvcmlnaW5dIEFuIEhUTUwgb3IgU1ZHIEVsZW1lbnQgd2hvc2VcbiAgICogcmVjdCB3aWxsIGJlIHVzZWQsIGFuIG9iamVjdCBlZy4geyB4OiAwLCB5OiAwIH0gb3Igc3RyaW5nICdwYXJlbnQnLCAnc2VsZidcbiAgICogb3IgYW55IENTUyBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBjdXJyZW50IG9yaWdpbiBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgb3JpZ2luIChuZXdWYWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tDb21wYXRPcHRpb24oJ29yaWdpbicsIG5ld1ZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB0aGUgbW91c2UgY29vcmRpbmF0ZSB0eXBlcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGVcbiAgICogbW92ZW1lbnQgb2YgdGhlIHBvaW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmV3VmFsdWVdIFVzZSAnY2xpZW50JyBpZiB5b3Ugd2lsbCBiZSBzY3JvbGxpbmcgd2hpbGVcbiAgICogaW50ZXJhY3Rpbmc7IFVzZSAncGFnZScgaWYgeW91IHdhbnQgYXV0b1Njcm9sbCB0byB3b3JrXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IG9iamVjdH0gVGhlIGN1cnJlbnQgZGVsdGFTb3VyY2Ugb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIGRlbHRhU291cmNlIChuZXdWYWx1ZT86IHN0cmluZykge1xuICAgIGlmIChuZXdWYWx1ZSA9PT0gJ3BhZ2UnIHx8IG5ld1ZhbHVlID09PSAnY2xpZW50Jykge1xuICAgICAgdGhpcy5vcHRpb25zLmRlbHRhU291cmNlID0gbmV3VmFsdWVcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRlbHRhU291cmNlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2VsZWN0b3IgY29udGV4dCBOb2RlIG9mIHRoZSBJbnRlcmFjdGFibGUuIFRoZSBkZWZhdWx0IGlzXG4gICAqIGB3aW5kb3cuZG9jdW1lbnRgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtOb2RlfSBUaGUgY29udGV4dCBOb2RlIG9mIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBjb250ZXh0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dFxuICB9XG5cbiAgaW5Db250ZXh0IChlbGVtZW50OiBEb2N1bWVudCB8IE5vZGUpIHtcbiAgICByZXR1cm4gKHRoaXMuX2NvbnRleHQgPT09IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fFxuICAgICAgICAgICAgbm9kZUNvbnRhaW5zKHRoaXMuX2NvbnRleHQsIGVsZW1lbnQpKVxuICB9XG5cbiAgdGVzdElnbm9yZUFsbG93IChcbiAgICB0aGlzOiBJbnRlcmFjdGFibGUsXG4gICAgb3B0aW9uczogeyBpZ25vcmVGcm9tPzogSWdub3JlVmFsdWUsIGFsbG93RnJvbT86IElnbm9yZVZhbHVlIH0sXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsXG4gICkge1xuICAgIHJldHVybiAoIXRoaXMudGVzdElnbm9yZShvcHRpb25zLmlnbm9yZUZyb20sIHRhcmdldE5vZGUsIGV2ZW50VGFyZ2V0KSAmJlxuICAgICAgICAgICAgdGhpcy50ZXN0QWxsb3cob3B0aW9ucy5hbGxvd0Zyb20sIHRhcmdldE5vZGUsIGV2ZW50VGFyZ2V0KSlcbiAgfVxuXG4gIHRlc3RBbGxvdyAoXG4gICAgdGhpczogSW50ZXJhY3RhYmxlLFxuICAgIGFsbG93RnJvbTogSWdub3JlVmFsdWUsXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgKSB7XG4gICAgaWYgKCFhbGxvd0Zyb20pIHsgcmV0dXJuIHRydWUgfVxuXG4gICAgaWYgKCFpcy5lbGVtZW50KGVsZW1lbnQpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoaXMuc3RyaW5nKGFsbG93RnJvbSkpIHtcbiAgICAgIHJldHVybiBtYXRjaGVzVXBUbyhlbGVtZW50LCBhbGxvd0Zyb20sIHRhcmdldE5vZGUpXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLmVsZW1lbnQoYWxsb3dGcm9tKSkge1xuICAgICAgcmV0dXJuIG5vZGVDb250YWlucyhhbGxvd0Zyb20sIGVsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB0ZXN0SWdub3JlIChcbiAgICB0aGlzOiBJbnRlcmFjdGFibGUsXG4gICAgaWdub3JlRnJvbTogSWdub3JlVmFsdWUsXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgKSB7XG4gICAgaWYgKCFpZ25vcmVGcm9tIHx8ICFpcy5lbGVtZW50KGVsZW1lbnQpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoaXMuc3RyaW5nKGlnbm9yZUZyb20pKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlc1VwVG8oZWxlbWVudCwgaWdub3JlRnJvbSwgdGFyZ2V0Tm9kZSlcbiAgICB9XG4gICAgZWxzZSBpZiAoaXMuZWxlbWVudChpZ25vcmVGcm9tKSkge1xuICAgICAgcmV0dXJuIG5vZGVDb250YWlucyhpZ25vcmVGcm9tLCBlbGVtZW50KVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIEludGVyYWN0RXZlbnQgdHlwZSBib3VuZCBnbG9iYWxseVxuICAgKiBhbmQgZGlyZWN0bHkgdG8gdGhpcyBJbnRlcmFjdGFibGVcbiAgICpcbiAgICogQHBhcmFtIHtJbnRlcmFjdEV2ZW50fSBpRXZlbnQgVGhlIEludGVyYWN0RXZlbnQgb2JqZWN0IHRvIGJlIGZpcmVkIG9uIHRoaXNcbiAgICogSW50ZXJhY3RhYmxlXG4gICAqIEByZXR1cm4ge0ludGVyYWN0YWJsZX0gdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIGZpcmUgKGlFdmVudDogb2JqZWN0KSB7XG4gICAgdGhpcy5ldmVudHMuZmlyZShpRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX29uT2ZmIChtZXRob2Q6ICdvbicgfCAnb2ZmJywgdHlwZUFyZzogSW50ZXJhY3QuRXZlbnRUeXBlcywgbGlzdGVuZXJBcmc/OiBJbnRlcmFjdC5MaXN0ZW5lcnNBcmcgfCBudWxsLCBvcHRpb25zPzogYW55KSB7XG4gICAgaWYgKGlzLm9iamVjdCh0eXBlQXJnKSAmJiAhaXMuYXJyYXkodHlwZUFyZykpIHtcbiAgICAgIG9wdGlvbnMgPSBsaXN0ZW5lckFyZ1xuICAgICAgbGlzdGVuZXJBcmcgPSBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgYWRkUmVtb3ZlID0gbWV0aG9kID09PSAnb24nID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5vcm1hbGl6ZUxpc3RlbmVycyh0eXBlQXJnLCBsaXN0ZW5lckFyZylcblxuICAgIGZvciAobGV0IHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ3doZWVsJykgeyB0eXBlID0gYnJvd3Nlci53aGVlbEV2ZW50IH1cblxuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgLy8gaWYgaXQgaXMgYW4gYWN0aW9uIGV2ZW50IHR5cGVcbiAgICAgICAgaWYgKGlzTm9uTmF0aXZlRXZlbnQodHlwZSwgdGhpcy5fYWN0aW9ucykpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50c1ttZXRob2RdKHR5cGUsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICAgIC8vIGRlbGVnYXRlZCBldmVudFxuICAgICAgICBlbHNlIGlmIChpcy5zdHJpbmcodGhpcy50YXJnZXQpKSB7XG4gICAgICAgICAgZXZlbnRzW2Ake2FkZFJlbW92ZX1EZWxlZ2F0ZWAgYXMgJ2FkZERlbGVnYXRlJyB8ICdyZW1vdmVEZWxlZ2F0ZSddKHRoaXMudGFyZ2V0LCB0aGlzLl9jb250ZXh0LCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgbGlzdGVuZXIgZnJvbSB0aGlzIEludGVyYWN0YWJsZSdzIGVsZW1lbnRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgKGV2ZW50c1thZGRSZW1vdmVdIGFzIHR5cGVvZiBldmVudHMucmVtb3ZlKSh0aGlzLnRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgbGlzdGVuZXIgZm9yIGFuIEludGVyYWN0RXZlbnQsIHBvaW50ZXJFdmVudCBvciBET00gZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGVzIFRoZSB0eXBlcyBvZiBldmVudHMgdG8gbGlzdGVuXG4gICAqIGZvclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgYXJyYXkgfCBvYmplY3R9IFtsaXN0ZW5lcl0gVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uKHMpXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAgICogYWRkRXZlbnRMaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBvbiAodHlwZXM6IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyPzogSW50ZXJhY3QuTGlzdGVuZXJzQXJnLCBvcHRpb25zPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uT2ZmKCdvbicsIHR5cGVzLCBsaXN0ZW5lciwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIEludGVyYWN0RXZlbnQsIHBvaW50ZXJFdmVudCBvciBET00gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGVzIFRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCB3ZXJlXG4gICAqIGxpc3RlbmVkIGZvclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgYXJyYXkgfCBvYmplY3R9IFtsaXN0ZW5lcl0gVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uKHMpXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAgICogcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBvZmYgKHR5cGVzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyPzogSW50ZXJhY3QuTGlzdGVuZXJzQXJnLCBvcHRpb25zPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uT2ZmKCdvZmYnLCB0eXBlcywgbGlzdGVuZXIsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIG9wdGlvbnMgb2YgdGhpcyBJbnRlcmFjdGFibGVcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG5ldyBzZXR0aW5ncyB0byBhcHBseVxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBzZXQgKG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnNBcmcpIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuX2RlZmF1bHRzXG5cbiAgICBpZiAoIWlzLm9iamVjdChvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgKHRoaXMub3B0aW9ucyBhcyBSZXF1aXJlZDxPcHRpb25zPikgPSBjbG9uZShkZWZhdWx0cy5iYXNlKSBhcyBSZXF1aXJlZDxPcHRpb25zPlxuXG4gICAgZm9yIChjb25zdCBhY3Rpb25OYW1lXyBpbiB0aGlzLl9hY3Rpb25zLm1ldGhvZERpY3QpIHtcbiAgICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBhY3Rpb25OYW1lXyBhcyBJbnRlcmFjdC5BY3Rpb25OYW1lXG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gdGhpcy5fYWN0aW9ucy5tZXRob2REaWN0W2FjdGlvbk5hbWVdXG5cbiAgICAgIHRoaXMub3B0aW9uc1thY3Rpb25OYW1lXSA9IHt9XG4gICAgICB0aGlzLnNldFBlckFjdGlvbihhY3Rpb25OYW1lLCBleHRlbmQoZXh0ZW5kKHt9LCBkZWZhdWx0cy5wZXJBY3Rpb24pLCBkZWZhdWx0cy5hY3Rpb25zW2FjdGlvbk5hbWVdKSlcblxuICAgICAgdGhpc1ttZXRob2ROYW1lXShvcHRpb25zW2FjdGlvbk5hbWVdKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoaXMuZnVuYyh0aGlzW3NldHRpbmddKSkge1xuICAgICAgICB0aGlzW3NldHRpbmddKG9wdGlvbnNbc2V0dGluZ10pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyBpbnRlcmFjdGFibGUgZnJvbSB0aGUgbGlzdCBvZiBpbnRlcmFjdGFibGVzIGFuZCByZW1vdmUgaXQnc1xuICAgKiBhY3Rpb24gY2FwYWJpbGl0aWVzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICpcbiAgICogQHJldHVybiB7aW50ZXJhY3R9XG4gICAqL1xuICB1bnNldCAoKSB7XG4gICAgZXZlbnRzLnJlbW92ZSh0aGlzLnRhcmdldCBhcyBOb2RlLCAnYWxsJylcblxuICAgIGlmIChpcy5zdHJpbmcodGhpcy50YXJnZXQpKSB7XG4gICAgICAvLyByZW1vdmUgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgZm9yIChjb25zdCB0eXBlIGluIGV2ZW50cy5kZWxlZ2F0ZWRFdmVudHMpIHtcbiAgICAgICAgY29uc3QgZGVsZWdhdGVkID0gZXZlbnRzLmRlbGVnYXRlZEV2ZW50c1t0eXBlXVxuXG4gICAgICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzWzBdID09PSB0aGlzLnRhcmdldCAmJlxuICAgICAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzWzBdID09PSB0aGlzLl9jb250ZXh0KSB7XG4gICAgICAgICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5zcGxpY2UoMCwgMSlcbiAgICAgICAgICBkZWxlZ2F0ZWQuY29udGV4dHMuc3BsaWNlKDAsIDEpXG4gICAgICAgICAgZGVsZWdhdGVkLmxpc3RlbmVycy5zcGxpY2UoMCwgMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50cy5yZW1vdmUodGhpcy5fY29udGV4dCwgdHlwZSwgZXZlbnRzLmRlbGVnYXRlTGlzdGVuZXIpXG4gICAgICAgIGV2ZW50cy5yZW1vdmUodGhpcy5fY29udGV4dCwgdHlwZSwgZXZlbnRzLmRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBldmVudHMucmVtb3ZlKHRoaXMudGFyZ2V0IGFzIE5vZGUsICdhbGwnKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcmFjdGFibGVcbiIsImltcG9ydCBkb21PYmplY3RzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbU9iamVjdHMnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRPcHRpb25zJ1xuaW1wb3J0IEV2ZW50YWJsZSBmcm9tICcuL0V2ZW50YWJsZSdcbmltcG9ydCBJbnRlcmFjdGFibGVCYXNlIGZyb20gJy4vSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IEludGVyYWN0YWJsZVNldCBmcm9tICcuL0ludGVyYWN0YWJsZVNldCdcbmltcG9ydCBJbnRlcmFjdEV2ZW50LCB7IFBoYXNlTWFwIH0gZnJvbSAnLi9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0IGludGVyYWN0aW9ucyBmcm9tICcuL2ludGVyYWN0aW9ucydcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBcmdzIHtcbiAgJ3Njb3BlOmFkZC1kb2N1bWVudCc6IERvY1NpZ25hbEFyZ1xuICAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JzogRG9jU2lnbmFsQXJnXG4gICdpbnRlcmFjdGFibGU6dW5zZXQnOiB7IGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlQmFzZSB9XG4gICdpbnRlcmFjdGFibGU6c2V0JzogeyBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZUJhc2UsIG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnMgfVxuICAnaW50ZXJhY3Rpb25zOmRlc3Ryb3knOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9XG59XG5cbmV4cG9ydCB0eXBlIExpc3RlbmVyTmFtZSA9IGtleW9mIFNpZ25hbEFyZ3NcblxuZXhwb3J0IHR5cGUgTGlzdGVuZXJNYXAgPSB7XG4gIFtQIGluIExpc3RlbmVyTmFtZV0/OiAoYXJnOiBTaWduYWxBcmdzW1BdLCBzY29wZTogU2NvcGUsIHNpZ25hbE5hbWU6IFApID0+IHZvaWQgfCBib29sZWFuXG59XG5cbmludGVyZmFjZSBEb2NTaWduYWxBcmcge1xuICBkb2M6IERvY3VtZW50XG4gIHdpbmRvdzogV2luZG93XG4gIHNjb3BlOiBTY29wZVxuICBvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9XG59XG5cbmNvbnN0IHtcbiAgd2luLFxuICBicm93c2VyLFxuICByYWYsXG4gIGV2ZW50cyxcbn0gPSB1dGlsc1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25NYXAgeyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lIG5vLWVtcHR5LWludGVyZmFjZVxufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25OYW1lID0ga2V5b2YgQWN0aW9uTWFwXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9ucyB7XG4gIG1hcDogQWN0aW9uTWFwXG4gIHBoYXNlczogUGhhc2VNYXBcbiAgbWV0aG9kRGljdDogeyBbUCBpbiBBY3Rpb25OYW1lXT86IHN0cmluZyB9XG4gIHBoYXNlbGVzc1R5cGVzOiB7IFt0eXBlOiBzdHJpbmddOiB0cnVlIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjb3BlICgpIHtcbiAgcmV0dXJuIG5ldyBTY29wZSgpXG59XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRzID0gdHlwZW9mIGRlZmF1bHRzXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIGlkPzogc3RyaW5nXG4gIGxpc3RlbmVycz86IExpc3RlbmVyTWFwXG4gIGJlZm9yZT86IHN0cmluZ1tdXG4gIGluc3RhbGw/IChzY29wZTogU2NvcGUsIG9wdGlvbnM/OiBhbnkpOiB2b2lkXG59XG5cbmV4cG9ydCBjbGFzcyBTY29wZSB7XG4gIGlkID0gYF9faW50ZXJhY3Rfc2NvcGVfJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDApfWBcbiAgaXNJbml0aWFsaXplZCA9IGZhbHNlXG4gIGxpc3RlbmVyTWFwczogQXJyYXk8e1xuICAgIG1hcDogTGlzdGVuZXJNYXBcbiAgICBpZDogc3RyaW5nXG4gIH0+ID0gW11cblxuICBicm93c2VyID0gYnJvd3NlclxuICBldmVudHMgPSBldmVudHNcbiAgdXRpbHMgPSB1dGlsc1xuICBkZWZhdWx0czogRGVmYXVsdHMgPSB1dGlscy5jbG9uZShkZWZhdWx0cykgYXMgRGVmYXVsdHNcbiAgRXZlbnRhYmxlID0gRXZlbnRhYmxlXG4gIGFjdGlvbnM6IEFjdGlvbnMgPSB7XG4gICAgbWFwOiB7fSxcbiAgICBwaGFzZXM6IHtcbiAgICAgIHN0YXJ0OiB0cnVlLFxuICAgICAgbW92ZTogdHJ1ZSxcbiAgICAgIGVuZDogdHJ1ZSxcbiAgICB9LFxuICAgIG1ldGhvZERpY3Q6IHt9LFxuICAgIHBoYXNlbGVzc1R5cGVzOiB7fSxcbiAgfVxuXG4gIEludGVyYWN0RXZlbnQgPSBJbnRlcmFjdEV2ZW50XG4gIEludGVyYWN0YWJsZSE6IHR5cGVvZiBJbnRlcmFjdGFibGVCYXNlXG4gIGludGVyYWN0YWJsZXMgPSBuZXcgSW50ZXJhY3RhYmxlU2V0KHRoaXMpXG5cbiAgLy8gbWFpbiB3aW5kb3dcbiAgX3dpbiE6IFdpbmRvd1xuXG4gIC8vIG1haW4gZG9jdW1lbnRcbiAgZG9jdW1lbnQhOiBEb2N1bWVudFxuXG4gIC8vIG1haW4gd2luZG93XG4gIHdpbmRvdyE6IFdpbmRvd1xuXG4gIC8vIGFsbCBkb2N1bWVudHMgYmVpbmcgbGlzdGVuZWQgdG9cbiAgZG9jdW1lbnRzOiBBcnJheTx7IGRvYzogRG9jdW1lbnQsIG9wdGlvbnM6IGFueSB9PiA9IFtdXG5cbiAgX3BsdWdpbnM6IHtcbiAgICBsaXN0OiBQbHVnaW5bXVxuICAgIG1hcDogeyBbaWQ6IHN0cmluZ106IFBsdWdpbiB9XG4gIH0gPSB7XG4gICAgbGlzdDogW10sXG4gICAgbWFwOiB7fSxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXNcblxuICAgIHRoaXMuSW50ZXJhY3RhYmxlID0gY2xhc3MgZXh0ZW5kcyBJbnRlcmFjdGFibGVCYXNlIHtcbiAgICAgIGdldCBfZGVmYXVsdHMgKCkgeyByZXR1cm4gc2NvcGUuZGVmYXVsdHMgfVxuXG4gICAgICBzZXQgKG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIuc2V0KG9wdGlvbnMpXG5cbiAgICAgICAgc2NvcGUuZmlyZSgnaW50ZXJhY3RhYmxlOnNldCcsIHtcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGludGVyYWN0YWJsZTogdGhpcyxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfVxuXG4gICAgICB1bnNldCAoKSB7XG4gICAgICAgIHN1cGVyLnVuc2V0KClcbiAgICAgICAgc2NvcGUuaW50ZXJhY3RhYmxlcy5saXN0LnNwbGljZShzY29wZS5pbnRlcmFjdGFibGVzLmxpc3QuaW5kZXhPZih0aGlzKSwgMSlcblxuICAgICAgICBzY29wZS5maXJlKCdpbnRlcmFjdGFibGU6dW5zZXQnLCB7IGludGVyYWN0YWJsZTogdGhpcyB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZExpc3RlbmVycyAobWFwOiBMaXN0ZW5lck1hcCwgaWQ/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxpc3RlbmVyTWFwcy5wdXNoKHsgaWQsIG1hcCB9KVxuICB9XG5cbiAgZmlyZTxUIGV4dGVuZHMgTGlzdGVuZXJOYW1lPiAobmFtZTogVCwgYXJnOiBTaWduYWxBcmdzW1RdKTogdm9pZCB8IGZhbHNlIHtcbiAgICBmb3IgKGNvbnN0IHsgbWFwOiB7IFtuYW1lXTogbGlzdGVuZXIgfSB9IG9mIHRoaXMubGlzdGVuZXJNYXBzKSB7XG4gICAgICBpZiAoISFsaXN0ZW5lciAmJiBsaXN0ZW5lcihhcmcgYXMgYW55LCB0aGlzLCBuYW1lIGFzIG5ldmVyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25XaW5kb3dVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB0aGlzLnJlbW92ZURvY3VtZW50KGV2ZW50LnRhcmdldCBhcyBEb2N1bWVudClcblxuICBpbml0ICh3aW5kb3c6IFdpbmRvdykge1xuICAgIHJldHVybiB0aGlzLmlzSW5pdGlhbGl6ZWRcbiAgICAgID8gdGhpc1xuICAgICAgOiBpbml0U2NvcGUodGhpcywgd2luZG93KVxuICB9XG5cbiAgcGx1Z2luSXNJbnN0YWxsZWQgKHBsdWdpbjogUGx1Z2luKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsdWdpbnMubWFwW3BsdWdpbi5pZF0gfHwgdGhpcy5fcGx1Z2lucy5saXN0LmluZGV4T2YocGx1Z2luKSAhPT0gLTFcbiAgfVxuXG4gIHVzZVBsdWdpbiAocGx1Z2luOiBQbHVnaW4sIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gICAgaWYgKHRoaXMucGx1Z2luSXNJbnN0YWxsZWQocGx1Z2luKSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmlkKSB7IHRoaXMuX3BsdWdpbnMubWFwW3BsdWdpbi5pZF0gPSBwbHVnaW4gfVxuICAgIHRoaXMuX3BsdWdpbnMubGlzdC5wdXNoKHBsdWdpbilcblxuICAgIGlmIChwbHVnaW4uaW5zdGFsbCkge1xuICAgICAgcGx1Z2luLmluc3RhbGwodGhpcywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmxpc3RlbmVycyAmJiBwbHVnaW4uYmVmb3JlKSB7XG4gICAgICBsZXQgaW5kZXggPSAwXG4gICAgICBjb25zdCBsZW4gPSB0aGlzLmxpc3RlbmVyTWFwcy5sZW5ndGhcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHBsdWdpbi5iZWZvcmUucmVkdWNlKChhY2MsIGlkKSA9PiB7XG4gICAgICAgIGFjY1tpZF0gPSB0cnVlXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIHt9KVxuXG4gICAgICBmb3IgKDsgaW5kZXggPCBsZW47IGluZGV4KyspIHtcbiAgICAgICAgY29uc3Qgb3RoZXJJZCA9IHRoaXMubGlzdGVuZXJNYXBzW2luZGV4XS5pZFxuXG4gICAgICAgIGlmIChiZWZvcmVbb3RoZXJJZF0pIHsgYnJlYWsgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmxpc3RlbmVyTWFwcy5zcGxpY2UoaW5kZXgsIDAsIHsgaWQ6IHBsdWdpbi5pZCwgbWFwOiBwbHVnaW4ubGlzdGVuZXJzIH0pXG4gICAgfVxuICAgIGVsc2UgaWYgKHBsdWdpbi5saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJNYXBzLnB1c2goeyBpZDogcGx1Z2luLmlkLCBtYXA6IHBsdWdpbi5saXN0ZW5lcnMgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgYWRkRG9jdW1lbnQgKGRvYzogRG9jdW1lbnQsIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHwgZmFsc2Uge1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgZG9jdW1lbnQgaXMgYWxyZWFkeSBrbm93blxuICAgIGlmICh0aGlzLmdldERvY0luZGV4KGRvYykgIT09IC0xKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBjb25zdCB3aW5kb3cgPSB3aW4uZ2V0V2luZG93KGRvYylcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zID8gdXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IHt9XG5cbiAgICB0aGlzLmRvY3VtZW50cy5wdXNoKHsgZG9jLCBvcHRpb25zIH0pXG4gICAgZXZlbnRzLmRvY3VtZW50cy5wdXNoKGRvYylcblxuICAgIC8vIGRvbid0IGFkZCBhbiB1bmxvYWQgZXZlbnQgZm9yIHRoZSBtYWluIGRvY3VtZW50XG4gICAgLy8gc28gdGhhdCB0aGUgcGFnZSBtYXkgYmUgY2FjaGVkIGluIGJyb3dzZXIgaGlzdG9yeVxuICAgIGlmIChkb2MgIT09IHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgIGV2ZW50cy5hZGQod2luZG93LCAndW5sb2FkJywgdGhpcy5vbldpbmRvd1VubG9hZClcbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoJ3Njb3BlOmFkZC1kb2N1bWVudCcsIHsgZG9jLCB3aW5kb3csIHNjb3BlOiB0aGlzLCBvcHRpb25zIH0pXG4gIH1cblxuICByZW1vdmVEb2N1bWVudCAoZG9jOiBEb2N1bWVudCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXREb2NJbmRleChkb2MpXG5cbiAgICBjb25zdCB3aW5kb3cgPSB3aW4uZ2V0V2luZG93KGRvYylcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kb2N1bWVudHNbaW5kZXhdLm9wdGlvbnNcblxuICAgIGV2ZW50cy5yZW1vdmUod2luZG93LCAndW5sb2FkJywgdGhpcy5vbldpbmRvd1VubG9hZClcblxuICAgIHRoaXMuZG9jdW1lbnRzLnNwbGljZShpbmRleCwgMSlcbiAgICBldmVudHMuZG9jdW1lbnRzLnNwbGljZShpbmRleCwgMSlcblxuICAgIHRoaXMuZmlyZSgnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JywgeyBkb2MsIHdpbmRvdywgc2NvcGU6IHRoaXMsIG9wdGlvbnMgfSlcbiAgfVxuXG4gIGdldERvY0luZGV4IChkb2M6IERvY3VtZW50KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRvY3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZG9jdW1lbnRzW2ldLmRvYyA9PT0gZG9jKSB7XG4gICAgICAgIHJldHVybiBpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICBnZXREb2NPcHRpb25zIChkb2M6IERvY3VtZW50KSB7XG4gICAgY29uc3QgZG9jSW5kZXggPSB0aGlzLmdldERvY0luZGV4KGRvYylcblxuICAgIHJldHVybiBkb2NJbmRleCA9PT0gLTEgPyBudWxsIDogdGhpcy5kb2N1bWVudHNbZG9jSW5kZXhdLm9wdGlvbnNcbiAgfVxuXG4gIG5vdyAoKSB7XG4gICAgcmV0dXJuICgodGhpcy53aW5kb3cgYXMgYW55KS5EYXRlIGFzIHR5cGVvZiBEYXRlIHx8IERhdGUpLm5vdygpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uTmF0aXZlRXZlbnQgKHR5cGU6IHN0cmluZywgYWN0aW9uczogQWN0aW9ucykge1xuICBpZiAoYWN0aW9ucy5waGFzZWxlc3NUeXBlc1t0eXBlXSkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgZm9yIChjb25zdCBuYW1lIGluIGFjdGlvbnMubWFwKSB7XG4gICAgaWYgKHR5cGUuaW5kZXhPZihuYW1lKSA9PT0gMCAmJiB0eXBlLnN1YnN0cihuYW1lLmxlbmd0aCkgaW4gYWN0aW9ucy5waGFzZXMpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2NvcGUgKHNjb3BlOiBTY29wZSwgd2luZG93OiBXaW5kb3cpIHtcbiAgc2NvcGUuaXNJbml0aWFsaXplZCA9IHRydWVcbiAgd2luLmluaXQod2luZG93KVxuICBkb21PYmplY3RzLmluaXQod2luZG93KVxuICBicm93c2VyLmluaXQod2luZG93KVxuICByYWYuaW5pdCh3aW5kb3cpXG4gIGV2ZW50cy5pbml0KHdpbmRvdylcblxuICBzY29wZS51c2VQbHVnaW4oaW50ZXJhY3Rpb25zKVxuICBzY29wZS5kb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudFxuICBzY29wZS53aW5kb3cgPSB3aW5kb3dcblxuICByZXR1cm4gc2NvcGVcbn1cbiIsImltcG9ydCBicm93c2VyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2Jyb3dzZXInXG5pbXBvcnQgZG9tT2JqZWN0cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21PYmplY3RzJ1xuaW1wb3J0IHsgbm9kZUNvbnRhaW5zIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZG9tVXRpbHMnXG5pbXBvcnQgZXZlbnRzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V2ZW50cydcbmltcG9ydCAqIGFzIHBvaW50ZXJVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9wb2ludGVyVXRpbHMnXG5pbXBvcnQgSW50ZXJhY3Rpb25CYXNlIGZyb20gJy4vSW50ZXJhY3Rpb24nXG5pbXBvcnQgZmluZGVyLCB7IFNlYXJjaERldGFpbHMgfSBmcm9tICcuL2ludGVyYWN0aW9uRmluZGVyJ1xuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICcuL3Njb3BlJ1xuaW1wb3J0IGludGVyYWN0YWJsZVByZXZlbnREZWZhdWx0IGZyb20gJy4vaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgSW50ZXJhY3Rpb246IHR5cGVvZiBJbnRlcmFjdGlvbkJhc2VcbiAgICBpbnRlcmFjdGlvbnM6IHtcbiAgICAgIG5ldzogPFQgZXh0ZW5kcyBBY3Rpb25OYW1lPiAob3B0aW9uczogYW55KSA9PiBJbnRlcmFjdGlvbkJhc2U8VD5cbiAgICAgIGxpc3Q6IEludGVyYWN0aW9uQmFzZVtdXG4gICAgICBsaXN0ZW5lcnM6IHsgW3R5cGU6IHN0cmluZ106IEludGVyYWN0Lkxpc3RlbmVyIH1cbiAgICAgIGRvY0V2ZW50czogQXJyYXk8eyB0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBJbnRlcmFjdC5MaXN0ZW5lciB9PlxuICAgICAgcG9pbnRlck1vdmVUb2xlcmFuY2U6IG51bWJlclxuICAgIH1cbiAgICBwcmV2VG91Y2hUaW1lOiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2ludGVyYWN0aW9uczpmaW5kJzoge1xuICAgICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uQmFzZVxuICAgICAgc2VhcmNoRGV0YWlsczogU2VhcmNoRGV0YWlsc1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXRob2ROYW1lcyA9IFtcbiAgJ3BvaW50ZXJEb3duJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJVcCcsXG4gICd1cGRhdGVQb2ludGVyJywgJ3JlbW92ZVBvaW50ZXInLCAnd2luZG93Qmx1cicsXG5dXG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCBsaXN0ZW5lcnMgPSB7fSBhcyBhbnlcblxuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2ROYW1lcykge1xuICAgIGxpc3RlbmVyc1ttZXRob2RdID0gZG9PbkludGVyYWN0aW9ucyhtZXRob2QsIHNjb3BlKVxuICB9XG5cbiAgY29uc3QgcEV2ZW50VHlwZXMgPSBicm93c2VyLnBFdmVudFR5cGVzXG4gIGxldCBkb2NFdmVudHM6IHR5cGVvZiBzY29wZS5pbnRlcmFjdGlvbnMuZG9jRXZlbnRzXG5cbiAgaWYgKGRvbU9iamVjdHMuUG9pbnRlckV2ZW50KSB7XG4gICAgZG9jRXZlbnRzID0gW1xuICAgICAgeyB0eXBlOiBwRXZlbnRUeXBlcy5kb3duLCAgIGxpc3RlbmVyOiByZWxlYXNlUG9pbnRlcnNPblJlbW92ZWRFbHMgfSxcbiAgICAgIHsgdHlwZTogcEV2ZW50VHlwZXMuZG93biwgICBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJEb3duIH0sXG4gICAgICB7IHR5cGU6IHBFdmVudFR5cGVzLm1vdmUsICAgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiBwRXZlbnRUeXBlcy51cCwgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcnMucG9pbnRlclVwIH0sXG4gICAgICB7IHR5cGU6IHBFdmVudFR5cGVzLmNhbmNlbCwgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyVXAgfSxcbiAgICBdXG4gIH1cbiAgZWxzZSB7XG4gICAgZG9jRXZlbnRzID0gW1xuICAgICAgeyB0eXBlOiAnbW91c2Vkb3duJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyRG93biB9LFxuICAgICAgeyB0eXBlOiAnbW91c2Vtb3ZlJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiAnbW91c2V1cCcsIGxpc3RlbmVyOiBsaXN0ZW5lcnMucG9pbnRlclVwIH0sXG5cbiAgICAgIHsgdHlwZTogJ3RvdWNoc3RhcnQnLCBsaXN0ZW5lcjogcmVsZWFzZVBvaW50ZXJzT25SZW1vdmVkRWxzIH0sXG4gICAgICB7IHR5cGU6ICd0b3VjaHN0YXJ0JywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyRG93biB9LFxuICAgICAgeyB0eXBlOiAndG91Y2htb3ZlJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiAndG91Y2hlbmQnLCBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJVcCB9LFxuICAgICAgeyB0eXBlOiAndG91Y2hjYW5jZWwnLCBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJVcCB9LFxuICAgIF1cbiAgfVxuXG4gIGRvY0V2ZW50cy5wdXNoKHtcbiAgICB0eXBlOiAnYmx1cicsXG4gICAgbGlzdGVuZXIgKGV2ZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICAgIGludGVyYWN0aW9uLmRvY3VtZW50Qmx1cihldmVudClcbiAgICAgIH1cbiAgICB9LFxuICB9KVxuXG4gIC8vIGZvciBpZ25vcmluZyBicm93c2VyJ3Mgc2ltdWxhdGVkIG1vdXNlIGV2ZW50c1xuICBzY29wZS5wcmV2VG91Y2hUaW1lID0gMFxuXG4gIHNjb3BlLkludGVyYWN0aW9uID0gY2xhc3MgPFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiBleHRlbmRzIEludGVyYWN0aW9uQmFzZTxUPiB7XG4gICAgZ2V0IHBvaW50ZXJNb3ZlVG9sZXJhbmNlICgpIHtcbiAgICAgIHJldHVybiBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2VcbiAgICB9XG5cbiAgICBzZXQgcG9pbnRlck1vdmVUb2xlcmFuY2UgKHZhbHVlKSB7XG4gICAgICBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2UgPSB2YWx1ZVxuICAgIH1cblxuICAgIF9ub3cgKCkgeyByZXR1cm4gc2NvcGUubm93KCkgfVxuICB9XG5cbiAgc2NvcGUuaW50ZXJhY3Rpb25zID0ge1xuICAgIC8vIGFsbCBhY3RpdmUgYW5kIGlkbGUgaW50ZXJhY3Rpb25zXG4gICAgbGlzdDogW10sXG4gICAgbmV3PFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiAob3B0aW9uczogeyBwb2ludGVyVHlwZT86IHN0cmluZywgc2NvcGVGaXJlPzogU2NvcGVbJ2ZpcmUnXSB9KSB7XG4gICAgICBvcHRpb25zLnNjb3BlRmlyZSA9IChuYW1lLCBhcmcpID0+IHNjb3BlLmZpcmUobmFtZSwgYXJnKVxuXG4gICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IG5ldyBzY29wZS5JbnRlcmFjdGlvbjxUPihvcHRpb25zIGFzIFJlcXVpcmVkPHR5cGVvZiBvcHRpb25zPilcblxuICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QucHVzaChpbnRlcmFjdGlvbilcbiAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgIH0sXG4gICAgbGlzdGVuZXJzLFxuICAgIGRvY0V2ZW50cyxcbiAgICBwb2ludGVyTW92ZVRvbGVyYW5jZTogMSxcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbGVhc2VQb2ludGVyc09uUmVtb3ZlZEVscyAoKSB7XG4gICAgLy8gZm9yIGFsbCBpbmFjdGl2ZSB0b3VjaCBpbnRlcmFjdGlvbnMgd2l0aCBwb2ludGVycyBkb3duXG4gICAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgICAgaWYgKCFpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duIHx8XG4gICAgICAgIGludGVyYWN0aW9uLnBvaW50ZXJUeXBlICE9PSAndG91Y2gnIHx8XG4gICAgICAgIGludGVyYWN0aW9uLl9pbnRlcmFjdGluZykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBhIHBvaW50ZXIgaXMgZG93biBvbiBhbiBlbGVtZW50IHRoYXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBET00gdHJlZVxuICAgICAgZm9yIChjb25zdCBwb2ludGVyIG9mIGludGVyYWN0aW9uLnBvaW50ZXJzKSB7XG4gICAgICAgIGlmICghc2NvcGUuZG9jdW1lbnRzLnNvbWUoKHsgZG9jIH0pID0+IG5vZGVDb250YWlucyhkb2MsIHBvaW50ZXIuZG93blRhcmdldCkpKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwb2ludGVyIGZyb20gdGhlIGludGVyYWN0aW9uXG4gICAgICAgICAgaW50ZXJhY3Rpb24ucmVtb3ZlUG9pbnRlcihwb2ludGVyLnBvaW50ZXIsIHBvaW50ZXIuZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzY29wZS51c2VQbHVnaW4oaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQpXG59XG5cbmZ1bmN0aW9uIGRvT25JbnRlcmFjdGlvbnMgKG1ldGhvZCwgc2NvcGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGludGVyYWN0aW9ucyA9IHNjb3BlLmludGVyYWN0aW9ucy5saXN0XG5cbiAgICBjb25zdCBwb2ludGVyVHlwZSA9IHBvaW50ZXJVdGlscy5nZXRQb2ludGVyVHlwZShldmVudClcbiAgICBjb25zdCBbZXZlbnRUYXJnZXQsIGN1ckV2ZW50VGFyZ2V0XSA9IHBvaW50ZXJVdGlscy5nZXRFdmVudFRhcmdldHMoZXZlbnQpXG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdIC8vIFsgW3BvaW50ZXIsIGludGVyYWN0aW9uXSwgLi4uXVxuXG4gICAgaWYgKC9edG91Y2gvLnRlc3QoZXZlbnQudHlwZSkpIHtcbiAgICAgIHNjb3BlLnByZXZUb3VjaFRpbWUgPSBzY29wZS5ub3coKVxuXG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRUb3VjaCBvZiBldmVudC5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgICBjb25zdCBwb2ludGVyID0gY2hhbmdlZFRvdWNoXG4gICAgICAgIGNvbnN0IHBvaW50ZXJJZCA9IHBvaW50ZXJVdGlscy5nZXRQb2ludGVySWQocG9pbnRlcilcbiAgICAgICAgY29uc3Qgc2VhcmNoRGV0YWlsczogU2VhcmNoRGV0YWlscyA9IHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHBvaW50ZXJJZCxcbiAgICAgICAgICBwb2ludGVyVHlwZSxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICAgICAgY3VyRXZlbnRUYXJnZXQsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb24gPSBnZXRJbnRlcmFjdGlvbihzZWFyY2hEZXRhaWxzKVxuXG4gICAgICAgIG1hdGNoZXMucHVzaChbXG4gICAgICAgICAgc2VhcmNoRGV0YWlscy5wb2ludGVyLFxuICAgICAgICAgIHNlYXJjaERldGFpbHMuZXZlbnRUYXJnZXQsXG4gICAgICAgICAgc2VhcmNoRGV0YWlscy5jdXJFdmVudFRhcmdldCxcbiAgICAgICAgICBpbnRlcmFjdGlvbixcbiAgICAgICAgXSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsZXQgaW52YWxpZFBvaW50ZXIgPSBmYWxzZVxuXG4gICAgICBpZiAoIWJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnQgJiYgL21vdXNlLy50ZXN0KGV2ZW50LnR5cGUpKSB7XG4gICAgICAgIC8vIGlnbm9yZSBtb3VzZSBldmVudHMgd2hpbGUgdG91Y2ggaW50ZXJhY3Rpb25zIGFyZSBhY3RpdmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcmFjdGlvbnMubGVuZ3RoICYmICFpbnZhbGlkUG9pbnRlcjsgaSsrKSB7XG4gICAgICAgICAgaW52YWxpZFBvaW50ZXIgPSBpbnRlcmFjdGlvbnNbaV0ucG9pbnRlclR5cGUgIT09ICdtb3VzZScgJiYgaW50ZXJhY3Rpb25zW2ldLnBvaW50ZXJJc0Rvd25cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyeSB0byBpZ25vcmUgbW91c2UgZXZlbnRzIHRoYXQgYXJlIHNpbXVsYXRlZCBieSB0aGUgYnJvd3NlclxuICAgICAgICAvLyBhZnRlciBhIHRvdWNoIGV2ZW50XG4gICAgICAgIGludmFsaWRQb2ludGVyID0gaW52YWxpZFBvaW50ZXIgfHxcbiAgICAgICAgICAoc2NvcGUubm93KCkgLSBzY29wZS5wcmV2VG91Y2hUaW1lIDwgNTAwKSB8fFxuICAgICAgICAgIC8vIG9uIGlPUyBhbmQgRmlyZWZveCBNb2JpbGUsIE1vdXNlRXZlbnQudGltZVN0YW1wIGlzIHplcm8gaWYgc2ltdWxhdGVkXG4gICAgICAgICAgZXZlbnQudGltZVN0YW1wID09PSAwXG4gICAgICB9XG5cbiAgICAgIGlmICghaW52YWxpZFBvaW50ZXIpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRGV0YWlscyA9IHtcbiAgICAgICAgICBwb2ludGVyOiBldmVudCxcbiAgICAgICAgICBwb2ludGVySWQ6IHBvaW50ZXJVdGlscy5nZXRQb2ludGVySWQoZXZlbnQpLFxuICAgICAgICAgIHBvaW50ZXJUeXBlLFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQudHlwZSxcbiAgICAgICAgICBjdXJFdmVudFRhcmdldCxcbiAgICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZ2V0SW50ZXJhY3Rpb24oc2VhcmNoRGV0YWlscylcblxuICAgICAgICBtYXRjaGVzLnB1c2goW1xuICAgICAgICAgIHNlYXJjaERldGFpbHMucG9pbnRlcixcbiAgICAgICAgICBzZWFyY2hEZXRhaWxzLmV2ZW50VGFyZ2V0LFxuICAgICAgICAgIHNlYXJjaERldGFpbHMuY3VyRXZlbnRUYXJnZXQsXG4gICAgICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICAgIF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZvciAoY29uc3QgW3BvaW50ZXIsIGV2ZW50VGFyZ2V0LCBjdXJFdmVudFRhcmdldCwgaW50ZXJhY3Rpb25dIG9mIG1hdGNoZXMpIHtcbiAgICAgIGludGVyYWN0aW9uW21ldGhvZF0ocG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBjdXJFdmVudFRhcmdldClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJhY3Rpb24gKHNlYXJjaERldGFpbHM6IFNlYXJjaERldGFpbHMpIHtcbiAgY29uc3QgeyBwb2ludGVyVHlwZSwgc2NvcGUgfSA9IHNlYXJjaERldGFpbHNcblxuICBjb25zdCBmb3VuZEludGVyYWN0aW9uID0gZmluZGVyLnNlYXJjaChzZWFyY2hEZXRhaWxzKVxuICBjb25zdCBzaWduYWxBcmcgPSB7IGludGVyYWN0aW9uOiBmb3VuZEludGVyYWN0aW9uLCBzZWFyY2hEZXRhaWxzIH1cblxuICBzY29wZS5maXJlKCdpbnRlcmFjdGlvbnM6ZmluZCcsIHNpZ25hbEFyZylcblxuICByZXR1cm4gc2lnbmFsQXJnLmludGVyYWN0aW9uIHx8IHNjb3BlLmludGVyYWN0aW9ucy5uZXcoeyBwb2ludGVyVHlwZSB9KVxufVxuXG5mdW5jdGlvbiBvbkRvY1NpZ25hbDxUIGV4dGVuZHMgJ3Njb3BlOmFkZC1kb2N1bWVudCcgfCAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50Jz4gKHsgZG9jLCBzY29wZSwgb3B0aW9ucyB9OiBJbnRlcmFjdC5TaWduYWxBcmdzW1RdLCBldmVudE1ldGhvZE5hbWU6ICdhZGQnIHwgJ3JlbW92ZScpIHtcbiAgY29uc3QgeyBkb2NFdmVudHMgfSA9IHNjb3BlLmludGVyYWN0aW9uc1xuICBjb25zdCBldmVudE1ldGhvZCA9IGV2ZW50c1tldmVudE1ldGhvZE5hbWVdXG5cbiAgaWYgKHNjb3BlLmJyb3dzZXIuaXNJT1MgJiYgIW9wdGlvbnMuZXZlbnRzKSB7XG4gICAgb3B0aW9ucy5ldmVudHMgPSB7IHBhc3NpdmU6IGZhbHNlIH1cbiAgfVxuXG4gIC8vIGRlbGVnYXRlIGV2ZW50IGxpc3RlbmVyXG4gIGZvciAoY29uc3QgZXZlbnRUeXBlIGluIGV2ZW50cy5kZWxlZ2F0ZWRFdmVudHMpIHtcbiAgICBldmVudE1ldGhvZChkb2MsIGV2ZW50VHlwZSwgZXZlbnRzLmRlbGVnYXRlTGlzdGVuZXIpXG4gICAgZXZlbnRNZXRob2QoZG9jLCBldmVudFR5cGUsIGV2ZW50cy5kZWxlZ2F0ZVVzZUNhcHR1cmUsIHRydWUpXG4gIH1cblxuICBjb25zdCBldmVudE9wdGlvbnMgPSBvcHRpb25zICYmIG9wdGlvbnMuZXZlbnRzXG5cbiAgZm9yIChjb25zdCB7IHR5cGUsIGxpc3RlbmVyIH0gb2YgZG9jRXZlbnRzKSB7XG4gICAgZXZlbnRNZXRob2QoZG9jLCB0eXBlLCBsaXN0ZW5lciwgZXZlbnRPcHRpb25zKVxuICB9XG59XG5cbmNvbnN0IGludGVyYWN0aW9uczogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ2NvcmUvaW50ZXJhY3Rpb25zJyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ3Njb3BlOmFkZC1kb2N1bWVudCc6IGFyZyA9PiBvbkRvY1NpZ25hbChhcmcsICdhZGQnKSxcbiAgICAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JzogYXJnID0+IG9uRG9jU2lnbmFsKGFyZywgJ3JlbW92ZScpLFxuICAgICdpbnRlcmFjdGFibGU6dW5zZXQnOiAoeyBpbnRlcmFjdGFibGUgfSwgc2NvcGUpID0+IHtcbiAgICAgIC8vIFN0b3AgYW5kIGRlc3Ryb3kgcmVsYXRlZCBpbnRlcmFjdGlvbnMgd2hlbiBhbiBJbnRlcmFjdGFibGUgaXMgdW5zZXRcbiAgICAgIGZvciAobGV0IGkgPSBzY29wZS5pbnRlcmFjdGlvbnMubGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IHNjb3BlLmludGVyYWN0aW9ucy5saXN0W2ldXG5cbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSAhPT0gaW50ZXJhY3RhYmxlKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICBpbnRlcmFjdGlvbi5zdG9wKClcbiAgICAgICAgc2NvcGUuZmlyZSgnaW50ZXJhY3Rpb25zOmRlc3Ryb3knLCB7IGludGVyYWN0aW9uIH0pXG4gICAgICAgIGludGVyYWN0aW9uLmRlc3Ryb3koKVxuXG4gICAgICAgIGlmIChzY29wZS5pbnRlcmFjdGlvbnMubGlzdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3Quc3BsaWNlKGksIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBvbkRvY1NpZ25hbCxcbiAgZG9PbkludGVyYWN0aW9ucyxcbiAgbWV0aG9kTmFtZXMsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGludGVyYWN0aW9uc1xuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwZXMuZC50c1wiIC8+XG4iLCJleHBvcnQgZGVmYXVsdCAodGhpbmc6IGFueSkgPT4gISEodGhpbmcgJiYgdGhpbmcuV2luZG93KSAmJiAodGhpbmcgaW5zdGFuY2VvZiB0aGluZy5XaW5kb3cpXG4iLCJpbXBvcnQgaXNXaW5kb3cgZnJvbSAnLi9pc1dpbmRvdydcblxuY29uc3Qgd2luID0ge1xuICByZWFsV2luZG93OiB1bmRlZmluZWQgYXMgV2luZG93LFxuICB3aW5kb3c6IHVuZGVmaW5lZCBhcyBXaW5kb3csXG4gIGdldFdpbmRvdyxcbiAgaW5pdCxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKHdpbmRvdzogV2luZG93ICYgeyB3cmFwPzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgfSkge1xuICAvLyBnZXQgd3JhcHBlZCB3aW5kb3cgaWYgdXNpbmcgU2hhZG93IERPTSBwb2x5ZmlsbFxuXG4gIHdpbi5yZWFsV2luZG93ID0gd2luZG93XG5cbiAgLy8gY3JlYXRlIGEgVGV4dE5vZGVcbiAgY29uc3QgZWwgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpXG5cbiAgLy8gY2hlY2sgaWYgaXQncyB3cmFwcGVkIGJ5IGEgcG9seWZpbGxcbiAgaWYgKGVsLm93bmVyRG9jdW1lbnQgIT09IHdpbmRvdy5kb2N1bWVudCAmJlxuICAgICAgdHlwZW9mIHdpbmRvdy53cmFwID09PSAnZnVuY3Rpb24nICYmXG4gICAgd2luZG93LndyYXAoZWwpID09PSBlbCkge1xuICAgIC8vIHVzZSB3cmFwcGVkIHdpbmRvd1xuICAgIHdpbmRvdyA9IHdpbmRvdy53cmFwKHdpbmRvdylcbiAgfVxuXG4gIHdpbi53aW5kb3cgPSB3aW5kb3dcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbi53aW5kb3cgICAgID0gdW5kZWZpbmVkXG4gIHdpbi5yZWFsV2luZG93ID0gdW5kZWZpbmVkXG59XG5lbHNlIHtcbiAgaW5pdCh3aW5kb3cpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3cgKG5vZGU6IGFueSkge1xuICBpZiAoaXNXaW5kb3cobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgY29uc3Qgcm9vdE5vZGUgPSAobm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUpXG5cbiAgcmV0dXJuIHJvb3ROb2RlLmRlZmF1bHRWaWV3IHx8IHdpbi53aW5kb3dcbn1cblxud2luLmluaXQgPSBpbml0XG5cbmV4cG9ydCBkZWZhdWx0IHdpblxuIiwiLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxuXG5pbXBvcnQgaXNXaW5kb3cgZnJvbSAnLi9pc1dpbmRvdydcbmltcG9ydCB3aW4gZnJvbSAnLi93aW5kb3cnXG5cbmV4cG9ydCBjb25zdCB3aW5kb3cgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIFdpbmRvdyA9PlxuICB0aGluZyA9PT0gd2luLndpbmRvdyB8fCBpc1dpbmRvdyh0aGluZylcblxuZXhwb3J0IGNvbnN0IGRvY0ZyYWcgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIERvY3VtZW50RnJhZ21lbnQgPT5cbiAgb2JqZWN0KHRoaW5nKSAmJiB0aGluZy5ub2RlVHlwZSA9PT0gMTFcblxuZXhwb3J0IGNvbnN0IG9iamVjdCA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0+XG4gICEhdGhpbmcgJiYgKHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCcpXG5cbmV4cG9ydCBjb25zdCBmdW5jID0gKHRoaW5nOiBhbnkpOiB0aGluZyBpcyAoLi4uYXJnczogYW55W10pID0+IGFueSA9PlxuICB0eXBlb2YgdGhpbmcgPT09ICdmdW5jdGlvbidcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgbnVtYmVyID0+XG4gIHR5cGVvZiB0aGluZyA9PT0gJ251bWJlcidcblxuZXhwb3J0IGNvbnN0IGJvb2wgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIGJvb2xlYW4gPT5cbiAgdHlwZW9mIHRoaW5nID09PSAnYm9vbGVhbidcblxuZXhwb3J0IGNvbnN0IHN0cmluZyA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgc3RyaW5nID0+XG4gIHR5cGVvZiB0aGluZyA9PT0gJ3N0cmluZydcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnQgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIEludGVyYWN0LkVsZW1lbnQgPT4ge1xuICBpZiAoIXRoaW5nIHx8ICh0eXBlb2YgdGhpbmcgIT09ICdvYmplY3QnKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IF93aW5kb3cgPSB3aW4uZ2V0V2luZG93KHRoaW5nKSB8fCB3aW4ud2luZG93XG5cbiAgcmV0dXJuICgvb2JqZWN0fGZ1bmN0aW9uLy50ZXN0KHR5cGVvZiBfd2luZG93LkVsZW1lbnQpXG4gICAgPyB0aGluZyBpbnN0YW5jZW9mIF93aW5kb3cuRWxlbWVudCAvLyBET00yXG4gICAgOiB0aGluZy5ub2RlVHlwZSA9PT0gMSAmJiB0eXBlb2YgdGhpbmcubm9kZU5hbWUgPT09ICdzdHJpbmcnKVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5PYmplY3Q6IHR5cGVvZiBvYmplY3QgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9PlxuICBvYmplY3QodGhpbmcpICYmXG4gICEhdGhpbmcuY29uc3RydWN0b3IgJiZcbiAgL2Z1bmN0aW9uIE9iamVjdFxcYi8udGVzdCh0aGluZy5jb25zdHJ1Y3Rvci50b1N0cmluZygpKVxuXG5leHBvcnQgY29uc3QgYXJyYXkgPSA8VCBleHRlbmRzIHVua25vd24+KHRoaW5nOiBhbnkpOiB0aGluZyBpcyBUW10gPT5cbiAgKG9iamVjdCh0aGluZykgJiZcbiAgKHR5cGVvZiB0aGluZy5sZW5ndGggIT09ICd1bmRlZmluZWQnKSAmJlxuICBmdW5jKHRoaW5nLnNwbGljZSkpXG4iLCJpbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIGRyYWdnYWJsZTogRHJhZ2dhYmxlTWV0aG9kXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBkcmFnOiBJbnRlcmFjdC5EcmFnZ2FibGVPcHRpb25zXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbk1hcCB7XG4gICAgZHJhZz86IHR5cGVvZiBkcmFnXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgRHJhZ0V2ZW50ID0gSW50ZXJhY3QuSW50ZXJhY3RFdmVudDwnZHJhZyc+XG5cbmV4cG9ydCB0eXBlIERyYWdnYWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5EcmFnZ2FibGVPcHRpb25zPlxuXG5mdW5jdGlvbiBpbnN0YWxsIChzY29wZTogU2NvcGUpIHtcbiAgY29uc3Qge1xuICAgIGFjdGlvbnMsXG4gICAgSW50ZXJhY3RhYmxlLFxuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyYWdnYWJsZSA9IGRyYWcuZHJhZ2dhYmxlXG5cbiAgYWN0aW9ucy5tYXAuZHJhZyA9IGRyYWdcbiAgYWN0aW9ucy5tZXRob2REaWN0LmRyYWcgPSAnZHJhZ2dhYmxlJ1xuXG4gIGRlZmF1bHRzLmFjdGlvbnMuZHJhZyA9IGRyYWcuZGVmYXVsdHNcbn1cblxuZnVuY3Rpb24gYmVmb3JlTW92ZSAoeyBpbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICBjb25zdCBheGlzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpc1xuXG4gIGlmIChheGlzID09PSAneCcpIHtcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnBhZ2UueSAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueVxuICAgIGludGVyYWN0aW9uLmNvb3Jkcy5jdXIuY2xpZW50LnkgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQuY2xpZW50LnlcblxuICAgIGludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eS5jbGllbnQueSA9IDBcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHkucGFnZS55ICAgPSAwXG4gIH1cbiAgZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgaW50ZXJhY3Rpb24uY29vcmRzLmN1ci5wYWdlLnggICA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5wYWdlLnhcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLmNsaWVudC54ID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LmNsaWVudC54XG5cbiAgICBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHkuY2xpZW50LnggPSAwXG4gICAgaW50ZXJhY3Rpb24uY29vcmRzLnZlbG9jaXR5LnBhZ2UueCAgID0gMFxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdmUgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICBjb25zdCBheGlzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpc1xuXG4gIGlmIChheGlzID09PSAneCcgfHwgYXhpcyA9PT0gJ3knKSB7XG4gICAgY29uc3Qgb3Bwb3NpdGUgPSBheGlzID09PSAneCcgPyAneScgOiAneCdcblxuICAgIGlFdmVudC5wYWdlW29wcG9zaXRlXSAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2Vbb3Bwb3NpdGVdXG4gICAgaUV2ZW50LmNsaWVudFtvcHBvc2l0ZV0gPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQuY2xpZW50W29wcG9zaXRlXVxuICAgIGlFdmVudC5kZWx0YVtvcHBvc2l0ZV0gPSAwXG4gIH1cbn1cblxuLyoqXG4gKiBgYGBqc1xuICogaW50ZXJhY3QoZWxlbWVudCkuZHJhZ2dhYmxlKHtcbiAqICAgICBvbnN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICogICAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gKiAgICAgb25lbmQgIDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAqXG4gKiAgICAgLy8gdGhlIGF4aXMgaW4gd2hpY2ggdGhlIGZpcnN0IG1vdmVtZW50IG11c3QgYmVcbiAqICAgICAvLyBmb3IgdGhlIGRyYWcgc2VxdWVuY2UgdG8gc3RhcnRcbiAqICAgICAvLyAneHknIGJ5IGRlZmF1bHQgLSBhbnkgZGlyZWN0aW9uXG4gKiAgICAgc3RhcnRBeGlzOiAneCcgfHwgJ3knIHx8ICd4eScsXG4gKlxuICogICAgIC8vICd4eScgYnkgZGVmYXVsdCAtIGRvbid0IHJlc3RyaWN0IHRvIG9uZSBheGlzIChtb3ZlIGluIGFueSBkaXJlY3Rpb24pXG4gKiAgICAgLy8gJ3gnIG9yICd5JyB0byByZXN0cmljdCBtb3ZlbWVudCB0byBlaXRoZXIgYXhpc1xuICogICAgIC8vICdzdGFydCcgdG8gcmVzdHJpY3QgbW92ZW1lbnQgdG8gdGhlIGF4aXMgdGhlIGRyYWcgc3RhcnRlZCBpblxuICogICAgIGxvY2tBeGlzOiAneCcgfHwgJ3knIHx8ICd4eScgfHwgJ3N0YXJ0JyxcbiAqXG4gKiAgICAgLy8gbWF4IG51bWJlciBvZiBkcmFncyB0aGF0IGNhbiBoYXBwZW4gY29uY3VycmVudGx5XG4gKiAgICAgLy8gd2l0aCBlbGVtZW50cyBvZiB0aGlzIEludGVyYWN0YWJsZS4gSW5maW5pdHkgYnkgZGVmYXVsdFxuICogICAgIG1heDogSW5maW5pdHksXG4gKlxuICogICAgIC8vIG1heCBudW1iZXIgb2YgZHJhZ3MgdGhhdCBjYW4gdGFyZ2V0IHRoZSBzYW1lIGVsZW1lbnQrSW50ZXJhY3RhYmxlXG4gKiAgICAgLy8gMSBieSBkZWZhdWx0XG4gKiAgICAgbWF4UGVyRWxlbWVudDogMlxuICogfSlcbiAqXG4gKiB2YXIgaXNEcmFnZ2FibGUgPSBpbnRlcmFjdCgnZWxlbWVudCcpLmRyYWdnYWJsZSgpOyAvLyB0cnVlXG4gKiBgYGBcbiAqXG4gKiBHZXQgb3Igc2V0IHdoZXRoZXIgZHJhZyBhY3Rpb25zIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHRhcmdldFxuICpcbiAqIEBhbGlhcyBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyYWdnYWJsZVxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAqIGxpc3RlbmVycyB0byBiZSBmaXJlZCBvbiBkcmFnIGV2ZW50cyAob2JqZWN0IG1ha2VzIHRoZSBJbnRlcmFjdGFibGVcbiAqIGRyYWdnYWJsZSlcbiAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIGNhbiBiZSB0aGVcbiAqIHRhcmdldCBvZiBkcmFnIGV2ZW50cywgb3IgdGhpcyBJbnRlcmN0YWJsZVxuICovXG5jb25zdCBkcmFnZ2FibGU6IERyYWdnYWJsZU1ldGhvZCA9IGZ1bmN0aW9uIGRyYWdnYWJsZSAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zPzogSW50ZXJhY3QuRHJhZ2dhYmxlT3B0aW9ucyB8IGJvb2xlYW4pOiBhbnkge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgdGhpcy5vcHRpb25zLmRyYWcuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcbiAgICB0aGlzLnNldFBlckFjdGlvbignZHJhZycsIG9wdGlvbnMpXG4gICAgdGhpcy5zZXRPbkV2ZW50cygnZHJhZycsIG9wdGlvbnMpXG5cbiAgICBpZiAoL14oeHl8eHx5fHN0YXJ0KSQvLnRlc3Qob3B0aW9ucy5sb2NrQXhpcykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5kcmFnLmxvY2tBeGlzID0gb3B0aW9ucy5sb2NrQXhpc1xuICAgIH1cbiAgICBpZiAoL14oeHl8eHx5KSQvLnRlc3Qob3B0aW9ucy5zdGFydEF4aXMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZHJhZy5zdGFydEF4aXMgPSBvcHRpb25zLnN0YXJ0QXhpc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoaXMuYm9vbChvcHRpb25zKSkge1xuICAgIHRoaXMub3B0aW9ucy5kcmFnLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcmV0dXJuIHRoaXMub3B0aW9ucy5kcmFnXG59XG5cbmNvbnN0IGRyYWc6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhY3Rpb25zL2RyYWcnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGJlZm9yZU1vdmUsXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tcmVzdW1lJzogYmVmb3JlTW92ZSxcblxuICAgIC8vIGRyYWdtb3ZlXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IG1vdmUsXG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBhcmcgPT4ge1xuICAgICAgY29uc3QgeyBpbnRlcmFjdGlvbiwgaW50ZXJhY3RhYmxlLCBidXR0b25zIH0gPSBhcmdcbiAgICAgIGNvbnN0IGRyYWdPcHRpb25zID0gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJhZ1xuXG4gICAgICBpZiAoXG4gICAgICAgICEoZHJhZ09wdGlvbnMgJiYgZHJhZ09wdGlvbnMuZW5hYmxlZCkgfHxcbiAgICAgICAgLy8gY2hlY2sgbW91c2VCdXR0b24gc2V0dGluZyBpZiB0aGUgcG9pbnRlciBpcyBkb3duXG4gICAgICAgIChpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duICYmXG4gICAgICAgICAvbW91c2V8cG9pbnRlci8udGVzdChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSkgJiZcbiAgICAgICAoYnV0dG9ucyAmIGludGVyYWN0YWJsZS5vcHRpb25zLmRyYWcubW91c2VCdXR0b25zKSA9PT0gMClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGFyZy5hY3Rpb24gPSB7XG4gICAgICAgIG5hbWU6ICdkcmFnJyxcbiAgICAgICAgYXhpczogKGRyYWdPcHRpb25zLmxvY2tBeGlzID09PSAnc3RhcnQnXG4gICAgICAgICAgPyBkcmFnT3B0aW9ucy5zdGFydEF4aXNcbiAgICAgICAgICA6IGRyYWdPcHRpb25zLmxvY2tBeGlzKSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcbiAgfSxcbiAgZHJhZ2dhYmxlLFxuICBiZWZvcmVNb3ZlLFxuICBtb3ZlLFxuICBkZWZhdWx0czoge1xuICAgIHN0YXJ0QXhpcyA6ICd4eScsXG4gICAgbG9ja0F4aXMgIDogJ3h5JyxcbiAgfSBhcyBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnMsXG5cbiAgZ2V0Q3Vyc29yICgpIHtcbiAgICByZXR1cm4gJ21vdmUnXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWdcbiIsInR5cGUgRmlsdGVyPFQ+ID0gKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IGJvb2xlYW5cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zID0gPFQ+KGFycmF5OiBUW10sIHRhcmdldDogVCkgPT4gYXJyYXkuaW5kZXhPZih0YXJnZXQpICE9PSAtMVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlID0gPFQ+KGFycmF5OiBUW10sIHRhcmdldDogVCkgPT4gYXJyYXkuc3BsaWNlKGFycmF5LmluZGV4T2YodGFyZ2V0KSwgMSlcblxuZXhwb3J0IGNvbnN0IG1lcmdlID0gPFQsIFU+KHRhcmdldDogQXJyYXk8VCB8IFU+LCBzb3VyY2U6IFVbXSkgPT4ge1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKSB7XG4gICAgdGFyZ2V0LnB1c2goaXRlbSlcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRcbn1cblxuZXhwb3J0IGNvbnN0IGZyb20gPSA8VCA9IGFueT4oc291cmNlOiBBcnJheUxpa2U8VD4pID0+IG1lcmdlKFtdIGFzIFRbXSwgc291cmNlIGFzIFRbXSlcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihhcnJheTogVFtdLCBmdW5jOiBGaWx0ZXI8VD4pID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmdW5jKGFycmF5W2ldLCBpLCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbmV4cG9ydCBjb25zdCBmaW5kID0gPFQgPSBhbnk+KGFycmF5OiBUW10sIGZ1bmM6IEZpbHRlcjxUPikgPT4gYXJyYXlbZmluZEluZGV4KGFycmF5LCBmdW5jKV1cbiIsImNvbnN0IGRvbU9iamVjdHM6IHtcbiAgaW5pdDogYW55XG4gIGRvY3VtZW50OiBEb2N1bWVudFxuICBEb2N1bWVudEZyYWdtZW50OiB0eXBlb2YgRG9jdW1lbnRGcmFnbWVudFxuICBTVkdFbGVtZW50OiB0eXBlb2YgU1ZHRWxlbWVudFxuICBTVkdTVkdFbGVtZW50OiB0eXBlb2YgU1ZHU1ZHRWxlbWVudFxuICBTVkdFbGVtZW50SW5zdGFuY2U6IGFueVxuICBFbGVtZW50OiB0eXBlb2YgRWxlbWVudFxuICBIVE1MRWxlbWVudDogdHlwZW9mIEhUTUxFbGVtZW50XG4gIEV2ZW50OiB0eXBlb2YgRXZlbnRcbiAgVG91Y2g6IHR5cGVvZiBUb3VjaFxuICBQb2ludGVyRXZlbnQ6IHR5cGVvZiBQb2ludGVyRXZlbnRcbn0gPVxue1xuICBpbml0LFxuICBkb2N1bWVudDogbnVsbCxcbiAgRG9jdW1lbnRGcmFnbWVudDogbnVsbCxcbiAgU1ZHRWxlbWVudDogbnVsbCxcbiAgU1ZHU1ZHRWxlbWVudDogbnVsbCxcbiAgU1ZHRWxlbWVudEluc3RhbmNlOiBudWxsLFxuICBFbGVtZW50OiBudWxsLFxuICBIVE1MRWxlbWVudDogbnVsbCxcbiAgRXZlbnQ6IG51bGwsXG4gIFRvdWNoOiBudWxsLFxuICBQb2ludGVyRXZlbnQ6IG51bGwsXG59XG5cbmZ1bmN0aW9uIGJsYW5rICgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGRvbU9iamVjdHNcblxuZnVuY3Rpb24gaW5pdCAod2luZG93OiBXaW5kb3cpIHtcbiAgY29uc3Qgd2luID0gd2luZG93IGFzIGFueVxuXG4gIGRvbU9iamVjdHMuZG9jdW1lbnQgICAgICAgICAgID0gd2luLmRvY3VtZW50XG4gIGRvbU9iamVjdHMuRG9jdW1lbnRGcmFnbWVudCAgID0gd2luLkRvY3VtZW50RnJhZ21lbnQgICB8fCBibGFua1xuICBkb21PYmplY3RzLlNWR0VsZW1lbnQgICAgICAgICA9IHdpbi5TVkdFbGVtZW50ICAgICAgICAgfHwgYmxhbmtcbiAgZG9tT2JqZWN0cy5TVkdTVkdFbGVtZW50ICAgICAgPSB3aW4uU1ZHU1ZHRWxlbWVudCAgICAgIHx8IGJsYW5rXG4gIGRvbU9iamVjdHMuU1ZHRWxlbWVudEluc3RhbmNlID0gd2luLlNWR0VsZW1lbnRJbnN0YW5jZSB8fCBibGFua1xuICBkb21PYmplY3RzLkVsZW1lbnQgICAgICAgICAgICA9IHdpbi5FbGVtZW50ICAgICAgICAgICAgfHwgYmxhbmtcbiAgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAgICAgICAgPSB3aW4uSFRNTEVsZW1lbnQgICAgICAgIHx8IGRvbU9iamVjdHMuRWxlbWVudFxuXG4gIGRvbU9iamVjdHMuRXZlbnQgICAgICAgID0gd2luLkV2ZW50XG4gIGRvbU9iamVjdHMuVG91Y2ggICAgICAgID0gd2luLlRvdWNoIHx8IGJsYW5rXG4gIGRvbU9iamVjdHMuUG9pbnRlckV2ZW50ID0gKHdpbi5Qb2ludGVyRXZlbnQgfHwgd2luLk1TUG9pbnRlckV2ZW50KVxufVxuIiwiaW1wb3J0IGRvbU9iamVjdHMgZnJvbSAnLi9kb21PYmplY3RzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCB3aW4gZnJvbSAnLi93aW5kb3cnXG5cbmNvbnN0IGJyb3dzZXIgPSB7XG4gIGluaXQsXG4gIHN1cHBvcnRzVG91Y2g6IG51bGwgYXMgYm9vbGVhbixcbiAgc3VwcG9ydHNQb2ludGVyRXZlbnQ6IG51bGwgYXMgYm9vbGVhbixcbiAgaXNJT1M3OiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzSU9TOiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzSWU5OiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzT3BlcmFNb2JpbGU6IG51bGwgYXMgYm9vbGVhbixcbiAgcHJlZml4ZWRNYXRjaGVzU2VsZWN0b3I6IG51bGwgYXMgc3RyaW5nLFxuICBwRXZlbnRUeXBlczogbnVsbCBhcyB7XG4gICAgdXA6IHN0cmluZ1xuICAgIGRvd246IHN0cmluZ1xuICAgIG92ZXI6IHN0cmluZ1xuICAgIG91dDogc3RyaW5nXG4gICAgbW92ZTogc3RyaW5nXG4gICAgY2FuY2VsOiBzdHJpbmdcbiAgfSxcbiAgd2hlZWxFdmVudDogbnVsbCBhcyBzdHJpbmcsXG59XG5cbmZ1bmN0aW9uIGluaXQgKHdpbmRvdzogYW55KSB7XG4gIGNvbnN0IEVsZW1lbnQgPSBkb21PYmplY3RzLkVsZW1lbnRcbiAgY29uc3QgbmF2aWdhdG9yICA9IHdpbi53aW5kb3cubmF2aWdhdG9yXG5cbiAgLy8gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IHRvdWNoIGlucHV0P1xuICBicm93c2VyLnN1cHBvcnRzVG91Y2ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KSB8fFxuICAgIChpcy5mdW5jKHdpbmRvdy5Eb2N1bWVudFRvdWNoKSAmJiBkb21PYmplY3RzLmRvY3VtZW50IGluc3RhbmNlb2Ygd2luZG93LkRvY3VtZW50VG91Y2gpXG5cbiAgLy8gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IFBvaW50ZXJFdmVudHNcbiAgYnJvd3Nlci5zdXBwb3J0c1BvaW50ZXJFdmVudCA9IG5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCAhPT0gZmFsc2UgJiYgISFkb21PYmplY3RzLlBvaW50ZXJFdmVudFxuXG4gIGJyb3dzZXIuaXNJT1MgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkpXG5cbiAgLy8gc2Nyb2xsaW5nIGRvZXNuJ3QgY2hhbmdlIHRoZSByZXN1bHQgb2YgZ2V0Q2xpZW50UmVjdHMgb24gaU9TIDdcbiAgYnJvd3Nlci5pc0lPUzcgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgJiZcbiAgICAgICAgICAgL09TIDdbXlxcZF0vLnRlc3QobmF2aWdhdG9yLmFwcFZlcnNpb24pKVxuXG4gIGJyb3dzZXIuaXNJZTkgPSAvTVNJRSA5Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgLy8gT3BlcmEgTW9iaWxlIG11c3QgYmUgaGFuZGxlZCBkaWZmZXJlbnRseVxuICBicm93c2VyLmlzT3BlcmFNb2JpbGUgPSAobmF2aWdhdG9yLmFwcE5hbWUgPT09ICdPcGVyYScgJiZcbiAgICBicm93c2VyLnN1cHBvcnRzVG91Y2ggJiZcbiAgICAvUHJlc3RvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKVxuXG4gIC8vIHByZWZpeCBtYXRjaGVzU2VsZWN0b3JcbiAgYnJvd3Nlci5wcmVmaXhlZE1hdGNoZXNTZWxlY3RvciA9ICdtYXRjaGVzJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgID8gJ21hdGNoZXMnXG4gICAgOiAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgICAgPyAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJ1xuICAgICAgOiAnbW96TWF0Y2hlc1NlbGVjdG9yJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgICAgICA/ICdtb3pNYXRjaGVzU2VsZWN0b3InXG4gICAgICAgIDogJ29NYXRjaGVzU2VsZWN0b3InIGluIEVsZW1lbnQucHJvdG90eXBlXG4gICAgICAgICAgPyAnb01hdGNoZXNTZWxlY3RvcidcbiAgICAgICAgICA6ICdtc01hdGNoZXNTZWxlY3RvcidcblxuICBicm93c2VyLnBFdmVudFR5cGVzID0gKGJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnRcbiAgICA/IChkb21PYmplY3RzLlBvaW50ZXJFdmVudCA9PT0gd2luZG93Lk1TUG9pbnRlckV2ZW50XG4gICAgICA/IHtcbiAgICAgICAgdXA6ICAgICAnTVNQb2ludGVyVXAnLFxuICAgICAgICBkb3duOiAgICdNU1BvaW50ZXJEb3duJyxcbiAgICAgICAgb3ZlcjogICAnbW91c2VvdmVyJyxcbiAgICAgICAgb3V0OiAgICAnbW91c2VvdXQnLFxuICAgICAgICBtb3ZlOiAgICdNU1BvaW50ZXJNb3ZlJyxcbiAgICAgICAgY2FuY2VsOiAnTVNQb2ludGVyQ2FuY2VsJyxcbiAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICB1cDogICAgICdwb2ludGVydXAnLFxuICAgICAgICBkb3duOiAgICdwb2ludGVyZG93bicsXG4gICAgICAgIG92ZXI6ICAgJ3BvaW50ZXJvdmVyJyxcbiAgICAgICAgb3V0OiAgICAncG9pbnRlcm91dCcsXG4gICAgICAgIG1vdmU6ICAgJ3BvaW50ZXJtb3ZlJyxcbiAgICAgICAgY2FuY2VsOiAncG9pbnRlcmNhbmNlbCcsXG4gICAgICB9KVxuICAgIDogbnVsbClcblxuICAvLyBiZWNhdXNlIFdlYmtpdCBhbmQgT3BlcmEgc3RpbGwgdXNlICdtb3VzZXdoZWVsJyBldmVudCB0eXBlXG4gIGJyb3dzZXIud2hlZWxFdmVudCA9ICdvbm1vdXNld2hlZWwnIGluIGRvbU9iamVjdHMuZG9jdW1lbnQgPyAnbW91c2V3aGVlbCcgOiAnd2hlZWwnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGJyb3dzZXJcbiIsImltcG9ydCAqIGFzIGFyciBmcm9tICcuL2FycidcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBiYW4tdHlwZXNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsb25lPFQgZXh0ZW5kcyBPYmplY3Q+IChzb3VyY2U6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgZGVzdCA9IHt9IGFzIFBhcnRpYWw8VD5cblxuICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbcHJvcF1cblxuICAgIGlmIChpcy5wbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGRlc3RbcHJvcF0gPSBjbG9uZSh2YWx1ZSkgYXMgYW55XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLmFycmF5KHZhbHVlKSkge1xuICAgICAgZGVzdFtwcm9wXSA9IGFyci5mcm9tKHZhbHVlKSBhcyB0eXBlb2YgdmFsdWVcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkZXN0W3Byb3BdID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVzdFxufVxuIiwiaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi9icm93c2VyJ1xuaW1wb3J0IGRvbU9iamVjdHMgZnJvbSAnLi9kb21PYmplY3RzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCB3aW4sIHsgZ2V0V2luZG93IH0gZnJvbSAnLi93aW5kb3cnXG5cbmV4cG9ydCBmdW5jdGlvbiBub2RlQ29udGFpbnMgKHBhcmVudDogTm9kZSB8IEludGVyYWN0LkV2ZW50VGFyZ2V0LCBjaGlsZDogTm9kZSB8IEludGVyYWN0LkV2ZW50VGFyZ2V0KSB7XG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGlmIChjaGlsZCA9PT0gcGFyZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNoaWxkID0gKGNoaWxkIGFzIE5vZGUpLnBhcmVudE5vZGVcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VzdCAoZWxlbWVudDogTm9kZSwgc2VsZWN0b3I6IHN0cmluZykge1xuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIGlmIChtYXRjaGVzU2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3IpKSB7IHJldHVybiBlbGVtZW50IH1cblxuICAgIGVsZW1lbnQgPSBwYXJlbnROb2RlKGVsZW1lbnQpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyZW50Tm9kZSAobm9kZTogTm9kZSB8IERvY3VtZW50KSB7XG4gIGxldCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGVcblxuICBpZiAoaXMuZG9jRnJhZyhwYXJlbnQpKSB7XG4gICAgLy8gc2tpcCBwYXN0ICNzaGFkby1yb290IGZyYWdtZW50c1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIHdoaWxlICgocGFyZW50ID0gKHBhcmVudCBhcyBhbnkpLmhvc3QpICYmIGlzLmRvY0ZyYWcocGFyZW50KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICByZXR1cm4gcGFyZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgLy8gcmVtb3ZlIC9kZWVwLyBmcm9tIHNlbGVjdG9ycyBpZiBzaGFkb3dET00gcG9seWZpbGwgaXMgdXNlZFxuICBpZiAod2luLndpbmRvdyAhPT0gd2luLnJlYWxXaW5kb3cpIHtcbiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoL1xcL2RlZXBcXC8vZywgJyAnKVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRbYnJvd3Nlci5wcmVmaXhlZE1hdGNoZXNTZWxlY3Rvcl0oc2VsZWN0b3IpXG59XG5cbmNvbnN0IGdldFBhcmVudCA9IGVsID0+IGVsLnBhcmVudE5vZGUgPyBlbC5wYXJlbnROb2RlIDogZWwuaG9zdFxuXG4vLyBUZXN0IGZvciB0aGUgZWxlbWVudCB0aGF0J3MgXCJhYm92ZVwiIGFsbCBvdGhlciBxdWFsaWZpZXJzXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZkRlZXBlc3RFbGVtZW50IChlbGVtZW50czogSW50ZXJhY3QuRWxlbWVudFtdIHwgTm9kZUxpc3RPZjxFbGVtZW50Pikge1xuICBsZXQgZGVlcGVzdFpvbmVQYXJlbnRzID0gW11cbiAgbGV0IGRlZXBlc3Rab25lID0gZWxlbWVudHNbMF1cbiAgbGV0IGluZGV4ID0gZGVlcGVzdFpvbmUgPyAwIDogLTFcbiAgbGV0IGlcbiAgbGV0IG5cblxuICBmb3IgKGkgPSAxOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkcm9wem9uZSA9IGVsZW1lbnRzW2ldXG5cbiAgICAvLyBhbiBlbGVtZW50IG1pZ2h0IGJlbG9uZyB0byBtdWx0aXBsZSBzZWxlY3RvciBkcm9wem9uZXNcbiAgICBpZiAoIWRyb3B6b25lIHx8IGRyb3B6b25lID09PSBkZWVwZXN0Wm9uZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIWRlZXBlc3Rab25lKSB7XG4gICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICBpbmRleCA9IGlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGRlZXBlc3Qgb3IgY3VycmVudCBhcmUgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LnJvb3RFbGVtZW50XG4gICAgLy8gLSBpZiB0aGUgY3VycmVudCBkcm9wem9uZSBpcywgZG8gbm90aGluZyBhbmQgY29udGludWVcbiAgICBpZiAoZHJvcHpvbmUucGFyZW50Tm9kZSA9PT0gZHJvcHpvbmUub3duZXJEb2N1bWVudCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgLy8gLSBpZiBkZWVwZXN0IGlzLCB1cGRhdGUgd2l0aCB0aGUgY3VycmVudCBkcm9wem9uZSBhbmQgY29udGludWUgdG8gbmV4dFxuICAgIGVsc2UgaWYgKGRlZXBlc3Rab25lLnBhcmVudE5vZGUgPT09IGRyb3B6b25lLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIGRlZXBlc3Rab25lID0gZHJvcHpvbmVcbiAgICAgIGluZGV4ID0gaVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHpJbmRleCBvZiBzaWJsaW5nc1xuICAgIGlmIChkcm9wem9uZS5wYXJlbnROb2RlID09PSBkZWVwZXN0Wm9uZS5wYXJlbnROb2RlKSB7XG4gICAgICBjb25zdCBkZWVwZXN0WkluZGV4ID0gcGFyc2VJbnQoZ2V0V2luZG93KGRlZXBlc3Rab25lKS5nZXRDb21wdXRlZFN0eWxlKGRlZXBlc3Rab25lKS56SW5kZXgsIDEwKSB8fCAwXG4gICAgICBjb25zdCBkcm9wem9uZVpJbmRleCA9IHBhcnNlSW50KGdldFdpbmRvdyhkcm9wem9uZSkuZ2V0Q29tcHV0ZWRTdHlsZShkcm9wem9uZSkuekluZGV4LCAxMCkgfHwgMFxuXG4gICAgICBpZiAoZHJvcHpvbmVaSW5kZXggPj0gZGVlcGVzdFpJbmRleCkge1xuICAgICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICAgIGluZGV4ID0gaVxuICAgICAgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIHBvcHVsYXRlIHRoZSBhbmNlc3RyeSBhcnJheSBmb3IgdGhlIGxhdGVzdCBkZWVwZXN0IGRyb3B6b25lXG4gICAgaWYgKCFkZWVwZXN0Wm9uZVBhcmVudHMubGVuZ3RoKSB7XG4gICAgICBsZXQgcGFyZW50ID0gZGVlcGVzdFpvbmVcbiAgICAgIGxldCBwYXJlbnRQYXJlbnRcblxuICAgICAgd2hpbGUgKChwYXJlbnRQYXJlbnQgPSBnZXRQYXJlbnQocGFyZW50KSkgJiYgcGFyZW50UGFyZW50ICE9PSBwYXJlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgICBkZWVwZXN0Wm9uZVBhcmVudHMudW5zaGlmdChwYXJlbnQpXG4gICAgICAgIHBhcmVudCA9IHBhcmVudFBhcmVudFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwYXJlbnRcblxuICAgIC8vIGlmIHRoaXMgZWxlbWVudCBpcyBhbiBzdmcgZWxlbWVudCBhbmQgdGhlIGN1cnJlbnQgZGVlcGVzdCBpcyBhblxuICAgIC8vIEhUTUxFbGVtZW50XG4gICAgaWYgKGRlZXBlc3Rab25lIGluc3RhbmNlb2YgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAmJlxuICAgICAgICBkcm9wem9uZSBpbnN0YW5jZW9mIGRvbU9iamVjdHMuU1ZHRWxlbWVudCAmJlxuICAgICAgICAhKGRyb3B6b25lIGluc3RhbmNlb2YgZG9tT2JqZWN0cy5TVkdTVkdFbGVtZW50KSkge1xuICAgICAgaWYgKGRyb3B6b25lID09PSBkZWVwZXN0Wm9uZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IGRyb3B6b25lLm93bmVyU1ZHRWxlbWVudFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHBhcmVudCA9IGRyb3B6b25lXG4gICAgfVxuXG4gICAgY29uc3QgZHJvcHpvbmVQYXJlbnRzID0gW11cblxuICAgIHdoaWxlIChwYXJlbnQucGFyZW50Tm9kZSAhPT0gcGFyZW50Lm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIGRyb3B6b25lUGFyZW50cy51bnNoaWZ0KHBhcmVudClcbiAgICAgIHBhcmVudCA9IGdldFBhcmVudChwYXJlbnQpXG4gICAgfVxuXG4gICAgbiA9IDBcblxuICAgIC8vIGdldCAocG9zaXRpb24gb2YgbGFzdCBjb21tb24gYW5jZXN0b3IpICsgMVxuICAgIHdoaWxlIChkcm9wem9uZVBhcmVudHNbbl0gJiYgZHJvcHpvbmVQYXJlbnRzW25dID09PSBkZWVwZXN0Wm9uZVBhcmVudHNbbl0pIHtcbiAgICAgIG4rK1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudHMgPSBbXG4gICAgICBkcm9wem9uZVBhcmVudHNbbiAtIDFdLFxuICAgICAgZHJvcHpvbmVQYXJlbnRzW25dLFxuICAgICAgZGVlcGVzdFpvbmVQYXJlbnRzW25dLFxuICAgIF1cblxuICAgIGxldCBjaGlsZCA9IHBhcmVudHNbMF0ubGFzdENoaWxkXG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZCA9PT0gcGFyZW50c1sxXSkge1xuICAgICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICAgIGluZGV4ID0gaVxuICAgICAgICBkZWVwZXN0Wm9uZVBhcmVudHMgPSBkcm9wem9uZVBhcmVudHNcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoY2hpbGQgPT09IHBhcmVudHNbMl0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmdcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5kZXhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNVcFRvIChlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nLCBsaW1pdDogTm9kZSkge1xuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIGlmIChtYXRjaGVzU2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGVsZW1lbnQgPSBwYXJlbnROb2RlKGVsZW1lbnQpIGFzIEludGVyYWN0LkVsZW1lbnRcblxuICAgIGlmIChlbGVtZW50ID09PSBsaW1pdCkge1xuICAgICAgcmV0dXJuIG1hdGNoZXNTZWxlY3RvcihlbGVtZW50LCBzZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdHVhbEVsZW1lbnQgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpIHtcbiAgcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgZG9tT2JqZWN0cy5TVkdFbGVtZW50SW5zdGFuY2VcbiAgICA/IChlbGVtZW50IGFzIFNWR0VsZW1lbnQpLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50XG4gICAgOiBlbGVtZW50KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Nyb2xsWFkgKHJlbGV2YW50V2luZG93KSB7XG4gIHJlbGV2YW50V2luZG93ID0gcmVsZXZhbnRXaW5kb3cgfHwgd2luLndpbmRvd1xuICByZXR1cm4ge1xuICAgIHg6IHJlbGV2YW50V2luZG93LnNjcm9sbFggfHwgcmVsZXZhbnRXaW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgeTogcmVsZXZhbnRXaW5kb3cuc2Nyb2xsWSB8fCByZWxldmFudFdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50Q2xpZW50UmVjdCAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICBjb25zdCBjbGllbnRSZWN0ID0gKGVsZW1lbnQgaW5zdGFuY2VvZiBkb21PYmplY3RzLlNWR0VsZW1lbnRcbiAgICA/IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICA6IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKVswXSlcblxuICByZXR1cm4gY2xpZW50UmVjdCAmJiB7XG4gICAgbGVmdCAgOiBjbGllbnRSZWN0LmxlZnQsXG4gICAgcmlnaHQgOiBjbGllbnRSZWN0LnJpZ2h0LFxuICAgIHRvcCAgIDogY2xpZW50UmVjdC50b3AsXG4gICAgYm90dG9tOiBjbGllbnRSZWN0LmJvdHRvbSxcbiAgICB3aWR0aCA6IGNsaWVudFJlY3Qud2lkdGggIHx8IGNsaWVudFJlY3QucmlnaHQgIC0gY2xpZW50UmVjdC5sZWZ0LFxuICAgIGhlaWdodDogY2xpZW50UmVjdC5oZWlnaHQgfHwgY2xpZW50UmVjdC5ib3R0b20gLSBjbGllbnRSZWN0LnRvcCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudFJlY3QgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpIHtcbiAgY29uc3QgY2xpZW50UmVjdCA9IGdldEVsZW1lbnRDbGllbnRSZWN0KGVsZW1lbnQpXG5cbiAgaWYgKCFicm93c2VyLmlzSU9TNyAmJiBjbGllbnRSZWN0KSB7XG4gICAgY29uc3Qgc2Nyb2xsID0gZ2V0U2Nyb2xsWFkod2luLmdldFdpbmRvdyhlbGVtZW50KSlcblxuICAgIGNsaWVudFJlY3QubGVmdCAgICs9IHNjcm9sbC54XG4gICAgY2xpZW50UmVjdC5yaWdodCAgKz0gc2Nyb2xsLnhcbiAgICBjbGllbnRSZWN0LnRvcCAgICArPSBzY3JvbGwueVxuICAgIGNsaWVudFJlY3QuYm90dG9tICs9IHNjcm9sbC55XG4gIH1cblxuICByZXR1cm4gY2xpZW50UmVjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aCAobm9kZTogTm9kZSB8IERvY3VtZW50KSB7XG4gIGNvbnN0IHBhdGggPSBbXVxuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgcGF0aC5wdXNoKG5vZGUpXG4gICAgbm9kZSA9IHBhcmVudE5vZGUobm9kZSlcbiAgfVxuXG4gIHJldHVybiBwYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlTZWxlY3RvciAodmFsdWUpIHtcbiAgaWYgKCFpcy5zdHJpbmcodmFsdWUpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGlmIGl0IGlzIGludmFsaWRcbiAgZG9tT2JqZWN0cy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHZhbHVlKVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBQb2ludGVyRXh0ZW5kIHtcbiAgd2Via2l0OiBSZWdFeHBcbiAgW3ByZWZpeDogc3RyaW5nXTogUmVnRXhwXG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJFeHRlbmQgKGRlc3QsIHNvdXJjZSkge1xuICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgY29uc3QgcHJlZml4ZWRQcm9wUkVzID0gcG9pbnRlckV4dGVuZC5wcmVmaXhlZFByb3BSRXNcbiAgICBsZXQgZGVwcmVjYXRlZCA9IGZhbHNlXG5cbiAgICAvLyBza2lwIGRlcHJlY2F0ZWQgcHJlZml4ZWQgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3QgdmVuZG9yIGluIHByZWZpeGVkUHJvcFJFcykge1xuICAgICAgaWYgKHByb3AuaW5kZXhPZih2ZW5kb3IpID09PSAwICYmIHByZWZpeGVkUHJvcFJFc1t2ZW5kb3JdLnRlc3QocHJvcCkpIHtcbiAgICAgICAgZGVwcmVjYXRlZCA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWRlcHJlY2F0ZWQgJiYgdHlwZW9mIHNvdXJjZVtwcm9wXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVzdFtwcm9wXSA9IHNvdXJjZVtwcm9wXVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdFxufVxuXG5wb2ludGVyRXh0ZW5kLnByZWZpeGVkUHJvcFJFcyA9IHtcbiAgd2Via2l0OiAvKE1vdmVtZW50W1hZXXxSYWRpdXNbWFldfFJvdGF0aW9uQW5nbGV8Rm9yY2UpJC8sXG4gIG1vejogLyhQcmVzc3VyZSkkLyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcG9pbnRlckV4dGVuZFxuIiwiZXhwb3J0IGRlZmF1bHQgKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiAgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpXG4iLCJpbXBvcnQgYnJvd3NlciBmcm9tICcuL2Jyb3dzZXInXG5pbXBvcnQgZG9tIGZyb20gJy4vZG9tT2JqZWN0cydcbmltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJy4vZG9tVXRpbHMnXG5pbXBvcnQgaHlwb3QgZnJvbSAnLi9oeXBvdCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5pbXBvcnQgcG9pbnRlckV4dGVuZCBmcm9tICcuL3BvaW50ZXJFeHRlbmQnXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5Q29vcmRzIChkZXN0OiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIsIHNyYzogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIGRlc3QucGFnZSA9IGRlc3QucGFnZSB8fCB7fSBhcyBhbnlcbiAgZGVzdC5wYWdlLnggPSBzcmMucGFnZS54XG4gIGRlc3QucGFnZS55ID0gc3JjLnBhZ2UueVxuXG4gIGRlc3QuY2xpZW50ID0gZGVzdC5jbGllbnQgfHwge30gYXMgYW55XG4gIGRlc3QuY2xpZW50LnggPSBzcmMuY2xpZW50LnhcbiAgZGVzdC5jbGllbnQueSA9IHNyYy5jbGllbnQueVxuXG4gIGRlc3QudGltZVN0YW1wID0gc3JjLnRpbWVTdGFtcFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29vcmREZWx0YXMgKHRhcmdldE9iajogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyLCBwcmV2OiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIsIGN1cjogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIHRhcmdldE9iai5wYWdlLnggICAgPSBjdXIucGFnZS54ICAgIC0gcHJldi5wYWdlLnhcbiAgdGFyZ2V0T2JqLnBhZ2UueSAgICA9IGN1ci5wYWdlLnkgICAgLSBwcmV2LnBhZ2UueVxuICB0YXJnZXRPYmouY2xpZW50LnggID0gY3VyLmNsaWVudC54ICAtIHByZXYuY2xpZW50LnhcbiAgdGFyZ2V0T2JqLmNsaWVudC55ICA9IGN1ci5jbGllbnQueSAgLSBwcmV2LmNsaWVudC55XG4gIHRhcmdldE9iai50aW1lU3RhbXAgPSBjdXIudGltZVN0YW1wIC0gcHJldi50aW1lU3RhbXBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb3JkVmVsb2NpdHkgKHRhcmdldE9iajogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyLCBkZWx0YTogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIGNvbnN0IGR0ID0gTWF0aC5tYXgoZGVsdGEudGltZVN0YW1wIC8gMTAwMCwgMC4wMDEpXG5cbiAgdGFyZ2V0T2JqLnBhZ2UueCAgID0gZGVsdGEucGFnZS54IC8gZHRcbiAgdGFyZ2V0T2JqLnBhZ2UueSAgID0gZGVsdGEucGFnZS55IC8gZHRcbiAgdGFyZ2V0T2JqLmNsaWVudC54ID0gZGVsdGEuY2xpZW50LnggLyBkdFxuICB0YXJnZXRPYmouY2xpZW50LnkgPSBkZWx0YS5jbGllbnQueSAvIGR0XG4gIHRhcmdldE9iai50aW1lU3RhbXAgPSBkdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0WmVyb0Nvb3JkcyAodGFyZ2V0T2JqOiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIpIHtcbiAgdGFyZ2V0T2JqLnBhZ2UueCA9IDBcbiAgdGFyZ2V0T2JqLnBhZ2UueSA9IDBcbiAgdGFyZ2V0T2JqLmNsaWVudC54ID0gMFxuICB0YXJnZXRPYmouY2xpZW50LnkgPSAwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05hdGl2ZVBvaW50ZXIgIChwb2ludGVyOiBhbnkpIHtcbiAgcmV0dXJuIChwb2ludGVyIGluc3RhbmNlb2YgZG9tLkV2ZW50IHx8IHBvaW50ZXIgaW5zdGFuY2VvZiBkb20uVG91Y2gpXG59XG5cbi8vIEdldCBzcGVjaWZpZWQgWC9ZIGNvb3JkcyBmb3IgbW91c2Ugb3IgZXZlbnQudG91Y2hlc1swXVxuZXhwb3J0IGZ1bmN0aW9uIGdldFhZICh0eXBlLCBwb2ludGVyLCB4eSkge1xuICB4eSA9IHh5IHx8IHt9XG4gIHR5cGUgPSB0eXBlIHx8ICdwYWdlJ1xuXG4gIHh5LnggPSBwb2ludGVyW3R5cGUgKyAnWCddXG4gIHh5LnkgPSBwb2ludGVyW3R5cGUgKyAnWSddXG5cbiAgcmV0dXJuIHh5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdlWFkgKHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIHwgSW50ZXJhY3QuSW50ZXJhY3RFdmVudCwgcGFnZT86IEludGVyYWN0LlBvaW50KSB7XG4gIHBhZ2UgPSBwYWdlIHx8IHsgeDogMCwgeTogMCB9XG5cbiAgLy8gT3BlcmEgTW9iaWxlIGhhbmRsZXMgdGhlIHZpZXdwb3J0IGFuZCBzY3JvbGxpbmcgb2RkbHlcbiAgaWYgKGJyb3dzZXIuaXNPcGVyYU1vYmlsZSAmJiBpc05hdGl2ZVBvaW50ZXIocG9pbnRlcikpIHtcbiAgICBnZXRYWSgnc2NyZWVuJywgcG9pbnRlciwgcGFnZSlcblxuICAgIHBhZ2UueCArPSB3aW5kb3cuc2Nyb2xsWFxuICAgIHBhZ2UueSArPSB3aW5kb3cuc2Nyb2xsWVxuICB9XG4gIGVsc2Uge1xuICAgIGdldFhZKCdwYWdlJywgcG9pbnRlciwgcGFnZSlcbiAgfVxuXG4gIHJldHVybiBwYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGllbnRYWSAocG9pbnRlciwgY2xpZW50KSB7XG4gIGNsaWVudCA9IGNsaWVudCB8fCB7fVxuXG4gIGlmIChicm93c2VyLmlzT3BlcmFNb2JpbGUgJiYgaXNOYXRpdmVQb2ludGVyKHBvaW50ZXIpKSB7XG4gICAgLy8gT3BlcmEgTW9iaWxlIGhhbmRsZXMgdGhlIHZpZXdwb3J0IGFuZCBzY3JvbGxpbmcgb2RkbHlcbiAgICBnZXRYWSgnc2NyZWVuJywgcG9pbnRlciwgY2xpZW50KVxuICB9XG4gIGVsc2Uge1xuICAgIGdldFhZKCdjbGllbnQnLCBwb2ludGVyLCBjbGllbnQpXG4gIH1cblxuICByZXR1cm4gY2xpZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludGVySWQgKHBvaW50ZXIpIHtcbiAgcmV0dXJuIGlzLm51bWJlcihwb2ludGVyLnBvaW50ZXJJZCkgPyBwb2ludGVyLnBvaW50ZXJJZCA6IHBvaW50ZXIuaWRlbnRpZmllclxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29vcmRzICh0YXJnZXRPYmosIHBvaW50ZXJzOiBhbnlbXSwgdGltZVN0YW1wOiBudW1iZXIpIHtcbiAgY29uc3QgcG9pbnRlciA9IChwb2ludGVycy5sZW5ndGggPiAxXG4gICAgPyBwb2ludGVyQXZlcmFnZShwb2ludGVycylcbiAgICA6IHBvaW50ZXJzWzBdKVxuXG4gIGNvbnN0IHRtcFhZID0ge30gYXMgeyB4OiBudW1iZXIsIHk6IG51bWJlciB9XG5cbiAgZ2V0UGFnZVhZKHBvaW50ZXIsIHRtcFhZKVxuICB0YXJnZXRPYmoucGFnZS54ID0gdG1wWFkueFxuICB0YXJnZXRPYmoucGFnZS55ID0gdG1wWFkueVxuXG4gIGdldENsaWVudFhZKHBvaW50ZXIsIHRtcFhZKVxuICB0YXJnZXRPYmouY2xpZW50LnggPSB0bXBYWS54XG4gIHRhcmdldE9iai5jbGllbnQueSA9IHRtcFhZLnlcblxuICB0YXJnZXRPYmoudGltZVN0YW1wID0gdGltZVN0YW1wXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaFBhaXIgKGV2ZW50KSB7XG4gIGNvbnN0IHRvdWNoZXMgPSBbXVxuXG4gIC8vIGFycmF5IG9mIHRvdWNoZXMgaXMgc3VwcGxpZWRcbiAgaWYgKGlzLmFycmF5KGV2ZW50KSkge1xuICAgIHRvdWNoZXNbMF0gPSBldmVudFswXVxuICAgIHRvdWNoZXNbMV0gPSBldmVudFsxXVxuICB9XG4gIC8vIGFuIGV2ZW50XG4gIGVsc2Uge1xuICAgIGlmIChldmVudC50eXBlID09PSAndG91Y2hlbmQnKSB7XG4gICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdG91Y2hlc1swXSA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgICAgdG91Y2hlc1sxXSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0b3VjaGVzWzBdID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgICAgdG91Y2hlc1sxXSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzFdXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdG91Y2hlc1swXSA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgIHRvdWNoZXNbMV0gPSBldmVudC50b3VjaGVzWzFdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdWNoZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50ZXJBdmVyYWdlIChwb2ludGVyczogUG9pbnRlckV2ZW50W10gfCBFdmVudFtdKSB7XG4gIGNvbnN0IGF2ZXJhZ2UgPSB7XG4gICAgcGFnZVggIDogMCxcbiAgICBwYWdlWSAgOiAwLFxuICAgIGNsaWVudFg6IDAsXG4gICAgY2xpZW50WTogMCxcbiAgICBzY3JlZW5YOiAwLFxuICAgIHNjcmVlblk6IDAsXG4gIH1cblxuICBmb3IgKGNvbnN0IHBvaW50ZXIgb2YgcG9pbnRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gYXZlcmFnZSkge1xuICAgICAgYXZlcmFnZVtwcm9wXSArPSBwb2ludGVyW3Byb3BdXG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgcHJvcCBpbiBhdmVyYWdlKSB7XG4gICAgYXZlcmFnZVtwcm9wXSAvPSBwb2ludGVycy5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiBhdmVyYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b3VjaEJCb3ggKGV2ZW50OiBFdmVudCB8IEFycmF5PChJbnRlcmFjdC5Qb2ludGVyVHlwZSkgfCBUb3VjaEV2ZW50Pikge1xuICBpZiAoIShldmVudCBhcyBhbnkpLmxlbmd0aCAmJlxuICAgICAgISgoZXZlbnQgYXMgVG91Y2hFdmVudCkudG91Y2hlcyAmJlxuICAgICAgICAoZXZlbnQgYXMgVG91Y2hFdmVudCkudG91Y2hlcy5sZW5ndGggPiAxKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB0b3VjaGVzID0gZ2V0VG91Y2hQYWlyKGV2ZW50KVxuICBjb25zdCBtaW5YID0gTWF0aC5taW4odG91Y2hlc1swXS5wYWdlWCwgdG91Y2hlc1sxXS5wYWdlWClcbiAgY29uc3QgbWluWSA9IE1hdGgubWluKHRvdWNoZXNbMF0ucGFnZVksIHRvdWNoZXNbMV0ucGFnZVkpXG4gIGNvbnN0IG1heFggPSBNYXRoLm1heCh0b3VjaGVzWzBdLnBhZ2VYLCB0b3VjaGVzWzFdLnBhZ2VYKVxuICBjb25zdCBtYXhZID0gTWF0aC5tYXgodG91Y2hlc1swXS5wYWdlWSwgdG91Y2hlc1sxXS5wYWdlWSlcblxuICByZXR1cm4ge1xuICAgIHg6IG1pblgsXG4gICAgeTogbWluWSxcbiAgICBsZWZ0OiBtaW5YLFxuICAgIHRvcDogbWluWSxcbiAgICByaWdodDogbWF4WCxcbiAgICBib3R0b206IG1heFksXG4gICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoRGlzdGFuY2UgKGV2ZW50LCBkZWx0YVNvdXJjZSkge1xuICBjb25zdCBzb3VyY2VYID0gZGVsdGFTb3VyY2UgKyAnWCdcbiAgY29uc3Qgc291cmNlWSA9IGRlbHRhU291cmNlICsgJ1knXG4gIGNvbnN0IHRvdWNoZXMgPSBnZXRUb3VjaFBhaXIoZXZlbnQpXG5cbiAgY29uc3QgZHggPSB0b3VjaGVzWzBdW3NvdXJjZVhdIC0gdG91Y2hlc1sxXVtzb3VyY2VYXVxuICBjb25zdCBkeSA9IHRvdWNoZXNbMF1bc291cmNlWV0gLSB0b3VjaGVzWzFdW3NvdXJjZVldXG5cbiAgcmV0dXJuIGh5cG90KGR4LCBkeSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoQW5nbGUgKGV2ZW50LCBkZWx0YVNvdXJjZSkge1xuICBjb25zdCBzb3VyY2VYID0gZGVsdGFTb3VyY2UgKyAnWCdcbiAgY29uc3Qgc291cmNlWSA9IGRlbHRhU291cmNlICsgJ1knXG4gIGNvbnN0IHRvdWNoZXMgPSBnZXRUb3VjaFBhaXIoZXZlbnQpXG4gIGNvbnN0IGR4ID0gdG91Y2hlc1sxXVtzb3VyY2VYXSAtIHRvdWNoZXNbMF1bc291cmNlWF1cbiAgY29uc3QgZHkgPSB0b3VjaGVzWzFdW3NvdXJjZVldIC0gdG91Y2hlc1swXVtzb3VyY2VZXVxuICBjb25zdCBhbmdsZSA9IDE4MCAqIE1hdGguYXRhbjIoZHksIGR4KSAvIE1hdGguUElcblxuICByZXR1cm4gIGFuZ2xlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludGVyVHlwZSAocG9pbnRlcikge1xuICByZXR1cm4gaXMuc3RyaW5nKHBvaW50ZXIucG9pbnRlclR5cGUpXG4gICAgPyBwb2ludGVyLnBvaW50ZXJUeXBlXG4gICAgOiBpcy5udW1iZXIocG9pbnRlci5wb2ludGVyVHlwZSlcbiAgICAgID8gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAndG91Y2gnLCAncGVuJywgJ21vdXNlJ11bcG9pbnRlci5wb2ludGVyVHlwZV1cbiAgICAgIC8vIGlmIHRoZSBQb2ludGVyRXZlbnQgQVBJIGlzbid0IGF2YWlsYWJsZSwgdGhlbiB0aGUgXCJwb2ludGVyXCIgbXVzdFxuICAgICAgLy8gYmUgZWl0aGVyIGEgTW91c2VFdmVudCwgVG91Y2hFdmVudCwgb3IgVG91Y2ggb2JqZWN0XG4gICAgICA6IC90b3VjaC8udGVzdChwb2ludGVyLnR5cGUpIHx8IHBvaW50ZXIgaW5zdGFuY2VvZiBkb20uVG91Y2hcbiAgICAgICAgPyAndG91Y2gnXG4gICAgICAgIDogJ21vdXNlJ1xufVxuXG4vLyBbIGV2ZW50LnRhcmdldCwgZXZlbnQuY3VycmVudFRhcmdldCBdXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXRzIChldmVudCkge1xuICBjb25zdCBwYXRoID0gaXMuZnVuYyhldmVudC5jb21wb3NlZFBhdGgpID8gZXZlbnQuY29tcG9zZWRQYXRoKCkgOiBldmVudC5wYXRoXG5cbiAgcmV0dXJuIFtcbiAgICBkb21VdGlscy5nZXRBY3R1YWxFbGVtZW50KHBhdGggPyBwYXRoWzBdIDogZXZlbnQudGFyZ2V0KSxcbiAgICBkb21VdGlscy5nZXRBY3R1YWxFbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQpLFxuICBdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdDb29yZHMgKCk6IEludGVyYWN0LkNvb3Jkc1NldE1lbWJlciB7XG4gIHJldHVybiB7XG4gICAgcGFnZSAgICAgOiB7IHg6IDAsIHk6IDAgfSxcbiAgICBjbGllbnQgICA6IHsgeDogMCwgeTogMCB9LFxuICAgIHRpbWVTdGFtcDogMCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29vcmRzVG9FdmVudCAoY29vcmRzOiBNb2NrQ29vcmRzKSB7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIGNvb3JkcyxcbiAgICBnZXQgcGFnZSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5wYWdlIH0sXG4gICAgZ2V0IGNsaWVudCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5jbGllbnQgfSxcbiAgICBnZXQgdGltZVN0YW1wICgpIHsgcmV0dXJuIHRoaXMuY29vcmRzLnRpbWVTdGFtcCB9LFxuICAgIGdldCBwYWdlWCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5wYWdlLnggfSxcbiAgICBnZXQgcGFnZVkgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMucGFnZS55IH0sXG4gICAgZ2V0IGNsaWVudFggKCkgeyByZXR1cm4gdGhpcy5jb29yZHMuY2xpZW50LnggfSxcbiAgICBnZXQgY2xpZW50WSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5jbGllbnQueSB9LFxuICAgIGdldCBwb2ludGVySWQgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMucG9pbnRlcklkIH0sXG4gICAgZ2V0IHRhcmdldCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy50YXJnZXQgfSxcbiAgICBnZXQgdHlwZSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy50eXBlIH0sXG4gICAgZ2V0IHBvaW50ZXJUeXBlICgpIHsgcmV0dXJuIHRoaXMuY29vcmRzLnBvaW50ZXJUeXBlIH0sXG4gICAgZ2V0IGJ1dHRvbnMgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMuYnV0dG9ucyB9LFxuICAgIHByZXZlbnREZWZhdWx0ICgpIHt9LFxuICB9XG5cbiAgcmV0dXJuIGV2ZW50IGFzIHR5cGVvZiBldmVudCAmIEludGVyYWN0LlBvaW50ZXJUeXBlICYgSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vY2tDb29yZHMge1xuICBwYWdlOiBJbnRlcmFjdC5Qb2ludFxuICBjbGllbnQ6IEludGVyYWN0LlBvaW50XG4gIHRpbWVTdGFtcD86IG51bWJlclxuICBwb2ludGVySWQ/OiBhbnlcbiAgdGFyZ2V0PzogYW55XG4gIHR5cGU/OiBzdHJpbmdcbiAgcG9pbnRlclR5cGU/OiBzdHJpbmdcbiAgYnV0dG9ucz86IG51bWJlclxufVxuXG5leHBvcnQgeyBwb2ludGVyRXh0ZW5kIH1cbiIsImltcG9ydCB7IGNvbnRhaW5zIH0gZnJvbSAnLi9hcnInXG5pbXBvcnQgKiBhcyBkb21VdGlscyBmcm9tICcuL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCBwRXh0ZW5kIGZyb20gJy4vcG9pbnRlckV4dGVuZCdcbmltcG9ydCAqIGFzIHBvaW50ZXJVdGlscyBmcm9tICcuL3BvaW50ZXJVdGlscydcblxudHlwZSBMaXN0ZW5lciA9IChldmVudDogRXZlbnQgfCBGYWtlRXZlbnQpID0+IGFueVxuXG5jb25zdCBlbGVtZW50czogRXZlbnRUYXJnZXRbXSA9IFtdXG5jb25zdCB0YXJnZXRzOiBBcnJheTx7XG4gIGV2ZW50czogeyBbdHlwZTogc3RyaW5nXTogTGlzdGVuZXJbXSB9XG4gIHR5cGVDb3VudDogbnVtYmVyXG59PiA9IFtdXG5cbmNvbnN0IGRlbGVnYXRlZEV2ZW50czoge1xuICBbdHlwZTogc3RyaW5nXToge1xuICAgIHNlbGVjdG9yczogc3RyaW5nW11cbiAgICBjb250ZXh0czogTm9kZVtdXG4gICAgbGlzdGVuZXJzOiBBcnJheTxBcnJheTxbTGlzdGVuZXIsIGJvb2xlYW4sIGJvb2xlYW5dPj5cbiAgfVxufSA9IHt9XG5jb25zdCBkb2N1bWVudHM6IERvY3VtZW50W10gPSBbXVxuXG5mdW5jdGlvbiBhZGQgKGVsZW1lbnQ6IEV2ZW50VGFyZ2V0LCB0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgb3B0aW9uYWxBcmc/OiBib29sZWFuIHwgYW55KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbmFsQXJnKVxuICBsZXQgZWxlbWVudEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KVxuICBsZXQgdGFyZ2V0ID0gdGFyZ2V0c1tlbGVtZW50SW5kZXhdXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0YXJnZXQgPSB7XG4gICAgICBldmVudHM6IHt9LFxuICAgICAgdHlwZUNvdW50OiAwLFxuICAgIH1cblxuICAgIGVsZW1lbnRJbmRleCA9IGVsZW1lbnRzLnB1c2goZWxlbWVudCkgLSAxXG4gICAgdGFyZ2V0cy5wdXNoKHRhcmdldClcbiAgfVxuXG4gIGlmICghdGFyZ2V0LmV2ZW50c1t0eXBlXSkge1xuICAgIHRhcmdldC5ldmVudHNbdHlwZV0gPSBbXVxuICAgIHRhcmdldC50eXBlQ291bnQrK1xuICB9XG5cbiAgaWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciAmJiAhY29udGFpbnModGFyZ2V0LmV2ZW50c1t0eXBlXSwgbGlzdGVuZXIpKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyIGFzIGFueSwgZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZSlcbiAgICB0YXJnZXQuZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlIChlbGVtZW50OiBFdmVudFRhcmdldCwgdHlwZTogc3RyaW5nLCBsaXN0ZW5lcj86ICdhbGwnIHwgTGlzdGVuZXIsIG9wdGlvbmFsQXJnPzogYm9vbGVhbiB8IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgY29uc3QgZWxlbWVudEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KVxuICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzW2VsZW1lbnRJbmRleF1cblxuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmV2ZW50cykge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdhbGwnKSB7XG4gICAgZm9yICh0eXBlIGluIHRhcmdldC5ldmVudHMpIHtcbiAgICAgIGlmICh0YXJnZXQuZXZlbnRzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICAgIHJlbW92ZShlbGVtZW50LCB0eXBlLCAnYWxsJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGFyZ2V0LmV2ZW50c1t0eXBlXSkge1xuICAgIGNvbnN0IGxlbiA9IHRhcmdldC5ldmVudHNbdHlwZV0ubGVuZ3RoXG5cbiAgICBpZiAobGlzdGVuZXIgPT09ICdhbGwnKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHJlbW92ZShlbGVtZW50LCB0eXBlLCB0YXJnZXQuZXZlbnRzW3R5cGVdW2ldLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyICYmIHRhcmdldC5ldmVudHNbdHlwZV1baV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyIGFzIGFueSwgZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICB0YXJnZXQuZXZlbnRzW3R5cGVdLnNwbGljZShpLCAxKVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YXJnZXQuZXZlbnRzW3R5cGVdICYmIHRhcmdldC5ldmVudHNbdHlwZV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAodGFyZ2V0LmV2ZW50c1t0eXBlXSBhcyBhbnkpID0gbnVsbFxuICAgICAgdGFyZ2V0LnR5cGVDb3VudC0tXG4gICAgfVxuICB9XG5cbiAgaWYgKCF0YXJnZXQudHlwZUNvdW50KSB7XG4gICAgdGFyZ2V0cy5zcGxpY2UoZWxlbWVudEluZGV4LCAxKVxuICAgIGVsZW1lbnRzLnNwbGljZShlbGVtZW50SW5kZXgsIDEpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGVsZWdhdGUgKHNlbGVjdG9yOiBzdHJpbmcsIGNvbnRleHQ6IE5vZGUsIHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IExpc3RlbmVyLCBvcHRpb25hbEFyZz86IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgaWYgKCFkZWxlZ2F0ZWRFdmVudHNbdHlwZV0pIHtcbiAgICBkZWxlZ2F0ZWRFdmVudHNbdHlwZV0gPSB7XG4gICAgICBjb250ZXh0cyA6IFtdLFxuICAgICAgbGlzdGVuZXJzOiBbXSxcbiAgICAgIHNlbGVjdG9yczogW10sXG4gICAgfVxuXG4gICAgLy8gYWRkIGRlbGVnYXRlIGxpc3RlbmVyIGZ1bmN0aW9uc1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3VtZW50cykge1xuICAgICAgYWRkKGRvYywgdHlwZSwgZGVsZWdhdGVMaXN0ZW5lcilcbiAgICAgIGFkZChkb2MsIHR5cGUsIGRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWxlZ2F0ZWQgPSBkZWxlZ2F0ZWRFdmVudHNbdHlwZV1cbiAgbGV0IGluZGV4XG5cbiAgZm9yIChpbmRleCA9IGRlbGVnYXRlZC5zZWxlY3RvcnMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzW2luZGV4XSA9PT0gc2VsZWN0b3IgJiZcbiAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzW2luZGV4XSA9PT0gY29udGV4dCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgaW5kZXggPSBkZWxlZ2F0ZWQuc2VsZWN0b3JzLmxlbmd0aFxuXG4gICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5wdXNoKHNlbGVjdG9yKVxuICAgIGRlbGVnYXRlZC5jb250ZXh0cy5wdXNoKGNvbnRleHQpXG4gICAgZGVsZWdhdGVkLmxpc3RlbmVycy5wdXNoKFtdKVxuICB9XG5cbiAgLy8ga2VlcCBsaXN0ZW5lciBhbmQgY2FwdHVyZSBhbmQgcGFzc2l2ZSBmbGFnc1xuICBkZWxlZ2F0ZWQubGlzdGVuZXJzW2luZGV4XS5wdXNoKFtsaXN0ZW5lciwgISFvcHRpb25zLmNhcHR1cmUsIG9wdGlvbnMucGFzc2l2ZV0pXG59XG5cbmZ1bmN0aW9uIHJlbW92ZURlbGVnYXRlIChcbiAgc2VsZWN0b3I6IHN0cmluZyxcbiAgY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50LFxuICB0eXBlOiBzdHJpbmcsXG4gIGxpc3RlbmVyPzogTGlzdGVuZXIsXG4gIG9wdGlvbmFsQXJnPzogYW55LFxuKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbmFsQXJnKVxuICBjb25zdCBkZWxlZ2F0ZWQgPSBkZWxlZ2F0ZWRFdmVudHNbdHlwZV1cbiAgbGV0IG1hdGNoRm91bmQgPSBmYWxzZVxuICBsZXQgaW5kZXhcblxuICBpZiAoIWRlbGVnYXRlZCkgeyByZXR1cm4gfVxuXG4gIC8vIGNvdW50IGZyb20gbGFzdCBpbmRleCBvZiBkZWxlZ2F0ZWQgdG8gMFxuICBmb3IgKGluZGV4ID0gZGVsZWdhdGVkLnNlbGVjdG9ycy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgLy8gbG9vayBmb3IgbWF0Y2hpbmcgc2VsZWN0b3IgYW5kIGNvbnRleHQgTm9kZVxuICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzW2luZGV4XSA9PT0gc2VsZWN0b3IgJiZcbiAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzW2luZGV4XSA9PT0gY29udGV4dCkge1xuICAgICAgY29uc3QgbGlzdGVuZXJzID0gZGVsZWdhdGVkLmxpc3RlbmVyc1tpbmRleF1cblxuICAgICAgLy8gZWFjaCBpdGVtIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkgaXMgYW4gYXJyYXk6IFtmdW5jdGlvbiwgY2FwdHVyZSwgcGFzc2l2ZV1cbiAgICAgIGZvciAobGV0IGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgW2ZuLCBjYXB0dXJlLCBwYXNzaXZlXSA9IGxpc3RlbmVyc1tpXVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBsaXN0ZW5lciBmdW5jdGlvbnMgYW5kIGNhcHR1cmUgYW5kIHBhc3NpdmUgZmxhZ3MgbWF0Y2hcbiAgICAgICAgaWYgKGZuID09PSBsaXN0ZW5lciAmJiBjYXB0dXJlID09PSAhIW9wdGlvbnMuY2FwdHVyZSAmJiBwYXNzaXZlID09PSBvcHRpb25zLnBhc3NpdmUpIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGFycmF5IG9mIGxpc3RlbmVyc1xuICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSlcblxuICAgICAgICAgIC8vIGlmIGFsbCBsaXN0ZW5lcnMgZm9yIHRoaXMgaW50ZXJhY3RhYmxlIGhhdmUgYmVlbiByZW1vdmVkXG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBpbnRlcmFjdGFibGUgZnJvbSB0aGUgZGVsZWdhdGVkIGFycmF5c1xuICAgICAgICAgIGlmICghbGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICBkZWxlZ2F0ZWQuY29udGV4dHMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgZGVsZWdhdGVkLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpXG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBkZWxlZ2F0ZSBmdW5jdGlvbiBmcm9tIGNvbnRleHRcbiAgICAgICAgICAgIHJlbW92ZShjb250ZXh0LCB0eXBlLCBkZWxlZ2F0ZUxpc3RlbmVyKVxuICAgICAgICAgICAgcmVtb3ZlKGNvbnRleHQsIHR5cGUsIGRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBhcnJheXMgaWYgdGhleSBhcmUgZW1wdHlcbiAgICAgICAgICAgIGlmICghZGVsZWdhdGVkLnNlbGVjdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZGVsZWdhdGVkRXZlbnRzW3R5cGVdID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG9ubHkgcmVtb3ZlIG9uZSBsaXN0ZW5lclxuICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hGb3VuZCkgeyBicmVhayB9XG4gICAgfVxuICB9XG59XG5cbi8vIGJvdW5kIHRvIHRoZSBpbnRlcmFjdGFibGUgY29udGV4dCB3aGVuIGEgRE9NIGV2ZW50XG4vLyBsaXN0ZW5lciBpcyBhZGRlZCB0byBhIHNlbGVjdG9yIGludGVyYWN0YWJsZVxuZnVuY3Rpb24gZGVsZWdhdGVMaXN0ZW5lciAoZXZlbnQ6IEV2ZW50LCBvcHRpb25hbEFyZz86IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgY29uc3QgZmFrZUV2ZW50ID0gbmV3IEZha2VFdmVudChldmVudClcbiAgY29uc3QgZGVsZWdhdGVkID0gZGVsZWdhdGVkRXZlbnRzW2V2ZW50LnR5cGVdXG4gIGNvbnN0IFtldmVudFRhcmdldF0gPSAocG9pbnRlclV0aWxzLmdldEV2ZW50VGFyZ2V0cyhldmVudCkpXG4gIGxldCBlbGVtZW50OiBOb2RlID0gZXZlbnRUYXJnZXRcblxuICAvLyBjbGltYiB1cCBkb2N1bWVudCB0cmVlIGxvb2tpbmcgZm9yIHNlbGVjdG9yIG1hdGNoZXNcbiAgd2hpbGUgKGlzLmVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbGVnYXRlZC5zZWxlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gZGVsZWdhdGVkLnNlbGVjdG9yc1tpXVxuICAgICAgY29uc3QgY29udGV4dCA9IGRlbGVnYXRlZC5jb250ZXh0c1tpXVxuXG4gICAgICBpZiAoZG9tVXRpbHMubWF0Y2hlc1NlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKSAmJlxuICAgICAgICAgIGRvbVV0aWxzLm5vZGVDb250YWlucyhjb250ZXh0LCBldmVudFRhcmdldCkgJiZcbiAgICAgICAgICBkb21VdGlscy5ub2RlQ29udGFpbnMoY29udGV4dCwgZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZGVsZWdhdGVkLmxpc3RlbmVyc1tpXVxuXG4gICAgICAgIGZha2VFdmVudC5jdXJyZW50VGFyZ2V0ID0gZWxlbWVudFxuXG4gICAgICAgIGZvciAoY29uc3QgW2ZuLCBjYXB0dXJlLCBwYXNzaXZlXSBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICBpZiAoY2FwdHVyZSA9PT0gISFvcHRpb25zLmNhcHR1cmUgJiYgcGFzc2l2ZSA9PT0gb3B0aW9ucy5wYXNzaXZlKSB7XG4gICAgICAgICAgICBmbihmYWtlRXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGRvbVV0aWxzLnBhcmVudE5vZGUoZWxlbWVudClcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxlZ2F0ZVVzZUNhcHR1cmUgKGV2ZW50OiBFdmVudCkge1xuICByZXR1cm4gZGVsZWdhdGVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50LCB0cnVlKVxufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zIChwYXJhbTogb2JqZWN0KSB7XG4gIHJldHVybiBpcy5vYmplY3QocGFyYW0pID8gcGFyYW0gOiB7IGNhcHR1cmU6IHBhcmFtIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZha2VFdmVudCBpbXBsZW1lbnRzIFBhcnRpYWw8RXZlbnQ+IHtcbiAgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXRcblxuICBjb25zdHJ1Y3RvciAocHVibGljIG9yaWdpbmFsRXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZHVwbGljYXRlIHRoZSBldmVudCBzbyB0aGF0IGN1cnJlbnRUYXJnZXQgY2FuIGJlIGNoYW5nZWRcbiAgICBwRXh0ZW5kKHRoaXMsIG9yaWdpbmFsRXZlbnQpXG4gIH1cblxuICBwcmV2ZW50T3JpZ2luYWxEZWZhdWx0ICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgc3RvcFByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgfVxuXG4gIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiAoKSB7XG4gICAgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gIH1cbn1cblxuY29uc3QgZXZlbnRzID0ge1xuICBhZGQsXG4gIHJlbW92ZSxcblxuICBhZGREZWxlZ2F0ZSxcbiAgcmVtb3ZlRGVsZWdhdGUsXG5cbiAgZGVsZWdhdGVMaXN0ZW5lcixcbiAgZGVsZWdhdGVVc2VDYXB0dXJlLFxuICBkZWxlZ2F0ZWRFdmVudHMsXG4gIGRvY3VtZW50cyxcblxuICBzdXBwb3J0c09wdGlvbnM6IGZhbHNlLFxuICBzdXBwb3J0c1Bhc3NpdmU6IGZhbHNlLFxuXG4gIF9lbGVtZW50czogZWxlbWVudHMsXG4gIF90YXJnZXRzOiB0YXJnZXRzLFxuXG4gIGluaXQgKHdpbmRvdzogV2luZG93KSB7XG4gICAgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCB7XG4gICAgICBnZXQgY2FwdHVyZSAoKSB7IHJldHVybiAoZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA9IHRydWUpIH0sXG4gICAgICBnZXQgcGFzc2l2ZSAoKSB7IHJldHVybiAoZXZlbnRzLnN1cHBvcnRzUGFzc2l2ZSA9IHRydWUpIH0sXG4gICAgfSlcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXZlbnRzXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRlbmQ8VCwgVSBleHRlbmRzIG9iamVjdD4gKGRlc3Q6IFUgJiBQYXJ0aWFsPFQ+LCBzb3VyY2U6IFQpOiBUICYgVSB7XG4gIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAoZGVzdCBhcyB1bmtub3duIGFzIFQpW3Byb3BdID0gc291cmNlW3Byb3BdXG4gIH1cblxuICBjb25zdCByZXQgPSBkZXN0IGFzIFQgJiBVXG5cbiAgcmV0dXJuIHJldFxufVxuIiwiaW1wb3J0IGV4dGVuZCBmcm9tICcuL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZExpc3RlbmVycyB7XG4gIFt0eXBlOiBzdHJpbmddOiBJbnRlcmFjdC5MaXN0ZW5lcltdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZSAoXG4gIHR5cGU6IEludGVyYWN0LkV2ZW50VHlwZXMsXG4gIGxpc3RlbmVycz86IEludGVyYWN0Lkxpc3RlbmVyc0FyZyB8IEludGVyYWN0Lkxpc3RlbmVyc0FyZ1tdLFxuICByZXN1bHQ/OiBOb3JtYWxpemVkTGlzdGVuZXJzLFxuKTogTm9ybWFsaXplZExpc3RlbmVycyB7XG4gIHJlc3VsdCA9IHJlc3VsdCB8fCB7fVxuXG4gIGlmIChpcy5zdHJpbmcodHlwZSkgJiYgdHlwZS5zZWFyY2goJyAnKSAhPT0gLTEpIHtcbiAgICB0eXBlID0gc3BsaXQodHlwZSlcbiAgfVxuXG4gIGlmIChpcy5hcnJheSh0eXBlKSkge1xuICAgIHJldHVybiB0eXBlLnJlZHVjZTxOb3JtYWxpemVkTGlzdGVuZXJzPihcbiAgICAgIChhY2MsIHQpID0+IGV4dGVuZChhY2MsIG5vcm1hbGl6ZSh0LCBsaXN0ZW5lcnMsIHJlc3VsdCkpLFxuICAgICAgcmVzdWx0LFxuICAgIClcbiAgfVxuXG4gIC8vICh7IHR5cGU6IGZuIH0pIC0+ICgnJywgeyB0eXBlOiBmbiB9KVxuICBpZiAoaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgbGlzdGVuZXJzID0gdHlwZVxuICAgIHR5cGUgPSAnJ1xuICB9XG5cbiAgaWYgKGlzLmZ1bmMobGlzdGVuZXJzKSkge1xuICAgIHJlc3VsdFt0eXBlXSA9IHJlc3VsdFt0eXBlXSB8fCBbXVxuICAgIHJlc3VsdFt0eXBlXS5wdXNoKGxpc3RlbmVycylcbiAgfVxuICBlbHNlIGlmIChpcy5hcnJheShsaXN0ZW5lcnMpKSB7XG4gICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgbm9ybWFsaXplKHR5cGUsIGwsIHJlc3VsdClcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAoaXMub2JqZWN0KGxpc3RlbmVycykpIHtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkVHlwZXMgPSBzcGxpdChwcmVmaXgpLm1hcChwID0+IGAke3R5cGV9JHtwfWApXG5cbiAgICAgIG5vcm1hbGl6ZShjb21iaW5lZFR5cGVzLCBsaXN0ZW5lcnNbcHJlZml4XSwgcmVzdWx0KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgYXMgTm9ybWFsaXplZExpc3RlbmVyc1xufVxuXG5mdW5jdGlvbiBzcGxpdCAodHlwZTogc3RyaW5nKSB7XG4gIHJldHVybiB0eXBlLnRyaW0oKS5zcGxpdCgvICsvKVxufVxuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcbmltcG9ydCBleHRlbmQgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IG5vcm1hbGl6ZSwgeyBOb3JtYWxpemVkTGlzdGVuZXJzIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvbm9ybWFsaXplTGlzdGVuZXJzJ1xuXG5mdW5jdGlvbiBmaXJlVW50aWxJbW1lZGlhdGVTdG9wcGVkPFxuICBUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZSxcbiAgUCBleHRlbmRzIEludGVyYWN0LkV2ZW50UGhhc2UsXG4+IChldmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxULCBQPiwgbGlzdGVuZXJzOiBJbnRlcmFjdC5MaXN0ZW5lcltdKSB7XG4gIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgaWYgKGV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCkgeyBicmVhayB9XG5cbiAgICBsaXN0ZW5lcihldmVudClcbiAgfVxufVxuXG5jbGFzcyBFdmVudGFibGUge1xuICBvcHRpb25zOiBhbnlcbiAgdHlwZXM6IE5vcm1hbGl6ZWRMaXN0ZW5lcnMgPSB7fVxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBnbG9iYWw6IGFueVxuXG4gIGNvbnN0cnVjdG9yIChvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zIHx8IHt9KVxuICB9XG5cbiAgZmlyZSAoZXZlbnQ6IGFueSkge1xuICAgIGxldCBsaXN0ZW5lcnNcbiAgICBjb25zdCBnbG9iYWwgPSB0aGlzLmdsb2JhbFxuXG4gICAgLy8gSW50ZXJhY3RhYmxlI29uKCkgbGlzdGVuZXJzXG4gICAgLy8gdHNsaW50OmRpc2FibGUgbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICAgIGlmICgobGlzdGVuZXJzID0gdGhpcy50eXBlc1tldmVudC50eXBlXSkpIHtcbiAgICAgIGZpcmVVbnRpbEltbWVkaWF0ZVN0b3BwZWQoZXZlbnQsIGxpc3RlbmVycylcbiAgICB9XG5cbiAgICAvLyBpbnRlcmFjdC5vbigpIGxpc3RlbmVyc1xuICAgIGlmICghZXZlbnQucHJvcGFnYXRpb25TdG9wcGVkICYmIGdsb2JhbCAmJiAobGlzdGVuZXJzID0gZ2xvYmFsW2V2ZW50LnR5cGVdKSkgIHtcbiAgICAgIGZpcmVVbnRpbEltbWVkaWF0ZVN0b3BwZWQoZXZlbnQsIGxpc3RlbmVycylcbiAgICB9XG4gIH1cblxuICBvbiAodHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogSW50ZXJhY3QuTGlzdGVuZXJzQXJnKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gbm9ybWFsaXplKHR5cGUsIGxpc3RlbmVyKVxuXG4gICAgZm9yICh0eXBlIGluIGxpc3RlbmVycykge1xuICAgICAgdGhpcy50eXBlc1t0eXBlXSA9IGFyci5tZXJnZSh0aGlzLnR5cGVzW3R5cGVdIHx8IFtdLCBsaXN0ZW5lcnNbdHlwZV0pXG4gICAgfVxuICB9XG5cbiAgb2ZmICh0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBJbnRlcmFjdC5MaXN0ZW5lcnNBcmcpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBub3JtYWxpemUodHlwZSwgbGlzdGVuZXIpXG5cbiAgICBmb3IgKHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBjb25zdCBldmVudExpc3QgPSB0aGlzLnR5cGVzW3R5cGVdXG5cbiAgICAgIGlmICghZXZlbnRMaXN0IHx8ICFldmVudExpc3QubGVuZ3RoKSB7IGNvbnRpbnVlIH1cblxuICAgICAgZm9yIChjb25zdCBzdWJMaXN0ZW5lciBvZiBsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBldmVudExpc3QuaW5kZXhPZihzdWJMaXN0ZW5lcilcblxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZXZlbnRMaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJlY3QgKF9lbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KTogSW50ZXJhY3QuUmVjdCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudGFibGVcbiIsImltcG9ydCB7IGNsb3Nlc3QsIGdldEVsZW1lbnRSZWN0LCBwYXJlbnROb2RlIH0gZnJvbSAnLi9kb21VdGlscydcbmltcG9ydCBleHRlbmQgZnJvbSAnLi9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICcuL2lzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nT3B0aW9uUmVzdWx0ICh2YWx1ZTogYW55LCB0YXJnZXQ6IEludGVyYWN0Lkhhc0dldFJlY3QsIGVsZW1lbnQpIHtcbiAgaWYgKHZhbHVlID09PSAncGFyZW50JykgeyByZXR1cm4gcGFyZW50Tm9kZShlbGVtZW50KSB9XG5cbiAgaWYgKHZhbHVlID09PSAnc2VsZicpIHsgcmV0dXJuIHRhcmdldC5nZXRSZWN0KGVsZW1lbnQpIH1cblxuICByZXR1cm4gY2xvc2VzdChlbGVtZW50LCB2YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWN0TGlrZTxUIGV4dGVuZHMgYW55W10+IChcbiAgdmFsdWU6IEludGVyYWN0LlJlY3RSZXNvbHZhYmxlPFQ+LFxuICB0YXJnZXQ/OiBJbnRlcmFjdC5IYXNHZXRSZWN0LFxuICBlbGVtZW50PzogTm9kZSxcbiAgZnVuY3Rpb25BcmdzPzogVCxcbikge1xuICBsZXQgcmV0dXJuVmFsdWU6IGFueSA9IHZhbHVlXG4gIGlmIChpcy5zdHJpbmcocmV0dXJuVmFsdWUpKSB7XG4gICAgcmV0dXJuVmFsdWUgPSBnZXRTdHJpbmdPcHRpb25SZXN1bHQocmV0dXJuVmFsdWUsIHRhcmdldCwgZWxlbWVudClcbiAgfVxuICBlbHNlIGlmIChpcy5mdW5jKHJldHVyblZhbHVlKSkge1xuICAgIHJldHVyblZhbHVlID0gcmV0dXJuVmFsdWUoLi4uZnVuY3Rpb25BcmdzKVxuICB9XG5cbiAgaWYgKGlzLmVsZW1lbnQocmV0dXJuVmFsdWUpKSB7XG4gICAgcmV0dXJuVmFsdWUgPSBnZXRFbGVtZW50UmVjdChyZXR1cm5WYWx1ZSlcbiAgfVxuXG4gIHJldHVybiByZXR1cm5WYWx1ZSBhcyBJbnRlcmFjdC5SZWN0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWN0VG9YWSAocmVjdCkge1xuICByZXR1cm4gIHJlY3QgJiYge1xuICAgIHg6ICd4JyBpbiByZWN0ID8gcmVjdC54IDogcmVjdC5sZWZ0LFxuICAgIHk6ICd5JyBpbiByZWN0ID8gcmVjdC55IDogcmVjdC50b3AsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHh5d2hUb1RsYnIgKHJlY3QpIHtcbiAgaWYgKHJlY3QgJiYgISgnbGVmdCcgaW4gcmVjdCAmJiAndG9wJyBpbiByZWN0KSkge1xuICAgIHJlY3QgPSBleHRlbmQoe30sIHJlY3QpXG5cbiAgICByZWN0LmxlZnQgICA9IHJlY3QueCB8fCAwXG4gICAgcmVjdC50b3AgICAgPSByZWN0LnkgfHwgMFxuICAgIHJlY3QucmlnaHQgID0gcmVjdC5yaWdodCAgIHx8IChyZWN0LmxlZnQgKyByZWN0LndpZHRoKVxuICAgIHJlY3QuYm90dG9tID0gcmVjdC5ib3R0b20gIHx8IChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0KVxuICB9XG5cbiAgcmV0dXJuIHJlY3Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRsYnJUb1h5d2ggKHJlY3QpIHtcbiAgaWYgKHJlY3QgJiYgISgneCcgaW4gcmVjdCAmJiAneScgaW4gcmVjdCkpIHtcbiAgICByZWN0ID0gZXh0ZW5kKHt9LCByZWN0KVxuXG4gICAgcmVjdC54ICAgICAgPSByZWN0LmxlZnQgfHwgMFxuICAgIHJlY3QueSAgICAgID0gcmVjdC50b3AgIHx8IDBcbiAgICByZWN0LndpZHRoICA9IHJlY3Qud2lkdGggIHx8IChyZWN0LnJpZ2h0IHx8IDAgIC0gcmVjdC54KVxuICAgIHJlY3QuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgfHwgKHJlY3QuYm90dG9tIHx8IDAgLSByZWN0LnkpXG4gIH1cblxuICByZXR1cm4gcmVjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRWRnZXMgKGVkZ2VzOiBJbnRlcmFjdC5FZGdlT3B0aW9ucywgcmVjdDogSW50ZXJhY3QuUmVjdCwgZGVsdGE6IEludGVyYWN0LlBvaW50KSB7XG4gIGlmIChlZGdlcy5sZWZ0KSAgIHsgcmVjdC5sZWZ0ICAgKz0gZGVsdGEueCB9XG4gIGlmIChlZGdlcy5yaWdodCkgIHsgcmVjdC5yaWdodCAgKz0gZGVsdGEueCB9XG4gIGlmIChlZGdlcy50b3ApICAgIHsgcmVjdC50b3AgICAgKz0gZGVsdGEueSB9XG4gIGlmIChlZGdlcy5ib3R0b20pIHsgcmVjdC5ib3R0b20gKz0gZGVsdGEueSB9XG5cbiAgcmVjdC53aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnRcbiAgcmVjdC5oZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG59XG4iLCJpbXBvcnQgeyByZWN0VG9YWSwgcmVzb2x2ZVJlY3RMaWtlIH0gZnJvbSAnLi9yZWN0J1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoXG4gIHRhcmdldDogSW50ZXJhY3QuSGFzR2V0UmVjdCAmIHsgb3B0aW9uczogSW50ZXJhY3QuUGVyQWN0aW9uRGVmYXVsdHMgfSxcbiAgZWxlbWVudDogTm9kZSxcbiAgYWN0aW9uTmFtZT86IEludGVyYWN0LkFjdGlvbk5hbWUsXG4pIHtcbiAgY29uc3QgYWN0aW9uT3B0aW9ucyA9ICh0YXJnZXQub3B0aW9ucyBhcyBhbnkpW2FjdGlvbk5hbWVdXG4gIGNvbnN0IGFjdGlvbk9yaWdpbiA9IGFjdGlvbk9wdGlvbnMgJiYgYWN0aW9uT3B0aW9ucy5vcmlnaW5cbiAgY29uc3Qgb3JpZ2luID0gYWN0aW9uT3JpZ2luIHx8IHRhcmdldC5vcHRpb25zLm9yaWdpblxuXG4gIGNvbnN0IG9yaWdpblJlY3QgPSByZXNvbHZlUmVjdExpa2Uob3JpZ2luLCB0YXJnZXQsIGVsZW1lbnQsIFt0YXJnZXQgJiYgZWxlbWVudF0pXG5cbiAgcmV0dXJuIHJlY3RUb1hZKG9yaWdpblJlY3QpIHx8IHsgeDogMCwgeTogMCB9XG59XG4iLCJsZXQgbGFzdFRpbWUgPSAwXG5sZXQgcmVxdWVzdFxubGV0IGNhbmNlbFxuXG5mdW5jdGlvbiBpbml0ICh3aW5kb3cpIHtcbiAgcmVxdWVzdCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lXG5cbiAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgY29uc3QgdmVuZG9ycyA9IFsnbXMnLCAnbW96JywgJ3dlYmtpdCcsICdvJ11cblxuICAgIGZvciAoY29uc3QgdmVuZG9yIG9mIHZlbmRvcnMpIHtcbiAgICAgIHJlcXVlc3QgPSB3aW5kb3dbYCR7dmVuZG9yfVJlcXVlc3RBbmltYXRpb25GcmFtZWBdXG4gICAgICBjYW5jZWwgPSB3aW5kb3dbYCR7dmVuZG9yfUNhbmNlbEFuaW1hdGlvbkZyYW1lYF0gfHwgd2luZG93W2Ake3ZlbmRvcn1DYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWVgXVxuICAgIH1cbiAgfVxuXG4gIGlmICghcmVxdWVzdCkge1xuICAgIHJlcXVlc3QgPSBjYWxsYmFjayA9PiB7XG4gICAgICBjb25zdCBjdXJyVGltZSA9IERhdGUubm93KClcbiAgICAgIGNvbnN0IHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdGFuZGFyZC9uby1jYWxsYmFjay1saXRlcmFsXG4gICAgICBjb25zdCB0b2tlbiA9IHNldFRpbWVvdXQoKCkgPT4geyBjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpIH0sXG4gICAgICAgIHRpbWVUb0NhbGwpXG5cbiAgICAgIGxhc3RUaW1lID0gY3VyclRpbWUgKyB0aW1lVG9DYWxsXG4gICAgICByZXR1cm4gdG9rZW5cbiAgICB9XG5cbiAgICBjYW5jZWwgPSB0b2tlbiA9PiBjbGVhclRpbWVvdXQodG9rZW4pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICByZXF1ZXN0OiBjYWxsYmFjayA9PiByZXF1ZXN0KGNhbGxiYWNrKSxcbiAgY2FuY2VsOiB0b2tlbiA9PiBjYW5jZWwodG9rZW4pLFxuICBpbml0LFxufVxuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJy4vYXJyJ1xuaW1wb3J0ICogYXMgZG9tIGZyb20gJy4vZG9tVXRpbHMnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICcuL2lzJ1xuaW1wb3J0ICogYXMgcG9pbnRlciBmcm9tICcuL3BvaW50ZXJVdGlscydcbmltcG9ydCAqIGFzIHJlY3QgZnJvbSAnLi9yZWN0J1xuaW1wb3J0IHdpbiBmcm9tICcuL3dpbmRvdydcblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PbmNlPFQ+ICh0aGlzOiBULCBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgbGV0IHdhcm5lZCA9IGZhbHNlXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICByZXR1cm4gZnVuY3Rpb24gKHRoaXM6IFQpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgKHdpbiBhcyBhbnkpLndpbmRvdy5jb25zb2xlLndhcm4obWVzc2FnZSlcbiAgICAgIHdhcm5lZCA9IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUFjdGlvbiAoZGVzdDogSW50ZXJhY3QuQWN0aW9uUHJvcHMsIHNyYzogSW50ZXJhY3QuQWN0aW9uUHJvcHMpIHtcbiAgZGVzdC5uYW1lICA9IHNyYy5uYW1lXG4gIGRlc3QuYXhpcyAgPSBzcmMuYXhpc1xuICBkZXN0LmVkZ2VzID0gc3JjLmVkZ2VzXG5cbiAgcmV0dXJuIGRlc3Rcbn1cblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBicm93c2VyIH0gZnJvbSAnLi9icm93c2VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGV2ZW50cyB9IGZyb20gJy4vZXZlbnRzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBleHRlbmQgfSBmcm9tICcuL2V4dGVuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0T3JpZ2luWFkgfSBmcm9tICcuL2dldE9yaWdpblhZJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoeXBvdCB9IGZyb20gJy4vaHlwb3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vcm1hbGl6ZUxpc3RlbmVycyB9IGZyb20gJy4vbm9ybWFsaXplTGlzdGVuZXJzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByYWYgfSBmcm9tICcuL3JhZidcbmV4cG9ydCB7IHdpbiwgYXJyLCBkb20sIGlzLCBwb2ludGVyLCByZWN0IH1cbiIsIi8vIHRzbGludDpkaXNhYmxlIG5vLWVtcHR5LWludGVyZmFjZVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRzIHtcbiAgYmFzZTogQmFzZURlZmF1bHRzXG4gIHBlckFjdGlvbjogUGVyQWN0aW9uRGVmYXVsdHNcbiAgYWN0aW9uczogQWN0aW9uRGVmYXVsdHNcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VEZWZhdWx0cyB7XG4gIHByZXZlbnREZWZhdWx0PzogJ2F1dG8nIHwgJ25ldmVyJyB8IHN0cmluZ1xuICBkZWx0YVNvdXJjZT86ICdwYWdlJyB8ICdjbGllbnQnXG4gIGNvbnRleHQ/OiBJbnRlcmFjdC5FdmVudFRhcmdldFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlckFjdGlvbkRlZmF1bHRzIHtcbiAgZW5hYmxlZD86IGJvb2xlYW5cbiAgb3JpZ2luPzogSW50ZXJhY3QuUG9pbnQgfCBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGxpc3RlbmVycz86IEludGVyYWN0Lkxpc3RlbmVyc1xuICBhbGxvd0Zyb20/OiBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGlnbm9yZUZyb20/OiBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG59XG5cbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSBQYXJ0aWFsPEJhc2VEZWZhdWx0cz4gJiBQYXJ0aWFsPFBlckFjdGlvbkRlZmF1bHRzPiAmIHtcbiAgW1AgaW4ga2V5b2YgQWN0aW9uRGVmYXVsdHNdPzogUGFydGlhbDxBY3Rpb25EZWZhdWx0c1tQXT5cbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIGV4dGVuZHMgQmFzZURlZmF1bHRzLCBQZXJBY3Rpb25EZWZhdWx0cyB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnNBcmcgZXh0ZW5kcyBCYXNlRGVmYXVsdHMsIEludGVyYWN0Lk9yQm9vbGVhbjxQYXJ0aWFsPEFjdGlvbkRlZmF1bHRzPj4ge31cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBEZWZhdWx0cyA9IHtcbiAgYmFzZToge1xuICAgIHByZXZlbnREZWZhdWx0OiAnYXV0bycsXG4gICAgZGVsdGFTb3VyY2U6ICdwYWdlJyxcbiAgfSxcblxuICBwZXJBY3Rpb246IHtcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBvcmlnaW46IHsgeDogMCwgeTogMCB9LFxuICB9LFxuXG4gIGFjdGlvbnM6IHt9IGFzIEFjdGlvbkRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0c1xuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcbmltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNpZ25hbEFyZ3Mge1xuICAgICdpbnRlcmFjdGFibGU6bmV3Jzoge1xuICAgICAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgICAgIHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0XG4gICAgICBvcHRpb25zOiBJbnRlcmFjdC5PcHRpb25zQXJnXG4gICAgICB3aW46IFdpbmRvd1xuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgSW50ZXJhY3RhYmxlU2NvcGVQcm9wIHtcbiAgY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVyYWN0YWJsZVNldCB7XG4gIC8vIGFsbCBzZXQgaW50ZXJhY3RhYmxlc1xuICBsaXN0OiBJbnRlcmFjdC5JbnRlcmFjdGFibGVbXSA9IFtdXG5cbiAgc2VsZWN0b3JNYXA6IHtcbiAgICBbc2VsZWN0b3I6IHN0cmluZ106IEludGVyYWN0YWJsZVNjb3BlUHJvcFtdXG4gIH0gPSB7fVxuXG4gIGNvbnN0cnVjdG9yIChwcm90ZWN0ZWQgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gICAgc2NvcGUuYWRkTGlzdGVuZXJzKHtcbiAgICAgICdpbnRlcmFjdGFibGU6dW5zZXQnOiAoeyBpbnRlcmFjdGFibGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRhcmdldCwgX2NvbnRleHQ6IGNvbnRleHQgfSA9IGludGVyYWN0YWJsZVxuICAgICAgICBjb25zdCB0YXJnZXRNYXBwaW5nczogSW50ZXJhY3RhYmxlU2NvcGVQcm9wW10gPSBpcy5zdHJpbmcodGFyZ2V0KVxuICAgICAgICAgID8gdGhpcy5zZWxlY3Rvck1hcFt0YXJnZXRdXG4gICAgICAgICAgOiAodGFyZ2V0IGFzIGFueSlbdGhpcy5zY29wZS5pZF1cblxuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IHRhcmdldE1hcHBpbmdzLmZpbmRJbmRleChtID0+IG0uY29udGV4dCA9PT0gY29udGV4dClcbiAgICAgICAgaWYgKHRhcmdldE1hcHBpbmdzW3RhcmdldEluZGV4XSkge1xuICAgICAgICAvLyBEZXN0cm95aW5nIG1hcHBpbmdJbmZvJ3MgY29udGV4dCBhbmQgaW50ZXJhY3RhYmxlXG4gICAgICAgICAgdGFyZ2V0TWFwcGluZ3NbdGFyZ2V0SW5kZXhdLmNvbnRleHQgPSBudWxsXG4gICAgICAgICAgdGFyZ2V0TWFwcGluZ3NbdGFyZ2V0SW5kZXhdLmludGVyYWN0YWJsZSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRNYXBwaW5ncy5zcGxpY2UodGFyZ2V0SW5kZXgsIDEpXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBuZXcgKHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0LCBvcHRpb25zPzogYW55KTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlIHtcbiAgICBvcHRpb25zID0gZXh0ZW5kKG9wdGlvbnMgfHwge30sIHtcbiAgICAgIGFjdGlvbnM6IHRoaXMuc2NvcGUuYWN0aW9ucyxcbiAgICB9KVxuICAgIGNvbnN0IGludGVyYWN0YWJsZSA9IG5ldyB0aGlzLnNjb3BlLkludGVyYWN0YWJsZSh0YXJnZXQsIG9wdGlvbnMsIHRoaXMuc2NvcGUuZG9jdW1lbnQpXG4gICAgY29uc3QgbWFwcGluZ0luZm8gPSB7IGNvbnRleHQ6IGludGVyYWN0YWJsZS5fY29udGV4dCwgaW50ZXJhY3RhYmxlIH1cblxuICAgIHRoaXMuc2NvcGUuYWRkRG9jdW1lbnQoaW50ZXJhY3RhYmxlLl9kb2MpXG4gICAgdGhpcy5saXN0LnB1c2goaW50ZXJhY3RhYmxlKVxuXG4gICAgaWYgKGlzLnN0cmluZyh0YXJnZXQpKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0b3JNYXBbdGFyZ2V0XSkgeyB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldF0gPSBbXSB9XG4gICAgICB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldF0ucHVzaChtYXBwaW5nSW5mbylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEoKGludGVyYWN0YWJsZS50YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXSkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgdGhpcy5zY29wZS5pZCwge1xuICAgICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgICh0YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXS5wdXNoKG1hcHBpbmdJbmZvKVxuICAgIH1cblxuICAgIHRoaXMuc2NvcGUuZmlyZSgnaW50ZXJhY3RhYmxlOm5ldycsIHtcbiAgICAgIHRhcmdldCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpbnRlcmFjdGFibGUsXG4gICAgICB3aW46IHRoaXMuc2NvcGUuX3dpbixcbiAgICB9KVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG5cbiAgZ2V0ICh0YXJnZXQ6IEludGVyYWN0LlRhcmdldCwgb3B0aW9ucz86IEludGVyYWN0Lk9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0KSB8fCB0aGlzLnNjb3BlLmRvY3VtZW50XG4gICAgY29uc3QgaXNTZWxlY3RvciA9IGlzLnN0cmluZyh0YXJnZXQpXG4gICAgY29uc3QgdGFyZ2V0TWFwcGluZ3M6IEludGVyYWN0YWJsZVNjb3BlUHJvcFtdID0gaXNTZWxlY3RvclxuICAgICAgPyB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldCBhcyBzdHJpbmddXG4gICAgICA6ICh0YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXVxuXG4gICAgaWYgKCF0YXJnZXRNYXBwaW5ncykgeyByZXR1cm4gbnVsbCB9XG5cbiAgICBjb25zdCBmb3VuZCA9IGFyci5maW5kKFxuICAgICAgdGFyZ2V0TWFwcGluZ3MsXG4gICAgICBtID0+IG0uY29udGV4dCA9PT0gY29udGV4dCAmJlxuICAgICAgICAoaXNTZWxlY3RvciB8fCBtLmludGVyYWN0YWJsZS5pbkNvbnRleHQodGFyZ2V0IGFzIGFueSkpKVxuXG4gICAgcmV0dXJuIGZvdW5kICYmIGZvdW5kLmludGVyYWN0YWJsZVxuICB9XG5cbiAgZm9yRWFjaE1hdGNoPFQ+IChub2RlOiBOb2RlLCBjYWxsYmFjazogKGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKSA9PiBUKTogVCB8IHZvaWQge1xuICAgIGZvciAoY29uc3QgaW50ZXJhY3RhYmxlIG9mIHRoaXMubGlzdCkge1xuICAgICAgbGV0IHJldFxuXG4gICAgICBpZiAoKGlzLnN0cmluZyhpbnRlcmFjdGFibGUudGFyZ2V0KVxuICAgICAgLy8gdGFyZ2V0IGlzIGEgc2VsZWN0b3IgYW5kIHRoZSBlbGVtZW50IG1hdGNoZXNcbiAgICAgICAgPyAoaXMuZWxlbWVudChub2RlKSAmJiBkb21VdGlscy5tYXRjaGVzU2VsZWN0b3Iobm9kZSwgaW50ZXJhY3RhYmxlLnRhcmdldCkpXG4gICAgICAgIC8vIHRhcmdldCBpcyB0aGUgZWxlbWVudFxuICAgICAgICA6IG5vZGUgPT09IGludGVyYWN0YWJsZS50YXJnZXQpICYmXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIGNvbnRleHRcbiAgICAgICAgKGludGVyYWN0YWJsZS5pbkNvbnRleHQobm9kZSkpKSB7XG4gICAgICAgIHJldCA9IGNhbGxiYWNrKGludGVyYWN0YWJsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXRcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBCYXNlRXZlbnQ8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWUgPSBhbnk+IHtcbiAgdHlwZTogc3RyaW5nXG4gIHRhcmdldDogRXZlbnRUYXJnZXRcbiAgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXRcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgX2ludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbjxUPlxuICB0aW1lU3RhbXA6IGFueVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuXG4gIGdldCBpbnRlcmFjdGlvbiAoKTogSW50ZXJhY3QuSW50ZXJhY3Rpb25Qcm94eTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW9uLl9wcm94eVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICAgIHRoaXMuX2ludGVyYWN0aW9uID0gaW50ZXJhY3Rpb25cbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0ICgpIHt9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgYW55IG90aGVyIGxpc3RlbmVycyAoZXZlbiBvbiB0aGUgY3VycmVudCB0YXJnZXQpXG4gICAqL1xuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgbGlzdGVuZXJzIG9uIHRoZSByZW1haW5pbmcgdGFyZ2V0c1xuICAgKi9cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VFdmVudFxuIiwiaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgZ2V0T3JpZ2luWFkgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZ2V0T3JpZ2luWFknXG5pbXBvcnQgaHlwb3QgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaHlwb3QnXG5pbXBvcnQgQmFzZUV2ZW50IGZyb20gJy4vQmFzZUV2ZW50J1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgSW50ZXJhY3Rpb24gZnJvbSAnLi9JbnRlcmFjdGlvbidcblxuZXhwb3J0IHR5cGUgRXZlbnRQaGFzZSA9IGtleW9mIFBoYXNlTWFwXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGhhc2VNYXAge1xuICBzdGFydDogdHJ1ZVxuICBtb3ZlOiB0cnVlXG4gIGVuZDogdHJ1ZVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJhY3RFdmVudDxcbiAgVCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWUgPSBuZXZlcixcbiAgUCBleHRlbmRzIEV2ZW50UGhhc2UgPSBFdmVudFBoYXNlLFxuPiBleHRlbmRzIEJhc2VFdmVudDxUPiB7XG4gIHRhcmdldDogSW50ZXJhY3QuRWxlbWVudFxuICBjdXJyZW50VGFyZ2V0OiBJbnRlcmFjdC5FbGVtZW50XG4gIHJlbGF0ZWRUYXJnZXQ6IG51bGwgPSBudWxsXG4gIHNjcmVlblg/OiBudW1iZXJcbiAgc2NyZWVuWT86IG51bWJlclxuICBidXR0b246IG51bWJlclxuICBidXR0b25zOiBudW1iZXJcbiAgY3RybEtleTogYm9vbGVhblxuICBzaGlmdEtleTogYm9vbGVhblxuICBhbHRLZXk6IGJvb2xlYW5cbiAgbWV0YUtleTogYm9vbGVhblxuICBwYWdlOiBJbnRlcmFjdC5Qb2ludFxuICBjbGllbnQ6IEludGVyYWN0LlBvaW50XG4gIGRlbHRhOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICB4MDogbnVtYmVyXG4gIHkwOiBudW1iZXJcbiAgdDA6IG51bWJlclxuICBkdDogbnVtYmVyXG4gIGR1cmF0aW9uOiBudW1iZXJcbiAgY2xpZW50WDA6IG51bWJlclxuICBjbGllbnRZMDogbnVtYmVyXG4gIHZlbG9jaXR5OiBJbnRlcmFjdC5Qb2ludFxuICBzcGVlZDogbnVtYmVyXG4gIHN3aXBlOiBSZXR1cm5UeXBlPEludGVyYWN0RXZlbnQ8VD5bJ2dldFN3aXBlJ10+XG4gIHRpbWVTdGFtcDogYW55XG4gIC8vIGRyYWdcbiAgZHJhZ0VudGVyPzogSW50ZXJhY3QuRWxlbWVudFxuICBkcmFnTGVhdmU/OiBJbnRlcmFjdC5FbGVtZW50XG4gIC8vIHJlc2l6ZVxuICBheGVzPzogJ3gnIHwgJ3knIHwgJ3h5J1xuICBwcmVFbmQ/OiBib29sZWFuXG5cbiAgLyoqICovXG4gIGNvbnN0cnVjdG9yIChcbiAgICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24sXG4gICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgYWN0aW9uTmFtZTogVCxcbiAgICBwaGFzZTogUCxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgIHByZUVuZD86IGJvb2xlYW4sXG4gICAgdHlwZT86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoaW50ZXJhY3Rpb24pXG5cbiAgICBlbGVtZW50ID0gZWxlbWVudCB8fCBpbnRlcmFjdGlvbi5lbGVtZW50XG5cbiAgICBjb25zdCB0YXJnZXQgICAgICA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZVxuICAgIGNvbnN0IGRlbHRhU291cmNlID0gKCgodGFyZ2V0ICYmIHRhcmdldC5vcHRpb25zKSB8fCBkZWZhdWx0cykgYXMgYW55KS5kZWx0YVNvdXJjZSBhcyAncGFnZScgfCAnY2xpZW50J1xuICAgIGNvbnN0IG9yaWdpbiAgICAgID0gZ2V0T3JpZ2luWFkodGFyZ2V0LCBlbGVtZW50LCBhY3Rpb25OYW1lKVxuICAgIGNvbnN0IHN0YXJ0aW5nICAgID0gcGhhc2UgPT09ICdzdGFydCdcbiAgICBjb25zdCBlbmRpbmcgICAgICA9IHBoYXNlID09PSAnZW5kJ1xuICAgIGNvbnN0IHByZXZFdmVudCAgID0gc3RhcnRpbmcgPyB0aGlzIDogaW50ZXJhY3Rpb24ucHJldkV2ZW50XG4gICAgY29uc3QgY29vcmRzICAgICAgPSBzdGFydGluZ1xuICAgICAgPyBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnRcbiAgICAgIDogZW5kaW5nXG4gICAgICAgID8geyBwYWdlOiBwcmV2RXZlbnQucGFnZSwgY2xpZW50OiBwcmV2RXZlbnQuY2xpZW50LCB0aW1lU3RhbXA6IGludGVyYWN0aW9uLmNvb3Jkcy5jdXIudGltZVN0YW1wIH1cbiAgICAgICAgOiBpbnRlcmFjdGlvbi5jb29yZHMuY3VyXG5cbiAgICB0aGlzLnBhZ2UgICAgICA9IGV4dGVuZCh7fSwgY29vcmRzLnBhZ2UpXG4gICAgdGhpcy5jbGllbnQgICAgPSBleHRlbmQoe30sIGNvb3Jkcy5jbGllbnQpXG4gICAgdGhpcy5yZWN0ICAgICAgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLnJlY3QpXG4gICAgdGhpcy50aW1lU3RhbXAgPSBjb29yZHMudGltZVN0YW1wXG5cbiAgICBpZiAoIWVuZGluZykge1xuICAgICAgdGhpcy5wYWdlLnggLT0gb3JpZ2luLnhcbiAgICAgIHRoaXMucGFnZS55IC09IG9yaWdpbi55XG5cbiAgICAgIHRoaXMuY2xpZW50LnggLT0gb3JpZ2luLnhcbiAgICAgIHRoaXMuY2xpZW50LnkgLT0gb3JpZ2luLnlcbiAgICB9XG5cbiAgICB0aGlzLmN0cmxLZXkgICAgICAgPSBldmVudC5jdHJsS2V5XG4gICAgdGhpcy5hbHRLZXkgICAgICAgID0gZXZlbnQuYWx0S2V5XG4gICAgdGhpcy5zaGlmdEtleSAgICAgID0gZXZlbnQuc2hpZnRLZXlcbiAgICB0aGlzLm1ldGFLZXkgICAgICAgPSBldmVudC5tZXRhS2V5XG4gICAgdGhpcy5idXR0b24gICAgICAgID0gKGV2ZW50IGFzIE1vdXNlRXZlbnQpLmJ1dHRvblxuICAgIHRoaXMuYnV0dG9ucyAgICAgICA9IChldmVudCBhcyBNb3VzZUV2ZW50KS5idXR0b25zXG4gICAgdGhpcy50YXJnZXQgICAgICAgID0gZWxlbWVudFxuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IGVsZW1lbnRcbiAgICB0aGlzLnByZUVuZCAgICAgICAgPSBwcmVFbmRcbiAgICB0aGlzLnR5cGUgICAgICAgICAgPSB0eXBlIHx8IChhY3Rpb25OYW1lICsgKHBoYXNlIHx8ICcnKSlcbiAgICB0aGlzLmludGVyYWN0YWJsZSAgPSB0YXJnZXRcblxuICAgIHRoaXMudDAgPSBzdGFydGluZ1xuICAgICAgPyBpbnRlcmFjdGlvbi5wb2ludGVyc1tpbnRlcmFjdGlvbi5wb2ludGVycy5sZW5ndGggLSAxXS5kb3duVGltZVxuICAgICAgOiBwcmV2RXZlbnQudDBcblxuICAgIHRoaXMueDAgICAgICAgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQucGFnZS54IC0gb3JpZ2luLnhcbiAgICB0aGlzLnkwICAgICAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueSAtIG9yaWdpbi55XG4gICAgdGhpcy5jbGllbnRYMCA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5jbGllbnQueCAtIG9yaWdpbi54XG4gICAgdGhpcy5jbGllbnRZMCA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5jbGllbnQueSAtIG9yaWdpbi55XG5cbiAgICBpZiAoc3RhcnRpbmcgfHwgZW5kaW5nKSB7XG4gICAgICB0aGlzLmRlbHRhID0geyB4OiAwLCB5OiAwIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRlbHRhID0ge1xuICAgICAgICB4OiB0aGlzW2RlbHRhU291cmNlXS54IC0gcHJldkV2ZW50W2RlbHRhU291cmNlXS54LFxuICAgICAgICB5OiB0aGlzW2RlbHRhU291cmNlXS55IC0gcHJldkV2ZW50W2RlbHRhU291cmNlXS55LFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZHQgICAgICAgID0gaW50ZXJhY3Rpb24uY29vcmRzLmRlbHRhLnRpbWVTdGFtcFxuICAgIHRoaXMuZHVyYXRpb24gID0gdGhpcy50aW1lU3RhbXAgLSB0aGlzLnQwXG5cbiAgICAvLyB2ZWxvY2l0eSBhbmQgc3BlZWQgaW4gcGl4ZWxzIHBlciBzZWNvbmRcbiAgICB0aGlzLnZlbG9jaXR5ID0gZXh0ZW5kKHt9LCBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHlbZGVsdGFTb3VyY2VdKVxuICAgIHRoaXMuc3BlZWQgPSBoeXBvdCh0aGlzLnZlbG9jaXR5LngsIHRoaXMudmVsb2NpdHkueSlcblxuICAgIHRoaXMuc3dpcGUgPSAoZW5kaW5nIHx8IHBoYXNlID09PSAnaW5lcnRpYXN0YXJ0JykgPyB0aGlzLmdldFN3aXBlKCkgOiBudWxsXG4gIH1cblxuICBnZXQgcGFnZVggKCkgeyByZXR1cm4gdGhpcy5wYWdlLnggfVxuICBzZXQgcGFnZVggKHZhbHVlKSB7IHRoaXMucGFnZS54ID0gdmFsdWUgfVxuICBnZXQgcGFnZVkgKCkgeyByZXR1cm4gdGhpcy5wYWdlLnkgfVxuICBzZXQgcGFnZVkgKHZhbHVlKSB7IHRoaXMucGFnZS55ID0gdmFsdWUgfVxuXG4gIGdldCBjbGllbnRYICgpIHsgcmV0dXJuIHRoaXMuY2xpZW50LnggfVxuICBzZXQgY2xpZW50WCAodmFsdWUpIHsgdGhpcy5jbGllbnQueCA9IHZhbHVlIH1cbiAgZ2V0IGNsaWVudFkgKCkgeyByZXR1cm4gdGhpcy5jbGllbnQueSB9XG4gIHNldCBjbGllbnRZICh2YWx1ZSkgeyB0aGlzLmNsaWVudC55ID0gdmFsdWUgfVxuXG4gIGdldCBkeCAoKSB7IHJldHVybiB0aGlzLmRlbHRhLnggfVxuICBzZXQgZHggKHZhbHVlKSB7IHRoaXMuZGVsdGEueCA9IHZhbHVlIH1cbiAgZ2V0IGR5ICgpIHsgcmV0dXJuIHRoaXMuZGVsdGEueSB9XG4gIHNldCBkeSAodmFsdWUpIHsgdGhpcy5kZWx0YS55ID0gdmFsdWUgfVxuXG4gIGdldCB2ZWxvY2l0eVggKCkgeyByZXR1cm4gdGhpcy52ZWxvY2l0eS54IH1cbiAgc2V0IHZlbG9jaXR5WCAodmFsdWUpIHsgdGhpcy52ZWxvY2l0eS54ID0gdmFsdWUgfVxuICBnZXQgdmVsb2NpdHlZICgpIHsgcmV0dXJuIHRoaXMudmVsb2NpdHkueSB9XG4gIHNldCB2ZWxvY2l0eVkgKHZhbHVlKSB7IHRoaXMudmVsb2NpdHkueSA9IHZhbHVlIH1cblxuICBnZXRTd2lwZSAoKSB7XG4gICAgY29uc3QgaW50ZXJhY3Rpb24gPSB0aGlzLl9pbnRlcmFjdGlvblxuXG4gICAgaWYgKGludGVyYWN0aW9uLnByZXZFdmVudC5zcGVlZCA8IDYwMCB8fFxuICAgICAgICB0aGlzLnRpbWVTdGFtcCAtIGludGVyYWN0aW9uLnByZXZFdmVudC50aW1lU3RhbXAgPiAxNTApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGFuZ2xlID0gMTgwICogTWF0aC5hdGFuMihpbnRlcmFjdGlvbi5wcmV2RXZlbnQudmVsb2NpdHlZLCBpbnRlcmFjdGlvbi5wcmV2RXZlbnQudmVsb2NpdHlYKSAvIE1hdGguUElcbiAgICBjb25zdCBvdmVybGFwID0gMjIuNVxuXG4gICAgaWYgKGFuZ2xlIDwgMCkge1xuICAgICAgYW5nbGUgKz0gMzYwXG4gICAgfVxuXG4gICAgY29uc3QgbGVmdCA9IDEzNSAtIG92ZXJsYXAgPD0gYW5nbGUgJiYgYW5nbGUgPCAyMjUgKyBvdmVybGFwXG4gICAgY29uc3QgdXAgICA9IDIyNSAtIG92ZXJsYXAgPD0gYW5nbGUgJiYgYW5nbGUgPCAzMTUgKyBvdmVybGFwXG5cbiAgICBjb25zdCByaWdodCA9ICFsZWZ0ICYmICgzMTUgLSBvdmVybGFwIDw9IGFuZ2xlIHx8IGFuZ2xlIDwgIDQ1ICsgb3ZlcmxhcClcbiAgICBjb25zdCBkb3duICA9ICF1cCAgICYmICAgNDUgLSBvdmVybGFwIDw9IGFuZ2xlICYmIGFuZ2xlIDwgMTM1ICsgb3ZlcmxhcFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVwLFxuICAgICAgZG93bixcbiAgICAgIGxlZnQsXG4gICAgICByaWdodCxcbiAgICAgIGFuZ2xlLFxuICAgICAgc3BlZWQ6IGludGVyYWN0aW9uLnByZXZFdmVudC5zcGVlZCxcbiAgICAgIHZlbG9jaXR5OiB7XG4gICAgICAgIHg6IGludGVyYWN0aW9uLnByZXZFdmVudC52ZWxvY2l0eVgsXG4gICAgICAgIHk6IGludGVyYWN0aW9uLnByZXZFdmVudC52ZWxvY2l0eVksXG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0ICgpIHt9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgbGlzdGVuZXJzIG9uIHRoZSByZW1haW5pbmcgdGFyZ2V0c1xuICAgKi9cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgYW55IG90aGVyIGxpc3RlbmVycyAoZXZlbiBvbiB0aGUgY3VycmVudCB0YXJnZXQpXG4gICAqL1xuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVyYWN0RXZlbnRcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1wYXJhbWV0ZXItcHJvcGVydGllcyAqL1xuZXhwb3J0IGNsYXNzIFBvaW50ZXJJbmZvIHtcbiAgY29uc3RydWN0b3IgKFxuICAgIHB1YmxpYyBpZDogbnVtYmVyLFxuICAgIHB1YmxpYyBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgICBwdWJsaWMgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgcHVibGljIGRvd25UaW1lOiBudW1iZXIsXG4gICAgcHVibGljIGRvd25UYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0LFxuICApIHt9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50ZXJJbmZvXG4iLCJpbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBJbnRlcmFjdGFibGUgZnJvbSAnLi9JbnRlcmFjdGFibGUnXG5pbXBvcnQgSW50ZXJhY3RFdmVudCwgeyBFdmVudFBoYXNlIH0gZnJvbSAnLi9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0IFBvaW50ZXJJbmZvIGZyb20gJy4vUG9pbnRlckluZm8nXG5pbXBvcnQgeyBBY3Rpb25OYW1lIH0gZnJvbSAnLi9zY29wZSdcblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25Qcm9wczxUIGV4dGVuZHMgQWN0aW9uTmFtZSA9IEludGVyYWN0LkFjdGlvbk5hbWU+IHtcbiAgbmFtZTogVFxuICBheGlzPzogJ3gnIHwgJ3knIHwgJ3h5J1xuICBlZGdlcz86IEludGVyYWN0LkVkZ2VPcHRpb25zXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb25Qcm9wcyB7XG4gIG5hbWU6IEFjdGlvbk5hbWVcbn1cblxuZXhwb3J0IGVudW0gX1Byb3h5VmFsdWVzIHtcbiAgaW50ZXJhY3RhYmxlID0gJycsXG4gIGVsZW1lbnQgPSAnJyxcbiAgcHJlcGFyZWQgPSAnJyxcbiAgcG9pbnRlcklzRG93biA9ICcnLFxuICBwb2ludGVyV2FzTW92ZWQgPSAnJyxcbiAgX3Byb3h5ID0gJydcbn1cblxuZXhwb3J0IGVudW0gX1Byb3h5TWV0aG9kcyB7XG4gIHN0YXJ0ID0gJycsXG4gIG1vdmUgPSAnJyxcbiAgZW5kID0gJycsXG4gIHN0b3AgPSAnJyxcbiAgaW50ZXJhY3RpbmcgPSAnJ1xufVxuXG5leHBvcnQgdHlwZSBQb2ludGVyQXJnUHJvcHM8VCBleHRlbmRzIHt9ID0ge30+ID0ge1xuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZVxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgcG9pbnRlckluZGV4OiBudW1iZXJcbiAgcG9pbnRlckluZm86IFBvaW50ZXJJbmZvXG4gIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblxufSAmIFRcblxuZXhwb3J0IGludGVyZmFjZSBEb1BoYXNlQXJnPFQgZXh0ZW5kcyBBY3Rpb25OYW1lLCBQIGV4dGVuZHMgRXZlbnRQaGFzZT4ge1xuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICBwaGFzZTogRXZlbnRQaGFzZVxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb248VD5cbiAgaUV2ZW50OiBJbnRlcmFjdEV2ZW50PFQsIFA+XG4gIHByZUVuZD86IGJvb2xlYW5cbiAgdHlwZT86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBEb0FueVBoYXNlQXJnID0gRG9QaGFzZUFyZzxBY3Rpb25OYW1lLCBFdmVudFBoYXNlPlxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB9XG4gICAgJ2ludGVyYWN0aW9uczpkb3duJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICdkb3duJ1xuICAgIH0+XG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICdtb3ZlJ1xuICAgICAgZHg6IG51bWJlclxuICAgICAgZHk6IG51bWJlclxuICAgICAgZHVwbGljYXRlOiBib29sZWFuXG4gICAgfT5cbiAgICAnaW50ZXJhY3Rpb25zOnVwJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICd1cCdcbiAgICAgIGN1ckV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldFxuICAgIH0+XG4gICAgJ2ludGVyYWN0aW9uczpjYW5jZWwnOiBTaWduYWxBcmdzWydpbnRlcmFjdGlvbnM6dXAnXSAmIHtcbiAgICAgIHR5cGU6ICdjYW5jZWwnXG4gICAgICBjdXJFdmVudFRhcmdldDogRXZlbnRUYXJnZXRcbiAgICB9XG4gICAgJ2ludGVyYWN0aW9uczp1cGRhdGUtcG9pbnRlcic6IFBvaW50ZXJBcmdQcm9wczx7XG4gICAgICBkb3duOiBib29sZWFuXG4gICAgfT5cbiAgICAnaW50ZXJhY3Rpb25zOnJlbW92ZS1wb2ludGVyJzogUG9pbnRlckFyZ1Byb3BzXG4gICAgJ2ludGVyYWN0aW9uczpibHVyJ1xuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1zdGFydCc6IE9taXQ8RG9BbnlQaGFzZUFyZywgJ2lFdmVudCc+XG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tc3RhcnQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tc3RhcnQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczpiZWZvcmUtYWN0aW9uLW1vdmUnOiBPbWl0PERvQW55UGhhc2VBcmcsICdpRXZlbnQnPlxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IERvQW55UGhhc2VBcmdcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogT21pdDxEb0FueVBoYXNlQXJnLCAnaUV2ZW50Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1lbmQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tZW5kJzogRG9BbnlQaGFzZUFyZ1xuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IHsgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBJbnRlcmFjdGlvblByb3h5PFQgZXh0ZW5kcyBBY3Rpb25OYW1lID0gQWN0aW9uTmFtZT4gPSBQaWNrPFxuSW50ZXJhY3Rpb248VD4sXG5rZXlvZiB0eXBlb2YgX1Byb3h5VmFsdWVzIHwga2V5b2YgdHlwZW9mIF9Qcm94eU1ldGhvZHNcbj5cblxubGV0IGlkQ291bnRlciA9IDBcblxuZXhwb3J0IGNsYXNzIEludGVyYWN0aW9uPFQgZXh0ZW5kcyBBY3Rpb25OYW1lID0gQWN0aW9uTmFtZT4ge1xuICAvLyBjdXJyZW50IGludGVyYWN0YWJsZSBiZWluZyBpbnRlcmFjdGVkIHdpdGhcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdGFibGUgPSBudWxsXG5cbiAgLy8gdGhlIHRhcmdldCBlbGVtZW50IG9mIHRoZSBpbnRlcmFjdGFibGVcbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCA9IG51bGxcbiAgcmVjdDogSW50ZXJhY3QuRnVsbFJlY3RcbiAgX3JlY3RzPzoge1xuICAgIHN0YXJ0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICAgIGNvcnJlY3RlZDogSW50ZXJhY3QuRnVsbFJlY3RcbiAgICBwcmV2aW91czogSW50ZXJhY3QuRnVsbFJlY3RcbiAgICBkZWx0YTogSW50ZXJhY3QuRnVsbFJlY3RcbiAgfVxuICBlZGdlczogSW50ZXJhY3QuRWRnZU9wdGlvbnNcblxuICBfc2NvcGVGaXJlOiBJbnRlcmFjdC5TY29wZVsnZmlyZSddXG5cbiAgLy8gYWN0aW9uIHRoYXQncyByZWFkeSB0byBiZSBmaXJlZCBvbiBuZXh0IG1vdmUgZXZlbnRcbiAgcHJlcGFyZWQ6IEFjdGlvblByb3BzPFQ+ID0ge1xuICAgIG5hbWUgOiBudWxsLFxuICAgIGF4aXMgOiBudWxsLFxuICAgIGVkZ2VzOiBudWxsLFxuICB9XG5cbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuXG4gIC8vIGtlZXAgdHJhY2sgb2YgYWRkZWQgcG9pbnRlcnNcbiAgcG9pbnRlcnM6IFBvaW50ZXJJbmZvW10gPSBbXVxuXG4gIC8vIHBvaW50ZXJkb3duL21vdXNlZG93bi90b3VjaHN0YXJ0IGV2ZW50XG4gIGRvd25FdmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSA9IG51bGxcblxuICBkb3duUG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgPSB7fSBhcyBJbnRlcmFjdC5Qb2ludGVyVHlwZVxuXG4gIF9sYXRlc3RQb2ludGVyOiB7XG4gICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGVcbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICAgIGV2ZW50VGFyZ2V0OiBOb2RlXG4gIH0gPSB7XG4gICAgcG9pbnRlcjogbnVsbCxcbiAgICBldmVudDogbnVsbCxcbiAgICBldmVudFRhcmdldDogbnVsbCxcbiAgfVxuXG4gIC8vIHByZXZpb3VzIGFjdGlvbiBldmVudFxuICBwcmV2RXZlbnQ6IEludGVyYWN0RXZlbnQ8VCwgRXZlbnRQaGFzZT4gPSBudWxsXG5cbiAgcG9pbnRlcklzRG93biA9IGZhbHNlXG4gIHBvaW50ZXJXYXNNb3ZlZCA9IGZhbHNlXG4gIF9pbnRlcmFjdGluZyA9IGZhbHNlXG4gIF9lbmRpbmcgPSBmYWxzZVxuICBfc3RvcHBlZCA9IHRydWVcbiAgX3Byb3h5OiBJbnRlcmFjdGlvblByb3h5PFQ+ID0gbnVsbFxuXG4gIHNpbXVsYXRpb24gPSBudWxsXG5cbiAgZ2V0IHBvaW50ZXJNb3ZlVG9sZXJhbmNlICgpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgLyoqXG4gICAqIEBhbGlhcyBJbnRlcmFjdGlvbi5wcm90b3R5cGUubW92ZVxuICAgKi9cbiAgZG9Nb3ZlID0gdXRpbHMud2Fybk9uY2UoXG4gICAgZnVuY3Rpb24gKHRoaXM6IEludGVyYWN0aW9uLCBzaWduYWxBcmc6IGFueSkge1xuICAgICAgdGhpcy5tb3ZlKHNpZ25hbEFyZylcbiAgICB9LFxuICAgICdUaGUgaW50ZXJhY3Rpb24uZG9Nb3ZlKCkgbWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gaW50ZXJhY3Rpb24ubW92ZSgpJylcblxuICBjb29yZHM6IEludGVyYWN0LkNvb3Jkc1NldCA9IHtcbiAgICAvLyBTdGFydGluZyBJbnRlcmFjdEV2ZW50IHBvaW50ZXIgY29vcmRpbmF0ZXNcbiAgICBzdGFydDogdXRpbHMucG9pbnRlci5uZXdDb29yZHMoKSxcbiAgICAvLyBQcmV2aW91cyBuYXRpdmUgcG9pbnRlciBtb3ZlIGV2ZW50IGNvb3JkaW5hdGVzXG4gICAgcHJldjogdXRpbHMucG9pbnRlci5uZXdDb29yZHMoKSxcbiAgICAvLyBjdXJyZW50IG5hdGl2ZSBwb2ludGVyIG1vdmUgZXZlbnQgY29vcmRpbmF0ZXNcbiAgICBjdXI6IHV0aWxzLnBvaW50ZXIubmV3Q29vcmRzKCksXG4gICAgLy8gQ2hhbmdlIGluIGNvb3JkaW5hdGVzIGFuZCB0aW1lIG9mIHRoZSBwb2ludGVyXG4gICAgZGVsdGE6IHV0aWxzLnBvaW50ZXIubmV3Q29vcmRzKCksXG4gICAgLy8gcG9pbnRlciB2ZWxvY2l0eVxuICAgIHZlbG9jaXR5OiB1dGlscy5wb2ludGVyLm5ld0Nvb3JkcygpLFxuICB9XG5cbiAgcmVhZG9ubHkgX2lkOiBudW1iZXIgPSBpZENvdW50ZXIrK1xuXG4gIC8qKiAqL1xuICBjb25zdHJ1Y3RvciAoeyBwb2ludGVyVHlwZSwgc2NvcGVGaXJlIH06IHtcbiAgICBwb2ludGVyVHlwZT86IHN0cmluZ1xuICAgIHNjb3BlRmlyZTogSW50ZXJhY3QuU2NvcGVbJ2ZpcmUnXVxuICB9KSB7XG4gICAgdGhpcy5fc2NvcGVGaXJlID0gc2NvcGVGaXJlXG4gICAgdGhpcy5wb2ludGVyVHlwZSA9IHBvaW50ZXJUeXBlXG5cbiAgICBjb25zdCB0aGF0ID0gdGhpc1xuXG4gICAgdGhpcy5fcHJveHkgPSB7fSBhcyBJbnRlcmFjdGlvblByb3h5PFQ+XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBfUHJveHlWYWx1ZXMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLl9wcm94eSwga2V5LCB7XG4gICAgICAgIGdldCAoKSB7IHJldHVybiB0aGF0W2tleV0gfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gX1Byb3h5TWV0aG9kcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuX3Byb3h5LCBrZXksIHtcbiAgICAgICAgdmFsdWU6ICguLi5hcmdzKSA9PiB0aGF0W2tleV0oLi4uYXJncyksXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOm5ldycsIHsgaW50ZXJhY3Rpb246IHRoaXMgfSlcbiAgfVxuXG4gIHBvaW50ZXJEb3duIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCkge1xuICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IHRoaXMudXBkYXRlUG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHRydWUpXG4gICAgY29uc3QgcG9pbnRlckluZm8gPSB0aGlzLnBvaW50ZXJzW3BvaW50ZXJJbmRleF1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOmRvd24nLCB7XG4gICAgICBwb2ludGVyLFxuICAgICAgZXZlbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHBvaW50ZXJJbmRleCxcbiAgICAgIHBvaW50ZXJJbmZvLFxuICAgICAgdHlwZTogJ2Rvd24nLFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBgYGBqc1xuICAgKiBpbnRlcmFjdCh0YXJnZXQpXG4gICAqICAgLmRyYWdnYWJsZSh7XG4gICAqICAgICAvLyBkaXNhYmxlIHRoZSBkZWZhdWx0IGRyYWcgc3RhcnQgYnkgZG93bi0+bW92ZVxuICAgKiAgICAgbWFudWFsU3RhcnQ6IHRydWVcbiAgICogICB9KVxuICAgKiAgIC8vIHN0YXJ0IGRyYWdnaW5nIGFmdGVyIHRoZSB1c2VyIGhvbGRzIHRoZSBwb2ludGVyIGRvd25cbiAgICogICAub24oJ2hvbGQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICogICAgIHZhciBpbnRlcmFjdGlvbiA9IGV2ZW50LmludGVyYWN0aW9uXG4gICAqXG4gICAqICAgICBpZiAoIWludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICogICAgICAgaW50ZXJhY3Rpb24uc3RhcnQoeyBuYW1lOiAnZHJhZycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW50ZXJhY3RhYmxlLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0KVxuICAgKiAgICAgfVxuICAgKiB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogU3RhcnQgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIEludGVyYWN0YWJsZSBhbmQgRWxlbWVudCBhcyB0YXJ0Z2V0cy4gVGhlXG4gICAqIGFjdGlvbiBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoZSB0YXJnZXQgSW50ZXJhY3RhYmxlIGFuZCBhbiBhcHByb3ByaWF0ZVxuICAgKiBudW1iZXIgb2YgcG9pbnRlcnMgbXVzdCBiZSBoZWxkIGRvd24gLSAxIGZvciBkcmFnL3Jlc2l6ZSwgMiBmb3IgZ2VzdHVyZS5cbiAgICpcbiAgICogVXNlIGl0IHdpdGggYGludGVyYWN0YWJsZS48YWN0aW9uPmFibGUoeyBtYW51YWxTdGFydDogZmFsc2UgfSlgIHRvIGFsd2F5c1xuICAgKiBbc3RhcnQgYWN0aW9ucyBtYW51YWxseV0oaHR0cHM6Ly9naXRodWIuY29tL3RheWUvaW50ZXJhY3QuanMvaXNzdWVzLzExNClcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiAgIFRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIC0gZHJhZywgcmVzaXplLCBldGMuXG4gICAqIEBwYXJhbSB7SW50ZXJhY3RhYmxlfSB0YXJnZXQgIFRoZSBJbnRlcmFjdGFibGUgdG8gdGFyZ2V0XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgRE9NIEVsZW1lbnQgdG8gdGFyZ2V0XG4gICAqIEByZXR1cm4ge29iamVjdH0gaW50ZXJhY3RcbiAgICovXG4gIHN0YXJ0IChhY3Rpb246IFN0YXJ0QWN0aW9uLCBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSwgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAgIGlmICh0aGlzLmludGVyYWN0aW5nKCkgfHxcbiAgICAgICAgIXRoaXMucG9pbnRlcklzRG93biB8fFxuICAgICAgICB0aGlzLnBvaW50ZXJzLmxlbmd0aCA8IChhY3Rpb24ubmFtZSA9PT0gJ2dlc3R1cmUnID8gMiA6IDEpIHx8XG4gICAgICAgICFpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb24ubmFtZV0uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgdXRpbHMuY29weUFjdGlvbih0aGlzLnByZXBhcmVkLCBhY3Rpb24pXG5cbiAgICB0aGlzLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICAgIHRoaXMuZWxlbWVudCAgICAgID0gZWxlbWVudFxuICAgIHRoaXMucmVjdCAgICAgICAgID0gaW50ZXJhY3RhYmxlLmdldFJlY3QoZWxlbWVudClcbiAgICB0aGlzLmVkZ2VzICAgICAgICA9IHRoaXMucHJlcGFyZWQuZWRnZXNcbiAgICAgID8gdXRpbHMuZXh0ZW5kKHt9LCB0aGlzLnByZXBhcmVkLmVkZ2VzKVxuICAgICAgOiB7IGxlZnQ6IHRydWUsIHJpZ2h0OiB0cnVlLCB0b3A6IHRydWUsIGJvdHRvbTogdHJ1ZSB9XG4gICAgdGhpcy5fc3RvcHBlZCAgICAgPSBmYWxzZVxuICAgIHRoaXMuX2ludGVyYWN0aW5nID0gdGhpcy5fZG9QaGFzZSh7XG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICAgIGV2ZW50OiB0aGlzLmRvd25FdmVudCxcbiAgICAgIHBoYXNlOiAnc3RhcnQnLFxuICAgIH0pICYmICF0aGlzLl9zdG9wcGVkXG5cbiAgICByZXR1cm4gdGhpcy5faW50ZXJhY3RpbmdcbiAgfVxuXG4gIHBvaW50ZXJNb3ZlIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCkge1xuICAgIGlmICghdGhpcy5zaW11bGF0aW9uICYmICEodGhpcy5tb2RpZmljYXRpb24gJiYgdGhpcy5tb2RpZmljYXRpb24uZW5kUmVzdWx0KSkge1xuICAgICAgdGhpcy51cGRhdGVQb2ludGVyKHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgZHVwbGljYXRlTW92ZSA9ICh0aGlzLmNvb3Jkcy5jdXIucGFnZS54ID09PSB0aGlzLmNvb3Jkcy5wcmV2LnBhZ2UueCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29yZHMuY3VyLnBhZ2UueSA9PT0gdGhpcy5jb29yZHMucHJldi5wYWdlLnkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzLmN1ci5jbGllbnQueCA9PT0gdGhpcy5jb29yZHMucHJldi5jbGllbnQueCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29yZHMuY3VyLmNsaWVudC55ID09PSB0aGlzLmNvb3Jkcy5wcmV2LmNsaWVudC55KVxuXG4gICAgbGV0IGR4XG4gICAgbGV0IGR5XG5cbiAgICAvLyByZWdpc3RlciBtb3ZlbWVudCBncmVhdGVyIHRoYW4gcG9pbnRlck1vdmVUb2xlcmFuY2VcbiAgICBpZiAodGhpcy5wb2ludGVySXNEb3duICYmICF0aGlzLnBvaW50ZXJXYXNNb3ZlZCkge1xuICAgICAgZHggPSB0aGlzLmNvb3Jkcy5jdXIuY2xpZW50LnggLSB0aGlzLmNvb3Jkcy5zdGFydC5jbGllbnQueFxuICAgICAgZHkgPSB0aGlzLmNvb3Jkcy5jdXIuY2xpZW50LnkgLSB0aGlzLmNvb3Jkcy5zdGFydC5jbGllbnQueVxuXG4gICAgICB0aGlzLnBvaW50ZXJXYXNNb3ZlZCA9IHV0aWxzLmh5cG90KGR4LCBkeSkgPiB0aGlzLnBvaW50ZXJNb3ZlVG9sZXJhbmNlXG4gICAgfVxuXG4gICAgY29uc3QgcG9pbnRlckluZGV4ID0gdGhpcy5nZXRQb2ludGVySW5kZXgocG9pbnRlcilcbiAgICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgICBwb2ludGVyLFxuICAgICAgcG9pbnRlckluZGV4LFxuICAgICAgcG9pbnRlckluZm86IHRoaXMucG9pbnRlcnNbcG9pbnRlckluZGV4XSxcbiAgICAgIGV2ZW50LFxuICAgICAgdHlwZTogJ21vdmUnIGFzIGNvbnN0LFxuICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICBkeCxcbiAgICAgIGR5LFxuICAgICAgZHVwbGljYXRlOiBkdXBsaWNhdGVNb3ZlLFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfVxuXG4gICAgaWYgKCFkdXBsaWNhdGVNb3ZlKSB7XG4gICAgICAvLyBzZXQgcG9pbnRlciBjb29yZGluYXRlLCB0aW1lIGNoYW5nZXMgYW5kIHZlbG9jaXR5XG4gICAgICB1dGlscy5wb2ludGVyLnNldENvb3JkVmVsb2NpdHkodGhpcy5jb29yZHMudmVsb2NpdHksIHRoaXMuY29vcmRzLmRlbHRhKVxuICAgIH1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOm1vdmUnLCBzaWduYWxBcmcpXG5cbiAgICBpZiAoIWR1cGxpY2F0ZU1vdmUgJiYgIXRoaXMuc2ltdWxhdGlvbikge1xuICAgICAgLy8gaWYgaW50ZXJhY3RpbmcsIGZpcmUgYW4gJ2FjdGlvbi1tb3ZlJyBzaWduYWwgZXRjXG4gICAgICBpZiAodGhpcy5pbnRlcmFjdGluZygpKSB7XG4gICAgICAgIHNpZ25hbEFyZy50eXBlID0gbnVsbFxuICAgICAgICB0aGlzLm1vdmUoc2lnbmFsQXJnKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wb2ludGVyV2FzTW92ZWQpIHtcbiAgICAgICAgdXRpbHMucG9pbnRlci5jb3B5Q29vcmRzKHRoaXMuY29vcmRzLnByZXYsIHRoaXMuY29vcmRzLmN1cilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAgIC5kcmFnZ2FibGUodHJ1ZSlcbiAgICogICAub24oJ2RyYWdtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAqICAgICBpZiAoc29tZUNvbmRpdGlvbikge1xuICAgKiAgICAgICAvLyBjaGFuZ2UgdGhlIHNuYXAgc2V0dGluZ3NcbiAgICogICAgICAgZXZlbnQuaW50ZXJhY3RhYmxlLmRyYWdnYWJsZSh7IHNuYXA6IHsgdGFyZ2V0czogW10gfX0pXG4gICAqICAgICAgIC8vIGZpcmUgYW5vdGhlciBtb3ZlIGV2ZW50IHdpdGggcmUtY2FsY3VsYXRlZCBzbmFwXG4gICAqICAgICAgIGV2ZW50LmludGVyYWN0aW9uLm1vdmUoKVxuICAgKiAgICAgfVxuICAgKiAgIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBGb3JjZSBhIG1vdmUgb2YgdGhlIGN1cnJlbnQgYWN0aW9uIGF0IHRoZSBzYW1lIGNvb3JkaW5hdGVzLiBVc2VmdWwgaWZcbiAgICogc25hcC9yZXN0cmljdCBoYXMgYmVlbiBjaGFuZ2VkIGFuZCB5b3Ugd2FudCBhIG1vdmVtZW50IHdpdGggdGhlIG5ld1xuICAgKiBzZXR0aW5ncy5cbiAgICovXG4gIG1vdmUgKHNpZ25hbEFyZz8pIHtcbiAgICBpZiAoIXNpZ25hbEFyZyB8fCAhc2lnbmFsQXJnLmV2ZW50KSB7XG4gICAgICB1dGlscy5wb2ludGVyLnNldFplcm9Db29yZHModGhpcy5jb29yZHMuZGVsdGEpXG4gICAgfVxuXG4gICAgc2lnbmFsQXJnID0gdXRpbHMuZXh0ZW5kKHtcbiAgICAgIHBvaW50ZXI6IHRoaXMuX2xhdGVzdFBvaW50ZXIucG9pbnRlcixcbiAgICAgIGV2ZW50OiB0aGlzLl9sYXRlc3RQb2ludGVyLmV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQsXG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICB9LCBzaWduYWxBcmcgfHwge30pXG5cbiAgICBzaWduYWxBcmcucGhhc2UgPSAnbW92ZSdcblxuICAgIHRoaXMuX2RvUGhhc2Uoc2lnbmFsQXJnKVxuICB9XG5cbiAgLy8gRW5kIGludGVyYWN0IG1vdmUgZXZlbnRzIGFuZCBzdG9wIGF1dG8tc2Nyb2xsIHVubGVzcyBzaW11bGF0aW9uIGlzIHJ1bm5pbmdcbiAgcG9pbnRlclVwIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCwgY3VyRXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0KSB7XG4gICAgbGV0IHBvaW50ZXJJbmRleCA9IHRoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG5cbiAgICBpZiAocG9pbnRlckluZGV4ID09PSAtMSkge1xuICAgICAgcG9pbnRlckluZGV4ID0gdGhpcy51cGRhdGVQb2ludGVyKHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IC9jYW5jZWwkL2kudGVzdChldmVudC50eXBlKSA/ICdjYW5jZWwnIDogJ3VwJ1xuXG4gICAgdGhpcy5fc2NvcGVGaXJlKGBpbnRlcmFjdGlvbnM6JHt0eXBlfWAgYXMgJ2ludGVyYWN0aW9uczp1cCcgfCAnaW50ZXJhY3Rpb25zOmNhbmNlbCcsIHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBwb2ludGVySW5kZXgsXG4gICAgICBwb2ludGVySW5mbzogdGhpcy5wb2ludGVyc1twb2ludGVySW5kZXhdLFxuICAgICAgZXZlbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHR5cGU6IHR5cGUgYXMgYW55LFxuICAgICAgY3VyRXZlbnRUYXJnZXQsXG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICB9KVxuXG4gICAgaWYgKCF0aGlzLnNpbXVsYXRpb24pIHtcbiAgICAgIHRoaXMuZW5kKGV2ZW50KVxuICAgIH1cblxuICAgIHRoaXMucG9pbnRlcklzRG93biA9IGZhbHNlXG4gICAgdGhpcy5yZW1vdmVQb2ludGVyKHBvaW50ZXIsIGV2ZW50KVxuICB9XG5cbiAgZG9jdW1lbnRCbHVyIChldmVudCkge1xuICAgIHRoaXMuZW5kKGV2ZW50KVxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOmJsdXInLCB7IGV2ZW50LCB0eXBlOiAnYmx1cicsIGludGVyYWN0aW9uOiB0aGlzIH0pXG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAgIC5kcmFnZ2FibGUodHJ1ZSlcbiAgICogICAub24oJ21vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICogICAgIGlmIChldmVudC5wYWdlWCA+IDEwMDApIHtcbiAgICogICAgICAgLy8gZW5kIHRoZSBjdXJyZW50IGFjdGlvblxuICAgKiAgICAgICBldmVudC5pbnRlcmFjdGlvbi5lbmQoKVxuICAgKiAgICAgICAvLyBzdG9wIGFsbCBmdXJ0aGVyIGxpc3RlbmVycyBmcm9tIGJlaW5nIGNhbGxlZFxuICAgKiAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgKiAgICAgfVxuICAgKiAgIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gW2V2ZW50XVxuICAgKi9cbiAgZW5kIChldmVudD86IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9lbmRpbmcgPSB0cnVlXG4gICAgZXZlbnQgPSBldmVudCB8fCB0aGlzLl9sYXRlc3RQb2ludGVyLmV2ZW50XG4gICAgbGV0IGVuZFBoYXNlUmVzdWx0XG5cbiAgICBpZiAodGhpcy5pbnRlcmFjdGluZygpKSB7XG4gICAgICBlbmRQaGFzZVJlc3VsdCA9IHRoaXMuX2RvUGhhc2Uoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgICAgIHBoYXNlOiAnZW5kJyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fZW5kaW5nID0gZmFsc2VcblxuICAgIGlmIChlbmRQaGFzZVJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdG9wKClcbiAgICB9XG4gIH1cblxuICBjdXJyZW50QWN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJhY3RpbmcgPyB0aGlzLnByZXBhcmVkLm5hbWUgOiBudWxsXG4gIH1cblxuICBpbnRlcmFjdGluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW5nXG4gIH1cblxuICAvKiogKi9cbiAgc3RvcCAoKSB7XG4gICAgdGhpcy5fc2NvcGVGaXJlKCdpbnRlcmFjdGlvbnM6c3RvcCcsIHsgaW50ZXJhY3Rpb246IHRoaXMgfSlcblxuICAgIHRoaXMuaW50ZXJhY3RhYmxlID0gdGhpcy5lbGVtZW50ID0gbnVsbFxuXG4gICAgdGhpcy5faW50ZXJhY3RpbmcgPSBmYWxzZVxuICAgIHRoaXMuX3N0b3BwZWQgPSB0cnVlXG4gICAgdGhpcy5wcmVwYXJlZC5uYW1lID0gdGhpcy5wcmV2RXZlbnQgPSBudWxsXG4gIH1cblxuICBnZXRQb2ludGVySW5kZXggKHBvaW50ZXIpIHtcbiAgICBjb25zdCBwb2ludGVySWQgPSB1dGlscy5wb2ludGVyLmdldFBvaW50ZXJJZChwb2ludGVyKVxuXG4gICAgLy8gbW91c2UgYW5kIHBlbiBpbnRlcmFjdGlvbnMgbWF5IGhhdmUgb25seSBvbmUgcG9pbnRlclxuICAgIHJldHVybiAodGhpcy5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCB0aGlzLnBvaW50ZXJUeXBlID09PSAncGVuJylcbiAgICAgID8gdGhpcy5wb2ludGVycy5sZW5ndGggLSAxXG4gICAgICA6IHV0aWxzLmFyci5maW5kSW5kZXgodGhpcy5wb2ludGVycywgY3VyUG9pbnRlciA9PiBjdXJQb2ludGVyLmlkID09PSBwb2ludGVySWQpXG4gIH1cblxuICBnZXRQb2ludGVySW5mbyAocG9pbnRlcikge1xuICAgIHJldHVybiB0aGlzLnBvaW50ZXJzW3RoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXVxuICB9XG5cbiAgdXBkYXRlUG9pbnRlciAocG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUsIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLCBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsIGRvd24/OiBib29sZWFuKSB7XG4gICAgY29uc3QgaWQgPSB1dGlscy5wb2ludGVyLmdldFBvaW50ZXJJZChwb2ludGVyKVxuICAgIGxldCBwb2ludGVySW5kZXggPSB0aGlzLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuICAgIGxldCBwb2ludGVySW5mbyA9IHRoaXMucG9pbnRlcnNbcG9pbnRlckluZGV4XVxuXG4gICAgZG93biA9IGRvd24gPT09IGZhbHNlXG4gICAgICA/IGZhbHNlXG4gICAgICA6IGRvd24gfHwgLyhkb3dufHN0YXJ0KSQvaS50ZXN0KGV2ZW50LnR5cGUpXG5cbiAgICBpZiAoIXBvaW50ZXJJbmZvKSB7XG4gICAgICBwb2ludGVySW5mbyA9IG5ldyBQb2ludGVySW5mbyhcbiAgICAgICAgaWQsXG4gICAgICAgIHBvaW50ZXIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKVxuXG4gICAgICBwb2ludGVySW5kZXggPSB0aGlzLnBvaW50ZXJzLmxlbmd0aFxuICAgICAgdGhpcy5wb2ludGVycy5wdXNoKHBvaW50ZXJJbmZvKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHBvaW50ZXJJbmZvLnBvaW50ZXIgPSBwb2ludGVyXG4gICAgfVxuXG4gICAgdXRpbHMucG9pbnRlci5zZXRDb29yZHModGhpcy5jb29yZHMuY3VyLCB0aGlzLnBvaW50ZXJzLm1hcChwID0+IHAucG9pbnRlciksIHRoaXMuX25vdygpKVxuICAgIHV0aWxzLnBvaW50ZXIuc2V0Q29vcmREZWx0YXModGhpcy5jb29yZHMuZGVsdGEsIHRoaXMuY29vcmRzLnByZXYsIHRoaXMuY29vcmRzLmN1cilcblxuICAgIGlmIChkb3duKSB7XG4gICAgICB0aGlzLnBvaW50ZXJJc0Rvd24gPSB0cnVlXG5cbiAgICAgIHBvaW50ZXJJbmZvLmRvd25UaW1lID0gdGhpcy5jb29yZHMuY3VyLnRpbWVTdGFtcFxuICAgICAgcG9pbnRlckluZm8uZG93blRhcmdldCA9IGV2ZW50VGFyZ2V0XG4gICAgICB1dGlscy5wb2ludGVyLnBvaW50ZXJFeHRlbmQodGhpcy5kb3duUG9pbnRlciwgcG9pbnRlcilcblxuICAgICAgaWYgKCF0aGlzLmludGVyYWN0aW5nKCkpIHtcbiAgICAgICAgdXRpbHMucG9pbnRlci5jb3B5Q29vcmRzKHRoaXMuY29vcmRzLnN0YXJ0LCB0aGlzLmNvb3Jkcy5jdXIpXG4gICAgICAgIHV0aWxzLnBvaW50ZXIuY29weUNvb3Jkcyh0aGlzLmNvb3Jkcy5wcmV2LCB0aGlzLmNvb3Jkcy5jdXIpXG5cbiAgICAgICAgdGhpcy5kb3duRXZlbnQgPSBldmVudFxuICAgICAgICB0aGlzLnBvaW50ZXJXYXNNb3ZlZCA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlTGF0ZXN0UG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQpXG5cbiAgICB0aGlzLl9zY29wZUZpcmUoJ2ludGVyYWN0aW9uczp1cGRhdGUtcG9pbnRlcicsIHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBldmVudCxcbiAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgZG93bixcbiAgICAgIHBvaW50ZXJJbmZvLFxuICAgICAgcG9pbnRlckluZGV4LFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfSlcblxuICAgIHJldHVybiBwb2ludGVySW5kZXhcbiAgfVxuXG4gIHJlbW92ZVBvaW50ZXIgKHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLCBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSkge1xuICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IHRoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG5cbiAgICBpZiAocG9pbnRlckluZGV4ID09PSAtMSkgeyByZXR1cm4gfVxuXG4gICAgY29uc3QgcG9pbnRlckluZm8gPSB0aGlzLnBvaW50ZXJzW3BvaW50ZXJJbmRleF1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOnJlbW92ZS1wb2ludGVyJywge1xuICAgICAgcG9pbnRlcixcbiAgICAgIGV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IG51bGwsXG4gICAgICBwb2ludGVySW5kZXgsXG4gICAgICBwb2ludGVySW5mbyxcbiAgICAgIGludGVyYWN0aW9uOiB0aGlzLFxuICAgIH0pXG5cbiAgICB0aGlzLnBvaW50ZXJzLnNwbGljZShwb2ludGVySW5kZXgsIDEpXG4gIH1cblxuICBfdXBkYXRlTGF0ZXN0UG9pbnRlciAocG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5wb2ludGVyID0gcG9pbnRlclxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnQgPSBldmVudFxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldFxuICB9XG5cbiAgZGVzdHJveSAoKSB7XG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5wb2ludGVyID0gbnVsbFxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnQgPSBudWxsXG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5ldmVudFRhcmdldCA9IG51bGxcbiAgfVxuXG4gIF9jcmVhdGVQcmVwYXJlZEV2ZW50PFAgZXh0ZW5kcyBFdmVudFBoYXNlPiAoZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIHBoYXNlOiBQLCBwcmVFbmQ/OiBib29sZWFuLCB0eXBlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBJbnRlcmFjdEV2ZW50PFQsIFA+KHRoaXMsIGV2ZW50LCB0aGlzLnByZXBhcmVkLm5hbWUsIHBoYXNlLCB0aGlzLmVsZW1lbnQsIHByZUVuZCwgdHlwZSlcbiAgfVxuXG4gIF9maXJlRXZlbnQ8UCBleHRlbmRzIEV2ZW50UGhhc2U+IChpRXZlbnQ6IEludGVyYWN0RXZlbnQ8VCwgUD4pIHtcbiAgICB0aGlzLmludGVyYWN0YWJsZS5maXJlKGlFdmVudClcblxuICAgIGlmICghdGhpcy5wcmV2RXZlbnQgfHwgaUV2ZW50LnRpbWVTdGFtcCA+PSB0aGlzLnByZXZFdmVudC50aW1lU3RhbXApIHtcbiAgICAgIHRoaXMucHJldkV2ZW50ID0gaUV2ZW50XG4gICAgfVxuICB9XG5cbiAgX2RvUGhhc2U8UCBleHRlbmRzIEV2ZW50UGhhc2U+IChzaWduYWxBcmc6IE9taXQ8RG9QaGFzZUFyZzxULCBQPiwgJ2lFdmVudCc+ICYgeyBpRXZlbnQ/OiBJbnRlcmFjdEV2ZW50PFQsIFA+IH0pIHtcbiAgICBjb25zdCB7IGV2ZW50LCBwaGFzZSwgcHJlRW5kLCB0eXBlIH0gPSBzaWduYWxBcmdcbiAgICBjb25zdCB7IHJlY3QgfSA9IHRoaXNcblxuICAgIGlmIChyZWN0ICYmIHBoYXNlID09PSAnbW92ZScpIHtcbiAgICAgIC8vIHVwZGF0ZSB0aGUgcmVjdCBjaGFuZ2VzIGR1ZSB0byBwb2ludGVyIG1vdmVcbiAgICAgIHV0aWxzLnJlY3QuYWRkRWRnZXModGhpcy5lZGdlcywgcmVjdCwgdGhpcy5jb29yZHMuZGVsdGFbdGhpcy5pbnRlcmFjdGFibGUub3B0aW9ucy5kZWx0YVNvdXJjZV0pXG5cbiAgICAgIHJlY3Qud2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0XG4gICAgICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgICB9XG5cbiAgICBjb25zdCBiZWZvcmVSZXN1bHQgPSB0aGlzLl9zY29wZUZpcmUoYGludGVyYWN0aW9uczpiZWZvcmUtYWN0aW9uLSR7cGhhc2V9YCBhcyBhbnksIHNpZ25hbEFyZylcblxuICAgIGlmIChiZWZvcmVSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBpRXZlbnQgPSBzaWduYWxBcmcuaUV2ZW50ID0gdGhpcy5fY3JlYXRlUHJlcGFyZWRFdmVudChldmVudCwgcGhhc2UsIHByZUVuZCwgdHlwZSlcblxuICAgIHRoaXMuX3Njb3BlRmlyZShgaW50ZXJhY3Rpb25zOmFjdGlvbi0ke3BoYXNlfWAgYXMgYW55LCBzaWduYWxBcmcpXG5cbiAgICBpZiAocGhhc2UgPT09ICdzdGFydCcpIHsgdGhpcy5wcmV2RXZlbnQgPSBpRXZlbnQgfVxuXG4gICAgdGhpcy5fZmlyZUV2ZW50KGlFdmVudClcblxuICAgIHRoaXMuX3Njb3BlRmlyZShgaW50ZXJhY3Rpb25zOmFmdGVyLWFjdGlvbi0ke3BoYXNlfWAgYXMgYW55LCBzaWduYWxBcmcpXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX25vdyAoKSB7IHJldHVybiBEYXRlLm5vdygpIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJhY3Rpb25cbmV4cG9ydCB7IFBvaW50ZXJJbmZvIH1cbiIsImltcG9ydCAqIGFzIGRvbSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21VdGlscydcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hEZXRhaWxzIHtcbiAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGVcbiAgcG9pbnRlcklkOiBudW1iZXJcbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuICBldmVudFR5cGU6IHN0cmluZ1xuICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgY3VyRXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZVxufVxuXG5jb25zdCBmaW5kZXIgPSB7XG4gIG1ldGhvZE9yZGVyOiBbJ3NpbXVsYXRpb25SZXN1bWUnLCAnbW91c2VPclBlbicsICdoYXNQb2ludGVyJywgJ2lkbGUnXSBhcyBjb25zdCxcblxuICBzZWFyY2ggKGRldGFpbHM6IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBmaW5kZXIubWV0aG9kT3JkZXIpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZmluZGVyW21ldGhvZF0oZGV0YWlscylcblxuICAgICAgaWYgKGludGVyYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgLy8gdHJ5IHRvIHJlc3VtZSBzaW11bGF0aW9uIHdpdGggYSBuZXcgcG9pbnRlclxuICBzaW11bGF0aW9uUmVzdW1lICh7IHBvaW50ZXJUeXBlLCBldmVudFR5cGUsIGV2ZW50VGFyZ2V0LCBzY29wZSB9OiBTZWFyY2hEZXRhaWxzKSB7XG4gICAgaWYgKCEvZG93bnxzdGFydC9pLnRlc3QoZXZlbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICBsZXQgZWxlbWVudCA9IGV2ZW50VGFyZ2V0IGFzIE5vZGVcblxuICAgICAgaWYgKGludGVyYWN0aW9uLnNpbXVsYXRpb24gJiYgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbi5hbGxvd1Jlc3VtZSAmJlxuICAgICAgICAgIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpKSB7XG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XG4gICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgdGhlIGludGVyYWN0aW9uIGVsZW1lbnRcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gaW50ZXJhY3Rpb24uZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGludGVyYWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQgPSBkb20ucGFyZW50Tm9kZShlbGVtZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICAvLyBpZiBpdCdzIGEgbW91c2Ugb3IgcGVuIGludGVyYWN0aW9uXG4gIG1vdXNlT3JQZW4gKHsgcG9pbnRlcklkLCBwb2ludGVyVHlwZSwgZXZlbnRUeXBlLCBzY29wZSB9OiBTZWFyY2hEZXRhaWxzKSB7XG4gICAgaWYgKHBvaW50ZXJUeXBlICE9PSAnbW91c2UnICYmIHBvaW50ZXJUeXBlICE9PSAncGVuJykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBsZXQgZmlyc3ROb25BY3RpdmVcblxuICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpIHtcbiAgICAgICAgLy8gaWYgaXQncyBhIGRvd24gZXZlbnQsIHNraXAgaW50ZXJhY3Rpb25zIHdpdGggcnVubmluZyBzaW11bGF0aW9uc1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiAmJiAhaGFzUG9pbnRlcklkKGludGVyYWN0aW9uLCBwb2ludGVySWQpKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICAvLyBpZiB0aGUgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLCByZXR1cm4gaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2Ugc2F2ZSBpdCBhbmQgbG9vayBmb3IgYW5vdGhlciBhY3RpdmUgaW50ZXJhY3Rpb25cbiAgICAgICAgZWxzZSBpZiAoIWZpcnN0Tm9uQWN0aXZlKSB7XG4gICAgICAgICAgZmlyc3ROb25BY3RpdmUgPSBpbnRlcmFjdGlvblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgbm8gYWN0aXZlIG1vdXNlIGludGVyYWN0aW9uIHdhcyBmb3VuZCB1c2UgdGhlIGZpcnN0IGluYWN0aXZlIG1vdXNlXG4gICAgLy8gaW50ZXJhY3Rpb25cbiAgICBpZiAoZmlyc3ROb25BY3RpdmUpIHtcbiAgICAgIHJldHVybiBmaXJzdE5vbkFjdGl2ZVxuICAgIH1cblxuICAgIC8vIGZpbmQgYW55IG1vdXNlIG9yIHBlbiBpbnRlcmFjdGlvbi5cbiAgICAvLyBpZ25vcmUgdGhlIGludGVyYWN0aW9uIGlmIHRoZSBldmVudFR5cGUgaXMgYSAqZG93biwgYW5kIGEgc2ltdWxhdGlvblxuICAgIC8vIGlzIGFjdGl2ZVxuICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUgJiYgISgvZG93bi9pLnRlc3QoZXZlbnRUeXBlKSAmJiBpbnRlcmFjdGlvbi5zaW11bGF0aW9uKSkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIC8vIGdldCBpbnRlcmFjdGlvbiB0aGF0IGhhcyB0aGlzIHBvaW50ZXJcbiAgaGFzUG9pbnRlciAoeyBwb2ludGVySWQsIHNjb3BlIH06IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICBpZiAoaGFzUG9pbnRlcklkKGludGVyYWN0aW9uLCBwb2ludGVySWQpKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgLy8gZ2V0IGZpcnN0IGlkbGUgaW50ZXJhY3Rpb24gd2l0aCBhIG1hdGNoaW5nIHBvaW50ZXJUeXBlXG4gIGlkbGUgKHsgcG9pbnRlclR5cGUsIHNjb3BlIH06IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICAvLyBpZiB0aGVyZSdzIGFscmVhZHkgYSBwb2ludGVyIGhlbGQgZG93blxuICAgICAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGVcbiAgICAgICAgLy8gZG9uJ3QgYWRkIHRoaXMgcG9pbnRlciBpZiB0aGVyZSBpcyBhIHRhcmdldCBpbnRlcmFjdGFibGUgYW5kIGl0XG4gICAgICAgIC8vIGlzbid0IGdlc3R1cmFibGVcbiAgICAgICAgaWYgKHRhcmdldCAmJiAhKHRhcmdldC5vcHRpb25zLmdlc3R1cmUgJiYgdGFyZ2V0Lm9wdGlvbnMuZ2VzdHVyZS5lbmFibGVkKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG1heGltdW0gb2YgMiBwb2ludGVycyBwZXIgaW50ZXJhY3Rpb25cbiAgICAgIGVsc2UgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSAmJiAocG9pbnRlclR5cGUgPT09IGludGVyYWN0aW9uLnBvaW50ZXJUeXBlKSkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxufVxuXG5mdW5jdGlvbiBoYXNQb2ludGVySWQgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiwgcG9pbnRlcklkOiBudW1iZXIpIHtcbiAgcmV0dXJuIGludGVyYWN0aW9uLnBvaW50ZXJzLnNvbWUoKHsgaWQgfSkgPT4gaWQgPT09IHBvaW50ZXJJZClcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmluZGVyXG4iLCJpbXBvcnQgeyBtYXRjaGVzU2VsZWN0b3IsIG5vZGVDb250YWlucyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV2ZW50cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ldmVudHMnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcbmltcG9ydCB7IGdldFdpbmRvdyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3dpbmRvdydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIHByZXZlbnREZWZhdWx0OiB0eXBlb2YgcHJldmVudERlZmF1bHRcbiAgICBjaGVja0FuZFByZXZlbnREZWZhdWx0OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkXG4gIH1cbn1cblxudHlwZSBQcmV2ZW50RGVmYXVsdFZhbHVlID0gJ2Fsd2F5cycgfCAnbmV2ZXInIHwgJ2F1dG8nXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKTogUHJldmVudERlZmF1bHRWYWx1ZVxuZnVuY3Rpb24gcHJldmVudERlZmF1bHQgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU6IFByZXZlbnREZWZhdWx0VmFsdWUpOiB0eXBlb2YgdGhpc1xuZnVuY3Rpb24gcHJldmVudERlZmF1bHQgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU/OiBQcmV2ZW50RGVmYXVsdFZhbHVlKSB7XG4gIGlmICgvXihhbHdheXN8bmV2ZXJ8YXV0bykkLy50ZXN0KG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCA9IG5ld1ZhbHVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGlmIChpcy5ib29sKG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCA9IG5ld1ZhbHVlID8gJ2Fsd2F5cycgOiAnbmV2ZXInXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMucHJldmVudERlZmF1bHRcbn1cblxuZnVuY3Rpb24gY2hlY2tBbmRQcmV2ZW50RGVmYXVsdCAoaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIHNjb3BlOiBJbnRlcmFjdC5TY29wZSwgZXZlbnQ6IEV2ZW50KSB7XG4gIGNvbnN0IHNldHRpbmcgPSBpbnRlcmFjdGFibGUub3B0aW9ucy5wcmV2ZW50RGVmYXVsdFxuXG4gIGlmIChzZXR0aW5nID09PSAnbmV2ZXInKSB7IHJldHVybiB9XG5cbiAgaWYgKHNldHRpbmcgPT09ICdhbHdheXMnKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gc2V0dGluZyA9PT0gJ2F1dG8nXG5cbiAgLy8gaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMgYW5kIGlzbid0IHJ1bm5pbmcgb24gaU9TLFxuICAvLyBkb24ndCBwcmV2ZW50RGVmYXVsdCBvZiB0b3VjaHtzdGFydCxtb3ZlfSBldmVudHMuIENTUyB0b3VjaC1hY3Rpb24gYW5kXG4gIC8vIHVzZXItc2VsZWN0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgY2FsbGluZyBldmVudC5wcmV2ZW50RGVmYXVsdCgpLlxuICBpZiAoZXZlbnRzLnN1cHBvcnRzUGFzc2l2ZSAmJiAvXnRvdWNoKHN0YXJ0fG1vdmUpJC8udGVzdChldmVudC50eXBlKSkge1xuICAgIGNvbnN0IGRvYyA9IGdldFdpbmRvdyhldmVudC50YXJnZXQpLmRvY3VtZW50XG4gICAgY29uc3QgZG9jT3B0aW9ucyA9IHNjb3BlLmdldERvY09wdGlvbnMoZG9jKVxuXG4gICAgaWYgKCEoZG9jT3B0aW9ucyAmJiBkb2NPcHRpb25zLmV2ZW50cykgfHwgZG9jT3B0aW9ucy5ldmVudHMucGFzc2l2ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8vIGRvbid0IHByZXZlbnREZWZhdWx0IG9mIHBvaW50ZXJkb3duIGV2ZW50c1xuICBpZiAoL14obW91c2V8cG9pbnRlcnx0b3VjaCkqKGRvd258c3RhcnQpL2kudGVzdChldmVudC50eXBlKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gZG9uJ3QgcHJldmVudERlZmF1bHQgb24gZWRpdGFibGUgZWxlbWVudHNcbiAgaWYgKGlzLmVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgbWF0Y2hlc1NlbGVjdG9yKGV2ZW50LnRhcmdldCwgJ2lucHV0LHNlbGVjdCx0ZXh0YXJlYSxbY29udGVudGVkaXRhYmxlPXRydWVdLFtjb250ZW50ZWRpdGFibGU9dHJ1ZV0gKicpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG5cbmZ1bmN0aW9uIG9uSW50ZXJhY3Rpb25FdmVudCAoeyBpbnRlcmFjdGlvbiwgZXZlbnQgfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSkge1xuICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5jaGVja0FuZFByZXZlbnREZWZhdWx0KGV2ZW50IGFzIEV2ZW50KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsIChzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgY29uc3QgeyBJbnRlcmFjdGFibGUgfSA9IHNjb3BlXG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB3aGV0aGVyIHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW91ciBpblxuICAgKiByZXNwb25zZSB0byBwb2ludGVyIGV2ZW50cy4gQ2FuIGJlIHNldCB0bzpcbiAgICogIC0gYCdhbHdheXMnYCB0byBhbHdheXMgcHJldmVudFxuICAgKiAgLSBgJ25ldmVyJ2AgdG8gbmV2ZXIgcHJldmVudFxuICAgKiAgLSBgJ2F1dG8nYCB0byBsZXQgaW50ZXJhY3QuanMgdHJ5IHRvIGRldGVybWluZSB3aGF0IHdvdWxkIGJlIGJlc3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuZXdWYWx1ZV0gYCdhbHdheXMnYCwgYCduZXZlcidgIG9yIGAnYXV0bydgXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IEludGVyYWN0YWJsZX0gVGhlIGN1cnJlbnQgc2V0dGluZyBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IHByZXZlbnREZWZhdWx0XG5cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5jaGVja0FuZFByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGNoZWNrQW5kUHJldmVudERlZmF1bHQodGhpcywgc2NvcGUsIGV2ZW50KVxuICB9XG5cbiAgLy8gcHJldmVudCBuYXRpdmUgSFRNTDUgZHJhZyBvbiBpbnRlcmFjdC5qcyB0YXJnZXQgZWxlbWVudHNcbiAgc2NvcGUuaW50ZXJhY3Rpb25zLmRvY0V2ZW50cy5wdXNoKHtcbiAgICB0eXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICBsaXN0ZW5lciAoZXZlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmVsZW1lbnQgJiZcbiAgICAgICAgICAoaW50ZXJhY3Rpb24uZWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0IHx8XG4gICAgICAgICAgIG5vZGVDb250YWlucyhpbnRlcmFjdGlvbi5lbGVtZW50LCBldmVudC50YXJnZXQpKSkge1xuICAgICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5jaGVja0FuZFByZXZlbnREZWZhdWx0KGV2ZW50KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2NvcmUvaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IFsnZG93bicsICdtb3ZlJywgJ3VwJywgJ2NhbmNlbCddLnJlZHVjZSgoYWNjLCBldmVudFR5cGUpID0+IHtcbiAgICBhY2NbYGludGVyYWN0aW9uczoke2V2ZW50VHlwZX1gXSA9IG9uSW50ZXJhY3Rpb25FdmVudFxuICAgIHJldHVybiBhY2NcbiAgfSwge30gYXMgYW55KSxcbn1cbiIsImltcG9ydCBCYXNlRXZlbnQgZnJvbSAnQGludGVyYWN0anMvY29yZS9CYXNlRXZlbnQnXG5pbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IEludGVyYWN0RXZlbnQgZnJvbSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcblxuY2xhc3MgRHJvcEV2ZW50IGV4dGVuZHMgQmFzZUV2ZW50IHtcbiAgdGFyZ2V0OiBJbnRlcmFjdC5FbGVtZW50XG4gIGRyb3B6b25lOiBJbnRlcmFjdGFibGVcbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdEV2ZW50PCdkcmFnJz5cbiAgcmVsYXRlZFRhcmdldDogSW50ZXJhY3QuRWxlbWVudFxuICBkcmFnZ2FibGU6IEludGVyYWN0YWJsZVxuICB0aW1lU3RhbXA6IG51bWJlclxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBDbGFzcyBvZiBldmVudHMgZmlyZWQgb24gZHJvcHpvbmVzIGR1cmluZyBkcmFncyB3aXRoIGFjY2VwdGFibGUgdGFyZ2V0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChkcm9wU3RhdGU6IGltcG9ydCgnLi8nKS5Ecm9wU3RhdGUsIGRyYWdFdmVudDogSW50ZXJhY3RFdmVudDwnZHJhZyc+LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihkcmFnRXZlbnQuX2ludGVyYWN0aW9uKVxuXG4gICAgY29uc3QgeyBlbGVtZW50LCBkcm9wem9uZSB9ID0gdHlwZSA9PT0gJ2RyYWdsZWF2ZSdcbiAgICAgID8gZHJvcFN0YXRlLnByZXZcbiAgICAgIDogZHJvcFN0YXRlLmN1clxuXG4gICAgdGhpcy50eXBlICAgICAgICAgID0gdHlwZVxuICAgIHRoaXMudGFyZ2V0ICAgICAgICA9IGVsZW1lbnRcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50XG4gICAgdGhpcy5kcm9wem9uZSAgICAgID0gZHJvcHpvbmVcbiAgICB0aGlzLmRyYWdFdmVudCAgICAgPSBkcmFnRXZlbnRcbiAgICB0aGlzLnJlbGF0ZWRUYXJnZXQgPSBkcmFnRXZlbnQudGFyZ2V0XG4gICAgdGhpcy5kcmFnZ2FibGUgICAgID0gZHJhZ0V2ZW50LmludGVyYWN0YWJsZVxuICAgIHRoaXMudGltZVN0YW1wICAgICA9IGRyYWdFdmVudC50aW1lU3RhbXBcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIGEgYGRyb3BhY3RpdmF0ZWAgZXZlbnQsIHRoZSBkcm9wem9uZSBlbGVtZW50IHdpbGwgYmVcbiAgICogZGVhY3RpdmF0ZWQuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYSBgZHJhZ21vdmVgIG9yIGBkcmFnZW50ZXJgLCBhIGBkcmFnbGVhdmVgIHdpbGwgYmUgZmlyZWQgb24gdGhlXG4gICAqIGRyb3B6b25lIGVsZW1lbnQgYW5kIG1vcmUuXG4gICAqL1xuICByZWplY3QgKCkge1xuICAgIGNvbnN0IHsgZHJvcFN0YXRlIH0gPSB0aGlzLl9pbnRlcmFjdGlvblxuXG4gICAgaWYgKFxuICAgICAgKHRoaXMudHlwZSAhPT0gJ2Ryb3BhY3RpdmF0ZScpICYmIChcbiAgICAgICAgIXRoaXMuZHJvcHpvbmUgfHxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSAhPT0gdGhpcy5kcm9wem9uZSB8fFxuICAgICAgICBkcm9wU3RhdGUuY3VyLmVsZW1lbnQgIT09IHRoaXMudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZHJvcFN0YXRlLnByZXYuZHJvcHpvbmUgPSB0aGlzLmRyb3B6b25lXG4gICAgZHJvcFN0YXRlLnByZXYuZWxlbWVudCA9IHRoaXMudGFyZ2V0XG5cbiAgICBkcm9wU3RhdGUucmVqZWN0ZWQgPSB0cnVlXG4gICAgZHJvcFN0YXRlLmV2ZW50cy5lbnRlciA9IG51bGxcblxuICAgIHRoaXMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkcm9wYWN0aXZhdGUnKSB7XG4gICAgICBjb25zdCBhY3RpdmVEcm9wcyA9IGRyb3BTdGF0ZS5hY3RpdmVEcm9wc1xuICAgICAgY29uc3QgaW5kZXggPSBhcnIuZmluZEluZGV4KGFjdGl2ZURyb3BzLCAoeyBkcm9wem9uZSwgZWxlbWVudCB9KSA9PlxuICAgICAgICBkcm9wem9uZSA9PT0gdGhpcy5kcm9wem9uZSAmJiBlbGVtZW50ID09PSB0aGlzLnRhcmdldClcblxuICAgICAgZHJvcFN0YXRlLmFjdGl2ZURyb3BzLnNwbGljZShpbmRleCwgMSlcblxuICAgICAgY29uc3QgZGVhY3RpdmF0ZUV2ZW50ID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIHRoaXMuZHJhZ0V2ZW50LCAnZHJvcGRlYWN0aXZhdGUnKVxuXG4gICAgICBkZWFjdGl2YXRlRXZlbnQuZHJvcHpvbmUgPSB0aGlzLmRyb3B6b25lXG4gICAgICBkZWFjdGl2YXRlRXZlbnQudGFyZ2V0ID0gdGhpcy50YXJnZXRcblxuICAgICAgdGhpcy5kcm9wem9uZS5maXJlKGRlYWN0aXZhdGVFdmVudClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRyb3B6b25lLmZpcmUobmV3IERyb3BFdmVudChkcm9wU3RhdGUsIHRoaXMuZHJhZ0V2ZW50LCAnZHJhZ2xlYXZlJykpXG4gICAgfVxuICB9XG5cbiAgcHJldmVudERlZmF1bHQgKCkge31cblxuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERyb3BFdmVudFxuIiwiaW1wb3J0IEludGVyYWN0YWJsZSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZSdcbmltcG9ydCBJbnRlcmFjdEV2ZW50IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RFdmVudCdcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9zY29wZSdcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0IGRyYWcgZnJvbSAnLi4vZHJhZydcbmltcG9ydCBEcm9wRXZlbnQgZnJvbSAnLi9Ecm9wRXZlbnQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcHpvbmVNZXRob2Qge1xuICAob3B0aW9uczogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zIHwgYm9vbGVhbik6IEludGVyYWN0LkludGVyYWN0YWJsZVxuICAoKTogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBkcm9wem9uZTogRHJvcHpvbmVNZXRob2RcbiAgICBkcm9wQ2hlY2s6IChcbiAgICAgIGRyYWdFdmVudDogSW50ZXJhY3RFdmVudCxcbiAgICAgIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLFxuICAgICAgZHJhZ2dhYmxlOiBJbnRlcmFjdGFibGUsXG4gICAgICBkcmFnZ2FibGVFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgICAgZHJvcEVsZW1lbjogSW50ZXJhY3QuRWxlbWVudCxcbiAgICAgIHJlY3Q6IGFueVxuICAgICkgPT4gYm9vbGVhblxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgZHJvcFN0YXRlPzogRHJvcFN0YXRlXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBkcm9wOiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgQWN0aW9uTWFwIHtcbiAgICBkcm9wPzogdHlwZW9mIGRyb3BcbiAgfVxuXG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgZHluYW1pY0Ryb3A/OiBib29sZWFuXG4gIH1cblxuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2FjdGlvbnMvZHJvcDpzdGFydCc6IERyb3BTaWduYWxBcmdcbiAgICAnYWN0aW9ucy9kcm9wOm1vdmUnOiBEcm9wU2lnbmFsQXJnXG4gICAgJ2FjdGlvbnMvZHJvcDplbmQnOiBEcm9wU2lnbmFsQXJnXG4gIH1cbn1cblxuaW50ZXJmYWNlIERyb3BTaWduYWxBcmcge1xuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdC5EcmFnRXZlbnRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEcm9wU3RhdGUge1xuICBjdXI6IHtcbiAgICBkcm9wem9uZTogSW50ZXJhY3RhYmxlICAgIC8vIHRoZSBkcm9wem9uZSBhIGRyYWcgdGFyZ2V0IG1pZ2h0IGJlIGRyb3BwZWQgaW50b1xuICAgIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQgLy8gdGhlIGVsZW1lbnQgYXQgdGhlIHRpbWUgb2YgY2hlY2tpbmdcbiAgfVxuICBwcmV2OiB7XG4gICAgZHJvcHpvbmU6IEludGVyYWN0YWJsZSAgICAvLyB0aGUgZHJvcHpvbmUgdGhhdCB3YXMgcmVjZW50bHkgZHJhZ2dlZCBhd2F5IGZyb21cbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50IC8vIHRoZSBlbGVtZW50IGF0IHRoZSB0aW1lIG9mIGNoZWNraW5nXG4gIH1cbiAgcmVqZWN0ZWQ6IGJvb2xlYW4gICAgICAgICAgIC8vIHdoZWF0aGVyIHRoZSBwb3RlbnRpYWwgZHJvcCB3YXMgcmVqZWN0ZWQgZnJvbSBhIGxpc3RlbmVyXG4gIGV2ZW50czogYW55ICAgICAgICAgICAgICAgICAvLyB0aGUgZHJvcCBldmVudHMgcmVsYXRlZCB0byB0aGUgY3VycmVudCBkcmFnIGV2ZW50XG4gIGFjdGl2ZURyb3BzOiBBcnJheTx7XG4gICAgZHJvcHpvbmU6IEludGVyYWN0YWJsZVxuICAgIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbiAgICByZWN0OiBJbnRlcmFjdC5SZWN0XG4gIH0+XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgYWN0aW9ucyxcbiAgICAvKiogQGxlbmRzIG1vZHVsZTppbnRlcmFjdCAqL1xuICAgIGludGVyYWN0LFxuICAgIC8qKiBAbGVuZHMgSW50ZXJhY3RhYmxlICovXG4gICAgSW50ZXJhY3RhYmxlLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNoYWRvd1xuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS51c2VQbHVnaW4oZHJhZylcblxuICAvKipcbiAgICpcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QoJy5kcm9wJykuZHJvcHpvbmUoe1xuICAgKiAgIGFjY2VwdDogJy5jYW4tZHJvcCcgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbmdsZS1kcm9wJyksXG4gICAqICAgb3ZlcmxhcDogJ3BvaW50ZXInIHx8ICdjZW50ZXInIHx8IHplcm9Ub09uZVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXR1cm5zIG9yIHNldHMgd2hldGhlciBkcmFnZ2FibGVzIGNhbiBiZSBkcm9wcGVkIG9udG8gdGhpcyB0YXJnZXQgdG9cbiAgICogdHJpZ2dlciBkcm9wIGV2ZW50c1xuICAgKlxuICAgKiBEcm9wem9uZXMgY2FuIHJlY2VpdmUgdGhlIGZvbGxvd2luZyBldmVudHM6XG4gICAqICAtIGBkcm9wYWN0aXZhdGVgIGFuZCBgZHJvcGRlYWN0aXZhdGVgIHdoZW4gYW4gYWNjZXB0YWJsZSBkcmFnIHN0YXJ0cyBhbmQgZW5kc1xuICAgKiAgLSBgZHJhZ2VudGVyYCBhbmQgYGRyYWdsZWF2ZWAgd2hlbiBhIGRyYWdnYWJsZSBlbnRlcnMgYW5kIGxlYXZlcyB0aGUgZHJvcHpvbmVcbiAgICogIC0gYGRyYWdtb3ZlYCB3aGVuIGEgZHJhZ2dhYmxlIHRoYXQgaGFzIGVudGVyZWQgdGhlIGRyb3B6b25lIGlzIG1vdmVkXG4gICAqICAtIGBkcm9wYCB3aGVuIGEgZHJhZ2dhYmxlIGlzIGRyb3BwZWQgaW50byB0aGlzIGRyb3B6b25lXG4gICAqXG4gICAqIFVzZSB0aGUgYGFjY2VwdGAgb3B0aW9uIHRvIGFsbG93IG9ubHkgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gQ1NTXG4gICAqIHNlbGVjdG9yIG9yIGVsZW1lbnQuIFRoZSB2YWx1ZSBjYW4gYmU6XG4gICAqXG4gICAqICAtICoqYW4gRWxlbWVudCoqIC0gb25seSB0aGF0IGVsZW1lbnQgY2FuIGJlIGRyb3BwZWQgaW50byB0aGlzIGRyb3B6b25lLlxuICAgKiAgLSAqKmEgc3RyaW5nKiosIC0gdGhlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZCBtdXN0IG1hdGNoIGl0IGFzIGEgQ1NTIHNlbGVjdG9yLlxuICAgKiAgLSAqKmBudWxsYCoqIC0gYWNjZXB0IG9wdGlvbnMgaXMgY2xlYXJlZCAtIGl0IGFjY2VwdHMgYW55IGVsZW1lbnQuXG4gICAqXG4gICAqIFVzZSB0aGUgYG92ZXJsYXBgIG9wdGlvbiB0byBzZXQgaG93IGRyb3BzIGFyZSBjaGVja2VkIGZvci4gVGhlIGFsbG93ZWRcbiAgICogdmFsdWVzIGFyZTpcbiAgICpcbiAgICogICAtIGAncG9pbnRlcidgLCB0aGUgcG9pbnRlciBtdXN0IGJlIG92ZXIgdGhlIGRyb3B6b25lIChkZWZhdWx0KVxuICAgKiAgIC0gYCdjZW50ZXInYCwgdGhlIGRyYWdnYWJsZSBlbGVtZW50J3MgY2VudGVyIG11c3QgYmUgb3ZlciB0aGUgZHJvcHpvbmVcbiAgICogICAtIGEgbnVtYmVyIGZyb20gMC0xIHdoaWNoIGlzIHRoZSBgKGludGVyc2VjdGlvbiBhcmVhKSAvIChkcmFnZ2FibGUgYXJlYSlgLlxuICAgKiAgIGUuZy4gYDAuNWAgZm9yIGRyb3AgdG8gaGFwcGVuIHdoZW4gaGFsZiBvZiB0aGUgYXJlYSBvZiB0aGUgZHJhZ2dhYmxlIGlzXG4gICAqICAgb3ZlciB0aGUgZHJvcHpvbmVcbiAgICpcbiAgICogVXNlIHRoZSBgY2hlY2tlcmAgb3B0aW9uIHRvIHNwZWNpZnkgYSBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGRyYWdnZWQgZWxlbWVudFxuICAgKiBpcyBvdmVyIHRoaXMgSW50ZXJhY3RhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW4gfCBvYmplY3QgfCBudWxsfSBbb3B0aW9uc10gVGhlIG5ldyBvcHRpb25zIHRvIGJlIHNldC5cbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IEludGVyYWN0YWJsZX0gVGhlIGN1cnJlbnQgc2V0dGluZyBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5kcm9wem9uZSA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIG9wdGlvbnM/OiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnMgfCBib29sZWFuKSB7XG4gICAgcmV0dXJuIGRyb3B6b25lTWV0aG9kKHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAuZHJvcENoZWNrZXIoZnVuY3Rpb24oZHJhZ0V2ZW50LCAgICAgICAgIC8vIHJlbGF0ZWQgZHJhZ21vdmUgb3IgZHJhZ2VuZCBldmVudFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsICAgICAgICAgICAgIC8vIFRvdWNoRXZlbnQvUG9pbnRlckV2ZW50L01vdXNlRXZlbnRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsICAgICAgICAgICAvLyBib29sIHJlc3VsdCBvZiB0aGUgZGVmYXVsdCBjaGVja2VyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcm9wem9uZSwgICAgICAgICAgLy8gZHJvcHpvbmUgSW50ZXJhY3RhYmxlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcm9wRWxlbWVudCwgICAgICAgLy8gZHJvcHpvbmUgZWxlbW50XG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGUsICAgICAgICAgLy8gZHJhZ2dhYmxlIEludGVyYWN0YWJsZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlRWxlbWVudCkgey8vIGRyYWdnYWJsZSBlbGVtZW50XG4gICAqXG4gICAqICAgcmV0dXJuIGRyb3BwZWQgJiYgZXZlbnQudGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnYWxsb3ctZHJvcCcpXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyb3BDaGVjayA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIGRyYWdFdmVudCwgZXZlbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudCwgZHJvcEVsZW1lbnQsIHJlY3QpIHtcbiAgICByZXR1cm4gZHJvcENoZWNrTWV0aG9kKHRoaXMsIGRyYWdFdmVudCwgZXZlbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudCwgZHJvcEVsZW1lbnQsIHJlY3QpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHdoZXRoZXIgdGhlIGRpbWVuc2lvbnMgb2YgZHJvcHpvbmUgZWxlbWVudHMgYXJlIGNhbGN1bGF0ZWRcbiAgICogb24gZXZlcnkgZHJhZ21vdmUgb3Igb25seSBvbiBkcmFnc3RhcnQgZm9yIHRoZSBkZWZhdWx0IGRyb3BDaGVja2VyXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25ld1ZhbHVlXSBUcnVlIHRvIGNoZWNrIG9uIGVhY2ggbW92ZS4gRmFsc2UgdG8gY2hlY2sgb25seVxuICAgKiBiZWZvcmUgc3RhcnRcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IGludGVyYWN0fSBUaGUgY3VycmVudCBzZXR0aW5nIG9yIGludGVyYWN0XG4gICAqL1xuICBpbnRlcmFjdC5keW5hbWljRHJvcCA9IGZ1bmN0aW9uIChuZXdWYWx1ZT86IGJvb2xlYW4pIHtcbiAgICBpZiAodXRpbHMuaXMuYm9vbChuZXdWYWx1ZSkpIHtcbiAgICAgIC8vIGlmIChkcmFnZ2luZyAmJiBzY29wZS5keW5hbWljRHJvcCAhPT0gbmV3VmFsdWUgJiYgIW5ld1ZhbHVlKSB7XG4gICAgICAvLyAgY2FsY1JlY3RzKGRyb3B6b25lcylcbiAgICAgIC8vIH1cblxuICAgICAgc2NvcGUuZHluYW1pY0Ryb3AgPSBuZXdWYWx1ZVxuXG4gICAgICByZXR1cm4gaW50ZXJhY3RcbiAgICB9XG4gICAgcmV0dXJuIHNjb3BlLmR5bmFtaWNEcm9wXG4gIH1cblxuICB1dGlscy5leHRlbmQoYWN0aW9ucy5waGFzZWxlc3NUeXBlcywge1xuICAgIGRyYWdlbnRlcjogdHJ1ZSxcbiAgICBkcmFnbGVhdmU6IHRydWUsXG4gICAgZHJvcGFjdGl2YXRlOiB0cnVlLFxuICAgIGRyb3BkZWFjdGl2YXRlOiB0cnVlLFxuICAgIGRyb3Btb3ZlOiB0cnVlLFxuICAgIGRyb3A6IHRydWUsXG4gIH0pXG4gIGFjdGlvbnMubWV0aG9kRGljdC5kcm9wID0gJ2Ryb3B6b25lJ1xuXG4gIHNjb3BlLmR5bmFtaWNEcm9wID0gZmFsc2VcblxuICBkZWZhdWx0cy5hY3Rpb25zLmRyb3AgPSBkcm9wLmRlZmF1bHRzXG59XG5cbmZ1bmN0aW9uIGNvbGxlY3REcm9wcyAoeyBpbnRlcmFjdGFibGVzIH0sIGRyYWdnYWJsZUVsZW1lbnQpIHtcbiAgY29uc3QgZHJvcHMgPSBbXVxuXG4gIC8vIGNvbGxlY3QgYWxsIGRyb3B6b25lcyBhbmQgdGhlaXIgZWxlbWVudHMgd2hpY2ggcXVhbGlmeSBmb3IgYSBkcm9wXG4gIGZvciAoY29uc3QgZHJvcHpvbmUgb2YgaW50ZXJhY3RhYmxlcy5saXN0KSB7XG4gICAgaWYgKCFkcm9wem9uZS5vcHRpb25zLmRyb3AuZW5hYmxlZCkgeyBjb250aW51ZSB9XG5cbiAgICBjb25zdCBhY2NlcHQgPSBkcm9wem9uZS5vcHRpb25zLmRyb3AuYWNjZXB0XG5cbiAgICAvLyB0ZXN0IHRoZSBkcmFnZ2FibGUgZHJhZ2dhYmxlRWxlbWVudCBhZ2FpbnN0IHRoZSBkcm9wem9uZSdzIGFjY2VwdCBzZXR0aW5nXG4gICAgaWYgKCh1dGlscy5pcy5lbGVtZW50KGFjY2VwdCkgJiYgYWNjZXB0ICE9PSBkcmFnZ2FibGVFbGVtZW50KSB8fFxuICAgICAgICAodXRpbHMuaXMuc3RyaW5nKGFjY2VwdCkgJiZcbiAgICAgICAgIXV0aWxzLmRvbS5tYXRjaGVzU2VsZWN0b3IoZHJhZ2dhYmxlRWxlbWVudCwgYWNjZXB0KSkgfHxcbiAgICAgICAgKHV0aWxzLmlzLmZ1bmMoYWNjZXB0KSAmJiAhYWNjZXB0KHsgZHJvcHpvbmUsIGRyYWdnYWJsZUVsZW1lbnQgfSkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIHF1ZXJ5IGZvciBuZXcgZWxlbWVudHMgaWYgbmVjZXNzYXJ5XG4gICAgY29uc3QgZHJvcEVsZW1lbnRzID0gdXRpbHMuaXMuc3RyaW5nKGRyb3B6b25lLnRhcmdldClcbiAgICAgID8gZHJvcHpvbmUuX2NvbnRleHQucXVlcnlTZWxlY3RvckFsbChkcm9wem9uZS50YXJnZXQpXG4gICAgICA6IHV0aWxzLmlzLmFycmF5KGRyb3B6b25lLnRhcmdldCkgPyBkcm9wem9uZS50YXJnZXQgOiBbZHJvcHpvbmUudGFyZ2V0XVxuXG4gICAgZm9yIChjb25zdCBkcm9wem9uZUVsZW1lbnQgb2YgZHJvcEVsZW1lbnRzKSB7XG4gICAgICBpZiAoZHJvcHpvbmVFbGVtZW50ICE9PSBkcmFnZ2FibGVFbGVtZW50KSB7XG4gICAgICAgIGRyb3BzLnB1c2goe1xuICAgICAgICAgIGRyb3B6b25lLFxuICAgICAgICAgIGVsZW1lbnQ6IGRyb3B6b25lRWxlbWVudCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZHJvcHNcbn1cblxuZnVuY3Rpb24gZmlyZUFjdGl2YXRpb25FdmVudHMgKGFjdGl2ZURyb3BzLCBldmVudCkge1xuICAvLyBsb29wIHRocm91Z2ggYWxsIGFjdGl2ZSBkcm9wem9uZXMgYW5kIHRyaWdnZXIgZXZlbnRcbiAgZm9yIChjb25zdCB7IGRyb3B6b25lLCBlbGVtZW50IH0gb2YgYWN0aXZlRHJvcHMuc2xpY2UoKSkge1xuICAgIGV2ZW50LmRyb3B6b25lID0gZHJvcHpvbmVcblxuICAgIC8vIHNldCBjdXJyZW50IGVsZW1lbnQgYXMgZXZlbnQgdGFyZ2V0XG4gICAgZXZlbnQudGFyZ2V0ID0gZWxlbWVudFxuICAgIGRyb3B6b25lLmZpcmUoZXZlbnQpXG4gICAgZXZlbnQucHJvcGFnYXRpb25TdG9wcGVkID0gZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2VcbiAgfVxufVxuXG4vLyByZXR1cm4gYSBuZXcgYXJyYXkgb2YgcG9zc2libGUgZHJvcHMuIGdldEFjdGl2ZURyb3BzIHNob3VsZCBhbHdheXMgYmVcbi8vIGNhbGxlZCB3aGVuIGEgZHJhZyBoYXMganVzdCBzdGFydGVkIG9yIGEgZHJhZyBldmVudCBoYXBwZW5zIHdoaWxlXG4vLyBkeW5hbWljRHJvcCBpcyB0cnVlXG5mdW5jdGlvbiBnZXRBY3RpdmVEcm9wcyAoc2NvcGU6IFNjb3BlLCBkcmFnRWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAvLyBnZXQgZHJvcHpvbmVzIGFuZCB0aGVpciBlbGVtZW50cyB0aGF0IGNvdWxkIHJlY2VpdmUgdGhlIGRyYWdnYWJsZVxuICBjb25zdCBhY3RpdmVEcm9wcyA9IGNvbGxlY3REcm9wcyhzY29wZSwgZHJhZ0VsZW1lbnQpXG5cbiAgZm9yIChjb25zdCBhY3RpdmVEcm9wIG9mIGFjdGl2ZURyb3BzKSB7XG4gICAgYWN0aXZlRHJvcC5yZWN0ID0gYWN0aXZlRHJvcC5kcm9wem9uZS5nZXRSZWN0KGFjdGl2ZURyb3AuZWxlbWVudClcbiAgfVxuXG4gIHJldHVybiBhY3RpdmVEcm9wc1xufVxuXG5mdW5jdGlvbiBnZXREcm9wICh7IGRyb3BTdGF0ZSwgaW50ZXJhY3RhYmxlOiBkcmFnZ2FibGUsIGVsZW1lbnQ6IGRyYWdFbGVtZW50IH06IFBhcnRpYWw8SW50ZXJhY3QuSW50ZXJhY3Rpb24+LCBkcmFnRXZlbnQsIHBvaW50ZXJFdmVudCkge1xuICBjb25zdCB2YWxpZERyb3BzID0gW11cblxuICAvLyBjb2xsZWN0IGFsbCBkcm9wem9uZXMgYW5kIHRoZWlyIGVsZW1lbnRzIHdoaWNoIHF1YWxpZnkgZm9yIGEgZHJvcFxuICBmb3IgKGNvbnN0IHsgZHJvcHpvbmUsIGVsZW1lbnQ6IGRyb3B6b25lRWxlbWVudCwgcmVjdCB9IG9mIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcykge1xuICAgIHZhbGlkRHJvcHMucHVzaChkcm9wem9uZS5kcm9wQ2hlY2soZHJhZ0V2ZW50LCBwb2ludGVyRXZlbnQsIGRyYWdnYWJsZSwgZHJhZ0VsZW1lbnQsIGRyb3B6b25lRWxlbWVudCwgcmVjdClcbiAgICAgID8gZHJvcHpvbmVFbGVtZW50XG4gICAgICA6IG51bGwpXG4gIH1cblxuICAvLyBnZXQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZHJvcHpvbmUgYmFzZWQgb24gRE9NIGRlcHRoIGFuZCBvcmRlclxuICBjb25zdCBkcm9wSW5kZXggPSB1dGlscy5kb20uaW5kZXhPZkRlZXBlc3RFbGVtZW50KHZhbGlkRHJvcHMpXG5cbiAgcmV0dXJuIGRyb3BTdGF0ZS5hY3RpdmVEcm9wc1tkcm9wSW5kZXhdIHx8IG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0RHJvcEV2ZW50cyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLCBfcG9pbnRlckV2ZW50LCBkcmFnRXZlbnQpIHtcbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IGRyb3BFdmVudHMgPSB7XG4gICAgZW50ZXIgICAgIDogbnVsbCxcbiAgICBsZWF2ZSAgICAgOiBudWxsLFxuICAgIGFjdGl2YXRlICA6IG51bGwsXG4gICAgZGVhY3RpdmF0ZTogbnVsbCxcbiAgICBtb3ZlICAgICAgOiBudWxsLFxuICAgIGRyb3AgICAgICA6IG51bGwsXG4gIH1cblxuICBpZiAoZHJhZ0V2ZW50LnR5cGUgPT09ICdkcmFnc3RhcnQnKSB7XG4gICAgZHJvcEV2ZW50cy5hY3RpdmF0ZSA9IG5ldyBEcm9wRXZlbnQoZHJvcFN0YXRlLCBkcmFnRXZlbnQsICdkcm9wYWN0aXZhdGUnKVxuXG4gICAgZHJvcEV2ZW50cy5hY3RpdmF0ZS50YXJnZXQgICA9IG51bGxcbiAgICBkcm9wRXZlbnRzLmFjdGl2YXRlLmRyb3B6b25lID0gbnVsbFxuICB9XG4gIGlmIChkcmFnRXZlbnQudHlwZSA9PT0gJ2RyYWdlbmQnKSB7XG4gICAgZHJvcEV2ZW50cy5kZWFjdGl2YXRlID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIGRyYWdFdmVudCwgJ2Ryb3BkZWFjdGl2YXRlJylcblxuICAgIGRyb3BFdmVudHMuZGVhY3RpdmF0ZS50YXJnZXQgICA9IG51bGxcbiAgICBkcm9wRXZlbnRzLmRlYWN0aXZhdGUuZHJvcHpvbmUgPSBudWxsXG4gIH1cblxuICBpZiAoZHJvcFN0YXRlLnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIGRyb3BFdmVudHNcbiAgfVxuXG4gIGlmIChkcm9wU3RhdGUuY3VyLmVsZW1lbnQgIT09IGRyb3BTdGF0ZS5wcmV2LmVsZW1lbnQpIHtcbiAgICAvLyBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBkcm9wem9uZSwgY3JlYXRlIGEgZHJhZ2xlYXZlIGV2ZW50XG4gICAgaWYgKGRyb3BTdGF0ZS5wcmV2LmRyb3B6b25lKSB7XG4gICAgICBkcm9wRXZlbnRzLmxlYXZlID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIGRyYWdFdmVudCwgJ2RyYWdsZWF2ZScpXG5cbiAgICAgIGRyYWdFdmVudC5kcmFnTGVhdmUgICAgPSBkcm9wRXZlbnRzLmxlYXZlLnRhcmdldCAgID0gZHJvcFN0YXRlLnByZXYuZWxlbWVudFxuICAgICAgZHJhZ0V2ZW50LnByZXZEcm9wem9uZSA9IGRyb3BFdmVudHMubGVhdmUuZHJvcHpvbmUgPSBkcm9wU3RhdGUucHJldi5kcm9wem9uZVxuICAgIH1cbiAgICAvLyBpZiBkcm9wem9uZSBpcyBub3QgbnVsbCwgY3JlYXRlIGEgZHJhZ2VudGVyIGV2ZW50XG4gICAgaWYgKGRyb3BTdGF0ZS5jdXIuZHJvcHpvbmUpIHtcbiAgICAgIGRyb3BFdmVudHMuZW50ZXIgPSBuZXcgRHJvcEV2ZW50KGRyb3BTdGF0ZSwgZHJhZ0V2ZW50LCAnZHJhZ2VudGVyJylcblxuICAgICAgZHJhZ0V2ZW50LmRyYWdFbnRlciA9IGRyb3BTdGF0ZS5jdXIuZWxlbWVudFxuICAgICAgZHJhZ0V2ZW50LmRyb3B6b25lID0gZHJvcFN0YXRlLmN1ci5kcm9wem9uZVxuICAgIH1cbiAgfVxuXG4gIGlmIChkcmFnRXZlbnQudHlwZSA9PT0gJ2RyYWdlbmQnICYmIGRyb3BTdGF0ZS5jdXIuZHJvcHpvbmUpIHtcbiAgICBkcm9wRXZlbnRzLmRyb3AgPSBuZXcgRHJvcEV2ZW50KGRyb3BTdGF0ZSwgZHJhZ0V2ZW50LCAnZHJvcCcpXG5cbiAgICBkcmFnRXZlbnQuZHJvcHpvbmUgPSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lXG4gICAgZHJhZ0V2ZW50LnJlbGF0ZWRUYXJnZXQgPSBkcm9wU3RhdGUuY3VyLmVsZW1lbnRcbiAgfVxuICBpZiAoZHJhZ0V2ZW50LnR5cGUgPT09ICdkcmFnbW92ZScgJiYgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSkge1xuICAgIGRyb3BFdmVudHMubW92ZSA9IG5ldyBEcm9wRXZlbnQoZHJvcFN0YXRlLCBkcmFnRXZlbnQsICdkcm9wbW92ZScpXG5cbiAgICBkcm9wRXZlbnRzLm1vdmUuZHJhZ21vdmUgPSBkcmFnRXZlbnRcbiAgICBkcmFnRXZlbnQuZHJvcHpvbmUgPSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lXG4gIH1cblxuICByZXR1cm4gZHJvcEV2ZW50c1xufVxuXG5mdW5jdGlvbiBmaXJlRHJvcEV2ZW50cyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLCBldmVudHMpIHtcbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IHtcbiAgICBhY3RpdmVEcm9wcyxcbiAgICBjdXIsXG4gICAgcHJldixcbiAgfSA9IGRyb3BTdGF0ZVxuXG4gIGlmIChldmVudHMubGVhdmUpIHsgcHJldi5kcm9wem9uZS5maXJlKGV2ZW50cy5sZWF2ZSkgfVxuICBpZiAoZXZlbnRzLm1vdmUpIHsgY3VyLmRyb3B6b25lLmZpcmUoZXZlbnRzLm1vdmUpIH1cbiAgaWYgKGV2ZW50cy5lbnRlcikgeyBjdXIuZHJvcHpvbmUuZmlyZShldmVudHMuZW50ZXIpIH1cbiAgaWYgKGV2ZW50cy5kcm9wKSB7IGN1ci5kcm9wem9uZS5maXJlKGV2ZW50cy5kcm9wKSB9XG5cbiAgaWYgKGV2ZW50cy5kZWFjdGl2YXRlKSB7XG4gICAgZmlyZUFjdGl2YXRpb25FdmVudHMoYWN0aXZlRHJvcHMsIGV2ZW50cy5kZWFjdGl2YXRlKVxuICB9XG5cbiAgZHJvcFN0YXRlLnByZXYuZHJvcHpvbmUgID0gY3VyLmRyb3B6b25lXG4gIGRyb3BTdGF0ZS5wcmV2LmVsZW1lbnQgPSBjdXIuZWxlbWVudFxufVxuXG5mdW5jdGlvbiBvbkV2ZW50Q3JlYXRlZCAoeyBpbnRlcmFjdGlvbiwgaUV2ZW50LCBldmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSB7XG4gIGlmIChpRXZlbnQudHlwZSAhPT0gJ2RyYWdtb3ZlJyAmJiBpRXZlbnQudHlwZSAhPT0gJ2RyYWdlbmQnKSB7IHJldHVybiB9XG5cbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG5cbiAgaWYgKHNjb3BlLmR5bmFtaWNEcm9wKSB7XG4gICAgZHJvcFN0YXRlLmFjdGl2ZURyb3BzID0gZ2V0QWN0aXZlRHJvcHMoc2NvcGUsIGludGVyYWN0aW9uLmVsZW1lbnQpXG4gIH1cblxuICBjb25zdCBkcmFnRXZlbnQgPSBpRXZlbnRcbiAgY29uc3QgZHJvcFJlc3VsdCA9IGdldERyb3AoaW50ZXJhY3Rpb24sIGRyYWdFdmVudCwgZXZlbnQpXG5cbiAgLy8gdXBkYXRlIHJlamVjdGVkIHN0YXR1c1xuICBkcm9wU3RhdGUucmVqZWN0ZWQgPSBkcm9wU3RhdGUucmVqZWN0ZWQgJiZcbiAgICAhIWRyb3BSZXN1bHQgJiZcbiAgICBkcm9wUmVzdWx0LmRyb3B6b25lID09PSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lICYmXG4gICAgZHJvcFJlc3VsdC5lbGVtZW50ID09PSBkcm9wU3RhdGUuY3VyLmVsZW1lbnRcblxuICBkcm9wU3RhdGUuY3VyLmRyb3B6b25lICA9IGRyb3BSZXN1bHQgJiYgZHJvcFJlc3VsdC5kcm9wem9uZVxuICBkcm9wU3RhdGUuY3VyLmVsZW1lbnQgPSBkcm9wUmVzdWx0ICYmIGRyb3BSZXN1bHQuZWxlbWVudFxuXG4gIGRyb3BTdGF0ZS5ldmVudHMgPSBnZXREcm9wRXZlbnRzKGludGVyYWN0aW9uLCBldmVudCwgZHJhZ0V2ZW50KVxufVxuXG5mdW5jdGlvbiBkcm9wem9uZU1ldGhvZCAoaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUpOiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnNcbmZ1bmN0aW9uIGRyb3B6b25lTWV0aG9kIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9uczogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zIHwgYm9vbGVhbilcbmZ1bmN0aW9uIGRyb3B6b25lTWV0aG9kIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9ucz86IEludGVyYWN0LkRyb3B6b25lT3B0aW9ucyB8IGJvb2xlYW4pIHtcbiAgaWYgKHV0aWxzLmlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3AuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcblxuICAgIGlmIChvcHRpb25zLmxpc3RlbmVycykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHV0aWxzLm5vcm1hbGl6ZUxpc3RlbmVycyhvcHRpb25zLmxpc3RlbmVycylcbiAgICAgIC8vIHJlbmFtZSAnZHJvcCcgdG8gJycgYXMgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoICdkcm9wJ1xuICAgICAgY29uc3QgY29ycmVjdGVkID0gT2JqZWN0LmtleXMobm9ybWFsaXplZCkucmVkdWNlKChhY2MsIHR5cGUpID0+IHtcbiAgICAgICAgY29uc3QgY29ycmVjdGVkVHlwZSA9IC9eKGVudGVyfGxlYXZlKS8udGVzdCh0eXBlKVxuICAgICAgICAgID8gYGRyYWcke3R5cGV9YFxuICAgICAgICAgIDogL14oYWN0aXZhdGV8ZGVhY3RpdmF0ZXxtb3ZlKS8udGVzdCh0eXBlKVxuICAgICAgICAgICAgPyBgZHJvcCR7dHlwZX1gXG4gICAgICAgICAgICA6IHR5cGVcblxuICAgICAgICBhY2NbY29ycmVjdGVkVHlwZV0gPSBub3JtYWxpemVkW3R5cGVdXG5cbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfSwge30pXG5cbiAgICAgIGludGVyYWN0YWJsZS5vZmYoaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5saXN0ZW5lcnMpXG4gICAgICBpbnRlcmFjdGFibGUub24oY29ycmVjdGVkKVxuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5saXN0ZW5lcnMgPSBjb3JyZWN0ZWRcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcCkpIHsgaW50ZXJhY3RhYmxlLm9uKCdkcm9wJywgb3B0aW9ucy5vbmRyb3ApIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcGFjdGl2YXRlKSkgeyBpbnRlcmFjdGFibGUub24oJ2Ryb3BhY3RpdmF0ZScsIG9wdGlvbnMub25kcm9wYWN0aXZhdGUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcGRlYWN0aXZhdGUpKSB7IGludGVyYWN0YWJsZS5vbignZHJvcGRlYWN0aXZhdGUnLCBvcHRpb25zLm9uZHJvcGRlYWN0aXZhdGUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJhZ2VudGVyKSkgeyBpbnRlcmFjdGFibGUub24oJ2RyYWdlbnRlcicsIG9wdGlvbnMub25kcmFnZW50ZXIpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJhZ2xlYXZlKSkgeyBpbnRlcmFjdGFibGUub24oJ2RyYWdsZWF2ZScsIG9wdGlvbnMub25kcmFnbGVhdmUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcG1vdmUpKSB7IGludGVyYWN0YWJsZS5vbignZHJvcG1vdmUnLCBvcHRpb25zLm9uZHJvcG1vdmUpIH1cblxuICAgIGlmICgvXihwb2ludGVyfGNlbnRlcikkLy50ZXN0KG9wdGlvbnMub3ZlcmxhcCBhcyBzdHJpbmcpKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLm92ZXJsYXAgPSBvcHRpb25zLm92ZXJsYXBcbiAgICB9XG4gICAgZWxzZSBpZiAodXRpbHMuaXMubnVtYmVyKG9wdGlvbnMub3ZlcmxhcCkpIHtcbiAgICAgIGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3Aub3ZlcmxhcCA9IE1hdGgubWF4KE1hdGgubWluKDEsIG9wdGlvbnMub3ZlcmxhcCksIDApXG4gICAgfVxuICAgIGlmICgnYWNjZXB0JyBpbiBvcHRpb25zKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmFjY2VwdCA9IG9wdGlvbnMuYWNjZXB0XG4gICAgfVxuICAgIGlmICgnY2hlY2tlcicgaW4gb3B0aW9ucykge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyID0gb3B0aW9ucy5jaGVja2VyXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG5cbiAgaWYgKHV0aWxzLmlzLmJvb2wob3B0aW9ucykpIHtcbiAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gaW50ZXJhY3RhYmxlXG4gIH1cblxuICByZXR1cm4gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcFxufVxuXG5mdW5jdGlvbiBkcm9wQ2hlY2tNZXRob2QgKFxuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdEV2ZW50LFxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgZHJhZ2dhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsXG4gIGRyYWdnYWJsZUVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsXG4gIGRyb3BFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICByZWN0OiBhbnksXG4pIHtcbiAgbGV0IGRyb3BwZWQgPSBmYWxzZVxuXG4gIC8vIGlmIHRoZSBkcm9wem9uZSBoYXMgbm8gcmVjdCAoZWcuIGRpc3BsYXk6IG5vbmUpXG4gIC8vIGNhbGwgdGhlIGN1c3RvbSBkcm9wQ2hlY2tlciBvciBqdXN0IHJldHVybiBmYWxzZVxuICBpZiAoIShyZWN0ID0gcmVjdCB8fCBpbnRlcmFjdGFibGUuZ2V0UmVjdChkcm9wRWxlbWVudCkpKSB7XG4gICAgcmV0dXJuIChpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmNoZWNrZXJcbiAgICAgID8gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyKGRyYWdFdmVudCwgZXZlbnQsIGRyb3BwZWQsIGludGVyYWN0YWJsZSwgZHJvcEVsZW1lbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudClcbiAgICAgIDogZmFsc2UpXG4gIH1cblxuICBjb25zdCBkcm9wT3ZlcmxhcCA9IGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3Aub3ZlcmxhcFxuXG4gIGlmIChkcm9wT3ZlcmxhcCA9PT0gJ3BvaW50ZXInKSB7XG4gICAgY29uc3Qgb3JpZ2luID0gdXRpbHMuZ2V0T3JpZ2luWFkoZHJhZ2dhYmxlLCBkcmFnZ2FibGVFbGVtZW50LCAnZHJhZycpXG4gICAgY29uc3QgcGFnZSA9IHV0aWxzLnBvaW50ZXIuZ2V0UGFnZVhZKGRyYWdFdmVudClcblxuICAgIHBhZ2UueCArPSBvcmlnaW4ueFxuICAgIHBhZ2UueSArPSBvcmlnaW4ueVxuXG4gICAgY29uc3QgaG9yaXpvbnRhbCA9IChwYWdlLnggPiByZWN0LmxlZnQpICYmIChwYWdlLnggPCByZWN0LnJpZ2h0KVxuICAgIGNvbnN0IHZlcnRpY2FsICAgPSAocGFnZS55ID4gcmVjdC50b3ApICYmIChwYWdlLnkgPCByZWN0LmJvdHRvbSlcblxuICAgIGRyb3BwZWQgPSBob3Jpem9udGFsICYmIHZlcnRpY2FsXG4gIH1cblxuICBjb25zdCBkcmFnUmVjdCA9IGRyYWdnYWJsZS5nZXRSZWN0KGRyYWdnYWJsZUVsZW1lbnQpXG5cbiAgaWYgKGRyYWdSZWN0ICYmIGRyb3BPdmVybGFwID09PSAnY2VudGVyJykge1xuICAgIGNvbnN0IGN4ID0gZHJhZ1JlY3QubGVmdCArIGRyYWdSZWN0LndpZHRoICAvIDJcbiAgICBjb25zdCBjeSA9IGRyYWdSZWN0LnRvcCAgKyBkcmFnUmVjdC5oZWlnaHQgLyAyXG5cbiAgICBkcm9wcGVkID0gY3ggPj0gcmVjdC5sZWZ0ICYmIGN4IDw9IHJlY3QucmlnaHQgJiYgY3kgPj0gcmVjdC50b3AgJiYgY3kgPD0gcmVjdC5ib3R0b21cbiAgfVxuXG4gIGlmIChkcmFnUmVjdCAmJiB1dGlscy5pcy5udW1iZXIoZHJvcE92ZXJsYXApKSB7XG4gICAgY29uc3Qgb3ZlcmxhcEFyZWEgID0gKE1hdGgubWF4KDAsIE1hdGgubWluKHJlY3QucmlnaHQsIGRyYWdSZWN0LnJpZ2h0KSAtIE1hdGgubWF4KHJlY3QubGVmdCwgZHJhZ1JlY3QubGVmdCkpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgTWF0aC5taW4ocmVjdC5ib3R0b20sIGRyYWdSZWN0LmJvdHRvbSkgLSBNYXRoLm1heChyZWN0LnRvcCwgZHJhZ1JlY3QudG9wKSkpXG5cbiAgICBjb25zdCBvdmVybGFwUmF0aW8gPSBvdmVybGFwQXJlYSAvIChkcmFnUmVjdC53aWR0aCAqIGRyYWdSZWN0LmhlaWdodClcblxuICAgIGRyb3BwZWQgPSBvdmVybGFwUmF0aW8gPj0gZHJvcE92ZXJsYXBcbiAgfVxuXG4gIGlmIChpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmNoZWNrZXIpIHtcbiAgICBkcm9wcGVkID0gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyKGRyYWdFdmVudCwgZXZlbnQsIGRyb3BwZWQsIGludGVyYWN0YWJsZSwgZHJvcEVsZW1lbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudClcbiAgfVxuXG4gIHJldHVybiBkcm9wcGVkXG59XG5cbmNvbnN0IGRyb3A6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhY3Rpb25zL2Ryb3AnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tc3RhcnQnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGludGVyYWN0aW9uLmRyb3BTdGF0ZSA9IHtcbiAgICAgICAgY3VyOiB7XG4gICAgICAgICAgZHJvcHpvbmU6IG51bGwsXG4gICAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJldjoge1xuICAgICAgICAgIGRyb3B6b25lOiBudWxsLFxuICAgICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdGVkOiBudWxsLFxuICAgICAgICBldmVudHM6IG51bGwsXG4gICAgICAgIGFjdGl2ZURyb3BzOiBbXSxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tc3RhcnQnOiAoeyBpbnRlcmFjdGlvbiwgZXZlbnQsIGlFdmVudDogZHJhZ0V2ZW50IH06IEludGVyYWN0LkRvUGhhc2VBcmc8J2RyYWcnLCBJbnRlcmFjdC5FdmVudFBoYXNlPiwgc2NvcGUpID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICAgICAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG5cbiAgICAgIC8vIHJlc2V0IGFjdGl2ZSBkcm9wem9uZXNcbiAgICAgIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcyA9IG51bGxcbiAgICAgIGRyb3BTdGF0ZS5ldmVudHMgPSBudWxsXG4gICAgICBkcm9wU3RhdGUuYWN0aXZlRHJvcHMgPSBnZXRBY3RpdmVEcm9wcyhzY29wZSwgaW50ZXJhY3Rpb24uZWxlbWVudClcbiAgICAgIGRyb3BTdGF0ZS5ldmVudHMgPSBnZXREcm9wRXZlbnRzKGludGVyYWN0aW9uLCBldmVudCwgZHJhZ0V2ZW50KVxuXG4gICAgICBpZiAoZHJvcFN0YXRlLmV2ZW50cy5hY3RpdmF0ZSkge1xuICAgICAgICBmaXJlQWN0aXZhdGlvbkV2ZW50cyhkcm9wU3RhdGUuYWN0aXZlRHJvcHMsIGRyb3BTdGF0ZS5ldmVudHMuYWN0aXZhdGUpXG4gICAgICAgIHNjb3BlLmZpcmUoJ2FjdGlvbnMvZHJvcDpzdGFydCcsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBGSVhNRSBwcm9wZXIgc2lnbmFsIHR5cGVzXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IG9uRXZlbnRDcmVhdGVkLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLWVuZCc6IG9uRXZlbnRDcmVhdGVkLFxuXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IGZ1bmN0aW9uIGZpcmVEcm9wQWZ0ZXJNb3ZlICh7IGludGVyYWN0aW9uLCBpRXZlbnQ6IGRyYWdFdmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGZpcmVEcm9wRXZlbnRzKGludGVyYWN0aW9uLCBpbnRlcmFjdGlvbi5kcm9wU3RhdGUuZXZlbnRzKVxuXG4gICAgICBzY29wZS5maXJlKCdhY3Rpb25zL2Ryb3A6bW92ZScsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgICAgaW50ZXJhY3Rpb24uZHJvcFN0YXRlLmV2ZW50cyA9IHt9XG4gICAgfSxcblxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLWVuZCc6ICh7IGludGVyYWN0aW9uLCBpRXZlbnQ6IGRyYWdFdmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGZpcmVEcm9wRXZlbnRzKGludGVyYWN0aW9uLCBpbnRlcmFjdGlvbi5kcm9wU3RhdGUuZXZlbnRzKVxuICAgICAgc2NvcGUuZmlyZSgnYWN0aW9ucy9kcm9wOmVuZCcsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOnN0b3AnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGNvbnN0IHsgZHJvcFN0YXRlIH0gPSBpbnRlcmFjdGlvblxuXG4gICAgICBpZiAoZHJvcFN0YXRlKSB7XG4gICAgICAgIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcyA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmV2ZW50cyA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5lbGVtZW50ID0gbnVsbFxuICAgICAgICBkcm9wU3RhdGUucHJldi5kcm9wem9uZSA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLnByZXYuZWxlbWVudCA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLnJlamVjdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBnZXRBY3RpdmVEcm9wcyxcbiAgZ2V0RHJvcCxcbiAgZ2V0RHJvcEV2ZW50cyxcbiAgZmlyZURyb3BFdmVudHMsXG4gIGRlZmF1bHRzOiB7XG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgYWNjZXB0IDogbnVsbCxcbiAgICBvdmVybGFwOiAncG9pbnRlcicsXG4gIH0gYXMgSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zLFxufVxuXG5leHBvcnQgZGVmYXVsdCBkcm9wXG4iLCJpbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcblxuZXhwb3J0IHR5cGUgR2VzdHVyYWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9ucz5cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBnZXN0dXJlPzoge1xuICAgICAgYW5nbGU6IG51bWJlciAgICAgICAgICAgLy8gYW5nbGUgZnJvbSBmaXJzdCB0byBzZWNvbmQgdG91Y2hcbiAgICAgIGRpc3RhbmNlOiBudW1iZXJcbiAgICAgIHNjYWxlOiBudW1iZXIgICAgICAgICAgIC8vIGdlc3R1cmUuZGlzdGFuY2UgLyBnZXN0dXJlLnN0YXJ0RGlzdGFuY2VcbiAgICAgIHN0YXJ0QW5nbGU6IG51bWJlciAgICAgIC8vIGFuZ2xlIG9mIGxpbmUgam9pbmluZyB0d28gdG91Y2hlc1xuICAgICAgc3RhcnREaXN0YW5jZTogbnVtYmVyICAgLy8gZGlzdGFuY2UgYmV0d2VlbiB0d28gdG91Y2hlcyBvZiB0b3VjaFN0YXJ0XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBnZXN0dXJhYmxlOiBHZXN0dXJhYmxlTWV0aG9kXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBnZXN0dXJlOiBJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9uc1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBBY3Rpb25NYXAge1xuICAgIGdlc3R1cmU/OiB0eXBlb2YgZ2VzdHVyZVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VzdHVyZUV2ZW50IGV4dGVuZHMgSW50ZXJhY3QuSW50ZXJhY3RFdmVudDwnZ2VzdHVyZSc+IHtcbiAgZGlzdGFuY2U6IG51bWJlclxuICBhbmdsZTogbnVtYmVyXG4gIGRhOiBudW1iZXIgLy8gYW5nbGUgY2hhbmdlXG4gIHNjYWxlOiBudW1iZXIgLy8gcmF0aW8gb2YgZGlzdGFuY2Ugc3RhcnQgdG8gY3VycmVudCBldmVudFxuICBkczogbnVtYmVyIC8vIHNjYWxlIGNoYW5nZVxuICBib3g6IEludGVyYWN0LlJlY3QgLy8gZW5jbG9zaW5nIGJveCBvZiBhbGwgcG9pbnRzXG4gIHRvdWNoZXM6IEludGVyYWN0LlBvaW50ZXJUeXBlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlU2lnbmFsQXJnIGV4dGVuZHMgSW50ZXJhY3QuRG9QaGFzZUFyZzwnZ2VzdHVyZScsIEludGVyYWN0LkV2ZW50UGhhc2U+IHtcbiAgaUV2ZW50OiBHZXN0dXJlRXZlbnRcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uPCdnZXN0dXJlJz5cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBhY3Rpb25zLFxuICAgIEludGVyYWN0YWJsZSxcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGludGVyYWN0KGVsZW1lbnQpLmdlc3R1cmFibGUoe1xuICAgKiAgICAgb25zdGFydDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAgICogICAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gICAqICAgICBvbmVuZCAgOiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICAgKlxuICAgKiAgICAgLy8gbGltaXQgbXVsdGlwbGUgZ2VzdHVyZXMuXG4gICAqICAgICAvLyBTZWUgdGhlIGV4cGxhbmF0aW9uIGluIHtAbGluayBJbnRlcmFjdGFibGUuZHJhZ2dhYmxlfSBleGFtcGxlXG4gICAqICAgICBtYXg6IEluZmluaXR5LFxuICAgKiAgICAgbWF4UGVyRWxlbWVudDogMSxcbiAgICogfSlcbiAgICpcbiAgICogdmFyIGlzR2VzdHVyZWFibGUgPSBpbnRlcmFjdChlbGVtZW50KS5nZXN0dXJhYmxlKClcbiAgICogYGBgXG4gICAqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIG11bHRpdG91Y2ggZ2VzdHVyZXMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAgICogbGlzdGVuZXJzIHRvIGJlIGZpcmVkIG9uIGdlc3R1cmUgZXZlbnRzIChtYWtlcyB0aGUgSW50ZXJhY3RhYmxlIGdlc3R1cmFibGUpXG4gICAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgY2FuIGJlIHRoZVxuICAgKiB0YXJnZXQgb2YgZ2VzdHVyZSBldmVudHMsIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmdlc3R1cmFibGUgPSBmdW5jdGlvbiAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zOiBJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9ucyB8IGJvb2xlYW4pIHtcbiAgICBpZiAodXRpbHMuaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZ2VzdHVyZS5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZVxuICAgICAgdGhpcy5zZXRQZXJBY3Rpb24oJ2dlc3R1cmUnLCBvcHRpb25zKVxuICAgICAgdGhpcy5zZXRPbkV2ZW50cygnZ2VzdHVyZScsIG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzLmJvb2wob3B0aW9ucykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5nZXN0dXJlLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXN0dXJlIGFzIEludGVyYWN0Lk9wdGlvbnNcbiAgfSBhcyBHZXN0dXJhYmxlTWV0aG9kXG5cbiAgYWN0aW9ucy5tYXAuZ2VzdHVyZSA9IGdlc3R1cmVcbiAgYWN0aW9ucy5tZXRob2REaWN0Lmdlc3R1cmUgPSAnZ2VzdHVyYWJsZSdcblxuICBkZWZhdWx0cy5hY3Rpb25zLmdlc3R1cmUgPSBnZXN0dXJlLmRlZmF1bHRzXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUdlc3R1cmVQcm9wcyAoeyBpbnRlcmFjdGlvbiwgaUV2ZW50LCBwaGFzZSB9OiBHZXN0dXJlU2lnbmFsQXJnKSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZ2VzdHVyZScpIHsgcmV0dXJuIH1cblxuICBjb25zdCBwb2ludGVycyA9IGludGVyYWN0aW9uLnBvaW50ZXJzLm1hcChwID0+IHAucG9pbnRlcilcbiAgY29uc3Qgc3RhcnRpbmcgPSBwaGFzZSA9PT0gJ3N0YXJ0J1xuICBjb25zdCBlbmRpbmcgPSBwaGFzZSA9PT0gJ2VuZCdcbiAgY29uc3QgZGVsdGFTb3VyY2UgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5kZWx0YVNvdXJjZVxuXG4gIGlFdmVudC50b3VjaGVzID0gW3BvaW50ZXJzWzBdLCBwb2ludGVyc1sxXV1cblxuICBpZiAoc3RhcnRpbmcpIHtcbiAgICBpRXZlbnQuZGlzdGFuY2UgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2UocG9pbnRlcnMsIGRlbHRhU291cmNlKVxuICAgIGlFdmVudC5ib3ggICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94KHBvaW50ZXJzKVxuICAgIGlFdmVudC5zY2FsZSAgICA9IDFcbiAgICBpRXZlbnQuZHMgICAgICAgPSAwXG4gICAgaUV2ZW50LmFuZ2xlICAgID0gdXRpbHMucG9pbnRlci50b3VjaEFuZ2xlKHBvaW50ZXJzLCBkZWx0YVNvdXJjZSlcbiAgICBpRXZlbnQuZGEgICAgICAgPSAwXG5cbiAgICBpbnRlcmFjdGlvbi5nZXN0dXJlLnN0YXJ0RGlzdGFuY2UgPSBpRXZlbnQuZGlzdGFuY2VcbiAgICBpbnRlcmFjdGlvbi5nZXN0dXJlLnN0YXJ0QW5nbGUgPSBpRXZlbnQuYW5nbGVcbiAgfVxuICBlbHNlIGlmIChlbmRpbmcpIHtcbiAgICBjb25zdCBwcmV2RXZlbnQgPSBpbnRlcmFjdGlvbi5wcmV2RXZlbnQgYXMgR2VzdHVyZUV2ZW50XG5cbiAgICBpRXZlbnQuZGlzdGFuY2UgPSBwcmV2RXZlbnQuZGlzdGFuY2VcbiAgICBpRXZlbnQuYm94ICAgICAgPSBwcmV2RXZlbnQuYm94XG4gICAgaUV2ZW50LnNjYWxlICAgID0gcHJldkV2ZW50LnNjYWxlXG4gICAgaUV2ZW50LmRzICAgICAgID0gMFxuICAgIGlFdmVudC5hbmdsZSAgICA9IHByZXZFdmVudC5hbmdsZVxuICAgIGlFdmVudC5kYSAgICAgICA9IDBcbiAgfVxuICBlbHNlIHtcbiAgICBpRXZlbnQuZGlzdGFuY2UgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2UocG9pbnRlcnMsIGRlbHRhU291cmNlKVxuICAgIGlFdmVudC5ib3ggICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94KHBvaW50ZXJzKVxuICAgIGlFdmVudC5zY2FsZSAgICA9IGlFdmVudC5kaXN0YW5jZSAvIGludGVyYWN0aW9uLmdlc3R1cmUuc3RhcnREaXN0YW5jZVxuICAgIGlFdmVudC5hbmdsZSAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hBbmdsZShwb2ludGVycywgZGVsdGFTb3VyY2UpXG5cbiAgICBpRXZlbnQuZHMgPSBpRXZlbnQuc2NhbGUgLSBpbnRlcmFjdGlvbi5nZXN0dXJlLnNjYWxlXG4gICAgaUV2ZW50LmRhID0gaUV2ZW50LmFuZ2xlIC0gaW50ZXJhY3Rpb24uZ2VzdHVyZS5hbmdsZVxuICB9XG5cbiAgaW50ZXJhY3Rpb24uZ2VzdHVyZS5kaXN0YW5jZSA9IGlFdmVudC5kaXN0YW5jZVxuICBpbnRlcmFjdGlvbi5nZXN0dXJlLmFuZ2xlID0gaUV2ZW50LmFuZ2xlXG5cbiAgaWYgKHV0aWxzLmlzLm51bWJlcihpRXZlbnQuc2NhbGUpICYmXG4gICAgICBpRXZlbnQuc2NhbGUgIT09IEluZmluaXR5ICYmXG4gICAgICAhaXNOYU4oaUV2ZW50LnNjYWxlKSkge1xuICAgIGludGVyYWN0aW9uLmdlc3R1cmUuc2NhbGUgPSBpRXZlbnQuc2NhbGVcbiAgfVxufVxuXG5jb25zdCBnZXN0dXJlOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYWN0aW9ucy9nZXN0dXJlJyxcbiAgYmVmb3JlOiBbJ2FjdGlvbnMvZHJhZycsICdhY3Rpb25zL3Jlc2l6ZSddLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1zdGFydCc6IHVwZGF0ZUdlc3R1cmVQcm9wcyxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1tb3ZlJzogdXBkYXRlR2VzdHVyZVByb3BzLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLWVuZCc6IHVwZGF0ZUdlc3R1cmVQcm9wcyxcblxuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogKHsgaW50ZXJhY3Rpb24gfSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24uZ2VzdHVyZSA9IHtcbiAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgc3RhcnRBbmdsZTogMCxcbiAgICAgICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBhcmcgPT4ge1xuICAgICAgaWYgKGFyZy5pbnRlcmFjdGlvbi5wb2ludGVycy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2VzdHVyZU9wdGlvbnMgPSBhcmcuaW50ZXJhY3RhYmxlLm9wdGlvbnMuZ2VzdHVyZVxuXG4gICAgICBpZiAoIShnZXN0dXJlT3B0aW9ucyAmJiBnZXN0dXJlT3B0aW9ucy5lbmFibGVkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGFyZy5hY3Rpb24gPSB7IG5hbWU6ICdnZXN0dXJlJyB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgfSxcblxuICBnZXRDdXJzb3IgKCkge1xuICAgIHJldHVybiAnJ1xuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBnZXN0dXJlXG4iLCJpbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyBkb20gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZG9tVXRpbHMnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuXG5leHBvcnQgdHlwZSBFZGdlTmFtZSA9ICd0b3AnIHwgJ2xlZnQnIHwgJ2JvdHRvbScgfCAncmlnaHQnXG5cbmV4cG9ydCB0eXBlIFJlc2l6YWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5SZXNpemFibGVPcHRpb25zPlxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0YWJsZSB7XG4gICAgcmVzaXphYmxlOiBSZXNpemFibGVNZXRob2RcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIHJlc2l6ZUF4ZXM6ICd4JyB8ICd5JyB8ICd4eSdcbiAgICByZXNpemVTdGFydEFzcGVjdFJhdGlvOiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xuICAgIHJlc2l6ZTogSW50ZXJhY3QuUmVzaXphYmxlT3B0aW9uc1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBBY3Rpb25NYXAge1xuICAgIHJlc2l6ZT86IHR5cGVvZiByZXNpemVcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2l6ZUV2ZW50PFAgZXh0ZW5kcyBJbnRlcmFjdC5FdmVudFBoYXNlID0gSW50ZXJhY3QuRXZlbnRQaGFzZT4gZXh0ZW5kcyBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PCdyZXNpemUnLCBQPiB7XG4gIGRlbHRhUmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGVkZ2VzPzogSW50ZXJhY3QuQWN0aW9uUHJvcHNbJ2VkZ2VzJ11cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IFNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBhY3Rpb25zLFxuICAgIGJyb3dzZXIsXG4gICAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgICBJbnRlcmFjdGFibGUsIC8vIHRzbGludDpkaXNhYmxlLWxpbmUgbm8tc2hhZG93ZWQtdmFyaWFibGVcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgLy8gTGVzcyBQcmVjaXNpb24gd2l0aCB0b3VjaCBpbnB1dFxuXG4gIHJlc2l6ZS5jdXJzb3JzID0gaW5pdEN1cnNvcnMoYnJvd3NlcilcbiAgcmVzaXplLmRlZmF1bHRNYXJnaW4gPSBicm93c2VyLnN1cHBvcnRzVG91Y2ggfHwgYnJvd3Nlci5zdXBwb3J0c1BvaW50ZXJFdmVudCA/IDIwIDogMTBcblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QoZWxlbWVudCkucmVzaXphYmxlKHtcbiAgICogICBvbnN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICAgKiAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gICAqICAgb25lbmQgIDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAgICpcbiAgICogICBlZGdlczoge1xuICAgKiAgICAgdG9wICAgOiB0cnVlLCAgICAgICAvLyBVc2UgcG9pbnRlciBjb29yZHMgdG8gY2hlY2sgZm9yIHJlc2l6ZS5cbiAgICogICAgIGxlZnQgIDogZmFsc2UsICAgICAgLy8gRGlzYWJsZSByZXNpemluZyBmcm9tIGxlZnQgZWRnZS5cbiAgICogICAgIGJvdHRvbTogJy5yZXNpemUtcycsLy8gUmVzaXplIGlmIHBvaW50ZXIgdGFyZ2V0IG1hdGNoZXMgc2VsZWN0b3JcbiAgICogICAgIHJpZ2h0IDogaGFuZGxlRWwgICAgLy8gUmVzaXplIGlmIHBvaW50ZXIgdGFyZ2V0IGlzIHRoZSBnaXZlbiBFbGVtZW50XG4gICAqICAgfSxcbiAgICpcbiAgICogICAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgY2FuIGJlIGFkanVzdGVkIGluZGVwZW5kZW50bHkuIFdoZW4gYHRydWVgLCB3aWR0aCBhbmRcbiAgICogICAgIC8vIGhlaWdodCBhcmUgYWRqdXN0ZWQgYXQgYSAxOjEgcmF0aW8uXG4gICAqICAgICBzcXVhcmU6IGZhbHNlLFxuICAgKlxuICAgKiAgICAgLy8gV2lkdGggYW5kIGhlaWdodCBjYW4gYmUgYWRqdXN0ZWQgaW5kZXBlbmRlbnRseS4gV2hlbiBgdHJ1ZWAsIHdpZHRoIGFuZFxuICAgKiAgICAgLy8gaGVpZ2h0IG1haW50YWluIHRoZSBhc3BlY3QgcmF0aW8gdGhleSBoYWQgd2hlbiByZXNpemluZyBzdGFydGVkLlxuICAgKiAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogZmFsc2UsXG4gICAqXG4gICAqICAgLy8gYSB2YWx1ZSBvZiAnbm9uZScgd2lsbCBsaW1pdCB0aGUgcmVzaXplIHJlY3QgdG8gYSBtaW5pbXVtIG9mIDB4MFxuICAgKiAgIC8vICduZWdhdGUnIHdpbGwgYWxsb3cgdGhlIHJlY3QgdG8gaGF2ZSBuZWdhdGl2ZSB3aWR0aC9oZWlnaHRcbiAgICogICAvLyAncmVwb3NpdGlvbicgd2lsbCBrZWVwIHRoZSB3aWR0aC9oZWlnaHQgcG9zaXRpdmUgYnkgc3dhcHBpbmdcbiAgICogICAvLyB0aGUgdG9wIGFuZCBib3R0b20gZWRnZXMgYW5kL29yIHN3YXBwaW5nIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlc1xuICAgKiAgIGludmVydDogJ25vbmUnIHx8ICduZWdhdGUnIHx8ICdyZXBvc2l0aW9uJ1xuICAgKlxuICAgKiAgIC8vIGxpbWl0IG11bHRpcGxlIHJlc2l6ZXMuXG4gICAqICAgLy8gU2VlIHRoZSBleHBsYW5hdGlvbiBpbiB0aGUge0BsaW5rIEludGVyYWN0YWJsZS5kcmFnZ2FibGV9IGV4YW1wbGVcbiAgICogICBtYXg6IEluZmluaXR5LFxuICAgKiAgIG1heFBlckVsZW1lbnQ6IDEsXG4gICAqIH0pXG4gICAqXG4gICAqIHZhciBpc1Jlc2l6ZWFibGUgPSBpbnRlcmFjdChlbGVtZW50KS5yZXNpemFibGUoKVxuICAgKiBgYGBcbiAgICpcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgcmVzaXplIGFjdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAgICogbGlzdGVuZXJzIHRvIGJlIGZpcmVkIG9uIHJlc2l6ZSBldmVudHMgKG9iamVjdCBtYWtlcyB0aGUgSW50ZXJhY3RhYmxlXG4gICAqIHJlc2l6YWJsZSlcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IEludGVyYWN0YWJsZX0gQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBjYW4gYmUgdGhlXG4gICAqIHRhcmdldCBvZiByZXNpemUgZWxlbWVudHMsIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLnJlc2l6YWJsZSA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIG9wdGlvbnM6IEludGVyYWN0LlJlc2l6YWJsZU9wdGlvbnMgfCBib29sZWFuKSB7XG4gICAgcmV0dXJuIHJlc2l6YWJsZSh0aGlzLCBvcHRpb25zLCBzY29wZSlcbiAgfSBhcyBSZXNpemFibGVNZXRob2RcblxuICBhY3Rpb25zLm1hcC5yZXNpemUgPSByZXNpemVcbiAgYWN0aW9ucy5tZXRob2REaWN0LnJlc2l6ZSA9ICdyZXNpemFibGUnXG5cbiAgZGVmYXVsdHMuYWN0aW9ucy5yZXNpemUgPSByZXNpemUuZGVmYXVsdHNcbn1cblxuZnVuY3Rpb24gcmVzaXplQ2hlY2tlciAoYXJnKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgcmVjdCwgYnV0dG9ucyB9ID0gYXJnXG5cbiAgaWYgKCFyZWN0KSB7IHJldHVybiB1bmRlZmluZWQgfVxuXG4gIGNvbnN0IHBhZ2UgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZSlcbiAgY29uc3QgcmVzaXplT3B0aW9ucyA9IGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZVxuXG4gIGlmIChcbiAgICAhKHJlc2l6ZU9wdGlvbnMgJiYgcmVzaXplT3B0aW9ucy5lbmFibGVkKSB8fFxuICAgIC8vIGNoZWNrIG1vdXNlQnV0dG9uIHNldHRpbmcgaWYgdGhlIHBvaW50ZXIgaXMgZG93blxuICAgIChpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duICYmXG4gICAgIC9tb3VzZXxwb2ludGVyLy50ZXN0KGludGVyYWN0aW9uLnBvaW50ZXJUeXBlKSAmJlxuICAgKGJ1dHRvbnMgJiByZXNpemVPcHRpb25zLm1vdXNlQnV0dG9ucykgPT09IDApXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIGlmIHVzaW5nIHJlc2l6ZS5lZGdlc1xuICBpZiAoaXMub2JqZWN0KHJlc2l6ZU9wdGlvbnMuZWRnZXMpKSB7XG4gICAgY29uc3QgcmVzaXplRWRnZXMgPSB7XG4gICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgIHJpZ2h0OiBmYWxzZSxcbiAgICAgIHRvcDogZmFsc2UsXG4gICAgICBib3R0b206IGZhbHNlLFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWRnZSBpbiByZXNpemVFZGdlcykge1xuICAgICAgcmVzaXplRWRnZXNbZWRnZV0gPSBjaGVja1Jlc2l6ZUVkZ2UoZWRnZSxcbiAgICAgICAgcmVzaXplT3B0aW9ucy5lZGdlc1tlZGdlXSxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgaW50ZXJhY3Rpb24uX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHJlY3QsXG4gICAgICAgIHJlc2l6ZU9wdGlvbnMubWFyZ2luIHx8IHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuICAgIH1cblxuICAgIHJlc2l6ZUVkZ2VzLmxlZnQgPSByZXNpemVFZGdlcy5sZWZ0ICYmICFyZXNpemVFZGdlcy5yaWdodFxuICAgIHJlc2l6ZUVkZ2VzLnRvcCAgPSByZXNpemVFZGdlcy50b3AgICYmICFyZXNpemVFZGdlcy5ib3R0b21cblxuICAgIGlmIChyZXNpemVFZGdlcy5sZWZ0IHx8IHJlc2l6ZUVkZ2VzLnJpZ2h0IHx8IHJlc2l6ZUVkZ2VzLnRvcCB8fCByZXNpemVFZGdlcy5ib3R0b20pIHtcbiAgICAgIGFyZy5hY3Rpb24gPSB7XG4gICAgICAgIG5hbWU6ICdyZXNpemUnLFxuICAgICAgICBlZGdlczogcmVzaXplRWRnZXMsXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGNvbnN0IHJpZ2h0ICA9IHJlc2l6ZU9wdGlvbnMuYXhpcyAhPT0gJ3knICYmIHBhZ2UueCA+IChyZWN0LnJpZ2h0ICAtIHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuICAgIGNvbnN0IGJvdHRvbSA9IHJlc2l6ZU9wdGlvbnMuYXhpcyAhPT0gJ3gnICYmIHBhZ2UueSA+IChyZWN0LmJvdHRvbSAtIHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuXG4gICAgaWYgKHJpZ2h0IHx8IGJvdHRvbSkge1xuICAgICAgYXJnLmFjdGlvbiA9IHtcbiAgICAgICAgbmFtZTogJ3Jlc2l6ZScsXG4gICAgICAgIGF4ZXM6IChyaWdodCA/ICd4JyA6ICcnKSArIChib3R0b20gPyAneScgOiAnJyksXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyZy5hY3Rpb24gPyBmYWxzZSA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiByZXNpemFibGUgKGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zOiBJbnRlcmFjdC5PckJvb2xlYW48SW50ZXJhY3QuUmVzaXphYmxlT3B0aW9ucz4gfCBib29sZWFuLCBzY29wZTogU2NvcGUpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZS5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZVxuICAgIGludGVyYWN0YWJsZS5zZXRQZXJBY3Rpb24oJ3Jlc2l6ZScsIG9wdGlvbnMpXG4gICAgaW50ZXJhY3RhYmxlLnNldE9uRXZlbnRzKCdyZXNpemUnLCBvcHRpb25zKVxuXG4gICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmF4aXMpICYmIC9eeCR8XnkkfF54eSQvLnRlc3Qob3B0aW9ucy5heGlzKSkge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLmF4aXMgPSBvcHRpb25zLmF4aXNcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5heGlzID09PSBudWxsKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemUuYXhpcyA9IHNjb3BlLmRlZmF1bHRzLmFjdGlvbnMucmVzaXplLmF4aXNcbiAgICB9XG5cbiAgICBpZiAoaXMuYm9vbChvcHRpb25zLnByZXNlcnZlQXNwZWN0UmF0aW8pKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemUucHJlc2VydmVBc3BlY3RSYXRpbyA9IG9wdGlvbnMucHJlc2VydmVBc3BlY3RSYXRpb1xuICAgIH1cbiAgICBlbHNlIGlmIChpcy5ib29sKG9wdGlvbnMuc3F1YXJlKSkge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLnNxdWFyZSA9IG9wdGlvbnMuc3F1YXJlXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG4gIGlmIChpcy5ib29sKG9wdGlvbnMpKSB7XG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gaW50ZXJhY3RhYmxlXG4gIH1cbiAgcmV0dXJuIGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZVxufVxuXG5mdW5jdGlvbiBjaGVja1Jlc2l6ZUVkZ2UgKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHBhZ2U6IEludGVyYWN0LlBvaW50LFxuICBlbGVtZW50OiBOb2RlLFxuICBpbnRlcmFjdGFibGVFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICByZWN0OiBJbnRlcmFjdC5SZWN0LFxuICBtYXJnaW46IG51bWJlcixcbikge1xuICAvLyBmYWxzZSwgJycsIHVuZGVmaW5lZCwgbnVsbFxuICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gdHJ1ZSB2YWx1ZSwgdXNlIHBvaW50ZXIgY29vcmRzIGFuZCBlbGVtZW50IHJlY3RcbiAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgLy8gaWYgZGltZW5zaW9ucyBhcmUgbmVnYXRpdmUsIFwic3dpdGNoXCIgZWRnZXNcbiAgICBjb25zdCB3aWR0aCAgPSBpcy5udW1iZXIocmVjdC53aWR0aCkgPyByZWN0LndpZHRoICA6IHJlY3QucmlnaHQgIC0gcmVjdC5sZWZ0XG4gICAgY29uc3QgaGVpZ2h0ID0gaXMubnVtYmVyKHJlY3QuaGVpZ2h0KSA/IHJlY3QuaGVpZ2h0IDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuXG4gICAgLy8gZG9uJ3QgdXNlIG1hcmdpbiBncmVhdGVyIHRoYW4gaGFsZiB0aGUgcmVsZXZlbnQgZGltZW5zaW9uXG4gICAgbWFyZ2luID0gTWF0aC5taW4obWFyZ2luLCAobmFtZSA9PT0gJ2xlZnQnIHx8IG5hbWUgPT09ICdyaWdodCcgPyB3aWR0aCA6IGhlaWdodCkgLyAyKVxuXG4gICAgaWYgKHdpZHRoIDwgMCkge1xuICAgICAgaWYgICAgICAobmFtZSA9PT0gJ2xlZnQnKSAgeyBuYW1lID0gJ3JpZ2h0JyB9XG4gICAgICBlbHNlIGlmIChuYW1lID09PSAncmlnaHQnKSB7IG5hbWUgPSAnbGVmdCcgIH1cbiAgICB9XG4gICAgaWYgKGhlaWdodCA8IDApIHtcbiAgICAgIGlmICAgICAgKG5hbWUgPT09ICd0b3AnKSAgICB7IG5hbWUgPSAnYm90dG9tJyB9XG4gICAgICBlbHNlIGlmIChuYW1lID09PSAnYm90dG9tJykgeyBuYW1lID0gJ3RvcCcgICAgfVxuICAgIH1cblxuICAgIGlmIChuYW1lID09PSAnbGVmdCcpIHsgcmV0dXJuIHBhZ2UueCA8ICgod2lkdGggID49IDAgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0KSArIG1hcmdpbikgfVxuICAgIGlmIChuYW1lID09PSAndG9wJykgeyByZXR1cm4gcGFnZS55IDwgKChoZWlnaHQgPj0gMCA/IHJlY3QudG9wIDogcmVjdC5ib3R0b20pICsgbWFyZ2luKSB9XG5cbiAgICBpZiAobmFtZSA9PT0gJ3JpZ2h0JykgeyByZXR1cm4gcGFnZS54ID4gKCh3aWR0aCAgPj0gMCA/IHJlY3QucmlnaHQgOiByZWN0LmxlZnQpIC0gbWFyZ2luKSB9XG4gICAgaWYgKG5hbWUgPT09ICdib3R0b20nKSB7IHJldHVybiBwYWdlLnkgPiAoKGhlaWdodCA+PSAwID8gcmVjdC5ib3R0b20gOiByZWN0LnRvcCkgLSBtYXJnaW4pIH1cbiAgfVxuXG4gIC8vIHRoZSByZW1haW5pbmcgY2hlY2tzIHJlcXVpcmUgYW4gZWxlbWVudFxuICBpZiAoIWlzLmVsZW1lbnQoZWxlbWVudCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICByZXR1cm4gaXMuZWxlbWVudCh2YWx1ZSlcbiAgLy8gdGhlIHZhbHVlIGlzIGFuIGVsZW1lbnQgdG8gdXNlIGFzIGEgcmVzaXplIGhhbmRsZVxuICAgID8gdmFsdWUgPT09IGVsZW1lbnRcbiAgICAvLyBvdGhlcndpc2UgY2hlY2sgaWYgZWxlbWVudCBtYXRjaGVzIHZhbHVlIGFzIHNlbGVjdG9yXG4gICAgOiBkb20ubWF0Y2hlc1VwVG8oZWxlbWVudCwgdmFsdWUsIGludGVyYWN0YWJsZUVsZW1lbnQpXG59XG5cbmZ1bmN0aW9uIGluaXRDdXJzb3JzIChicm93c2VyOiB0eXBlb2YgaW1wb3J0ICgnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcicpLmRlZmF1bHQpIHtcbiAgcmV0dXJuIChicm93c2VyLmlzSWU5ID8ge1xuICAgIHggOiAnZS1yZXNpemUnLFxuICAgIHkgOiAncy1yZXNpemUnLFxuICAgIHh5OiAnc2UtcmVzaXplJyxcblxuICAgIHRvcCAgICAgICAgOiAnbi1yZXNpemUnLFxuICAgIGxlZnQgICAgICAgOiAndy1yZXNpemUnLFxuICAgIGJvdHRvbSAgICAgOiAncy1yZXNpemUnLFxuICAgIHJpZ2h0ICAgICAgOiAnZS1yZXNpemUnLFxuICAgIHRvcGxlZnQgICAgOiAnc2UtcmVzaXplJyxcbiAgICBib3R0b21yaWdodDogJ3NlLXJlc2l6ZScsXG4gICAgdG9wcmlnaHQgICA6ICduZS1yZXNpemUnLFxuICAgIGJvdHRvbWxlZnQgOiAnbmUtcmVzaXplJyxcbiAgfSA6IHtcbiAgICB4IDogJ2V3LXJlc2l6ZScsXG4gICAgeSA6ICducy1yZXNpemUnLFxuICAgIHh5OiAnbndzZS1yZXNpemUnLFxuXG4gICAgdG9wICAgICAgICA6ICducy1yZXNpemUnLFxuICAgIGxlZnQgICAgICAgOiAnZXctcmVzaXplJyxcbiAgICBib3R0b20gICAgIDogJ25zLXJlc2l6ZScsXG4gICAgcmlnaHQgICAgICA6ICdldy1yZXNpemUnLFxuICAgIHRvcGxlZnQgICAgOiAnbndzZS1yZXNpemUnLFxuICAgIGJvdHRvbXJpZ2h0OiAnbndzZS1yZXNpemUnLFxuICAgIHRvcHJpZ2h0ICAgOiAnbmVzdy1yZXNpemUnLFxuICAgIGJvdHRvbWxlZnQgOiAnbmVzdy1yZXNpemUnLFxuICB9KVxufVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpRXZlbnQsIGludGVyYWN0aW9uIH06IHsgaUV2ZW50OiBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PGFueSwgYW55PiwgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUgIT09ICdyZXNpemUnIHx8ICFpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzaXplRXZlbnQgPSBpRXZlbnQgYXMgUmVzaXplRXZlbnRcbiAgY29uc3QgcmVjdCA9IGludGVyYWN0aW9uLnJlY3RcblxuICBpbnRlcmFjdGlvbi5fcmVjdHMgPSB7XG4gICAgc3RhcnQ6IGV4dGVuZCh7fSwgcmVjdCksXG4gICAgY29ycmVjdGVkOiBleHRlbmQoe30sIHJlY3QpLFxuICAgIHByZXZpb3VzOiBleHRlbmQoe30sIHJlY3QpLFxuICAgIGRlbHRhOiB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQgOiAwLFxuICAgICAgd2lkdGggOiAwLFxuICAgICAgdG9wIDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICB9LFxuICB9XG5cbiAgcmVzaXplRXZlbnQuZWRnZXMgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlc1xuICByZXNpemVFdmVudC5yZWN0ID0gaW50ZXJhY3Rpb24uX3JlY3RzLmNvcnJlY3RlZFxuICByZXNpemVFdmVudC5kZWx0YVJlY3QgPSBpbnRlcmFjdGlvbi5fcmVjdHMuZGVsdGFcbn1cblxuZnVuY3Rpb24gbW92ZSAoeyBpRXZlbnQsIGludGVyYWN0aW9uIH06IHsgaUV2ZW50OiBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PGFueSwgYW55PiwgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUgIT09ICdyZXNpemUnIHx8ICFpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlcykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IHJlc2l6ZUV2ZW50ID0gaUV2ZW50IGFzIFJlc2l6ZUV2ZW50XG4gIGNvbnN0IHJlc2l6ZU9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemVcbiAgY29uc3QgaW52ZXJ0ID0gcmVzaXplT3B0aW9ucy5pbnZlcnRcbiAgY29uc3QgaW52ZXJ0aWJsZSA9IGludmVydCA9PT0gJ3JlcG9zaXRpb24nIHx8IGludmVydCA9PT0gJ25lZ2F0ZSdcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGNvbnN0IGN1cnJlbnQgPSBpbnRlcmFjdGlvbi5yZWN0XG4gIGNvbnN0IHsgc3RhcnQ6IHN0YXJ0UmVjdCwgY29ycmVjdGVkLCBkZWx0YTogZGVsdGFSZWN0LCBwcmV2aW91cyB9ID0gaW50ZXJhY3Rpb24uX3JlY3RzXG5cbiAgZXh0ZW5kKHByZXZpb3VzLCBjb3JyZWN0ZWQpXG5cbiAgaWYgKGludmVydGlibGUpIHtcbiAgICAvLyBpZiBpbnZlcnRpYmxlLCBjb3B5IHRoZSBjdXJyZW50IHJlY3RcbiAgICBleHRlbmQoY29ycmVjdGVkLCBjdXJyZW50KVxuXG4gICAgaWYgKGludmVydCA9PT0gJ3JlcG9zaXRpb24nKSB7XG4gICAgICAvLyBzd2FwIGVkZ2UgdmFsdWVzIGlmIG5lY2Vzc2FyeSB0byBrZWVwIHdpZHRoL2hlaWdodCBwb3NpdGl2ZVxuICAgICAgaWYgKGNvcnJlY3RlZC50b3AgPiBjb3JyZWN0ZWQuYm90dG9tKSB7XG4gICAgICAgIGNvbnN0IHN3YXAgPSBjb3JyZWN0ZWQudG9wXG5cbiAgICAgICAgY29ycmVjdGVkLnRvcCA9IGNvcnJlY3RlZC5ib3R0b21cbiAgICAgICAgY29ycmVjdGVkLmJvdHRvbSA9IHN3YXBcbiAgICAgIH1cbiAgICAgIGlmIChjb3JyZWN0ZWQubGVmdCA+IGNvcnJlY3RlZC5yaWdodCkge1xuICAgICAgICBjb25zdCBzd2FwID0gY29ycmVjdGVkLmxlZnRcblxuICAgICAgICBjb3JyZWN0ZWQubGVmdCA9IGNvcnJlY3RlZC5yaWdodFxuICAgICAgICBjb3JyZWN0ZWQucmlnaHQgPSBzd2FwXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIGlmIG5vdCBpbnZlcnRpYmxlLCByZXN0cmljdCB0byBtaW5pbXVtIG9mIDB4MCByZWN0XG4gICAgY29ycmVjdGVkLnRvcCAgICA9IE1hdGgubWluKGN1cnJlbnQudG9wLCBzdGFydFJlY3QuYm90dG9tKVxuICAgIGNvcnJlY3RlZC5ib3R0b20gPSBNYXRoLm1heChjdXJyZW50LmJvdHRvbSwgc3RhcnRSZWN0LnRvcClcbiAgICBjb3JyZWN0ZWQubGVmdCAgID0gTWF0aC5taW4oY3VycmVudC5sZWZ0LCBzdGFydFJlY3QucmlnaHQpXG4gICAgY29ycmVjdGVkLnJpZ2h0ICA9IE1hdGgubWF4KGN1cnJlbnQucmlnaHQsIHN0YXJ0UmVjdC5sZWZ0KVxuICB9XG5cbiAgY29ycmVjdGVkLndpZHRoICA9IGNvcnJlY3RlZC5yaWdodCAgLSBjb3JyZWN0ZWQubGVmdFxuICBjb3JyZWN0ZWQuaGVpZ2h0ID0gY29ycmVjdGVkLmJvdHRvbSAtIGNvcnJlY3RlZC50b3BcblxuICBmb3IgKGNvbnN0IGVkZ2UgaW4gY29ycmVjdGVkKSB7XG4gICAgZGVsdGFSZWN0W2VkZ2VdID0gY29ycmVjdGVkW2VkZ2VdIC0gcHJldmlvdXNbZWRnZV1cbiAgfVxuXG4gIHJlc2l6ZUV2ZW50LmVkZ2VzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuZWRnZXNcbiAgcmVzaXplRXZlbnQucmVjdCA9IGNvcnJlY3RlZFxuICByZXNpemVFdmVudC5kZWx0YVJlY3QgPSBkZWx0YVJlY3Rcbn1cblxuZnVuY3Rpb24gZW5kICh7IGlFdmVudCwgaW50ZXJhY3Rpb24gfTogeyBpRXZlbnQ6IEludGVyYWN0LkludGVyYWN0RXZlbnQ8YW55LCBhbnk+LCBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24gfSkge1xuICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ3Jlc2l6ZScgfHwgIWludGVyYWN0aW9uLnByZXBhcmVkLmVkZ2VzKSB7IHJldHVybiB9XG5cbiAgY29uc3QgcmVzaXplRXZlbnQgPSBpRXZlbnQgYXMgUmVzaXplRXZlbnRcblxuICByZXNpemVFdmVudC5lZGdlcyA9IGludGVyYWN0aW9uLnByZXBhcmVkLmVkZ2VzXG4gIHJlc2l6ZUV2ZW50LnJlY3QgPSBpbnRlcmFjdGlvbi5fcmVjdHMuY29ycmVjdGVkXG4gIHJlc2l6ZUV2ZW50LmRlbHRhUmVjdCA9IGludGVyYWN0aW9uLl9yZWN0cy5kZWx0YVxufVxuXG5mdW5jdGlvbiB1cGRhdGVFdmVudEF4ZXMgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbiB9OiB7IGlFdmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxhbnksIGFueT4sIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAncmVzaXplJyB8fCAhaW50ZXJhY3Rpb24ucmVzaXplQXhlcykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9uc1xuICBjb25zdCByZXNpemVFdmVudCA9IGlFdmVudCBhcyBSZXNpemVFdmVudFxuXG4gIGlmIChvcHRpb25zLnJlc2l6ZS5zcXVhcmUpIHtcbiAgICBpZiAoaW50ZXJhY3Rpb24ucmVzaXplQXhlcyA9PT0gJ3knKSB7XG4gICAgICByZXNpemVFdmVudC5kZWx0YS54ID0gcmVzaXplRXZlbnQuZGVsdGEueVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJlc2l6ZUV2ZW50LmRlbHRhLnkgPSByZXNpemVFdmVudC5kZWx0YS54XG4gICAgfVxuICAgIHJlc2l6ZUV2ZW50LmF4ZXMgPSAneHknXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzaXplRXZlbnQuYXhlcyA9IGludGVyYWN0aW9uLnJlc2l6ZUF4ZXNcblxuICAgIGlmIChpbnRlcmFjdGlvbi5yZXNpemVBeGVzID09PSAneCcpIHtcbiAgICAgIHJlc2l6ZUV2ZW50LmRlbHRhLnkgPSAwXG4gICAgfVxuICAgIGVsc2UgaWYgKGludGVyYWN0aW9uLnJlc2l6ZUF4ZXMgPT09ICd5Jykge1xuICAgICAgcmVzaXplRXZlbnQuZGVsdGEueCA9IDBcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcmVzaXplOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYWN0aW9ucy9yZXNpemUnLFxuICBiZWZvcmU6IFsnYWN0aW9ucy9kcmFnJ10sXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogKHsgaW50ZXJhY3Rpb24gfSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24ucmVzaXplQXhlcyA9ICd4eSdcbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tc3RhcnQnOiBhcmcgPT4ge1xuICAgICAgc3RhcnQoYXJnKVxuICAgICAgdXBkYXRlRXZlbnRBeGVzKGFyZylcbiAgICB9LFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBhcmcgPT4ge1xuICAgICAgbW92ZShhcmcpXG4gICAgICB1cGRhdGVFdmVudEF4ZXMoYXJnKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tZW5kJzogZW5kLFxuICAgICdhdXRvLXN0YXJ0OmNoZWNrJzogcmVzaXplQ2hlY2tlcixcbiAgfSxcblxuICBkZWZhdWx0czoge1xuICAgIHNxdWFyZTogZmFsc2UsXG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgYXhpczogJ3h5JyxcblxuICAgIC8vIHVzZSBkZWZhdWx0IG1hcmdpblxuICAgIG1hcmdpbjogTmFOLFxuXG4gICAgLy8gb2JqZWN0IHdpdGggcHJvcHMgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIHdoaWNoIGFyZVxuICAgIC8vIHRydWUvZmFsc2UgdmFsdWVzIHRvIHJlc2l6ZSB3aGVuIHRoZSBwb2ludGVyIGlzIG92ZXIgdGhhdCBlZGdlLFxuICAgIC8vIENTUyBzZWxlY3RvcnMgdG8gbWF0Y2ggdGhlIGhhbmRsZXMgZm9yIGVhY2ggZGlyZWN0aW9uXG4gICAgLy8gb3IgdGhlIEVsZW1lbnRzIGZvciBlYWNoIGhhbmRsZVxuICAgIGVkZ2VzOiBudWxsLFxuXG4gICAgLy8gYSB2YWx1ZSBvZiAnbm9uZScgd2lsbCBsaW1pdCB0aGUgcmVzaXplIHJlY3QgdG8gYSBtaW5pbXVtIG9mIDB4MFxuICAgIC8vICduZWdhdGUnIHdpbGwgYWxvdyB0aGUgcmVjdCB0byBoYXZlIG5lZ2F0aXZlIHdpZHRoL2hlaWdodFxuICAgIC8vICdyZXBvc2l0aW9uJyB3aWxsIGtlZXAgdGhlIHdpZHRoL2hlaWdodCBwb3NpdGl2ZSBieSBzd2FwcGluZ1xuICAgIC8vIHRoZSB0b3AgYW5kIGJvdHRvbSBlZGdlcyBhbmQvb3Igc3dhcHBpbmcgdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzXG4gICAgaW52ZXJ0OiAnbm9uZScsXG4gIH0gYXMgSW50ZXJhY3QuUmVzaXphYmxlT3B0aW9ucyxcblxuICBjdXJzb3JzOiBudWxsIGFzIFJldHVyblR5cGU8dHlwZW9mIGluaXRDdXJzb3JzPixcblxuICBnZXRDdXJzb3IgKHsgZWRnZXMsIGF4aXMsIG5hbWUgfTogSW50ZXJhY3QuQWN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjdXJzb3JzID0gcmVzaXplLmN1cnNvcnNcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsXG5cbiAgICBpZiAoYXhpcykge1xuICAgICAgcmVzdWx0ID0gY3Vyc29yc1tuYW1lICsgYXhpc11cbiAgICB9XG4gICAgZWxzZSBpZiAoZWRnZXMpIHtcbiAgICAgIGxldCBjdXJzb3JLZXkgPSAnJ1xuXG4gICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgWyd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnXSkge1xuICAgICAgICBpZiAoZWRnZXNbZWRnZV0pIHtcbiAgICAgICAgICBjdXJzb3JLZXkgKz0gZWRnZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCA9IGN1cnNvcnNbY3Vyc29yS2V5XVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfSxcblxuICBkZWZhdWx0TWFyZ2luOiBudWxsIGFzIG51bWJlcixcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVzaXplXG4iLCJpbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgZHJhZyBmcm9tICcuL2RyYWcnXG5pbXBvcnQgZHJvcCBmcm9tICcuL2Ryb3AvaW5kZXgnXG5pbXBvcnQgZ2VzdHVyZSBmcm9tICcuL2dlc3R1cmUnXG5pbXBvcnQgcmVzaXplIGZyb20gJy4vcmVzaXplJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnYWN0aW9ucycsXG4gIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICAgIHNjb3BlLnVzZVBsdWdpbihnZXN0dXJlKVxuICAgIHNjb3BlLnVzZVBsdWdpbihyZXNpemUpXG4gICAgc2NvcGUudXNlUGx1Z2luKGRyYWcpXG4gICAgc2NvcGUudXNlUGx1Z2luKGRyb3ApXG4gIH0sXG59XG5cbmV4cG9ydCB7XG4gIGdlc3R1cmUsXG4gIHJlc2l6ZSxcbiAgZHJhZyxcbiAgZHJvcCxcbn1cbiIsImltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5pbXBvcnQgcmFmIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JhZidcbmltcG9ydCB7IGdldFN0cmluZ09wdGlvblJlc3VsdCB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JlY3QnXG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy93aW5kb3cnXG5cbnR5cGUgU2NvcGUgPSBpbXBvcnQgKCdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJykuU2NvcGVcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNjb3BlIHtcbiAgICBhdXRvU2Nyb2xsOiB0eXBlb2YgYXV0b1Njcm9sbFxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgYXV0b1Njcm9sbD86IHR5cGVvZiBhdXRvU2Nyb2xsXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIFBlckFjdGlvbkRlZmF1bHRzIHtcbiAgICBhdXRvU2Nyb2xsPzogQXV0b1Njcm9sbE9wdGlvbnNcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TY3JvbGxPcHRpb25zIHtcbiAgY29udGFpbmVyPzogV2luZG93IHwgSFRNTEVsZW1lbnRcbiAgbWFyZ2luPzogbnVtYmVyXG4gIGRpc3RhbmNlPzogbnVtYmVyXG4gIGludGVydmFsPzogbnVtYmVyXG4gIHNwZWVkPzogbnVtYmVyXG4gIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgZGVmYXVsdHMsXG4gICAgYWN0aW9ucyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUuYXV0b1Njcm9sbCA9IGF1dG9TY3JvbGxcbiAgYXV0b1Njcm9sbC5ub3cgPSAoKSA9PiBzY29wZS5ub3coKVxuXG4gIGFjdGlvbnMucGhhc2VsZXNzVHlwZXMuYXV0b3Njcm9sbCA9IHRydWVcbiAgZGVmYXVsdHMucGVyQWN0aW9uLmF1dG9TY3JvbGwgPSBhdXRvU2Nyb2xsLmRlZmF1bHRzXG59XG5cbmNvbnN0IGF1dG9TY3JvbGwgPSB7XG4gIGRlZmF1bHRzOiB7XG4gICAgZW5hYmxlZCAgOiBmYWxzZSxcbiAgICBtYXJnaW4gICA6IDYwLFxuXG4gICAgLy8gdGhlIGl0ZW0gdGhhdCBpcyBzY3JvbGxlZCAoV2luZG93IG9yIEhUTUxFbGVtZW50KVxuICAgIGNvbnRhaW5lcjogbnVsbCBhcyBBdXRvU2Nyb2xsT3B0aW9uc1snY29udGFpbmVyJ10sXG5cbiAgICAvLyB0aGUgc2Nyb2xsIHNwZWVkIGluIHBpeGVscyBwZXIgc2Vjb25kXG4gICAgc3BlZWQgICAgOiAzMDAsXG4gIH0gYXMgQXV0b1Njcm9sbE9wdGlvbnMsXG5cbiAgbm93OiBEYXRlLm5vdyxcblxuICBpbnRlcmFjdGlvbjogbnVsbCBhcyBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgaTogMCwgLy8gdGhlIGhhbmRsZSByZXR1cm5lZCBieSB3aW5kb3cuc2V0SW50ZXJ2YWxcblxuICAvLyBEaXJlY3Rpb24gZWFjaCBwdWxzZSBpcyB0byBzY3JvbGwgaW5cbiAgeDogMCxcbiAgeTogMCxcblxuICBpc1Njcm9sbGluZzogZmFsc2UsXG4gIHByZXZUaW1lOiAwLFxuICBtYXJnaW46IDAsXG4gIHNwZWVkOiAwLFxuXG4gIHN0YXJ0IChpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24pIHtcbiAgICBhdXRvU2Nyb2xsLmlzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgIHJhZi5jYW5jZWwoYXV0b1Njcm9sbC5pKVxuXG4gICAgaW50ZXJhY3Rpb24uYXV0b1Njcm9sbCA9IGF1dG9TY3JvbGxcbiAgICBhdXRvU2Nyb2xsLmludGVyYWN0aW9uID0gaW50ZXJhY3Rpb25cbiAgICBhdXRvU2Nyb2xsLnByZXZUaW1lID0gYXV0b1Njcm9sbC5ub3coKVxuICAgIGF1dG9TY3JvbGwuaSA9IHJhZi5yZXF1ZXN0KGF1dG9TY3JvbGwuc2Nyb2xsKVxuICB9LFxuXG4gIHN0b3AgKCkge1xuICAgIGF1dG9TY3JvbGwuaXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgIGlmIChhdXRvU2Nyb2xsLmludGVyYWN0aW9uKSB7XG4gICAgICBhdXRvU2Nyb2xsLmludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgfVxuICAgIHJhZi5jYW5jZWwoYXV0b1Njcm9sbC5pKVxuICB9LFxuXG4gIC8vIHNjcm9sbCB0aGUgd2luZG93IGJ5IHRoZSB2YWx1ZXMgaW4gc2Nyb2xsLngveVxuICBzY3JvbGwgKCkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGF1dG9TY3JvbGxcbiAgICBjb25zdCB7IGludGVyYWN0YWJsZSwgZWxlbWVudCB9ID0gaW50ZXJhY3Rpb25cbiAgICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb25OYW1lXS5hdXRvU2Nyb2xsXG4gICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbnMuY29udGFpbmVyLCBpbnRlcmFjdGFibGUsIGVsZW1lbnQpXG4gICAgY29uc3Qgbm93ID0gYXV0b1Njcm9sbC5ub3coKVxuICAgIC8vIGNoYW5nZSBpbiB0aW1lIGluIHNlY29uZHNcbiAgICBjb25zdCBkdCA9IChub3cgLSBhdXRvU2Nyb2xsLnByZXZUaW1lKSAvIDEwMDBcbiAgICAvLyBkaXNwbGFjZW1lbnRcbiAgICBjb25zdCBzID0gb3B0aW9ucy5zcGVlZCAqIGR0XG5cbiAgICBpZiAocyA+PSAxKSB7XG4gICAgICBjb25zdCBzY3JvbGxCeSA9IHtcbiAgICAgICAgeDogYXV0b1Njcm9sbC54ICogcyxcbiAgICAgICAgeTogYXV0b1Njcm9sbC55ICogcyxcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbEJ5LnggfHwgc2Nyb2xsQnkueSkge1xuICAgICAgICBjb25zdCBwcmV2U2Nyb2xsID0gZ2V0U2Nyb2xsKGNvbnRhaW5lcilcblxuICAgICAgICBpZiAoaXMud2luZG93KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICBjb250YWluZXIuc2Nyb2xsQnkoc2Nyb2xsQnkueCwgc2Nyb2xsQnkueSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICBjb250YWluZXIuc2Nyb2xsTGVmdCArPSBzY3JvbGxCeS54XG4gICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCAgKz0gc2Nyb2xsQnkueVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VyU2Nyb2xsID0gZ2V0U2Nyb2xsKGNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgZGVsdGEgPSB7XG4gICAgICAgICAgeDogY3VyU2Nyb2xsLnggLSBwcmV2U2Nyb2xsLngsXG4gICAgICAgICAgeTogY3VyU2Nyb2xsLnkgLSBwcmV2U2Nyb2xsLnksXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsdGEueCB8fCBkZWx0YS55KSB7XG4gICAgICAgICAgaW50ZXJhY3RhYmxlLmZpcmUoe1xuICAgICAgICAgICAgdHlwZTogJ2F1dG9zY3JvbGwnLFxuICAgICAgICAgICAgdGFyZ2V0OiBlbGVtZW50LFxuICAgICAgICAgICAgaW50ZXJhY3RhYmxlLFxuICAgICAgICAgICAgZGVsdGEsXG4gICAgICAgICAgICBpbnRlcmFjdGlvbixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF1dG9TY3JvbGwucHJldlRpbWUgPSBub3dcbiAgICB9XG5cbiAgICBpZiAoYXV0b1Njcm9sbC5pc1Njcm9sbGluZykge1xuICAgICAgcmFmLmNhbmNlbChhdXRvU2Nyb2xsLmkpXG4gICAgICBhdXRvU2Nyb2xsLmkgPSByYWYucmVxdWVzdChhdXRvU2Nyb2xsLnNjcm9sbClcbiAgICB9XG4gIH0sXG4gIGNoZWNrIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgYWN0aW9uTmFtZTogSW50ZXJhY3QuQWN0aW9uTmFtZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1xuXG4gICAgcmV0dXJuIG9wdGlvbnNbYWN0aW9uTmFtZV0uYXV0b1Njcm9sbCAmJiBvcHRpb25zW2FjdGlvbk5hbWVdLmF1dG9TY3JvbGwuZW5hYmxlZFxuICB9LFxuICBvbkludGVyYWN0aW9uTW92ZTxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKHsgaW50ZXJhY3Rpb24sIHBvaW50ZXIgfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb248VD4sIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIH0pIHtcbiAgICBpZiAoIShpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpICYmXG4gICAgICAgICAgYXV0b1Njcm9sbC5jaGVjayhpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLnNpbXVsYXRpb24pIHtcbiAgICAgIGF1dG9TY3JvbGwueCA9IGF1dG9TY3JvbGwueSA9IDBcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCB0b3BcbiAgICBsZXQgcmlnaHRcbiAgICBsZXQgYm90dG9tXG4gICAgbGV0IGxlZnRcblxuICAgIGNvbnN0IHsgaW50ZXJhY3RhYmxlLCBlbGVtZW50IH0gPSBpbnRlcmFjdGlvblxuICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lXG4gICAgY29uc3Qgb3B0aW9ucyA9IGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbk5hbWVdLmF1dG9TY3JvbGxcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXIob3B0aW9ucy5jb250YWluZXIsIGludGVyYWN0YWJsZSwgZWxlbWVudClcblxuICAgIGlmIChpcy53aW5kb3coY29udGFpbmVyKSkge1xuICAgICAgbGVmdCAgID0gcG9pbnRlci5jbGllbnRYIDwgYXV0b1Njcm9sbC5tYXJnaW5cbiAgICAgIHRvcCAgICA9IHBvaW50ZXIuY2xpZW50WSA8IGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICByaWdodCAgPSBwb2ludGVyLmNsaWVudFggPiBjb250YWluZXIuaW5uZXJXaWR0aCAgLSBhdXRvU2Nyb2xsLm1hcmdpblxuICAgICAgYm90dG9tID0gcG9pbnRlci5jbGllbnRZID4gY29udGFpbmVyLmlubmVySGVpZ2h0IC0gYXV0b1Njcm9sbC5tYXJnaW5cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCByZWN0ID0gZG9tVXRpbHMuZ2V0RWxlbWVudENsaWVudFJlY3QoY29udGFpbmVyKVxuXG4gICAgICBsZWZ0ICAgPSBwb2ludGVyLmNsaWVudFggPCByZWN0LmxlZnQgICArIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICB0b3AgICAgPSBwb2ludGVyLmNsaWVudFkgPCByZWN0LnRvcCAgICArIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICByaWdodCAgPSBwb2ludGVyLmNsaWVudFggPiByZWN0LnJpZ2h0ICAtIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICBib3R0b20gPSBwb2ludGVyLmNsaWVudFkgPiByZWN0LmJvdHRvbSAtIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgfVxuXG4gICAgYXV0b1Njcm9sbC54ID0gKHJpZ2h0ID8gMSA6IGxlZnQgPyAtMSA6IDApXG4gICAgYXV0b1Njcm9sbC55ID0gKGJvdHRvbSA/IDEgOiAgdG9wID8gLTEgOiAwKVxuXG4gICAgaWYgKCFhdXRvU2Nyb2xsLmlzU2Nyb2xsaW5nKSB7XG4gICAgICAvLyBzZXQgdGhlIGF1dG9TY3JvbGwgcHJvcGVydGllcyB0byB0aG9zZSBvZiB0aGUgdGFyZ2V0XG4gICAgICBhdXRvU2Nyb2xsLm1hcmdpbiA9IG9wdGlvbnMubWFyZ2luXG4gICAgICBhdXRvU2Nyb2xsLnNwZWVkICA9IG9wdGlvbnMuc3BlZWRcblxuICAgICAgYXV0b1Njcm9sbC5zdGFydChpbnRlcmFjdGlvbilcbiAgICB9XG4gIH0sXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250YWluZXIgKHZhbHVlOiBhbnksIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gIHJldHVybiAoaXMuc3RyaW5nKHZhbHVlKSA/IGdldFN0cmluZ09wdGlvblJlc3VsdCh2YWx1ZSwgaW50ZXJhY3RhYmxlLCBlbGVtZW50KSA6IHZhbHVlKSB8fCBnZXRXaW5kb3coZWxlbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjcm9sbCAoY29udGFpbmVyOiBhbnkpIHtcbiAgaWYgKGlzLndpbmRvdyhjb250YWluZXIpKSB7IGNvbnRhaW5lciA9IHdpbmRvdy5kb2N1bWVudC5ib2R5IH1cblxuICByZXR1cm4geyB4OiBjb250YWluZXIuc2Nyb2xsTGVmdCwgeTogY29udGFpbmVyLnNjcm9sbFRvcCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxTaXplIChjb250YWluZXI6IGFueSkge1xuICBpZiAoaXMud2luZG93KGNvbnRhaW5lcikpIHsgY29udGFpbmVyID0gd2luZG93LmRvY3VtZW50LmJvZHkgfVxuXG4gIHJldHVybiB7IHg6IGNvbnRhaW5lci5zY3JvbGxXaWR0aCwgeTogY29udGFpbmVyLnNjcm9sbEhlaWdodCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxTaXplRGVsdGE8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+ICh7IGludGVyYWN0aW9uLCBlbGVtZW50IH06IHtcbiAgaW50ZXJhY3Rpb246IFBhcnRpYWw8SW50ZXJhY3QuSW50ZXJhY3Rpb248VD4+XG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbn0sIGZ1bmM6IGFueSkge1xuICBjb25zdCBzY3JvbGxPcHRpb25zID0gaW50ZXJhY3Rpb24gJiYgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLm9wdGlvbnNbaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZV0uYXV0b1Njcm9sbFxuXG4gIGlmICghc2Nyb2xsT3B0aW9ucyB8fCAhc2Nyb2xsT3B0aW9ucy5lbmFibGVkKSB7XG4gICAgZnVuYygpXG4gICAgcmV0dXJuIHsgeDogMCwgeTogMCB9XG4gIH1cblxuICBjb25zdCBzY3JvbGxDb250YWluZXIgPSBnZXRDb250YWluZXIoXG4gICAgc2Nyb2xsT3B0aW9ucy5jb250YWluZXIsXG4gICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLFxuICAgIGVsZW1lbnQsXG4gIClcblxuICBjb25zdCBwcmV2U2l6ZSA9IGdldFNjcm9sbChzY3JvbGxDb250YWluZXIpXG4gIGZ1bmMoKVxuICBjb25zdCBjdXJTaXplID0gZ2V0U2Nyb2xsKHNjcm9sbENvbnRhaW5lcilcblxuICByZXR1cm4ge1xuICAgIHg6IGN1clNpemUueCAtIHByZXZTaXplLngsXG4gICAgeTogY3VyU2l6ZS55IC0gcHJldlNpemUueSxcbiAgfVxufVxuXG5jb25zdCBhdXRvU2Nyb2xsUGx1Z2luOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYXV0by1zY3JvbGwnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgfSxcblxuICAgICdpbnRlcmFjdGlvbnM6ZGVzdHJveSc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgICBhdXRvU2Nyb2xsLnN0b3AoKVxuICAgICAgaWYgKGF1dG9TY3JvbGwuaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgYXV0b1Njcm9sbC5pbnRlcmFjdGlvbiA9IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogYXV0b1Njcm9sbC5zdG9wLFxuXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IChhcmc6IGFueSkgPT4gYXV0b1Njcm9sbC5vbkludGVyYWN0aW9uTW92ZShhcmcpLFxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBhdXRvU2Nyb2xsUGx1Z2luXG4iLCJpbXBvcnQgeyB3YXJuT25jZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBnZXRBY3Rpb246IChcbiAgICAgIHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLFxuICAgICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sXG4gICAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgICkgPT4gSW50ZXJhY3QuQWN0aW9uUHJvcHMgfCBudWxsXG4gICAgc3R5bGVDdXJzb3I6IHR5cGVvZiBzdHlsZUN1cnNvclxuICAgIGFjdGlvbkNoZWNrZXI6IHR5cGVvZiBhY3Rpb25DaGVja2VyXG4gICAgaWdub3JlRnJvbToge1xuICAgICAgKC4uLmFyZ3M6IGFueVtdKTogSW50ZXJhY3RhYmxlXG4gICAgICAoKTogYm9vbGVhblxuICAgIH1cbiAgICBhbGxvd0Zyb206IHtcbiAgICAgICguLi5hcmdzOiBhbnlbXSk6IEludGVyYWN0YWJsZVxuICAgICAgKCk6IGJvb2xlYW5cbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBwb2ludGVySXNEb3duOiBib29sZWFuXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICAvKiogQGxlbmRzIEludGVyYWN0YWJsZSAqL1xuICAgIEludGVyYWN0YWJsZSwgLy8gdHNsaW50OmRpc2FibGUtbGluZSBuby1zaGFkb3dlZC12YXJpYWJsZVxuICB9ID0gc2NvcGVcblxuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmdldEFjdGlvbiA9IGZ1bmN0aW9uIGdldEFjdGlvbiAoXG4gICAgdGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLFxuICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLFxuICAgIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLFxuICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICApOiBJbnRlcmFjdC5BY3Rpb25Qcm9wcyB7XG4gICAgY29uc3QgYWN0aW9uID0gZGVmYXVsdEFjdGlvbkNoZWNrZXIodGhpcywgZXZlbnQsIGludGVyYWN0aW9uLCBlbGVtZW50LCBzY29wZSlcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlcikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hY3Rpb25DaGVja2VyKHBvaW50ZXIsIGV2ZW50LCBhY3Rpb24sIHRoaXMsIGVsZW1lbnQsIGludGVyYWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBgYGBqc1xuICAgKiBpbnRlcmFjdChlbGVtZW50LCB7IGlnbm9yZUZyb206IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduby1hY3Rpb24nKSB9KVxuICAgKiAvLyBvclxuICAgKiBpbnRlcmFjdChlbGVtZW50KS5pZ25vcmVGcm9tKCdpbnB1dCwgdGV4dGFyZWEsIGEnKVxuICAgKiBgYGBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogSWYgdGhlIHRhcmdldCBvZiB0aGUgYG1vdXNlZG93bmAsIGBwb2ludGVyZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50IG9yIGFueVxuICAgKiBvZiBpdCdzIHBhcmVudHMgbWF0Y2ggdGhlIGdpdmVuIENTUyBzZWxlY3RvciBvciBFbGVtZW50LCBub1xuICAgKiBkcmFnL3Jlc2l6ZS9nZXN0dXJlIGlzIHN0YXJ0ZWQuXG4gICAqXG4gICAqIERvbid0IHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCBzZXQgdGhlIGBpZ25vcmVGcm9tYCBvcHRpb24gZm9yIGVhY2ggYWN0aW9uXG4gICAqIG9yIGZvciBgcG9pbnRlckV2ZW50c2BcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogaW50ZXJhY3QodGFyZ2V0dClcbiAgICogICAuZHJhZ2dhYmxlKHtcbiAgICogICAgIGlnbm9yZUZyb206ICdpbnB1dCwgdGV4dGFyZWEsIGFbaHJlZl0nJyxcbiAgICogICB9KVxuICAgKiAgIC5wb2ludGVyRXZlbnRzKHtcbiAgICogICAgIGlnbm9yZUZyb206ICdbbm8tcG9pbnRlcl0nLFxuICAgKiAgIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRWxlbWVudCB8IG51bGx9IFtuZXdWYWx1ZV0gYSBDU1Mgc2VsZWN0b3Igc3RyaW5nLCBhblxuICAgKiBFbGVtZW50IG9yIGBudWxsYCB0byBub3QgaWdub3JlIGFueSBlbGVtZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBFbGVtZW50IHwgb2JqZWN0fSBUaGUgY3VycmVudCBpZ25vcmVGcm9tIHZhbHVlIG9yIHRoaXNcbiAgICogSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmlnbm9yZUZyb20gPSB3YXJuT25jZShmdW5jdGlvbiAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBuZXdWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrQ29tcGF0T3B0aW9uKCdpZ25vcmVGcm9tJywgbmV3VmFsdWUpXG4gIH0sICdJbnRlcmFjdGFibGUuaWdub3JlRnJvbSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBJbnRlcmFjdGJsZS5kcmFnZ2FibGUoe2lnbm9yZUZyb206IG5ld1ZhbHVlfSkuJylcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICpcbiAgICogQSBkcmFnL3Jlc2l6ZS9nZXN0dXJlIGlzIHN0YXJ0ZWQgb25seSBJZiB0aGUgdGFyZ2V0IG9mIHRoZSBgbW91c2Vkb3duYCxcbiAgICogYHBvaW50ZXJkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQgb3IgYW55IG9mIGl0J3MgcGFyZW50cyBtYXRjaCB0aGUgZ2l2ZW5cbiAgICogQ1NTIHNlbGVjdG9yIG9yIEVsZW1lbnQuXG4gICAqXG4gICAqIERvbid0IHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCBzZXQgdGhlIGBhbGxvd0Zyb21gIG9wdGlvbiBmb3IgZWFjaCBhY3Rpb25cbiAgICogb3IgZm9yIGBwb2ludGVyRXZlbnRzYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpbnRlcmFjdCh0YXJnZXR0KVxuICAgKiAgIC5yZXNpemFibGUoe1xuICAgKiAgICAgYWxsb3dGcm9tOiAnLnJlc2l6ZS1oYW5kbGUnLFxuICAgKiAgIC5wb2ludGVyRXZlbnRzKHtcbiAgICogICAgIGFsbG93RnJvbTogJy5oYW5kbGUnLCxcbiAgICogICB9KVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEVsZW1lbnQgfCBudWxsfSBbbmV3VmFsdWVdIGEgQ1NTIHNlbGVjdG9yIHN0cmluZywgYW5cbiAgICogRWxlbWVudCBvciBgbnVsbGAgdG8gYWxsb3cgZnJvbSBhbnkgZWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBFbGVtZW50IHwgb2JqZWN0fSBUaGUgY3VycmVudCBhbGxvd0Zyb20gdmFsdWUgb3IgdGhpc1xuICAgKiBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuYWxsb3dGcm9tID0gd2Fybk9uY2UoZnVuY3Rpb24gKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja0NvbXBhdE9wdGlvbignYWxsb3dGcm9tJywgbmV3VmFsdWUpXG4gIH0sICdJbnRlcmFjdGFibGUuYWxsb3dGcm9tKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIEludGVyYWN0YmxlLmRyYWdnYWJsZSh7YWxsb3dGcm9tOiBuZXdWYWx1ZX0pLicpXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGludGVyYWN0KCcucmVzaXplLWRyYWcnKVxuICAgKiAgIC5yZXNpemFibGUodHJ1ZSlcbiAgICogICAuZHJhZ2dhYmxlKHRydWUpXG4gICAqICAgLmFjdGlvbkNoZWNrZXIoZnVuY3Rpb24gKHBvaW50ZXIsIGV2ZW50LCBhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgaW50ZXJhY3Rpb24pIHtcbiAgICpcbiAgICogICBpZiAoaW50ZXJhY3QubWF0Y2hlc1NlbGVjdG9yKGV2ZW50LnRhcmdldCwgJy5kcmFnLWhhbmRsZScpKSB7XG4gICAqICAgICAvLyBmb3JjZSBkcmFnIHdpdGggaGFuZGxlIHRhcmdldFxuICAgKiAgICAgYWN0aW9uLm5hbWUgPSBkcmFnXG4gICAqICAgfVxuICAgKiAgIGVsc2Uge1xuICAgKiAgICAgLy8gcmVzaXplIGZyb20gdGhlIHRvcCBhbmQgcmlnaHQgZWRnZXNcbiAgICogICAgIGFjdGlvbi5uYW1lICA9ICdyZXNpemUnXG4gICAqICAgICBhY3Rpb24uZWRnZXMgPSB7IHRvcDogdHJ1ZSwgcmlnaHQ6IHRydWUgfVxuICAgKiAgIH1cbiAgICpcbiAgICogICByZXR1cm4gYWN0aW9uXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXR1cm5zIG9yIHNldHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvblxuICAgKiBwb2ludGVyRG93blxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgbnVsbH0gW2NoZWNrZXJdIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBwb2ludGVyIGV2ZW50LFxuICAgKiBkZWZhdWx0QWN0aW9uIHN0cmluZywgaW50ZXJhY3RhYmxlLCBlbGVtZW50IGFuZCBpbnRlcmFjdGlvbiBhcyBwYXJhbWV0ZXJzXG4gICAqIGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIG5hbWUgcHJvcGVydHkgJ2RyYWcnICdyZXNpemUnIG9yICdnZXN0dXJlJyBhbmRcbiAgICogb3B0aW9uYWxseSBhbiBgZWRnZXNgIG9iamVjdCB3aXRoIGJvb2xlYW4gJ3RvcCcsICdsZWZ0JywgJ2JvdHRvbScgYW5kIHJpZ2h0XG4gICAqIHByb3BzLlxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbiB8IEludGVyYWN0YWJsZX0gVGhlIGNoZWNrZXIgZnVuY3Rpb24gb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuYWN0aW9uQ2hlY2tlciA9IGFjdGlvbkNoZWNrZXJcblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHdoZXRoZXIgdGhlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGNoYW5nZWQgZGVwZW5kaW5nIG9uIHRoZVxuICAgKiBhY3Rpb24gdGhhdCB3b3VsZCBiZSBwZXJmb3JtZWQgaWYgdGhlIG1vdXNlIHdlcmUgcHJlc3NlZCBhbmQgZHJhZ2dlZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbbmV3VmFsdWVdXG4gICAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IFRoZSBjdXJyZW50IHNldHRpbmcgb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuc3R5bGVDdXJzb3IgPSBzdHlsZUN1cnNvclxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QWN0aW9uQ2hlY2tlciAoXG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLFxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICBzY29wZTogSW50ZXJhY3QuU2NvcGUsXG4pIHtcbiAgY29uc3QgcmVjdCA9IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQpXG4gIGNvbnN0IGJ1dHRvbnMgPSAoZXZlbnQgYXMgTW91c2VFdmVudCkuYnV0dG9ucyB8fCAoe1xuICAgIDA6IDEsXG4gICAgMTogNCxcbiAgICAzOiA4LFxuICAgIDQ6IDE2LFxuICB9KVsoZXZlbnQgYXMgTW91c2VFdmVudCkuYnV0dG9uIGFzIDAgfCAxIHwgMyB8IDRdXG4gIGNvbnN0IGFyZyA9IHtcbiAgICBhY3Rpb246IG51bGwsXG4gICAgaW50ZXJhY3RhYmxlLFxuICAgIGludGVyYWN0aW9uLFxuICAgIGVsZW1lbnQsXG4gICAgcmVjdCxcbiAgICBidXR0b25zLFxuICB9XG5cbiAgc2NvcGUuZmlyZSgnYXV0by1zdGFydDpjaGVjaycsIGFyZylcblxuICByZXR1cm4gYXJnLmFjdGlvblxufVxuXG5mdW5jdGlvbiBzdHlsZUN1cnNvciAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKTogYm9vbGVhblxuZnVuY3Rpb24gc3R5bGVDdXJzb3IgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU6IGJvb2xlYW4pOiB0eXBlb2YgdGhpc1xuZnVuY3Rpb24gc3R5bGVDdXJzb3IgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU/OiBib29sZWFuKSB7XG4gIGlmIChpcy5ib29sKG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5zdHlsZUN1cnNvciA9IG5ld1ZhbHVlXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgaWYgKG5ld1ZhbHVlID09PSBudWxsKSB7XG4gICAgZGVsZXRlIHRoaXMub3B0aW9ucy5zdHlsZUN1cnNvclxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMuc3R5bGVDdXJzb3Jcbn1cblxuZnVuY3Rpb24gYWN0aW9uQ2hlY2tlciAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBjaGVja2VyOiBhbnkpIHtcbiAgaWYgKGlzLmZ1bmMoY2hlY2tlcikpIHtcbiAgICB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlciA9IGNoZWNrZXJcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoY2hlY2tlciA9PT0gbnVsbCkge1xuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlclxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlclxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnYXV0by1zdGFydC9pbnRlcmFjdGFibGVNZXRob2RzJyxcbiAgaW5zdGFsbCxcbn1cbiIsImltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0IEludGVyYWN0YWJsZU1ldGhvZHMgZnJvbSAnLi9JbnRlcmFjdGFibGVNZXRob2RzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvaW50ZXJhY3QvaW5kZXgnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0U3RhdGljIHtcbiAgICBtYXhJbnRlcmFjdGlvbnM6IChuZXdWYWx1ZTogYW55KSA9PiBhbnlcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2NvcGUge1xuICAgIGF1dG9TdGFydDogQXV0b1N0YXJ0XG4gICAgbWF4SW50ZXJhY3Rpb25zOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICB9XG5cbiAgaW50ZXJmYWNlIFNpZ25hbEFyZ3Mge1xuICAgICdhdXRvU3RhcnQ6YmVmb3JlLXN0YXJ0JzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXVxuICAgICdhdXRvU3RhcnQ6cHJlcGFyZWQnOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9XG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBDaGVja1NpZ25hbEFyZ1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBCYXNlRGVmYXVsdHMge1xuICAgIGFjdGlvbkNoZWNrZXI/OiBhbnlcbiAgICBjdXJzb3JDaGVja2VyPzogYW55XG4gICAgc3R5bGVDdXJzb3I/OiBhbnlcbiAgfVxuXG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgbWFudWFsU3RhcnQ/OiBib29sZWFuXG4gICAgbWF4PzogbnVtYmVyXG4gICAgbWF4UGVyRWxlbWVudD86IG51bWJlclxuICAgIGFsbG93RnJvbT86IHN0cmluZyB8IEludGVyYWN0LkVsZW1lbnRcbiAgICBpZ25vcmVGcm9tPzogc3RyaW5nIHwgSW50ZXJhY3QuRWxlbWVudFxuICAgIGN1cnNvckNoZWNrZXI/OiBJbnRlcmFjdC5DdXJzb3JDaGVja2VyXG5cbiAgICAvLyBvbmx5IGFsbG93IGxlZnQgYnV0dG9uIGJ5IGRlZmF1bHRcbiAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9ucyNSZXR1cm5fdmFsdWVcbiAgICBtb3VzZUJ1dHRvbnM/OiAwIHwgMSB8IDIgfCA0IHwgMTZcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2hlY2tTaWduYWxBcmcge1xuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZVxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudFxuICBhY3Rpb246IEludGVyYWN0LkFjdGlvblByb3BzXG4gIGJ1dHRvbnM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TdGFydCB7XG4gIC8vIEFsbG93IHRoaXMgbWFueSBpbnRlcmFjdGlvbnMgdG8gaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gIG1heEludGVyYWN0aW9uczogbnVtYmVyXG4gIHdpdGhpbkludGVyYWN0aW9uTGltaXQ6IHR5cGVvZiB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0XG4gIGN1cnNvckVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlcmFjdCxcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKEludGVyYWN0YWJsZU1ldGhvZHMpXG5cbiAgZGVmYXVsdHMuYmFzZS5hY3Rpb25DaGVja2VyID0gbnVsbFxuICBkZWZhdWx0cy5iYXNlLnN0eWxlQ3Vyc29yID0gdHJ1ZVxuXG4gIHV0aWxzLmV4dGVuZChkZWZhdWx0cy5wZXJBY3Rpb24sIHtcbiAgICBtYW51YWxTdGFydDogZmFsc2UsXG4gICAgbWF4OiBJbmZpbml0eSxcbiAgICBtYXhQZXJFbGVtZW50OiAxLFxuICAgIGFsbG93RnJvbTogIG51bGwsXG4gICAgaWdub3JlRnJvbTogbnVsbCxcblxuICAgIC8vIG9ubHkgYWxsb3cgbGVmdCBidXR0b24gYnkgZGVmYXVsdFxuICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTW91c2VFdmVudC9idXR0b25zI1JldHVybl92YWx1ZVxuICAgIG1vdXNlQnV0dG9uczogMSxcbiAgfSlcblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGludGVyYWN0aW9ucyBhbGxvd2VkLiAgQnlcbiAgICogZGVmYXVsdCBvbmx5IDEgaW50ZXJhY3Rpb24gaXMgYWxsb3dlZCBhdCBhIHRpbWUgKGZvciBiYWNrd2FyZHNcbiAgICogY29tcGF0aWJpbGl0eSkuIFRvIGFsbG93IG11bHRpcGxlIGludGVyYWN0aW9ucyBvbiB0aGUgc2FtZSBJbnRlcmFjdGFibGVzIGFuZFxuICAgKiBlbGVtZW50cywgeW91IG5lZWQgdG8gZW5hYmxlIGl0IGluIHRoZSBkcmFnZ2FibGUsIHJlc2l6YWJsZSBhbmQgZ2VzdHVyYWJsZVxuICAgKiBgJ21heCdgIGFuZCBgJ21heFBlckVsZW1lbnQnYCBvcHRpb25zLlxuICAgKlxuICAgKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0Lm1heEludGVyYWN0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW25ld1ZhbHVlXSBBbnkgbnVtYmVyLiBuZXdWYWx1ZSA8PSAwIG1lYW5zIG5vIGludGVyYWN0aW9ucy5cbiAgICovXG4gIGludGVyYWN0Lm1heEludGVyYWN0aW9ucyA9IG5ld1ZhbHVlID0+IG1heEludGVyYWN0aW9ucyhuZXdWYWx1ZSwgc2NvcGUpXG5cbiAgc2NvcGUuYXV0b1N0YXJ0ID0ge1xuICAgIC8vIEFsbG93IHRoaXMgbWFueSBpbnRlcmFjdGlvbnMgdG8gaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gICAgbWF4SW50ZXJhY3Rpb25zOiBJbmZpbml0eSxcbiAgICB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0LFxuICAgIGN1cnNvckVsZW1lbnQ6IG51bGwsXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZU9uRG93biAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IH06IEludGVyYWN0LlNpZ25hbEFyZ3NbJ2ludGVyYWN0aW9uczpkb3duJ10sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBpZiAoaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSkgeyByZXR1cm4gfVxuXG4gIGNvbnN0IGFjdGlvbkluZm8gPSBnZXRBY3Rpb25JbmZvKGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHNjb3BlKVxuICBwcmVwYXJlKGludGVyYWN0aW9uLCBhY3Rpb25JbmZvLCBzY29wZSlcbn1cblxuZnVuY3Rpb24gcHJlcGFyZU9uTW92ZSAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IH06IEludGVyYWN0LlNpZ25hbEFyZ3NbJ2ludGVyYWN0aW9uczptb3ZlJ10sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBpZiAoaW50ZXJhY3Rpb24ucG9pbnRlclR5cGUgIT09ICdtb3VzZScgfHxcbiAgICAgIGludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24gfHxcbiAgICAgIGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHsgcmV0dXJuIH1cblxuICBjb25zdCBhY3Rpb25JbmZvID0gZ2V0QWN0aW9uSW5mbyhpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnQsIHNjb3BlKVxuICBwcmVwYXJlKGludGVyYWN0aW9uLCBhY3Rpb25JbmZvLCBzY29wZSlcbn1cblxuZnVuY3Rpb24gc3RhcnRPbk1vdmUgKGFyZzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGFyZ1xuXG4gIGlmICghaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93biB8fFxuICAgICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSB8fFxuICAgICAgIWludGVyYWN0aW9uLnBvaW50ZXJXYXNNb3ZlZCB8fFxuICAgICAgIWludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNjb3BlLmZpcmUoJ2F1dG9TdGFydDpiZWZvcmUtc3RhcnQnLCBhcmcpXG5cbiAgY29uc3QgeyBpbnRlcmFjdGFibGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lXG5cbiAgaWYgKGFjdGlvbk5hbWUgJiYgaW50ZXJhY3RhYmxlKSB7XG4gICAgLy8gY2hlY2sgbWFudWFsU3RhcnQgYW5kIGludGVyYWN0aW9uIGxpbWl0XG4gICAgaWYgKGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbk5hbWVdLm1hbnVhbFN0YXJ0IHx8XG4gICAgICAgICF3aXRoaW5JbnRlcmFjdGlvbkxpbWl0KGludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudCwgaW50ZXJhY3Rpb24ucHJlcGFyZWQsIHNjb3BlKSkge1xuICAgICAgaW50ZXJhY3Rpb24uc3RvcCgpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaW50ZXJhY3Rpb24uc3RhcnQoaW50ZXJhY3Rpb24ucHJlcGFyZWQsIGludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudClcbiAgICAgIHNldEludGVyYWN0aW9uQ3Vyc29yKGludGVyYWN0aW9uLCBzY29wZSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJDdXJzb3JPblN0b3AgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3RhYmxlIH0gPSBpbnRlcmFjdGlvblxuXG4gIGlmIChpbnRlcmFjdGFibGUgJiYgaW50ZXJhY3RhYmxlLm9wdGlvbnMuc3R5bGVDdXJzb3IpIHtcbiAgICBzZXRDdXJzb3IoaW50ZXJhY3Rpb24uZWxlbWVudCwgJycsIHNjb3BlKVxuICB9XG59XG5cbi8vIENoZWNrIGlmIHRoZSBjdXJyZW50IGludGVyYWN0YWJsZSBzdXBwb3J0cyB0aGUgYWN0aW9uLlxuLy8gSWYgc28sIHJldHVybiB0aGUgdmFsaWRhdGVkIGFjdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbFxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpb248VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+IChcbiAgYWN0aW9uOiBJbnRlcmFjdC5BY3Rpb25Qcm9wczxUPixcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsXG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGlmIChpbnRlcmFjdGFibGUudGVzdElnbm9yZUFsbG93KGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbi5uYW1lXSwgZWxlbWVudCwgZXZlbnRUYXJnZXQpICYmXG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb24ubmFtZV0uZW5hYmxlZCAmJlxuICAgICAgd2l0aGluSW50ZXJhY3Rpb25MaW1pdChpbnRlcmFjdGFibGUsIGVsZW1lbnQsIGFjdGlvbiwgc2NvcGUpKSB7XG4gICAgcmV0dXJuIGFjdGlvblxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNYXRjaGVzIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gIG1hdGNoZXM6IEludGVyYWN0LkludGVyYWN0YWJsZVtdLFxuICBtYXRjaEVsZW1lbnRzOiBJbnRlcmFjdC5FbGVtZW50W10sXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtYXRjaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2ldXG4gICAgY29uc3QgbWF0Y2hFbGVtZW50ID0gbWF0Y2hFbGVtZW50c1tpXVxuICAgIGNvbnN0IG1hdGNoQWN0aW9uID0gbWF0Y2guZ2V0QWN0aW9uKHBvaW50ZXIsIGV2ZW50LCBpbnRlcmFjdGlvbiwgbWF0Y2hFbGVtZW50KVxuXG4gICAgaWYgKCFtYXRjaEFjdGlvbikgeyBjb250aW51ZSB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSB2YWxpZGF0ZUFjdGlvbihcbiAgICAgIG1hdGNoQWN0aW9uLFxuICAgICAgbWF0Y2gsXG4gICAgICBtYXRjaEVsZW1lbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHNjb3BlKVxuXG4gICAgaWYgKGFjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBpbnRlcmFjdGFibGU6IG1hdGNoLFxuICAgICAgICBlbGVtZW50OiBtYXRjaEVsZW1lbnQsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBudWxsLCBpbnRlcmFjdGFibGU6IG51bGwsIGVsZW1lbnQ6IG51bGwgfVxufVxuXG5mdW5jdGlvbiBnZXRBY3Rpb25JbmZvIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGxldCBtYXRjaGVzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVbXSA9IFtdXG4gIGxldCBtYXRjaEVsZW1lbnRzOiBJbnRlcmFjdC5FbGVtZW50W10gPSBbXVxuXG4gIGxldCBlbGVtZW50ID0gZXZlbnRUYXJnZXQgYXMgSW50ZXJhY3QuRWxlbWVudFxuXG4gIGZ1bmN0aW9uIHB1c2hNYXRjaGVzIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSkge1xuICAgIG1hdGNoZXMucHVzaChpbnRlcmFjdGFibGUpXG4gICAgbWF0Y2hFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gIH1cblxuICB3aGlsZSAodXRpbHMuaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIG1hdGNoZXMgPSBbXVxuICAgIG1hdGNoRWxlbWVudHMgPSBbXVxuXG4gICAgc2NvcGUuaW50ZXJhY3RhYmxlcy5mb3JFYWNoTWF0Y2goZWxlbWVudCwgcHVzaE1hdGNoZXMpXG5cbiAgICBjb25zdCBhY3Rpb25JbmZvID0gdmFsaWRhdGVNYXRjaGVzKGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgbWF0Y2hlcywgbWF0Y2hFbGVtZW50cywgZXZlbnRUYXJnZXQsIHNjb3BlKVxuXG4gICAgaWYgKGFjdGlvbkluZm8uYWN0aW9uICYmXG4gICAgICAhYWN0aW9uSW5mby5pbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb25JbmZvLmFjdGlvbi5uYW1lXS5tYW51YWxTdGFydCkge1xuICAgICAgcmV0dXJuIGFjdGlvbkluZm9cbiAgICB9XG5cbiAgICBlbGVtZW50ID0gdXRpbHMuZG9tLnBhcmVudE5vZGUoZWxlbWVudCkgYXMgSW50ZXJhY3QuRWxlbWVudFxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBudWxsLCBpbnRlcmFjdGFibGU6IG51bGwsIGVsZW1lbnQ6IG51bGwgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICB7IGFjdGlvbiwgaW50ZXJhY3RhYmxlLCBlbGVtZW50IH06IHtcbiAgICBhY3Rpb246IEludGVyYWN0LkFjdGlvblByb3BzXG4gICAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50XG4gIH0sXG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZSxcbikge1xuICBhY3Rpb24gPSBhY3Rpb24gfHwgeyBuYW1lOiBudWxsIH1cblxuICBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUgPSBpbnRlcmFjdGFibGVcbiAgaW50ZXJhY3Rpb24uZWxlbWVudCA9IGVsZW1lbnRcbiAgdXRpbHMuY29weUFjdGlvbihpbnRlcmFjdGlvbi5wcmVwYXJlZCwgYWN0aW9uKVxuXG4gIGludGVyYWN0aW9uLnJlY3QgPSBpbnRlcmFjdGFibGUgJiYgYWN0aW9uLm5hbWVcbiAgICA/IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQpXG4gICAgOiBudWxsXG5cbiAgc2V0SW50ZXJhY3Rpb25DdXJzb3IoaW50ZXJhY3Rpb24sIHNjb3BlKVxuXG4gIHNjb3BlLmZpcmUoJ2F1dG9TdGFydDpwcmVwYXJlZCcsIHsgaW50ZXJhY3Rpb24gfSlcbn1cblxuZnVuY3Rpb24gd2l0aGluSW50ZXJhY3Rpb25MaW1pdDxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKFxuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCxcbiAgYWN0aW9uOiBJbnRlcmFjdC5BY3Rpb25Qcm9wczxUPixcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1xuICBjb25zdCBtYXhBY3Rpb25zID0gb3B0aW9uc1thY3Rpb24ubmFtZV0ubWF4XG4gIGNvbnN0IG1heFBlckVsZW1lbnQgPSBvcHRpb25zW2FjdGlvbi5uYW1lXS5tYXhQZXJFbGVtZW50XG4gIGNvbnN0IGF1dG9TdGFydE1heCA9IHNjb3BlLmF1dG9TdGFydC5tYXhJbnRlcmFjdGlvbnNcbiAgbGV0IGFjdGl2ZUludGVyYWN0aW9ucyA9IDBcbiAgbGV0IGludGVyYWN0YWJsZUNvdW50ID0gMFxuICBsZXQgZWxlbWVudENvdW50ID0gMFxuXG4gIC8vIG5vIGFjdGlvbnMgaWYgYW55IG9mIHRoZXNlIHZhbHVlcyA9PSAwXG4gIGlmICghKG1heEFjdGlvbnMgJiYgbWF4UGVyRWxlbWVudCAmJiBhdXRvU3RhcnRNYXgpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgIGNvbnN0IG90aGVyQWN0aW9uID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuXG4gICAgaWYgKCFpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpKSB7IGNvbnRpbnVlIH1cblxuICAgIGFjdGl2ZUludGVyYWN0aW9ucysrXG5cbiAgICBpZiAoYWN0aXZlSW50ZXJhY3Rpb25zID49IGF1dG9TdGFydE1heCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSAhPT0gaW50ZXJhY3RhYmxlKSB7IGNvbnRpbnVlIH1cblxuICAgIGludGVyYWN0YWJsZUNvdW50ICs9IG90aGVyQWN0aW9uID09PSBhY3Rpb24ubmFtZSA/IDEgOiAwXG5cbiAgICBpZiAoaW50ZXJhY3RhYmxlQ291bnQgPj0gbWF4QWN0aW9ucykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLmVsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnRDb3VudCsrXG5cbiAgICAgIGlmIChvdGhlckFjdGlvbiA9PT0gYWN0aW9uLm5hbWUgJiYgZWxlbWVudENvdW50ID49IG1heFBlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF1dG9TdGFydE1heCA+IDBcbn1cblxuZnVuY3Rpb24gbWF4SW50ZXJhY3Rpb25zIChuZXdWYWx1ZTogYW55LCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgaWYgKHV0aWxzLmlzLm51bWJlcihuZXdWYWx1ZSkpIHtcbiAgICBzY29wZS5hdXRvU3RhcnQubWF4SW50ZXJhY3Rpb25zID0gbmV3VmFsdWVcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICByZXR1cm4gc2NvcGUuYXV0b1N0YXJ0Lm1heEludGVyYWN0aW9uc1xufVxuXG5mdW5jdGlvbiBzZXRDdXJzb3IgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIGN1cnNvcjogc3RyaW5nLCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgY29uc3QgeyBjdXJzb3JFbGVtZW50OiBwcmV2Q3Vyc29yRWxlbWVudCB9ID0gc2NvcGUuYXV0b1N0YXJ0XG5cbiAgaWYgKHByZXZDdXJzb3JFbGVtZW50ICYmIHByZXZDdXJzb3JFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgcHJldkN1cnNvckVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJydcbiAgfVxuXG4gIGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3Vyc29yID0gY3Vyc29yXG4gIGVsZW1lbnQuc3R5bGUuY3Vyc29yID0gY3Vyc29yXG4gIHNjb3BlLmF1dG9TdGFydC5jdXJzb3JFbGVtZW50ID0gY3Vyc29yID8gZWxlbWVudCA6IG51bGxcbn1cblxuZnVuY3Rpb24gc2V0SW50ZXJhY3Rpb25DdXJzb3I8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+IChpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb248VD4sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBjb25zdCB7IGludGVyYWN0YWJsZSwgZWxlbWVudCwgcHJlcGFyZWQgfSA9IGludGVyYWN0aW9uXG5cbiAgaWYgKCEoaW50ZXJhY3Rpb24ucG9pbnRlclR5cGUgPT09ICdtb3VzZScgJiYgaW50ZXJhY3RhYmxlICYmIGludGVyYWN0YWJsZS5vcHRpb25zLnN0eWxlQ3Vyc29yKSkge1xuICAgIC8vIGNsZWFyIHByZXZpb3VzIHRhcmdldCBlbGVtZW50IGN1cnNvclxuICAgIGlmIChzY29wZS5hdXRvU3RhcnQuY3Vyc29yRWxlbWVudCkge1xuICAgICAgc2V0Q3Vyc29yKHNjb3BlLmF1dG9TdGFydC5jdXJzb3JFbGVtZW50LCAnJywgc2NvcGUpXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgY3Vyc29yID0gJydcblxuICBpZiAocHJlcGFyZWQubmFtZSkge1xuICAgIGNvbnN0IGN1cnNvckNoZWNrZXI6IEludGVyYWN0LkN1cnNvckNoZWNrZXIgPSBpbnRlcmFjdGFibGUub3B0aW9uc1twcmVwYXJlZC5uYW1lXS5jdXJzb3JDaGVja2VyXG5cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhjdXJzb3JDaGVja2VyKSkge1xuICAgICAgY3Vyc29yID0gY3Vyc29yQ2hlY2tlcihwcmVwYXJlZCwgaW50ZXJhY3RhYmxlLCBlbGVtZW50LCBpbnRlcmFjdGlvbi5faW50ZXJhY3RpbmcpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY3Vyc29yID0gc2NvcGUuYWN0aW9ucy5tYXBbcHJlcGFyZWQubmFtZV0uZ2V0Q3Vyc29yKHByZXBhcmVkKVxuICAgIH1cbiAgfVxuXG4gIHNldEN1cnNvcihpbnRlcmFjdGlvbi5lbGVtZW50LCBjdXJzb3IgfHwgJycsIHNjb3BlKVxufVxuXG5jb25zdCBhdXRvU3RhcnQ6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0L2Jhc2UnLFxuICBiZWZvcmU6IFsnYWN0aW9ucycsICdhY3Rpb25zL2RyYWcnLCAnYWN0aW9ucy9yZXNpemUnLCAnYWN0aW9ucy9nZXN0dXJlJ10sXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6ZG93bic6IHByZXBhcmVPbkRvd24sXG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogKGFyZywgc2NvcGUpID0+IHtcbiAgICAgIHByZXBhcmVPbk1vdmUoYXJnLCBzY29wZSlcbiAgICAgIHN0YXJ0T25Nb3ZlKGFyZywgc2NvcGUpXG4gICAgfSxcbiAgICAnaW50ZXJhY3Rpb25zOnN0b3AnOiBjbGVhckN1cnNvck9uU3RvcCxcbiAgfSxcbiAgbWF4SW50ZXJhY3Rpb25zLFxuICB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0LFxuICB2YWxpZGF0ZUFjdGlvbixcbn0gYXMgSW50ZXJhY3QuUGx1Z2luXG5cbmV4cG9ydCBkZWZhdWx0IGF1dG9TdGFydFxuIiwiaW1wb3J0IHsgcGFyZW50Tm9kZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5pbXBvcnQgYXV0b1N0YXJ0IGZyb20gJy4vYmFzZSdcblxuZnVuY3Rpb24gYmVmb3JlU3RhcnQgKHsgaW50ZXJhY3Rpb24sIGV2ZW50VGFyZ2V0LCBkeCwgZHkgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICAvLyBjaGVjayBpZiBhIGRyYWcgaXMgaW4gdGhlIGNvcnJlY3QgYXhpc1xuICBjb25zdCBhYnNYID0gTWF0aC5hYnMoZHgpXG4gIGNvbnN0IGFic1kgPSBNYXRoLmFicyhkeSlcbiAgY29uc3QgdGFyZ2V0T3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zLmRyYWdcbiAgY29uc3Qgc3RhcnRBeGlzID0gdGFyZ2V0T3B0aW9ucy5zdGFydEF4aXNcbiAgY29uc3QgY3VycmVudEF4aXMgPSAoYWJzWCA+IGFic1kgPyAneCcgOiBhYnNYIDwgYWJzWSA/ICd5JyA6ICd4eScpXG5cbiAgaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpcyA9IHRhcmdldE9wdGlvbnMubG9ja0F4aXMgPT09ICdzdGFydCdcbiAgICA/IGN1cnJlbnRBeGlzWzBdICBhcyAneCcgfCAneScgLy8gYWx3YXlzIGxvY2sgdG8gb25lIGF4aXMgZXZlbiBpZiBjdXJyZW50QXhpcyA9PT0gJ3h5J1xuICAgIDogdGFyZ2V0T3B0aW9ucy5sb2NrQXhpc1xuXG4gIC8vIGlmIHRoZSBtb3ZlbWVudCBpc24ndCBpbiB0aGUgc3RhcnRBeGlzIG9mIHRoZSBpbnRlcmFjdGFibGVcbiAgaWYgKGN1cnJlbnRBeGlzICE9PSAneHknICYmIHN0YXJ0QXhpcyAhPT0gJ3h5JyAmJiBzdGFydEF4aXMgIT09IGN1cnJlbnRBeGlzKSB7XG4gICAgLy8gY2FuY2VsIHRoZSBwcmVwYXJlZCBhY3Rpb25cbiAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gbnVsbFxuXG4gICAgLy8gdGhlbiB0cnkgdG8gZ2V0IGEgZHJhZyBmcm9tIGFub3RoZXIgaW5lcmFjdGFibGVcbiAgICBsZXQgZWxlbWVudCA9IGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnRcblxuICAgIGNvbnN0IGdldERyYWdnYWJsZSA9IGZ1bmN0aW9uIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSk6IEludGVyYWN0LkludGVyYWN0YWJsZSB8IHZvaWQge1xuICAgICAgaWYgKGludGVyYWN0YWJsZSA9PT0gaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlKSB7IHJldHVybiB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5kcmFnXG5cbiAgICAgIGlmICghb3B0aW9ucy5tYW51YWxTdGFydCAmJlxuICAgICAgICAgIGludGVyYWN0YWJsZS50ZXN0SWdub3JlQWxsb3cob3B0aW9ucywgZWxlbWVudCwgZXZlbnRUYXJnZXQpKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGludGVyYWN0YWJsZS5nZXRBY3Rpb24oXG4gICAgICAgICAgaW50ZXJhY3Rpb24uZG93blBvaW50ZXIsIGludGVyYWN0aW9uLmRvd25FdmVudCwgaW50ZXJhY3Rpb24sIGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKGFjdGlvbiAmJlxuICAgICAgICAgICAgYWN0aW9uLm5hbWUgPT09ICdkcmFnJyAmJlxuICAgICAgICAgICAgY2hlY2tTdGFydEF4aXMoY3VycmVudEF4aXMsIGludGVyYWN0YWJsZSkgJiZcbiAgICAgICAgICAgIGF1dG9TdGFydC52YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgZXZlbnRUYXJnZXQsIHNjb3BlKSkge1xuICAgICAgICAgIHJldHVybiBpbnRlcmFjdGFibGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoZWNrIGFsbCBpbnRlcmFjdGFibGVzXG4gICAgd2hpbGUgKGlzLmVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMuZm9yRWFjaE1hdGNoKGVsZW1lbnQsIGdldERyYWdnYWJsZSlcblxuICAgICAgaWYgKGludGVyYWN0YWJsZSkge1xuICAgICAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gJ2RyYWcnXG4gICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICAgICAgICBpbnRlcmFjdGlvbi5lbGVtZW50ID0gZWxlbWVudFxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50ID0gcGFyZW50Tm9kZShlbGVtZW50KSBhcyBJbnRlcmFjdC5FbGVtZW50XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrU3RhcnRBeGlzIChzdGFydEF4aXM6IHN0cmluZywgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUpIHtcbiAgaWYgKCFpbnRlcmFjdGFibGUpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCB0aGlzQXhpcyA9IGludGVyYWN0YWJsZS5vcHRpb25zLmRyYWcuc3RhcnRBeGlzXG5cbiAgcmV0dXJuIChzdGFydEF4aXMgPT09ICd4eScgfHwgdGhpc0F4aXMgPT09ICd4eScgfHwgdGhpc0F4aXMgPT09IHN0YXJ0QXhpcylcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2F1dG8tc3RhcnQvZHJhZ0F4aXMnLFxuICBsaXN0ZW5lcnM6IHsgJ2F1dG9TdGFydDpiZWZvcmUtc3RhcnQnOiBiZWZvcmVTdGFydCB9LFxufVxuIiwiaW1wb3J0IGJhc2VQbHVnaW4gZnJvbSAnLi9iYXNlJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgUGVyQWN0aW9uRGVmYXVsdHMge1xuICAgIGhvbGQ/OiBudW1iZXJcbiAgICBkZWxheT86IG51bWJlclxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgYXV0b1N0YXJ0SG9sZFRpbWVyPzogYW55XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKGJhc2VQbHVnaW4pXG5cbiAgZGVmYXVsdHMucGVyQWN0aW9uLmhvbGQgPSAwXG4gIGRlZmF1bHRzLnBlckFjdGlvbi5kZWxheSA9IDBcbn1cblxuZnVuY3Rpb24gZ2V0SG9sZER1cmF0aW9uIChpbnRlcmFjdGlvbikge1xuICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQgJiYgaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuXG4gIGlmICghYWN0aW9uTmFtZSkgeyByZXR1cm4gbnVsbCB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zXG5cbiAgcmV0dXJuIG9wdGlvbnNbYWN0aW9uTmFtZV0uaG9sZCB8fCBvcHRpb25zW2FjdGlvbk5hbWVdLmRlbGF5XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0L2hvbGQnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TdGFydEhvbGRUaW1lciA9IG51bGxcbiAgICB9LFxuXG4gICAgJ2F1dG9TdGFydDpwcmVwYXJlZCc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGhvbGQgPSBnZXRIb2xkRHVyYXRpb24oaW50ZXJhY3Rpb24pXG5cbiAgICAgIGlmIChob2xkID4gMCkge1xuICAgICAgICBpbnRlcmFjdGlvbi5hdXRvU3RhcnRIb2xkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5zdGFydChpbnRlcmFjdGlvbi5wcmVwYXJlZCwgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLCBpbnRlcmFjdGlvbi5lbGVtZW50KVxuICAgICAgICB9LCBob2xkKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOm1vdmUnOiAoeyBpbnRlcmFjdGlvbiwgZHVwbGljYXRlIH0pID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyV2FzTW92ZWQgJiYgIWR1cGxpY2F0ZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaW50ZXJhY3Rpb24uYXV0b1N0YXJ0SG9sZFRpbWVyKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBwcmV2ZW50IHJlZ3VsYXIgZG93bi0+bW92ZSBhdXRvU3RhcnRcbiAgICAnYXV0b1N0YXJ0OmJlZm9yZS1zdGFydCc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGhvbGQgPSBnZXRIb2xkRHVyYXRpb24oaW50ZXJhY3Rpb24pXG5cbiAgICAgIGlmIChob2xkID4gMCkge1xuICAgICAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gbnVsbFxuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGdldEhvbGREdXJhdGlvbixcbn1cbiIsImltcG9ydCBhdXRvU3RhcnQgZnJvbSAnLi9iYXNlJ1xuaW1wb3J0IGRyYWdBeGlzIGZyb20gJy4vZHJhZ0F4aXMnXG5pbXBvcnQgaG9sZCBmcm9tICcuL2hvbGQnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0JyxcbiAgaW5zdGFsbCAoc2NvcGUpIHtcbiAgICBzY29wZS51c2VQbHVnaW4oYXV0b1N0YXJ0KVxuICAgIHNjb3BlLnVzZVBsdWdpbihob2xkKVxuICAgIHNjb3BlLnVzZVBsdWdpbihkcmFnQXhpcylcbiAgfSxcbn1cblxuZXhwb3J0IHtcbiAgYXV0b1N0YXJ0LFxuICBob2xkLFxuICBkcmFnQXhpcyxcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbi8qIGdsb2JhbCBwcm9jZXNzICovXG5pbXBvcnQgZG9tT2JqZWN0cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21PYmplY3RzJ1xuaW1wb3J0IHsgcGFyZW50Tm9kZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcbmltcG9ydCB3aW4gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvd2luZG93J1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2NvcGUge1xuICAgIGxvZ2dlcjogTG9nZ2VyXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEJhc2VEZWZhdWx0cyB7XG4gICAgZGV2VG9vbHM/OiBEZXZUb29sc09wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0YWJsZSB7XG4gICAgZGV2VG9vbHM/OiBJbnRlcmFjdC5PcHRpb25NZXRob2Q8RGV2VG9vbHNPcHRpb25zPlxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2VG9vbHNPcHRpb25zIHtcbiAgaWdub3JlOiB7IFtQIGluIGtleW9mIHR5cGVvZiBDaGVja05hbWVdPzogYm9vbGVhbiB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgd2FybjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG4gIGVycm9yOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbiAgbG9nOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGVjayB7XG4gIG5hbWU6IENoZWNrTmFtZVxuICB0ZXh0OiBzdHJpbmdcbiAgcGVyZm9ybTogKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikgPT4gYm9vbGVhblxuICBnZXRJbmZvOiAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uKSA9PiBhbnlbXVxufVxuXG5lbnVtIENoZWNrTmFtZSB7XG4gIHRvdWNoQWN0aW9uID0gJ3RvdWNoQWN0aW9uJyxcbiAgYm94U2l6aW5nID0gJ2JveFNpemluZycsXG4gIG5vTGlzdGVuZXJzID0gJ25vTGlzdGVuZXJzJyxcbn1cblxuY29uc3QgcHJlZml4ICA9ICdbaW50ZXJhY3QuanNdICdcbmNvbnN0IGxpbmtzID0ge1xuICB0b3VjaEFjdGlvbjogJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy90b3VjaC1hY3Rpb24nLFxuICBib3hTaXppbmc6ICdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYm94LXNpemluZycsXG59XG5cbmNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbidcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5mdW5jdGlvbiBpbnN0YWxsIChzY29wZTogSW50ZXJhY3QuU2NvcGUsIHsgbG9nZ2VyIH06IHsgbG9nZ2VyPzogTG9nZ2VyIH0gPSB7fSkge1xuICBjb25zdCB7XG4gICAgSW50ZXJhY3RhYmxlLFxuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS5sb2dnZXIgPSBsb2dnZXIgfHwgY29uc29sZVxuXG4gIGRlZmF1bHRzLmJhc2UuZGV2VG9vbHMgPSB7XG4gICAgaWdub3JlOiB7fSxcbiAgfVxuXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuZGV2VG9vbHMgPSBmdW5jdGlvbiAob3B0aW9ucz86IG9iamVjdCkge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBleHRlbmQodGhpcy5vcHRpb25zLmRldlRvb2xzLCBvcHRpb25zKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRldlRvb2xzXG4gIH1cbn1cblxuY29uc3QgY2hlY2tzOiBDaGVja1tdID0gW1xuICB7XG4gICAgbmFtZTogQ2hlY2tOYW1lLnRvdWNoQWN0aW9uLFxuICAgIHBlcmZvcm0gKHsgZWxlbWVudCB9KSB7XG4gICAgICByZXR1cm4gIXBhcmVudEhhc1N0eWxlKGVsZW1lbnQsICd0b3VjaEFjdGlvbicsIC9wYW4tfHBpbmNofG5vbmUvKVxuICAgIH0sXG4gICAgZ2V0SW5mbyAoeyBlbGVtZW50IH0pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGxpbmtzLnRvdWNoQWN0aW9uLFxuICAgICAgXVxuICAgIH0sXG4gICAgdGV4dDogJ0NvbnNpZGVyIGFkZGluZyBDU1MgXCJ0b3VjaC1hY3Rpb246IG5vbmVcIiB0byB0aGlzIGVsZW1lbnRcXG4nLFxuICB9LFxuXG4gIHtcbiAgICBuYW1lOiBDaGVja05hbWUuYm94U2l6aW5nLFxuICAgIHBlcmZvcm0gKGludGVyYWN0aW9uKSB7XG4gICAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGludGVyYWN0aW9uXG5cbiAgICAgIHJldHVybiBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID09PSAncmVzaXplJyAmJlxuICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAmJlxuICAgICAgICAhaGFzU3R5bGUoZWxlbWVudCwgJ2JveFNpemluZycsIC9ib3JkZXItYm94LylcbiAgICB9LFxuICAgIHRleHQ6ICdDb25zaWRlciBhZGRpbmcgQ1NTIFwiYm94LXNpemluZzogYm9yZGVyLWJveFwiIHRvIHRoaXMgcmVzaXphYmxlIGVsZW1lbnQnLFxuICAgIGdldEluZm8gKHsgZWxlbWVudCB9KSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBlbGVtZW50LFxuICAgICAgICBsaW5rcy5ib3hTaXppbmcsXG4gICAgICBdXG4gICAgfSxcbiAgfSxcblxuICB7XG4gICAgbmFtZTogQ2hlY2tOYW1lLm5vTGlzdGVuZXJzLFxuICAgIHBlcmZvcm0gKGludGVyYWN0aW9uKSB7XG4gICAgICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuICAgICAgY29uc3QgbW92ZUxpc3RlbmVycyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5ldmVudHMudHlwZXNbYCR7YWN0aW9uTmFtZX1tb3ZlYF0gfHwgW11cblxuICAgICAgcmV0dXJuICFtb3ZlTGlzdGVuZXJzLmxlbmd0aFxuICAgIH0sXG4gICAgZ2V0SW5mbyAoaW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUsXG4gICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSxcbiAgICAgIF1cbiAgICB9LFxuICAgIHRleHQ6ICdUaGVyZSBhcmUgbm8gbGlzdGVuZXJzIHNldCBmb3IgdGhpcyBhY3Rpb24nLFxuICB9LFxuXVxuXG5mdW5jdGlvbiBoYXNTdHlsZSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIHByb3A6IGtleW9mIENTU1N0eWxlRGVjbGFyYXRpb24sIHN0eWxlUmU6IFJlZ0V4cCkge1xuICByZXR1cm4gc3R5bGVSZS50ZXN0KGVsZW1lbnQuc3R5bGVbcHJvcF0gfHwgd2luLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW3Byb3BdKVxufVxuXG5mdW5jdGlvbiBwYXJlbnRIYXNTdHlsZSAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCwgcHJvcDoga2V5b2YgQ1NTU3R5bGVEZWNsYXJhdGlvbiwgc3R5bGVSZTogUmVnRXhwKSB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50IGFzIEhUTUxFbGVtZW50XG5cbiAgd2hpbGUgKGlzLmVsZW1lbnQocGFyZW50KSkge1xuICAgIGlmIChoYXNTdHlsZShwYXJlbnQsIHByb3AsIHN0eWxlUmUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudE5vZGUocGFyZW50KSBhcyBIVE1MRWxlbWVudFxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IGlkID0gJ2Rldi10b29scydcbmNvbnN0IGRlZmF1bHRFeHBvcnQ6IEludGVyYWN0LlBsdWdpbiA9IGlzUHJvZHVjdGlvblxuICA/IHsgaWQsIGluc3RhbGw6ICgpID0+IHt9IH1cbiAgOiB7XG4gICAgaWQsXG4gICAgaW5zdGFsbCxcbiAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLXN0YXJ0JzogKHsgaW50ZXJhY3Rpb24gfSwgc2NvcGUpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiBjaGVja3MpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlICYmIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zXG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKG9wdGlvbnMgJiYgb3B0aW9ucy5kZXZUb29scyAmJiBvcHRpb25zLmRldlRvb2xzLmlnbm9yZVtjaGVjay5uYW1lXSkgJiZcbiAgICAgICAgICAgIGNoZWNrLnBlcmZvcm0oaW50ZXJhY3Rpb24pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzY29wZS5sb2dnZXIud2FybihwcmVmaXggKyBjaGVjay50ZXh0LCAuLi5jaGVjay5nZXRJbmZvKGludGVyYWN0aW9uKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBjaGVja3MsXG4gICAgQ2hlY2tOYW1lLFxuICAgIGxpbmtzLFxuICAgIHByZWZpeCxcbiAgfVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0XG4iLCJpbXBvcnQgY2xvbmUgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvY2xvbmUnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXIsIE1vZGlmaWVyQXJnLCBNb2RpZmllclN0YXRlIH0gZnJvbSAnLi9iYXNlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWNhdGlvblJlc3VsdCB7XG4gIGRlbHRhOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0RGVsdGE6IEludGVyYWN0LlJlY3RcbiAgY29vcmRzOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICBldmVudFByb3BzOiBhbnlbXVxuICBjaGFuZ2VkOiBib29sZWFuXG59XG5cbmludGVyZmFjZSBNZXRob2RBcmcge1xuICBwaGFzZTogSW50ZXJhY3QuRXZlbnRQaGFzZVxuICBwYWdlQ29vcmRzPzogSW50ZXJhY3QuUG9pbnRcbiAgcmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHByZUVuZD86IGJvb2xlYW5cbiAgc2tpcE1vZGlmaWVycz86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2RpZmljYXRpb24ge1xuICBzdGF0ZXM6IE1vZGlmaWVyU3RhdGVbXSA9IFtdXG4gIHN0YXJ0T2Zmc2V0OiBJbnRlcmFjdC5SZWN0ID0geyBsZWZ0OiAwLCByaWdodDogMCwgdG9wOiAwLCBib3R0b206IDAgfVxuICBzdGFydERlbHRhOiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgcmVzdWx0PzogTW9kaWZpY2F0aW9uUmVzdWx0ID0gbnVsbFxuICBlbmRSZXN1bHQ/OiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgZWRnZXM6IEludGVyYWN0LkVkZ2VPcHRpb25zXG5cbiAgY29uc3RydWN0b3IgKHJlYWRvbmx5IGludGVyYWN0aW9uOiBSZWFkb25seTxJbnRlcmFjdC5JbnRlcmFjdGlvbj4pIHtcbiAgICB0aGlzLnJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpXG4gIH1cblxuICBzdGFydCAoXG4gICAgeyBwaGFzZSB9OiBNZXRob2RBcmcsXG4gICAgcGFnZUNvb3JkczogSW50ZXJhY3QuUG9pbnQsXG4gICkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCBtb2RpZmllckxpc3QgPSBnZXRNb2RpZmllckxpc3QoaW50ZXJhY3Rpb24pXG4gICAgdGhpcy5wcmVwYXJlU3RhdGVzKG1vZGlmaWVyTGlzdClcblxuICAgIHRoaXMuZWRnZXMgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLmVkZ2VzKVxuICAgIHRoaXMuc3RhcnRPZmZzZXQgPSBnZXRSZWN0T2Zmc2V0KGludGVyYWN0aW9uLnJlY3QsIHBhZ2VDb29yZHMpXG4gICAgdGhpcy5zdGFydERlbHRhID0geyB4OiAwLCB5OiAwIH1cblxuICAgIGNvbnN0IGFyZzogTWV0aG9kQXJnID0ge1xuICAgICAgcGhhc2UsXG4gICAgICBwYWdlQ29vcmRzLFxuICAgICAgcHJlRW5kOiBmYWxzZSxcbiAgICB9XG5cbiAgICB0aGlzLnJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpXG4gICAgdGhpcy5zdGFydEFsbChhcmcpXG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdCA9IHRoaXMuc2V0QWxsKGFyZylcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZpbGxBcmcgKGFyZzogUGFydGlhbDxNb2RpZmllckFyZz4pIHtcbiAgICBjb25zdCB7IGludGVyYWN0aW9uIH0gPSB0aGlzXG5cbiAgICBhcmcuaW50ZXJhY3Rpb24gPSBpbnRlcmFjdGlvblxuICAgIGFyZy5pbnRlcmFjdGFibGUgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGVcbiAgICBhcmcuZWxlbWVudCA9IGludGVyYWN0aW9uLmVsZW1lbnRcbiAgICBhcmcucmVjdCA9IGFyZy5yZWN0IHx8IGludGVyYWN0aW9uLnJlY3RcbiAgICBhcmcuZWRnZXMgPSB0aGlzLmVkZ2VzXG4gICAgYXJnLnN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldFxuICB9XG5cbiAgc3RhcnRBbGwgKGFyZzogTWV0aG9kQXJnICYgUGFydGlhbDxNb2RpZmllckFyZz4pIHtcbiAgICB0aGlzLmZpbGxBcmcoYXJnKVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgaWYgKHN0YXRlLm1ldGhvZHMuc3RhcnQpIHtcbiAgICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgICAgc3RhdGUubWV0aG9kcy5zdGFydChhcmcgYXMgTW9kaWZpZXJBcmcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QWxsIChhcmc6IE1ldGhvZEFyZyAmIFBhcnRpYWw8TW9kaWZpZXJBcmc+KTogTW9kaWZpY2F0aW9uUmVzdWx0IHtcbiAgICB0aGlzLmZpbGxBcmcoYXJnKVxuXG4gICAgY29uc3Qge1xuICAgICAgcGhhc2UsXG4gICAgICBwcmVFbmQsXG4gICAgICBza2lwTW9kaWZpZXJzLFxuICAgICAgcmVjdDogdW5tb2RpZmllZFJlY3QsXG4gICAgfSA9IGFyZ1xuXG4gICAgYXJnLmNvb3JkcyA9IGV4dGVuZCh7fSwgYXJnLnBhZ2VDb29yZHMpXG4gICAgYXJnLnJlY3QgPSBleHRlbmQoe30sIHVubW9kaWZpZWRSZWN0KVxuXG4gICAgY29uc3Qgc3RhdGVzID0gc2tpcE1vZGlmaWVyc1xuICAgICAgPyB0aGlzLnN0YXRlcy5zbGljZShza2lwTW9kaWZpZXJzKVxuICAgICAgOiB0aGlzLnN0YXRlc1xuXG4gICAgY29uc3QgbmV3UmVzdWx0ID0gY3JlYXRlUmVzdWx0KGFyZy5jb29yZHMsIGFyZy5yZWN0KVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiBzdGF0ZXMpIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcbiAgICAgIGNvbnN0IGxhc3RNb2RpZmllckNvb3JkcyA9IGV4dGVuZCh7fSwgYXJnLmNvb3JkcylcbiAgICAgIGxldCByZXR1cm5WYWx1ZSA9IG51bGxcblxuICAgICAgaWYgKHN0YXRlLm1ldGhvZHMuc2V0ICYmIHRoaXMuc2hvdWxkRG8ob3B0aW9ucywgcHJlRW5kLCBwaGFzZSkpIHtcbiAgICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBzdGF0ZS5tZXRob2RzLnNldChhcmcgYXMgTW9kaWZpZXJBcmcpXG5cbiAgICAgICAgcmVjdFV0aWxzLmFkZEVkZ2VzKHRoaXMuaW50ZXJhY3Rpb24uZWRnZXMsIGFyZy5yZWN0LCB7IHg6IGFyZy5jb29yZHMueCAtIGxhc3RNb2RpZmllckNvb3Jkcy54LCB5OiBhcmcuY29vcmRzLnkgLSBsYXN0TW9kaWZpZXJDb29yZHMueSB9KVxuICAgICAgfVxuXG4gICAgICBuZXdSZXN1bHQuZXZlbnRQcm9wcy5wdXNoKHJldHVyblZhbHVlKVxuICAgIH1cblxuICAgIG5ld1Jlc3VsdC5kZWx0YS54ID0gYXJnLmNvb3Jkcy54IC0gYXJnLnBhZ2VDb29yZHMueFxuICAgIG5ld1Jlc3VsdC5kZWx0YS55ID0gYXJnLmNvb3Jkcy55IC0gYXJnLnBhZ2VDb29yZHMueVxuXG4gICAgbmV3UmVzdWx0LnJlY3REZWx0YS5sZWZ0ICAgPSBhcmcucmVjdC5sZWZ0IC0gdW5tb2RpZmllZFJlY3QubGVmdFxuICAgIG5ld1Jlc3VsdC5yZWN0RGVsdGEucmlnaHQgID0gYXJnLnJlY3QucmlnaHQgLSB1bm1vZGlmaWVkUmVjdC5yaWdodFxuICAgIG5ld1Jlc3VsdC5yZWN0RGVsdGEudG9wICAgID0gYXJnLnJlY3QudG9wIC0gdW5tb2RpZmllZFJlY3QudG9wXG4gICAgbmV3UmVzdWx0LnJlY3REZWx0YS5ib3R0b20gPSBhcmcucmVjdC5ib3R0b20gLSB1bm1vZGlmaWVkUmVjdC5ib3R0b21cblxuICAgIGNvbnN0IHByZXZDb29yZHMgPSB0aGlzLnJlc3VsdC5jb29yZHNcbiAgICBjb25zdCBwcmV2UmVjdCA9IHRoaXMucmVzdWx0LnJlY3RcblxuICAgIGlmIChwcmV2Q29vcmRzICYmIHByZXZSZWN0KSB7XG4gICAgICBjb25zdCByZWN0Q2hhbmdlZCA9IG5ld1Jlc3VsdC5yZWN0LmxlZnQgIT09IHByZXZSZWN0LmxlZnQgfHxcbiAgICAgICAgbmV3UmVzdWx0LnJlY3QucmlnaHQgIT09IHByZXZSZWN0LnJpZ2h0IHx8XG4gICAgICAgIG5ld1Jlc3VsdC5yZWN0LnRvcCAhPT0gcHJldlJlY3QudG9wIHx8XG4gICAgICAgIG5ld1Jlc3VsdC5yZWN0LmJvdHRvbSAhPT0gcHJldlJlY3QuYm90dG9tXG5cbiAgICAgIG5ld1Jlc3VsdC5jaGFuZ2VkID0gcmVjdENoYW5nZWQgfHxcbiAgICAgICAgcHJldkNvb3Jkcy54ICE9PSBuZXdSZXN1bHQuY29vcmRzLnggfHxcbiAgICAgICAgcHJldkNvb3Jkcy55ICE9PSBuZXdSZXN1bHQuY29vcmRzLnlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3UmVzdWx0XG4gIH1cblxuICBhcHBseVRvSW50ZXJhY3Rpb24gKGFyZzogeyBwaGFzZTogSW50ZXJhY3QuRXZlbnRQaGFzZSwgcmVjdD86IEludGVyYWN0LlJlY3QgfSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCB7IHBoYXNlIH0gPSBhcmdcbiAgICBjb25zdCBjdXJDb29yZHMgPSBpbnRlcmFjdGlvbi5jb29yZHMuY3VyXG4gICAgY29uc3Qgc3RhcnRDb29yZHMgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnRcbiAgICBjb25zdCB7IHJlc3VsdCwgc3RhcnREZWx0YSB9ID0gdGhpc1xuICAgIGNvbnN0IGN1ckRlbHRhID0gcmVzdWx0LmRlbHRhXG5cbiAgICBpZiAocGhhc2UgPT09ICdzdGFydCcpIHtcbiAgICAgIGV4dGVuZCh0aGlzLnN0YXJ0RGVsdGEsIHJlc3VsdC5kZWx0YSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb29yZHNTZXQsIGRlbHRhXSBvZiBbW3N0YXJ0Q29vcmRzLCBzdGFydERlbHRhXSwgW2N1ckNvb3JkcywgY3VyRGVsdGFdXSBhcyBjb25zdCkge1xuICAgICAgY29vcmRzU2V0LnBhZ2UueCAgICs9IGRlbHRhLnhcbiAgICAgIGNvb3Jkc1NldC5wYWdlLnkgICArPSBkZWx0YS55XG4gICAgICBjb29yZHNTZXQuY2xpZW50LnggKz0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LmNsaWVudC55ICs9IGRlbHRhLnlcbiAgICB9XG5cbiAgICBjb25zdCB7IHJlY3REZWx0YSB9ID0gdGhpcy5yZXN1bHRcbiAgICBjb25zdCByZWN0ID0gYXJnLnJlY3QgfHwgaW50ZXJhY3Rpb24ucmVjdFxuXG4gICAgcmVjdC5sZWZ0ICAgKz0gcmVjdERlbHRhLmxlZnRcbiAgICByZWN0LnJpZ2h0ICArPSByZWN0RGVsdGEucmlnaHRcbiAgICByZWN0LnRvcCAgICArPSByZWN0RGVsdGEudG9wXG4gICAgcmVjdC5ib3R0b20gKz0gcmVjdERlbHRhLmJvdHRvbVxuXG4gICAgcmVjdC53aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnRcbiAgICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgfVxuXG4gIHNldEFuZEFwcGx5IChhcmc6IFBhcnRpYWw8SW50ZXJhY3QuRG9BbnlQaGFzZUFyZz4gJiB7XG4gICAgcGhhc2U6IEludGVyYWN0LkV2ZW50UGhhc2VcbiAgICBwcmVFbmQ/OiBib29sZWFuXG4gICAgc2tpcE1vZGlmaWVycz86IG51bWJlclxuICAgIG1vZGlmaWVkQ29vcmRzPzogSW50ZXJhY3QuUG9pbnRcbiAgfSk6IHZvaWQgfCBmYWxzZSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdGlvbiB9ID0gdGhpc1xuICAgIGNvbnN0IHsgcGhhc2UsIHByZUVuZCwgc2tpcE1vZGlmaWVycyB9ID0gYXJnXG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNldEFsbCh7XG4gICAgICBwcmVFbmQsXG4gICAgICBwaGFzZSxcbiAgICAgIHBhZ2VDb29yZHM6IGFyZy5tb2RpZmllZENvb3JkcyB8fCBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnBhZ2UsXG4gICAgfSlcblxuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0XG5cbiAgICAvLyBkb24ndCBmaXJlIGFuIGFjdGlvbiBtb3ZlIGlmIGEgbW9kaWZpZXIgd291bGQga2VlcCB0aGUgZXZlbnQgaW4gdGhlIHNhbWVcbiAgICAvLyBjb3JkaW5hdGVzIGFzIGJlZm9yZVxuICAgIGlmICghcmVzdWx0LmNoYW5nZWQgJiYgKCFza2lwTW9kaWZpZXJzIHx8IHNraXBNb2RpZmllcnMgPCB0aGlzLnN0YXRlcy5sZW5ndGgpICYmIGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChhcmcubW9kaWZpZWRDb29yZHMpIHtcbiAgICAgIGNvbnN0IHsgcGFnZSB9ID0gaW50ZXJhY3Rpb24uY29vcmRzLmN1clxuICAgICAgY29uc3QgYWRqdXN0bWVudCA9IHtcbiAgICAgICAgeDogYXJnLm1vZGlmaWVkQ29vcmRzLnggLSBwYWdlLngsXG4gICAgICAgIHk6IGFyZy5tb2RpZmllZENvb3Jkcy55IC0gcGFnZS55LFxuICAgICAgfVxuXG4gICAgICByZXN1bHQuY29vcmRzLnggKz0gYWRqdXN0bWVudC54XG4gICAgICByZXN1bHQuY29vcmRzLnkgKz0gYWRqdXN0bWVudC55XG4gICAgICByZXN1bHQuZGVsdGEueCArPSBhZGp1c3RtZW50LnhcbiAgICAgIHJlc3VsdC5kZWx0YS55ICs9IGFkanVzdG1lbnQueVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlUb0ludGVyYWN0aW9uKGFyZylcbiAgfVxuXG4gIGJlZm9yZUVuZCAoYXJnOiBPbWl0PEludGVyYWN0LkRvQW55UGhhc2VBcmcsICdpRXZlbnQnPiAmIHsgc3RhdGU/OiBNb2RpZmllclN0YXRlIH0pOiB2b2lkIHwgZmFsc2Uge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGV2ZW50IH0gPSBhcmdcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0YXRlc1xuXG4gICAgaWYgKCFzdGF0ZXMgfHwgIXN0YXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBkb1ByZWVuZCA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHN0YXRlcykge1xuICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgIGNvbnN0IHsgb3B0aW9ucywgbWV0aG9kcyB9ID0gc3RhdGVcblxuICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBtZXRob2RzLmJlZm9yZUVuZCAmJiBtZXRob2RzLmJlZm9yZUVuZChhcmcgYXMgdW5rbm93biBhcyBNb2RpZmllckFyZylcblxuICAgICAgaWYgKGVuZFBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZW5kUmVzdWx0ID0gZW5kUG9zaXRpb25cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGRvUHJlZW5kID0gZG9QcmVlbmQgfHwgKCFkb1ByZWVuZCAmJiB0aGlzLnNob3VsZERvKG9wdGlvbnMsIHRydWUsIGFyZy5waGFzZSwgdHJ1ZSkpXG4gICAgfVxuXG4gICAgaWYgKGRvUHJlZW5kKSB7XG4gICAgICAvLyB0cmlnZ2VyIGEgZmluYWwgbW9kaWZpZWQgbW92ZSBiZWZvcmUgZW5kaW5nXG4gICAgICBpbnRlcmFjdGlvbi5tb3ZlKHsgZXZlbnQsIHByZUVuZDogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIHN0b3AgKGFyZzogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGFyZ1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlcyB8fCAhdGhpcy5zdGF0ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBtb2RpZmllckFyZzogUGFydGlhbDxNb2RpZmllckFyZz4gPSBleHRlbmQoe1xuICAgICAgc3RhdGVzOiB0aGlzLnN0YXRlcyxcbiAgICAgIGludGVyYWN0YWJsZTogaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLFxuICAgICAgZWxlbWVudDogaW50ZXJhY3Rpb24uZWxlbWVudCxcbiAgICAgIHJlY3Q6IG51bGwsXG4gICAgfSwgYXJnKVxuXG4gICAgdGhpcy5maWxsQXJnKG1vZGlmaWVyQXJnKVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgbW9kaWZpZXJBcmcuc3RhdGUgPSBzdGF0ZVxuXG4gICAgICBpZiAoc3RhdGUubWV0aG9kcy5zdG9wKSB7IHN0YXRlLm1ldGhvZHMuc3RvcChtb2RpZmllckFyZyBhcyBNb2RpZmllckFyZykgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGVzID0gbnVsbFxuICAgIHRoaXMuZW5kUmVzdWx0ID0gbnVsbFxuICB9XG5cbiAgcHJlcGFyZVN0YXRlcyAobW9kaWZpZXJMaXN0OiBNb2RpZmllcltdKSB7XG4gICAgdGhpcy5zdGF0ZXMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1vZGlmaWVyTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucywgbWV0aG9kcywgbmFtZSB9ID0gbW9kaWZpZXJMaXN0W2luZGV4XVxuXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVuYWJsZWQgPT09IGZhbHNlKSB7IGNvbnRpbnVlIH1cblxuICAgICAgdGhpcy5zdGF0ZXMucHVzaCh7XG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIG1ldGhvZHMsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBuYW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZXNcbiAgfVxuXG4gIHJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyAoeyBpbnRlcmFjdGlvbjogeyBjb29yZHMsIHJlY3QsIG1vZGlmaWNhdGlvbiB9IH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgICBpZiAoIW1vZGlmaWNhdGlvbi5yZXN1bHQpIHsgcmV0dXJuIH1cblxuICAgIGNvbnN0IHsgc3RhcnREZWx0YSB9ID0gbW9kaWZpY2F0aW9uXG4gICAgY29uc3QgeyBkZWx0YTogY3VyRGVsdGEsIHJlY3REZWx0YSB9ID0gbW9kaWZpY2F0aW9uLnJlc3VsdFxuXG4gICAgY29uc3QgY29vcmRzQW5kRGVsdGFzID0gW1xuICAgICAgW2Nvb3Jkcy5zdGFydCwgc3RhcnREZWx0YV0sXG4gICAgICBbY29vcmRzLmN1ciwgY3VyRGVsdGFdLFxuICAgIF1cblxuICAgIGZvciAoY29uc3QgW2Nvb3Jkc1NldCwgZGVsdGFdIG9mIGNvb3Jkc0FuZERlbHRhcyBhcyBhbnkpIHtcbiAgICAgIGNvb3Jkc1NldC5wYWdlLnggLT0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LnBhZ2UueSAtPSBkZWx0YS55XG4gICAgICBjb29yZHNTZXQuY2xpZW50LnggLT0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LmNsaWVudC55IC09IGRlbHRhLnlcbiAgICB9XG5cbiAgICByZWN0LmxlZnQgLT0gcmVjdERlbHRhLmxlZnRcbiAgICByZWN0LnJpZ2h0IC09IHJlY3REZWx0YS5yaWdodFxuICAgIHJlY3QudG9wIC09IHJlY3REZWx0YS50b3BcbiAgICByZWN0LmJvdHRvbSAtPSByZWN0RGVsdGEuYm90dG9tXG4gIH1cblxuICBzaG91bGREbyAob3B0aW9ucywgcHJlRW5kPzogYm9vbGVhbiwgcGhhc2U/OiBzdHJpbmcsIHJlcXVpcmVFbmRPbmx5PzogYm9vbGVhbikge1xuICAgIGlmIChcbiAgICAgIC8vIGlnbm9yZSBkaXNhYmxlZCBtb2RpZmllcnNcbiAgICAgICghb3B0aW9ucyB8fCBvcHRpb25zLmVuYWJsZWQgPT09IGZhbHNlKSB8fFxuICAgICAgLy8gY2hlY2sgaWYgd2UgcmVxdWlyZSBlbmRPbmx5IG9wdGlvbiB0byBmaXJlIG1vdmUgYmVmb3JlIGVuZFxuICAgICAgKHJlcXVpcmVFbmRPbmx5ICYmICFvcHRpb25zLmVuZE9ubHkpIHx8XG4gICAgICAvLyBkb24ndCBhcHBseSBlbmRPbmx5IG1vZGlmaWVycyB3aGVuIG5vdCBlbmRpbmdcbiAgICAgIChvcHRpb25zLmVuZE9ubHkgJiYgIXByZUVuZCkgfHxcbiAgICAgIC8vIGNoZWNrIGlmIG1vZGlmaWVyIHNob3VsZCBydW4gYmUgYXBwbGllZCBvbiBzdGFydFxuICAgICAgKHBoYXNlID09PSAnc3RhcnQnICYmICFvcHRpb25zLnNldFN0YXJ0KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvcHlGcm9tIChvdGhlcjogTW9kaWZpY2F0aW9uKSB7XG4gICAgdGhpcy5zdGFydE9mZnNldCA9IG90aGVyLnN0YXJ0T2Zmc2V0XG4gICAgdGhpcy5zdGFydERlbHRhID0gb3RoZXIuc3RhcnREZWx0YVxuICAgIHRoaXMuZWRnZXMgPSBvdGhlci5lZGdlc1xuICAgIHRoaXMuc3RhdGVzID0gb3RoZXIuc3RhdGVzLm1hcChzID0+IGNsb25lKHMpIGFzIE1vZGlmaWVyU3RhdGUpXG4gICAgdGhpcy5yZXN1bHQgPSBjcmVhdGVSZXN1bHQoZXh0ZW5kKHt9LCBvdGhlci5yZXN1bHQuY29vcmRzKSwgZXh0ZW5kKHt9LCBvdGhlci5yZXN1bHQucmVjdCkpXG4gIH1cblxuICBkZXN0cm95ICgpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcykge1xuICAgICAgdGhpc1twcm9wXSA9IG51bGxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVzdWx0IChjb29yZHM/OiBJbnRlcmFjdC5Qb2ludCwgcmVjdD86IEludGVyYWN0LkZ1bGxSZWN0KTogTW9kaWZpY2F0aW9uUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICByZWN0LFxuICAgIGNvb3JkcyxcbiAgICBkZWx0YTogeyB4OiAwLCB5OiAwIH0sXG4gICAgcmVjdERlbHRhOiB7XG4gICAgICBsZWZ0ICA6IDAsXG4gICAgICByaWdodCA6IDAsXG4gICAgICB0b3AgICA6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgfSxcbiAgICBldmVudFByb3BzOiBbXSxcbiAgICBjaGFuZ2VkOiB0cnVlLFxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyTGlzdCAoaW50ZXJhY3Rpb24pIHtcbiAgY29uc3QgYWN0aW9uT3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zW2ludGVyYWN0aW9uLnByZXBhcmVkLm5hbWVdXG4gIGNvbnN0IGFjdGlvbk1vZGlmaWVycyA9IGFjdGlvbk9wdGlvbnMubW9kaWZpZXJzXG5cbiAgaWYgKGFjdGlvbk1vZGlmaWVycyAmJiBhY3Rpb25Nb2RpZmllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFjdGlvbk1vZGlmaWVycy5maWx0ZXIoXG4gICAgICBtb2RpZmllciA9PiAhbW9kaWZpZXIub3B0aW9ucyB8fCBtb2RpZmllci5vcHRpb25zLmVuYWJsZWQgIT09IGZhbHNlLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBbJ3NuYXAnLCAnc25hcFNpemUnLCAnc25hcEVkZ2VzJywgJ3Jlc3RyaWN0JywgJ3Jlc3RyaWN0RWRnZXMnLCAncmVzdHJpY3RTaXplJ11cbiAgICAubWFwKHR5cGUgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGFjdGlvbk9wdGlvbnNbdHlwZV1cblxuICAgICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5lbmFibGVkICYmIHtcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgbWV0aG9kczogb3B0aW9ucy5fbWV0aG9kcyxcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIobSA9PiAhIW0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN0T2Zmc2V0IChyZWN0LCBjb29yZHMpIHtcbiAgcmV0dXJuIHJlY3RcbiAgICA/IHtcbiAgICAgIGxlZnQgIDogY29vcmRzLnggLSByZWN0LmxlZnQsXG4gICAgICB0b3AgICA6IGNvb3Jkcy55IC0gcmVjdC50b3AsXG4gICAgICByaWdodCA6IHJlY3QucmlnaHQgIC0gY29vcmRzLngsXG4gICAgICBib3R0b206IHJlY3QuYm90dG9tIC0gY29vcmRzLnksXG4gICAgfVxuICAgIDoge1xuICAgICAgbGVmdCAgOiAwLFxuICAgICAgdG9wICAgOiAwLFxuICAgICAgcmlnaHQgOiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgIH1cbn1cbiIsImltcG9ydCBNb2RpZmljYXRpb24gZnJvbSAnLi9Nb2RpZmljYXRpb24nXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgbW9kaWZpY2F0aW9uPzogTW9kaWZpY2F0aW9uXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RFdmVudCcge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RFdmVudCB7XG4gICAgbW9kaWZpZXJzPzogQXJyYXk8e1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9PlxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgbW9kaWZpZXJzPzogTW9kaWZpZXJbXVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZXI8XG4gIERlZmF1bHRzID0gYW55LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUgPSBhbnksXG4gIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBhbnlcbj4ge1xuICBvcHRpb25zPzogRGVmYXVsdHNcbiAgbWV0aG9kczoge1xuICAgIHN0YXJ0PzogKGFyZzogTW9kaWZpZXJBcmc8U3RhdGU+KSA9PiB2b2lkXG4gICAgc2V0OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IHZvaWRcbiAgICBiZWZvcmVFbmQ/OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IEludGVyYWN0LlBvaW50IHwgdm9pZFxuICAgIHN0b3A/OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IHZvaWRcbiAgfVxuICBuYW1lPzogTmFtZVxufVxuXG5leHBvcnQgdHlwZSBNb2RpZmllclN0YXRlPFxuICBEZWZhdWx0cyA9IHt9LFxuICBTdGF0ZVByb3BzIGV4dGVuZHMgeyBbcHJvcDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgTmFtZSBleHRlbmRzIHN0cmluZyA9IGFueVxuPiA9IHtcbiAgb3B0aW9uczogRGVmYXVsdHNcbiAgbWV0aG9kcz86IE1vZGlmaWVyPERlZmF1bHRzPlsnbWV0aG9kcyddXG4gIGluZGV4PzogbnVtYmVyXG4gIG5hbWU/OiBOYW1lXG59ICYgU3RhdGVQcm9wc1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWVyQXJnPFN0YXRlIGV4dGVuZHMgTW9kaWZpZXJTdGF0ZSA9IE1vZGlmaWVyU3RhdGU+IHtcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uXG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlXG4gIHBoYXNlOiBJbnRlcmFjdC5FdmVudFBoYXNlXG4gIHJlY3Q6IEludGVyYWN0LkZ1bGxSZWN0XG4gIGVkZ2VzOiBJbnRlcmFjdC5FZGdlT3B0aW9uc1xuICBzdGF0ZT86IFN0YXRlXG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbiAgcGFnZUNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHByZXZDb29yZHM/OiBJbnRlcmFjdC5Qb2ludFxuICBwcmV2UmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHN0YXJ0T2Zmc2V0PzogSW50ZXJhY3QuUmVjdFxuICBwcmVFbmQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZXJNb2R1bGU8XG4gIERlZmF1bHRzIGV4dGVuZHMgeyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUsXG4+IHtcbiAgZGVmYXVsdHM/OiBEZWZhdWx0c1xuICBzdGFydD8gKGFyZzogTW9kaWZpZXJBcmc8U3RhdGU+KTogdm9pZFxuICBzZXQ/IChhcmc6IE1vZGlmaWVyQXJnPFN0YXRlPik6IGFueVxuICBiZWZvcmVFbmQ/IChhcmc6IE1vZGlmaWVyQXJnPFN0YXRlPik6IEludGVyYWN0LlBvaW50IHwgdm9pZFxuICBzdG9wPyAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pOiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTW9kaWZpZXI8XG4gIERlZmF1bHRzIGV4dGVuZHMgeyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUsXG4gIE5hbWUgZXh0ZW5kcyBzdHJpbmdcbj4gKFxuICBtb2R1bGU6IE1vZGlmaWVyTW9kdWxlPERlZmF1bHRzLCBTdGF0ZT4sXG4gIG5hbWU/OiBOYW1lLFxuKSB7XG4gIGNvbnN0IHsgZGVmYXVsdHMgfSA9IG1vZHVsZVxuICBjb25zdCBtZXRob2RzID0ge1xuICAgIHN0YXJ0OiBtb2R1bGUuc3RhcnQsXG4gICAgc2V0OiBtb2R1bGUuc2V0LFxuICAgIGJlZm9yZUVuZDogbW9kdWxlLmJlZm9yZUVuZCxcbiAgICBzdG9wOiBtb2R1bGUuc3RvcCxcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVyID0gKF9vcHRpb25zPzogUGFydGlhbDxEZWZhdWx0cz4pID0+IHtcbiAgICBjb25zdCBvcHRpb25zOiBEZWZhdWx0cyA9IChfb3B0aW9ucyB8fCB7fSkgYXMgRGVmYXVsdHNcblxuICAgIG9wdGlvbnMuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcblxuICAgIC8vIGFkZCBtaXNzaW5nIGRlZmF1bHRzIHRvIG9wdGlvbnNcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGVmYXVsdHMpIHtcbiAgICAgIGlmICghKHByb3AgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IGRlZmF1bHRzW3Byb3BdXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbTogTW9kaWZpZXI8RGVmYXVsdHMsIFN0YXRlLCBOYW1lPiA9IHsgb3B0aW9ucywgbWV0aG9kcywgbmFtZSB9XG5cbiAgICByZXR1cm4gbVxuICB9XG5cbiAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZm9yIGJhY2t3cmFkcyBjb21wYXRpYmlsaXR5XG4gICAgbW9kaWZpZXIuX2RlZmF1bHRzID0gZGVmYXVsdHNcbiAgICBtb2RpZmllci5fbWV0aG9kcyA9IG1ldGhvZHNcbiAgfVxuXG4gIHJldHVybiBtb2RpZmllclxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRXZlbnRNb2RpZmllcnMgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbjogeyBtb2RpZmljYXRpb246IHsgcmVzdWx0IH0gfSB9OiB7XG4gIGlFdmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxJbnRlcmFjdC5BY3Rpb25OYW1lLCBJbnRlcmFjdC5FdmVudFBoYXNlPlxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbn0pIHtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGlFdmVudC5tb2RpZmllcnMgPSByZXN1bHQuZXZlbnRQcm9wc1xuICB9XG59XG5cbmNvbnN0IG1vZGlmaWVyc0Jhc2U6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdtb2RpZmllcnMvYmFzZScsXG4gIGluc3RhbGw6IHNjb3BlID0+IHtcbiAgICBzY29wZS5kZWZhdWx0cy5wZXJBY3Rpb24ubW9kaWZpZXJzID0gW11cbiAgfSxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGlvbi5tb2RpZmljYXRpb24gPSBuZXcgTW9kaWZpY2F0aW9uKGludGVyYWN0aW9uKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tc3RhcnQnOiBhcmcgPT4ge1xuICAgICAgY29uc3QgeyBtb2RpZmljYXRpb24gfSA9IGFyZy5pbnRlcmFjdGlvblxuXG4gICAgICBtb2RpZmljYXRpb24uc3RhcnQoYXJnLCBhcmcuaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UpXG4gICAgICBhcmcuaW50ZXJhY3Rpb24uZWRnZXMgPSBtb2RpZmljYXRpb24uZWRnZXNcbiAgICAgIG1vZGlmaWNhdGlvbi5hcHBseVRvSW50ZXJhY3Rpb24oYXJnKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnNldEFuZEFwcGx5KGFyZyksXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uYmVmb3JlRW5kKGFyZyksXG5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1zdGFydCc6IGFkZEV2ZW50TW9kaWZpZXJzLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBhZGRFdmVudE1vZGlmaWVycyxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1lbmQnOiBhZGRFdmVudE1vZGlmaWVycyxcblxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXN0YXJ0JzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24ucmVzdG9yZUludGVyYWN0aW9uQ29vcmRzKGFyZyksXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uc3RvcChhcmcpLFxuICB9LFxuICBiZWZvcmU6IFsnYWN0aW9ucycsICdhY3Rpb24vZHJhZycsICdhY3Rpb25zL3Jlc2l6ZScsICdhY3Rpb25zL2dlc3R1cmUnXSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbW9kaWZpZXJzQmFzZVxuIiwiaW1wb3J0IHsgX1Byb3h5TWV0aG9kcyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgKiBhcyByZWN0VXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmVjdCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBvZmZzZXRCeT86IHR5cGVvZiBvZmZzZXRCeVxuICAgIG9mZnNldDoge1xuICAgICAgdG90YWw6IEludGVyYWN0LlBvaW50XG4gICAgICBwZW5kaW5nOiBJbnRlcmFjdC5Qb2ludFxuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZW51bSBfUHJveHlNZXRob2RzIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgb2Zmc2V0QnkgPSAnJ1xuICB9XG59XG5cbihfUHJveHlNZXRob2RzIGFzIGFueSkub2Zmc2V0QnkgPSAnJ1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkVG90YWwgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICBpZiAoIWludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24pIHsgcmV0dXJuIH1cblxuICBhZGRUb0Nvb3JkcyhpbnRlcmFjdGlvbi5jb29yZHMuY3VyLCBpbnRlcmFjdGlvbi5vZmZzZXQudG90YWwpXG5cbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueCA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueSA9IDBcbn1cblxuZnVuY3Rpb24gYmVmb3JlQWN0aW9uICh7IGludGVyYWN0aW9uIH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgYXBwbHlQZW5kaW5nKGludGVyYWN0aW9uKVxufVxuXG5mdW5jdGlvbiBiZWZvcmVFbmQgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSk6IGJvb2xlYW4gfCB2b2lkIHtcbiAgY29uc3QgaGFkUGVuZGluZyA9IGFwcGx5UGVuZGluZyhpbnRlcmFjdGlvbilcblxuICBpZiAoIWhhZFBlbmRpbmcpIHsgcmV0dXJuIH1cblxuICBpbnRlcmFjdGlvbi5tb3ZlKHsgb2Zmc2V0OiB0cnVlIH0pXG4gIGludGVyYWN0aW9uLmVuZCgpXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGVuZCAoeyBpbnRlcmFjdGlvbiB9OiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9KSB7XG4gIGludGVyYWN0aW9uLm9mZnNldC50b3RhbC54ID0gMFxuICBpbnRlcmFjdGlvbi5vZmZzZXQudG90YWwueSA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueCA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueSA9IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGVuZGluZyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uKSB7XG4gIGlmICghaGFzUGVuZGluZyhpbnRlcmFjdGlvbikpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IHsgcGVuZGluZyB9ID0gaW50ZXJhY3Rpb24ub2Zmc2V0XG5cbiAgYWRkVG9Db29yZHMoaW50ZXJhY3Rpb24uY29vcmRzLmN1ciwgcGVuZGluZylcbiAgYWRkVG9Db29yZHMoaW50ZXJhY3Rpb24uY29vcmRzLmRlbHRhLCBwZW5kaW5nKVxuICByZWN0VXRpbHMuYWRkRWRnZXMoaW50ZXJhY3Rpb24uZWRnZXMsIGludGVyYWN0aW9uLnJlY3QsIHBlbmRpbmcpXG5cbiAgcGVuZGluZy54ID0gMFxuICBwZW5kaW5nLnkgPSAwXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gb2Zmc2V0QnkgKHRoaXM6IEludGVyYWN0LkludGVyYWN0aW9uLCB7IHgsIHkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgdGhpcy5vZmZzZXQucGVuZGluZy54ICs9IHhcbiAgdGhpcy5vZmZzZXQucGVuZGluZy55ICs9IHlcblxuICB0aGlzLm9mZnNldC50b3RhbC54ICs9IHhcbiAgdGhpcy5vZmZzZXQudG90YWwueSArPSB5XG59XG5cbmZ1bmN0aW9uIGFkZFRvQ29vcmRzICh7IHBhZ2UsIGNsaWVudCB9LCB7IHgsIHkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgcGFnZS54ICs9IHhcbiAgcGFnZS55ICs9IHlcbiAgY2xpZW50LnggKz0geFxuICBjbGllbnQueSArPSB5XG59XG5cbmZ1bmN0aW9uIGhhc1BlbmRpbmcgKGludGVyYWN0aW9uKSB7XG4gIHJldHVybiAhIShpbnRlcmFjdGlvbi5vZmZzZXQucGVuZGluZy54IHx8IGludGVyYWN0aW9uLm9mZnNldC5wZW5kaW5nLnkpXG59XG5cbmNvbnN0IG9mZnNldDogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ29mZnNldCcsXG4gIGluc3RhbGwgKHNjb3BlKSB7XG4gICAgc2NvcGUuSW50ZXJhY3Rpb24ucHJvdG90eXBlLm9mZnNldEJ5ID0gb2Zmc2V0QnlcbiAgfSxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGlvbi5vZmZzZXQgPSB7XG4gICAgICAgIHRvdGFsOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgcGVuZGluZzogeyB4OiAwLCB5OiAwIH0sXG4gICAgICB9XG4gICAgfSxcbiAgICAnaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJzogKHsgaW50ZXJhY3Rpb24gfSkgPT4gYWRkVG90YWwoaW50ZXJhY3Rpb24pLFxuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1zdGFydCc6IGJlZm9yZUFjdGlvbixcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGJlZm9yZUFjdGlvbixcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogYmVmb3JlRW5kLFxuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IGVuZCxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgb2Zmc2V0XG4iLCJpbXBvcnQgKiBhcyBtb2RpZmllcnMgZnJvbSAnQGludGVyYWN0anMvbW9kaWZpZXJzL2Jhc2UnXG5pbXBvcnQgTW9kaWZpY2F0aW9uIGZyb20gJ0BpbnRlcmFjdGpzL21vZGlmaWVycy9Nb2RpZmljYXRpb24nXG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0BpbnRlcmFjdGpzL29mZnNldC9pbmRleCdcbmltcG9ydCAqIGFzIGRvbSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21VdGlscydcbmltcG9ydCBoeXBvdCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9oeXBvdCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IHsgY29weUNvb3JkcyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3BvaW50ZXJVdGlscydcbmltcG9ydCByYWYgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmFmJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50JyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgaW50ZXJmYWNlIFBoYXNlTWFwIHtcbiAgICByZXN1bWU/OiB0cnVlXG4gICAgaW5lcnRpYXN0YXJ0PzogdHJ1ZVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgaW5lcnRpYT86IEluZXJ0aWFTdGF0ZVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgaW5lcnRpYT86IHtcbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICByZXNpc3RhbmNlPzogbnVtYmVyICAgICAgICAvLyB0aGUgbGFtYmRhIGluIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgICBtaW5TcGVlZD86IG51bWJlciAgICAgICAgICAvLyB0YXJnZXQgc3BlZWQgbXVzdCBiZSBhYm92ZSB0aGlzIGZvciBpbmVydGlhIHRvIHN0YXJ0XG4gICAgICBlbmRTcGVlZD86IG51bWJlciAgICAgICAgICAvLyB0aGUgc3BlZWQgYXQgd2hpY2ggaW5lcnRpYSBpcyBzbG93IGVub3VnaCB0byBzdG9wXG4gICAgICBhbGxvd1Jlc3VtZT86IHRydWUgICAgICAgICAvLyBhbGxvdyByZXN1bWluZyBhbiBhY3Rpb24gaW4gaW5lcnRpYSBwaGFzZVxuICAgICAgc21vb3RoRW5kRHVyYXRpb24/OiBudW1iZXIgLy8gYW5pbWF0ZSB0byBzbmFwL3Jlc3RyaWN0IGVuZE9ubHkgaWYgdGhlcmUncyBubyBpbmVydGlhXG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTaWduYWxBcmdzIHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24taW5lcnRpYXN0YXJ0JzogT21pdDxJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdpbmVydGlhc3RhcnQnPiwgJ2lFdmVudCc+XG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24taW5lcnRpYXN0YXJ0JzogSW50ZXJhY3QuRG9QaGFzZUFyZzxJbnRlcmFjdC5BY3Rpb25OYW1lLCAnaW5lcnRpYXN0YXJ0Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFmdGVyLWFjdGlvbi1pbmVydGlhc3RhcnQnOiBJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdpbmVydGlhc3RhcnQnPlxuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1yZXN1bWUnOiBPbWl0PEludGVyYWN0LkRvUGhhc2VBcmc8SW50ZXJhY3QuQWN0aW9uTmFtZSwgJ3Jlc3VtZSc+LCAnaUV2ZW50Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1yZXN1bWUnOiBJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdyZXN1bWUnPlxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXJlc3VtZSc6IEludGVyYWN0LkRvUGhhc2VBcmc8SW50ZXJhY3QuQWN0aW9uTmFtZSwgJ3Jlc3VtZSc+XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKG9mZnNldClcbiAgc2NvcGUudXNlUGx1Z2luKG1vZGlmaWVycy5kZWZhdWx0KVxuICBzY29wZS5hY3Rpb25zLnBoYXNlcy5pbmVydGlhc3RhcnQgPSB0cnVlXG4gIHNjb3BlLmFjdGlvbnMucGhhc2VzLnJlc3VtZSA9IHRydWVcblxuICBkZWZhdWx0cy5wZXJBY3Rpb24uaW5lcnRpYSA9IHtcbiAgICBlbmFibGVkICAgICAgICAgIDogZmFsc2UsXG4gICAgcmVzaXN0YW5jZSAgICAgICA6IDEwLCAgICAvLyB0aGUgbGFtYmRhIGluIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgbWluU3BlZWQgICAgICAgICA6IDEwMCwgICAvLyB0YXJnZXQgc3BlZWQgbXVzdCBiZSBhYm92ZSB0aGlzIGZvciBpbmVydGlhIHRvIHN0YXJ0XG4gICAgZW5kU3BlZWQgICAgICAgICA6IDEwLCAgICAvLyB0aGUgc3BlZWQgYXQgd2hpY2ggaW5lcnRpYSBpcyBzbG93IGVub3VnaCB0byBzdG9wXG4gICAgYWxsb3dSZXN1bWUgICAgICA6IHRydWUsICAvLyBhbGxvdyByZXN1bWluZyBhbiBhY3Rpb24gaW4gaW5lcnRpYSBwaGFzZVxuICAgIHNtb290aEVuZER1cmF0aW9uOiAzMDAsICAgLy8gYW5pbWF0ZSB0byBzbmFwL3Jlc3RyaWN0IGVuZE9ubHkgaWYgdGhlcmUncyBubyBpbmVydGlhXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZXJ0aWFTdGF0ZSB7XG4gIGFjdGl2ZSA9IGZhbHNlXG4gIGlzTW9kaWZpZWQgPSBmYWxzZVxuICBzbW9vdGhFbmQgPSBmYWxzZVxuICBhbGxvd1Jlc3VtZSA9IGZhbHNlXG5cbiAgbW9kaWZpY2F0aW9uOiBNb2RpZmljYXRpb24gPSBudWxsXG4gIG1vZGlmaWVyQ291bnQgPSAwXG4gIG1vZGlmaWVyQXJnOiBtb2RpZmllcnMuTW9kaWZpZXJBcmcgPSBudWxsXG5cbiAgc3RhcnRDb29yZHM6IEludGVyYWN0LlBvaW50ID0gbnVsbFxuICB0MCA9IDBcbiAgdjAgPSAwXG5cbiAgdGUgPSAwXG4gIHRhcmdldE9mZnNldDogSW50ZXJhY3QuUG9pbnQgPSBudWxsXG4gIG1vZGlmaWVkT2Zmc2V0OiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgY3VycmVudE9mZnNldDogSW50ZXJhY3QuUG9pbnQgPSBudWxsXG5cbiAgbGFtYmRhX3YwPyA9IDAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgb25lX3ZlX3YwPyA9IDAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgdGltZW91dDogbnVtYmVyID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yIChcbiAgICBwcml2YXRlIHJlYWRvbmx5IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgKSB7fVxuXG4gIHN0YXJ0IChldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhpbnRlcmFjdGlvbilcblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudDogdmVsb2NpdHlDbGllbnQgfSA9IGludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eVxuICAgIGNvbnN0IHBvaW50ZXJTcGVlZCA9IGh5cG90KHZlbG9jaXR5Q2xpZW50LngsIHZlbG9jaXR5Q2xpZW50LnkpXG4gICAgY29uc3QgbW9kaWZpY2F0aW9uID0gdGhpcy5tb2RpZmljYXRpb24gfHwgKHRoaXMubW9kaWZpY2F0aW9uID0gbmV3IE1vZGlmaWNhdGlvbihpbnRlcmFjdGlvbikpXG5cbiAgICBtb2RpZmljYXRpb24uY29weUZyb20oaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uKVxuXG4gICAgdGhpcy50MCA9IGludGVyYWN0aW9uLl9ub3coKVxuICAgIHRoaXMuYWxsb3dSZXN1bWUgPSBvcHRpb25zLmFsbG93UmVzdW1lXG4gICAgdGhpcy52MCA9IHBvaW50ZXJTcGVlZFxuICAgIHRoaXMuY3VycmVudE9mZnNldCA9IHsgeDogMCwgeTogMCB9XG4gICAgdGhpcy5zdGFydENvb3JkcyA9IGludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZVxuXG4gICAgdGhpcy5tb2RpZmllckFyZyA9IHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgaW50ZXJhY3RhYmxlOiBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsXG4gICAgICBlbGVtZW50OiBpbnRlcmFjdGlvbi5lbGVtZW50LFxuICAgICAgcmVjdDogaW50ZXJhY3Rpb24ucmVjdCxcbiAgICAgIGVkZ2VzOiBpbnRlcmFjdGlvbi5lZGdlcyxcbiAgICAgIHBhZ2VDb29yZHM6IHRoaXMuc3RhcnRDb29yZHMsXG4gICAgICBwcmVFbmQ6IHRydWUsXG4gICAgICBwaGFzZTogJ2luZXJ0aWFzdGFydCcsXG4gICAgfVxuXG4gICAgY29uc3QgdGhyb3duID0gKFxuICAgICAgKHRoaXMudDAgLSBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnRpbWVTdGFtcCkgPCA1MCAmJlxuICAgICAgcG9pbnRlclNwZWVkID4gb3B0aW9ucy5taW5TcGVlZCAmJlxuICAgICAgcG9pbnRlclNwZWVkID4gb3B0aW9ucy5lbmRTcGVlZFxuICAgIClcblxuICAgIGlmICh0aHJvd24pIHtcbiAgICAgIHRoaXMuc3RhcnRJbmVydGlhKClcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kaWZpY2F0aW9uLnJlc3VsdCA9IG1vZGlmaWNhdGlvbi5zZXRBbGwodGhpcy5tb2RpZmllckFyZylcblxuICAgICAgaWYgKCFtb2RpZmljYXRpb24ucmVzdWx0LmNoYW5nZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhcnRTbW9vdGhFbmQoKVxuICAgIH1cblxuICAgIC8vIGZvcmNlIG1vZGlmaWNhdGlvbiBjaGFuZ2VcbiAgICBpbnRlcmFjdGlvbi5tb2RpZmljYXRpb24ucmVzdWx0LnJlY3QgPSBudWxsXG5cbiAgICAvLyBicmluZyBpbmVydGlhc3RhcnQgZXZlbnQgdG8gdGhlIHRhcmdldCBjb29yZHNcbiAgICBpbnRlcmFjdGlvbi5vZmZzZXRCeSh0aGlzLnRhcmdldE9mZnNldClcbiAgICBpbnRlcmFjdGlvbi5fZG9QaGFzZSh7XG4gICAgICBpbnRlcmFjdGlvbixcbiAgICAgIGV2ZW50LFxuICAgICAgcGhhc2U6ICdpbmVydGlhc3RhcnQnLFxuICAgIH0pXG4gICAgaW50ZXJhY3Rpb24ub2Zmc2V0QnkoeyB4OiAtdGhpcy50YXJnZXRPZmZzZXQueCwgeTogLXRoaXMudGFyZ2V0T2Zmc2V0LnkgfSlcbiAgICAvLyBmb3JjZSBtb2RpZmljYXRpb24gY2hhbmdlXG4gICAgaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3VsdC5yZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlXG4gICAgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiA9IHRoaXNcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzdGFydEluZXJ0aWEgKCkge1xuICAgIGNvbnN0IHN0YXJ0VmVsb2NpdHkgPSB0aGlzLmludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eS5jbGllbnRcbiAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyh0aGlzLmludGVyYWN0aW9uKVxuICAgIGNvbnN0IGxhbWJkYSA9IG9wdGlvbnMucmVzaXN0YW5jZVxuICAgIGNvbnN0IGluZXJ0aWFEdXIgPSAtTWF0aC5sb2cob3B0aW9ucy5lbmRTcGVlZCAvIHRoaXMudjApIC8gbGFtYmRhXG5cbiAgICB0aGlzLnRhcmdldE9mZnNldCA9IHtcbiAgICAgIHg6IChzdGFydFZlbG9jaXR5LnggLSBpbmVydGlhRHVyKSAvIGxhbWJkYSxcbiAgICAgIHk6IChzdGFydFZlbG9jaXR5LnkgLSBpbmVydGlhRHVyKSAvIGxhbWJkYSxcbiAgICB9XG5cbiAgICB0aGlzLnRlID0gaW5lcnRpYUR1clxuICAgIHRoaXMubGFtYmRhX3YwID0gbGFtYmRhIC8gdGhpcy52MFxuICAgIHRoaXMub25lX3ZlX3YwID0gMSAtIG9wdGlvbnMuZW5kU3BlZWQgLyB0aGlzLnYwXG5cbiAgICBjb25zdCB7IG1vZGlmaWNhdGlvbiwgbW9kaWZpZXJBcmcgfSA9IHRoaXNcblxuICAgIG1vZGlmaWVyQXJnLnBhZ2VDb29yZHMgPSB7XG4gICAgICB4OiB0aGlzLnN0YXJ0Q29vcmRzLnggKyB0aGlzLnRhcmdldE9mZnNldC54LFxuICAgICAgeTogdGhpcy5zdGFydENvb3Jkcy55ICsgdGhpcy50YXJnZXRPZmZzZXQueSxcbiAgICB9XG5cbiAgICBtb2RpZmljYXRpb24ucmVzdWx0ID0gbW9kaWZpY2F0aW9uLnNldEFsbChtb2RpZmllckFyZylcblxuICAgIGlmIChtb2RpZmljYXRpb24ucmVzdWx0LmNoYW5nZWQpIHtcbiAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWVcbiAgICAgIHRoaXMubW9kaWZpZWRPZmZzZXQgPSB7XG4gICAgICAgIHg6IHRoaXMudGFyZ2V0T2Zmc2V0LnggKyBtb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLngsXG4gICAgICAgIHk6IHRoaXMudGFyZ2V0T2Zmc2V0LnkgKyBtb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLnksXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5pbmVydGlhVGljaygpKVxuICB9XG5cbiAgc3RhcnRTbW9vdGhFbmQgKCkge1xuICAgIHRoaXMuc21vb3RoRW5kID0gdHJ1ZVxuICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWVcbiAgICB0aGlzLnRhcmdldE9mZnNldCA9IHtcbiAgICAgIHg6IHRoaXMubW9kaWZpY2F0aW9uLnJlc3VsdC5kZWx0YS54LFxuICAgICAgeTogdGhpcy5tb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLnksXG4gICAgfVxuXG4gICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5zbW9vdGhFbmRUaWNrKCkpXG4gIH1cblxuICBpbmVydGlhVGljayAoKSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdGlvbiB9ID0gdGhpc1xuICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGludGVyYWN0aW9uKVxuICAgIGNvbnN0IGxhbWJkYSA9IG9wdGlvbnMucmVzaXN0YW5jZVxuICAgIGNvbnN0IHQgPSAoaW50ZXJhY3Rpb24uX25vdygpIC0gdGhpcy50MCkgLyAxMDAwXG5cbiAgICBpZiAodCA8IHRoaXMudGUpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gIDEgLSAoTWF0aC5leHAoLWxhbWJkYSAqIHQpIC0gdGhpcy5sYW1iZGFfdjApIC8gdGhpcy5vbmVfdmVfdjBcbiAgICAgIGxldCBuZXdPZmZzZXQ6IEludGVyYWN0LlBvaW50XG5cbiAgICAgIGlmICh0aGlzLmlzTW9kaWZpZWQpIHtcbiAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0UXVhZHJhdGljQ3VydmVQb2ludChcbiAgICAgICAgICAwLCAwLFxuICAgICAgICAgIHRoaXMudGFyZ2V0T2Zmc2V0LngsIHRoaXMudGFyZ2V0T2Zmc2V0LnksXG4gICAgICAgICAgdGhpcy5tb2RpZmllZE9mZnNldC54LCB0aGlzLm1vZGlmaWVkT2Zmc2V0LnksXG4gICAgICAgICAgcHJvZ3Jlc3MsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBuZXdPZmZzZXQgPSB7XG4gICAgICAgICAgeDogdGhpcy50YXJnZXRPZmZzZXQueCAqIHByb2dyZXNzLFxuICAgICAgICAgIHk6IHRoaXMudGFyZ2V0T2Zmc2V0LnkgKiBwcm9ncmVzcyxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWx0YSA9IHsgeDogbmV3T2Zmc2V0LnggLSB0aGlzLmN1cnJlbnRPZmZzZXQueCwgeTogbmV3T2Zmc2V0LnkgLSB0aGlzLmN1cnJlbnRPZmZzZXQueSB9XG5cbiAgICAgIHRoaXMuY3VycmVudE9mZnNldC54ICs9IGRlbHRhLnhcbiAgICAgIHRoaXMuY3VycmVudE9mZnNldC55ICs9IGRlbHRhLnlcblxuICAgICAgaW50ZXJhY3Rpb24ub2Zmc2V0QnkoZGVsdGEpXG4gICAgICBpbnRlcmFjdGlvbi5tb3ZlKClcblxuICAgICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5pbmVydGlhVGljaygpKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KHtcbiAgICAgICAgeDogdGhpcy5tb2RpZmllZE9mZnNldC54IC0gdGhpcy5jdXJyZW50T2Zmc2V0LngsXG4gICAgICAgIHk6IHRoaXMubW9kaWZpZWRPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIHNtb290aEVuZFRpY2sgKCkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCB0ID0gaW50ZXJhY3Rpb24uX25vdygpIC0gdGhpcy50MFxuICAgIGNvbnN0IHsgc21vb3RoRW5kRHVyYXRpb246IGR1cmF0aW9uIH0gPSBnZXRPcHRpb25zKGludGVyYWN0aW9uKVxuXG4gICAgaWYgKHQgPCBkdXJhdGlvbikge1xuICAgICAgY29uc3QgbmV3T2Zmc2V0ID0ge1xuICAgICAgICB4OiBlYXNlT3V0UXVhZCh0LCAwLCB0aGlzLnRhcmdldE9mZnNldC54LCBkdXJhdGlvbiksXG4gICAgICAgIHk6IGVhc2VPdXRRdWFkKHQsIDAsIHRoaXMudGFyZ2V0T2Zmc2V0LnksIGR1cmF0aW9uKSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbHRhID0ge1xuICAgICAgICB4OiBuZXdPZmZzZXQueCAtIHRoaXMuY3VycmVudE9mZnNldC54LFxuICAgICAgICB5OiBuZXdPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRPZmZzZXQueCArPSBkZWx0YS54XG4gICAgICB0aGlzLmN1cnJlbnRPZmZzZXQueSArPSBkZWx0YS55XG5cbiAgICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KGRlbHRhKVxuICAgICAgaW50ZXJhY3Rpb24ubW92ZSh7IHNraXBNb2RpZmllcnM6IHRoaXMubW9kaWZpZXJDb3VudCB9KVxuXG4gICAgICB0aGlzLnRpbWVvdXQgPSByYWYucmVxdWVzdCgoKSA9PiB0aGlzLnNtb290aEVuZFRpY2soKSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpbnRlcmFjdGlvbi5vZmZzZXRCeSh7XG4gICAgICAgIHg6IHRoaXMudGFyZ2V0T2Zmc2V0LnggLSB0aGlzLmN1cnJlbnRPZmZzZXQueCxcbiAgICAgICAgeTogdGhpcy50YXJnZXRPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIHJlc3VtZSAoeyBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcblxuICAgIC8vIHVuZG8gaW5lcnRpYSBjaGFuZ2VzIHRvIGludGVyYWN0aW9uIGNvb3Jkc1xuICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KHtcbiAgICAgIHg6IC10aGlzLmN1cnJlbnRPZmZzZXQueCxcbiAgICAgIHk6IC10aGlzLmN1cnJlbnRPZmZzZXQueSxcbiAgICB9KVxuXG4gICAgLy8gdXBkYXRlIHBvaW50ZXIgYXQgcG9pbnRlciBkb3duIHBvc2l0aW9uXG4gICAgaW50ZXJhY3Rpb24udXBkYXRlUG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHRydWUpXG5cbiAgICAvLyBmaXJlIHJlc3VtZSBzaWduYWxzIGFuZCBldmVudFxuICAgIGludGVyYWN0aW9uLl9kb1BoYXNlKHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgZXZlbnQsXG4gICAgICBwaGFzZTogJ3Jlc3VtZScsXG4gICAgfSlcbiAgICBjb3B5Q29vcmRzKGludGVyYWN0aW9uLmNvb3Jkcy5wcmV2LCBpbnRlcmFjdGlvbi5jb29yZHMuY3VyKVxuXG4gICAgdGhpcy5zdG9wKClcbiAgfVxuXG4gIGVuZCAoKSB7XG4gICAgdGhpcy5pbnRlcmFjdGlvbi5tb3ZlKClcbiAgICB0aGlzLmludGVyYWN0aW9uLmVuZCgpXG4gICAgdGhpcy5zdG9wKClcbiAgfVxuXG4gIHN0b3AgKCkge1xuICAgIHRoaXMuYWN0aXZlID0gdGhpcy5zbW9vdGhFbmQgPSBmYWxzZVxuICAgIHRoaXMuaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiA9IG51bGxcbiAgICByYWYuY2FuY2VsKHRoaXMudGltZW91dClcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpbnRlcmFjdGlvbiwgZXZlbnQgfTogSW50ZXJhY3QuRG9QaGFzZUFyZzxJbnRlcmFjdC5BY3Rpb25OYW1lLCAnZW5kJz4pIHtcbiAgaWYgKCFpbnRlcmFjdGlvbi5faW50ZXJhY3RpbmcgfHwgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBzdGFydGVkID0gaW50ZXJhY3Rpb24uaW5lcnRpYS5zdGFydChldmVudClcblxuICAvLyBwcmV2ZW50IGFjdGlvbiBlbmQgaWYgaW5lcnRpYSBvciBzbW9vdGhFbmRcbiAgcmV0dXJuIHN0YXJ0ZWQgPyBmYWxzZSA6IG51bGxcbn1cblxuLy8gQ2hlY2sgaWYgdGhlIGRvd24gZXZlbnQgaGl0cyB0aGUgY3VycmVudCBpbmVydGlhIHRhcmdldFxuLy8gY29udHJvbCBzaG91bGQgYmUgcmV0dXJuIHRvIHRoZSB1c2VyXG5mdW5jdGlvbiByZXN1bWUgKGFyZzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSkge1xuICBjb25zdCB7IGludGVyYWN0aW9uLCBldmVudFRhcmdldCB9ID0gYXJnXG4gIGNvbnN0IHN0YXRlID0gaW50ZXJhY3Rpb24uaW5lcnRpYVxuXG4gIGlmICghc3RhdGUuYWN0aXZlKSB7IHJldHVybiB9XG5cbiAgbGV0IGVsZW1lbnQgPSBldmVudFRhcmdldCBhcyBOb2RlXG5cbiAgLy8gY2xpbWIgdXAgdGhlIERPTSB0cmVlIGZyb20gdGhlIGV2ZW50IHRhcmdldFxuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIGlmIGludGVyYWN0aW9uIGVsZW1lbnQgaXMgdGhlIGN1cnJlbnQgaW5lcnRpYSB0YXJnZXQgZWxlbWVudFxuICAgIGlmIChlbGVtZW50ID09PSBpbnRlcmFjdGlvbi5lbGVtZW50KSB7XG4gICAgICBzdGF0ZS5yZXN1bWUoYXJnKVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZG9tLnBhcmVudE5vZGUoZWxlbWVudClcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wICh7IGludGVyYWN0aW9uIH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgY29uc3Qgc3RhdGUgPSBpbnRlcmFjdGlvbi5pbmVydGlhXG5cbiAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgIHN0YXRlLnN0b3AoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvbnMgKHsgaW50ZXJhY3RhYmxlLCBwcmVwYXJlZCB9OiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICByZXR1cm4gaW50ZXJhY3RhYmxlICYmXG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMgJiZcbiAgICBwcmVwYXJlZC5uYW1lICYmXG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnNbcHJlcGFyZWQubmFtZV0uaW5lcnRpYVxufVxuXG5jb25zdCBpbmVydGlhOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnaW5lcnRpYScsXG4gIGJlZm9yZTogWydtb2RpZmllcnMvYmFzZSddLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmluZXJ0aWEgPSBuZXcgSW5lcnRpYVN0YXRlKGludGVyYWN0aW9uKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogc3RhcnQsXG4gICAgJ2ludGVyYWN0aW9uczpkb3duJzogcmVzdW1lLFxuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IHN0b3AsXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tcmVzdW1lJzogYXJnID0+IHtcbiAgICAgIGNvbnN0IHsgbW9kaWZpY2F0aW9uIH0gPSBhcmcuaW50ZXJhY3Rpb25cblxuICAgICAgbW9kaWZpY2F0aW9uLnN0b3AoYXJnKVxuICAgICAgbW9kaWZpY2F0aW9uLnN0YXJ0KGFyZywgYXJnLmludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZSlcbiAgICAgIG1vZGlmaWNhdGlvbi5hcHBseVRvSW50ZXJhY3Rpb24oYXJnKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24taW5lcnRpYXN0YXJ0JzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uc2V0QW5kQXBwbHkoYXJnKSxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1yZXN1bWUnOiBtb2RpZmllcnMuYWRkRXZlbnRNb2RpZmllcnMsXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24taW5lcnRpYXN0YXJ0JzogbW9kaWZpZXJzLmFkZEV2ZW50TW9kaWZpZXJzLFxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLWluZXJ0aWFzdGFydCc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXJlc3VtZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuICB9LFxufVxuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81NjM0NTI4LzIyODA4ODhcbmZ1bmN0aW9uIF9nZXRRQmV6aWVyVmFsdWUgKHQ6IG51bWJlciwgcDE6IG51bWJlciwgcDI6IG51bWJlciwgcDM6IG51bWJlcikge1xuICBjb25zdCBpVCA9IDEgLSB0XG4gIHJldHVybiBpVCAqIGlUICogcDEgKyAyICogaVQgKiB0ICogcDIgKyB0ICogdCAqIHAzXG59XG5cbmZ1bmN0aW9uIGdldFF1YWRyYXRpY0N1cnZlUG9pbnQgKFxuICBzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIGNwWDogbnVtYmVyLCBjcFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAgX2dldFFCZXppZXJWYWx1ZShwb3NpdGlvbiwgc3RhcnRYLCBjcFgsIGVuZFgpLFxuICAgIHk6ICBfZ2V0UUJlemllclZhbHVlKHBvc2l0aW9uLCBzdGFydFksIGNwWSwgZW5kWSksXG4gIH1cbn1cblxuLy8gaHR0cDovL2dpem1hLmNvbS9lYXNpbmcvXG5mdW5jdGlvbiBlYXNlT3V0UXVhZCAodDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIHQgLz0gZFxuICByZXR1cm4gLWMgKiB0ICogKHQgLSAyKSArIGJcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5lcnRpYVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIG1vZGlmaWVycy9hc3BlY3RSYXRpb1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgZm9yY2VzIGVsZW1lbnRzIHRvIGJlIHJlc2l6ZWQgd2l0aCBhIHNwZWNpZmllZCBkeC9keSByYXRpby5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJhY3QodGFyZ2V0KS5yZXNpemFibGUoe1xuICogICBtb2RpZmllcnM6IFtcbiAqICAgICBpbnRlcmFjdC5tb2RpZmllcnMuc25hcFNpemUoe1xuICogICAgICAgdGFyZ2V0czogWyBpbnRlcmFjdC5jcmVhdGVTbmFwR3JpZCh7IHg6IDIwLCB5OiAyMCB9KSBdLFxuICogICAgIH0pLFxuICogICAgIGludGVyYWN0LmFzcGVjdFJhdGlvKHsgcmF0aW86ICdwcmVzZXJ2ZScgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqL1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCB7IGFkZEVkZ2VzIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmVjdCdcbmltcG9ydCB7IE1vZGlmaWVyLCBNb2RpZmllck1vZHVsZSwgTW9kaWZpZXJTdGF0ZSB9IGZyb20gJy4vYmFzZSdcbmltcG9ydCBNb2RpZmljYXRpb24gZnJvbSAnLi9Nb2RpZmljYXRpb24nXG5pbXBvcnQgeyBtYWtlTW9kaWZpZXIgfSBmcm9tICcuL2Jhc2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNwZWN0UmF0aW9PcHRpb25zIHtcbiAgcmF0aW8/OiBudW1iZXIgfCAncHJlc2VydmUnXG4gIGVxdWFsRGVsdGE/OiBib29sZWFuXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW11cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgQXNwZWN0UmF0aW9TdGF0ZSA9IE1vZGlmaWVyU3RhdGU8QXNwZWN0UmF0aW9PcHRpb25zLCB7XG4gIHN0YXJ0Q29vcmRzOiBJbnRlcmFjdC5Qb2ludFxuICBzdGFydFJlY3Q6IEludGVyYWN0LlJlY3RcbiAgbGlua2VkRWRnZXM6IEludGVyYWN0LkVkZ2VPcHRpb25zXG4gIHJhdGlvOiBudW1iZXJcbiAgZXF1YWxEZWx0YTogYm9vbGVhblxuICB4SXNQcmltYXJ5QXhpczogYm9vbGVhblxuICBlZGdlU2lnbjogMSB8IC0xXG4gIHN1Yk1vZGlmaWNhdGlvbjogTW9kaWZpY2F0aW9uXG59PlxuXG5jb25zdCBhc3BlY3RSYXRpbzogTW9kaWZpZXJNb2R1bGU8QXNwZWN0UmF0aW9PcHRpb25zLCBBc3BlY3RSYXRpb1N0YXRlPiA9IHtcbiAgc3RhcnQgKGFyZykge1xuICAgIGNvbnN0IHsgc3RhdGUsIHJlY3QsIGVkZ2VzOiBvcmlnaW5hbEVkZ2VzLCBwYWdlQ29vcmRzOiBjb29yZHMgfSA9IGFyZ1xuICAgIGxldCB7IHJhdGlvIH0gPSBzdGF0ZS5vcHRpb25zXG4gICAgY29uc3QgeyBlcXVhbERlbHRhLCBtb2RpZmllcnMgfSA9IHN0YXRlLm9wdGlvbnNcblxuICAgIGlmIChyYXRpbyA9PT0gJ3ByZXNlcnZlJykge1xuICAgICAgcmF0aW8gPSByZWN0LndpZHRoIC8gcmVjdC5oZWlnaHRcbiAgICB9XG5cbiAgICBzdGF0ZS5zdGFydENvb3JkcyA9IGV4dGVuZCh7fSwgY29vcmRzKVxuICAgIHN0YXRlLnN0YXJ0UmVjdCA9IGV4dGVuZCh7fSwgcmVjdClcbiAgICBzdGF0ZS5yYXRpbyA9IHJhdGlvXG4gICAgc3RhdGUuZXF1YWxEZWx0YSA9IGVxdWFsRGVsdGFcblxuICAgIGNvbnN0IGxpbmtlZEVkZ2VzID0gc3RhdGUubGlua2VkRWRnZXMgPSB7XG4gICAgICB0b3AgICA6IG9yaWdpbmFsRWRnZXMudG9wICAgIHx8IChvcmlnaW5hbEVkZ2VzLmxlZnQgICAmJiAhb3JpZ2luYWxFZGdlcy5ib3R0b20pLFxuICAgICAgbGVmdCAgOiBvcmlnaW5hbEVkZ2VzLmxlZnQgICB8fCAob3JpZ2luYWxFZGdlcy50b3AgICAgJiYgIW9yaWdpbmFsRWRnZXMucmlnaHQpLFxuICAgICAgYm90dG9tOiBvcmlnaW5hbEVkZ2VzLmJvdHRvbSB8fCAob3JpZ2luYWxFZGdlcy5yaWdodCAgJiYgIW9yaWdpbmFsRWRnZXMudG9wKSxcbiAgICAgIHJpZ2h0IDogb3JpZ2luYWxFZGdlcy5yaWdodCAgfHwgKG9yaWdpbmFsRWRnZXMuYm90dG9tICYmICFvcmlnaW5hbEVkZ2VzLmxlZnQpLFxuICAgIH1cblxuICAgIHN0YXRlLnhJc1ByaW1hcnlBeGlzID0gISEob3JpZ2luYWxFZGdlcy5sZWZ0IHx8IG9yaWdpbmFsRWRnZXMucmlnaHQpXG5cbiAgICBpZiAoc3RhdGUuZXF1YWxEZWx0YSkge1xuICAgICAgc3RhdGUuZWRnZVNpZ24gPSAobGlua2VkRWRnZXMubGVmdCA/IDEgOiAtMSkgKiAobGlua2VkRWRnZXMudG9wID8gMSA6IC0xKSBhcyAxIHwgLTFcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZVNlY29uZGFyeUVkZ2UgPSBzdGF0ZS54SXNQcmltYXJ5QXhpcyA/IGxpbmtlZEVkZ2VzLnRvcCA6IGxpbmtlZEVkZ2VzLmxlZnRcbiAgICAgIHN0YXRlLmVkZ2VTaWduID0gbmVnYXRpdmVTZWNvbmRhcnlFZGdlID8gLTEgOiAxXG4gICAgfVxuXG4gICAgZXh0ZW5kKGFyZy5lZGdlcywgbGlua2VkRWRnZXMpXG5cbiAgICBpZiAoIW1vZGlmaWVycyB8fCAhbW9kaWZpZXJzLmxlbmd0aCkgeyByZXR1cm4gfVxuXG4gICAgY29uc3Qgc3ViTW9kaWZpY2F0aW9uID0gbmV3IE1vZGlmaWNhdGlvbihhcmcuaW50ZXJhY3Rpb24pXG5cbiAgICBzdWJNb2RpZmljYXRpb24uY29weUZyb20oYXJnLmludGVyYWN0aW9uLm1vZGlmaWNhdGlvbilcbiAgICBzdWJNb2RpZmljYXRpb24ucHJlcGFyZVN0YXRlcyhtb2RpZmllcnMpXG5cbiAgICBzdGF0ZS5zdWJNb2RpZmljYXRpb24gPSBzdWJNb2RpZmljYXRpb25cbiAgICBzdWJNb2RpZmljYXRpb24uc3RhcnRBbGwoeyAuLi5hcmcgfSlcbiAgfSxcblxuICBzZXQgKGFyZykge1xuICAgIGNvbnN0IHsgc3RhdGUsIHJlY3QsIGNvb3JkcyB9ID0gYXJnXG4gICAgY29uc3QgaW5pdGlhbENvb3JkcyA9IGV4dGVuZCh7fSwgY29vcmRzKVxuICAgIGNvbnN0IGFzcGVjdE1ldGhvZCA9IHN0YXRlLmVxdWFsRGVsdGEgPyBzZXRFcXVhbERlbHRhIDogc2V0UmF0aW9cblxuICAgIGFzcGVjdE1ldGhvZChzdGF0ZSwgc3RhdGUueElzUHJpbWFyeUF4aXMsIGNvb3JkcywgcmVjdClcblxuICAgIGlmICghc3RhdGUuc3ViTW9kaWZpY2F0aW9uKSB7IHJldHVybiBudWxsIH1cblxuICAgIGNvbnN0IGNvcnJlY3RlZFJlY3QgPSBleHRlbmQoe30sIHJlY3QpXG5cbiAgICBhZGRFZGdlcyhzdGF0ZS5saW5rZWRFZGdlcywgY29ycmVjdGVkUmVjdCwgeyB4OiBjb29yZHMueCAtIGluaXRpYWxDb29yZHMueCwgeTogY29vcmRzLnkgLSBpbml0aWFsQ29vcmRzLnkgfSlcblxuICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLnN1Yk1vZGlmaWNhdGlvbi5zZXRBbGwoe1xuICAgICAgLi4uYXJnLFxuICAgICAgcmVjdDogY29ycmVjdGVkUmVjdCxcbiAgICAgIGVkZ2VzOiBzdGF0ZS5saW5rZWRFZGdlcyxcbiAgICAgIHBhZ2VDb29yZHM6IGNvb3JkcyxcbiAgICAgIHByZXZDb29yZHM6IGNvb3JkcyxcbiAgICAgIHByZXZSZWN0OiBjb3JyZWN0ZWRSZWN0LFxuICAgIH0pXG5cbiAgICBjb25zdCB7IGRlbHRhIH0gPSByZXN1bHRcblxuICAgIGlmIChyZXN1bHQuY2hhbmdlZCkge1xuICAgICAgY29uc3QgeElzQ3JpdGljYWxBeGlzID0gTWF0aC5hYnMoZGVsdGEueCkgPiBNYXRoLmFicyhkZWx0YS55KVxuXG4gICAgICAvLyBkbyBhc3BlY3QgbW9kaWZpY2F0aW9uIGFnYWluIHdpdGggY3JpdGljYWwgZWRnZSBheGlzIGFzIHByaW1hcnlcbiAgICAgIGFzcGVjdE1ldGhvZChzdGF0ZSwgeElzQ3JpdGljYWxBeGlzLCByZXN1bHQuY29vcmRzLCByZXN1bHQucmVjdClcbiAgICAgIGV4dGVuZChjb29yZHMsIHJlc3VsdC5jb29yZHMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5ldmVudFByb3BzXG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICByYXRpbzogJ3ByZXNlcnZlJyxcbiAgICBlcXVhbERlbHRhOiBmYWxzZSxcbiAgICBtb2RpZmllcnM6IFtdLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICB9LFxufVxuXG5mdW5jdGlvbiBzZXRFcXVhbERlbHRhICh7IHN0YXJ0Q29vcmRzLCBlZGdlU2lnbiB9OiBBc3BlY3RSYXRpb1N0YXRlLCB4SXNQcmltYXJ5QXhpczogYm9vbGVhbiwgY29vcmRzOiBJbnRlcmFjdC5Qb2ludCkge1xuICBpZiAoeElzUHJpbWFyeUF4aXMpIHtcbiAgICBjb29yZHMueSA9IHN0YXJ0Q29vcmRzLnkgKyAoY29vcmRzLnggLSBzdGFydENvb3Jkcy54KSAqIGVkZ2VTaWduXG4gIH1cbiAgZWxzZSB7XG4gICAgY29vcmRzLnggPSBzdGFydENvb3Jkcy54ICsgKGNvb3Jkcy55IC0gc3RhcnRDb29yZHMueSkgKiBlZGdlU2lnblxuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJhdGlvICh7IHN0YXJ0UmVjdCwgc3RhcnRDb29yZHMsIHJhdGlvLCBlZGdlU2lnbiB9OiBBc3BlY3RSYXRpb1N0YXRlLCB4SXNQcmltYXJ5QXhpczogYm9vbGVhbiwgY29vcmRzOiBJbnRlcmFjdC5Qb2ludCwgcmVjdDogSW50ZXJhY3QuUmVjdCkge1xuICBpZiAoeElzUHJpbWFyeUF4aXMpIHtcbiAgICBjb25zdCBuZXdIZWlnaHQgPSByZWN0LndpZHRoIC8gcmF0aW9cblxuICAgIGNvb3Jkcy55ID0gc3RhcnRDb29yZHMueSArIChuZXdIZWlnaHQgLSBzdGFydFJlY3QuaGVpZ2h0KSAqIGVkZ2VTaWduXG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc3QgbmV3V2lkdGggPSByZWN0LmhlaWdodCAqIHJhdGlvXG5cbiAgICBjb29yZHMueCA9IHN0YXJ0Q29vcmRzLnggKyAobmV3V2lkdGggLSBzdGFydFJlY3Qud2lkdGgpICogZWRnZVNpZ25cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIoYXNwZWN0UmF0aW8sICdhc3BlY3RSYXRpbycpXG5leHBvcnQgeyBhc3BlY3RSYXRpbyB9XG4iLCJpbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0ICogYXMgcmVjdFV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JlY3QnXG5pbXBvcnQgeyBNb2RpZmllckFyZywgTW9kaWZpZXJNb2R1bGUsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdHJpY3RPcHRpb25zIHtcbiAgLy8gd2hlcmUgdG8gZHJhZyBvdmVyXG4gIHJlc3RyaWN0aW9uOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbbnVtYmVyLCBudW1iZXIsIEludGVyYWN0LkludGVyYWN0aW9uXT5cbiAgLy8gd2hhdCBwYXJ0IG9mIHNlbGYgaXMgYWxsb3dlZCB0byBkcmFnIG92ZXJcbiAgZWxlbWVudFJlY3Q6IEludGVyYWN0LlJlY3RcbiAgb2Zmc2V0OiBJbnRlcmFjdC5SZWN0XG4gIC8vIHJlc3RyaWN0IGp1c3QgYmVmb3JlIHRoZSBlbmQgZHJhZ1xuICBlbmRPbmx5OiBib29sZWFuXG4gIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0U3RhdGUgPSBNb2RpZmllclN0YXRlPFJlc3RyaWN0T3B0aW9ucywge1xuICBvZmZzZXQ6IEludGVyYWN0LlJlY3Rcbn0+XG5cbmZ1bmN0aW9uIHN0YXJ0ICh7IHJlY3QsIHN0YXJ0T2Zmc2V0LCBzdGF0ZSwgaW50ZXJhY3Rpb24sIHBhZ2VDb29yZHMgfTogTW9kaWZpZXJBcmc8UmVzdHJpY3RTdGF0ZT4pIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBjb25zdCB7IGVsZW1lbnRSZWN0IH0gPSBvcHRpb25zXG4gIGNvbnN0IG9mZnNldDogSW50ZXJhY3QuUmVjdCA9IGV4dGVuZCh7XG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICB9LCBvcHRpb25zLm9mZnNldCB8fCB7fSlcblxuICBpZiAocmVjdCAmJiBlbGVtZW50UmVjdCkge1xuICAgIGNvbnN0IHJlc3RyaWN0aW9uID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMucmVzdHJpY3Rpb24sIGludGVyYWN0aW9uLCBwYWdlQ29vcmRzKVxuXG4gICAgaWYgKHJlc3RyaWN0aW9uKSB7XG4gICAgICBjb25zdCB3aWR0aERpZmYgPSAocmVzdHJpY3Rpb24ucmlnaHQgLSByZXN0cmljdGlvbi5sZWZ0KSAtIHJlY3Qud2lkdGhcbiAgICAgIGNvbnN0IGhlaWdodERpZmYgPSAocmVzdHJpY3Rpb24uYm90dG9tIC0gcmVzdHJpY3Rpb24udG9wKSAtIHJlY3QuaGVpZ2h0XG5cbiAgICAgIGlmICh3aWR0aERpZmYgPCAwKSB7XG4gICAgICAgIG9mZnNldC5sZWZ0ICs9IHdpZHRoRGlmZlxuICAgICAgICBvZmZzZXQucmlnaHQgKz0gd2lkdGhEaWZmXG4gICAgICB9XG4gICAgICBpZiAoaGVpZ2h0RGlmZiA8IDApIHtcbiAgICAgICAgb2Zmc2V0LnRvcCArPSBoZWlnaHREaWZmXG4gICAgICAgIG9mZnNldC5ib3R0b20gKz0gaGVpZ2h0RGlmZlxuICAgICAgfVxuICAgIH1cblxuICAgIG9mZnNldC5sZWZ0ICs9IHN0YXJ0T2Zmc2V0LmxlZnQgLSAocmVjdC53aWR0aCAgKiBlbGVtZW50UmVjdC5sZWZ0KVxuICAgIG9mZnNldC50b3AgICs9IHN0YXJ0T2Zmc2V0LnRvcCAgLSAocmVjdC5oZWlnaHQgKiBlbGVtZW50UmVjdC50b3ApXG5cbiAgICBvZmZzZXQucmlnaHQgICs9IHN0YXJ0T2Zmc2V0LnJpZ2h0ICAtIChyZWN0LndpZHRoICAqICgxIC0gZWxlbWVudFJlY3QucmlnaHQpKVxuICAgIG9mZnNldC5ib3R0b20gKz0gc3RhcnRPZmZzZXQuYm90dG9tIC0gKHJlY3QuaGVpZ2h0ICogKDEgLSBlbGVtZW50UmVjdC5ib3R0b20pKVxuICB9XG5cbiAgc3RhdGUub2Zmc2V0ID0gb2Zmc2V0XG59XG5cbmZ1bmN0aW9uIHNldCAoeyBjb29yZHMsIGludGVyYWN0aW9uLCBzdGF0ZSB9OiBNb2RpZmllckFyZzxSZXN0cmljdFN0YXRlPikge1xuICBjb25zdCB7IG9wdGlvbnMsIG9mZnNldCB9ID0gc3RhdGVcblxuICBjb25zdCByZXN0cmljdGlvbiA9IGdldFJlc3RyaWN0aW9uUmVjdChvcHRpb25zLnJlc3RyaWN0aW9uLCBpbnRlcmFjdGlvbiwgY29vcmRzKVxuXG4gIGlmICghcmVzdHJpY3Rpb24pIHsgcmV0dXJuIH1cblxuICBjb25zdCByZWN0ID0gcmVjdFV0aWxzLnh5d2hUb1RsYnIocmVzdHJpY3Rpb24pXG5cbiAgY29vcmRzLnggPSBNYXRoLm1heChNYXRoLm1pbihyZWN0LnJpZ2h0ICAtIG9mZnNldC5yaWdodCwgY29vcmRzLngpLCByZWN0LmxlZnQgKyBvZmZzZXQubGVmdClcbiAgY29vcmRzLnkgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0LmJvdHRvbSAtIG9mZnNldC5ib3R0b20sIGNvb3Jkcy55KSwgcmVjdC50b3AgICsgb2Zmc2V0LnRvcClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc3RyaWN0aW9uUmVjdCAoXG4gIHZhbHVlOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbbnVtYmVyLCBudW1iZXIsIEludGVyYWN0LkludGVyYWN0aW9uXT4sXG4gIGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgY29vcmRzPzogSW50ZXJhY3QuUG9pbnQsXG4pIHtcbiAgaWYgKGlzLmZ1bmModmFsdWUpKSB7XG4gICAgcmV0dXJuIHJlY3RVdGlscy5yZXNvbHZlUmVjdExpa2UodmFsdWUsIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudCwgW2Nvb3Jkcy54LCBjb29yZHMueSwgaW50ZXJhY3Rpb25dKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZWN0VXRpbHMucmVzb2x2ZVJlY3RMaWtlKHZhbHVlLCBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLmVsZW1lbnQpXG4gIH1cbn1cblxuY29uc3QgZGVmYXVsdHM6IFJlc3RyaWN0T3B0aW9ucyA9IHtcbiAgcmVzdHJpY3Rpb246IG51bGwsXG4gIGVsZW1lbnRSZWN0OiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3Q6IE1vZGlmaWVyTW9kdWxlPFJlc3RyaWN0T3B0aW9ucywgUmVzdHJpY3RTdGF0ZT4gPSB7XG4gIHN0YXJ0LFxuICBzZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIocmVzdHJpY3QsICdyZXN0cmljdCcpXG5leHBvcnQgeyByZXN0cmljdCB9XG4iLCIvLyBUaGlzIG1vZHVsZSBhZGRzIHRoZSBvcHRpb25zLnJlc2l6ZS5yZXN0cmljdEVkZ2VzIHNldHRpbmcgd2hpY2ggc2V0cyBtaW4gYW5kXG4vLyBtYXggZm9yIHRoZSB0b3AsIGxlZnQsIGJvdHRvbSBhbmQgcmlnaHQgZWRnZXMgb2YgdGhlIHRhcmdldCBiZWluZyByZXNpemVkLlxuLy9cbi8vIGludGVyYWN0KHRhcmdldCkucmVzaXplKHtcbi8vICAgZWRnZXM6IHsgdG9wOiB0cnVlLCBsZWZ0OiB0cnVlIH0sXG4vLyAgIHJlc3RyaWN0RWRnZXM6IHtcbi8vICAgICBpbm5lcjogeyB0b3A6IDIwMCwgbGVmdDogMjAwLCByaWdodDogNDAwLCBib3R0b206IDQwMCB9LFxuLy8gICAgIG91dGVyOiB7IHRvcDogICAwLCBsZWZ0OiAgIDAsIHJpZ2h0OiA2MDAsIGJvdHRvbTogNjAwIH0sXG4vLyAgIH0sXG4vLyB9KVxuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBnZXRSZXN0cmljdGlvblJlY3QsIFJlc3RyaWN0T3B0aW9ucyB9IGZyb20gJy4vcG9pbnRlcidcblxuZXhwb3J0IGludGVyZmFjZSBSZXN0cmljdEVkZ2VzT3B0aW9ucyB7XG4gIGlubmVyOiBSZXN0cmljdE9wdGlvbnNbJ3Jlc3RyaWN0aW9uJ11cbiAgb3V0ZXI6IFJlc3RyaWN0T3B0aW9uc1sncmVzdHJpY3Rpb24nXVxuICBvZmZzZXQ/OiBSZXN0cmljdE9wdGlvbnNbJ29mZnNldCddXG4gIGVuZE9ubHk6IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgUmVzdHJpY3RFZGdlc1N0YXRlID0gTW9kaWZpZXJTdGF0ZTxSZXN0cmljdEVkZ2VzT3B0aW9ucywge1xuICBpbm5lcjogSW50ZXJhY3QuUmVjdFxuICBvdXRlcjogSW50ZXJhY3QuUmVjdFxuICBvZmZzZXQ6IFJlc3RyaWN0RWRnZXNPcHRpb25zWydvZmZzZXQnXVxufT5cblxuY29uc3Qgbm9Jbm5lciA9IHsgdG9wOiArSW5maW5pdHksIGxlZnQ6ICtJbmZpbml0eSwgYm90dG9tOiAtSW5maW5pdHksIHJpZ2h0OiAtSW5maW5pdHkgfVxuY29uc3Qgbm9PdXRlciA9IHsgdG9wOiAtSW5maW5pdHksIGxlZnQ6IC1JbmZpbml0eSwgYm90dG9tOiArSW5maW5pdHksIHJpZ2h0OiArSW5maW5pdHkgfVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpbnRlcmFjdGlvbiwgc3RhcnRPZmZzZXQsIHN0YXRlIH06IE1vZGlmaWVyQXJnPFJlc3RyaWN0RWRnZXNTdGF0ZT4pIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBsZXQgb2Zmc2V0XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBjb25zdCBvZmZzZXRSZWN0ID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMub2Zmc2V0LCBpbnRlcmFjdGlvbiwgaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UpXG5cbiAgICBvZmZzZXQgPSByZWN0VXRpbHMucmVjdFRvWFkob2Zmc2V0UmVjdClcbiAgfVxuXG4gIG9mZnNldCA9IG9mZnNldCB8fCB7IHg6IDAsIHk6IDAgfVxuXG4gIHN0YXRlLm9mZnNldCA9IHtcbiAgICB0b3A6ICAgIG9mZnNldC55ICsgc3RhcnRPZmZzZXQudG9wLFxuICAgIGxlZnQ6ICAgb2Zmc2V0LnggKyBzdGFydE9mZnNldC5sZWZ0LFxuICAgIGJvdHRvbTogb2Zmc2V0LnkgLSBzdGFydE9mZnNldC5ib3R0b20sXG4gICAgcmlnaHQ6ICBvZmZzZXQueCAtIHN0YXJ0T2Zmc2V0LnJpZ2h0LFxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCAoeyBjb29yZHMsIGVkZ2VzLCBpbnRlcmFjdGlvbiwgc3RhdGUgfTogTW9kaWZpZXJBcmc8UmVzdHJpY3RFZGdlc1N0YXRlPikge1xuICBjb25zdCB7IG9mZnNldCwgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYWdlID0gZXh0ZW5kKHt9LCBjb29yZHMpXG4gIGNvbnN0IGlubmVyID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMuaW5uZXIsIGludGVyYWN0aW9uLCBwYWdlKSB8fCB7fSBhcyBJbnRlcmFjdC5SZWN0XG4gIGNvbnN0IG91dGVyID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMub3V0ZXIsIGludGVyYWN0aW9uLCBwYWdlKSB8fCB7fSBhcyBJbnRlcmFjdC5SZWN0XG5cbiAgZml4UmVjdChpbm5lciwgbm9Jbm5lcilcbiAgZml4UmVjdChvdXRlciwgbm9PdXRlcilcblxuICBpZiAoZWRnZXMudG9wKSB7XG4gICAgY29vcmRzLnkgPSBNYXRoLm1pbihNYXRoLm1heChvdXRlci50b3AgICAgKyBvZmZzZXQudG9wLCAgICBwYWdlLnkpLCBpbm5lci50b3AgICAgKyBvZmZzZXQudG9wKVxuICB9XG4gIGVsc2UgaWYgKGVkZ2VzLmJvdHRvbSkge1xuICAgIGNvb3Jkcy55ID0gTWF0aC5tYXgoTWF0aC5taW4ob3V0ZXIuYm90dG9tICsgb2Zmc2V0LmJvdHRvbSwgcGFnZS55KSwgaW5uZXIuYm90dG9tICsgb2Zmc2V0LmJvdHRvbSlcbiAgfVxuICBpZiAoZWRnZXMubGVmdCkge1xuICAgIGNvb3Jkcy54ID0gTWF0aC5taW4oTWF0aC5tYXgob3V0ZXIubGVmdCAgICsgb2Zmc2V0LmxlZnQsICAgcGFnZS54KSwgaW5uZXIubGVmdCAgICsgb2Zmc2V0LmxlZnQpXG4gIH1cbiAgZWxzZSBpZiAoZWRnZXMucmlnaHQpIHtcbiAgICBjb29yZHMueCA9IE1hdGgubWF4KE1hdGgubWluKG91dGVyLnJpZ2h0ICArIG9mZnNldC5yaWdodCwgIHBhZ2UueCksIGlubmVyLnJpZ2h0ICArIG9mZnNldC5yaWdodClcbiAgfVxufVxuXG5mdW5jdGlvbiBmaXhSZWN0IChyZWN0LCBkZWZhdWx0cykge1xuICBmb3IgKGNvbnN0IGVkZ2Ugb2YgWyd0b3AnLCAnbGVmdCcsICdib3R0b20nLCAncmlnaHQnXSkge1xuICAgIGlmICghKGVkZ2UgaW4gcmVjdCkpIHtcbiAgICAgIHJlY3RbZWRnZV0gPSBkZWZhdWx0c1tlZGdlXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWN0XG59XG5cbmNvbnN0IGRlZmF1bHRzOiBSZXN0cmljdEVkZ2VzT3B0aW9ucyA9IHtcbiAgaW5uZXI6IG51bGwsXG4gIG91dGVyOiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3RFZGdlcyA9IHtcbiAgbm9Jbm5lcixcbiAgbm9PdXRlcixcbiAgc3RhcnQsXG4gIHNldCxcbiAgZGVmYXVsdHMsXG59XG5cbmV4cG9ydCBkZWZhdWx0IG1ha2VNb2RpZmllcihyZXN0cmljdEVkZ2VzLCAncmVzdHJpY3RFZGdlcycpXG5leHBvcnQgeyByZXN0cmljdEVkZ2VzIH1cbiIsImltcG9ydCBleHRlbmQgZnJvbSAnLi4vLi4vdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IHsgcmVzdHJpY3QgfSBmcm9tICcuL3BvaW50ZXInXG5pbXBvcnQgeyBtYWtlTW9kaWZpZXIgfSBmcm9tICcuLi9iYXNlJ1xuXG5jb25zdCBkZWZhdWx0cyA9IGV4dGVuZCh7XG4gIGdldCBlbGVtZW50UmVjdCAoKSB7XG4gICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IDEsIHJpZ2h0OiAxIH1cbiAgfSxcbiAgc2V0IGVsZW1lbnRSZWN0IChfKSB7fSxcbn0sIHJlc3RyaWN0LmRlZmF1bHRzKVxuXG5jb25zdCByZXN0cmljdFJlY3QgPSB7XG4gIHN0YXJ0OiByZXN0cmljdC5zdGFydCxcbiAgc2V0OiByZXN0cmljdC5zZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIocmVzdHJpY3RSZWN0LCAncmVzdHJpY3RSZWN0JylcbmV4cG9ydCB7IHJlc3RyaWN0UmVjdCB9XG4iLCJpbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBSZXN0cmljdEVkZ2VzU3RhdGUsIHJlc3RyaWN0RWRnZXMgfSBmcm9tICcuL2VkZ2VzJ1xuaW1wb3J0IHsgZ2V0UmVzdHJpY3Rpb25SZWN0LCBSZXN0cmljdE9wdGlvbnMgfSBmcm9tICcuL3BvaW50ZXInXG5cbmNvbnN0IG5vTWluID0geyB3aWR0aDogLUluZmluaXR5LCBoZWlnaHQ6IC1JbmZpbml0eSB9XG5jb25zdCBub01heCA9IHsgd2lkdGg6ICtJbmZpbml0eSwgaGVpZ2h0OiArSW5maW5pdHkgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RyaWN0U2l6ZU9wdGlvbnMge1xuICBtaW4/OiBJbnRlcmFjdC5TaXplIHwgSW50ZXJhY3QuUG9pbnQgfCBSZXN0cmljdE9wdGlvbnNbJ3Jlc3RyaWN0aW9uJ11cbiAgbWF4PzogSW50ZXJhY3QuU2l6ZSB8IEludGVyYWN0LlBvaW50IHwgUmVzdHJpY3RPcHRpb25zWydyZXN0cmljdGlvbiddXG4gIGVuZE9ubHk6IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gc3RhcnQgKGFyZzogTW9kaWZpZXJBcmc8UmVzdHJpY3RFZGdlc1N0YXRlPikge1xuICByZXR1cm4gcmVzdHJpY3RFZGdlcy5zdGFydChhcmcpXG59XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0U2l6ZVN0YXRlID1cbiAgUmVzdHJpY3RFZGdlc1N0YXRlICYgTW9kaWZpZXJTdGF0ZTxSZXN0cmljdFNpemVPcHRpb25zICYgeyBpbm5lcjogSW50ZXJhY3QuUmVjdCwgb3V0ZXI6IEludGVyYWN0LlJlY3QgfSwge1xuICAgIG1pbjogSW50ZXJhY3QuUmVjdFxuICAgIG1heDogSW50ZXJhY3QuUmVjdFxuICB9PlxuXG5mdW5jdGlvbiBzZXQgKGFyZzogTW9kaWZpZXJBcmc8UmVzdHJpY3RTaXplU3RhdGU+KSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIHN0YXRlLCByZWN0LCBlZGdlcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtaW5TaXplID0gcmVjdFV0aWxzLnRsYnJUb1h5d2goZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMubWluIGFzIGFueSwgaW50ZXJhY3Rpb24sIGFyZy5jb29yZHMpKSB8fCBub01pblxuICBjb25zdCBtYXhTaXplID0gcmVjdFV0aWxzLnRsYnJUb1h5d2goZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMubWF4IGFzIGFueSwgaW50ZXJhY3Rpb24sIGFyZy5jb29yZHMpKSB8fCBub01heFxuXG4gIHN0YXRlLm9wdGlvbnMgPSB7XG4gICAgZW5kT25seTogb3B0aW9ucy5lbmRPbmx5LFxuICAgIGlubmVyOiBleHRlbmQoe30sIHJlc3RyaWN0RWRnZXMubm9Jbm5lciksXG4gICAgb3V0ZXI6IGV4dGVuZCh7fSwgcmVzdHJpY3RFZGdlcy5ub091dGVyKSxcbiAgfVxuXG4gIGlmIChlZGdlcy50b3ApIHtcbiAgICBzdGF0ZS5vcHRpb25zLmlubmVyLnRvcCA9IHJlY3QuYm90dG9tIC0gbWluU2l6ZS5oZWlnaHRcbiAgICBzdGF0ZS5vcHRpb25zLm91dGVyLnRvcCA9IHJlY3QuYm90dG9tIC0gbWF4U2l6ZS5oZWlnaHRcbiAgfVxuICBlbHNlIGlmIChlZGdlcy5ib3R0b20pIHtcbiAgICBzdGF0ZS5vcHRpb25zLmlubmVyLmJvdHRvbSA9IHJlY3QudG9wICsgbWluU2l6ZS5oZWlnaHRcbiAgICBzdGF0ZS5vcHRpb25zLm91dGVyLmJvdHRvbSA9IHJlY3QudG9wICsgbWF4U2l6ZS5oZWlnaHRcbiAgfVxuICBpZiAoZWRnZXMubGVmdCkge1xuICAgIHN0YXRlLm9wdGlvbnMuaW5uZXIubGVmdCA9IHJlY3QucmlnaHQgLSBtaW5TaXplLndpZHRoXG4gICAgc3RhdGUub3B0aW9ucy5vdXRlci5sZWZ0ID0gcmVjdC5yaWdodCAtIG1heFNpemUud2lkdGhcbiAgfVxuICBlbHNlIGlmIChlZGdlcy5yaWdodCkge1xuICAgIHN0YXRlLm9wdGlvbnMuaW5uZXIucmlnaHQgPSByZWN0LmxlZnQgKyBtaW5TaXplLndpZHRoXG4gICAgc3RhdGUub3B0aW9ucy5vdXRlci5yaWdodCA9IHJlY3QubGVmdCArIG1heFNpemUud2lkdGhcbiAgfVxuXG4gIHJlc3RyaWN0RWRnZXMuc2V0KGFyZylcblxuICBzdGF0ZS5vcHRpb25zID0gb3B0aW9uc1xufVxuXG5jb25zdCBkZWZhdWx0czogUmVzdHJpY3RTaXplT3B0aW9ucyA9IHtcbiAgbWluOiBudWxsLFxuICBtYXg6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3RTaXplID0ge1xuICBzdGFydCxcbiAgc2V0LFxuICBkZWZhdWx0cyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHJlc3RyaWN0U2l6ZSwgJ3Jlc3RyaWN0U2l6ZScpXG5leHBvcnQgeyByZXN0cmljdFNpemUgfVxuIiwiaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaW5kZXgnXG5pbXBvcnQgeyBNb2RpZmllckFyZywgTW9kaWZpZXJTdGF0ZSwgbWFrZU1vZGlmaWVyIH0gZnJvbSAnLi4vYmFzZSdcblxuZXhwb3J0IGludGVyZmFjZSBPZmZzZXQge1xuICB4OiBudW1iZXJcbiAgeTogbnVtYmVyXG4gIGluZGV4OiBudW1iZXJcbiAgcmVsYXRpdmVQb2ludD86IEludGVyYWN0LlBvaW50XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU25hcFBvc2l0aW9uIHtcbiAgeD86IG51bWJlclxuICB5PzogbnVtYmVyXG4gIHJhbmdlPzogbnVtYmVyXG4gIG9mZnNldD86IE9mZnNldFxuICBbaW5kZXg6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgdHlwZSBTbmFwRnVuY3Rpb24gPSAoXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sXG4gIG9mZnNldDogT2Zmc2V0LFxuICBpbmRleDogbnVtYmVyXG4pID0+IFNuYXBQb3NpdGlvblxuZXhwb3J0IHR5cGUgU25hcFRhcmdldCA9IFNuYXBQb3NpdGlvbiB8IFNuYXBGdW5jdGlvblxuZXhwb3J0IGludGVyZmFjZSBTbmFwT3B0aW9ucyB7XG4gIHRhcmdldHM6IFNuYXBUYXJnZXRbXVxuICAvLyB0YXJnZXQgcmFuZ2VcbiAgcmFuZ2U6IG51bWJlclxuICAvLyBzZWxmIHBvaW50cyBmb3Igc25hcHBpbmcuIFswLDBdID0gdG9wIGxlZnQsIFsxLDFdID0gYm90dG9tIHJpZ2h0XG4gIHJlbGF0aXZlUG9pbnRzOiBJbnRlcmFjdC5Qb2ludFtdXG4gIC8vIHN0YXJ0Q29vcmRzID0gb2Zmc2V0IHNuYXBwaW5nIGZyb20gZHJhZyBzdGFydCBwYWdlIHBvc2l0aW9uXG4gIG9mZnNldDogSW50ZXJhY3QuUG9pbnQgfCBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbSW50ZXJhY3QuSW50ZXJhY3Rpb25dPiB8ICdzdGFydENvb3JkcydcbiAgb2Zmc2V0V2l0aE9yaWdpbj86IGJvb2xlYW5cbiAgb3JpZ2luOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbSW50ZXJhY3QuRWxlbWVudF0+IHwgSW50ZXJhY3QuUG9pbnRcbiAgZW5kT25seT86IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgU25hcFN0YXRlID0gTW9kaWZpZXJTdGF0ZTxTbmFwT3B0aW9ucywge1xuICBvZmZzZXRzPzogT2Zmc2V0W11cbiAgY2xvc2VzdD86IGFueVxuICB0YXJnZXRGaWVsZHM/OiBzdHJpbmdbXVtdXG59PlxuXG5mdW5jdGlvbiBzdGFydCAoYXJnOiBNb2RpZmllckFyZzxTbmFwU3RhdGU+KSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgcmVjdCwgc3RhdGUsIHN0YXJ0T2Zmc2V0IH0gPSBhcmdcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBjb25zdCBvcmlnaW4gPSBvcHRpb25zLm9mZnNldFdpdGhPcmlnaW5cbiAgICA/IGdldE9yaWdpbihhcmcpXG4gICAgOiB7IHg6IDAsIHk6IDAgfVxuXG4gIGxldCBzbmFwT2Zmc2V0OiBJbnRlcmFjdC5Qb2ludFxuXG4gIGlmIChvcHRpb25zLm9mZnNldCA9PT0gJ3N0YXJ0Q29vcmRzJykge1xuICAgIHNuYXBPZmZzZXQgPSB7XG4gICAgICB4OiBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQucGFnZS54LFxuICAgICAgeTogaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueSxcbiAgICB9XG4gIH1cbiAgZWxzZSAge1xuICAgIGNvbnN0IG9mZnNldFJlY3QgPSB1dGlscy5yZWN0LnJlc29sdmVSZWN0TGlrZShvcHRpb25zLm9mZnNldCBhcyBhbnksIGludGVyYWN0YWJsZSwgZWxlbWVudCwgW2ludGVyYWN0aW9uXSlcblxuICAgIHNuYXBPZmZzZXQgPSB1dGlscy5yZWN0LnJlY3RUb1hZKG9mZnNldFJlY3QpIHx8IHsgeDogMCwgeTogMCB9XG4gICAgc25hcE9mZnNldC54ICs9IG9yaWdpbi54XG4gICAgc25hcE9mZnNldC55ICs9IG9yaWdpbi55XG4gIH1cblxuICBjb25zdCB7IHJlbGF0aXZlUG9pbnRzIH0gPSBvcHRpb25zXG5cbiAgc3RhdGUub2Zmc2V0cyA9IHJlY3QgJiYgcmVsYXRpdmVQb2ludHMgJiYgcmVsYXRpdmVQb2ludHMubGVuZ3RoXG4gICAgPyAgcmVsYXRpdmVQb2ludHMubWFwKChyZWxhdGl2ZVBvaW50LCBpbmRleCkgPT4gKHtcbiAgICAgIGluZGV4LFxuICAgICAgcmVsYXRpdmVQb2ludCxcbiAgICAgIHg6IHN0YXJ0T2Zmc2V0LmxlZnQgLSAocmVjdC53aWR0aCAgKiByZWxhdGl2ZVBvaW50LngpICsgc25hcE9mZnNldC54LFxuICAgICAgeTogc3RhcnRPZmZzZXQudG9wICAtIChyZWN0LmhlaWdodCAqIHJlbGF0aXZlUG9pbnQueSkgKyBzbmFwT2Zmc2V0LnksXG4gICAgfSkpXG4gICAgOiBbdXRpbHMuZXh0ZW5kKHtcbiAgICAgIGluZGV4OiAwLFxuICAgICAgcmVsYXRpdmVQb2ludDogbnVsbCxcbiAgICB9LCBzbmFwT2Zmc2V0KV1cbn1cblxuZnVuY3Rpb24gc2V0IChhcmc6IE1vZGlmaWVyQXJnPFNuYXBTdGF0ZT4pIHtcbiAgY29uc3QgeyBpbnRlcmFjdGlvbiwgY29vcmRzLCBzdGF0ZSB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucywgb2Zmc2V0cyB9ID0gc3RhdGVcblxuICBjb25zdCBvcmlnaW4gPSB1dGlscy5nZXRPcmlnaW5YWShpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLmVsZW1lbnQsIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpXG4gIGNvbnN0IHBhZ2UgPSB1dGlscy5leHRlbmQoe30sIGNvb3JkcylcbiAgY29uc3QgdGFyZ2V0cyA9IFtdXG5cbiAgaWYgKCFvcHRpb25zLm9mZnNldFdpdGhPcmlnaW4pIHtcbiAgICBwYWdlLnggLT0gb3JpZ2luLnhcbiAgICBwYWdlLnkgLT0gb3JpZ2luLnlcbiAgfVxuXG4gIGZvciAoY29uc3Qgb2Zmc2V0IG9mIG9mZnNldHMpIHtcbiAgICBjb25zdCByZWxhdGl2ZVggPSBwYWdlLnggLSBvZmZzZXQueFxuICAgIGNvbnN0IHJlbGF0aXZlWSA9IHBhZ2UueSAtIG9mZnNldC55XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDAsIGxlbiA9IG9wdGlvbnMudGFyZ2V0cy5sZW5ndGg7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzbmFwVGFyZ2V0ID0gb3B0aW9ucy50YXJnZXRzW2luZGV4XVxuICAgICAgbGV0IHRhcmdldFxuXG4gICAgICBpZiAodXRpbHMuaXMuZnVuYyhzbmFwVGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0KHJlbGF0aXZlWCwgcmVsYXRpdmVZLCBpbnRlcmFjdGlvbiwgb2Zmc2V0LCBpbmRleClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0XG4gICAgICB9XG5cbiAgICAgIGlmICghdGFyZ2V0KSB7IGNvbnRpbnVlIH1cblxuICAgICAgdGFyZ2V0cy5wdXNoKHtcbiAgICAgICAgeDogKHV0aWxzLmlzLm51bWJlcih0YXJnZXQueCkgPyB0YXJnZXQueCA6IHJlbGF0aXZlWCkgKyBvZmZzZXQueCxcbiAgICAgICAgeTogKHV0aWxzLmlzLm51bWJlcih0YXJnZXQueSkgPyB0YXJnZXQueSA6IHJlbGF0aXZlWSkgKyBvZmZzZXQueSxcblxuICAgICAgICByYW5nZTogdXRpbHMuaXMubnVtYmVyKHRhcmdldC5yYW5nZSkgPyB0YXJnZXQucmFuZ2UgOiBvcHRpb25zLnJhbmdlLFxuICAgICAgICBzb3VyY2U6IHNuYXBUYXJnZXQsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBvZmZzZXQsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNsb3Nlc3QgPSB7XG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIGluUmFuZ2U6IGZhbHNlLFxuICAgIGRpc3RhbmNlOiAwLFxuICAgIHJhbmdlOiAwLFxuICAgIGRlbHRhOiB7IHg6IDAsIHk6IDAgfSxcbiAgfVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCByYW5nZSA9IHRhcmdldC5yYW5nZVxuICAgIGNvbnN0IGR4ID0gdGFyZ2V0LnggLSBwYWdlLnhcbiAgICBjb25zdCBkeSA9IHRhcmdldC55IC0gcGFnZS55XG4gICAgY29uc3QgZGlzdGFuY2UgPSB1dGlscy5oeXBvdChkeCwgZHkpXG4gICAgbGV0IGluUmFuZ2UgPSBkaXN0YW5jZSA8PSByYW5nZVxuXG4gICAgLy8gSW5maW5pdGUgdGFyZ2V0cyBjb3VudCBhcyBiZWluZyBvdXQgb2YgcmFuZ2VcbiAgICAvLyBjb21wYXJlZCB0byBub24gaW5maW5pdGUgb25lcyB0aGF0IGFyZSBpbiByYW5nZVxuICAgIGlmIChyYW5nZSA9PT0gSW5maW5pdHkgJiYgY2xvc2VzdC5pblJhbmdlICYmIGNsb3Nlc3QucmFuZ2UgIT09IEluZmluaXR5KSB7XG4gICAgICBpblJhbmdlID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIWNsb3Nlc3QudGFyZ2V0IHx8IChpblJhbmdlXG4gICAgICAvLyBpcyB0aGUgY2xvc2VzdCB0YXJnZXQgaW4gcmFuZ2U/XG4gICAgICA/IChjbG9zZXN0LmluUmFuZ2UgJiYgcmFuZ2UgIT09IEluZmluaXR5XG4gICAgICAgIC8vIHRoZSBwb2ludGVyIGlzIHJlbGF0aXZlbHkgZGVlcGVyIGluIHRoaXMgdGFyZ2V0XG4gICAgICAgID8gZGlzdGFuY2UgLyByYW5nZSA8IGNsb3Nlc3QuZGlzdGFuY2UgLyBjbG9zZXN0LnJhbmdlXG4gICAgICAgIC8vIHRoaXMgdGFyZ2V0IGhhcyBJbmZpbml0ZSByYW5nZSBhbmQgdGhlIGNsb3Nlc3QgZG9lc24ndFxuICAgICAgICA6IChyYW5nZSA9PT0gSW5maW5pdHkgJiYgY2xvc2VzdC5yYW5nZSAhPT0gSW5maW5pdHkpIHx8XG4gICAgICAgICAgLy8gT1IgdGhpcyB0YXJnZXQgaXMgY2xvc2VyIHRoYXQgdGhlIHByZXZpb3VzIGNsb3Nlc3RcbiAgICAgICAgICBkaXN0YW5jZSA8IGNsb3Nlc3QuZGlzdGFuY2UpXG4gICAgICAvLyBUaGUgb3RoZXIgaXMgbm90IGluIHJhbmdlIGFuZCB0aGUgcG9pbnRlciBpcyBjbG9zZXIgdG8gdGhpcyB0YXJnZXRcbiAgICAgIDogKCFjbG9zZXN0LmluUmFuZ2UgJiYgZGlzdGFuY2UgPCBjbG9zZXN0LmRpc3RhbmNlKSkpIHtcbiAgICAgIGNsb3Nlc3QudGFyZ2V0ID0gdGFyZ2V0XG4gICAgICBjbG9zZXN0LmRpc3RhbmNlID0gZGlzdGFuY2VcbiAgICAgIGNsb3Nlc3QucmFuZ2UgPSByYW5nZVxuICAgICAgY2xvc2VzdC5pblJhbmdlID0gaW5SYW5nZVxuICAgICAgY2xvc2VzdC5kZWx0YS54ID0gZHhcbiAgICAgIGNsb3Nlc3QuZGVsdGEueSA9IGR5XG4gICAgfVxuICB9XG5cbiAgaWYgKGNsb3Nlc3QuaW5SYW5nZSkge1xuICAgIGNvb3Jkcy54ID0gY2xvc2VzdC50YXJnZXQueFxuICAgIGNvb3Jkcy55ID0gY2xvc2VzdC50YXJnZXQueVxuICB9XG5cbiAgc3RhdGUuY2xvc2VzdCA9IGNsb3Nlc3RcbiAgcmV0dXJuIGNsb3Nlc3Rcbn1cblxuZnVuY3Rpb24gZ2V0T3JpZ2luIChhcmc6IFBhcnRpYWw8TW9kaWZpZXJBcmc8U25hcFN0YXRlPj4pIHtcbiAgY29uc3QgeyBlbGVtZW50IH0gPSBhcmcuaW50ZXJhY3Rpb25cbiAgY29uc3Qgb3B0aW9uc09yaWdpbiA9IHV0aWxzLnJlY3QucmVjdFRvWFkoXG4gICAgdXRpbHMucmVjdC5yZXNvbHZlUmVjdExpa2UoYXJnLnN0YXRlLm9wdGlvbnMub3JpZ2luIGFzIGFueSwgbnVsbCwgbnVsbCwgW2VsZW1lbnRdKSxcbiAgKVxuICBjb25zdCBvcmlnaW4gPSBvcHRpb25zT3JpZ2luIHx8IHV0aWxzLmdldE9yaWdpblhZKFxuICAgIGFyZy5pbnRlcmFjdGFibGUsXG4gICAgZWxlbWVudCxcbiAgICBhcmcuaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSxcbiAgKVxuXG4gIHJldHVybiBvcmlnaW5cbn1cblxuY29uc3QgZGVmYXVsdHM6IFNuYXBPcHRpb25zID0ge1xuICByYW5nZSAgOiBJbmZpbml0eSxcbiAgdGFyZ2V0czogbnVsbCxcbiAgb2Zmc2V0OiBudWxsLFxuICBvZmZzZXRXaXRoT3JpZ2luOiB0cnVlLFxuICBvcmlnaW46IG51bGwsXG4gIHJlbGF0aXZlUG9pbnRzOiBudWxsLFxuICBlbmRPbmx5OiBmYWxzZSxcbiAgZW5hYmxlZDogZmFsc2UsXG59XG5jb25zdCBzbmFwID0ge1xuICBzdGFydCxcbiAgc2V0LFxuICBkZWZhdWx0cyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHNuYXAsICdzbmFwJylcbmV4cG9ydCB7IHNuYXAgfVxuIiwiLy8gVGhpcyBtb2R1bGUgYWxsb3dzIHNuYXBwaW5nIG9mIHRoZSBzaXplIG9mIHRhcmdldHMgZHVyaW5nIHJlc2l6ZVxuLy8gaW50ZXJhY3Rpb25zLlxuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBTbmFwT3B0aW9ucywgU25hcFN0YXRlLCBzbmFwIH0gZnJvbSAnLi9wb2ludGVyJ1xuXG5leHBvcnQgdHlwZSBTbmFwU2l6ZU9wdGlvbnMgPSBQaWNrPFxuU25hcE9wdGlvbnMsXG4ndGFyZ2V0cycgfCAnb2Zmc2V0JyB8ICdlbmRPbmx5JyB8ICdyYW5nZScgfCAnZW5hYmxlZCdcbj5cblxuZnVuY3Rpb24gc3RhcnQgKGFyZzogTW9kaWZpZXJBcmc8U25hcFN0YXRlPikge1xuICBjb25zdCB7IHN0YXRlLCBlZGdlcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7IHJldHVybiBudWxsIH1cblxuICBhcmcuc3RhdGUgPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgdGFyZ2V0czogbnVsbCxcbiAgICAgIHJlbGF0aXZlUG9pbnRzOiBbe1xuICAgICAgICB4OiBlZGdlcy5sZWZ0ID8gMCA6IDEsXG4gICAgICAgIHk6IGVkZ2VzLnRvcCA/IDAgOiAxLFxuICAgICAgfV0sXG4gICAgICBvZmZzZXQ6IG9wdGlvbnMub2Zmc2V0IHx8ICdzZWxmJyxcbiAgICAgIG9yaWdpbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICByYW5nZTogb3B0aW9ucy5yYW5nZSxcbiAgICB9LFxuICB9XG5cbiAgc3RhdGUudGFyZ2V0RmllbGRzID0gc3RhdGUudGFyZ2V0RmllbGRzIHx8IFtcbiAgICBbJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgIFsneCcsICd5J10sXG4gIF1cblxuICBzbmFwLnN0YXJ0KGFyZylcbiAgc3RhdGUub2Zmc2V0cyA9IGFyZy5zdGF0ZS5vZmZzZXRzXG5cbiAgYXJnLnN0YXRlID0gc3RhdGVcbn1cblxuZnVuY3Rpb24gc2V0IChhcmcpIHtcbiAgY29uc3QgeyBpbnRlcmFjdGlvbiwgc3RhdGUsIGNvb3JkcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucywgb2Zmc2V0cyB9ID0gc3RhdGVcbiAgY29uc3QgcmVsYXRpdmUgPSB7XG4gICAgeDogY29vcmRzLnggLSBvZmZzZXRzWzBdLngsXG4gICAgeTogY29vcmRzLnkgLSBvZmZzZXRzWzBdLnksXG4gIH1cblxuICBzdGF0ZS5vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKVxuICBzdGF0ZS5vcHRpb25zLnRhcmdldHMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc25hcFRhcmdldCBvZiAob3B0aW9ucy50YXJnZXRzIHx8IFtdKSkge1xuICAgIGxldCB0YXJnZXRcblxuICAgIGlmIChpcy5mdW5jKHNuYXBUYXJnZXQpKSB7XG4gICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0KHJlbGF0aXZlLngsIHJlbGF0aXZlLnksIGludGVyYWN0aW9uKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRhcmdldCA9IHNuYXBUYXJnZXRcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCkgeyBjb250aW51ZSB9XG5cbiAgICBmb3IgKGNvbnN0IFt4RmllbGQsIHlGaWVsZF0gb2Ygc3RhdGUudGFyZ2V0RmllbGRzKSB7XG4gICAgICBpZiAoeEZpZWxkIGluIHRhcmdldCB8fCB5RmllbGQgaW4gdGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC54ID0gdGFyZ2V0W3hGaWVsZF1cbiAgICAgICAgdGFyZ2V0LnkgPSB0YXJnZXRbeUZpZWxkXVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGUub3B0aW9ucy50YXJnZXRzLnB1c2godGFyZ2V0KVxuICB9XG5cbiAgY29uc3QgcmV0dXJuVmFsdWUgPSBzbmFwLnNldChhcmcpXG5cbiAgc3RhdGUub3B0aW9ucyA9IG9wdGlvbnNcblxuICByZXR1cm4gcmV0dXJuVmFsdWVcbn1cblxuY29uc3QgZGVmYXVsdHM6IFNuYXBTaXplT3B0aW9ucyA9IHtcbiAgcmFuZ2U6IEluZmluaXR5LFxuICB0YXJnZXRzOiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3Qgc25hcFNpemUgPSB7XG4gIHN0YXJ0LFxuICBzZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIoc25hcFNpemUsICdzbmFwU2l6ZScpXG5leHBvcnQgeyBzbmFwU2l6ZSB9XG4iLCIvKipcbiAqIEBtb2R1bGUgbW9kaWZpZXJzL3NuYXBFZGdlc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgYWxsb3dzIHNuYXBwaW5nIG9mIHRoZSBlZGdlcyBvZiB0YXJnZXRzIGR1cmluZyByZXNpemVcbiAqIGludGVyYWN0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJhY3QodGFyZ2V0KS5yZXNpemFibGUoe1xuICogICBzbmFwRWRnZXM6IHtcbiAqICAgICB0YXJnZXRzOiBbaW50ZXJhY3Quc25hcHBlcnMuZ3JpZCh7IHg6IDEwMCwgeTogNTAgfSldLFxuICogICB9LFxuICogfSlcbiAqXG4gKiBpbnRlcmFjdCh0YXJnZXQpLnJlc2l6YWJsZSh7XG4gKiAgIHNuYXBFZGdlczoge1xuICogICAgIHRhcmdldHM6IFtcbiAqICAgICAgIGludGVyYWN0LnNuYXBwZXJzLmdyaWQoe1xuICogICAgICAgIHRvcDogNTAsXG4gKiAgICAgICAgbGVmdDogNTAsXG4gKiAgICAgICAgYm90dG9tOiAxMDAsXG4gKiAgICAgICAgcmlnaHQ6IDEwMCxcbiAqICAgICAgIH0pLFxuICogICAgIF0sXG4gKiAgIH0sXG4gKiB9KVxuICovXG5cbmltcG9ydCBjbG9uZSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9jbG9uZSdcbmltcG9ydCBleHRlbmQgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyTW9kdWxlLCBtYWtlTW9kaWZpZXIgfSBmcm9tICcuLi9iYXNlJ1xuaW1wb3J0IHsgU25hcE9wdGlvbnMsIFNuYXBTdGF0ZSB9IGZyb20gJy4vcG9pbnRlcidcbmltcG9ydCB7IHNuYXBTaXplIH0gZnJvbSAnLi9zaXplJ1xuXG5leHBvcnQgdHlwZSBTbmFwRWRnZXNPcHRpb25zID0gUGljazxTbmFwT3B0aW9ucywgJ3RhcmdldHMnIHwgJ3JhbmdlJyB8ICdvZmZzZXQnIHwgJ2VuZE9ubHknIHwgJ2VuYWJsZWQnPlxuXG5mdW5jdGlvbiBzdGFydCAoYXJnOiBNb2RpZmllckFyZzxTbmFwU3RhdGU+KSB7XG4gIGNvbnN0IHsgZWRnZXMgfSA9IGFyZ1xuXG4gIGlmICghZWRnZXMpIHsgcmV0dXJuIG51bGwgfVxuXG4gIGFyZy5zdGF0ZS50YXJnZXRGaWVsZHMgPSBhcmcuc3RhdGUudGFyZ2V0RmllbGRzIHx8IFtcbiAgICBbZWRnZXMubGVmdCA/ICdsZWZ0JyA6ICdyaWdodCcsIGVkZ2VzLnRvcCA/ICd0b3AnIDogJ2JvdHRvbSddLFxuICBdXG5cbiAgcmV0dXJuIHNuYXBTaXplLnN0YXJ0KGFyZylcbn1cblxuY29uc3Qgc25hcEVkZ2VzOiBNb2RpZmllck1vZHVsZTxTbmFwRWRnZXNPcHRpb25zLCBTbmFwU3RhdGU+ID0ge1xuICBzdGFydCxcbiAgc2V0OiBzbmFwU2l6ZS5zZXQsXG4gIGRlZmF1bHRzOiBleHRlbmQoXG4gICAgY2xvbmUoc25hcFNpemUuZGVmYXVsdHMpLFxuICAgIHtcbiAgICAgIHRhcmdldHM6IG51bGwsXG4gICAgICByYW5nZTogbnVsbCxcbiAgICAgIG9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gICAgfSBhcyBjb25zdCxcbiAgKSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHNuYXBFZGdlcywgJ3NuYXBFZGdlcycpXG5leHBvcnQgeyBzbmFwRWRnZXMgfVxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3BlY3RSYXRpbyB9IGZyb20gJy4vYXNwZWN0UmF0aW8nXG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlc3RyaWN0RWRnZXMgfSBmcm9tICcuL3Jlc3RyaWN0L2VkZ2VzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXN0cmljdCB9IGZyb20gJy4vcmVzdHJpY3QvcG9pbnRlcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVzdHJpY3RSZWN0IH0gZnJvbSAnLi9yZXN0cmljdC9yZWN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXN0cmljdFNpemUgfSBmcm9tICcuL3Jlc3RyaWN0L3NpemUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHNuYXBFZGdlcyB9IGZyb20gJy4vc25hcC9lZGdlcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc25hcCB9IGZyb20gJy4vc25hcC9wb2ludGVyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzbmFwU2l6ZSB9IGZyb20gJy4vc25hcC9zaXplJ1xuIiwiZnVuY3Rpb24gY3JlYXRlR3JpZCAoZ3JpZDogKFBhcnRpYWw8SW50ZXJhY3QuUmVjdD4gfCBJbnRlcmFjdC5Qb2ludCkgJiB7IHJhbmdlPzogbnVtYmVyLCBsaW1pdHM/OiBJbnRlcmFjdC5SZWN0LCBvZmZzZXQ/OiBJbnRlcmFjdC5Qb2ludCB9KSB7XG4gIGNvbnN0IGNvb3JkRmllbGRzID0gKFtcbiAgICBbJ3gnLCAneSddLFxuICAgIFsnbGVmdCcsICd0b3AnXSxcbiAgICBbJ3JpZ2h0JywgJ2JvdHRvbSddLFxuICAgIFsnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIF0gYXMgY29uc3QpLmZpbHRlcigoW3hGaWVsZCwgeUZpZWxkXSkgPT4geEZpZWxkIGluIGdyaWQgfHwgeUZpZWxkIGluIGdyaWQpXG5cbiAgY29uc3QgZ3JpZEZ1bmM6IEludGVyYWN0LlNuYXBGdW5jdGlvbiAmIHtcbiAgICBncmlkOiB0eXBlb2YgZ3JpZFxuICAgIGNvb3JkRmllbGRzOiB0eXBlb2YgY29vcmRGaWVsZHNcbiAgfSA9ICh4LCB5KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmFuZ2UsXG4gICAgICBsaW1pdHMgPSB7XG4gICAgICAgIGxlZnQgIDogLUluZmluaXR5LFxuICAgICAgICByaWdodCA6ICBJbmZpbml0eSxcbiAgICAgICAgdG9wICAgOiAtSW5maW5pdHksXG4gICAgICAgIGJvdHRvbTogIEluZmluaXR5LFxuICAgICAgfSxcbiAgICAgIG9mZnNldCA9IHsgeDogMCwgeTogMCB9LFxuICAgIH0gPSBncmlkXG5cbiAgICBjb25zdCByZXN1bHQ6IEludGVyYWN0LlNuYXBUYXJnZXQgJiB7XG4gICAgICBncmlkOiB0eXBlb2YgZ3JpZFxuICAgIH0gPSB7IHJhbmdlLCBncmlkLCB4OiBudWxsIGFzIG51bWJlciwgeTogbnVsbCBhcyBudW1iZXIgfVxuXG4gICAgZm9yIChjb25zdCBbeEZpZWxkLCB5RmllbGRdIG9mIGNvb3JkRmllbGRzKSB7XG4gICAgICBjb25zdCBncmlkeCA9IE1hdGgucm91bmQoKHggLSBvZmZzZXQueCkgLyAoZ3JpZCBhcyBhbnkpW3hGaWVsZF0pXG4gICAgICBjb25zdCBncmlkeSA9IE1hdGgucm91bmQoKHkgLSBvZmZzZXQueSkgLyAoZ3JpZCBhcyBhbnkpW3lGaWVsZF0pXG5cbiAgICAgIHJlc3VsdFt4RmllbGRdID0gTWF0aC5tYXgobGltaXRzLmxlZnQsIE1hdGgubWluKGxpbWl0cy5yaWdodCwgZ3JpZHggKiAoZ3JpZCBhcyBhbnkpW3hGaWVsZF0gKyBvZmZzZXQueCkpXG4gICAgICByZXN1bHRbeUZpZWxkXSA9IE1hdGgubWF4KGxpbWl0cy50b3AsIE1hdGgubWluKGxpbWl0cy5ib3R0b20sIGdyaWR5ICogKGdyaWQgYXMgYW55KVt5RmllbGRdICsgb2Zmc2V0LnkpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGdyaWRGdW5jLmdyaWQgPSBncmlkXG4gIGdyaWRGdW5jLmNvb3JkRmllbGRzID0gY29vcmRGaWVsZHNcblxuICByZXR1cm4gZ3JpZEZ1bmNcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlR3JpZFxuIiwiaW1wb3J0IGdyaWQgZnJvbSAnLi9ncmlkJ1xuXG5leHBvcnQgeyBncmlkIH1cbiIsImltcG9ydCBiYXNlIGZyb20gJy4vYmFzZSdcblxuaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vYWxsJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBzbmFwcGVycyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9zbmFwcGVycy9pbmRleCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2ludGVyYWN0L2luZGV4JyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdFN0YXRpYyB7XG4gICAgbW9kaWZpZXJzOiB0eXBlb2YgYWxsXG4gICAgc25hcHBlcnM6IHR5cGVvZiBzbmFwcGVyc1xuICAgIGNyZWF0ZVNuYXBHcmlkOiB0eXBlb2Ygc25hcHBlcnMuZ3JpZFxuICB9XG59XG5cbmNvbnN0IG1vZGlmaWVyczogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ21vZGlmaWVycycsXG4gIGluc3RhbGwgKHNjb3BlKSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdCB9ID0gc2NvcGVcblxuICAgIHNjb3BlLnVzZVBsdWdpbihiYXNlKVxuXG4gICAgaW50ZXJhY3QubW9kaWZpZXJzID0gZXh0ZW5kKGludGVyYWN0Lm1vZGlmaWVycyB8fCB7fSwgYWxsKVxuICAgIGludGVyYWN0LnNuYXBwZXJzID0gZXh0ZW5kKGludGVyYWN0LnNuYXBwZXJzIHx8IHt9LCBzbmFwcGVycylcbiAgICBpbnRlcmFjdC5jcmVhdGVTbmFwR3JpZCA9IGludGVyYWN0LnNuYXBwZXJzLmdyaWRcblxuICAgIC8vIGZvciBiYWNrd3JhZHMgY29tcGF0aWJpbGl0eVxuICAgIGZvciAoY29uc3QgdHlwZSBpbiBhbGwpIHtcbiAgICAgIGNvbnN0IHsgX2RlZmF1bHRzLCBfbWV0aG9kcyB9ID0gYWxsW3R5cGUgYXMga2V5b2YgdHlwZW9mIGFsbF1cblxuICAgICAgOyhfZGVmYXVsdHMgYXMgYW55KS5fbWV0aG9kcyA9IF9tZXRob2RzXG4gICAgICA7KHNjb3BlLmRlZmF1bHRzLnBlckFjdGlvbiBhcyBhbnkpW3R5cGVdID0gX2RlZmF1bHRzXG4gICAgfVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBtb2RpZmllcnNcbiIsImltcG9ydCBCYXNlRXZlbnQgZnJvbSAnLi4vY29yZS9CYXNlRXZlbnQnXG5pbXBvcnQgKiBhcyBwb2ludGVyVXRpbHMgZnJvbSAnLi4vdXRpbHMvcG9pbnRlclV0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2ludGVyRXZlbnQ8VCBleHRlbmRzIHN0cmluZyA9IGFueT4gZXh0ZW5kcyBCYXNlRXZlbnQge1xuICB0eXBlOiBUXG4gIG9yaWdpbmFsRXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGVcbiAgcG9pbnRlcklkOiBudW1iZXJcbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuICBkb3VibGU6IGJvb2xlYW5cbiAgcGFnZVg6IG51bWJlclxuICBwYWdlWTogbnVtYmVyXG4gIGNsaWVudFg6IG51bWJlclxuICBjbGllbnRZOiBudW1iZXJcbiAgZHQ6IG51bWJlclxuICBldmVudGFibGU6IGFueVxuICBba2V5OiBzdHJpbmddOiBhbnlcblxuICAvKiogKi9cbiAgY29uc3RydWN0b3IgKFxuICAgIHR5cGU6IFQsXG4gICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PixcbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsXG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICAgIHRpbWVTdGFtcDogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcihpbnRlcmFjdGlvbilcbiAgICBwb2ludGVyVXRpbHMucG9pbnRlckV4dGVuZCh0aGlzLCBldmVudClcblxuICAgIGlmIChldmVudCAhPT0gcG9pbnRlcikge1xuICAgICAgcG9pbnRlclV0aWxzLnBvaW50ZXJFeHRlbmQodGhpcywgcG9pbnRlcilcbiAgICB9XG5cbiAgICB0aGlzLnRpbWVTdGFtcCAgICAgPSB0aW1lU3RhbXBcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBldmVudFxuICAgIHRoaXMudHlwZSAgICAgICAgICA9IHR5cGVcbiAgICB0aGlzLnBvaW50ZXJJZCAgICAgPSBwb2ludGVyVXRpbHMuZ2V0UG9pbnRlcklkKHBvaW50ZXIpXG4gICAgdGhpcy5wb2ludGVyVHlwZSAgID0gcG9pbnRlclV0aWxzLmdldFBvaW50ZXJUeXBlKHBvaW50ZXIpXG4gICAgdGhpcy50YXJnZXQgICAgICAgID0gZXZlbnRUYXJnZXRcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsXG5cbiAgICBpZiAodHlwZSA9PT0gJ3RhcCcpIHtcbiAgICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IGludGVyYWN0aW9uLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuICAgICAgdGhpcy5kdCA9IHRoaXMudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XS5kb3duVGltZVxuXG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24udGFwVGltZVxuXG4gICAgICB0aGlzLmRvdWJsZSA9ICEhKGludGVyYWN0aW9uLnByZXZUYXAgJiZcbiAgICAgICAgaW50ZXJhY3Rpb24ucHJldlRhcC50eXBlICE9PSAnZG91YmxldGFwJyAmJlxuICAgICAgICBpbnRlcmFjdGlvbi5wcmV2VGFwLnRhcmdldCA9PT0gdGhpcy50YXJnZXQgJiZcbiAgICAgICAgaW50ZXJ2YWwgPCA1MDApXG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdkb3VibGV0YXAnKSB7XG4gICAgICB0aGlzLmR0ID0gKHBvaW50ZXIgYXMgUG9pbnRlckV2ZW50PCd0YXAnPikudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24udGFwVGltZVxuICAgIH1cbiAgfVxuXG4gIF9zdWJ0cmFjdE9yaWdpbiAoeyB4OiBvcmlnaW5YLCB5OiBvcmlnaW5ZIH06IEludGVyYWN0LlBvaW50KSB7XG4gICAgdGhpcy5wYWdlWCAgIC09IG9yaWdpblhcbiAgICB0aGlzLnBhZ2VZICAgLT0gb3JpZ2luWVxuICAgIHRoaXMuY2xpZW50WCAtPSBvcmlnaW5YXG4gICAgdGhpcy5jbGllbnRZIC09IG9yaWdpbllcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBfYWRkT3JpZ2luICh7IHg6IG9yaWdpblgsIHk6IG9yaWdpblkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgICB0aGlzLnBhZ2VYICAgKz0gb3JpZ2luWFxuICAgIHRoaXMucGFnZVkgICArPSBvcmlnaW5ZXG4gICAgdGhpcy5jbGllbnRYICs9IG9yaWdpblhcbiAgICB0aGlzLmNsaWVudFkgKz0gb3JpZ2luWVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgb3JpZ2luYWwgRXZlbnRcbiAgICovXG4gIHByZXZlbnREZWZhdWx0ICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG59XG5cbmV4cG9ydCB7IFBvaW50ZXJFdmVudCB9XG4iLCJpbXBvcnQgeyBQZXJBY3Rpb25EZWZhdWx0cyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgRXZlbnRhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvRXZlbnRhYmxlJ1xuaW1wb3J0IEludGVyYWN0aW9uIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBQb2ludGVyRXZlbnQgZnJvbSAnLi9Qb2ludGVyRXZlbnQnXG5cbmV4cG9ydCB0eXBlIEV2ZW50VGFyZ2V0TGlzdCA9IEFycmF5PHtcbiAgbm9kZTogTm9kZVxuICBldmVudGFibGU6IEV2ZW50YWJsZVxuICBwcm9wczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufT5cblxuZXhwb3J0IGludGVyZmFjZSBQb2ludGVyRXZlbnRPcHRpb25zIGV4dGVuZHMgUGVyQWN0aW9uRGVmYXVsdHMge1xuICBlbmFibGVkPzogdW5kZWZpbmVkIC8vIG5vdCB1c2VkXG4gIGhvbGREdXJhdGlvbj86IG51bWJlclxuICBpZ25vcmVGcm9tPzogYW55XG4gIGFsbG93RnJvbT86IGFueVxuICBvcmlnaW4/OiBJbnRlcmFjdC5Qb2ludCB8IHN0cmluZyB8IEludGVyYWN0LkVsZW1lbnRcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNjb3BlIHtcbiAgICBwb2ludGVyRXZlbnRzOiB0eXBlb2YgcG9pbnRlckV2ZW50c1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgcHJldlRhcD86IFBvaW50ZXJFdmVudDxzdHJpbmc+XG4gICAgdGFwVGltZT86IG51bWJlclxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL1BvaW50ZXJJbmZvJyB7XG4gIGludGVyZmFjZSBQb2ludGVySW5mbyB7XG4gICAgaG9sZD86IHtcbiAgICAgIGR1cmF0aW9uOiBudW1iZXJcbiAgICAgIHRpbWVvdXQ6IGFueVxuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xuICAgIHBvaW50ZXJFdmVudHM6IEludGVyYWN0Lk9wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ3BvaW50ZXJFdmVudHM6bmV3JzogeyBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+IH1cbiAgICAncG9pbnRlckV2ZW50czpmaXJlZCc6IHtcbiAgICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblxuICAgICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICAgICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICAgICAgZXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gICAgICBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICB0YXJnZXRzPzogRXZlbnRUYXJnZXRMaXN0XG4gICAgICB0eXBlOiBzdHJpbmdcbiAgICB9XG4gICAgJ3BvaW50ZXJFdmVudHM6Y29sbGVjdC10YXJnZXRzJzoge1xuICAgICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uXG4gICAgICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgICAgIHRhcmdldHM/OiBFdmVudFRhcmdldExpc3RcbiAgICAgIHR5cGU6IHN0cmluZ1xuICAgICAgcGF0aDogTm9kZVtdXG4gICAgICBub2RlOiBudWxsXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlZmF1bHRzOiBQb2ludGVyRXZlbnRPcHRpb25zID0ge1xuICBob2xkRHVyYXRpb246IDYwMCxcbiAgaWdub3JlRnJvbSAgOiBudWxsLFxuICBhbGxvd0Zyb20gICA6IG51bGwsXG4gIG9yaWdpbiAgICAgIDogeyB4OiAwLCB5OiAwIH0sXG59XG5cbmNvbnN0IHBvaW50ZXJFdmVudHMgPSB7XG4gIGlkOiAncG9pbnRlci1ldmVudHMvYmFzZScsXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogYWRkSW50ZXJhY3Rpb25Qcm9wcyxcbiAgICAnaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJzogYWRkSG9sZEluZm8sXG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogbW92ZUFuZENsZWFySG9sZCxcbiAgICAnaW50ZXJhY3Rpb25zOmRvd24nOiAoYXJnLCBzY29wZSkgPT4ge1xuICAgICAgZG93bkFuZFN0YXJ0SG9sZChhcmcsIHNjb3BlKVxuICAgICAgZmlyZShhcmcsIHNjb3BlKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczp1cCc6IChhcmcsIHNjb3BlKSA9PiB7XG4gICAgICBjbGVhckhvbGQoYXJnKVxuICAgICAgZmlyZShhcmcsIHNjb3BlKVxuICAgICAgdGFwQWZ0ZXJVcChhcmcsIHNjb3BlKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczpjYW5jZWwnOiAoYXJnLCBzY29wZSkgPT4ge1xuICAgICAgY2xlYXJIb2xkKGFyZylcbiAgICAgIGZpcmUoYXJnLCBzY29wZSlcbiAgICB9LFxuICB9LFxuICBQb2ludGVyRXZlbnQsXG4gIGZpcmUsXG4gIGNvbGxlY3RFdmVudFRhcmdldHMsXG4gIGRlZmF1bHRzLFxuICB0eXBlczoge1xuICAgIGRvd246IHRydWUsXG4gICAgbW92ZTogdHJ1ZSxcbiAgICB1cDogdHJ1ZSxcbiAgICBjYW5jZWw6IHRydWUsXG4gICAgdGFwOiB0cnVlLFxuICAgIGRvdWJsZXRhcDogdHJ1ZSxcbiAgICBob2xkOiB0cnVlLFxuICB9IGFzIHsgW3R5cGU6IHN0cmluZ106IHRydWUgfSxcbn1cblxuZnVuY3Rpb24gZmlyZTxUIGV4dGVuZHMgc3RyaW5nPiAoXG4gIGFyZzoge1xuICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIHwgUG9pbnRlckV2ZW50PGFueT5cbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgZXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uXG4gICAgdHlwZTogVFxuICAgIHRhcmdldHM/OiBFdmVudFRhcmdldExpc3RcbiAgfSxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlcmFjdGlvbixcbiAgICBwb2ludGVyLFxuICAgIGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0LFxuICAgIHR5cGUsXG4gICAgdGFyZ2V0cyA9IGNvbGxlY3RFdmVudFRhcmdldHMoYXJnLCBzY29wZSksXG4gIH0gPSBhcmdcblxuICBjb25zdCBwb2ludGVyRXZlbnQgPSBuZXcgUG9pbnRlckV2ZW50KHR5cGUsIHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgaW50ZXJhY3Rpb24sIHNjb3BlLm5vdygpKVxuXG4gIHNjb3BlLmZpcmUoJ3BvaW50ZXJFdmVudHM6bmV3JywgeyBwb2ludGVyRXZlbnQgfSlcblxuICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgaW50ZXJhY3Rpb24sXG4gICAgcG9pbnRlcixcbiAgICBldmVudCxcbiAgICBldmVudFRhcmdldCxcbiAgICB0YXJnZXRzLFxuICAgIHR5cGUsXG4gICAgcG9pbnRlckV2ZW50LFxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0c1tpXVxuXG4gICAgZm9yIChjb25zdCBwcm9wIGluIHRhcmdldC5wcm9wcyB8fCB7fSkge1xuICAgICAgKHBvaW50ZXJFdmVudCBhcyBhbnkpW3Byb3BdID0gdGFyZ2V0LnByb3BzW3Byb3BdXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luID0gdXRpbHMuZ2V0T3JpZ2luWFkodGFyZ2V0LmV2ZW50YWJsZSwgdGFyZ2V0Lm5vZGUpXG5cbiAgICBwb2ludGVyRXZlbnQuX3N1YnRyYWN0T3JpZ2luKG9yaWdpbilcbiAgICBwb2ludGVyRXZlbnQuZXZlbnRhYmxlID0gdGFyZ2V0LmV2ZW50YWJsZVxuICAgIHBvaW50ZXJFdmVudC5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0Lm5vZGVcblxuICAgIHRhcmdldC5ldmVudGFibGUuZmlyZShwb2ludGVyRXZlbnQpXG5cbiAgICBwb2ludGVyRXZlbnQuX2FkZE9yaWdpbihvcmlnaW4pXG5cbiAgICBpZiAocG9pbnRlckV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCB8fFxuICAgICAgICAocG9pbnRlckV2ZW50LnByb3BhZ2F0aW9uU3RvcHBlZCAmJlxuICAgICAgICAgICAgKGkgKyAxKSA8IHRhcmdldHMubGVuZ3RoICYmIHRhcmdldHNbaSArIDFdLm5vZGUgIT09IHBvaW50ZXJFdmVudC5jdXJyZW50VGFyZ2V0KSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBzY29wZS5maXJlKCdwb2ludGVyRXZlbnRzOmZpcmVkJywgc2lnbmFsQXJnKVxuXG4gIGlmICh0eXBlID09PSAndGFwJykge1xuICAgIC8vIGlmIHBvaW50ZXJFdmVudCBzaG91bGQgbWFrZSBhIGRvdWJsZSB0YXAsIGNyZWF0ZSBhbmQgZmlyZSBhIGRvdWJsZXRhcFxuICAgIC8vIFBvaW50ZXJFdmVudCBhbmQgdXNlIHRoYXQgYXMgdGhlIHByZXZUYXBcbiAgICBjb25zdCBwcmV2VGFwID0gcG9pbnRlckV2ZW50LmRvdWJsZVxuICAgICAgPyBmaXJlKHtcbiAgICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICAgIHBvaW50ZXIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgdHlwZTogJ2RvdWJsZXRhcCcsXG4gICAgICB9LCBzY29wZSlcbiAgICAgIDogcG9pbnRlckV2ZW50XG5cbiAgICBpbnRlcmFjdGlvbi5wcmV2VGFwID0gcHJldlRhcFxuICAgIGludGVyYWN0aW9uLnRhcFRpbWUgPSBwcmV2VGFwLnRpbWVTdGFtcFxuICB9XG5cbiAgcmV0dXJuIHBvaW50ZXJFdmVudFxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RXZlbnRUYXJnZXRzPFQgZXh0ZW5kcyBzdHJpbmc+ICh7IGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHR5cGUgfToge1xuICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb25cbiAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldFxuICB0eXBlOiBUXG59LCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgY29uc3QgcG9pbnRlckluZGV4ID0gaW50ZXJhY3Rpb24uZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG4gIGNvbnN0IHBvaW50ZXJJbmZvID0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XVxuXG4gIC8vIGRvIG5vdCBmaXJlIGEgdGFwIGV2ZW50IGlmIHRoZSBwb2ludGVyIHdhcyBtb3ZlZCBiZWZvcmUgYmVpbmcgbGlmdGVkXG4gIGlmICh0eXBlID09PSAndGFwJyAmJiAoaW50ZXJhY3Rpb24ucG9pbnRlcldhc01vdmVkIHx8XG4gICAgICAvLyBvciBpZiB0aGUgcG9pbnRlcnVwIHRhcmdldCBpcyBkaWZmZXJlbnQgdG8gdGhlIHBvaW50ZXJkb3duIHRhcmdldFxuICAgICAgIShwb2ludGVySW5mbyAmJiBwb2ludGVySW5mby5kb3duVGFyZ2V0ID09PSBldmVudFRhcmdldCkpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBwYXRoID0gdXRpbHMuZG9tLmdldFBhdGgoZXZlbnRUYXJnZXQgYXMgSW50ZXJhY3QuRWxlbWVudCB8IERvY3VtZW50KVxuICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgaW50ZXJhY3Rpb24sXG4gICAgcG9pbnRlcixcbiAgICBldmVudCxcbiAgICBldmVudFRhcmdldCxcbiAgICB0eXBlLFxuICAgIHBhdGgsXG4gICAgdGFyZ2V0czogW10gYXMgRXZlbnRUYXJnZXRMaXN0LFxuICAgIG5vZGU6IG51bGwsXG4gIH1cblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgcGF0aCkge1xuICAgIHNpZ25hbEFyZy5ub2RlID0gbm9kZVxuXG4gICAgc2NvcGUuZmlyZSgncG9pbnRlckV2ZW50czpjb2xsZWN0LXRhcmdldHMnLCBzaWduYWxBcmcpXG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ2hvbGQnKSB7XG4gICAgc2lnbmFsQXJnLnRhcmdldHMgPSBzaWduYWxBcmcudGFyZ2V0cy5maWx0ZXIodGFyZ2V0ID0+XG4gICAgICB0YXJnZXQuZXZlbnRhYmxlLm9wdGlvbnMuaG9sZER1cmF0aW9uID09PSBpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQuZHVyYXRpb24pXG4gIH1cblxuICByZXR1cm4gc2lnbmFsQXJnLnRhcmdldHNcbn1cblxuZnVuY3Rpb24gYWRkSW50ZXJhY3Rpb25Qcm9wcyAoeyBpbnRlcmFjdGlvbiB9KSB7XG4gIGludGVyYWN0aW9uLnByZXZUYXAgPSBudWxsICAgLy8gdGhlIG1vc3QgcmVjZW50IHRhcCBldmVudCBvbiB0aGlzIGludGVyYWN0aW9uXG4gIGludGVyYWN0aW9uLnRhcFRpbWUgPSAwICAgICAvLyB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCB0YXAgZXZlbnRcbn1cblxuZnVuY3Rpb24gYWRkSG9sZEluZm8gKHsgZG93biwgcG9pbnRlckluZm8gfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJ10pIHtcbiAgaWYgKCFkb3duICYmIHBvaW50ZXJJbmZvLmhvbGQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHBvaW50ZXJJbmZvLmhvbGQgPSB7IGR1cmF0aW9uOiBJbmZpbml0eSwgdGltZW91dDogbnVsbCB9XG59XG5cbmZ1bmN0aW9uIGNsZWFySG9sZCAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlckluZGV4IH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzW3BvaW50ZXJJbmRleF0uaG9sZCkge1xuICAgIGNsZWFyVGltZW91dChpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQudGltZW91dClcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQW5kQ2xlYXJIb2xkIChcbiAgeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBkdXBsaWNhdGUgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IHBvaW50ZXJJbmRleCA9IGludGVyYWN0aW9uLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuXG4gIGlmICghZHVwbGljYXRlICYmICghaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93biB8fCBpbnRlcmFjdGlvbi5wb2ludGVyV2FzTW92ZWQpKSB7XG4gICAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24pIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQudGltZW91dClcbiAgICB9XG5cbiAgICBmaXJlKHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgcG9pbnRlcixcbiAgICAgIGV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnQsXG4gICAgICB0eXBlOiAnbW92ZScsXG4gICAgfSwgc2NvcGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gZG93bkFuZFN0YXJ0SG9sZCAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBwb2ludGVySW5kZXggfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHRpbWVyID0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XS5ob2xkXG4gIGNvbnN0IHBhdGggPSB1dGlscy5kb20uZ2V0UGF0aChldmVudFRhcmdldCBhcyBJbnRlcmFjdC5FbGVtZW50IHwgRG9jdW1lbnQpXG4gIGNvbnN0IHNpZ25hbEFyZyA9IHtcbiAgICBpbnRlcmFjdGlvbixcbiAgICBwb2ludGVyLFxuICAgIGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0LFxuICAgIHR5cGU6ICdob2xkJyxcbiAgICB0YXJnZXRzOiBbXSBhcyBFdmVudFRhcmdldExpc3QsXG4gICAgcGF0aCxcbiAgICBub2RlOiBudWxsLFxuICB9XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIHBhdGgpIHtcbiAgICBzaWduYWxBcmcubm9kZSA9IG5vZGVcblxuICAgIHNjb3BlLmZpcmUoJ3BvaW50ZXJFdmVudHM6Y29sbGVjdC10YXJnZXRzJywgc2lnbmFsQXJnKVxuICB9XG5cbiAgaWYgKCFzaWduYWxBcmcudGFyZ2V0cy5sZW5ndGgpIHsgcmV0dXJuIH1cblxuICBsZXQgbWluRHVyYXRpb24gPSBJbmZpbml0eVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHNpZ25hbEFyZy50YXJnZXRzKSB7XG4gICAgY29uc3QgaG9sZER1cmF0aW9uID0gdGFyZ2V0LmV2ZW50YWJsZS5vcHRpb25zLmhvbGREdXJhdGlvblxuXG4gICAgaWYgKGhvbGREdXJhdGlvbiA8IG1pbkR1cmF0aW9uKSB7XG4gICAgICBtaW5EdXJhdGlvbiA9IGhvbGREdXJhdGlvblxuICAgIH1cbiAgfVxuXG4gIHRpbWVyLmR1cmF0aW9uID0gbWluRHVyYXRpb25cbiAgdGltZXIudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGZpcmUoe1xuICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHBvaW50ZXIsXG4gICAgICBldmVudCxcbiAgICAgIHR5cGU6ICdob2xkJyxcbiAgICB9LCBzY29wZSlcbiAgfSwgbWluRHVyYXRpb24pXG59XG5cbmZ1bmN0aW9uIHRhcEFmdGVyVXAgKHsgaW50ZXJhY3Rpb24sIHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCB9OiBJbnRlcmFjdC5TaWduYWxBcmdzWydpbnRlcmFjdGlvbnM6dXAnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGlmICghaW50ZXJhY3Rpb24ucG9pbnRlcldhc01vdmVkKSB7XG4gICAgZmlyZSh7IGludGVyYWN0aW9uLCBldmVudFRhcmdldCwgcG9pbnRlciwgZXZlbnQsIHR5cGU6ICd0YXAnIH0sIHNjb3BlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBzY29wZS5wb2ludGVyRXZlbnRzID0gcG9pbnRlckV2ZW50c1xuICBzY29wZS5kZWZhdWx0cy5hY3Rpb25zLnBvaW50ZXJFdmVudHMgPSBwb2ludGVyRXZlbnRzLmRlZmF1bHRzXG4gIHV0aWxzLmV4dGVuZChzY29wZS5hY3Rpb25zLnBoYXNlbGVzc1R5cGVzLCBwb2ludGVyRXZlbnRzLnR5cGVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCBwb2ludGVyRXZlbnRzXG4iLCJpbXBvcnQgeyBMaXN0ZW5lck1hcCB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgYmFzZVBsdWdpbiBmcm9tICcuL2Jhc2UnXG5pbXBvcnQgUG9pbnRlckV2ZW50IGZyb20gJy4vUG9pbnRlckV2ZW50J1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIGhvbGRJbnRlcnZhbEhhbmRsZT86IGFueVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9wb2ludGVyLWV2ZW50cy9Qb2ludGVyRXZlbnQnIHtcbiAgaW50ZXJmYWNlIFBvaW50ZXJFdmVudDxUIGV4dGVuZHMgc3RyaW5nID0gYW55PiB7XG4gICAgY291bnQ/OiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvYmFzZScge1xuICBpbnRlcmZhY2UgUG9pbnRlckV2ZW50T3B0aW9ucyB7XG4gICAgaG9sZFJlcGVhdEludGVydmFsPzogbnVtYmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIHNjb3BlLnVzZVBsdWdpbihiYXNlUGx1Z2luKVxuXG4gIGNvbnN0IHtcbiAgICBwb2ludGVyRXZlbnRzLFxuICB9ID0gc2NvcGVcblxuICAvLyBkb24ndCByZXBlYXQgYnkgZGVmYXVsdFxuICBwb2ludGVyRXZlbnRzLmRlZmF1bHRzLmhvbGRSZXBlYXRJbnRlcnZhbCA9IDBcbiAgcG9pbnRlckV2ZW50cy50eXBlcy5ob2xkcmVwZWF0ID0gc2NvcGUuYWN0aW9ucy5waGFzZWxlc3NUeXBlcy5ob2xkcmVwZWF0ID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBvbk5ldyAoeyBwb2ludGVyRXZlbnQgfTogeyBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+IH0pIHtcbiAgaWYgKHBvaW50ZXJFdmVudC50eXBlICE9PSAnaG9sZCcpIHsgcmV0dXJuIH1cblxuICBwb2ludGVyRXZlbnQuY291bnQgPSAocG9pbnRlckV2ZW50LmNvdW50IHx8IDApICsgMVxufVxuXG5mdW5jdGlvbiBvbkZpcmVkIChcbiAgeyBpbnRlcmFjdGlvbiwgcG9pbnRlckV2ZW50LCBldmVudFRhcmdldCwgdGFyZ2V0cyB9OiBJbnRlcmFjdC5TaWduYWxBcmdzWydwb2ludGVyRXZlbnRzOmZpcmVkJ10sXG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZSxcbikge1xuICBpZiAocG9pbnRlckV2ZW50LnR5cGUgIT09ICdob2xkJyB8fCAhdGFyZ2V0cy5sZW5ndGgpIHsgcmV0dXJuIH1cblxuICAvLyBnZXQgdGhlIHJlcGVhdCBpbnRlcnZhbCBmcm9tIHRoZSBmaXJzdCBldmVudGFibGVcbiAgY29uc3QgaW50ZXJ2YWwgPSB0YXJnZXRzWzBdLmV2ZW50YWJsZS5vcHRpb25zLmhvbGRSZXBlYXRJbnRlcnZhbFxuXG4gIC8vIGRvbid0IHJlcGVhdCBpZiB0aGUgaW50ZXJ2YWwgaXMgMCBvciBsZXNzXG4gIGlmIChpbnRlcnZhbCA8PSAwKSB7IHJldHVybiB9XG5cbiAgLy8gc2V0IGEgdGltZW91dCB0byBmaXJlIHRoZSBob2xkcmVwZWF0IGV2ZW50XG4gIGludGVyYWN0aW9uLmhvbGRJbnRlcnZhbEhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHNjb3BlLnBvaW50ZXJFdmVudHMuZmlyZSh7XG4gICAgICBpbnRlcmFjdGlvbixcbiAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgdHlwZTogJ2hvbGQnLFxuICAgICAgcG9pbnRlcjogcG9pbnRlckV2ZW50LFxuICAgICAgZXZlbnQ6IHBvaW50ZXJFdmVudCxcbiAgICB9LCBzY29wZSlcbiAgfSwgaW50ZXJ2YWwpXG59XG5cbmZ1bmN0aW9uIGVuZEhvbGRSZXBlYXQgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSkge1xuICAvLyBzZXQgdGhlIGludGVyYWN0aW9uJ3MgaG9sZFN0b3BUaW1lIHByb3BlcnR5XG4gIC8vIHRvIHN0b3AgZnVydGhlciBob2xkUmVwZWF0IGV2ZW50c1xuICBpZiAoaW50ZXJhY3Rpb24uaG9sZEludGVydmFsSGFuZGxlKSB7XG4gICAgY2xlYXJJbnRlcnZhbChpbnRlcmFjdGlvbi5ob2xkSW50ZXJ2YWxIYW5kbGUpXG4gICAgaW50ZXJhY3Rpb24uaG9sZEludGVydmFsSGFuZGxlID0gbnVsbFxuICB9XG59XG5cbmNvbnN0IGhvbGRSZXBlYXQ6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdwb2ludGVyLWV2ZW50cy9ob2xkUmVwZWF0JyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiBbJ21vdmUnLCAndXAnLCAnY2FuY2VsJywgJ2VuZGFsbCddLnJlZHVjZShcbiAgICAoYWNjLCBlbmRlclR5cGVzKSA9PiB7XG4gICAgICAoYWNjIGFzIGFueSlbYHBvaW50ZXJFdmVudHM6JHtlbmRlclR5cGVzfWBdID0gZW5kSG9sZFJlcGVhdFxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sXG4gICAge1xuICAgICAgJ3BvaW50ZXJFdmVudHM6bmV3Jzogb25OZXcsXG4gICAgICAncG9pbnRlckV2ZW50czpmaXJlZCc6IG9uRmlyZWQsXG4gICAgfSBhcyBMaXN0ZW5lck1hcCxcbiAgKSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgaG9sZFJlcGVhdFxuIiwiaW1wb3J0IHsgU2NvcGUgfSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5cbnR5cGUgSW50ZXJhY3RhYmxlID0gaW1wb3J0ICgnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnKS5kZWZhdWx0XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBwb2ludGVyRXZlbnRzOiB0eXBlb2YgcG9pbnRlckV2ZW50c01ldGhvZFxuICAgIF9fYmFja0NvbXBhdE9wdGlvbjogKG9wdGlvbk5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkgPT4gYW55XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IFNjb3BlKSB7XG4gIGNvbnN0IHsgSW50ZXJhY3RhYmxlIH0gPSBzY29wZVxuXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUucG9pbnRlckV2ZW50cyA9IHBvaW50ZXJFdmVudHNNZXRob2RcblxuICBjb25zdCBfX2JhY2tDb21wYXRPcHRpb24gPSBJbnRlcmFjdGFibGUucHJvdG90eXBlLl9iYWNrQ29tcGF0T3B0aW9uXG5cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5fYmFja0NvbXBhdE9wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25OYW1lLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IHJldCA9IF9fYmFja0NvbXBhdE9wdGlvbi5jYWxsKHRoaXMsIG9wdGlvbk5hbWUsIG5ld1ZhbHVlKVxuXG4gICAgaWYgKHJldCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5ldmVudHMub3B0aW9uc1tvcHRpb25OYW1lXSA9IG5ld1ZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJFdmVudHNNZXRob2QgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9uczogYW55KSB7XG4gIGV4dGVuZCh0aGlzLmV2ZW50cy5vcHRpb25zLCBvcHRpb25zKVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmNvbnN0IHBsdWdpbjogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ3BvaW50ZXItZXZlbnRzL2ludGVyYWN0YWJsZVRhcmdldHMnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAncG9pbnRlckV2ZW50czpjb2xsZWN0LXRhcmdldHMnOiAoe1xuICAgICAgdGFyZ2V0cyxcbiAgICAgIG5vZGUsXG4gICAgICB0eXBlLFxuICAgICAgZXZlbnRUYXJnZXQsXG4gICAgfSwgc2NvcGUpID0+IHtcbiAgICAgIHNjb3BlLmludGVyYWN0YWJsZXMuZm9yRWFjaE1hdGNoKG5vZGUsIChpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSkgPT4ge1xuICAgICAgICBjb25zdCBldmVudGFibGUgPSBpbnRlcmFjdGFibGUuZXZlbnRzXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBldmVudGFibGUub3B0aW9uc1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBldmVudGFibGUudHlwZXNbdHlwZV0gJiZcbiAgICAgICAgICBldmVudGFibGUudHlwZXNbdHlwZV0ubGVuZ3RoICYmXG4gICAgICAgIGludGVyYWN0YWJsZS50ZXN0SWdub3JlQWxsb3cob3B0aW9ucywgbm9kZSwgZXZlbnRUYXJnZXQpKSB7XG4gICAgICAgICAgdGFyZ2V0cy5wdXNoKHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBldmVudGFibGUsXG4gICAgICAgICAgICBwcm9wczogeyBpbnRlcmFjdGFibGUgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3RhYmxlOm5ldyc6ICh7IGludGVyYWN0YWJsZSB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGFibGUuZXZlbnRzLmdldFJlY3QgPSBmdW5jdGlvbiAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3RhYmxlLmdldFJlY3QoZWxlbWVudClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0YWJsZTpzZXQnOiAoeyBpbnRlcmFjdGFibGUsIG9wdGlvbnMgfSwgc2NvcGUpID0+IHtcbiAgICAgIGV4dGVuZChpbnRlcmFjdGFibGUuZXZlbnRzLm9wdGlvbnMsIHNjb3BlLnBvaW50ZXJFdmVudHMuZGVmYXVsdHMpXG4gICAgICBleHRlbmQoaW50ZXJhY3RhYmxlLmV2ZW50cy5vcHRpb25zLCBvcHRpb25zLnBvaW50ZXJFdmVudHMgfHwge30pXG4gICAgfSxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcGx1Z2luXG4iLCJpbXBvcnQgKiBhcyBwb2ludGVyRXZlbnRzIGZyb20gJy4vYmFzZSdcbmltcG9ydCBob2xkUmVwZWF0IGZyb20gJy4vaG9sZFJlcGVhdCdcbmltcG9ydCBpbnRlcmFjdGFibGVUYXJnZXRzIGZyb20gJy4vaW50ZXJhY3RhYmxlVGFyZ2V0cydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ3BvaW50ZXItZXZlbnRzJyxcbiAgaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gICAgc2NvcGUudXNlUGx1Z2luKHBvaW50ZXJFdmVudHMpXG4gICAgc2NvcGUudXNlUGx1Z2luKGhvbGRSZXBlYXQpXG4gICAgc2NvcGUudXNlUGx1Z2luKGludGVyYWN0YWJsZVRhcmdldHMpXG4gIH0sXG59XG5cbmV4cG9ydCB7XG4gIHBvaW50ZXJFdmVudHMsXG4gIGhvbGRSZXBlYXQsXG4gIGludGVyYWN0YWJsZVRhcmdldHMsXG59XG4iLCJpbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IHsgQWN0aW9uUHJvcHMsIEludGVyYWN0aW9uIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbidcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9zY29wZSdcbmltcG9ydCB7IGFyciwgZXh0ZW5kLCBpcywgcG9pbnRlciBhcyBwb2ludGVyVXRpbHMsIHJlY3QgYXMgcmVjdFV0aWxzLCB3aW4gfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIHJlZmxvdzogKGFjdGlvbjogQWN0aW9uUHJvcHMpID0+IFJldHVyblR5cGU8dHlwZW9mIHJlZmxvdz5cbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIF9yZWZsb3dQcm9taXNlOiBQcm9taXNlPHZvaWQ+XG4gICAgX3JlZmxvd1Jlc29sdmU6ICgpID0+IHZvaWRcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50JyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgaW50ZXJmYWNlIFBoYXNlTWFwIHtcbiAgICByZWZsb3c/OiB0cnVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgSW50ZXJhY3RhYmxlLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS5hY3Rpb25zLnBoYXNlcy5yZWZsb3cgPSB0cnVlXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IGludGVyYWN0YWJsZSA9IGludGVyYWN0KHRhcmdldClcbiAgICogY29uc3QgZHJhZyA9IHsgbmFtZTogZHJhZywgYXhpczogJ3gnIH1cbiAgICogY29uc3QgcmVzaXplID0geyBuYW1lOiByZXNpemUsIGVkZ2VzOiB7IGxlZnQ6IHRydWUsIGJvdHRvbTogdHJ1ZSB9XG4gICAqXG4gICAqIGludGVyYWN0YWJsZS5yZWZsb3coZHJhZylcbiAgICogaW50ZXJhY3RhYmxlLnJlZmxvdyhyZXNpemUpXG4gICAqIGBgYFxuICAgKlxuICAgKiBTdGFydCBhbiBhY3Rpb24gc2VxdWVuY2UgdG8gcmUtYXBwbHkgbW9kaWZpZXJzLCBjaGVjayBkcm9wcywgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0geyBPYmplY3QgfSBhY3Rpb24gVGhlIGFjdGlvbiB0byBiZWdpblxuICAgKiBAcGFyYW0geyBzdHJpbmcgfSBhY3Rpb24ubmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG4gICAqIEByZXR1cm5zIHsgUHJvbWlzZSB9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBgSW50ZXJhY3RhYmxlYCB3aGVuIGFjdGlvbnMgb24gYWxsIHRhcmdldHMgaGF2ZSBlbmRlZFxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5yZWZsb3cgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgcmV0dXJuIHJlZmxvdyh0aGlzLCBhY3Rpb24sIHNjb3BlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlZmxvdzxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlLCBhY3Rpb246IEFjdGlvblByb3BzPFQ+LCBzY29wZTogU2NvcGUpOiBQcm9taXNlPEludGVyYWN0YWJsZT4ge1xuICBjb25zdCBlbGVtZW50cyA9IChpcy5zdHJpbmcoaW50ZXJhY3RhYmxlLnRhcmdldClcbiAgICA/IGFyci5mcm9tKGludGVyYWN0YWJsZS5fY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKGludGVyYWN0YWJsZS50YXJnZXQpKVxuICAgIDogW2ludGVyYWN0YWJsZS50YXJnZXRdKSBhcyBJbnRlcmFjdC5FbGVtZW50W11cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgdmFyaWFibGUtbmFtZVxuICBjb25zdCBQcm9taXNlID0gKHdpbi53aW5kb3cgYXMgYW55KS5Qcm9taXNlXG4gIGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlPG51bGw+PiB8IG51bGwgPSBQcm9taXNlID8gW10gOiBudWxsXG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgcmVjdCA9IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50KVxuXG4gICAgaWYgKCFyZWN0KSB7IGJyZWFrIH1cblxuICAgIGNvbnN0IHJ1bm5pbmdJbnRlcmFjdGlvbiA9IGFyci5maW5kKFxuICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QsXG4gICAgICAoaW50ZXJhY3Rpb246IEludGVyYWN0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpICYmXG4gICAgICAgICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlID09PSBpbnRlcmFjdGFibGUgJiZcbiAgICAgICAgICBpbnRlcmFjdGlvbi5lbGVtZW50ID09PSBlbGVtZW50ICYmXG4gICAgICAgICAgaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSA9PT0gYWN0aW9uLm5hbWVcbiAgICAgIH0pXG4gICAgbGV0IHJlZmxvd1Byb21pc2U6IFByb21pc2U8bnVsbD5cblxuICAgIGlmIChydW5uaW5nSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJ1bm5pbmdJbnRlcmFjdGlvbi5tb3ZlKClcblxuICAgICAgaWYgKHByb21pc2VzKSB7XG4gICAgICAgIHJlZmxvd1Byb21pc2UgPSBydW5uaW5nSW50ZXJhY3Rpb24uX3JlZmxvd1Byb21pc2UgfHwgbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgIHJ1bm5pbmdJbnRlcmFjdGlvbi5fcmVmbG93UmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB4eXdoID0gcmVjdFV0aWxzLnRsYnJUb1h5d2gocmVjdClcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgcGFnZSAgICAgOiB7IHg6IHh5d2gueCwgeTogeHl3aC55IH0sXG4gICAgICAgIGNsaWVudCAgIDogeyB4OiB4eXdoLngsIHk6IHh5d2gueSB9LFxuICAgICAgICB0aW1lU3RhbXA6IHNjb3BlLm5vdygpLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBldmVudCA9IHBvaW50ZXJVdGlscy5jb29yZHNUb0V2ZW50KGNvb3JkcylcbiAgICAgIHJlZmxvd1Byb21pc2UgPSBzdGFydFJlZmxvdzxUPihzY29wZSwgaW50ZXJhY3RhYmxlLCBlbGVtZW50LCBhY3Rpb24sIGV2ZW50KVxuICAgIH1cblxuICAgIGlmIChwcm9taXNlcykge1xuICAgICAgcHJvbWlzZXMucHVzaChyZWZsb3dQcm9taXNlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcm9taXNlcyAmJiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiBpbnRlcmFjdGFibGUpXG59XG5cbmZ1bmN0aW9uIHN0YXJ0UmVmbG93PFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiAoc2NvcGU6IFNjb3BlLCBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSwgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCwgYWN0aW9uOiBBY3Rpb25Qcm9wczxUPiwgZXZlbnQ6IGFueSkge1xuICBjb25zdCBpbnRlcmFjdGlvbiA9IHNjb3BlLmludGVyYWN0aW9ucy5uZXcoeyBwb2ludGVyVHlwZTogJ3JlZmxvdycgfSlcbiAgY29uc3Qgc2lnbmFsQXJnID0ge1xuICAgIGludGVyYWN0aW9uLFxuICAgIGV2ZW50LFxuICAgIHBvaW50ZXI6IGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0OiBlbGVtZW50LFxuICAgIHBoYXNlOiAncmVmbG93JyxcbiAgfSBhcyBjb25zdFxuXG4gIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICBpbnRlcmFjdGlvbi5lbGVtZW50ID0gZWxlbWVudFxuICBpbnRlcmFjdGlvbi5wcmVwYXJlZCA9IGV4dGVuZCh7fSwgYWN0aW9uKVxuICBpbnRlcmFjdGlvbi5wcmV2RXZlbnQgPSBldmVudFxuICBpbnRlcmFjdGlvbi51cGRhdGVQb2ludGVyKGV2ZW50LCBldmVudCwgZWxlbWVudCwgdHJ1ZSlcblxuICBpbnRlcmFjdGlvbi5fZG9QaGFzZShzaWduYWxBcmcpXG5cbiAgY29uc3QgcmVmbG93UHJvbWlzZSA9ICh3aW4ud2luZG93IGFzIHVua25vd24gYXMgYW55KS5Qcm9taXNlXG4gICAgPyBuZXcgKHdpbi53aW5kb3cgYXMgdW5rbm93biBhcyBhbnkpLlByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24uX3JlZmxvd1Jlc29sdmUgPSByZXNvbHZlXG4gICAgfSlcbiAgICA6IG51bGxcblxuICBpbnRlcmFjdGlvbi5fcmVmbG93UHJvbWlzZSA9IHJlZmxvd1Byb21pc2VcbiAgaW50ZXJhY3Rpb24uc3RhcnQoYWN0aW9uLCBpbnRlcmFjdGFibGUsIGVsZW1lbnQpXG5cbiAgaWYgKGludGVyYWN0aW9uLl9pbnRlcmFjdGluZykge1xuICAgIGludGVyYWN0aW9uLm1vdmUoc2lnbmFsQXJnKVxuICAgIGludGVyYWN0aW9uLmVuZChldmVudClcbiAgfVxuICBlbHNlIHtcbiAgICBpbnRlcmFjdGlvbi5zdG9wKClcbiAgfVxuXG4gIGludGVyYWN0aW9uLnJlbW92ZVBvaW50ZXIoZXZlbnQsIGV2ZW50KVxuICBpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duID0gZmFsc2VcblxuICByZXR1cm4gcmVmbG93UHJvbWlzZVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAncmVmbG93JyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiB7XG4gICAgLy8gcmVtb3ZlIGNvbXBsZXRlZCByZWZsb3cgaW50ZXJhY3Rpb25zXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogKHsgaW50ZXJhY3Rpb24gfSwgc2NvcGUpID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gJ3JlZmxvdycpIHtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLl9yZWZsb3dSZXNvbHZlKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX3JlZmxvd1Jlc29sdmUoKVxuICAgICAgICB9XG5cbiAgICAgICAgYXJyLnJlbW92ZShzY29wZS5pbnRlcmFjdGlvbnMubGlzdCwgaW50ZXJhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn0gYXMgSW50ZXJhY3QuUGx1Z2luXG4iLCIvKiogQG1vZHVsZSBpbnRlcmFjdCAqL1xuXG5pbXBvcnQgJ0BpbnRlcmFjdGpzL3R5cGVzL2luZGV4J1xuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IHsgaXNOb25OYXRpdmVFdmVudCwgU2NvcGUgfSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJ1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcidcbmltcG9ydCBldmVudHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXZlbnRzJ1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaW5kZXgnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgaW50ZXJhY3Q/OiBJbnRlcmFjdFN0YXRpY1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3RTdGF0aWMge1xuICAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM/OiBPcHRpb25zKTogSW50ZXJhY3RhYmxlXG4gIG9uOiB0eXBlb2Ygb25cbiAgcG9pbnRlck1vdmVUb2xlcmFuY2U6IHR5cGVvZiBwb2ludGVyTW92ZVRvbGVyYW5jZVxuICBzdG9wOiB0eXBlb2Ygc3RvcFxuICBzdXBwb3J0c1BvaW50ZXJFdmVudDogdHlwZW9mIHN1cHBvcnRzUG9pbnRlckV2ZW50XG4gIHN1cHBvcnRzVG91Y2g6IHR5cGVvZiBzdXBwb3J0c1RvdWNoXG4gIGRlYnVnOiB0eXBlb2YgZGVidWdcbiAgb2ZmOiB0eXBlb2Ygb2ZmXG4gIGlzU2V0OiB0eXBlb2YgaXNTZXRcbiAgdXNlOiB0eXBlb2YgdXNlXG4gIGdldFBvaW50ZXJBdmVyYWdlOiB0eXBlb2YgdXRpbHMucG9pbnRlci5wb2ludGVyQXZlcmFnZVxuICBnZXRUb3VjaEJCb3g6IHR5cGVvZiB1dGlscy5wb2ludGVyLnRvdWNoQkJveFxuICBnZXRUb3VjaERpc3RhbmNlOiB0eXBlb2YgdXRpbHMucG9pbnRlci50b3VjaERpc3RhbmNlXG4gIGdldFRvdWNoQW5nbGU6IHR5cGVvZiB1dGlscy5wb2ludGVyLnRvdWNoQW5nbGVcbiAgZ2V0RWxlbWVudFJlY3Q6IHR5cGVvZiB1dGlscy5kb20uZ2V0RWxlbWVudFJlY3RcbiAgZ2V0RWxlbWVudENsaWVudFJlY3Q6IHR5cGVvZiB1dGlscy5kb20uZ2V0RWxlbWVudENsaWVudFJlY3RcbiAgbWF0Y2hlc1NlbGVjdG9yOiB0eXBlb2YgdXRpbHMuZG9tLm1hdGNoZXNTZWxlY3RvclxuICBjbG9zZXN0OiB0eXBlb2YgdXRpbHMuZG9tLmNsb3Nlc3RcbiAgYWRkRG9jdW1lbnQ6IHR5cGVvZiBzY29wZS5hZGREb2N1bWVudFxuICByZW1vdmVEb2N1bWVudDogdHlwZW9mIHNjb3BlLnJlbW92ZURvY3VtZW50XG4gIGR5bmFtaWNEcm9wOiAobmV3VmFsdWU/OiBib29sZWFuKSA9PiBib29sZWFuIHwgSW50ZXJhY3QuaW50ZXJhY3RcbiAgdmVyc2lvbjogc3RyaW5nXG59XG5cbmNvbnN0IGdsb2JhbEV2ZW50czogYW55ID0ge31cbmNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKClcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKHdpbjogV2luZG93KSB7XG4gIHNjb3BlLmluaXQod2luKVxuXG4gIHJldHVybiBpbnRlcmFjdFxufVxuXG4vKipcbiAqIGBgYGpzXG4gKiBpbnRlcmFjdCgnI2RyYWdnYWJsZScpLmRyYWdnYWJsZSh0cnVlKVxuICpcbiAqIHZhciByZWN0YWJsZXMgPSBpbnRlcmFjdCgncmVjdCcpXG4gKiByZWN0YWJsZXNcbiAqICAgLmdlc3R1cmFibGUodHJ1ZSlcbiAqICAgLm9uKCdnZXN0dXJlbW92ZScsIGZ1bmN0aW9uIChldmVudCkge1xuICogICAgICAgLy8gLi4uXG4gKiAgIH0pXG4gKiBgYGBcbiAqXG4gKiBUaGUgbWV0aG9kcyBvZiB0aGlzIHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIHNldCBlbGVtZW50cyBhcyBpbnRlcmFjdGFibGVzXG4gKiBhbmQgYWxzbyB0byBjaGFuZ2UgdmFyaW91cyBkZWZhdWx0IHNldHRpbmdzLlxuICpcbiAqIENhbGxpbmcgaXQgYXMgYSBmdW5jdGlvbiBhbmQgcGFzc2luZyBhbiBlbGVtZW50IG9yIGEgdmFsaWQgQ1NTIHNlbGVjdG9yXG4gKiBzdHJpbmcgcmV0dXJucyBhbiBJbnRlcmFjdGFibGUgb2JqZWN0IHdoaWNoIGhhcyB2YXJpb3VzIG1ldGhvZHMgdG8gY29uZmlndXJlXG4gKiBpdC5cbiAqXG4gKiBAZ2xvYmFsXG4gKlxuICogQHBhcmFtIHtFbGVtZW50IHwgc3RyaW5nfSB0YXJnZXQgVGhlIEhUTUwgb3IgU1ZHIEVsZW1lbnQgdG8gaW50ZXJhY3Qgd2l0aFxuICogb3IgQ1NTIHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9XG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcmFjdDogSW50ZXJhY3RTdGF0aWMgPSBmdW5jdGlvbiBpbnRlcmFjdCAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgbGV0IGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMuZ2V0KHRhcmdldCwgb3B0aW9ucylcblxuICBpZiAoIWludGVyYWN0YWJsZSkge1xuICAgIGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMubmV3KHRhcmdldCwgb3B0aW9ucylcbiAgICBpbnRlcmFjdGFibGUuZXZlbnRzLmdsb2JhbCA9IGdsb2JhbEV2ZW50c1xuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0YWJsZVxufSBhcyBJbnRlcmFjdFN0YXRpY1xuXG4vKipcbiAqIFVzZSBhIHBsdWdpblxuICpcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3QudXNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBsdWdpblxuICogQHBhcmFtIHtmdW5jdGlvbn0gcGx1Z2luLmluc3RhbGxcbiAqIEByZXR1cm4ge2ludGVyYWN0fVxuICovXG5pbnRlcmFjdC51c2UgPSB1c2VcbmZ1bmN0aW9uIHVzZSAocGx1Z2luOiBJbnRlcmFjdC5QbHVnaW4sIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIHNjb3BlLnVzZVBsdWdpbihwbHVnaW4sIG9wdGlvbnMpXG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZWxlbWVudCBvciBzZWxlY3RvciBoYXMgYmVlbiBzZXQgd2l0aCB0aGUge0BsaW5rIGludGVyYWN0fVxuICogZnVuY3Rpb25cbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0LmlzU2V0XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBFbGVtZW50IGJlaW5nIHNlYXJjaGVkIGZvclxuICogQHJldHVybiB7Ym9vbGVhbn0gSW5kaWNhdGVzIGlmIHRoZSBlbGVtZW50IG9yIENTUyBzZWxlY3RvciB3YXMgcHJldmlvdXNseVxuICogcGFzc2VkIHRvIGludGVyYWN0XG4gKi9cbmludGVyYWN0LmlzU2V0ID0gaXNTZXRcbmZ1bmN0aW9uIGlzU2V0ICh0YXJnZXQ6IEludGVyYWN0LkVsZW1lbnQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgcmV0dXJuICEhc2NvcGUuaW50ZXJhY3RhYmxlcy5nZXQodGFyZ2V0LCBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dClcbn1cblxuLyoqXG4gKiBBZGQgYSBnbG9iYWwgbGlzdGVuZXIgZm9yIGFuIEludGVyYWN0RXZlbnQgb3IgYWRkcyBhIERPTSBldmVudCB0byBgZG9jdW1lbnRgXG4gKlxuICogQGFsaWFzIG1vZHVsZTppbnRlcmFjdC5vblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGUgVGhlIHR5cGVzIG9mIGV2ZW50cyB0byBsaXN0ZW4gZm9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gZXZlbnQgKHMpXG4gKiBAcGFyYW0ge29iamVjdCB8IGJvb2xlYW59IFtvcHRpb25zXSBvYmplY3Qgb3IgdXNlQ2FwdHVyZSBmbGFnIGZvclxuICogYWRkRXZlbnRMaXN0ZW5lclxuICogQHJldHVybiB7b2JqZWN0fSBpbnRlcmFjdFxuICovXG5pbnRlcmFjdC5vbiA9IG9uXG5mdW5jdGlvbiBvbiAodHlwZTogc3RyaW5nIHwgSW50ZXJhY3QuRXZlbnRUeXBlcywgbGlzdGVuZXI6IEludGVyYWN0Lkxpc3RlbmVyc0FyZywgb3B0aW9ucz86IG9iamVjdCkge1xuICBpZiAodXRpbHMuaXMuc3RyaW5nKHR5cGUpICYmIHR5cGUuc2VhcmNoKCcgJykgIT09IC0xKSB7XG4gICAgdHlwZSA9IHR5cGUudHJpbSgpLnNwbGl0KC8gKy8pXG4gIH1cblxuICBpZiAodXRpbHMuaXMuYXJyYXkodHlwZSkpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiAodHlwZSBhcyBhbnlbXSkpIHtcbiAgICAgIGludGVyYWN0Lm9uKGV2ZW50VHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0XG4gIH1cblxuICBpZiAodXRpbHMuaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIHR5cGUpIHtcbiAgICAgIGludGVyYWN0Lm9uKHByb3AsICh0eXBlIGFzIGFueSlbcHJvcF0sIGxpc3RlbmVyKVxuICAgIH1cblxuICAgIHJldHVybiBpbnRlcmFjdFxuICB9XG5cbiAgLy8gaWYgaXQgaXMgYW4gSW50ZXJhY3RFdmVudCB0eXBlLCBhZGQgbGlzdGVuZXIgdG8gZ2xvYmFsRXZlbnRzXG4gIGlmIChpc05vbk5hdGl2ZUV2ZW50KHR5cGUsIHNjb3BlLmFjdGlvbnMpKSB7XG4gICAgLy8gaWYgdGhpcyB0eXBlIG9mIGV2ZW50IHdhcyBuZXZlciBib3VuZFxuICAgIGlmICghZ2xvYmFsRXZlbnRzW3R5cGVdKSB7XG4gICAgICBnbG9iYWxFdmVudHNbdHlwZV0gPSBbbGlzdGVuZXJdXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZ2xvYmFsRXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpXG4gICAgfVxuICB9XG4gIC8vIElmIG5vbiBJbnRlcmFjdEV2ZW50IHR5cGUsIGFkZEV2ZW50TGlzdGVuZXIgdG8gZG9jdW1lbnRcbiAgZWxzZSB7XG4gICAgZXZlbnRzLmFkZChzY29wZS5kb2N1bWVudCwgdHlwZSwgbGlzdGVuZXIgYXMgSW50ZXJhY3QuTGlzdGVuZXIsIHsgb3B0aW9ucyB9KVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGdsb2JhbCBJbnRlcmFjdEV2ZW50IGxpc3RlbmVyIG9yIERPTSBldmVudCBmcm9tIGBkb2N1bWVudGBcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0Lm9mZlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGUgVGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHdlcmUgbGlzdGVuZWRcbiAqIGZvclxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIGJlIHJlbW92ZWRcbiAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gb3B0aW9ucyBbb3B0aW9uc10gb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAqIHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAqIEByZXR1cm4ge29iamVjdH0gaW50ZXJhY3RcbiAqL1xuaW50ZXJhY3Qub2ZmID0gb2ZmXG5mdW5jdGlvbiBvZmYgKHR5cGU6IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyOiBhbnksIG9wdGlvbnM/OiBvYmplY3QpIHtcbiAgaWYgKHV0aWxzLmlzLnN0cmluZyh0eXBlKSAmJiB0eXBlLnNlYXJjaCgnICcpICE9PSAtMSkge1xuICAgIHR5cGUgPSB0eXBlLnRyaW0oKS5zcGxpdCgvICsvKVxuICB9XG5cbiAgaWYgKHV0aWxzLmlzLmFycmF5KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgdHlwZSkge1xuICAgICAgaW50ZXJhY3Qub2ZmKGV2ZW50VHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0XG4gIH1cblxuICBpZiAodXRpbHMuaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIHR5cGUpIHtcbiAgICAgIGludGVyYWN0Lm9mZihwcm9wLCB0eXBlW3Byb3BdLCBsaXN0ZW5lcilcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJhY3RcbiAgfVxuXG4gIGlmIChpc05vbk5hdGl2ZUV2ZW50KHR5cGUsIHNjb3BlLmFjdGlvbnMpKSB7XG4gICAgbGV0IGluZGV4XG5cbiAgICBpZiAodHlwZSBpbiBnbG9iYWxFdmVudHMgJiZcbiAgICAgICAgKGluZGV4ID0gZ2xvYmFsRXZlbnRzW3R5cGVdLmluZGV4T2YobGlzdGVuZXIpKSAhPT0gLTEpIHtcbiAgICAgIGdsb2JhbEV2ZW50c1t0eXBlXS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGV2ZW50cy5yZW1vdmUoc2NvcGUuZG9jdW1lbnQsIHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbmludGVyYWN0LmRlYnVnID0gZGVidWdcbmZ1bmN0aW9uIGRlYnVnICgpIHtcbiAgcmV0dXJuIHNjb3BlXG59XG5cbi8vIGV4cG9zZSB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gY2FsY3VsYXRlIG11bHRpLXRvdWNoIHByb3BlcnRpZXNcbmludGVyYWN0LmdldFBvaW50ZXJBdmVyYWdlICA9IHV0aWxzLnBvaW50ZXIucG9pbnRlckF2ZXJhZ2VcbmludGVyYWN0LmdldFRvdWNoQkJveCAgICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94XG5pbnRlcmFjdC5nZXRUb3VjaERpc3RhbmNlICAgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2VcbmludGVyYWN0LmdldFRvdWNoQW5nbGUgICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hBbmdsZVxuXG5pbnRlcmFjdC5nZXRFbGVtZW50UmVjdCAgICAgICA9IHV0aWxzLmRvbS5nZXRFbGVtZW50UmVjdFxuaW50ZXJhY3QuZ2V0RWxlbWVudENsaWVudFJlY3QgPSB1dGlscy5kb20uZ2V0RWxlbWVudENsaWVudFJlY3RcbmludGVyYWN0Lm1hdGNoZXNTZWxlY3RvciAgICAgID0gdXRpbHMuZG9tLm1hdGNoZXNTZWxlY3RvclxuaW50ZXJhY3QuY2xvc2VzdCAgICAgICAgICAgICAgPSB1dGlscy5kb20uY2xvc2VzdFxuXG4vKipcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3Quc3VwcG9ydHNUb3VjaFxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBicm93c2VyIHN1cHBvcnRzIHRvdWNoIGlucHV0XG4gKi9cbmludGVyYWN0LnN1cHBvcnRzVG91Y2ggPSBzdXBwb3J0c1RvdWNoXG5mdW5jdGlvbiBzdXBwb3J0c1RvdWNoICgpIHtcbiAgcmV0dXJuIGJyb3dzZXIuc3VwcG9ydHNUb3VjaFxufVxuXG4vKipcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3Quc3VwcG9ydHNQb2ludGVyRXZlbnRcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgYnJvd3NlciBzdXBwb3J0cyBQb2ludGVyRXZlbnRzXG4gKi9cbmludGVyYWN0LnN1cHBvcnRzUG9pbnRlckV2ZW50ID0gc3VwcG9ydHNQb2ludGVyRXZlbnRcbmZ1bmN0aW9uIHN1cHBvcnRzUG9pbnRlckV2ZW50ICgpIHtcbiAgcmV0dXJuIGJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnRcbn1cblxuLyoqXG4gKiBDYW5jZWxzIGFsbCBpbnRlcmFjdGlvbnMgKGVuZCBldmVudHMgYXJlIG5vdCBmaXJlZClcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0LnN0b3BcbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9IGludGVyYWN0XG4gKi9cbmludGVyYWN0LnN0b3AgPSBzdG9wXG5mdW5jdGlvbiBzdG9wICgpIHtcbiAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgIGludGVyYWN0aW9uLnN0b3AoKVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogUmV0dXJucyBvciBzZXRzIHRoZSBkaXN0YW5jZSB0aGUgcG9pbnRlciBtdXN0IGJlIG1vdmVkIGJlZm9yZSBhbiBhY3Rpb25cbiAqIHNlcXVlbmNlIG9jY3Vycy4gVGhpcyBhbHNvIGFmZmVjdHMgdG9sZXJhbmNlIGZvciB0YXAgZXZlbnRzLlxuICpcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3QucG9pbnRlck1vdmVUb2xlcmFuY2VcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW25ld1ZhbHVlXSBUaGUgbW92ZW1lbnQgZnJvbSB0aGUgc3RhcnQgcG9zaXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZVxuICogQHJldHVybiB7aW50ZXJhY3QgfCBudW1iZXJ9XG4gKi9cbmludGVyYWN0LnBvaW50ZXJNb3ZlVG9sZXJhbmNlID0gcG9pbnRlck1vdmVUb2xlcmFuY2VcbmZ1bmN0aW9uIHBvaW50ZXJNb3ZlVG9sZXJhbmNlIChuZXdWYWx1ZT86IG51bWJlcikge1xuICBpZiAodXRpbHMuaXMubnVtYmVyKG5ld1ZhbHVlKSkge1xuICAgIHNjb3BlLmludGVyYWN0aW9ucy5wb2ludGVyTW92ZVRvbGVyYW5jZSA9IG5ld1ZhbHVlXG5cbiAgICByZXR1cm4gaW50ZXJhY3RcbiAgfVxuXG4gIHJldHVybiBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2Vcbn1cblxuaW50ZXJhY3QuYWRkRG9jdW1lbnQgPSAoZG9jLCBvcHRpb25zKSA9PiBzY29wZS5hZGREb2N1bWVudChkb2MsIG9wdGlvbnMpXG5pbnRlcmFjdC5yZW1vdmVEb2N1bWVudCA9IGRvYyA9PiBzY29wZS5yZW1vdmVEb2N1bWVudChkb2MpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuaW50ZXJhY3QudmVyc2lvbiA9IHByb2Nlc3MuZW52Lm5wbV9wYWNrYWdlX3ZlcnNpb25cblxuc2NvcGUuaW50ZXJhY3QgPSBpbnRlcmFjdFxuXG5leHBvcnQgeyBzY29wZSB9XG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuIiwiaW1wb3J0ICdAaW50ZXJhY3Rqcy90eXBlcy9pbmRleCdcbmltcG9ydCBhY3Rpb25zIGZyb20gJ0BpbnRlcmFjdGpzL2FjdGlvbnMvaW5kZXgnXG5pbXBvcnQgYXV0b1Njcm9sbCBmcm9tICdAaW50ZXJhY3Rqcy9hdXRvLXNjcm9sbC9pbmRleCdcbmltcG9ydCBhdXRvU3RhcnQgZnJvbSAnQGludGVyYWN0anMvYXV0by1zdGFydC9pbmRleCdcbmltcG9ydCBkZXZUb29scyBmcm9tICdAaW50ZXJhY3Rqcy9kZXYtdG9vbHMvaW5kZXgnXG5pbXBvcnQgaW5lcnRpYSBmcm9tICdAaW50ZXJhY3Rqcy9pbmVydGlhL2luZGV4J1xuaW1wb3J0IG1vZGlmaWVycyBmcm9tICdAaW50ZXJhY3Rqcy9tb2RpZmllcnMvaW5kZXgnXG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0BpbnRlcmFjdGpzL29mZnNldCdcbmltcG9ydCBwb2ludGVyRXZlbnRzIGZyb20gJ0BpbnRlcmFjdGpzL3BvaW50ZXItZXZlbnRzL2luZGV4J1xuaW1wb3J0IHJlZmxvdyBmcm9tICdAaW50ZXJhY3Rqcy9yZWZsb3cvaW5kZXgnXG5pbXBvcnQgaW50ZXJhY3QsIHsgaW5pdCBhcyBpbml0SW50ZXJhY3QgfSBmcm9tICdAaW50ZXJhY3Rqcy9pbnRlcmFjdC9pbmRleCdcblxuaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmICEhd2luZG93KSB7XG4gIGluaXQod2luZG93KVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCAod2luOiBXaW5kb3cpIHtcbiAgaW5pdEludGVyYWN0KHdpbilcblxuICBpbnRlcmFjdC51c2Uob2Zmc2V0KVxuXG4gIC8vIHBvaW50ZXJFdmVudHNcbiAgaW50ZXJhY3QudXNlKHBvaW50ZXJFdmVudHMpXG5cbiAgLy8gaW5lcnRpYVxuICBpbnRlcmFjdC51c2UoaW5lcnRpYSlcblxuICAvLyBzbmFwLCByZXNpemUsIGV0Yy5cbiAgaW50ZXJhY3QudXNlKG1vZGlmaWVycylcblxuICAvLyBhdXRvU3RhcnQsIGhvbGRcbiAgaW50ZXJhY3QudXNlKGF1dG9TdGFydClcblxuICAvLyBkcmFnIGFuZCBkcm9wLCByZXNpemUsIGdlc3R1cmVcbiAgaW50ZXJhY3QudXNlKGFjdGlvbnMpXG5cbiAgLy8gYXV0b1Njcm9sbFxuICBpbnRlcmFjdC51c2UoYXV0b1Njcm9sbClcblxuICAvLyByZWZsb3dcbiAgaW50ZXJhY3QudXNlKHJlZmxvdylcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpbnRlcmFjdC51c2UoZGV2VG9vbHMpXG4gIH1cblxuICByZXR1cm4gaW50ZXJhY3Rcbn1cbiIsImltcG9ydCBpbnRlcmFjdCwgeyBpbml0IH0gZnJvbSAnQGludGVyYWN0anMvaW50ZXJhY3Rqcy9pbmRleCdcblxuaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmICEhbW9kdWxlKSB7XG4gIHRyeSB7IG1vZHVsZS5leHBvcnRzID0gaW50ZXJhY3QgfVxuICBjYXRjaCB7fVxufVxuXG4oaW50ZXJhY3QgYXMgYW55KS5kZWZhdWx0ID0gaW50ZXJhY3RcbjsoaW50ZXJhY3QgYXMgYW55KS5pbml0ID0gaW5pdFxuXG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuZXhwb3J0IHsgaW5pdCB9XG4iLCJcbnJldHVybiBfJGluZGV4XzY5O1xuXG59KTtcbiJdfQ== diff --git a/interactjs/dist/interact.min.js.map b/interactjs/dist/interact.min.js.map new file mode 100644 index 000000000..aa7d5afa2 --- /dev/null +++ b/interactjs/dist/interact.min.js.map @@ -0,0 +1,10803 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.interact = f()}})(function(){var define,module,exports; +var createModuleFactory = function createModuleFactory(t){var e;return function(r){return e||t(e={exports:{},parent:r},e.exports),e.exports}}; +var _$Interactable_16 = createModuleFactory(function (module, exports) { +"use strict"; + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = exports.Interactable = void 0; + +var arr = _interopRequireWildcard(_$arr_49); + +var _browser = _interopRequireDefault(_$browser_50); + +var _clone = _interopRequireDefault(_$clone_51); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var _events = _interopRequireDefault(_$events_54); + +var _extend = _interopRequireDefault(_$extend_55); + +var is = _interopRequireWildcard(_$is_59); + +var _normalizeListeners = _interopRequireDefault(_$normalizeListeners_61); + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +var _Eventable = _interopRequireDefault(_$Eventable_14); + +var _scope = _$scope_24({}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/** */ +var Interactable = /*#__PURE__*/function () { + _createClass(Interactable, [{ + key: "_defaults", + get: function get() { + return { + base: {}, + perAction: {}, + actions: {} + }; + } + }]); + + /** */ + function Interactable(target, options, defaultContext) { + _classCallCheck(this, Interactable); + + _defineProperty(this, "options", void 0); + + _defineProperty(this, "_actions", void 0); + + _defineProperty(this, "target", void 0); + + _defineProperty(this, "events", new _Eventable["default"]()); + + _defineProperty(this, "_context", void 0); + + _defineProperty(this, "_win", void 0); + + _defineProperty(this, "_doc", void 0); + + this._actions = options.actions; + this.target = target; + this._context = options.context || defaultContext; + this._win = (0, _$window_68.getWindow)((0, _$domUtils_53.trySelector)(target) ? this._context : target); + this._doc = this._win.document; + this.set(options); + } + + _createClass(Interactable, [{ + key: "setOnEvents", + value: function setOnEvents(actionName, phases) { + if (is.func(phases.onstart)) { + this.on("".concat(actionName, "start"), phases.onstart); + } + + if (is.func(phases.onmove)) { + this.on("".concat(actionName, "move"), phases.onmove); + } + + if (is.func(phases.onend)) { + this.on("".concat(actionName, "end"), phases.onend); + } + + if (is.func(phases.oninertiastart)) { + this.on("".concat(actionName, "inertiastart"), phases.oninertiastart); + } + + return this; + } + }, { + key: "updatePerActionListeners", + value: function updatePerActionListeners(actionName, prev, cur) { + if (is.array(prev) || is.object(prev)) { + this.off(actionName, prev); + } + + if (is.array(cur) || is.object(cur)) { + this.on(actionName, cur); + } + } + }, { + key: "setPerAction", + value: function setPerAction(actionName, options) { + var defaults = this._defaults; // for all the default per-action options + + for (var optionName_ in options) { + var optionName = optionName_; + var actionOptions = this.options[actionName]; + var optionValue = options[optionName]; // remove old event listeners and add new ones + + if (optionName === 'listeners') { + this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue); + } // if the option value is an array + + + if (is.array(optionValue)) { + actionOptions[optionName] = arr.from(optionValue); + } // if the option value is an object + else if (is.plainObject(optionValue)) { + // copy the object + actionOptions[optionName] = (0, _extend["default"])(actionOptions[optionName] || {}, (0, _clone["default"])(optionValue)); // set anabled field to true if it exists in the defaults + + if (is.object(defaults.perAction[optionName]) && 'enabled' in defaults.perAction[optionName]) { + actionOptions[optionName].enabled = optionValue.enabled !== false; + } + } // if the option value is a boolean and the default is an object + else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) { + actionOptions[optionName].enabled = optionValue; + } // if it's anything else, do a plain assignment + else { + actionOptions[optionName] = optionValue; + } + } + } + /** + * The default function to get an Interactables bounding rect. Can be + * overridden using {@link Interactable.rectChecker}. + * + * @param {Element} [element] The element to measure. + * @return {object} The object's bounding rectangle. + */ + + }, { + key: "getRect", + value: function getRect(element) { + element = element || (is.element(this.target) ? this.target : null); + + if (is.string(this.target)) { + element = element || this._context.querySelector(this.target); + } + + return (0, _$domUtils_53.getElementRect)(element); + } + /** + * Returns or sets the function used to calculate the interactable's + * element's rectangle + * + * @param {function} [checker] A function which returns this Interactable's + * bounding rectangle. See {@link Interactable.getRect} + * @return {function | object} The checker function or this Interactable + */ + + }, { + key: "rectChecker", + value: function rectChecker(checker) { + if (is.func(checker)) { + this.getRect = checker; + return this; + } + + if (checker === null) { + delete this.getRect; + return this; + } + + return this.getRect; + } + }, { + key: "_backCompatOption", + value: function _backCompatOption(optionName, newValue) { + if ((0, _$domUtils_53.trySelector)(newValue) || is.object(newValue)) { + this.options[optionName] = newValue; + + for (var action in this._actions.map) { + this.options[action][optionName] = newValue; + } + + return this; + } + + return this.options[optionName]; + } + /** + * Gets or sets the origin of the Interactable's element. The x and y + * of the origin will be subtracted from action event coordinates. + * + * @param {Element | object | string} [origin] An HTML or SVG Element whose + * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self' + * or any CSS selector + * + * @return {object} The current origin or this Interactable + */ + + }, { + key: "origin", + value: function origin(newValue) { + return this._backCompatOption('origin', newValue); + } + /** + * Returns or sets the mouse coordinate types used to calculate the + * movement of the pointer. + * + * @param {string} [newValue] Use 'client' if you will be scrolling while + * interacting; Use 'page' if you want autoScroll to work + * @return {string | object} The current deltaSource or this Interactable + */ + + }, { + key: "deltaSource", + value: function deltaSource(newValue) { + if (newValue === 'page' || newValue === 'client') { + this.options.deltaSource = newValue; + return this; + } + + return this.options.deltaSource; + } + /** + * Gets the selector context Node of the Interactable. The default is + * `window.document`. + * + * @return {Node} The context Node of this Interactable + */ + + }, { + key: "context", + value: function context() { + return this._context; + } + }, { + key: "inContext", + value: function inContext(element) { + return this._context === element.ownerDocument || (0, _$domUtils_53.nodeContains)(this._context, element); + } + }, { + key: "testIgnoreAllow", + value: function testIgnoreAllow(options, targetNode, eventTarget) { + return !this.testIgnore(options.ignoreFrom, targetNode, eventTarget) && this.testAllow(options.allowFrom, targetNode, eventTarget); + } + }, { + key: "testAllow", + value: function testAllow(allowFrom, targetNode, element) { + if (!allowFrom) { + return true; + } + + if (!is.element(element)) { + return false; + } + + if (is.string(allowFrom)) { + return (0, _$domUtils_53.matchesUpTo)(element, allowFrom, targetNode); + } else if (is.element(allowFrom)) { + return (0, _$domUtils_53.nodeContains)(allowFrom, element); + } + + return false; + } + }, { + key: "testIgnore", + value: function testIgnore(ignoreFrom, targetNode, element) { + if (!ignoreFrom || !is.element(element)) { + return false; + } + + if (is.string(ignoreFrom)) { + return (0, _$domUtils_53.matchesUpTo)(element, ignoreFrom, targetNode); + } else if (is.element(ignoreFrom)) { + return (0, _$domUtils_53.nodeContains)(ignoreFrom, element); + } + + return false; + } + /** + * Calls listeners for the given InteractEvent type bound globally + * and directly to this Interactable + * + * @param {InteractEvent} iEvent The InteractEvent object to be fired on this + * Interactable + * @return {Interactable} this Interactable + */ + + }, { + key: "fire", + value: function fire(iEvent) { + this.events.fire(iEvent); + return this; + } + }, { + key: "_onOff", + value: function _onOff(method, typeArg, listenerArg, options) { + if (is.object(typeArg) && !is.array(typeArg)) { + options = listenerArg; + listenerArg = null; + } + + var addRemove = method === 'on' ? 'add' : 'remove'; + var listeners = (0, _normalizeListeners["default"])(typeArg, listenerArg); + + for (var type in listeners) { + if (type === 'wheel') { + type = _browser["default"].wheelEvent; + } + + for (var _i = 0; _i < listeners[type].length; _i++) { + var _ref; + + _ref = listeners[type][_i]; + var listener = _ref; + + // if it is an action event type + if ((0, _scope.isNonNativeEvent)(type, this._actions)) { + this.events[method](type, listener); + } // delegated event + else if (is.string(this.target)) { + _events["default"]["".concat(addRemove, "Delegate")](this.target, this._context, type, listener, options); + } // remove listener from this Interactable's element + else { + _events["default"][addRemove](this.target, type, listener, options); + } + } + } + + return this; + } + /** + * Binds a listener for an InteractEvent, pointerEvent or DOM event. + * + * @param {string | array | object} types The types of events to listen + * for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * addEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "on", + value: function on(types, listener, options) { + return this._onOff('on', types, listener, options); + } + /** + * Removes an InteractEvent, pointerEvent or DOM event listener. + * + * @param {string | array | object} types The types of events that were + * listened for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * removeEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "off", + value: function off(types, listener, options) { + return this._onOff('off', types, listener, options); + } + /** + * Reset the options of this Interactable + * + * @param {object} options The new settings to apply + * @return {object} This Interactable + */ + + }, { + key: "set", + value: function set(options) { + var defaults = this._defaults; + + if (!is.object(options)) { + options = {}; + } + + this.options = (0, _clone["default"])(defaults.base); + + for (var actionName_ in this._actions.methodDict) { + var actionName = actionName_; + var methodName = this._actions.methodDict[actionName]; + this.options[actionName] = {}; + this.setPerAction(actionName, (0, _extend["default"])((0, _extend["default"])({}, defaults.perAction), defaults.actions[actionName])); + this[methodName](options[actionName]); + } + + for (var setting in options) { + if (is.func(this[setting])) { + this[setting](options[setting]); + } + } + + return this; + } + /** + * Remove this interactable from the list of interactables and remove it's + * action capabilities and event listeners + * + * @return {interact} + */ + + }, { + key: "unset", + value: function unset() { + _events["default"].remove(this.target, 'all'); + + if (is.string(this.target)) { + // remove delegated events + for (var type in _events["default"].delegatedEvents) { + var delegated = _events["default"].delegatedEvents[type]; + + if (delegated.selectors[0] === this.target && delegated.contexts[0] === this._context) { + delegated.selectors.splice(0, 1); + delegated.contexts.splice(0, 1); + delegated.listeners.splice(0, 1); + } + + _events["default"].remove(this._context, type, _events["default"].delegateListener); + + _events["default"].remove(this._context, type, _events["default"].delegateUseCapture, true); + } + } else { + _events["default"].remove(this.target, 'all'); + } + } + }]); + + return Interactable; +}(); + +exports.Interactable = Interactable; +var _default = Interactable; +exports["default"] = _default; + +}); +var _$scope_24 = createModuleFactory(function (module, exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +/* common-shake removed: exports.createScope = */ void createScope; +exports.isNonNativeEvent = isNonNativeEvent; +/* common-shake removed: exports.initScope = */ void initScope; +exports.Scope = void 0; + +var _domObjects = _interopRequireDefault(_$domObjects_52); + +var utils = _interopRequireWildcard(_$index_58); + +var _defaultOptions = _interopRequireDefault(_$defaultOptions_20); + +var _Eventable = _interopRequireDefault(_$Eventable_14); + +var _Interactable = _interopRequireDefault(_$Interactable_16({})); + +var _InteractableSet = _interopRequireDefault(_$InteractableSet_17); + +var _InteractEvent = _interopRequireDefault(_$InteractEvent_15); + +var _interactions = _interopRequireDefault(_$interactions_23({})); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var win = utils.win, + browser = utils.browser, + raf = utils.raf, + events = utils.events; // eslint-disable-next-line @typescript-eslint/no-empty-interface + +function createScope() { + return new Scope(); +} + +var Scope = /*#__PURE__*/function () { + // main window + // main document + // main window + // all documents being listened to + function Scope() { + var _this = this; + + _classCallCheck(this, Scope); + + _defineProperty(this, "id", "__interact_scope_".concat(Math.floor(Math.random() * 100))); + + _defineProperty(this, "isInitialized", false); + + _defineProperty(this, "listenerMaps", []); + + _defineProperty(this, "browser", browser); + + _defineProperty(this, "events", events); + + _defineProperty(this, "utils", utils); + + _defineProperty(this, "defaults", utils.clone(_defaultOptions["default"])); + + _defineProperty(this, "Eventable", _Eventable["default"]); + + _defineProperty(this, "actions", { + map: {}, + phases: { + start: true, + move: true, + end: true + }, + methodDict: {}, + phaselessTypes: {} + }); + + _defineProperty(this, "InteractEvent", _InteractEvent["default"]); + + _defineProperty(this, "Interactable", void 0); + + _defineProperty(this, "interactables", new _InteractableSet["default"](this)); + + _defineProperty(this, "_win", void 0); + + _defineProperty(this, "document", void 0); + + _defineProperty(this, "window", void 0); + + _defineProperty(this, "documents", []); + + _defineProperty(this, "_plugins", { + list: [], + map: {} + }); + + _defineProperty(this, "onWindowUnload", function (event) { + return _this.removeDocument(event.target); + }); + + var scope = this; + + this.Interactable = /*#__PURE__*/function (_InteractableBase) { + _inherits(_class, _InteractableBase); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "set", + value: function set(options) { + _get(_getPrototypeOf(_class.prototype), "set", this).call(this, options); + + scope.fire('interactable:set', { + options: options, + interactable: this + }); + return this; + } + }, { + key: "unset", + value: function unset() { + _get(_getPrototypeOf(_class.prototype), "unset", this).call(this); + + scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1); + scope.fire('interactable:unset', { + interactable: this + }); + } + }, { + key: "_defaults", + get: function get() { + return scope.defaults; + } + }]); + + return _class; + }(_Interactable["default"]); + } + + _createClass(Scope, [{ + key: "addListeners", + value: function addListeners(map, id) { + this.listenerMaps.push({ + id: id, + map: map + }); + } + }, { + key: "fire", + value: function fire(name, arg) { + for (var _i = 0; _i < this.listenerMaps.length; _i++) { + var _ref; + + _ref = this.listenerMaps[_i]; + var _ref2 = _ref, + listener = _ref2.map[name]; + + if (!!listener && listener(arg, this, name) === false) { + return false; + } + } + } + }, { + key: "init", + value: function init(window) { + return this.isInitialized ? this : initScope(this, window); + } + }, { + key: "pluginIsInstalled", + value: function pluginIsInstalled(plugin) { + return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1; + } + }, { + key: "usePlugin", + value: function usePlugin(plugin, options) { + if (this.pluginIsInstalled(plugin)) { + return this; + } + + if (plugin.id) { + this._plugins.map[plugin.id] = plugin; + } + + this._plugins.list.push(plugin); + + if (plugin.install) { + plugin.install(this, options); + } + + if (plugin.listeners && plugin.before) { + var _index = 0; + var len = this.listenerMaps.length; + var before = plugin.before.reduce(function (acc, id) { + acc[id] = true; + return acc; + }, {}); + + for (; _index < len; _index++) { + var otherId = this.listenerMaps[_index].id; + + if (before[otherId]) { + break; + } + } + + this.listenerMaps.splice(_index, 0, { + id: plugin.id, + map: plugin.listeners + }); + } else if (plugin.listeners) { + this.listenerMaps.push({ + id: plugin.id, + map: plugin.listeners + }); + } + + return this; + } + }, { + key: "addDocument", + value: function addDocument(doc, options) { + // do nothing if document is already known + if (this.getDocIndex(doc) !== -1) { + return false; + } + + var window = win.getWindow(doc); + options = options ? utils.extend({}, options) : {}; + this.documents.push({ + doc: doc, + options: options + }); + events.documents.push(doc); // don't add an unload event for the main document + // so that the page may be cached in browser history + + if (doc !== this.document) { + events.add(window, 'unload', this.onWindowUnload); + } + + this.fire('scope:add-document', { + doc: doc, + window: window, + scope: this, + options: options + }); + } + }, { + key: "removeDocument", + value: function removeDocument(doc) { + var index = this.getDocIndex(doc); + var window = win.getWindow(doc); + var options = this.documents[index].options; + events.remove(window, 'unload', this.onWindowUnload); + this.documents.splice(index, 1); + events.documents.splice(index, 1); + this.fire('scope:remove-document', { + doc: doc, + window: window, + scope: this, + options: options + }); + } + }, { + key: "getDocIndex", + value: function getDocIndex(doc) { + for (var i = 0; i < this.documents.length; i++) { + if (this.documents[i].doc === doc) { + return i; + } + } + + return -1; + } + }, { + key: "getDocOptions", + value: function getDocOptions(doc) { + var docIndex = this.getDocIndex(doc); + return docIndex === -1 ? null : this.documents[docIndex].options; + } + }, { + key: "now", + value: function now() { + return (this.window.Date || Date).now(); + } + }]); + + return Scope; +}(); + +exports.Scope = Scope; + +function isNonNativeEvent(type, actions) { + if (actions.phaselessTypes[type]) { + return true; + } + + for (var name in actions.map) { + if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) { + return true; + } + } + + return false; +} + +function initScope(scope, window) { + scope.isInitialized = true; + win.init(window); + + _domObjects["default"].init(window); + + browser.init(window); + raf.init(window); + events.init(window); + scope.usePlugin(_interactions["default"]); + scope.document = window.document; + scope.window = window; + return scope; +} + +}); +var _$interactions_23 = createModuleFactory(function (module, exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _browser = _interopRequireDefault(_$browser_50); + +var _domObjects = _interopRequireDefault(_$domObjects_52); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var _events = _interopRequireDefault(_$events_54); + +var pointerUtils = _interopRequireWildcard(_$pointerUtils_63); + +var _Interaction = _interopRequireDefault(_$Interaction_18); + +var _interactionFinder = _interopRequireDefault(_$interactionFinder_22); + +var _scope = _$scope_24({}); + +var _interactablePreventDefault = _interopRequireDefault(_$interactablePreventDefault_21); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +var methodNames = ['pointerDown', 'pointerMove', 'pointerUp', 'updatePointer', 'removePointer', 'windowBlur']; + +function install(scope) { + var listeners = {}; + + for (var _i = 0; _i < methodNames.length; _i++) { + var _ref; + + _ref = methodNames[_i]; + var method = _ref; + listeners[method] = doOnInteractions(method, scope); + } + + var pEventTypes = _browser["default"].pEventTypes; + var docEvents; + + if (_domObjects["default"].PointerEvent) { + docEvents = [{ + type: pEventTypes.down, + listener: releasePointersOnRemovedEls + }, { + type: pEventTypes.down, + listener: listeners.pointerDown + }, { + type: pEventTypes.move, + listener: listeners.pointerMove + }, { + type: pEventTypes.up, + listener: listeners.pointerUp + }, { + type: pEventTypes.cancel, + listener: listeners.pointerUp + }]; + } else { + docEvents = [{ + type: 'mousedown', + listener: listeners.pointerDown + }, { + type: 'mousemove', + listener: listeners.pointerMove + }, { + type: 'mouseup', + listener: listeners.pointerUp + }, { + type: 'touchstart', + listener: releasePointersOnRemovedEls + }, { + type: 'touchstart', + listener: listeners.pointerDown + }, { + type: 'touchmove', + listener: listeners.pointerMove + }, { + type: 'touchend', + listener: listeners.pointerUp + }, { + type: 'touchcancel', + listener: listeners.pointerUp + }]; + } + + docEvents.push({ + type: 'blur', + listener: function listener(event) { + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref2; + + _ref2 = scope.interactions.list[_i2]; + var interaction = _ref2; + interaction.documentBlur(event); + } + } + }); // for ignoring browser's simulated mouse events + + scope.prevTouchTime = 0; + + scope.Interaction = /*#__PURE__*/function (_InteractionBase) { + _inherits(_class, _InteractionBase); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "_now", + value: function _now() { + return scope.now(); + } + }, { + key: "pointerMoveTolerance", + get: function get() { + return scope.interactions.pointerMoveTolerance; + }, + set: function set(value) { + scope.interactions.pointerMoveTolerance = value; + } + }]); + + return _class; + }(_Interaction["default"]); + + scope.interactions = { + // all active and idle interactions + list: [], + "new": function _new(options) { + options.scopeFire = function (name, arg) { + return scope.fire(name, arg); + }; + + var interaction = new scope.Interaction(options); + scope.interactions.list.push(interaction); + return interaction; + }, + listeners: listeners, + docEvents: docEvents, + pointerMoveTolerance: 1 + }; + + function releasePointersOnRemovedEls() { + // for all inactive touch interactions with pointers down + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref3; + + _ref3 = scope.interactions.list[_i3]; + var interaction = _ref3; + + if (!interaction.pointerIsDown || interaction.pointerType !== 'touch' || interaction._interacting) { + continue; + } // if a pointer is down on an element that is no longer in the DOM tree + + + var _loop = function _loop() { + _ref4 = interaction.pointers[_i4]; + var pointer = _ref4; + + if (!scope.documents.some(function (_ref5) { + var doc = _ref5.doc; + return (0, _$domUtils_53.nodeContains)(doc, pointer.downTarget); + })) { + // remove the pointer from the interaction + interaction.removePointer(pointer.pointer, pointer.event); + } + }; + + for (var _i4 = 0; _i4 < interaction.pointers.length; _i4++) { + var _ref4; + + _loop(); + } + } + } + + scope.usePlugin(_interactablePreventDefault["default"]); +} + +function doOnInteractions(method, scope) { + return function (event) { + var interactions = scope.interactions.list; + var pointerType = pointerUtils.getPointerType(event); + + var _pointerUtils$getEven = pointerUtils.getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 2), + eventTarget = _pointerUtils$getEven2[0], + curEventTarget = _pointerUtils$getEven2[1]; + + var matches = []; // [ [pointer, interaction], ...] + + if (/^touch/.test(event.type)) { + scope.prevTouchTime = scope.now(); + + for (var _i5 = 0; _i5 < event.changedTouches.length; _i5++) { + var _ref6; + + _ref6 = event.changedTouches[_i5]; + var changedTouch = _ref6; + var pointer = changedTouch; + var pointerId = pointerUtils.getPointerId(pointer); + var searchDetails = { + pointer: pointer, + pointerId: pointerId, + pointerType: pointerType, + eventType: event.type, + eventTarget: eventTarget, + curEventTarget: curEventTarget, + scope: scope + }; + var interaction = getInteraction(searchDetails); + matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]); + } + } else { + var invalidPointer = false; + + if (!_browser["default"].supportsPointerEvent && /mouse/.test(event.type)) { + // ignore mouse events while touch interactions are active + for (var i = 0; i < interactions.length && !invalidPointer; i++) { + invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown; + } // try to ignore mouse events that are simulated by the browser + // after a touch event + + + invalidPointer = invalidPointer || scope.now() - scope.prevTouchTime < 500 || // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated + event.timeStamp === 0; + } + + if (!invalidPointer) { + var _searchDetails = { + pointer: event, + pointerId: pointerUtils.getPointerId(event), + pointerType: pointerType, + eventType: event.type, + curEventTarget: curEventTarget, + eventTarget: eventTarget, + scope: scope + }; + + var _interaction = getInteraction(_searchDetails); + + matches.push([_searchDetails.pointer, _searchDetails.eventTarget, _searchDetails.curEventTarget, _interaction]); + } + } // eslint-disable-next-line no-shadow + + + for (var _i6 = 0; _i6 < matches.length; _i6++) { + var _matches$_i = _slicedToArray(matches[_i6], 4), + _pointer = _matches$_i[0], + _eventTarget = _matches$_i[1], + _curEventTarget = _matches$_i[2], + _interaction2 = _matches$_i[3]; + + _interaction2[method](_pointer, event, _eventTarget, _curEventTarget); + } + }; +} + +function getInteraction(searchDetails) { + var pointerType = searchDetails.pointerType, + scope = searchDetails.scope; + + var foundInteraction = _interactionFinder["default"].search(searchDetails); + + var signalArg = { + interaction: foundInteraction, + searchDetails: searchDetails + }; + scope.fire('interactions:find', signalArg); + return signalArg.interaction || scope.interactions["new"]({ + pointerType: pointerType + }); +} + +function onDocSignal(_ref7, eventMethodName) { + var doc = _ref7.doc, + scope = _ref7.scope, + options = _ref7.options; + var docEvents = scope.interactions.docEvents; + var eventMethod = _events["default"][eventMethodName]; + + if (scope.browser.isIOS && !options.events) { + options.events = { + passive: false + }; + } // delegate event listener + + + for (var eventType in _events["default"].delegatedEvents) { + eventMethod(doc, eventType, _events["default"].delegateListener); + eventMethod(doc, eventType, _events["default"].delegateUseCapture, true); + } + + var eventOptions = options && options.events; + + for (var _i7 = 0; _i7 < docEvents.length; _i7++) { + var _ref8; + + _ref8 = docEvents[_i7]; + var _ref9 = _ref8, + _type = _ref9.type, + listener = _ref9.listener; + eventMethod(doc, _type, listener, eventOptions); + } +} + +var interactions = { + id: 'core/interactions', + install: install, + listeners: { + 'scope:add-document': function scopeAddDocument(arg) { + return onDocSignal(arg, 'add'); + }, + 'scope:remove-document': function scopeRemoveDocument(arg) { + return onDocSignal(arg, 'remove'); + }, + 'interactable:unset': function interactableUnset(_ref10, scope) { + var interactable = _ref10.interactable; + + // Stop and destroy related interactions when an Interactable is unset + for (var i = scope.interactions.list.length - 1; i >= 0; i--) { + var interaction = scope.interactions.list[i]; + + if (interaction.interactable !== interactable) { + continue; + } + + interaction.stop(); + scope.fire('interactions:destroy', { + interaction: interaction + }); + interaction.destroy(); + + if (scope.interactions.list.length > 2) { + scope.interactions.list.splice(i, 1); + } + } + } + }, + onDocSignal: onDocSignal, + doOnInteractions: doOnInteractions, + methodNames: methodNames +}; +var _default = interactions; +exports["default"] = _default; + +}); +var _$index_48 = {}; +/// +"use strict"; + +var _$isWindow_60 = {}; +"use strict"; + +Object.defineProperty(_$isWindow_60, "__esModule", { + value: true +}); +_$isWindow_60["default"] = void 0; + +var _default = function _default(thing) { + return !!(thing && thing.Window) && thing instanceof thing.Window; +}; + +_$isWindow_60["default"] = _default; + +var _$window_68 = {}; +"use strict"; + +Object.defineProperty(_$window_68, "__esModule", { + value: true +}); +_$window_68.init = init; +_$window_68.getWindow = getWindow; +_$window_68["default"] = void 0; + +var _isWindow = _interopRequireDefault(_$isWindow_60); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var win = { + realWindow: undefined, + window: undefined, + getWindow: getWindow, + init: init +}; + +function init(window) { + // get wrapped window if using Shadow DOM polyfill + win.realWindow = window; // create a TextNode + + var el = window.document.createTextNode(''); // check if it's wrapped by a polyfill + + if (el.ownerDocument !== window.document && typeof window.wrap === 'function' && window.wrap(el) === el) { + // use wrapped window + window = window.wrap(window); + } + + win.window = window; +} + +if (typeof window === 'undefined') { + win.window = undefined; + win.realWindow = undefined; +} else { + init(window); +} + +function getWindow(node) { + if ((0, _isWindow["default"])(node)) { + return node; + } + + var rootNode = node.ownerDocument || node; + return rootNode.defaultView || win.window; +} + +win.init = init; +var ___default_68 = win; +_$window_68["default"] = ___default_68; + +var _$is_59 = {}; +"use strict"; + +Object.defineProperty(_$is_59, "__esModule", { + value: true +}); +_$is_59.array = _$is_59.plainObject = _$is_59.element = _$is_59.string = _$is_59.bool = _$is_59.number = _$is_59.func = _$is_59.object = _$is_59.docFrag = _$is_59.window = void 0; + +var ___isWindow_59 = ___interopRequireDefault_59(_$isWindow_60); + +var _window2 = ___interopRequireDefault_59(_$window_68); + +function ___interopRequireDefault_59(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var __window_59 = function window(thing) { + return thing === _window2["default"].window || (0, ___isWindow_59["default"])(thing); +}; + +_$is_59.window = __window_59; + +var docFrag = function docFrag(thing) { + return object(thing) && thing.nodeType === 11; +}; + +_$is_59.docFrag = docFrag; + +var object = function object(thing) { + return !!thing && _typeof(thing) === 'object'; +}; + +_$is_59.object = object; + +var func = function func(thing) { + return typeof thing === 'function'; +}; + +_$is_59.func = func; + +var number = function number(thing) { + return typeof thing === 'number'; +}; + +_$is_59.number = number; + +var bool = function bool(thing) { + return typeof thing === 'boolean'; +}; + +_$is_59.bool = bool; + +var string = function string(thing) { + return typeof thing === 'string'; +}; + +_$is_59.string = string; + +var element = function element(thing) { + if (!thing || _typeof(thing) !== 'object') { + return false; + } + + var _window = _window2["default"].getWindow(thing) || _window2["default"].window; + + return /object|function/.test(_typeof(_window.Element)) ? thing instanceof _window.Element // DOM2 + : thing.nodeType === 1 && typeof thing.nodeName === 'string'; +}; + +_$is_59.element = element; + +var plainObject = function plainObject(thing) { + return object(thing) && !!thing.constructor && /function Object\b/.test(thing.constructor.toString()); +}; + +_$is_59.plainObject = plainObject; + +var array = function array(thing) { + return object(thing) && typeof thing.length !== 'undefined' && func(thing.splice); +}; + +_$is_59.array = array; + +var _$drag_1 = {}; +"use strict"; + +function ___typeof_1(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_1 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_1 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_1(obj); } + +Object.defineProperty(_$drag_1, "__esModule", { + value: true +}); +_$drag_1["default"] = void 0; + +var is = _interopRequireWildcard(_$is_59); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_1(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function install(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + defaults = scope.defaults; + Interactable.prototype.draggable = drag.draggable; + actions.map.drag = drag; + actions.methodDict.drag = 'draggable'; + defaults.actions.drag = drag.defaults; +} + +function beforeMove(_ref) { + var interaction = _ref.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x') { + interaction.coords.cur.page.y = interaction.coords.start.page.y; + interaction.coords.cur.client.y = interaction.coords.start.client.y; + interaction.coords.velocity.client.y = 0; + interaction.coords.velocity.page.y = 0; + } else if (axis === 'y') { + interaction.coords.cur.page.x = interaction.coords.start.page.x; + interaction.coords.cur.client.x = interaction.coords.start.client.x; + interaction.coords.velocity.client.x = 0; + interaction.coords.velocity.page.x = 0; + } +} + +function move(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x' || axis === 'y') { + var opposite = axis === 'x' ? 'y' : 'x'; + iEvent.page[opposite] = interaction.coords.start.page[opposite]; + iEvent.client[opposite] = interaction.coords.start.client[opposite]; + iEvent.delta[opposite] = 0; + } +} +/** + * ```js + * interact(element).draggable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // the axis in which the first movement must be + * // for the drag sequence to start + * // 'xy' by default - any direction + * startAxis: 'x' || 'y' || 'xy', + * + * // 'xy' by default - don't restrict to one axis (move in any direction) + * // 'x' or 'y' to restrict movement to either axis + * // 'start' to restrict movement to the axis the drag started in + * lockAxis: 'x' || 'y' || 'xy' || 'start', + * + * // max number of drags that can happen concurrently + * // with elements of this Interactable. Infinity by default + * max: Infinity, + * + * // max number of drags that can target the same element+Interactable + * // 1 by default + * maxPerElement: 2 + * }) + * + * var isDraggable = interact('element').draggable(); // true + * ``` + * + * Get or set whether drag actions can be performed on the target + * + * @alias Interactable.prototype.draggable + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on drag events (object makes the Interactable + * draggable) + * @return {boolean | Interactable} boolean indicating if this can be the + * target of drag events, or this Interctable + */ + + +var draggable = function draggable(options) { + if (is.object(options)) { + this.options.drag.enabled = options.enabled !== false; + this.setPerAction('drag', options); + this.setOnEvents('drag', options); + + if (/^(xy|x|y|start)$/.test(options.lockAxis)) { + this.options.drag.lockAxis = options.lockAxis; + } + + if (/^(xy|x|y)$/.test(options.startAxis)) { + this.options.drag.startAxis = options.startAxis; + } + + return this; + } + + if (is.bool(options)) { + this.options.drag.enabled = options; + return this; + } + + return this.options.drag; +}; + +var drag = { + id: 'actions/drag', + install: install, + listeners: { + 'interactions:before-action-move': beforeMove, + 'interactions:action-resume': beforeMove, + // dragmove + 'interactions:action-move': move, + 'auto-start:check': function autoStartCheck(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + buttons = arg.buttons; + var dragOptions = interactable.options.drag; + + if (!(dragOptions && dragOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & interactable.options.drag.mouseButtons) === 0) { + return undefined; + } + + arg.action = { + name: 'drag', + axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis + }; + return false; + } + }, + draggable: draggable, + beforeMove: beforeMove, + move: move, + defaults: { + startAxis: 'xy', + lockAxis: 'xy' + }, + getCursor: function getCursor() { + return 'move'; + } +}; +var ___default_1 = drag; +_$drag_1["default"] = ___default_1; + +var _$arr_49 = {}; +"use strict"; + +Object.defineProperty(_$arr_49, "__esModule", { + value: true +}); +_$arr_49.find = _$arr_49.findIndex = _$arr_49.from = _$arr_49.merge = _$arr_49.remove = _$arr_49.contains = void 0; + +var contains = function contains(array, target) { + return array.indexOf(target) !== -1; +}; + +_$arr_49.contains = contains; + +var remove = function remove(array, target) { + return array.splice(array.indexOf(target), 1); +}; + +_$arr_49.remove = remove; + +var merge = function merge(target, source) { + for (var _i = 0; _i < source.length; _i++) { + var _ref; + + _ref = source[_i]; + var item = _ref; + target.push(item); + } + + return target; +}; + +_$arr_49.merge = merge; + +var from = function from(source) { + return merge([], source); +}; + +_$arr_49.from = from; + +var findIndex = function findIndex(array, func) { + for (var i = 0; i < array.length; i++) { + if (func(array[i], i, array)) { + return i; + } + } + + return -1; +}; + +_$arr_49.findIndex = findIndex; + +var find = function find(array, func) { + return array[findIndex(array, func)]; +}; + +_$arr_49.find = find; + +var _$domObjects_52 = {}; +"use strict"; + +Object.defineProperty(_$domObjects_52, "__esModule", { + value: true +}); +_$domObjects_52["default"] = void 0; +var domObjects = { + init: __init_52, + document: null, + DocumentFragment: null, + SVGElement: null, + SVGSVGElement: null, + SVGElementInstance: null, + Element: null, + HTMLElement: null, + Event: null, + Touch: null, + PointerEvent: null +}; + +function blank() {} + +var ___default_52 = domObjects; +_$domObjects_52["default"] = ___default_52; + +function __init_52(window) { + var win = window; + domObjects.document = win.document; + domObjects.DocumentFragment = win.DocumentFragment || blank; + domObjects.SVGElement = win.SVGElement || blank; + domObjects.SVGSVGElement = win.SVGSVGElement || blank; + domObjects.SVGElementInstance = win.SVGElementInstance || blank; + domObjects.Element = win.Element || blank; + domObjects.HTMLElement = win.HTMLElement || domObjects.Element; + domObjects.Event = win.Event; + domObjects.Touch = win.Touch || blank; + domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent; +} + +var _$browser_50 = {}; +"use strict"; + +function ___typeof_50(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_50 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_50 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_50(obj); } + +Object.defineProperty(_$browser_50, "__esModule", { + value: true +}); +_$browser_50["default"] = void 0; + +var _domObjects = ___interopRequireDefault_50(_$domObjects_52); + +var __is_50 = ___interopRequireWildcard_50(_$is_59); + +var _window = ___interopRequireDefault_50(_$window_68); + +function ___getRequireWildcardCache_50() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_50 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_50(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_50(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_50(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_50(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var browser = { + init: __init_50, + supportsTouch: null, + supportsPointerEvent: null, + isIOS7: null, + isIOS: null, + isIe9: null, + isOperaMobile: null, + prefixedMatchesSelector: null, + pEventTypes: null, + wheelEvent: null +}; + +function __init_50(window) { + var Element = _domObjects["default"].Element; + var navigator = _window["default"].window.navigator; // Does the browser support touch input? + + browser.supportsTouch = 'ontouchstart' in window || __is_50.func(window.DocumentTouch) && _domObjects["default"].document instanceof window.DocumentTouch; // Does the browser support PointerEvents + + browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!_domObjects["default"].PointerEvent; + browser.isIOS = /iP(hone|od|ad)/.test(navigator.platform); // scrolling doesn't change the result of getClientRects on iOS 7 + + browser.isIOS7 = /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\d]/.test(navigator.appVersion); + browser.isIe9 = /MSIE 9/.test(navigator.userAgent); // Opera Mobile must be handled differently + + browser.isOperaMobile = navigator.appName === 'Opera' && browser.supportsTouch && /Presto/.test(navigator.userAgent); // prefix matchesSelector + + browser.prefixedMatchesSelector = 'matches' in Element.prototype ? 'matches' : 'webkitMatchesSelector' in Element.prototype ? 'webkitMatchesSelector' : 'mozMatchesSelector' in Element.prototype ? 'mozMatchesSelector' : 'oMatchesSelector' in Element.prototype ? 'oMatchesSelector' : 'msMatchesSelector'; + browser.pEventTypes = browser.supportsPointerEvent ? _domObjects["default"].PointerEvent === window.MSPointerEvent ? { + up: 'MSPointerUp', + down: 'MSPointerDown', + over: 'mouseover', + out: 'mouseout', + move: 'MSPointerMove', + cancel: 'MSPointerCancel' + } : { + up: 'pointerup', + down: 'pointerdown', + over: 'pointerover', + out: 'pointerout', + move: 'pointermove', + cancel: 'pointercancel' + } : null; // because Webkit and Opera still use 'mousewheel' event type + + browser.wheelEvent = 'onmousewheel' in _domObjects["default"].document ? 'mousewheel' : 'wheel'; +} + +var ___default_50 = browser; +_$browser_50["default"] = ___default_50; + +var _$clone_51 = {}; +"use strict"; + +function ___typeof_51(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_51 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_51 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_51(obj); } + +Object.defineProperty(_$clone_51, "__esModule", { + value: true +}); +_$clone_51["default"] = clone; + +var arr = ___interopRequireWildcard_51(_$arr_49); + +var __is_51 = ___interopRequireWildcard_51(_$is_59); + +function ___getRequireWildcardCache_51() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_51 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_51(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_51(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_51(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +// tslint:disable-next-line ban-types +function clone(source) { + var dest = {}; + + for (var prop in source) { + var value = source[prop]; + + if (__is_51.plainObject(value)) { + dest[prop] = clone(value); + } else if (__is_51.array(value)) { + dest[prop] = arr.from(value); + } else { + dest[prop] = value; + } + } + + return dest; +} + +var _$domUtils_53 = {}; +"use strict"; + +function ___typeof_53(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_53 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_53 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_53(obj); } + +Object.defineProperty(_$domUtils_53, "__esModule", { + value: true +}); +_$domUtils_53.nodeContains = nodeContains; +_$domUtils_53.closest = closest; +_$domUtils_53.parentNode = parentNode; +_$domUtils_53.matchesSelector = matchesSelector; +_$domUtils_53.indexOfDeepestElement = indexOfDeepestElement; +_$domUtils_53.matchesUpTo = matchesUpTo; +_$domUtils_53.getActualElement = getActualElement; +_$domUtils_53.getScrollXY = getScrollXY; +_$domUtils_53.getElementClientRect = getElementClientRect; +_$domUtils_53.getElementRect = getElementRect; +_$domUtils_53.getPath = getPath; +_$domUtils_53.trySelector = trySelector; + +var _browser = ___interopRequireDefault_53(_$browser_50); + +var ___domObjects_53 = ___interopRequireDefault_53(_$domObjects_52); + +var __is_53 = ___interopRequireWildcard_53(_$is_59); + +var ___window_53 = ___interopRequireWildcard_53(_$window_68); + +function ___getRequireWildcardCache_53() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_53 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_53(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_53(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_53(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_53(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function nodeContains(parent, child) { + while (child) { + if (child === parent) { + return true; + } + + child = child.parentNode; + } + + return false; +} + +function closest(element, selector) { + while (__is_53.element(element)) { + if (matchesSelector(element, selector)) { + return element; + } + + element = parentNode(element); + } + + return null; +} + +function parentNode(node) { + var parent = node.parentNode; + + if (__is_53.docFrag(parent)) { + // skip past #shado-root fragments + // tslint:disable-next-line + while ((parent = parent.host) && __is_53.docFrag(parent)) { + continue; + } + + return parent; + } + + return parent; +} + +function matchesSelector(element, selector) { + // remove /deep/ from selectors if shadowDOM polyfill is used + if (___window_53["default"].window !== ___window_53["default"].realWindow) { + selector = selector.replace(/\/deep\//g, ' '); + } + + return element[_browser["default"].prefixedMatchesSelector](selector); +} + +var getParent = function getParent(el) { + return el.parentNode ? el.parentNode : el.host; +}; // Test for the element that's "above" all other qualifiers + + +function indexOfDeepestElement(elements) { + var deepestZoneParents = []; + var deepestZone = elements[0]; + var index = deepestZone ? 0 : -1; + var i; + var n; + + for (i = 1; i < elements.length; i++) { + var dropzone = elements[i]; // an element might belong to multiple selector dropzones + + if (!dropzone || dropzone === deepestZone) { + continue; + } + + if (!deepestZone) { + deepestZone = dropzone; + index = i; + continue; + } // check if the deepest or current are document.documentElement or document.rootElement + // - if the current dropzone is, do nothing and continue + + + if (dropzone.parentNode === dropzone.ownerDocument) { + continue; + } // - if deepest is, update with the current dropzone and continue to next + else if (deepestZone.parentNode === dropzone.ownerDocument) { + deepestZone = dropzone; + index = i; + continue; + } // compare zIndex of siblings + + + if (dropzone.parentNode === deepestZone.parentNode) { + var deepestZIndex = parseInt((0, ___window_53.getWindow)(deepestZone).getComputedStyle(deepestZone).zIndex, 10) || 0; + var dropzoneZIndex = parseInt((0, ___window_53.getWindow)(dropzone).getComputedStyle(dropzone).zIndex, 10) || 0; + + if (dropzoneZIndex >= deepestZIndex) { + deepestZone = dropzone; + index = i; + } + + continue; + } // populate the ancestry array for the latest deepest dropzone + + + if (!deepestZoneParents.length) { + var _parent = deepestZone; + var parentParent = void 0; + + while ((parentParent = getParent(_parent)) && parentParent !== _parent.ownerDocument) { + deepestZoneParents.unshift(_parent); + _parent = parentParent; + } + } + + var parent = void 0; // if this element is an svg element and the current deepest is an + // HTMLElement + + if (deepestZone instanceof ___domObjects_53["default"].HTMLElement && dropzone instanceof ___domObjects_53["default"].SVGElement && !(dropzone instanceof ___domObjects_53["default"].SVGSVGElement)) { + if (dropzone === deepestZone.parentNode) { + continue; + } + + parent = dropzone.ownerSVGElement; + } else { + parent = dropzone; + } + + var dropzoneParents = []; + + while (parent.parentNode !== parent.ownerDocument) { + dropzoneParents.unshift(parent); + parent = getParent(parent); + } + + n = 0; // get (position of last common ancestor) + 1 + + while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) { + n++; + } + + var parents = [dropzoneParents[n - 1], dropzoneParents[n], deepestZoneParents[n]]; + var child = parents[0].lastChild; + + while (child) { + if (child === parents[1]) { + deepestZone = dropzone; + index = i; + deepestZoneParents = dropzoneParents; + break; + } else if (child === parents[2]) { + break; + } + + child = child.previousSibling; + } + } + + return index; +} + +function matchesUpTo(element, selector, limit) { + while (__is_53.element(element)) { + if (matchesSelector(element, selector)) { + return true; + } + + element = parentNode(element); + + if (element === limit) { + return matchesSelector(element, selector); + } + } + + return false; +} + +function getActualElement(element) { + return element instanceof ___domObjects_53["default"].SVGElementInstance ? element.correspondingUseElement : element; +} + +function getScrollXY(relevantWindow) { + relevantWindow = relevantWindow || ___window_53["default"].window; + return { + x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft, + y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop + }; +} + +function getElementClientRect(element) { + var clientRect = element instanceof ___domObjects_53["default"].SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0]; + return clientRect && { + left: clientRect.left, + right: clientRect.right, + top: clientRect.top, + bottom: clientRect.bottom, + width: clientRect.width || clientRect.right - clientRect.left, + height: clientRect.height || clientRect.bottom - clientRect.top + }; +} + +function getElementRect(element) { + var clientRect = getElementClientRect(element); + + if (!_browser["default"].isIOS7 && clientRect) { + var scroll = getScrollXY(___window_53["default"].getWindow(element)); + clientRect.left += scroll.x; + clientRect.right += scroll.x; + clientRect.top += scroll.y; + clientRect.bottom += scroll.y; + } + + return clientRect; +} + +function getPath(node) { + var path = []; + + while (node) { + path.push(node); + node = parentNode(node); + } + + return path; +} + +function trySelector(value) { + if (!__is_53.string(value)) { + return false; + } // an exception will be raised if it is invalid + + + ___domObjects_53["default"].document.querySelector(value); + + return true; +} + +var _$pointerExtend_62 = {}; +"use strict"; + +Object.defineProperty(_$pointerExtend_62, "__esModule", { + value: true +}); +_$pointerExtend_62["default"] = void 0; + +function pointerExtend(dest, source) { + for (var prop in source) { + var prefixedPropREs = pointerExtend.prefixedPropREs; + var deprecated = false; // skip deprecated prefixed properties + + for (var vendor in prefixedPropREs) { + if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) { + deprecated = true; + break; + } + } + + if (!deprecated && typeof source[prop] !== 'function') { + dest[prop] = source[prop]; + } + } + + return dest; +} + +pointerExtend.prefixedPropREs = { + webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/, + moz: /(Pressure)$/ +}; +var ___default_62 = pointerExtend; +_$pointerExtend_62["default"] = ___default_62; + +var _$hypot_57 = {}; +"use strict"; + +Object.defineProperty(_$hypot_57, "__esModule", { + value: true +}); +_$hypot_57["default"] = void 0; + +var ___default_57 = function _default(x, y) { + return Math.sqrt(x * x + y * y); +}; + +_$hypot_57["default"] = ___default_57; + +var _$pointerUtils_63 = {}; +"use strict"; + +function ___typeof_63(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_63 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_63 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_63(obj); } + +Object.defineProperty(_$pointerUtils_63, "__esModule", { + value: true +}); +_$pointerUtils_63.copyCoords = copyCoords; +_$pointerUtils_63.setCoordDeltas = setCoordDeltas; +_$pointerUtils_63.setCoordVelocity = setCoordVelocity; +_$pointerUtils_63.setZeroCoords = setZeroCoords; +_$pointerUtils_63.isNativePointer = isNativePointer; +_$pointerUtils_63.getXY = getXY; +_$pointerUtils_63.getPageXY = getPageXY; +_$pointerUtils_63.getClientXY = getClientXY; +_$pointerUtils_63.getPointerId = getPointerId; +_$pointerUtils_63.setCoords = setCoords; +_$pointerUtils_63.getTouchPair = getTouchPair; +_$pointerUtils_63.pointerAverage = pointerAverage; +_$pointerUtils_63.touchBBox = touchBBox; +_$pointerUtils_63.touchDistance = touchDistance; +_$pointerUtils_63.touchAngle = touchAngle; +_$pointerUtils_63.getPointerType = getPointerType; +_$pointerUtils_63.getEventTargets = getEventTargets; +_$pointerUtils_63.newCoords = newCoords; +_$pointerUtils_63.coordsToEvent = coordsToEvent; +Object.defineProperty(_$pointerUtils_63, "pointerExtend", { + enumerable: true, + get: function get() { + return _pointerExtend["default"]; + } +}); + +var ___browser_63 = ___interopRequireDefault_63(_$browser_50); + +var ___domObjects_63 = ___interopRequireDefault_63(_$domObjects_52); + +var domUtils = ___interopRequireWildcard_63(_$domUtils_53); + +var _hypot = ___interopRequireDefault_63(_$hypot_57); + +var __is_63 = ___interopRequireWildcard_63(_$is_59); + +var _pointerExtend = ___interopRequireDefault_63(_$pointerExtend_62); + +function ___getRequireWildcardCache_63() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_63 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_63(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_63(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_63(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_63(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function copyCoords(dest, src) { + dest.page = dest.page || {}; + dest.page.x = src.page.x; + dest.page.y = src.page.y; + dest.client = dest.client || {}; + dest.client.x = src.client.x; + dest.client.y = src.client.y; + dest.timeStamp = src.timeStamp; +} + +function setCoordDeltas(targetObj, prev, cur) { + targetObj.page.x = cur.page.x - prev.page.x; + targetObj.page.y = cur.page.y - prev.page.y; + targetObj.client.x = cur.client.x - prev.client.x; + targetObj.client.y = cur.client.y - prev.client.y; + targetObj.timeStamp = cur.timeStamp - prev.timeStamp; +} + +function setCoordVelocity(targetObj, delta) { + var dt = Math.max(delta.timeStamp / 1000, 0.001); + targetObj.page.x = delta.page.x / dt; + targetObj.page.y = delta.page.y / dt; + targetObj.client.x = delta.client.x / dt; + targetObj.client.y = delta.client.y / dt; + targetObj.timeStamp = dt; +} + +function setZeroCoords(targetObj) { + targetObj.page.x = 0; + targetObj.page.y = 0; + targetObj.client.x = 0; + targetObj.client.y = 0; +} + +function isNativePointer(pointer) { + return pointer instanceof ___domObjects_63["default"].Event || pointer instanceof ___domObjects_63["default"].Touch; +} // Get specified X/Y coords for mouse or event.touches[0] + + +function getXY(type, pointer, xy) { + xy = xy || {}; + type = type || 'page'; + xy.x = pointer[type + 'X']; + xy.y = pointer[type + 'Y']; + return xy; +} + +function getPageXY(pointer, page) { + page = page || { + x: 0, + y: 0 + }; // Opera Mobile handles the viewport and scrolling oddly + + if (___browser_63["default"].isOperaMobile && isNativePointer(pointer)) { + getXY('screen', pointer, page); + page.x += window.scrollX; + page.y += window.scrollY; + } else { + getXY('page', pointer, page); + } + + return page; +} + +function getClientXY(pointer, client) { + client = client || {}; + + if (___browser_63["default"].isOperaMobile && isNativePointer(pointer)) { + // Opera Mobile handles the viewport and scrolling oddly + getXY('screen', pointer, client); + } else { + getXY('client', pointer, client); + } + + return client; +} + +function getPointerId(pointer) { + return __is_63.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier; +} + +function setCoords(targetObj, pointers, timeStamp) { + var pointer = pointers.length > 1 ? pointerAverage(pointers) : pointers[0]; + var tmpXY = {}; + getPageXY(pointer, tmpXY); + targetObj.page.x = tmpXY.x; + targetObj.page.y = tmpXY.y; + getClientXY(pointer, tmpXY); + targetObj.client.x = tmpXY.x; + targetObj.client.y = tmpXY.y; + targetObj.timeStamp = timeStamp; +} + +function getTouchPair(event) { + var touches = []; // array of touches is supplied + + if (__is_63.array(event)) { + touches[0] = event[0]; + touches[1] = event[1]; + } // an event + else { + if (event.type === 'touchend') { + if (event.touches.length === 1) { + touches[0] = event.touches[0]; + touches[1] = event.changedTouches[0]; + } else if (event.touches.length === 0) { + touches[0] = event.changedTouches[0]; + touches[1] = event.changedTouches[1]; + } + } else { + touches[0] = event.touches[0]; + touches[1] = event.touches[1]; + } + } + + return touches; +} + +function pointerAverage(pointers) { + var average = { + pageX: 0, + pageY: 0, + clientX: 0, + clientY: 0, + screenX: 0, + screenY: 0 + }; + + for (var _i = 0; _i < pointers.length; _i++) { + var _ref; + + _ref = pointers[_i]; + var pointer = _ref; + + for (var _prop in average) { + average[_prop] += pointer[_prop]; + } + } + + for (var prop in average) { + average[prop] /= pointers.length; + } + + return average; +} + +function touchBBox(event) { + if (!event.length && !(event.touches && event.touches.length > 1)) { + return null; + } + + var touches = getTouchPair(event); + var minX = Math.min(touches[0].pageX, touches[1].pageX); + var minY = Math.min(touches[0].pageY, touches[1].pageY); + var maxX = Math.max(touches[0].pageX, touches[1].pageX); + var maxY = Math.max(touches[0].pageY, touches[1].pageY); + return { + x: minX, + y: minY, + left: minX, + top: minY, + right: maxX, + bottom: maxY, + width: maxX - minX, + height: maxY - minY + }; +} + +function touchDistance(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = getTouchPair(event); + var dx = touches[0][sourceX] - touches[1][sourceX]; + var dy = touches[0][sourceY] - touches[1][sourceY]; + return (0, _hypot["default"])(dx, dy); +} + +function touchAngle(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = getTouchPair(event); + var dx = touches[1][sourceX] - touches[0][sourceX]; + var dy = touches[1][sourceY] - touches[0][sourceY]; + var angle = 180 * Math.atan2(dy, dx) / Math.PI; + return angle; +} + +function getPointerType(pointer) { + return __is_63.string(pointer.pointerType) ? pointer.pointerType : __is_63.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof ___domObjects_63["default"].Touch ? 'touch' : 'mouse'; +} // [ event.target, event.currentTarget ] + + +function getEventTargets(event) { + var path = __is_63.func(event.composedPath) ? event.composedPath() : event.path; + return [domUtils.getActualElement(path ? path[0] : event.target), domUtils.getActualElement(event.currentTarget)]; +} + +function newCoords() { + return { + page: { + x: 0, + y: 0 + }, + client: { + x: 0, + y: 0 + }, + timeStamp: 0 + }; +} + +function coordsToEvent(coords) { + var event = { + coords: coords, + + get page() { + return this.coords.page; + }, + + get client() { + return this.coords.client; + }, + + get timeStamp() { + return this.coords.timeStamp; + }, + + get pageX() { + return this.coords.page.x; + }, + + get pageY() { + return this.coords.page.y; + }, + + get clientX() { + return this.coords.client.x; + }, + + get clientY() { + return this.coords.client.y; + }, + + get pointerId() { + return this.coords.pointerId; + }, + + get target() { + return this.coords.target; + }, + + get type() { + return this.coords.type; + }, + + get pointerType() { + return this.coords.pointerType; + }, + + get buttons() { + return this.coords.buttons; + }, + + preventDefault: function preventDefault() {} + }; + return event; +} + +var _$events_54 = {}; +"use strict"; + +function ___typeof_54(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_54 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_54 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_54(obj); } + +Object.defineProperty(_$events_54, "__esModule", { + value: true +}); +_$events_54["default"] = _$events_54.FakeEvent = void 0; + +/* removed: var _$arr_49 = require("./arr"); */; + +var __domUtils_54 = ___interopRequireWildcard_54(_$domUtils_53); + +var __is_54 = ___interopRequireWildcard_54(_$is_59); + +var ___pointerExtend_54 = ___interopRequireDefault_54(_$pointerExtend_62); + +var pointerUtils = ___interopRequireWildcard_54(_$pointerUtils_63); + +function ___interopRequireDefault_54(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_54() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_54 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_54(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_54(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_54(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var elements = []; +var targets = []; +var delegatedEvents = {}; +var documents = []; + +function add(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; + + if (!target) { + target = { + events: {}, + typeCount: 0 + }; + elementIndex = elements.push(element) - 1; + targets.push(target); + } + + if (!target.events[type]) { + target.events[type] = []; + target.typeCount++; + } + + if (element.removeEventListener && !(0, _$arr_49.contains)(target.events[type], listener)) { + element.addEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].push(listener); + } +} + +function __remove_54(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; + + if (!target || !target.events) { + return; + } + + if (type === 'all') { + for (type in target.events) { + if (target.events.hasOwnProperty(type)) { + __remove_54(element, type, 'all'); + } + } + + return; + } + + if (target.events[type]) { + var len = target.events[type].length; + + if (listener === 'all') { + for (var i = 0; i < len; i++) { + __remove_54(element, type, target.events[type][i], options); + } + + return; + } else { + for (var _i = 0; _i < len; _i++) { + if (element.removeEventListener && target.events[type][_i] === listener) { + element.removeEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].splice(_i, 1); + break; + } + } + } + + if (target.events[type] && target.events[type].length === 0) { + target.events[type] = null; + target.typeCount--; + } + } + + if (!target.typeCount) { + targets.splice(elementIndex, 1); + elements.splice(elementIndex, 1); + } +} + +function addDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + + if (!delegatedEvents[type]) { + delegatedEvents[type] = { + contexts: [], + listeners: [], + selectors: [] + }; // add delegate listener functions + + for (var _i2 = 0; _i2 < documents.length; _i2++) { + var _ref; + + _ref = documents[_i2]; + var doc = _ref; + add(doc, type, delegateListener); + add(doc, type, delegateUseCapture, true); + } + } + + var delegated = delegatedEvents[type]; + var index; + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + break; + } + } + + if (index === -1) { + index = delegated.selectors.length; + delegated.selectors.push(selector); + delegated.contexts.push(context); + delegated.listeners.push([]); + } // keep listener and capture and passive flags + + + delegated.listeners[index].push([listener, !!options.capture, options.passive]); +} + +function removeDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var delegated = delegatedEvents[type]; + var matchFound = false; + var index; + + if (!delegated) { + return; + } // count from last index of delegated to 0 + + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + // look for matching selector and context Node + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + var listeners = delegated.listeners[index]; // each item of the listeners array is an array: [function, capture, passive] + + for (var i = listeners.length - 1; i >= 0; i--) { + var _listeners$i = _slicedToArray(listeners[i], 3), + fn = _listeners$i[0], + capture = _listeners$i[1], + passive = _listeners$i[2]; // check if the listener functions and capture and passive flags match + + + if (fn === listener && capture === !!options.capture && passive === options.passive) { + // remove the listener from the array of listeners + listeners.splice(i, 1); // if all listeners for this interactable have been removed + // remove the interactable from the delegated arrays + + if (!listeners.length) { + delegated.selectors.splice(index, 1); + delegated.contexts.splice(index, 1); + delegated.listeners.splice(index, 1); // remove delegate function from context + + __remove_54(context, type, delegateListener); + __remove_54(context, type, delegateUseCapture, true); // remove the arrays if they are empty + + if (!delegated.selectors.length) { + delegatedEvents[type] = null; + } + } // only remove one listener + + + matchFound = true; + break; + } + } + + if (matchFound) { + break; + } + } + } +} // bound to the interactable context when a DOM event +// listener is added to a selector interactable + + +function delegateListener(event, optionalArg) { + var options = getOptions(optionalArg); + var fakeEvent = new FakeEvent(event); + var delegated = delegatedEvents[event.type]; + + var _pointerUtils$getEven = pointerUtils.getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 1), + eventTarget = _pointerUtils$getEven2[0]; + + var element = eventTarget; // climb up document tree looking for selector matches + + while (__is_54.element(element)) { + for (var i = 0; i < delegated.selectors.length; i++) { + var selector = delegated.selectors[i]; + var context = delegated.contexts[i]; + + if (__domUtils_54.matchesSelector(element, selector) && __domUtils_54.nodeContains(context, eventTarget) && __domUtils_54.nodeContains(context, element)) { + var listeners = delegated.listeners[i]; + fakeEvent.currentTarget = element; + + for (var _i3 = 0; _i3 < listeners.length; _i3++) { + var _ref2; + + _ref2 = listeners[_i3]; + + var _ref3 = _ref2, + _ref4 = _slicedToArray(_ref3, 3), + fn = _ref4[0], + capture = _ref4[1], + passive = _ref4[2]; + + if (capture === !!options.capture && passive === options.passive) { + fn(fakeEvent); + } + } + } + } + + element = __domUtils_54.parentNode(element); + } +} + +function delegateUseCapture(event) { + return delegateListener.call(this, event, true); +} + +function getOptions(param) { + return __is_54.object(param) ? param : { + capture: param + }; +} + +var FakeEvent = /*#__PURE__*/function () { + function FakeEvent(originalEvent) { + _classCallCheck(this, FakeEvent); + + this.originalEvent = originalEvent; + + _defineProperty(this, "currentTarget", void 0); + + // duplicate the event so that currentTarget can be changed + (0, ___pointerExtend_54["default"])(this, originalEvent); + } + + _createClass(FakeEvent, [{ + key: "preventOriginalDefault", + value: function preventOriginalDefault() { + this.originalEvent.preventDefault(); + } + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.originalEvent.stopPropagation(); + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.originalEvent.stopImmediatePropagation(); + } + }]); + + return FakeEvent; +}(); + +_$events_54.FakeEvent = FakeEvent; +var events = { + add: add, + remove: __remove_54, + addDelegate: addDelegate, + removeDelegate: removeDelegate, + delegateListener: delegateListener, + delegateUseCapture: delegateUseCapture, + delegatedEvents: delegatedEvents, + documents: documents, + supportsOptions: false, + supportsPassive: false, + _elements: elements, + _targets: targets, + init: function init(window) { + window.document.createElement('div').addEventListener('test', null, { + get capture() { + return events.supportsOptions = true; + }, + + get passive() { + return events.supportsPassive = true; + } + + }); + } +}; +var ___default_54 = events; +_$events_54["default"] = ___default_54; + +var _$extend_55 = {}; +"use strict"; + +Object.defineProperty(_$extend_55, "__esModule", { + value: true +}); +_$extend_55["default"] = extend; + +function extend(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } + + var ret = dest; + return ret; +} + +var _$normalizeListeners_61 = {}; +"use strict"; + +function ___typeof_61(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_61 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_61 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_61(obj); } + +Object.defineProperty(_$normalizeListeners_61, "__esModule", { + value: true +}); +_$normalizeListeners_61["default"] = normalize; + +var _extend = ___interopRequireDefault_61(_$extend_55); + +var __is_61 = ___interopRequireWildcard_61(_$is_59); + +function ___getRequireWildcardCache_61() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_61 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_61(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_61(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_61(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_61(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function normalize(type, listeners, result) { + result = result || {}; + + if (__is_61.string(type) && type.search(' ') !== -1) { + type = split(type); + } + + if (__is_61.array(type)) { + return type.reduce(function (acc, t) { + return (0, _extend["default"])(acc, normalize(t, listeners, result)); + }, result); + } // ({ type: fn }) -> ('', { type: fn }) + + + if (__is_61.object(type)) { + listeners = type; + type = ''; + } + + if (__is_61.func(listeners)) { + result[type] = result[type] || []; + result[type].push(listeners); + } else if (__is_61.array(listeners)) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; + + _ref = listeners[_i]; + var l = _ref; + normalize(type, l, result); + } + } else if (__is_61.object(listeners)) { + for (var prefix in listeners) { + var combinedTypes = split(prefix).map(function (p) { + return "".concat(type).concat(p); + }); + normalize(combinedTypes, listeners[prefix], result); + } + } + + return result; +} + +function split(type) { + return type.trim().split(/ +/); +} + +var _$Eventable_14 = {}; +"use strict"; + +function ___typeof_14(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_14 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_14 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_14(obj); } + +Object.defineProperty(_$Eventable_14, "__esModule", { + value: true +}); +_$Eventable_14["default"] = void 0; + +var __arr_14 = ___interopRequireWildcard_14(_$arr_49); + +var ___extend_14 = ___interopRequireDefault_14(_$extend_55); + +var _normalizeListeners = ___interopRequireDefault_14(_$normalizeListeners_61); + +function ___interopRequireDefault_14(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_14() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_14 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_14(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_14(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_14(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_14(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_14(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_14(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_14(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_14(Constructor, staticProps); return Constructor; } + +function ___defineProperty_14(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function fireUntilImmediateStopped(event, listeners) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; + + _ref = listeners[_i]; + var listener = _ref; + + if (event.immediatePropagationStopped) { + break; + } + + listener(event); + } +} + +var Eventable = /*#__PURE__*/function () { + function Eventable(options) { + ___classCallCheck_14(this, Eventable); + + ___defineProperty_14(this, "options", void 0); + + ___defineProperty_14(this, "types", {}); + + ___defineProperty_14(this, "propagationStopped", false); + + ___defineProperty_14(this, "immediatePropagationStopped", false); + + ___defineProperty_14(this, "global", void 0); + + this.options = (0, ___extend_14["default"])({}, options || {}); + } + + ___createClass_14(Eventable, [{ + key: "fire", + value: function fire(event) { + var listeners; + var global = this.global; // Interactable#on() listeners + // tslint:disable no-conditional-assignment + + if (listeners = this.types[event.type]) { + fireUntilImmediateStopped(event, listeners); + } // interact.on() listeners + + + if (!event.propagationStopped && global && (listeners = global[event.type])) { + fireUntilImmediateStopped(event, listeners); + } + } + }, { + key: "on", + value: function on(type, listener) { + var listeners = (0, _normalizeListeners["default"])(type, listener); + + for (type in listeners) { + this.types[type] = __arr_14.merge(this.types[type] || [], listeners[type]); + } + } + }, { + key: "off", + value: function off(type, listener) { + var listeners = (0, _normalizeListeners["default"])(type, listener); + + for (type in listeners) { + var eventList = this.types[type]; + + if (!eventList || !eventList.length) { + continue; + } + + for (var _i2 = 0; _i2 < listeners[type].length; _i2++) { + var _ref2; + + _ref2 = listeners[type][_i2]; + var subListener = _ref2; + + var _index = eventList.indexOf(subListener); + + if (_index !== -1) { + eventList.splice(_index, 1); + } + } + } + } + }, { + key: "getRect", + value: function getRect(_element) { + return null; + } + }]); + + return Eventable; +}(); + +var ___default_14 = Eventable; +_$Eventable_14["default"] = ___default_14; + +var _$rect_65 = {}; +"use strict"; + +function ___typeof_65(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_65 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_65 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_65(obj); } + +Object.defineProperty(_$rect_65, "__esModule", { + value: true +}); +_$rect_65.getStringOptionResult = getStringOptionResult; +_$rect_65.resolveRectLike = resolveRectLike; +_$rect_65.rectToXY = rectToXY; +_$rect_65.xywhToTlbr = xywhToTlbr; +_$rect_65.tlbrToXywh = tlbrToXywh; +_$rect_65.addEdges = addEdges; + +/* removed: var _$domUtils_53 = require("./domUtils"); */; + +var ___extend_65 = ___interopRequireDefault_65(_$extend_55); + +var __is_65 = ___interopRequireWildcard_65(_$is_59); + +function ___getRequireWildcardCache_65() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_65 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_65(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_65(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_65(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_65(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +function getStringOptionResult(value, target, element) { + if (value === 'parent') { + return (0, _$domUtils_53.parentNode)(element); + } + + if (value === 'self') { + return target.getRect(element); + } + + return (0, _$domUtils_53.closest)(element, value); +} + +function resolveRectLike(value, target, element, functionArgs) { + var returnValue = value; + + if (__is_65.string(returnValue)) { + returnValue = getStringOptionResult(returnValue, target, element); + } else if (__is_65.func(returnValue)) { + returnValue = returnValue.apply(void 0, _toConsumableArray(functionArgs)); + } + + if (__is_65.element(returnValue)) { + returnValue = (0, _$domUtils_53.getElementRect)(returnValue); + } + + return returnValue; +} + +function rectToXY(rect) { + return rect && { + x: 'x' in rect ? rect.x : rect.left, + y: 'y' in rect ? rect.y : rect.top + }; +} + +function xywhToTlbr(rect) { + if (rect && !('left' in rect && 'top' in rect)) { + rect = (0, ___extend_65["default"])({}, rect); + rect.left = rect.x || 0; + rect.top = rect.y || 0; + rect.right = rect.right || rect.left + rect.width; + rect.bottom = rect.bottom || rect.top + rect.height; + } + + return rect; +} + +function tlbrToXywh(rect) { + if (rect && !('x' in rect && 'y' in rect)) { + rect = (0, ___extend_65["default"])({}, rect); + rect.x = rect.left || 0; + rect.y = rect.top || 0; + rect.width = rect.width || rect.right || 0 - rect.x; + rect.height = rect.height || rect.bottom || 0 - rect.y; + } + + return rect; +} + +function addEdges(edges, rect, delta) { + if (edges.left) { + rect.left += delta.x; + } + + if (edges.right) { + rect.right += delta.x; + } + + if (edges.top) { + rect.top += delta.y; + } + + if (edges.bottom) { + rect.bottom += delta.y; + } + + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; +} + +var _$getOriginXY_56 = {}; +"use strict"; + +Object.defineProperty(_$getOriginXY_56, "__esModule", { + value: true +}); +_$getOriginXY_56["default"] = ___default_56; + +/* removed: var _$rect_65 = require("./rect"); */; + +function ___default_56(target, element, actionName) { + var actionOptions = target.options[actionName]; + var actionOrigin = actionOptions && actionOptions.origin; + var origin = actionOrigin || target.options.origin; + var originRect = (0, _$rect_65.resolveRectLike)(origin, target, element, [target && element]); + return (0, _$rect_65.rectToXY)(originRect) || { + x: 0, + y: 0 + }; +} + +var _$raf_64 = {}; +"use strict"; + +Object.defineProperty(_$raf_64, "__esModule", { + value: true +}); +_$raf_64["default"] = void 0; +var lastTime = 0; + +var _request; + +var _cancel; + +function __init_64(window) { + _request = window.requestAnimationFrame; + _cancel = window.cancelAnimationFrame; + + if (!_request) { + var vendors = ['ms', 'moz', 'webkit', 'o']; + + for (var _i = 0; _i < vendors.length; _i++) { + var vendor = vendors[_i]; + _request = window["".concat(vendor, "RequestAnimationFrame")]; + _cancel = window["".concat(vendor, "CancelAnimationFrame")] || window["".concat(vendor, "CancelRequestAnimationFrame")]; + } + } + + if (!_request) { + _request = function request(callback) { + var currTime = Date.now(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); // eslint-disable-next-line standard/no-callback-literal + + var token = setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return token; + }; + + _cancel = function cancel(token) { + return clearTimeout(token); + }; + } +} + +var ___default_64 = { + request: function request(callback) { + return _request(callback); + }, + cancel: function cancel(token) { + return _cancel(token); + }, + init: __init_64 +}; +_$raf_64["default"] = ___default_64; + +var _$index_58 = {}; +"use strict"; + +function ___typeof_58(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_58 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_58 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_58(obj); } + +Object.defineProperty(_$index_58, "__esModule", { + value: true +}); +_$index_58.warnOnce = warnOnce; +_$index_58.copyAction = copyAction; +Object.defineProperty(_$index_58, "win", { + enumerable: true, + get: function get() { + return ___window_58["default"]; + } +}); +Object.defineProperty(_$index_58, "browser", { + enumerable: true, + get: function get() { + return ___browser_58["default"]; + } +}); +Object.defineProperty(_$index_58, "clone", { + enumerable: true, + get: function get() { + return _clone["default"]; + } +}); +Object.defineProperty(_$index_58, "events", { + enumerable: true, + get: function get() { + return _events["default"]; + } +}); +Object.defineProperty(_$index_58, "extend", { + enumerable: true, + get: function get() { + return ___extend_58["default"]; + } +}); +Object.defineProperty(_$index_58, "getOriginXY", { + enumerable: true, + get: function get() { + return _getOriginXY["default"]; + } +}); +Object.defineProperty(_$index_58, "hypot", { + enumerable: true, + get: function get() { + return ___hypot_58["default"]; + } +}); +Object.defineProperty(_$index_58, "normalizeListeners", { + enumerable: true, + get: function get() { + return ___normalizeListeners_58["default"]; + } +}); +Object.defineProperty(_$index_58, "raf", { + enumerable: true, + get: function get() { + return _raf["default"]; + } +}); +_$index_58.rect = _$index_58.pointer = _$index_58.is = _$index_58.dom = _$index_58.arr = void 0; + +var __arr_58 = ___interopRequireWildcard_58(_$arr_49); + +_$index_58.arr = __arr_58; + +var dom = ___interopRequireWildcard_58(_$domUtils_53); + +_$index_58.dom = dom; + +var __is_58 = ___interopRequireWildcard_58(_$is_59); + +_$index_58.is = __is_58; + +var pointer = ___interopRequireWildcard_58(_$pointerUtils_63); + +_$index_58.pointer = pointer; + +var rect = ___interopRequireWildcard_58(_$rect_65); + +_$index_58.rect = rect; + +var ___window_58 = ___interopRequireDefault_58(_$window_68); + +var ___browser_58 = ___interopRequireDefault_58(_$browser_50); + +var _clone = ___interopRequireDefault_58(_$clone_51); + +var _events = ___interopRequireDefault_58(_$events_54); + +var ___extend_58 = ___interopRequireDefault_58(_$extend_55); + +var _getOriginXY = ___interopRequireDefault_58(_$getOriginXY_56); + +var ___hypot_58 = ___interopRequireDefault_58(_$hypot_57); + +var ___normalizeListeners_58 = ___interopRequireDefault_58(_$normalizeListeners_61); + +var _raf = ___interopRequireDefault_58(_$raf_64); + +function ___interopRequireDefault_58(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_58() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_58 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_58(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_58(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_58(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function warnOnce(method, message) { + var warned = false; // eslint-disable-next-line no-shadow + + return function () { + if (!warned) { + ___window_58["default"].window.console.warn(message); + + warned = true; + } + + return method.apply(this, arguments); + }; +} + +function copyAction(dest, src) { + dest.name = src.name; + dest.axis = src.axis; + dest.edges = src.edges; + return dest; +} + +var _$defaultOptions_20 = {}; +"use strict"; + +Object.defineProperty(_$defaultOptions_20, "__esModule", { + value: true +}); +_$defaultOptions_20["default"] = _$defaultOptions_20.defaults = void 0; +// tslint:disable no-empty-interface +// eslint-disable-next-line @typescript-eslint/no-empty-interface +// export interface Options extends BaseDefaults, PerActionDefaults {} +var defaults = { + base: { + preventDefault: 'auto', + deltaSource: 'page' + }, + perAction: { + enabled: false, + origin: { + x: 0, + y: 0 + } + }, + actions: {} +}; +_$defaultOptions_20.defaults = defaults; +var ___default_20 = defaults; +_$defaultOptions_20["default"] = ___default_20; + +var _$InteractableSet_17 = {}; +"use strict"; + +function ___typeof_17(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_17 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_17 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_17(obj); } + +Object.defineProperty(_$InteractableSet_17, "__esModule", { + value: true +}); +_$InteractableSet_17["default"] = void 0; + +var __arr_17 = ___interopRequireWildcard_17(_$arr_49); + +var __domUtils_17 = ___interopRequireWildcard_17(_$domUtils_53); + +var ___extend_17 = ___interopRequireDefault_17(_$extend_55); + +var __is_17 = ___interopRequireWildcard_17(_$is_59); + +function ___interopRequireDefault_17(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_17() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_17 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_17(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_17(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_17(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_17(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_17(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_17(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_17(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_17(Constructor, staticProps); return Constructor; } + +function ___defineProperty_17(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var InteractableSet = /*#__PURE__*/function () { + // all set interactables + function InteractableSet(scope) { + var _this = this; + + ___classCallCheck_17(this, InteractableSet); + + this.scope = scope; + + ___defineProperty_17(this, "list", []); + + ___defineProperty_17(this, "selectorMap", {}); + + scope.addListeners({ + 'interactable:unset': function interactableUnset(_ref) { + var interactable = _ref.interactable; + var target = interactable.target, + context = interactable._context; + var targetMappings = __is_17.string(target) ? _this.selectorMap[target] : target[_this.scope.id]; + var targetIndex = targetMappings.findIndex(function (m) { + return m.context === context; + }); + + if (targetMappings[targetIndex]) { + // Destroying mappingInfo's context and interactable + targetMappings[targetIndex].context = null; + targetMappings[targetIndex].interactable = null; + } + + targetMappings.splice(targetIndex, 1); + } + }); + } + + ___createClass_17(InteractableSet, [{ + key: "new", + value: function _new(target, options) { + options = (0, ___extend_17["default"])(options || {}, { + actions: this.scope.actions + }); + var interactable = new this.scope.Interactable(target, options, this.scope.document); + var mappingInfo = { + context: interactable._context, + interactable: interactable + }; + this.scope.addDocument(interactable._doc); + this.list.push(interactable); + + if (__is_17.string(target)) { + if (!this.selectorMap[target]) { + this.selectorMap[target] = []; + } + + this.selectorMap[target].push(mappingInfo); + } else { + if (!interactable.target[this.scope.id]) { + Object.defineProperty(target, this.scope.id, { + value: [], + configurable: true + }); + } + + target[this.scope.id].push(mappingInfo); + } + + this.scope.fire('interactable:new', { + target: target, + options: options, + interactable: interactable, + win: this.scope._win + }); + return interactable; + } + }, { + key: "get", + value: function get(target, options) { + var context = options && options.context || this.scope.document; + var isSelector = __is_17.string(target); + var targetMappings = isSelector ? this.selectorMap[target] : target[this.scope.id]; + + if (!targetMappings) { + return null; + } + + var found = __arr_17.find(targetMappings, function (m) { + return m.context === context && (isSelector || m.interactable.inContext(target)); + }); + return found && found.interactable; + } + }, { + key: "forEachMatch", + value: function forEachMatch(node, callback) { + for (var _i = 0; _i < this.list.length; _i++) { + var _ref2; + + _ref2 = this.list[_i]; + var _interactable = _ref2; + var ret = void 0; + + if ((__is_17.string(_interactable.target) // target is a selector and the element matches + ? __is_17.element(node) && __domUtils_17.matchesSelector(node, _interactable.target) : // target is the element + node === _interactable.target) && // the element is in context + _interactable.inContext(node)) { + ret = callback(_interactable); + } + + if (ret !== undefined) { + return ret; + } + } + } + }]); + + return InteractableSet; +}(); + +_$InteractableSet_17["default"] = InteractableSet; + +var _$BaseEvent_13 = {}; +"use strict"; + +Object.defineProperty(_$BaseEvent_13, "__esModule", { + value: true +}); +_$BaseEvent_13["default"] = _$BaseEvent_13.BaseEvent = void 0; + +function ___classCallCheck_13(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_13(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_13(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_13(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_13(Constructor, staticProps); return Constructor; } + +function ___defineProperty_13(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var BaseEvent = /*#__PURE__*/function () { + ___createClass_13(BaseEvent, [{ + key: "interaction", + get: function get() { + return this._interaction._proxy; + } + }]); + + function BaseEvent(interaction) { + ___classCallCheck_13(this, BaseEvent); + + ___defineProperty_13(this, "type", void 0); + + ___defineProperty_13(this, "target", void 0); + + ___defineProperty_13(this, "currentTarget", void 0); + + ___defineProperty_13(this, "interactable", void 0); + + ___defineProperty_13(this, "_interaction", void 0); + + ___defineProperty_13(this, "timeStamp", void 0); + + ___defineProperty_13(this, "immediatePropagationStopped", false); + + ___defineProperty_13(this, "propagationStopped", false); + + this._interaction = interaction; + } + + ___createClass_13(BaseEvent, [{ + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call any other listeners (even on the current target) + */ + + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }]); + + return BaseEvent; +}(); + +_$BaseEvent_13.BaseEvent = BaseEvent; +var ___default_13 = BaseEvent; +_$BaseEvent_13["default"] = ___default_13; + +var _$InteractEvent_15 = {}; +"use strict"; + +Object.defineProperty(_$InteractEvent_15, "__esModule", { + value: true +}); +_$InteractEvent_15["default"] = _$InteractEvent_15.InteractEvent = void 0; + +var ___extend_15 = ___interopRequireDefault_15(_$extend_55); + +var ___getOriginXY_15 = ___interopRequireDefault_15(_$getOriginXY_56); + +var ___hypot_15 = ___interopRequireDefault_15(_$hypot_57); + +var _BaseEvent2 = ___interopRequireDefault_15(_$BaseEvent_13); + +var _defaultOptions = ___interopRequireDefault_15(_$defaultOptions_20); + +function ___interopRequireDefault_15(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_15(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_15 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_15 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_15(obj); } + +function ___classCallCheck_15(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_15(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_15(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_15(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_15(Constructor, staticProps); return Constructor; } + +function _possibleConstructorReturn(self, call) { if (call && (___typeof_15(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function ___defineProperty_15(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var InteractEvent = /*#__PURE__*/function (_BaseEvent) { + _inherits(InteractEvent, _BaseEvent); + + // drag + // resize + + /** */ + function InteractEvent(interaction, event, actionName, phase, element, preEnd, type) { + var _this; + + ___classCallCheck_15(this, InteractEvent); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(InteractEvent).call(this, interaction)); + + ___defineProperty_15(_assertThisInitialized(_this), "target", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "currentTarget", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "relatedTarget", null); + + ___defineProperty_15(_assertThisInitialized(_this), "screenX", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "screenY", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "button", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "buttons", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "ctrlKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "shiftKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "altKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "metaKey", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "page", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "client", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "delta", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "rect", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "x0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "y0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "t0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dt", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "duration", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "clientX0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "clientY0", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "velocity", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "speed", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "swipe", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "timeStamp", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dragEnter", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "dragLeave", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "axes", void 0); + + ___defineProperty_15(_assertThisInitialized(_this), "preEnd", void 0); + + element = element || interaction.element; + var target = interaction.interactable; + var deltaSource = (target && target.options || _defaultOptions["default"]).deltaSource; + var origin = (0, ___getOriginXY_15["default"])(target, element, actionName); + var starting = phase === 'start'; + var ending = phase === 'end'; + var prevEvent = starting ? _assertThisInitialized(_this) : interaction.prevEvent; + var coords = starting ? interaction.coords.start : ending ? { + page: prevEvent.page, + client: prevEvent.client, + timeStamp: interaction.coords.cur.timeStamp + } : interaction.coords.cur; + _this.page = (0, ___extend_15["default"])({}, coords.page); + _this.client = (0, ___extend_15["default"])({}, coords.client); + _this.rect = (0, ___extend_15["default"])({}, interaction.rect); + _this.timeStamp = coords.timeStamp; + + if (!ending) { + _this.page.x -= origin.x; + _this.page.y -= origin.y; + _this.client.x -= origin.x; + _this.client.y -= origin.y; + } + + _this.ctrlKey = event.ctrlKey; + _this.altKey = event.altKey; + _this.shiftKey = event.shiftKey; + _this.metaKey = event.metaKey; + _this.button = event.button; + _this.buttons = event.buttons; + _this.target = element; + _this.currentTarget = element; + _this.preEnd = preEnd; + _this.type = type || actionName + (phase || ''); + _this.interactable = target; + _this.t0 = starting ? interaction.pointers[interaction.pointers.length - 1].downTime : prevEvent.t0; + _this.x0 = interaction.coords.start.page.x - origin.x; + _this.y0 = interaction.coords.start.page.y - origin.y; + _this.clientX0 = interaction.coords.start.client.x - origin.x; + _this.clientY0 = interaction.coords.start.client.y - origin.y; + + if (starting || ending) { + _this.delta = { + x: 0, + y: 0 + }; + } else { + _this.delta = { + x: _this[deltaSource].x - prevEvent[deltaSource].x, + y: _this[deltaSource].y - prevEvent[deltaSource].y + }; + } + + _this.dt = interaction.coords.delta.timeStamp; + _this.duration = _this.timeStamp - _this.t0; // velocity and speed in pixels per second + + _this.velocity = (0, ___extend_15["default"])({}, interaction.coords.velocity[deltaSource]); + _this.speed = (0, ___hypot_15["default"])(_this.velocity.x, _this.velocity.y); + _this.swipe = ending || phase === 'inertiastart' ? _this.getSwipe() : null; + return _this; + } + + ___createClass_15(InteractEvent, [{ + key: "getSwipe", + value: function getSwipe() { + var interaction = this._interaction; + + if (interaction.prevEvent.speed < 600 || this.timeStamp - interaction.prevEvent.timeStamp > 150) { + return null; + } + + var angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI; + var overlap = 22.5; + + if (angle < 0) { + angle += 360; + } + + var left = 135 - overlap <= angle && angle < 225 + overlap; + var up = 225 - overlap <= angle && angle < 315 + overlap; + var right = !left && (315 - overlap <= angle || angle < 45 + overlap); + var down = !up && 45 - overlap <= angle && angle < 135 + overlap; + return { + up: up, + down: down, + left: left, + right: right, + angle: angle, + speed: interaction.prevEvent.speed, + velocity: { + x: interaction.prevEvent.velocityX, + y: interaction.prevEvent.velocityY + } + }; + } + }, { + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + /** + * Don't call any other listeners (even on the current target) + */ + + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "pageX", + get: function get() { + return this.page.x; + }, + set: function set(value) { + this.page.x = value; + } + }, { + key: "pageY", + get: function get() { + return this.page.y; + }, + set: function set(value) { + this.page.y = value; + } + }, { + key: "clientX", + get: function get() { + return this.client.x; + }, + set: function set(value) { + this.client.x = value; + } + }, { + key: "clientY", + get: function get() { + return this.client.y; + }, + set: function set(value) { + this.client.y = value; + } + }, { + key: "dx", + get: function get() { + return this.delta.x; + }, + set: function set(value) { + this.delta.x = value; + } + }, { + key: "dy", + get: function get() { + return this.delta.y; + }, + set: function set(value) { + this.delta.y = value; + } + }, { + key: "velocityX", + get: function get() { + return this.velocity.x; + }, + set: function set(value) { + this.velocity.x = value; + } + }, { + key: "velocityY", + get: function get() { + return this.velocity.y; + }, + set: function set(value) { + this.velocity.y = value; + } + }]); + + return InteractEvent; +}(_BaseEvent2["default"]); + +_$InteractEvent_15.InteractEvent = InteractEvent; +var ___default_15 = InteractEvent; +_$InteractEvent_15["default"] = ___default_15; + +var _$PointerInfo_19 = {}; +"use strict"; + +Object.defineProperty(_$PointerInfo_19, "__esModule", { + value: true +}); +_$PointerInfo_19["default"] = _$PointerInfo_19.PointerInfo = void 0; + +function ___classCallCheck_19(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* eslint-disable @typescript-eslint/no-parameter-properties */ +var PointerInfo = function PointerInfo(id, pointer, event, downTime, downTarget) { + ___classCallCheck_19(this, PointerInfo); + + this.id = id; + this.pointer = pointer; + this.event = event; + this.downTime = downTime; + this.downTarget = downTarget; +}; + +_$PointerInfo_19.PointerInfo = PointerInfo; +var ___default_19 = PointerInfo; +_$PointerInfo_19["default"] = ___default_19; + +var _$Interaction_18 = {}; +"use strict"; + +function ___typeof_18(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_18 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_18 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_18(obj); } + +Object.defineProperty(_$Interaction_18, "__esModule", { + value: true +}); +Object.defineProperty(_$Interaction_18, "PointerInfo", { + enumerable: true, + get: function get() { + return _PointerInfo["default"]; + } +}); +_$Interaction_18["default"] = _$Interaction_18.Interaction = _$Interaction_18._ProxyMethods = _$Interaction_18._ProxyValues = void 0; + +var utils = ___interopRequireWildcard_18(_$index_58); + +var _InteractEvent = ___interopRequireDefault_18(_$InteractEvent_15); + +var _PointerInfo = ___interopRequireDefault_18(_$PointerInfo_19); + +function ___interopRequireDefault_18(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_18() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_18 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_18(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_18(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_18(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_18(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_18(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_18(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_18(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_18(Constructor, staticProps); return Constructor; } + +function ___defineProperty_18(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var _ProxyValues; + +_$Interaction_18._ProxyValues = _ProxyValues; + +(function (_ProxyValues) { + _ProxyValues["interactable"] = ""; + _ProxyValues["element"] = ""; + _ProxyValues["prepared"] = ""; + _ProxyValues["pointerIsDown"] = ""; + _ProxyValues["pointerWasMoved"] = ""; + _ProxyValues["_proxy"] = ""; +})(_ProxyValues || (_$Interaction_18._ProxyValues = _ProxyValues = {})); + +var _ProxyMethods; + +_$Interaction_18._ProxyMethods = _ProxyMethods; + +(function (_ProxyMethods) { + _ProxyMethods["start"] = ""; + _ProxyMethods["move"] = ""; + _ProxyMethods["end"] = ""; + _ProxyMethods["stop"] = ""; + _ProxyMethods["interacting"] = ""; +})(_ProxyMethods || (_$Interaction_18._ProxyMethods = _ProxyMethods = {})); + +var idCounter = 0; + +var Interaction = /*#__PURE__*/function () { + ___createClass_18(Interaction, [{ + key: "pointerMoveTolerance", + // current interactable being interacted with + // the target element of the interactable + // action that's ready to be fired on next move event + // keep track of added pointers + // pointerdown/mousedown/touchstart event + // previous action event + get: function get() { + return 1; + } + /** + * @alias Interaction.prototype.move + */ + + }]); + + /** */ + function Interaction(_ref) { + var _this = this; + + var pointerType = _ref.pointerType, + scopeFire = _ref.scopeFire; + + ___classCallCheck_18(this, Interaction); + + ___defineProperty_18(this, "interactable", null); + + ___defineProperty_18(this, "element", null); + + ___defineProperty_18(this, "rect", void 0); + + ___defineProperty_18(this, "_rects", void 0); + + ___defineProperty_18(this, "edges", void 0); + + ___defineProperty_18(this, "_scopeFire", void 0); + + ___defineProperty_18(this, "prepared", { + name: null, + axis: null, + edges: null + }); + + ___defineProperty_18(this, "pointerType", void 0); + + ___defineProperty_18(this, "pointers", []); + + ___defineProperty_18(this, "downEvent", null); + + ___defineProperty_18(this, "downPointer", {}); + + ___defineProperty_18(this, "_latestPointer", { + pointer: null, + event: null, + eventTarget: null + }); + + ___defineProperty_18(this, "prevEvent", null); + + ___defineProperty_18(this, "pointerIsDown", false); + + ___defineProperty_18(this, "pointerWasMoved", false); + + ___defineProperty_18(this, "_interacting", false); + + ___defineProperty_18(this, "_ending", false); + + ___defineProperty_18(this, "_stopped", true); + + ___defineProperty_18(this, "_proxy", null); + + ___defineProperty_18(this, "simulation", null); + + ___defineProperty_18(this, "doMove", utils.warnOnce(function (signalArg) { + this.move(signalArg); + }, 'The interaction.doMove() method has been renamed to interaction.move()')); + + ___defineProperty_18(this, "coords", { + // Starting InteractEvent pointer coordinates + start: utils.pointer.newCoords(), + // Previous native pointer move event coordinates + prev: utils.pointer.newCoords(), + // current native pointer move event coordinates + cur: utils.pointer.newCoords(), + // Change in coordinates and time of the pointer + delta: utils.pointer.newCoords(), + // pointer velocity + velocity: utils.pointer.newCoords() + }); + + ___defineProperty_18(this, "_id", idCounter++); + + this._scopeFire = scopeFire; + this.pointerType = pointerType; + var that = this; + this._proxy = {}; + + var _loop = function _loop(key) { + Object.defineProperty(_this._proxy, key, { + get: function get() { + return that[key]; + } + }); + }; + + for (var key in _ProxyValues) { + _loop(key); + } + + var _loop2 = function _loop2(_key) { + Object.defineProperty(_this._proxy, _key, { + value: function value() { + return that[_key].apply(that, arguments); + } + }); + }; + + for (var _key in _ProxyMethods) { + _loop2(_key); + } + + this._scopeFire('interactions:new', { + interaction: this + }); + } + + ___createClass_18(Interaction, [{ + key: "pointerDown", + value: function pointerDown(pointer, event, eventTarget) { + var pointerIndex = this.updatePointer(pointer, event, eventTarget, true); + var pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:down', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + pointerIndex: pointerIndex, + pointerInfo: pointerInfo, + type: 'down', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable({ + * // disable the default drag start by down->move + * manualStart: true + * }) + * // start dragging after the user holds the pointer down + * .on('hold', function (event) { + * var interaction = event.interaction + * + * if (!interaction.interacting()) { + * interaction.start({ name: 'drag' }, + * event.interactable, + * event.currentTarget) + * } + * }) + * ``` + * + * Start an action with the given Interactable and Element as tartgets. The + * action must be enabled for the target Interactable and an appropriate + * number of pointers must be held down - 1 for drag/resize, 2 for gesture. + * + * Use it with `interactable.able({ manualStart: false })` to always + * [start actions manually](https://github.com/taye/interact.js/issues/114) + * + * @param {object} action The action to be performed - drag, resize, etc. + * @param {Interactable} target The Interactable to target + * @param {Element} element The DOM Element to target + * @return {object} interact + */ + + }, { + key: "start", + value: function start(action, interactable, element) { + if (this.interacting() || !this.pointerIsDown || this.pointers.length < (action.name === 'gesture' ? 2 : 1) || !interactable.options[action.name].enabled) { + return false; + } + + utils.copyAction(this.prepared, action); + this.interactable = interactable; + this.element = element; + this.rect = interactable.getRect(element); + this.edges = this.prepared.edges ? utils.extend({}, this.prepared.edges) : { + left: true, + right: true, + top: true, + bottom: true + }; + this._stopped = false; + this._interacting = this._doPhase({ + interaction: this, + event: this.downEvent, + phase: 'start' + }) && !this._stopped; + return this._interacting; + } + }, { + key: "pointerMove", + value: function pointerMove(pointer, event, eventTarget) { + if (!this.simulation && !(this.modification && this.modification.endResult)) { + this.updatePointer(pointer, event, eventTarget, false); + } + + var duplicateMove = this.coords.cur.page.x === this.coords.prev.page.x && this.coords.cur.page.y === this.coords.prev.page.y && this.coords.cur.client.x === this.coords.prev.client.x && this.coords.cur.client.y === this.coords.prev.client.y; + var dx; + var dy; // register movement greater than pointerMoveTolerance + + if (this.pointerIsDown && !this.pointerWasMoved) { + dx = this.coords.cur.client.x - this.coords.start.client.x; + dy = this.coords.cur.client.y - this.coords.start.client.y; + this.pointerWasMoved = utils.hypot(dx, dy) > this.pointerMoveTolerance; + } + + var pointerIndex = this.getPointerIndex(pointer); + var signalArg = { + pointer: pointer, + pointerIndex: pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event: event, + type: 'move', + eventTarget: eventTarget, + dx: dx, + dy: dy, + duplicate: duplicateMove, + interaction: this + }; + + if (!duplicateMove) { + // set pointer coordinate, time changes and velocity + utils.pointer.setCoordVelocity(this.coords.velocity, this.coords.delta); + } + + this._scopeFire('interactions:move', signalArg); + + if (!duplicateMove && !this.simulation) { + // if interacting, fire an 'action-move' signal etc + if (this.interacting()) { + signalArg.type = null; + this.move(signalArg); + } + + if (this.pointerWasMoved) { + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + } + } + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('dragmove', function (event) { + * if (someCondition) { + * // change the snap settings + * event.interactable.draggable({ snap: { targets: [] }}) + * // fire another move event with re-calculated snap + * event.interaction.move() + * } + * }) + * ``` + * + * Force a move of the current action at the same coordinates. Useful if + * snap/restrict has been changed and you want a movement with the new + * settings. + */ + + }, { + key: "move", + value: function move(signalArg) { + if (!signalArg || !signalArg.event) { + utils.pointer.setZeroCoords(this.coords.delta); + } + + signalArg = utils.extend({ + pointer: this._latestPointer.pointer, + event: this._latestPointer.event, + eventTarget: this._latestPointer.eventTarget, + interaction: this + }, signalArg || {}); + signalArg.phase = 'move'; + + this._doPhase(signalArg); + } // End interact move events and stop auto-scroll unless simulation is running + + }, { + key: "pointerUp", + value: function pointerUp(pointer, event, eventTarget, curEventTarget) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + pointerIndex = this.updatePointer(pointer, event, eventTarget, false); + } + + var type = /cancel$/i.test(event.type) ? 'cancel' : 'up'; + + this._scopeFire("interactions:".concat(type), { + pointer: pointer, + pointerIndex: pointerIndex, + pointerInfo: this.pointers[pointerIndex], + event: event, + eventTarget: eventTarget, + type: type, + curEventTarget: curEventTarget, + interaction: this + }); + + if (!this.simulation) { + this.end(event); + } + + this.pointerIsDown = false; + this.removePointer(pointer, event); + } + }, { + key: "documentBlur", + value: function documentBlur(event) { + this.end(event); + + this._scopeFire('interactions:blur', { + event: event, + type: 'blur', + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('move', function (event) { + * if (event.pageX > 1000) { + * // end the current action + * event.interaction.end() + * // stop all further listeners from being called + * event.stopImmediatePropagation() + * } + * }) + * ``` + * + * @param {PointerEvent} [event] + */ + + }, { + key: "end", + value: function end(event) { + this._ending = true; + event = event || this._latestPointer.event; + var endPhaseResult; + + if (this.interacting()) { + endPhaseResult = this._doPhase({ + event: event, + interaction: this, + phase: 'end' + }); + } + + this._ending = false; + + if (endPhaseResult === true) { + this.stop(); + } + } + }, { + key: "currentAction", + value: function currentAction() { + return this._interacting ? this.prepared.name : null; + } + }, { + key: "interacting", + value: function interacting() { + return this._interacting; + } + /** */ + + }, { + key: "stop", + value: function stop() { + this._scopeFire('interactions:stop', { + interaction: this + }); + + this.interactable = this.element = null; + this._interacting = false; + this._stopped = true; + this.prepared.name = this.prevEvent = null; + } + }, { + key: "getPointerIndex", + value: function getPointerIndex(pointer) { + var pointerId = utils.pointer.getPointerId(pointer); // mouse and pen interactions may have only one pointer + + return this.pointerType === 'mouse' || this.pointerType === 'pen' ? this.pointers.length - 1 : utils.arr.findIndex(this.pointers, function (curPointer) { + return curPointer.id === pointerId; + }); + } + }, { + key: "getPointerInfo", + value: function getPointerInfo(pointer) { + return this.pointers[this.getPointerIndex(pointer)]; + } + }, { + key: "updatePointer", + value: function updatePointer(pointer, event, eventTarget, down) { + var id = utils.pointer.getPointerId(pointer); + var pointerIndex = this.getPointerIndex(pointer); + var pointerInfo = this.pointers[pointerIndex]; + down = down === false ? false : down || /(down|start)$/i.test(event.type); + + if (!pointerInfo) { + pointerInfo = new _PointerInfo["default"](id, pointer, event, null, null); + pointerIndex = this.pointers.length; + this.pointers.push(pointerInfo); + } else { + pointerInfo.pointer = pointer; + } + + utils.pointer.setCoords(this.coords.cur, this.pointers.map(function (p) { + return p.pointer; + }), this._now()); + utils.pointer.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur); + + if (down) { + this.pointerIsDown = true; + pointerInfo.downTime = this.coords.cur.timeStamp; + pointerInfo.downTarget = eventTarget; + utils.pointer.pointerExtend(this.downPointer, pointer); + + if (!this.interacting()) { + utils.pointer.copyCoords(this.coords.start, this.coords.cur); + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); + this.downEvent = event; + this.pointerWasMoved = false; + } + } + + this._updateLatestPointer(pointer, event, eventTarget); + + this._scopeFire('interactions:update-pointer', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + down: down, + pointerInfo: pointerInfo, + pointerIndex: pointerIndex, + interaction: this + }); + + return pointerIndex; + } + }, { + key: "removePointer", + value: function removePointer(pointer, event) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + return; + } + + var pointerInfo = this.pointers[pointerIndex]; + + this._scopeFire('interactions:remove-pointer', { + pointer: pointer, + event: event, + eventTarget: null, + pointerIndex: pointerIndex, + pointerInfo: pointerInfo, + interaction: this + }); + + this.pointers.splice(pointerIndex, 1); + } + }, { + key: "_updateLatestPointer", + value: function _updateLatestPointer(pointer, event, eventTarget) { + this._latestPointer.pointer = pointer; + this._latestPointer.event = event; + this._latestPointer.eventTarget = eventTarget; + } + }, { + key: "destroy", + value: function destroy() { + this._latestPointer.pointer = null; + this._latestPointer.event = null; + this._latestPointer.eventTarget = null; + } + }, { + key: "_createPreparedEvent", + value: function _createPreparedEvent(event, phase, preEnd, type) { + return new _InteractEvent["default"](this, event, this.prepared.name, phase, this.element, preEnd, type); + } + }, { + key: "_fireEvent", + value: function _fireEvent(iEvent) { + this.interactable.fire(iEvent); + + if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) { + this.prevEvent = iEvent; + } + } + }, { + key: "_doPhase", + value: function _doPhase(signalArg) { + var event = signalArg.event, + phase = signalArg.phase, + preEnd = signalArg.preEnd, + type = signalArg.type; + var rect = this.rect; + + if (rect && phase === 'move') { + // update the rect changes due to pointer move + utils.rect.addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource]); + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + + var beforeResult = this._scopeFire("interactions:before-action-".concat(phase), signalArg); + + if (beforeResult === false) { + return false; + } + + var iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type); + + this._scopeFire("interactions:action-".concat(phase), signalArg); + + if (phase === 'start') { + this.prevEvent = iEvent; + } + + this._fireEvent(iEvent); + + this._scopeFire("interactions:after-action-".concat(phase), signalArg); + + return true; + } + }, { + key: "_now", + value: function _now() { + return Date.now(); + } + }]); + + return Interaction; +}(); + +_$Interaction_18.Interaction = Interaction; +var ___default_18 = Interaction; +_$Interaction_18["default"] = ___default_18; + +var _$interactionFinder_22 = {}; +"use strict"; + +function ___typeof_22(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_22 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_22 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_22(obj); } + +Object.defineProperty(_$interactionFinder_22, "__esModule", { + value: true +}); +_$interactionFinder_22["default"] = void 0; + +var __dom_22 = ___interopRequireWildcard_22(_$domUtils_53); + +function ___getRequireWildcardCache_22() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_22 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_22(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_22(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_22(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +var finder = { + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], + search: function search(details) { + for (var _i = 0; _i < finder.methodOrder.length; _i++) { + var _ref; + + _ref = finder.methodOrder[_i]; + var method = _ref; + var interaction = finder[method](details); + + if (interaction) { + return interaction; + } + } + + return null; + }, + // try to resume simulation with a new pointer + simulationResume: function simulationResume(_ref2) { + var pointerType = _ref2.pointerType, + eventType = _ref2.eventType, + eventTarget = _ref2.eventTarget, + scope = _ref2.scope; + + if (!/down|start/i.test(eventType)) { + return null; + } + + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref3; + + _ref3 = scope.interactions.list[_i2]; + var interaction = _ref3; + var element = eventTarget; + + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { + while (element) { + // if the element is the interaction element + if (element === interaction.element) { + return interaction; + } + + element = __dom_22.parentNode(element); + } + } + } + + return null; + }, + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { + var pointerId = _ref4.pointerId, + pointerType = _ref4.pointerType, + eventType = _ref4.eventType, + scope = _ref4.scope; + + if (pointerType !== 'mouse' && pointerType !== 'pen') { + return null; + } + + var firstNonActive; + + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref5; + + _ref5 = scope.interactions.list[_i3]; + var interaction = _ref5; + + if (interaction.pointerType === pointerType) { + // if it's a down event, skip interactions with running simulations + if (interaction.simulation && !hasPointerId(interaction, pointerId)) { + continue; + } // if the interaction is active, return it immediately + + + if (interaction.interacting()) { + return interaction; + } // otherwise save it and look for another active interaction + else if (!firstNonActive) { + firstNonActive = interaction; + } + } + } // if no active mouse interaction was found use the first inactive mouse + // interaction + + + if (firstNonActive) { + return firstNonActive; + } // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation + // is active + + + for (var _i4 = 0; _i4 < scope.interactions.list.length; _i4++) { + var _ref6; + + _ref6 = scope.interactions.list[_i4]; + var _interaction = _ref6; + + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { + return _interaction; + } + } + + return null; + }, + // get interaction that has this pointer + hasPointer: function hasPointer(_ref7) { + var pointerId = _ref7.pointerId, + scope = _ref7.scope; + + for (var _i5 = 0; _i5 < scope.interactions.list.length; _i5++) { + var _ref8; + + _ref8 = scope.interactions.list[_i5]; + var interaction = _ref8; + + if (hasPointerId(interaction, pointerId)) { + return interaction; + } + } + + return null; + }, + // get first idle interaction with a matching pointerType + idle: function idle(_ref9) { + var pointerType = _ref9.pointerType, + scope = _ref9.scope; + + for (var _i6 = 0; _i6 < scope.interactions.list.length; _i6++) { + var _ref10; + + _ref10 = scope.interactions.list[_i6]; + var interaction = _ref10; + + // if there's already a pointer held down + if (interaction.pointers.length === 1) { + var target = interaction.interactable; // don't add this pointer if there is a target interactable and it + // isn't gesturable + + if (target && !(target.options.gesture && target.options.gesture.enabled)) { + continue; + } + } // maximum of 2 pointers per interaction + else if (interaction.pointers.length >= 2) { + continue; + } + + if (!interaction.interacting() && pointerType === interaction.pointerType) { + return interaction; + } + } + + return null; + } +}; + +function hasPointerId(interaction, pointerId) { + return interaction.pointers.some(function (_ref11) { + var id = _ref11.id; + return id === pointerId; + }); +} + +var ___default_22 = finder; +_$interactionFinder_22["default"] = ___default_22; + +var _$interactablePreventDefault_21 = {}; +"use strict"; + +function ___typeof_21(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_21 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_21 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_21(obj); } + +Object.defineProperty(_$interactablePreventDefault_21, "__esModule", { + value: true +}); +_$interactablePreventDefault_21.install = __install_21; +_$interactablePreventDefault_21["default"] = void 0; + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var ___events_21 = ___interopRequireDefault_21(_$events_54); + +var __is_21 = ___interopRequireWildcard_21(_$is_59); + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +function ___getRequireWildcardCache_21() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_21 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_21(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_21(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_21(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_21(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function preventDefault(newValue) { + if (/^(always|never|auto)$/.test(newValue)) { + this.options.preventDefault = newValue; + return this; + } + + if (__is_21.bool(newValue)) { + this.options.preventDefault = newValue ? 'always' : 'never'; + return this; + } + + return this.options.preventDefault; +} + +function checkAndPreventDefault(interactable, scope, event) { + var setting = interactable.options.preventDefault; + + if (setting === 'never') { + return; + } + + if (setting === 'always') { + event.preventDefault(); + return; + } // setting === 'auto' + // if the browser supports passive event listeners and isn't running on iOS, + // don't preventDefault of touch{start,move} events. CSS touch-action and + // user-select should be used instead of calling event.preventDefault(). + + + if (___events_21["default"].supportsPassive && /^touch(start|move)$/.test(event.type)) { + var doc = (0, _$window_68.getWindow)(event.target).document; + var docOptions = scope.getDocOptions(doc); + + if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) { + return; + } + } // don't preventDefault of pointerdown events + + + if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) { + return; + } // don't preventDefault on editable elements + + + if (__is_21.element(event.target) && (0, _$domUtils_53.matchesSelector)(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) { + return; + } + + event.preventDefault(); +} + +function onInteractionEvent(_ref) { + var interaction = _ref.interaction, + event = _ref.event; + + if (interaction.interactable) { + interaction.interactable.checkAndPreventDefault(event); + } +} + +function __install_21(scope) { + /** @lends Interactable */ + var Interactable = scope.Interactable; + /** + * Returns or sets whether to prevent the browser's default behaviour in + * response to pointer events. Can be set to: + * - `'always'` to always prevent + * - `'never'` to never prevent + * - `'auto'` to let interact.js try to determine what would be best + * + * @param {string} [newValue] `'always'`, `'never'` or `'auto'` + * @return {string | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.preventDefault = preventDefault; + + Interactable.prototype.checkAndPreventDefault = function (event) { + return checkAndPreventDefault(this, scope, event); + }; // prevent native HTML5 drag on interact.js target elements + + + scope.interactions.docEvents.push({ + type: 'dragstart', + listener: function listener(event) { + for (var _i = 0; _i < scope.interactions.list.length; _i++) { + var _ref2; + + _ref2 = scope.interactions.list[_i]; + var interaction = _ref2; + + if (interaction.element && (interaction.element === event.target || (0, _$domUtils_53.nodeContains)(interaction.element, event.target))) { + interaction.interactable.checkAndPreventDefault(event); + return; + } + } + } + }); +} + +var ___default_21 = { + id: 'core/interactablePreventDefault', + install: __install_21, + listeners: ['down', 'move', 'up', 'cancel'].reduce(function (acc, eventType) { + acc["interactions:".concat(eventType)] = onInteractionEvent; + return acc; + }, {}) +}; +_$interactablePreventDefault_21["default"] = ___default_21; + +var _$DropEvent_2 = {}; +"use strict"; + +Object.defineProperty(_$DropEvent_2, "__esModule", { + value: true +}); +_$DropEvent_2["default"] = void 0; + +var ___BaseEvent2_2 = ___interopRequireDefault_2(_$BaseEvent_13); + +var __arr_2 = ___interopRequireWildcard_2(_$arr_49); + +function ___getRequireWildcardCache_2() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_2 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_2(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_2(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_2(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_2(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_2(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_2 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_2 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_2(obj); } + +function ___classCallCheck_2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_2(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_2(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_2(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_2(Constructor, staticProps); return Constructor; } + +function ___possibleConstructorReturn_2(self, call) { if (call && (___typeof_2(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_2(self); } + +function ___getPrototypeOf_2(o) { ___getPrototypeOf_2 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_2(o); } + +function ___assertThisInitialized_2(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ___inherits_2(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_2(subClass, superClass); } + +function ___setPrototypeOf_2(o, p) { ___setPrototypeOf_2 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_2(o, p); } + +function ___defineProperty_2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var DropEvent = /*#__PURE__*/function (_BaseEvent) { + ___inherits_2(DropEvent, _BaseEvent); + + /** + * Class of events fired on dropzones during drags with acceptable targets. + */ + function DropEvent(dropState, dragEvent, type) { + var _this; + + ___classCallCheck_2(this, DropEvent); + + _this = ___possibleConstructorReturn_2(this, ___getPrototypeOf_2(DropEvent).call(this, dragEvent._interaction)); + + ___defineProperty_2(___assertThisInitialized_2(_this), "target", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "dropzone", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "dragEvent", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "relatedTarget", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "draggable", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "timeStamp", void 0); + + ___defineProperty_2(___assertThisInitialized_2(_this), "propagationStopped", false); + + ___defineProperty_2(___assertThisInitialized_2(_this), "immediatePropagationStopped", false); + + var _ref = type === 'dragleave' ? dropState.prev : dropState.cur, + element = _ref.element, + dropzone = _ref.dropzone; + + _this.type = type; + _this.target = element; + _this.currentTarget = element; + _this.dropzone = dropzone; + _this.dragEvent = dragEvent; + _this.relatedTarget = dragEvent.target; + _this.draggable = dragEvent.interactable; + _this.timeStamp = dragEvent.timeStamp; + return _this; + } + /** + * If this is a `dropactivate` event, the dropzone element will be + * deactivated. + * + * If this is a `dragmove` or `dragenter`, a `dragleave` will be fired on the + * dropzone element and more. + */ + + + ___createClass_2(DropEvent, [{ + key: "reject", + value: function reject() { + var _this2 = this; + + var dropState = this._interaction.dropState; + + if (this.type !== 'dropactivate' && (!this.dropzone || dropState.cur.dropzone !== this.dropzone || dropState.cur.element !== this.target)) { + return; + } + + dropState.prev.dropzone = this.dropzone; + dropState.prev.element = this.target; + dropState.rejected = true; + dropState.events.enter = null; + this.stopImmediatePropagation(); + + if (this.type === 'dropactivate') { + var activeDrops = dropState.activeDrops; + var index = __arr_2.findIndex(activeDrops, function (_ref2) { + var dropzone = _ref2.dropzone, + element = _ref2.element; + return dropzone === _this2.dropzone && element === _this2.target; + }); + dropState.activeDrops.splice(index, 1); + var deactivateEvent = new DropEvent(dropState, this.dragEvent, 'dropdeactivate'); + deactivateEvent.dropzone = this.dropzone; + deactivateEvent.target = this.target; + this.dropzone.fire(deactivateEvent); + } else { + this.dropzone.fire(new DropEvent(dropState, this.dragEvent, 'dragleave')); + } + } + }, { + key: "preventDefault", + value: function preventDefault() {} + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }]); + + return DropEvent; +}(___BaseEvent2_2["default"]); + +var ___default_2 = DropEvent; +_$DropEvent_2["default"] = ___default_2; + +var _$index_3 = {}; +"use strict"; + +function ___typeof_3(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_3 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_3 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_3(obj); } + +Object.defineProperty(_$index_3, "__esModule", { + value: true +}); +_$index_3["default"] = void 0; + +var ___Interactable_3 = ___interopRequireDefault_3(_$Interactable_16({})); + +var ___scope_3 = _$scope_24({}); + +var __utils_3 = ___interopRequireWildcard_3(_$index_58); + +var _drag = ___interopRequireDefault_3(_$drag_1); + +var _DropEvent = ___interopRequireDefault_3(_$DropEvent_2); + +function ___getRequireWildcardCache_3() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_3 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_3(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_3(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_3(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_3(scope) { + var actions = scope.actions, + interact = scope.interact, + Interactable = scope.Interactable, + defaults = scope.defaults; + scope.usePlugin(_drag["default"]); + /** + * + * ```js + * interact('.drop').dropzone({ + * accept: '.can-drop' || document.getElementById('single-drop'), + * overlap: 'pointer' || 'center' || zeroToOne + * } + * ``` + * + * Returns or sets whether draggables can be dropped onto this target to + * trigger drop events + * + * Dropzones can receive the following events: + * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends + * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone + * - `dragmove` when a draggable that has entered the dropzone is moved + * - `drop` when a draggable is dropped into this dropzone + * + * Use the `accept` option to allow only elements that match the given CSS + * selector or element. The value can be: + * + * - **an Element** - only that element can be dropped into this dropzone. + * - **a string**, - the element being dragged must match it as a CSS selector. + * - **`null`** - accept options is cleared - it accepts any element. + * + * Use the `overlap` option to set how drops are checked for. The allowed + * values are: + * + * - `'pointer'`, the pointer must be over the dropzone (default) + * - `'center'`, the draggable element's center must be over the dropzone + * - a number from 0-1 which is the `(intersection area) / (draggable area)`. + * e.g. `0.5` for drop to happen when half of the area of the draggable is + * over the dropzone + * + * Use the `checker` option to specify a function to check if a dragged element + * is over this Interactable. + * + * @param {boolean | object | null} [options] The new options to be set. + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.dropzone = function (options) { + return dropzoneMethod(this, options); + }; + /** + * ```js + * interact(target) + * .dropChecker(function(dragEvent, // related dragmove or dragend event + * event, // TouchEvent/PointerEvent/MouseEvent + * dropped, // bool result of the default checker + * dropzone, // dropzone Interactable + * dropElement, // dropzone elemnt + * draggable, // draggable Interactable + * draggableElement) {// draggable element + * + * return dropped && event.target.hasAttribute('allow-drop') + * } + * ``` + */ + + + Interactable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) { + return dropCheckMethod(this, dragEvent, event, draggable, draggableElement, dropElement, rect); + }; + /** + * Returns or sets whether the dimensions of dropzone elements are calculated + * on every dragmove or only on dragstart for the default dropChecker + * + * @param {boolean} [newValue] True to check on each move. False to check only + * before start + * @return {boolean | interact} The current setting or interact + */ + + + interact.dynamicDrop = function (newValue) { + if (__utils_3.is.bool(newValue)) { + // if (dragging && scope.dynamicDrop !== newValue && !newValue) { + // calcRects(dropzones) + // } + scope.dynamicDrop = newValue; + return interact; + } + + return scope.dynamicDrop; + }; + + __utils_3.extend(actions.phaselessTypes, { + dragenter: true, + dragleave: true, + dropactivate: true, + dropdeactivate: true, + dropmove: true, + drop: true + }); + actions.methodDict.drop = 'dropzone'; + scope.dynamicDrop = false; + defaults.actions.drop = drop.defaults; +} + +function collectDrops(_ref, draggableElement) { + var interactables = _ref.interactables; + var drops = []; // collect all dropzones and their elements which qualify for a drop + + for (var _i = 0; _i < interactables.list.length; _i++) { + var _ref2; + + _ref2 = interactables.list[_i]; + var dropzone = _ref2; + + if (!dropzone.options.drop.enabled) { + continue; + } + + var accept = dropzone.options.drop.accept; // test the draggable draggableElement against the dropzone's accept setting + + if (__utils_3.is.element(accept) && accept !== draggableElement || __utils_3.is.string(accept) && !__utils_3.dom.matchesSelector(draggableElement, accept) || __utils_3.is.func(accept) && !accept({ + dropzone: dropzone, + draggableElement: draggableElement + })) { + continue; + } // query for new elements if necessary + + + var dropElements = __utils_3.is.string(dropzone.target) ? dropzone._context.querySelectorAll(dropzone.target) : __utils_3.is.array(dropzone.target) ? dropzone.target : [dropzone.target]; + + for (var _i2 = 0; _i2 < dropElements.length; _i2++) { + var _ref3; + + _ref3 = dropElements[_i2]; + var dropzoneElement = _ref3; + + if (dropzoneElement !== draggableElement) { + drops.push({ + dropzone: dropzone, + element: dropzoneElement + }); + } + } + } + + return drops; +} + +function fireActivationEvents(activeDrops, event) { + // loop through all active dropzones and trigger event + for (var _i3 = 0; _i3 < activeDrops.slice().length; _i3++) { + var _ref4; + + _ref4 = activeDrops.slice()[_i3]; + var _ref5 = _ref4, + dropzone = _ref5.dropzone, + element = _ref5.element; + event.dropzone = dropzone; // set current element as event target + + event.target = element; + dropzone.fire(event); + event.propagationStopped = event.immediatePropagationStopped = false; + } +} // return a new array of possible drops. getActiveDrops should always be +// called when a drag has just started or a drag event happens while +// dynamicDrop is true + + +function getActiveDrops(scope, dragElement) { + // get dropzones and their elements that could receive the draggable + var activeDrops = collectDrops(scope, dragElement); + + for (var _i4 = 0; _i4 < activeDrops.length; _i4++) { + var _ref6; + + _ref6 = activeDrops[_i4]; + var activeDrop = _ref6; + activeDrop.rect = activeDrop.dropzone.getRect(activeDrop.element); + } + + return activeDrops; +} + +function getDrop(_ref7, dragEvent, pointerEvent) { + var dropState = _ref7.dropState, + draggable = _ref7.interactable, + dragElement = _ref7.element; + var validDrops = []; // collect all dropzones and their elements which qualify for a drop + + for (var _i5 = 0; _i5 < dropState.activeDrops.length; _i5++) { + var _ref8; + + _ref8 = dropState.activeDrops[_i5]; + var _ref9 = _ref8, + dropzone = _ref9.dropzone, + dropzoneElement = _ref9.element, + _rect = _ref9.rect; + validDrops.push(dropzone.dropCheck(dragEvent, pointerEvent, draggable, dragElement, dropzoneElement, _rect) ? dropzoneElement : null); + } // get the most appropriate dropzone based on DOM depth and order + + + var dropIndex = __utils_3.dom.indexOfDeepestElement(validDrops); + return dropState.activeDrops[dropIndex] || null; +} + +function getDropEvents(interaction, _pointerEvent, dragEvent) { + var dropState = interaction.dropState; + var dropEvents = { + enter: null, + leave: null, + activate: null, + deactivate: null, + move: null, + drop: null + }; + + if (dragEvent.type === 'dragstart') { + dropEvents.activate = new _DropEvent["default"](dropState, dragEvent, 'dropactivate'); + dropEvents.activate.target = null; + dropEvents.activate.dropzone = null; + } + + if (dragEvent.type === 'dragend') { + dropEvents.deactivate = new _DropEvent["default"](dropState, dragEvent, 'dropdeactivate'); + dropEvents.deactivate.target = null; + dropEvents.deactivate.dropzone = null; + } + + if (dropState.rejected) { + return dropEvents; + } + + if (dropState.cur.element !== dropState.prev.element) { + // if there was a previous dropzone, create a dragleave event + if (dropState.prev.dropzone) { + dropEvents.leave = new _DropEvent["default"](dropState, dragEvent, 'dragleave'); + dragEvent.dragLeave = dropEvents.leave.target = dropState.prev.element; + dragEvent.prevDropzone = dropEvents.leave.dropzone = dropState.prev.dropzone; + } // if dropzone is not null, create a dragenter event + + + if (dropState.cur.dropzone) { + dropEvents.enter = new _DropEvent["default"](dropState, dragEvent, 'dragenter'); + dragEvent.dragEnter = dropState.cur.element; + dragEvent.dropzone = dropState.cur.dropzone; + } + } + + if (dragEvent.type === 'dragend' && dropState.cur.dropzone) { + dropEvents.drop = new _DropEvent["default"](dropState, dragEvent, 'drop'); + dragEvent.dropzone = dropState.cur.dropzone; + dragEvent.relatedTarget = dropState.cur.element; + } + + if (dragEvent.type === 'dragmove' && dropState.cur.dropzone) { + dropEvents.move = new _DropEvent["default"](dropState, dragEvent, 'dropmove'); + dropEvents.move.dragmove = dragEvent; + dragEvent.dropzone = dropState.cur.dropzone; + } + + return dropEvents; +} + +function fireDropEvents(interaction, events) { + var dropState = interaction.dropState; + var activeDrops = dropState.activeDrops, + cur = dropState.cur, + prev = dropState.prev; + + if (events.leave) { + prev.dropzone.fire(events.leave); + } + + if (events.move) { + cur.dropzone.fire(events.move); + } + + if (events.enter) { + cur.dropzone.fire(events.enter); + } + + if (events.drop) { + cur.dropzone.fire(events.drop); + } + + if (events.deactivate) { + fireActivationEvents(activeDrops, events.deactivate); + } + + dropState.prev.dropzone = cur.dropzone; + dropState.prev.element = cur.element; +} + +function onEventCreated(_ref10, scope) { + var interaction = _ref10.interaction, + iEvent = _ref10.iEvent, + event = _ref10.event; + + if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { + return; + } + + var dropState = interaction.dropState; + + if (scope.dynamicDrop) { + dropState.activeDrops = getActiveDrops(scope, interaction.element); + } + + var dragEvent = iEvent; + var dropResult = getDrop(interaction, dragEvent, event); // update rejected status + + dropState.rejected = dropState.rejected && !!dropResult && dropResult.dropzone === dropState.cur.dropzone && dropResult.element === dropState.cur.element; + dropState.cur.dropzone = dropResult && dropResult.dropzone; + dropState.cur.element = dropResult && dropResult.element; + dropState.events = getDropEvents(interaction, event, dragEvent); +} + +function dropzoneMethod(interactable, options) { + if (__utils_3.is.object(options)) { + interactable.options.drop.enabled = options.enabled !== false; + + if (options.listeners) { + var normalized = __utils_3.normalizeListeners(options.listeners); // rename 'drop' to '' as it will be prefixed with 'drop' + + var corrected = Object.keys(normalized).reduce(function (acc, type) { + var correctedType = /^(enter|leave)/.test(type) ? "drag".concat(type) : /^(activate|deactivate|move)/.test(type) ? "drop".concat(type) : type; + acc[correctedType] = normalized[type]; + return acc; + }, {}); + interactable.off(interactable.options.drop.listeners); + interactable.on(corrected); + interactable.options.drop.listeners = corrected; + } + + if (__utils_3.is.func(options.ondrop)) { + interactable.on('drop', options.ondrop); + } + + if (__utils_3.is.func(options.ondropactivate)) { + interactable.on('dropactivate', options.ondropactivate); + } + + if (__utils_3.is.func(options.ondropdeactivate)) { + interactable.on('dropdeactivate', options.ondropdeactivate); + } + + if (__utils_3.is.func(options.ondragenter)) { + interactable.on('dragenter', options.ondragenter); + } + + if (__utils_3.is.func(options.ondragleave)) { + interactable.on('dragleave', options.ondragleave); + } + + if (__utils_3.is.func(options.ondropmove)) { + interactable.on('dropmove', options.ondropmove); + } + + if (/^(pointer|center)$/.test(options.overlap)) { + interactable.options.drop.overlap = options.overlap; + } else if (__utils_3.is.number(options.overlap)) { + interactable.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0); + } + + if ('accept' in options) { + interactable.options.drop.accept = options.accept; + } + + if ('checker' in options) { + interactable.options.drop.checker = options.checker; + } + + return interactable; + } + + if (__utils_3.is.bool(options)) { + interactable.options.drop.enabled = options; + return interactable; + } + + return interactable.options.drop; +} + +function dropCheckMethod(interactable, dragEvent, event, draggable, draggableElement, dropElement, rect) { + var dropped = false; // if the dropzone has no rect (eg. display: none) + // call the custom dropChecker or just return false + + if (!(rect = rect || interactable.getRect(dropElement))) { + return interactable.options.drop.checker ? interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement) : false; + } + + var dropOverlap = interactable.options.drop.overlap; + + if (dropOverlap === 'pointer') { + var origin = __utils_3.getOriginXY(draggable, draggableElement, 'drag'); + var page = __utils_3.pointer.getPageXY(dragEvent); + page.x += origin.x; + page.y += origin.y; + var horizontal = page.x > rect.left && page.x < rect.right; + var vertical = page.y > rect.top && page.y < rect.bottom; + dropped = horizontal && vertical; + } + + var dragRect = draggable.getRect(draggableElement); + + if (dragRect && dropOverlap === 'center') { + var cx = dragRect.left + dragRect.width / 2; + var cy = dragRect.top + dragRect.height / 2; + dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom; + } + + if (dragRect && __utils_3.is.number(dropOverlap)) { + var overlapArea = Math.max(0, Math.min(rect.right, dragRect.right) - Math.max(rect.left, dragRect.left)) * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top, dragRect.top)); + var overlapRatio = overlapArea / (dragRect.width * dragRect.height); + dropped = overlapRatio >= dropOverlap; + } + + if (interactable.options.drop.checker) { + dropped = interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement); + } + + return dropped; +} + +var drop = { + id: 'actions/drop', + install: __install_3, + listeners: { + 'interactions:before-action-start': function interactionsBeforeActionStart(_ref11) { + var interaction = _ref11.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + interaction.dropState = { + cur: { + dropzone: null, + element: null + }, + prev: { + dropzone: null, + element: null + }, + rejected: null, + events: null, + activeDrops: [] + }; + }, + 'interactions:after-action-start': function interactionsAfterActionStart(_ref12, scope) { + var interaction = _ref12.interaction, + event = _ref12.event, + dragEvent = _ref12.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var dropState = interaction.dropState; // reset active dropzones + + dropState.activeDrops = null; + dropState.events = null; + dropState.activeDrops = getActiveDrops(scope, interaction.element); + dropState.events = getDropEvents(interaction, event, dragEvent); + + if (dropState.events.activate) { + fireActivationEvents(dropState.activeDrops, dropState.events.activate); + scope.fire('actions/drop:start', { + interaction: interaction, + dragEvent: dragEvent + }); + } + }, + // FIXME proper signal types + 'interactions:action-move': onEventCreated, + 'interactions:action-end': onEventCreated, + 'interactions:after-action-move': function fireDropAfterMove(_ref13, scope) { + var interaction = _ref13.interaction, + dragEvent = _ref13.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + fireDropEvents(interaction, interaction.dropState.events); + scope.fire('actions/drop:move', { + interaction: interaction, + dragEvent: dragEvent + }); + interaction.dropState.events = {}; + }, + 'interactions:after-action-end': function interactionsAfterActionEnd(_ref14, scope) { + var interaction = _ref14.interaction, + dragEvent = _ref14.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } + + fireDropEvents(interaction, interaction.dropState.events); + scope.fire('actions/drop:end', { + interaction: interaction, + dragEvent: dragEvent + }); + }, + 'interactions:stop': function interactionsStop(_ref15) { + var interaction = _ref15.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var dropState = interaction.dropState; + + if (dropState) { + dropState.activeDrops = null; + dropState.events = null; + dropState.cur.dropzone = null; + dropState.cur.element = null; + dropState.prev.dropzone = null; + dropState.prev.element = null; + dropState.rejected = false; + } + } + }, + getActiveDrops: getActiveDrops, + getDrop: getDrop, + getDropEvents: getDropEvents, + fireDropEvents: fireDropEvents, + defaults: { + enabled: false, + accept: null, + overlap: 'pointer' + } +}; +var ___default_3 = drop; +_$index_3["default"] = ___default_3; + +var _$gesture_4 = {}; +"use strict"; + +function ___typeof_4(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_4 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_4 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_4(obj); } + +Object.defineProperty(_$gesture_4, "__esModule", { + value: true +}); +_$gesture_4["default"] = void 0; + +var __utils_4 = ___interopRequireWildcard_4(_$index_58); + +function ___getRequireWildcardCache_4() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_4 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_4(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_4(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_4(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_4(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + defaults = scope.defaults; + /** + * ```js + * interact(element).gesturable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // limit multiple gestures. + * // See the explanation in {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isGestureable = interact(element).gesturable() + * ``` + * + * Gets or sets whether multitouch gestures can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on gesture events (makes the Interactable gesturable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of gesture events, or this Interactable + */ + + Interactable.prototype.gesturable = function (options) { + if (__utils_4.is.object(options)) { + this.options.gesture.enabled = options.enabled !== false; + this.setPerAction('gesture', options); + this.setOnEvents('gesture', options); + return this; + } + + if (__utils_4.is.bool(options)) { + this.options.gesture.enabled = options; + return this; + } + + return this.options.gesture; + }; + + actions.map.gesture = gesture; + actions.methodDict.gesture = 'gesturable'; + defaults.actions.gesture = gesture.defaults; +} + +function updateGestureProps(_ref) { + var interaction = _ref.interaction, + iEvent = _ref.iEvent, + phase = _ref.phase; + + if (interaction.prepared.name !== 'gesture') { + return; + } + + var pointers = interaction.pointers.map(function (p) { + return p.pointer; + }); + var starting = phase === 'start'; + var ending = phase === 'end'; + var deltaSource = interaction.interactable.options.deltaSource; + iEvent.touches = [pointers[0], pointers[1]]; + + if (starting) { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = 1; + iEvent.ds = 0; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.da = 0; + interaction.gesture.startDistance = iEvent.distance; + interaction.gesture.startAngle = iEvent.angle; + } else if (ending) { + var prevEvent = interaction.prevEvent; + iEvent.distance = prevEvent.distance; + iEvent.box = prevEvent.box; + iEvent.scale = prevEvent.scale; + iEvent.ds = 0; + iEvent.angle = prevEvent.angle; + iEvent.da = 0; + } else { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = iEvent.distance / interaction.gesture.startDistance; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.ds = iEvent.scale - interaction.gesture.scale; + iEvent.da = iEvent.angle - interaction.gesture.angle; + } + + interaction.gesture.distance = iEvent.distance; + interaction.gesture.angle = iEvent.angle; + + if (__utils_4.is.number(iEvent.scale) && iEvent.scale !== Infinity && !isNaN(iEvent.scale)) { + interaction.gesture.scale = iEvent.scale; + } +} + +var gesture = { + id: 'actions/gesture', + before: ['actions/drag', 'actions/resize'], + install: __install_4, + listeners: { + 'interactions:action-start': updateGestureProps, + 'interactions:action-move': updateGestureProps, + 'interactions:action-end': updateGestureProps, + 'interactions:new': function interactionsNew(_ref2) { + var interaction = _ref2.interaction; + interaction.gesture = { + angle: 0, + distance: 0, + scale: 1, + startAngle: 0, + startDistance: 0 + }; + }, + 'auto-start:check': function autoStartCheck(arg) { + if (arg.interaction.pointers.length < 2) { + return undefined; + } + + var gestureOptions = arg.interactable.options.gesture; + + if (!(gestureOptions && gestureOptions.enabled)) { + return undefined; + } + + arg.action = { + name: 'gesture' + }; + return false; + } + }, + defaults: {}, + getCursor: function getCursor() { + return ''; + } +}; +var ___default_4 = gesture; +_$gesture_4["default"] = ___default_4; + +var _$resize_6 = {}; +"use strict"; + +function ___typeof_6(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_6 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_6 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_6(obj); } + +Object.defineProperty(_$resize_6, "__esModule", { + value: true +}); +_$resize_6["default"] = void 0; + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +var __dom_6 = ___interopRequireWildcard_6(_$domUtils_53); + +var ___extend_6 = ___interopRequireDefault_6(_$extend_55); + +var __is_6 = ___interopRequireWildcard_6(_$is_59); + +function ___interopRequireDefault_6(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_6() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_6 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_6(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_6(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_6(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_6(scope) { + var actions = scope.actions, + browser = scope.browser, + Interactable = scope.Interactable, + defaults = scope.defaults; // Less Precision with touch input + + resize.cursors = initCursors(browser); + resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10; + /** + * ```js + * interact(element).resizable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * edges: { + * top : true, // Use pointer coords to check for resize. + * left : false, // Disable resizing from left edge. + * bottom: '.resize-s',// Resize if pointer target matches selector + * right : handleEl // Resize if pointer target is the given Element + * }, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height are adjusted at a 1:1 ratio. + * square: false, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height maintain the aspect ratio they had when resizing started. + * preserveAspectRatio: false, + * + * // a value of 'none' will limit the resize rect to a minimum of 0x0 + * // 'negate' will allow the rect to have negative width/height + * // 'reposition' will keep the width/height positive by swapping + * // the top and bottom edges and/or swapping the left and right edges + * invert: 'none' || 'negate' || 'reposition' + * + * // limit multiple resizes. + * // See the explanation in the {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isResizeable = interact(element).resizable() + * ``` + * + * Gets or sets whether resize actions can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on resize events (object makes the Interactable + * resizable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of resize elements, or this Interactable + */ + + Interactable.prototype.resizable = function (options) { + return resizable(this, options, scope); + }; + + actions.map.resize = resize; + actions.methodDict.resize = 'resizable'; + defaults.actions.resize = resize.defaults; +} + +function resizeChecker(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + element = arg.element, + rect = arg.rect, + buttons = arg.buttons; + + if (!rect) { + return undefined; + } + + var page = (0, ___extend_6["default"])({}, interaction.coords.cur.page); + var resizeOptions = interactable.options.resize; + + if (!(resizeOptions && resizeOptions.enabled) || // check mouseButton setting if the pointer is down + interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & resizeOptions.mouseButtons) === 0) { + return undefined; + } // if using resize.edges + + + if (__is_6.object(resizeOptions.edges)) { + var resizeEdges = { + left: false, + right: false, + top: false, + bottom: false + }; + + for (var edge in resizeEdges) { + resizeEdges[edge] = checkResizeEdge(edge, resizeOptions.edges[edge], page, interaction._latestPointer.eventTarget, element, rect, resizeOptions.margin || resize.defaultMargin); + } + + resizeEdges.left = resizeEdges.left && !resizeEdges.right; + resizeEdges.top = resizeEdges.top && !resizeEdges.bottom; + + if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) { + arg.action = { + name: 'resize', + edges: resizeEdges + }; + } + } else { + var right = resizeOptions.axis !== 'y' && page.x > rect.right - resize.defaultMargin; + var bottom = resizeOptions.axis !== 'x' && page.y > rect.bottom - resize.defaultMargin; + + if (right || bottom) { + arg.action = { + name: 'resize', + axes: (right ? 'x' : '') + (bottom ? 'y' : '') + }; + } + } + + return arg.action ? false : undefined; +} + +function resizable(interactable, options, scope) { + if (__is_6.object(options)) { + interactable.options.resize.enabled = options.enabled !== false; + interactable.setPerAction('resize', options); + interactable.setOnEvents('resize', options); + + if (__is_6.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) { + interactable.options.resize.axis = options.axis; + } else if (options.axis === null) { + interactable.options.resize.axis = scope.defaults.actions.resize.axis; + } + + if (__is_6.bool(options.preserveAspectRatio)) { + interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio; + } else if (__is_6.bool(options.square)) { + interactable.options.resize.square = options.square; + } + + return interactable; + } + + if (__is_6.bool(options)) { + interactable.options.resize.enabled = options; + return interactable; + } + + return interactable.options.resize; +} + +function checkResizeEdge(name, value, page, element, interactableElement, rect, margin) { + // false, '', undefined, null + if (!value) { + return false; + } // true value, use pointer coords and element rect + + + if (value === true) { + // if dimensions are negative, "switch" edges + var width = __is_6.number(rect.width) ? rect.width : rect.right - rect.left; + var height = __is_6.number(rect.height) ? rect.height : rect.bottom - rect.top; // don't use margin greater than half the relevent dimension + + margin = Math.min(margin, (name === 'left' || name === 'right' ? width : height) / 2); + + if (width < 0) { + if (name === 'left') { + name = 'right'; + } else if (name === 'right') { + name = 'left'; + } + } + + if (height < 0) { + if (name === 'top') { + name = 'bottom'; + } else if (name === 'bottom') { + name = 'top'; + } + } + + if (name === 'left') { + return page.x < (width >= 0 ? rect.left : rect.right) + margin; + } + + if (name === 'top') { + return page.y < (height >= 0 ? rect.top : rect.bottom) + margin; + } + + if (name === 'right') { + return page.x > (width >= 0 ? rect.right : rect.left) - margin; + } + + if (name === 'bottom') { + return page.y > (height >= 0 ? rect.bottom : rect.top) - margin; + } + } // the remaining checks require an element + + + if (!__is_6.element(element)) { + return false; + } + + return __is_6.element(value) // the value is an element to use as a resize handle + ? value === element // otherwise check if element matches value as selector + : __dom_6.matchesUpTo(element, value, interactableElement); +} + +function initCursors(browser) { + return browser.isIe9 ? { + x: 'e-resize', + y: 's-resize', + xy: 'se-resize', + top: 'n-resize', + left: 'w-resize', + bottom: 's-resize', + right: 'e-resize', + topleft: 'se-resize', + bottomright: 'se-resize', + topright: 'ne-resize', + bottomleft: 'ne-resize' + } : { + x: 'ew-resize', + y: 'ns-resize', + xy: 'nwse-resize', + top: 'ns-resize', + left: 'ew-resize', + bottom: 'ns-resize', + right: 'ew-resize', + topleft: 'nwse-resize', + bottomright: 'nwse-resize', + topright: 'nesw-resize', + bottomleft: 'nesw-resize' + }; +} + +function start(_ref) { + var iEvent = _ref.iEvent, + interaction = _ref.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + var rect = interaction.rect; + interaction._rects = { + start: (0, ___extend_6["default"])({}, rect), + corrected: (0, ___extend_6["default"])({}, rect), + previous: (0, ___extend_6["default"])({}, rect), + delta: { + left: 0, + right: 0, + width: 0, + top: 0, + bottom: 0, + height: 0 + } + }; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function __move_6(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + var resizeOptions = interaction.interactable.options.resize; + var invert = resizeOptions.invert; + var invertible = invert === 'reposition' || invert === 'negate'; // eslint-disable-next-line no-shadow + + var current = interaction.rect; + var _interaction$_rects = interaction._rects, + startRect = _interaction$_rects.start, + corrected = _interaction$_rects.corrected, + deltaRect = _interaction$_rects.delta, + previous = _interaction$_rects.previous; + (0, ___extend_6["default"])(previous, corrected); + + if (invertible) { + // if invertible, copy the current rect + (0, ___extend_6["default"])(corrected, current); + + if (invert === 'reposition') { + // swap edge values if necessary to keep width/height positive + if (corrected.top > corrected.bottom) { + var swap = corrected.top; + corrected.top = corrected.bottom; + corrected.bottom = swap; + } + + if (corrected.left > corrected.right) { + var _swap = corrected.left; + corrected.left = corrected.right; + corrected.right = _swap; + } + } + } else { + // if not invertible, restrict to minimum of 0x0 rect + corrected.top = Math.min(current.top, startRect.bottom); + corrected.bottom = Math.max(current.bottom, startRect.top); + corrected.left = Math.min(current.left, startRect.right); + corrected.right = Math.max(current.right, startRect.left); + } + + corrected.width = corrected.right - corrected.left; + corrected.height = corrected.bottom - corrected.top; + + for (var edge in corrected) { + deltaRect[edge] = corrected[edge] - previous[edge]; + } + + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = corrected; + resizeEvent.deltaRect = deltaRect; +} + +function end(_ref3) { + var iEvent = _ref3.iEvent, + interaction = _ref3.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeEvent = iEvent; + resizeEvent.edges = interaction.prepared.edges; + resizeEvent.rect = interaction._rects.corrected; + resizeEvent.deltaRect = interaction._rects.delta; +} + +function updateEventAxes(_ref4) { + var iEvent = _ref4.iEvent, + interaction = _ref4.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) { + return; + } + + var options = interaction.interactable.options; + var resizeEvent = iEvent; + + if (options.resize.square) { + if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = resizeEvent.delta.y; + } else { + resizeEvent.delta.y = resizeEvent.delta.x; + } + + resizeEvent.axes = 'xy'; + } else { + resizeEvent.axes = interaction.resizeAxes; + + if (interaction.resizeAxes === 'x') { + resizeEvent.delta.y = 0; + } else if (interaction.resizeAxes === 'y') { + resizeEvent.delta.x = 0; + } + } +} + +var resize = { + id: 'actions/resize', + before: ['actions/drag'], + install: __install_6, + listeners: { + 'interactions:new': function interactionsNew(_ref5) { + var interaction = _ref5.interaction; + interaction.resizeAxes = 'xy'; + }, + 'interactions:action-start': function interactionsActionStart(arg) { + start(arg); + updateEventAxes(arg); + }, + 'interactions:action-move': function interactionsActionMove(arg) { + __move_6(arg); + updateEventAxes(arg); + }, + 'interactions:action-end': end, + 'auto-start:check': resizeChecker + }, + defaults: { + square: false, + preserveAspectRatio: false, + axis: 'xy', + // use default margin + margin: NaN, + // object with props left, right, top, bottom which are + // true/false values to resize when the pointer is over that edge, + // CSS selectors to match the handles for each direction + // or the Elements for each handle + edges: null, + // a value of 'none' will limit the resize rect to a minimum of 0x0 + // 'negate' will alow the rect to have negative width/height + // 'reposition' will keep the width/height positive by swapping + // the top and bottom edges and/or swapping the left and right edges + invert: 'none' + }, + cursors: null, + getCursor: function getCursor(_ref6) { + var edges = _ref6.edges, + axis = _ref6.axis, + name = _ref6.name; + var cursors = resize.cursors; + var result = null; + + if (axis) { + result = cursors[name + axis]; + } else if (edges) { + var cursorKey = ''; + var _arr = ['top', 'bottom', 'left', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (edges[edge]) { + cursorKey += edge; + } + } + + result = cursors[cursorKey]; + } + + return result; + }, + defaultMargin: null +}; +var ___default_6 = resize; +_$resize_6["default"] = ___default_6; + +var _$index_5 = {}; +"use strict"; + +Object.defineProperty(_$index_5, "__esModule", { + value: true +}); +Object.defineProperty(_$index_5, "drag", { + enumerable: true, + get: function get() { + return ___drag_5["default"]; + } +}); +Object.defineProperty(_$index_5, "drop", { + enumerable: true, + get: function get() { + return _index["default"]; + } +}); +Object.defineProperty(_$index_5, "gesture", { + enumerable: true, + get: function get() { + return _gesture["default"]; + } +}); +Object.defineProperty(_$index_5, "resize", { + enumerable: true, + get: function get() { + return _resize["default"]; + } +}); +_$index_5["default"] = void 0; + +var ___drag_5 = ___interopRequireDefault_5(_$drag_1); + +var _index = ___interopRequireDefault_5(_$index_3); + +var _gesture = ___interopRequireDefault_5(_$gesture_4); + +var _resize = ___interopRequireDefault_5(_$resize_6); + +function ___interopRequireDefault_5(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var ___default_5 = { + id: 'actions', + install: function install(scope) { + scope.usePlugin(_gesture["default"]); + scope.usePlugin(_resize["default"]); + scope.usePlugin(___drag_5["default"]); + scope.usePlugin(_index["default"]); + } +}; +_$index_5["default"] = ___default_5; + +var _$index_7 = {}; +"use strict"; + +function ___typeof_7(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_7 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_7 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_7(obj); } + +Object.defineProperty(_$index_7, "__esModule", { + value: true +}); +_$index_7.getContainer = getContainer; +_$index_7.getScroll = getScroll; +_$index_7.getScrollSize = getScrollSize; +_$index_7.getScrollSizeDelta = getScrollSizeDelta; +_$index_7["default"] = void 0; + +var __domUtils_7 = ___interopRequireWildcard_7(_$domUtils_53); + +var __is_7 = ___interopRequireWildcard_7(_$is_59); + +var ___raf_7 = ___interopRequireDefault_7(_$raf_64); + +/* removed: var _$rect_65 = require("@interactjs/utils/rect"); */; + +/* removed: var _$window_68 = require("@interactjs/utils/window"); */; + +function ___interopRequireDefault_7(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_7() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_7 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_7(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_7(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_7(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_7(scope) { + var defaults = scope.defaults, + actions = scope.actions; + scope.autoScroll = autoScroll; + + autoScroll.now = function () { + return scope.now(); + }; + + actions.phaselessTypes.autoscroll = true; + defaults.perAction.autoScroll = autoScroll.defaults; +} + +var autoScroll = { + defaults: { + enabled: false, + margin: 60, + // the item that is scrolled (Window or HTMLElement) + container: null, + // the scroll speed in pixels per second + speed: 300 + }, + now: Date.now, + interaction: null, + i: 0, + // the handle returned by window.setInterval + // Direction each pulse is to scroll in + x: 0, + y: 0, + isScrolling: false, + prevTime: 0, + margin: 0, + speed: 0, + start: function start(interaction) { + autoScroll.isScrolling = true; + + ___raf_7["default"].cancel(autoScroll.i); + + interaction.autoScroll = autoScroll; + autoScroll.interaction = interaction; + autoScroll.prevTime = autoScroll.now(); + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + }, + stop: function stop() { + autoScroll.isScrolling = false; + + if (autoScroll.interaction) { + autoScroll.interaction.autoScroll = null; + } + + ___raf_7["default"].cancel(autoScroll.i); + }, + // scroll the window by the values in scroll.x/y + scroll: function scroll() { + var interaction = autoScroll.interaction; + var interactable = interaction.interactable, + element = interaction.element; + var actionName = interaction.prepared.name; + var options = interactable.options[actionName].autoScroll; + var container = getContainer(options.container, interactable, element); + var now = autoScroll.now(); // change in time in seconds + + var dt = (now - autoScroll.prevTime) / 1000; // displacement + + var s = options.speed * dt; + + if (s >= 1) { + var scrollBy = { + x: autoScroll.x * s, + y: autoScroll.y * s + }; + + if (scrollBy.x || scrollBy.y) { + var prevScroll = getScroll(container); + + if (__is_7.window(container)) { + container.scrollBy(scrollBy.x, scrollBy.y); + } else if (container) { + container.scrollLeft += scrollBy.x; + container.scrollTop += scrollBy.y; + } + + var curScroll = getScroll(container); + var delta = { + x: curScroll.x - prevScroll.x, + y: curScroll.y - prevScroll.y + }; + + if (delta.x || delta.y) { + interactable.fire({ + type: 'autoscroll', + target: element, + interactable: interactable, + delta: delta, + interaction: interaction, + container: container + }); + } + } + + autoScroll.prevTime = now; + } + + if (autoScroll.isScrolling) { + ___raf_7["default"].cancel(autoScroll.i); + + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + } + }, + check: function check(interactable, actionName) { + var options = interactable.options; + return options[actionName].autoScroll && options[actionName].autoScroll.enabled; + }, + onInteractionMove: function onInteractionMove(_ref) { + var interaction = _ref.interaction, + pointer = _ref.pointer; + + if (!(interaction.interacting() && autoScroll.check(interaction.interactable, interaction.prepared.name))) { + return; + } + + if (interaction.simulation) { + autoScroll.x = autoScroll.y = 0; + return; + } + + var top; + var right; + var bottom; + var left; + var interactable = interaction.interactable, + element = interaction.element; + var actionName = interaction.prepared.name; + var options = interactable.options[actionName].autoScroll; + var container = getContainer(options.container, interactable, element); + + if (__is_7.window(container)) { + left = pointer.clientX < autoScroll.margin; + top = pointer.clientY < autoScroll.margin; + right = pointer.clientX > container.innerWidth - autoScroll.margin; + bottom = pointer.clientY > container.innerHeight - autoScroll.margin; + } else { + var rect = __domUtils_7.getElementClientRect(container); + left = pointer.clientX < rect.left + autoScroll.margin; + top = pointer.clientY < rect.top + autoScroll.margin; + right = pointer.clientX > rect.right - autoScroll.margin; + bottom = pointer.clientY > rect.bottom - autoScroll.margin; + } + + autoScroll.x = right ? 1 : left ? -1 : 0; + autoScroll.y = bottom ? 1 : top ? -1 : 0; + + if (!autoScroll.isScrolling) { + // set the autoScroll properties to those of the target + autoScroll.margin = options.margin; + autoScroll.speed = options.speed; + autoScroll.start(interaction); + } + } +}; + +function getContainer(value, interactable, element) { + return (__is_7.string(value) ? (0, _$rect_65.getStringOptionResult)(value, interactable, element) : value) || (0, _$window_68.getWindow)(element); +} + +function getScroll(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollLeft, + y: container.scrollTop + }; +} + +function getScrollSize(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollWidth, + y: container.scrollHeight + }; +} + +function getScrollSizeDelta(_ref2, func) { + var interaction = _ref2.interaction, + element = _ref2.element; + var scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll; + + if (!scrollOptions || !scrollOptions.enabled) { + func(); + return { + x: 0, + y: 0 + }; + } + + var scrollContainer = getContainer(scrollOptions.container, interaction.interactable, element); + var prevSize = getScroll(scrollContainer); + func(); + var curSize = getScroll(scrollContainer); + return { + x: curSize.x - prevSize.x, + y: curSize.y - prevSize.y + }; +} + +var autoScrollPlugin = { + id: 'auto-scroll', + install: __install_7, + listeners: { + 'interactions:new': function interactionsNew(_ref3) { + var interaction = _ref3.interaction; + interaction.autoScroll = null; + }, + 'interactions:destroy': function interactionsDestroy(_ref4) { + var interaction = _ref4.interaction; + interaction.autoScroll = null; + autoScroll.stop(); + + if (autoScroll.interaction) { + autoScroll.interaction = null; + } + }, + 'interactions:stop': autoScroll.stop, + 'interactions:action-move': function interactionsActionMove(arg) { + return autoScroll.onInteractionMove(arg); + } + } +}; +var ___default_7 = autoScrollPlugin; +_$index_7["default"] = ___default_7; + +var _$InteractableMethods_8 = {}; +"use strict"; + +function ___typeof_8(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_8 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_8 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_8(obj); } + +Object.defineProperty(_$InteractableMethods_8, "__esModule", { + value: true +}); +_$InteractableMethods_8["default"] = void 0; + +/* removed: var _$index_58 = require("@interactjs/utils/index"); */; + +var __is_8 = ___interopRequireWildcard_8(_$is_59); + +function ___getRequireWildcardCache_8() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_8 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_8(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_8(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_8(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_8(scope) { + var Interactable = scope.Interactable; + + Interactable.prototype.getAction = function getAction(pointer, event, interaction, element) { + var action = defaultActionChecker(this, event, interaction, element, scope); + + if (this.options.actionChecker) { + return this.options.actionChecker(pointer, event, action, this, element, interaction); + } + + return action; + }; + /** + * ```js + * interact(element, { ignoreFrom: document.getElementById('no-action') }) + * // or + * interact(element).ignoreFrom('input, textarea, a') + * ``` + * @deprecated + * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any + * of it's parents match the given CSS selector or Element, no + * drag/resize/gesture is started. + * + * Don't use this method. Instead set the `ignoreFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .draggable({ + * ignoreFrom: 'input, textarea, a[href]'', + * }) + * .pointerEvents({ + * ignoreFrom: '[no-pointer]', + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to not ignore any elements + * @return {string | Element | object} The current ignoreFrom value or this + * Interactable + */ + + + Interactable.prototype.ignoreFrom = (0, _$index_58.warnOnce)(function (newValue) { + return this._backCompatOption('ignoreFrom', newValue); + }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).'); + /** + * @deprecated + * + * A drag/resize/gesture is started only If the target of the `mousedown`, + * `pointerdown` or `touchstart` event or any of it's parents match the given + * CSS selector or Element. + * + * Don't use this method. Instead set the `allowFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .resizable({ + * allowFrom: '.resize-handle', + * .pointerEvents({ + * allowFrom: '.handle',, + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to allow from any element + * @return {string | Element | object} The current allowFrom value or this + * Interactable + */ + + Interactable.prototype.allowFrom = (0, _$index_58.warnOnce)(function (newValue) { + return this._backCompatOption('allowFrom', newValue); + }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).'); + /** + * ```js + * interact('.resize-drag') + * .resizable(true) + * .draggable(true) + * .actionChecker(function (pointer, event, action, interactable, element, interaction) { + * + * if (interact.matchesSelector(event.target, '.drag-handle')) { + * // force drag with handle target + * action.name = drag + * } + * else { + * // resize from the top and right edges + * action.name = 'resize' + * action.edges = { top: true, right: true } + * } + * + * return action + * }) + * ``` + * + * Returns or sets the function used to check action to be performed on + * pointerDown + * + * @param {function | null} [checker] A function which takes a pointer event, + * defaultAction string, interactable, element and interaction as parameters + * and returns an object with name property 'drag' 'resize' or 'gesture' and + * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right + * props. + * @return {Function | Interactable} The checker function or this Interactable + */ + + Interactable.prototype.actionChecker = actionChecker; + /** + * Returns or sets whether the the cursor should be changed depending on the + * action that would be performed if the mouse were pressed and dragged. + * + * @param {boolean} [newValue] + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.styleCursor = styleCursor; +} + +function defaultActionChecker(interactable, event, interaction, element, scope) { + var rect = interactable.getRect(element); + var buttons = event.buttons || { + 0: 1, + 1: 4, + 3: 8, + 4: 16 + }[event.button]; + var arg = { + action: null, + interactable: interactable, + interaction: interaction, + element: element, + rect: rect, + buttons: buttons + }; + scope.fire('auto-start:check', arg); + return arg.action; +} + +function styleCursor(newValue) { + if (__is_8.bool(newValue)) { + this.options.styleCursor = newValue; + return this; + } + + if (newValue === null) { + delete this.options.styleCursor; + return this; + } + + return this.options.styleCursor; +} + +function actionChecker(checker) { + if (__is_8.func(checker)) { + this.options.actionChecker = checker; + return this; + } + + if (checker === null) { + delete this.options.actionChecker; + return this; + } + + return this.options.actionChecker; +} + +var ___default_8 = { + id: 'auto-start/interactableMethods', + install: __install_8 +}; +_$InteractableMethods_8["default"] = ___default_8; + +var _$base_9 = {}; +"use strict"; + +function ___typeof_9(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_9 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_9 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_9(obj); } + +Object.defineProperty(_$base_9, "__esModule", { + value: true +}); +_$base_9["default"] = void 0; + +var __utils_9 = ___interopRequireWildcard_9(_$index_58); + +var _InteractableMethods = ___interopRequireDefault_9(_$InteractableMethods_8); + +function ___interopRequireDefault_9(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_9() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_9 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_9(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_9(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_9(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __install_9(scope) { + var interact = scope.interact, + defaults = scope.defaults; + scope.usePlugin(_InteractableMethods["default"]); + defaults.base.actionChecker = null; + defaults.base.styleCursor = true; + __utils_9.extend(defaults.perAction, { + manualStart: false, + max: Infinity, + maxPerElement: 1, + allowFrom: null, + ignoreFrom: null, + // only allow left button by default + // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value + mouseButtons: 1 + }); + /** + * Returns or sets the maximum number of concurrent interactions allowed. By + * default only 1 interaction is allowed at a time (for backwards + * compatibility). To allow multiple interactions on the same Interactables and + * elements, you need to enable it in the draggable, resizable and gesturable + * `'max'` and `'maxPerElement'` options. + * + * @alias module:interact.maxInteractions + * + * @param {number} [newValue] Any number. newValue <= 0 means no interactions. + */ + + interact.maxInteractions = function (newValue) { + return maxInteractions(newValue, scope); + }; + + scope.autoStart = { + // Allow this many interactions to happen simultaneously + maxInteractions: Infinity, + withinInteractionLimit: withinInteractionLimit, + cursorElement: null + }; +} + +function prepareOnDown(_ref, scope) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; + + if (interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function prepareOnMove(_ref2, scope) { + var interaction = _ref2.interaction, + pointer = _ref2.pointer, + event = _ref2.event, + eventTarget = _ref2.eventTarget; + + if (interaction.pointerType !== 'mouse' || interaction.pointerIsDown || interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); +} + +function startOnMove(arg, scope) { + var interaction = arg.interaction; + + if (!interaction.pointerIsDown || interaction.interacting() || !interaction.pointerWasMoved || !interaction.prepared.name) { + return; + } + + scope.fire('autoStart:before-start', arg); + var interactable = interaction.interactable; + var actionName = interaction.prepared.name; + + if (actionName && interactable) { + // check manualStart and interaction limit + if (interactable.options[actionName].manualStart || !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) { + interaction.stop(); + } else { + interaction.start(interaction.prepared, interactable, interaction.element); + setInteractionCursor(interaction, scope); + } + } +} + +function clearCursorOnStop(_ref3, scope) { + var interaction = _ref3.interaction; + var interactable = interaction.interactable; + + if (interactable && interactable.options.styleCursor) { + setCursor(interaction.element, '', scope); + } +} // Check if the current interactable supports the action. +// If so, return the validated action. Otherwise, return null + + +function validateAction(action, interactable, element, eventTarget, scope) { + if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) && interactable.options[action.name].enabled && withinInteractionLimit(interactable, element, action, scope)) { + return action; + } + + return null; +} + +function validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope) { + for (var i = 0, len = matches.length; i < len; i++) { + var match = matches[i]; + var matchElement = matchElements[i]; + var matchAction = match.getAction(pointer, event, interaction, matchElement); + + if (!matchAction) { + continue; + } + + var action = validateAction(matchAction, match, matchElement, eventTarget, scope); + + if (action) { + return { + action: action, + interactable: match, + element: matchElement + }; + } + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function getActionInfo(interaction, pointer, event, eventTarget, scope) { + var matches = []; + var matchElements = []; + var element = eventTarget; + + function pushMatches(interactable) { + matches.push(interactable); + matchElements.push(element); + } + + while (__utils_9.is.element(element)) { + matches = []; + matchElements = []; + scope.interactables.forEachMatch(element, pushMatches); + var actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope); + + if (actionInfo.action && !actionInfo.interactable.options[actionInfo.action.name].manualStart) { + return actionInfo; + } + + element = __utils_9.dom.parentNode(element); + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function prepare(interaction, _ref4, scope) { + var action = _ref4.action, + interactable = _ref4.interactable, + element = _ref4.element; + action = action || { + name: null + }; + interaction.interactable = interactable; + interaction.element = element; + __utils_9.copyAction(interaction.prepared, action); + interaction.rect = interactable && action.name ? interactable.getRect(element) : null; + setInteractionCursor(interaction, scope); + scope.fire('autoStart:prepared', { + interaction: interaction + }); +} + +function withinInteractionLimit(interactable, element, action, scope) { + var options = interactable.options; + var maxActions = options[action.name].max; + var maxPerElement = options[action.name].maxPerElement; + var autoStartMax = scope.autoStart.maxInteractions; + var activeInteractions = 0; + var interactableCount = 0; + var elementCount = 0; // no actions if any of these values == 0 + + if (!(maxActions && maxPerElement && autoStartMax)) { + return false; + } + + for (var _i = 0; _i < scope.interactions.list.length; _i++) { + var _ref5; + + _ref5 = scope.interactions.list[_i]; + var interaction = _ref5; + var otherAction = interaction.prepared.name; + + if (!interaction.interacting()) { + continue; + } + + activeInteractions++; + + if (activeInteractions >= autoStartMax) { + return false; + } + + if (interaction.interactable !== interactable) { + continue; + } + + interactableCount += otherAction === action.name ? 1 : 0; + + if (interactableCount >= maxActions) { + return false; + } + + if (interaction.element === element) { + elementCount++; + + if (otherAction === action.name && elementCount >= maxPerElement) { + return false; + } + } + } + + return autoStartMax > 0; +} + +function maxInteractions(newValue, scope) { + if (__utils_9.is.number(newValue)) { + scope.autoStart.maxInteractions = newValue; + return this; + } + + return scope.autoStart.maxInteractions; +} + +function setCursor(element, cursor, scope) { + var prevCursorElement = scope.autoStart.cursorElement; + + if (prevCursorElement && prevCursorElement !== element) { + prevCursorElement.style.cursor = ''; + } + + element.ownerDocument.documentElement.style.cursor = cursor; + element.style.cursor = cursor; + scope.autoStart.cursorElement = cursor ? element : null; +} + +function setInteractionCursor(interaction, scope) { + var interactable = interaction.interactable, + element = interaction.element, + prepared = interaction.prepared; + + if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) { + // clear previous target element cursor + if (scope.autoStart.cursorElement) { + setCursor(scope.autoStart.cursorElement, '', scope); + } + + return; + } + + var cursor = ''; + + if (prepared.name) { + var cursorChecker = interactable.options[prepared.name].cursorChecker; + + if (__utils_9.is.func(cursorChecker)) { + cursor = cursorChecker(prepared, interactable, element, interaction._interacting); + } else { + cursor = scope.actions.map[prepared.name].getCursor(prepared); + } + } + + setCursor(interaction.element, cursor || '', scope); +} + +var autoStart = { + id: 'auto-start/base', + before: ['actions', 'actions/drag', 'actions/resize', 'actions/gesture'], + install: __install_9, + listeners: { + 'interactions:down': prepareOnDown, + 'interactions:move': function interactionsMove(arg, scope) { + prepareOnMove(arg, scope); + startOnMove(arg, scope); + }, + 'interactions:stop': clearCursorOnStop + }, + maxInteractions: maxInteractions, + withinInteractionLimit: withinInteractionLimit, + validateAction: validateAction +}; +var ___default_9 = autoStart; +_$base_9["default"] = ___default_9; + +var _$dragAxis_10 = {}; +"use strict"; + +function ___typeof_10(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_10 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_10 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_10(obj); } + +Object.defineProperty(_$dragAxis_10, "__esModule", { + value: true +}); +_$dragAxis_10["default"] = void 0; + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var __is_10 = ___interopRequireWildcard_10(_$is_59); + +var _base = ___interopRequireDefault_10(_$base_9); + +function ___interopRequireDefault_10(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_10() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_10 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_10(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_10(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_10(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function beforeStart(_ref, scope) { + var interaction = _ref.interaction, + eventTarget = _ref.eventTarget, + dx = _ref.dx, + dy = _ref.dy; + + if (interaction.prepared.name !== 'drag') { + return; + } // check if a drag is in the correct axis + + + var absX = Math.abs(dx); + var absY = Math.abs(dy); + var targetOptions = interaction.interactable.options.drag; + var startAxis = targetOptions.startAxis; + var currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy'; + interaction.prepared.axis = targetOptions.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy' + : targetOptions.lockAxis; // if the movement isn't in the startAxis of the interactable + + if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) { + // cancel the prepared action + interaction.prepared.name = null; // then try to get a drag from another ineractable + + var element = eventTarget; + + var getDraggable = function getDraggable(interactable) { + if (interactable === interaction.interactable) { + return; + } + + var options = interaction.interactable.options.drag; + + if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) { + var action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element); + + if (action && action.name === 'drag' && checkStartAxis(currentAxis, interactable) && _base["default"].validateAction(action, interactable, element, eventTarget, scope)) { + return interactable; + } + } + }; // check all interactables + + + while (__is_10.element(element)) { + var interactable = scope.interactables.forEachMatch(element, getDraggable); + + if (interactable) { + interaction.prepared.name = 'drag'; + interaction.interactable = interactable; + interaction.element = element; + break; + } + + element = (0, _$domUtils_53.parentNode)(element); + } + } +} + +function checkStartAxis(startAxis, interactable) { + if (!interactable) { + return false; + } + + var thisAxis = interactable.options.drag.startAxis; + return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis; +} + +var ___default_10 = { + id: 'auto-start/dragAxis', + listeners: { + 'autoStart:before-start': beforeStart + } +}; +_$dragAxis_10["default"] = ___default_10; + +var _$hold_11 = {}; +"use strict"; + +Object.defineProperty(_$hold_11, "__esModule", { + value: true +}); +_$hold_11["default"] = void 0; + +var ___base_11 = ___interopRequireDefault_11(_$base_9); + +function ___interopRequireDefault_11(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_11(scope) { + var defaults = scope.defaults; + scope.usePlugin(___base_11["default"]); + defaults.perAction.hold = 0; + defaults.perAction.delay = 0; +} + +function getHoldDuration(interaction) { + var actionName = interaction.prepared && interaction.prepared.name; + + if (!actionName) { + return null; + } + + var options = interaction.interactable.options; + return options[actionName].hold || options[actionName].delay; +} + +var ___default_11 = { + id: 'auto-start/hold', + install: __install_11, + listeners: { + 'interactions:new': function interactionsNew(_ref) { + var interaction = _ref.interaction; + interaction.autoStartHoldTimer = null; + }, + 'autoStart:prepared': function autoStartPrepared(_ref2) { + var interaction = _ref2.interaction; + var hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.autoStartHoldTimer = setTimeout(function () { + interaction.start(interaction.prepared, interaction.interactable, interaction.element); + }, hold); + } + }, + 'interactions:move': function interactionsMove(_ref3) { + var interaction = _ref3.interaction, + duplicate = _ref3.duplicate; + + if (interaction.pointerWasMoved && !duplicate) { + clearTimeout(interaction.autoStartHoldTimer); + } + }, + // prevent regular down->move autoStart + 'autoStart:before-start': function autoStartBeforeStart(_ref4) { + var interaction = _ref4.interaction; + var hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.prepared.name = null; + } + } + }, + getHoldDuration: getHoldDuration +}; +_$hold_11["default"] = ___default_11; + +var _$index_12 = {}; +"use strict"; + +Object.defineProperty(_$index_12, "__esModule", { + value: true +}); +Object.defineProperty(_$index_12, "autoStart", { + enumerable: true, + get: function get() { + return ___base_12["default"]; + } +}); +Object.defineProperty(_$index_12, "dragAxis", { + enumerable: true, + get: function get() { + return _dragAxis["default"]; + } +}); +Object.defineProperty(_$index_12, "hold", { + enumerable: true, + get: function get() { + return _hold["default"]; + } +}); +_$index_12["default"] = void 0; + +var ___base_12 = ___interopRequireDefault_12(_$base_9); + +var _dragAxis = ___interopRequireDefault_12(_$dragAxis_10); + +var _hold = ___interopRequireDefault_12(_$hold_11); + +function ___interopRequireDefault_12(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var ___default_12 = { + id: 'auto-start', + install: function install(scope) { + scope.usePlugin(___base_12["default"]); + scope.usePlugin(_hold["default"]); + scope.usePlugin(_dragAxis["default"]); + } +}; +_$index_12["default"] = ___default_12; + +var _$index_25 = {}; +"use strict"; + +function ___typeof_25(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_25 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_25 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_25(obj); } + +Object.defineProperty(_$index_25, "__esModule", { + value: true +}); +_$index_25["default"] = void 0; + +var ___domObjects_25 = ___interopRequireDefault_25(_$domObjects_52); + +/* removed: var _$domUtils_53 = require("@interactjs/utils/domUtils"); */; + +var ___extend_25 = ___interopRequireDefault_25(_$extend_55); + +var __is_25 = ___interopRequireWildcard_25(_$is_59); + +var ___window_25 = ___interopRequireDefault_25(_$window_68); + +function ___getRequireWildcardCache_25() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_25 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_25(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_25(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_25(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_25(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___toConsumableArray_25(arr) { return ___arrayWithoutHoles_25(arr) || ___iterableToArray_25(arr) || ___nonIterableSpread_25(); } + +function ___nonIterableSpread_25() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function ___iterableToArray_25(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function ___arrayWithoutHoles_25(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +var CheckName; + +(function (CheckName) { + CheckName["touchAction"] = "touchAction"; + CheckName["boxSizing"] = "boxSizing"; + CheckName["noListeners"] = "noListeners"; +})(CheckName || (CheckName = {})); + +var prefix = '[interact.js] '; +var links = { + touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action', + boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing' +}; +var isProduction = "production" === 'production'; // eslint-disable-next-line no-restricted-syntax + +function __install_25(scope) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + logger = _ref.logger; + + var Interactable = scope.Interactable, + defaults = scope.defaults; + scope.logger = logger || console; + defaults.base.devTools = { + ignore: {} + }; + + Interactable.prototype.devTools = function (options) { + if (options) { + (0, ___extend_25["default"])(this.options.devTools, options); + return this; + } + + return this.options.devTools; + }; +} + +var checks = [{ + name: CheckName.touchAction, + perform: function perform(_ref2) { + var element = _ref2.element; + return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/); + }, + getInfo: function getInfo(_ref3) { + var element = _ref3.element; + return [element, links.touchAction]; + }, + text: 'Consider adding CSS "touch-action: none" to this element\n' +}, { + name: CheckName.boxSizing, + perform: function perform(interaction) { + var element = interaction.element; + return interaction.prepared.name === 'resize' && element instanceof ___domObjects_25["default"].HTMLElement && !hasStyle(element, 'boxSizing', /border-box/); + }, + text: 'Consider adding CSS "box-sizing: border-box" to this resizable element', + getInfo: function getInfo(_ref4) { + var element = _ref4.element; + return [element, links.boxSizing]; + } +}, { + name: CheckName.noListeners, + perform: function perform(interaction) { + var actionName = interaction.prepared.name; + var moveListeners = interaction.interactable.events.types["".concat(actionName, "move")] || []; + return !moveListeners.length; + }, + getInfo: function getInfo(interaction) { + return [interaction.prepared.name, interaction.interactable]; + }, + text: 'There are no listeners set for this action' +}]; + +function hasStyle(element, prop, styleRe) { + return styleRe.test(element.style[prop] || ___window_25["default"].window.getComputedStyle(element)[prop]); +} + +function parentHasStyle(element, prop, styleRe) { + var parent = element; + + while (__is_25.element(parent)) { + if (hasStyle(parent, prop, styleRe)) { + return true; + } + + parent = (0, _$domUtils_53.parentNode)(parent); + } + + return false; +} + +var id = 'dev-tools'; +var defaultExport = isProduction ? { + id: id, + install: function install() {} +} : { + id: id, + install: __install_25, + listeners: { + 'interactions:action-start': function interactionsActionStart(_ref5, scope) { + var interaction = _ref5.interaction; + + for (var _i = 0; _i < checks.length; _i++) { + var _ref6; + + _ref6 = checks[_i]; + var check = _ref6; + var options = interaction.interactable && interaction.interactable.options; + + if (!(options && options.devTools && options.devTools.ignore[check.name]) && check.perform(interaction)) { + var _scope$logger; + + (_scope$logger = scope.logger).warn.apply(_scope$logger, [prefix + check.text].concat(___toConsumableArray_25(check.getInfo(interaction)))); + } + } + } + }, + checks: checks, + CheckName: CheckName, + links: links, + prefix: prefix +}; +var ___default_25 = defaultExport; +_$index_25["default"] = ___default_25; + +var _$Modification_29 = {}; +"use strict"; + +function ___typeof_29(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_29 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_29 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_29(obj); } + +Object.defineProperty(_$Modification_29, "__esModule", { + value: true +}); +_$Modification_29.getRectOffset = getRectOffset; +_$Modification_29["default"] = void 0; + +var ___clone_29 = ___interopRequireDefault_29(_$clone_51); + +var ___extend_29 = ___interopRequireDefault_29(_$extend_55); + +var rectUtils = ___interopRequireWildcard_29(_$rect_65); + +function ___getRequireWildcardCache_29() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_29 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_29(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_29(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_29(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_29(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_29(arr, i) { return ___arrayWithHoles_29(arr) || ___iterableToArrayLimit_29(arr, i) || ___nonIterableRest_29(); } + +function ___nonIterableRest_29() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_29(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_29(arr) { if (Array.isArray(arr)) return arr; } + +function ___classCallCheck_29(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_29(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_29(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_29(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_29(Constructor, staticProps); return Constructor; } + +function ___defineProperty_29(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Modification = /*#__PURE__*/function () { + function Modification(interaction) { + ___classCallCheck_29(this, Modification); + + this.interaction = interaction; + + ___defineProperty_29(this, "states", []); + + ___defineProperty_29(this, "startOffset", { + left: 0, + right: 0, + top: 0, + bottom: 0 + }); + + ___defineProperty_29(this, "startDelta", null); + + ___defineProperty_29(this, "result", null); + + ___defineProperty_29(this, "endResult", null); + + ___defineProperty_29(this, "edges", void 0); + + this.result = createResult(); + } + + ___createClass_29(Modification, [{ + key: "start", + value: function start(_ref, pageCoords) { + var phase = _ref.phase; + var interaction = this.interaction; + var modifierList = getModifierList(interaction); + this.prepareStates(modifierList); + this.edges = (0, ___extend_29["default"])({}, interaction.edges); + this.startOffset = getRectOffset(interaction.rect, pageCoords); + this.startDelta = { + x: 0, + y: 0 + }; + var arg = { + phase: phase, + pageCoords: pageCoords, + preEnd: false + }; + this.result = createResult(); + this.startAll(arg); + var result = this.result = this.setAll(arg); + return result; + } + }, { + key: "fillArg", + value: function fillArg(arg) { + var interaction = this.interaction; + arg.interaction = interaction; + arg.interactable = interaction.interactable; + arg.element = interaction.element; + arg.rect = arg.rect || interaction.rect; + arg.edges = this.edges; + arg.startOffset = this.startOffset; + } + }, { + key: "startAll", + value: function startAll(arg) { + this.fillArg(arg); + + for (var _i = 0; _i < this.states.length; _i++) { + var _ref2; + + _ref2 = this.states[_i]; + var state = _ref2; + + if (state.methods.start) { + arg.state = state; + state.methods.start(arg); + } + } + } + }, { + key: "setAll", + value: function setAll(arg) { + this.fillArg(arg); + var phase = arg.phase, + preEnd = arg.preEnd, + skipModifiers = arg.skipModifiers, + unmodifiedRect = arg.rect; + arg.coords = (0, ___extend_29["default"])({}, arg.pageCoords); + arg.rect = (0, ___extend_29["default"])({}, unmodifiedRect); + var states = skipModifiers ? this.states.slice(skipModifiers) : this.states; + var newResult = createResult(arg.coords, arg.rect); + + for (var _i2 = 0; _i2 < states.length; _i2++) { + var _ref3; + + _ref3 = states[_i2]; + var state = _ref3; + var options = state.options; + var lastModifierCoords = (0, ___extend_29["default"])({}, arg.coords); + var returnValue = null; + + if (state.methods.set && this.shouldDo(options, preEnd, phase)) { + arg.state = state; + returnValue = state.methods.set(arg); + rectUtils.addEdges(this.interaction.edges, arg.rect, { + x: arg.coords.x - lastModifierCoords.x, + y: arg.coords.y - lastModifierCoords.y + }); + } + + newResult.eventProps.push(returnValue); + } + + newResult.delta.x = arg.coords.x - arg.pageCoords.x; + newResult.delta.y = arg.coords.y - arg.pageCoords.y; + newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left; + newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right; + newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top; + newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom; + var prevCoords = this.result.coords; + var prevRect = this.result.rect; + + if (prevCoords && prevRect) { + var rectChanged = newResult.rect.left !== prevRect.left || newResult.rect.right !== prevRect.right || newResult.rect.top !== prevRect.top || newResult.rect.bottom !== prevRect.bottom; + newResult.changed = rectChanged || prevCoords.x !== newResult.coords.x || prevCoords.y !== newResult.coords.y; + } + + return newResult; + } + }, { + key: "applyToInteraction", + value: function applyToInteraction(arg) { + var interaction = this.interaction; + var phase = arg.phase; + var curCoords = interaction.coords.cur; + var startCoords = interaction.coords.start; + var result = this.result, + startDelta = this.startDelta; + var curDelta = result.delta; + + if (phase === 'start') { + (0, ___extend_29["default"])(this.startDelta, result.delta); + } + + for (var _i3 = 0; _i3 < [[startCoords, startDelta], [curCoords, curDelta]].length; _i3++) { + var _ref4; + + _ref4 = [[startCoords, startDelta], [curCoords, curDelta]][_i3]; + + var _ref5 = _ref4, + _ref6 = ___slicedToArray_29(_ref5, 2), + coordsSet = _ref6[0], + delta = _ref6[1]; + + coordsSet.page.x += delta.x; + coordsSet.page.y += delta.y; + coordsSet.client.x += delta.x; + coordsSet.client.y += delta.y; + } + + var rectDelta = this.result.rectDelta; + var rect = arg.rect || interaction.rect; + rect.left += rectDelta.left; + rect.right += rectDelta.right; + rect.top += rectDelta.top; + rect.bottom += rectDelta.bottom; + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } + }, { + key: "setAndApply", + value: function setAndApply(arg) { + var interaction = this.interaction; + var phase = arg.phase, + preEnd = arg.preEnd, + skipModifiers = arg.skipModifiers; + var result = this.setAll({ + preEnd: preEnd, + phase: phase, + pageCoords: arg.modifiedCoords || interaction.coords.cur.page + }); + this.result = result; // don't fire an action move if a modifier would keep the event in the same + // cordinates as before + + if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) { + return false; + } + + if (arg.modifiedCoords) { + var page = interaction.coords.cur.page; + var adjustment = { + x: arg.modifiedCoords.x - page.x, + y: arg.modifiedCoords.y - page.y + }; + result.coords.x += adjustment.x; + result.coords.y += adjustment.y; + result.delta.x += adjustment.x; + result.delta.y += adjustment.y; + } + + this.applyToInteraction(arg); + } + }, { + key: "beforeEnd", + value: function beforeEnd(arg) { + var interaction = arg.interaction, + event = arg.event; + var states = this.states; + + if (!states || !states.length) { + return; + } + + var doPreend = false; + + for (var _i4 = 0; _i4 < states.length; _i4++) { + var _ref7; + + _ref7 = states[_i4]; + var state = _ref7; + arg.state = state; + var options = state.options, + methods = state.methods; + var endPosition = methods.beforeEnd && methods.beforeEnd(arg); + + if (endPosition) { + this.endResult = endPosition; + return false; + } + + doPreend = doPreend || !doPreend && this.shouldDo(options, true, arg.phase, true); + } + + if (doPreend) { + // trigger a final modified move before ending + interaction.move({ + event: event, + preEnd: true + }); + } + } + }, { + key: "stop", + value: function stop(arg) { + var interaction = arg.interaction; + + if (!this.states || !this.states.length) { + return; + } + + var modifierArg = (0, ___extend_29["default"])({ + states: this.states, + interactable: interaction.interactable, + element: interaction.element, + rect: null + }, arg); + this.fillArg(modifierArg); + + for (var _i5 = 0; _i5 < this.states.length; _i5++) { + var _ref8; + + _ref8 = this.states[_i5]; + var state = _ref8; + modifierArg.state = state; + + if (state.methods.stop) { + state.methods.stop(modifierArg); + } + } + + this.states = null; + this.endResult = null; + } + }, { + key: "prepareStates", + value: function prepareStates(modifierList) { + this.states = []; + + for (var index = 0; index < modifierList.length; index++) { + var _modifierList$index = modifierList[index], + options = _modifierList$index.options, + methods = _modifierList$index.methods, + name = _modifierList$index.name; + + if (options && options.enabled === false) { + continue; + } + + this.states.push({ + options: options, + methods: methods, + index: index, + name: name + }); + } + + return this.states; + } + }, { + key: "restoreInteractionCoords", + value: function restoreInteractionCoords(_ref9) { + var _ref9$interaction = _ref9.interaction, + coords = _ref9$interaction.coords, + rect = _ref9$interaction.rect, + modification = _ref9$interaction.modification; + + if (!modification.result) { + return; + } + + var startDelta = modification.startDelta; + var _modification$result = modification.result, + curDelta = _modification$result.delta, + rectDelta = _modification$result.rectDelta; + var coordsAndDeltas = [[coords.start, startDelta], [coords.cur, curDelta]]; + + for (var _i6 = 0; _i6 < coordsAndDeltas.length; _i6++) { + var _ref10; + + _ref10 = coordsAndDeltas[_i6]; + + var _ref11 = _ref10, + _ref12 = ___slicedToArray_29(_ref11, 2), + coordsSet = _ref12[0], + delta = _ref12[1]; + + coordsSet.page.x -= delta.x; + coordsSet.page.y -= delta.y; + coordsSet.client.x -= delta.x; + coordsSet.client.y -= delta.y; + } + + rect.left -= rectDelta.left; + rect.right -= rectDelta.right; + rect.top -= rectDelta.top; + rect.bottom -= rectDelta.bottom; + } + }, { + key: "shouldDo", + value: function shouldDo(options, preEnd, phase, requireEndOnly) { + if ( // ignore disabled modifiers + !options || options.enabled === false || // check if we require endOnly option to fire move before end + requireEndOnly && !options.endOnly || // don't apply endOnly modifiers when not ending + options.endOnly && !preEnd || // check if modifier should run be applied on start + phase === 'start' && !options.setStart) { + return false; + } + + return true; + } + }, { + key: "copyFrom", + value: function copyFrom(other) { + this.startOffset = other.startOffset; + this.startDelta = other.startDelta; + this.edges = other.edges; + this.states = other.states.map(function (s) { + return (0, ___clone_29["default"])(s); + }); + this.result = createResult((0, ___extend_29["default"])({}, other.result.coords), (0, ___extend_29["default"])({}, other.result.rect)); + } + }, { + key: "destroy", + value: function destroy() { + for (var prop in this) { + this[prop] = null; + } + } + }]); + + return Modification; +}(); + +_$Modification_29["default"] = Modification; + +function createResult(coords, rect) { + return { + rect: rect, + coords: coords, + delta: { + x: 0, + y: 0 + }, + rectDelta: { + left: 0, + right: 0, + top: 0, + bottom: 0 + }, + eventProps: [], + changed: true + }; +} + +function getModifierList(interaction) { + var actionOptions = interaction.interactable.options[interaction.prepared.name]; + var actionModifiers = actionOptions.modifiers; + + if (actionModifiers && actionModifiers.length) { + return actionModifiers.filter(function (modifier) { + return !modifier.options || modifier.options.enabled !== false; + }); + } + + return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize'].map(function (type) { + var options = actionOptions[type]; + return options && options.enabled && { + options: options, + methods: options._methods + }; + }).filter(function (m) { + return !!m; + }); +} + +function getRectOffset(rect, coords) { + return rect ? { + left: coords.x - rect.left, + top: coords.y - rect.top, + right: rect.right - coords.x, + bottom: rect.bottom - coords.y + } : { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; +} + +var _$base_32 = {}; +"use strict"; + +Object.defineProperty(_$base_32, "__esModule", { + value: true +}); +_$base_32.makeModifier = makeModifier; +_$base_32.addEventModifiers = addEventModifiers; +_$base_32["default"] = void 0; + +var _Modification = ___interopRequireDefault_32(_$Modification_29); + +function ___interopRequireDefault_32(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function makeModifier(module, name) { + var defaults = module.defaults; + var methods = { + start: module.start, + set: module.set, + beforeEnd: module.beforeEnd, + stop: module.stop + }; + + var modifier = function modifier(_options) { + var options = _options || {}; + options.enabled = options.enabled !== false; // add missing defaults to options + + for (var _prop in defaults) { + if (!(_prop in options)) { + options[_prop] = defaults[_prop]; + } + } + + var m = { + options: options, + methods: methods, + name: name + }; + return m; + }; + + if (name && typeof name === 'string') { + // for backwrads compatibility + modifier._defaults = defaults; + modifier._methods = methods; + } + + return modifier; +} + +function addEventModifiers(_ref) { + var iEvent = _ref.iEvent, + result = _ref.interaction.modification.result; + + if (result) { + iEvent.modifiers = result.eventProps; + } +} + +var modifiersBase = { + id: 'modifiers/base', + install: function install(scope) { + scope.defaults.perAction.modifiers = []; + }, + listeners: { + 'interactions:new': function interactionsNew(_ref2) { + var interaction = _ref2.interaction; + interaction.modification = new _Modification["default"](interaction); + }, + 'interactions:before-action-start': function interactionsBeforeActionStart(arg) { + var modification = arg.interaction.modification; + modification.start(arg, arg.interaction.coords.start.page); + arg.interaction.edges = modification.edges; + modification.applyToInteraction(arg); + }, + 'interactions:before-action-move': function interactionsBeforeActionMove(arg) { + return arg.interaction.modification.setAndApply(arg); + }, + 'interactions:before-action-end': function interactionsBeforeActionEnd(arg) { + return arg.interaction.modification.beforeEnd(arg); + }, + 'interactions:action-start': addEventModifiers, + 'interactions:action-move': addEventModifiers, + 'interactions:action-end': addEventModifiers, + 'interactions:after-action-start': function interactionsAfterActionStart(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:after-action-move': function interactionsAfterActionMove(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:stop': function interactionsStop(arg) { + return arg.interaction.modification.stop(arg); + } + }, + before: ['actions', 'action/drag', 'actions/resize', 'actions/gesture'] +}; +var ___default_32 = modifiersBase; +_$base_32["default"] = ___default_32; + +var _$index_41 = {}; +"use strict"; + +function ___typeof_41(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_41 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_41 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_41(obj); } + +Object.defineProperty(_$index_41, "__esModule", { + value: true +}); +_$index_41.addTotal = addTotal; +_$index_41.applyPending = applyPending; +_$index_41["default"] = void 0; + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +var __rectUtils_41 = ___interopRequireWildcard_41(_$rect_65); + +function ___getRequireWildcardCache_41() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_41 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_41(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_41(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_41(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +_$Interaction_18._ProxyMethods.offsetBy = ''; + +function addTotal(interaction) { + if (!interaction.pointerIsDown) { + return; + } + + addToCoords(interaction.coords.cur, interaction.offset.total); + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +function beforeAction(_ref) { + var interaction = _ref.interaction; + applyPending(interaction); +} + +function beforeEnd(_ref2) { + var interaction = _ref2.interaction; + var hadPending = applyPending(interaction); + + if (!hadPending) { + return; + } + + interaction.move({ + offset: true + }); + interaction.end(); + return false; +} + +function __end_41(_ref3) { + var interaction = _ref3.interaction; + interaction.offset.total.x = 0; + interaction.offset.total.y = 0; + interaction.offset.pending.x = 0; + interaction.offset.pending.y = 0; +} + +function applyPending(interaction) { + if (!hasPending(interaction)) { + return false; + } + + var pending = interaction.offset.pending; + addToCoords(interaction.coords.cur, pending); + addToCoords(interaction.coords.delta, pending); + __rectUtils_41.addEdges(interaction.edges, interaction.rect, pending); + pending.x = 0; + pending.y = 0; + return true; +} + +function offsetBy(_ref4) { + var x = _ref4.x, + y = _ref4.y; + this.offset.pending.x += x; + this.offset.pending.y += y; + this.offset.total.x += x; + this.offset.total.y += y; +} + +function addToCoords(_ref5, _ref6) { + var page = _ref5.page, + client = _ref5.client; + var x = _ref6.x, + y = _ref6.y; + page.x += x; + page.y += y; + client.x += x; + client.y += y; +} + +function hasPending(interaction) { + return !!(interaction.offset.pending.x || interaction.offset.pending.y); +} + +var offset = { + id: 'offset', + install: function install(scope) { + scope.Interaction.prototype.offsetBy = offsetBy; + }, + listeners: { + 'interactions:new': function interactionsNew(_ref7) { + var interaction = _ref7.interaction; + interaction.offset = { + total: { + x: 0, + y: 0 + }, + pending: { + x: 0, + y: 0 + } + }; + }, + 'interactions:update-pointer': function interactionsUpdatePointer(_ref8) { + var interaction = _ref8.interaction; + return addTotal(interaction); + }, + 'interactions:before-action-start': beforeAction, + 'interactions:before-action-move': beforeAction, + 'interactions:before-action-end': beforeEnd, + 'interactions:stop': __end_41 + } +}; +var ___default_41 = offset; +_$index_41["default"] = ___default_41; + +var _$index_26 = {}; +"use strict"; + +function ___typeof_26(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_26 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_26 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_26(obj); } + +Object.defineProperty(_$index_26, "__esModule", { + value: true +}); +_$index_26["default"] = _$index_26.InertiaState = void 0; + +var modifiers = ___interopRequireWildcard_26(_$base_32); + +var ___Modification_26 = ___interopRequireDefault_26(_$Modification_29); + +var ___index_26 = ___interopRequireDefault_26(_$index_41); + +var __dom_26 = ___interopRequireWildcard_26(_$domUtils_53); + +var ___hypot_26 = ___interopRequireDefault_26(_$hypot_57); + +var __is_26 = ___interopRequireWildcard_26(_$is_59); + +/* removed: var _$pointerUtils_63 = require("@interactjs/utils/pointerUtils"); */; + +var ___raf_26 = ___interopRequireDefault_26(_$raf_64); + +function ___interopRequireDefault_26(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_26() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_26 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_26(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_26(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_26(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___classCallCheck_26(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_26(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_26(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_26(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_26(Constructor, staticProps); return Constructor; } + +function ___defineProperty_26(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function __install_26(scope) { + var defaults = scope.defaults; + scope.usePlugin(___index_26["default"]); + scope.usePlugin(modifiers["default"]); + scope.actions.phases.inertiastart = true; + scope.actions.phases.resume = true; + defaults.perAction.inertia = { + enabled: false, + resistance: 10, + // the lambda in exponential decay + minSpeed: 100, + // target speed must be above this for inertia to start + endSpeed: 10, + // the speed at which inertia is slow enough to stop + allowResume: true, + // allow resuming an action in inertia phase + smoothEndDuration: 300 // animate to snap/restrict endOnly if there's no inertia + + }; +} + +var InertiaState = /*#__PURE__*/function () { + // eslint-disable-line camelcase + // eslint-disable-line camelcase + function InertiaState(interaction) { + ___classCallCheck_26(this, InertiaState); + + this.interaction = interaction; + + ___defineProperty_26(this, "active", false); + + ___defineProperty_26(this, "isModified", false); + + ___defineProperty_26(this, "smoothEnd", false); + + ___defineProperty_26(this, "allowResume", false); + + ___defineProperty_26(this, "modification", null); + + ___defineProperty_26(this, "modifierCount", 0); + + ___defineProperty_26(this, "modifierArg", null); + + ___defineProperty_26(this, "startCoords", null); + + ___defineProperty_26(this, "t0", 0); + + ___defineProperty_26(this, "v0", 0); + + ___defineProperty_26(this, "te", 0); + + ___defineProperty_26(this, "targetOffset", null); + + ___defineProperty_26(this, "modifiedOffset", null); + + ___defineProperty_26(this, "currentOffset", null); + + ___defineProperty_26(this, "lambda_v0", 0); + + ___defineProperty_26(this, "one_ve_v0", 0); + + ___defineProperty_26(this, "timeout", null); + } + + ___createClass_26(InertiaState, [{ + key: "start", + value: function start(event) { + var interaction = this.interaction; + var options = __getOptions_26(interaction); + + if (!options || !options.enabled) { + return false; + } + + var velocityClient = interaction.coords.velocity.client; + var pointerSpeed = (0, ___hypot_26["default"])(velocityClient.x, velocityClient.y); + var modification = this.modification || (this.modification = new ___Modification_26["default"](interaction)); + modification.copyFrom(interaction.modification); + this.t0 = interaction._now(); + this.allowResume = options.allowResume; + this.v0 = pointerSpeed; + this.currentOffset = { + x: 0, + y: 0 + }; + this.startCoords = interaction.coords.cur.page; + this.modifierArg = { + interaction: interaction, + interactable: interaction.interactable, + element: interaction.element, + rect: interaction.rect, + edges: interaction.edges, + pageCoords: this.startCoords, + preEnd: true, + phase: 'inertiastart' + }; + var thrown = this.t0 - interaction.coords.cur.timeStamp < 50 && pointerSpeed > options.minSpeed && pointerSpeed > options.endSpeed; + + if (thrown) { + this.startInertia(); + } else { + modification.result = modification.setAll(this.modifierArg); + + if (!modification.result.changed) { + return false; + } + + this.startSmoothEnd(); + } // force modification change + + + interaction.modification.result.rect = null; // bring inertiastart event to the target coords + + interaction.offsetBy(this.targetOffset); + + interaction._doPhase({ + interaction: interaction, + event: event, + phase: 'inertiastart' + }); + + interaction.offsetBy({ + x: -this.targetOffset.x, + y: -this.targetOffset.y + }); // force modification change + + interaction.modification.result.rect = null; + this.active = true; + interaction.simulation = this; + return true; + } + }, { + key: "startInertia", + value: function startInertia() { + var _this = this; + + var startVelocity = this.interaction.coords.velocity.client; + var options = __getOptions_26(this.interaction); + var lambda = options.resistance; + var inertiaDur = -Math.log(options.endSpeed / this.v0) / lambda; + this.targetOffset = { + x: (startVelocity.x - inertiaDur) / lambda, + y: (startVelocity.y - inertiaDur) / lambda + }; + this.te = inertiaDur; + this.lambda_v0 = lambda / this.v0; + this.one_ve_v0 = 1 - options.endSpeed / this.v0; + var modification = this.modification, + modifierArg = this.modifierArg; + modifierArg.pageCoords = { + x: this.startCoords.x + this.targetOffset.x, + y: this.startCoords.y + this.targetOffset.y + }; + modification.result = modification.setAll(modifierArg); + + if (modification.result.changed) { + this.isModified = true; + this.modifiedOffset = { + x: this.targetOffset.x + modification.result.delta.x, + y: this.targetOffset.y + modification.result.delta.y + }; + } + + this.timeout = ___raf_26["default"].request(function () { + return _this.inertiaTick(); + }); + } + }, { + key: "startSmoothEnd", + value: function startSmoothEnd() { + var _this2 = this; + + this.smoothEnd = true; + this.isModified = true; + this.targetOffset = { + x: this.modification.result.delta.x, + y: this.modification.result.delta.y + }; + this.timeout = ___raf_26["default"].request(function () { + return _this2.smoothEndTick(); + }); + } + }, { + key: "inertiaTick", + value: function inertiaTick() { + var _this3 = this; + + var interaction = this.interaction; + var options = __getOptions_26(interaction); + var lambda = options.resistance; + var t = (interaction._now() - this.t0) / 1000; + + if (t < this.te) { + var progress = 1 - (Math.exp(-lambda * t) - this.lambda_v0) / this.one_ve_v0; + var newOffset; + + if (this.isModified) { + newOffset = getQuadraticCurvePoint(0, 0, this.targetOffset.x, this.targetOffset.y, this.modifiedOffset.x, this.modifiedOffset.y, progress); + } else { + newOffset = { + x: this.targetOffset.x * progress, + y: this.targetOffset.y * progress + }; + } + + var delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move(); + this.timeout = ___raf_26["default"].request(function () { + return _this3.inertiaTick(); + }); + } else { + interaction.offsetBy({ + x: this.modifiedOffset.x - this.currentOffset.x, + y: this.modifiedOffset.y - this.currentOffset.y + }); + this.end(); + } + } + }, { + key: "smoothEndTick", + value: function smoothEndTick() { + var _this4 = this; + + var interaction = this.interaction; + var t = interaction._now() - this.t0; + + var _getOptions = __getOptions_26(interaction), + duration = _getOptions.smoothEndDuration; + + if (t < duration) { + var newOffset = { + x: easeOutQuad(t, 0, this.targetOffset.x, duration), + y: easeOutQuad(t, 0, this.targetOffset.y, duration) + }; + var delta = { + x: newOffset.x - this.currentOffset.x, + y: newOffset.y - this.currentOffset.y + }; + this.currentOffset.x += delta.x; + this.currentOffset.y += delta.y; + interaction.offsetBy(delta); + interaction.move({ + skipModifiers: this.modifierCount + }); + this.timeout = ___raf_26["default"].request(function () { + return _this4.smoothEndTick(); + }); + } else { + interaction.offsetBy({ + x: this.targetOffset.x - this.currentOffset.x, + y: this.targetOffset.y - this.currentOffset.y + }); + this.end(); + } + } + }, { + key: "resume", + value: function resume(_ref) { + var pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; + var interaction = this.interaction; // undo inertia changes to interaction coords + + interaction.offsetBy({ + x: -this.currentOffset.x, + y: -this.currentOffset.y + }); // update pointer at pointer down position + + interaction.updatePointer(pointer, event, eventTarget, true); // fire resume signals and event + + interaction._doPhase({ + interaction: interaction, + event: event, + phase: 'resume' + }); + + (0, _$pointerUtils_63.copyCoords)(interaction.coords.prev, interaction.coords.cur); + this.stop(); + } + }, { + key: "end", + value: function end() { + this.interaction.move(); + this.interaction.end(); + this.stop(); + } + }, { + key: "stop", + value: function stop() { + this.active = this.smoothEnd = false; + this.interaction.simulation = null; + + ___raf_26["default"].cancel(this.timeout); + } + }]); + + return InertiaState; +}(); + +_$index_26.InertiaState = InertiaState; + +function __start_26(_ref2) { + var interaction = _ref2.interaction, + event = _ref2.event; + + if (!interaction._interacting || interaction.simulation) { + return null; + } + + var started = interaction.inertia.start(event); // prevent action end if inertia or smoothEnd + + return started ? false : null; +} // Check if the down event hits the current inertia target +// control should be return to the user + + +function resume(arg) { + var interaction = arg.interaction, + eventTarget = arg.eventTarget; + var state = interaction.inertia; + + if (!state.active) { + return; + } + + var element = eventTarget; // climb up the DOM tree from the event target + + while (__is_26.element(element)) { + // if interaction element is the current inertia target element + if (element === interaction.element) { + state.resume(arg); + break; + } + + element = __dom_26.parentNode(element); + } +} + +function stop(_ref3) { + var interaction = _ref3.interaction; + var state = interaction.inertia; + + if (state.active) { + state.stop(); + } +} + +function __getOptions_26(_ref4) { + var interactable = _ref4.interactable, + prepared = _ref4.prepared; + return interactable && interactable.options && prepared.name && interactable.options[prepared.name].inertia; +} + +var inertia = { + id: 'inertia', + before: ['modifiers/base'], + install: __install_26, + listeners: { + 'interactions:new': function interactionsNew(_ref5) { + var interaction = _ref5.interaction; + interaction.inertia = new InertiaState(interaction); + }, + 'interactions:before-action-end': __start_26, + 'interactions:down': resume, + 'interactions:stop': stop, + 'interactions:before-action-resume': function interactionsBeforeActionResume(arg) { + var modification = arg.interaction.modification; + modification.stop(arg); + modification.start(arg, arg.interaction.coords.cur.page); + modification.applyToInteraction(arg); + }, + 'interactions:before-action-inertiastart': function interactionsBeforeActionInertiastart(arg) { + return arg.interaction.modification.setAndApply(arg); + }, + 'interactions:action-resume': modifiers.addEventModifiers, + 'interactions:action-inertiastart': modifiers.addEventModifiers, + 'interactions:after-action-inertiastart': function interactionsAfterActionInertiastart(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + }, + 'interactions:after-action-resume': function interactionsAfterActionResume(arg) { + return arg.interaction.modification.restoreInteractionCoords(arg); + } + } +}; // http://stackoverflow.com/a/5634528/2280888 + +function _getQBezierValue(t, p1, p2, p3) { + var iT = 1 - t; + return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3; +} + +function getQuadraticCurvePoint(startX, startY, cpX, cpY, endX, endY, position) { + return { + x: _getQBezierValue(position, startX, cpX, endX), + y: _getQBezierValue(position, startY, cpY, endY) + }; +} // http://gizma.com/easing/ + + +function easeOutQuad(t, b, c, d) { + t /= d; + return -c * t * (t - 2) + b; +} + +var ___default_26 = inertia; +_$index_26["default"] = ___default_26; + +var _$aspectRatio_31 = {}; +"use strict"; + +Object.defineProperty(_$aspectRatio_31, "__esModule", { + value: true +}); +_$aspectRatio_31.aspectRatio = _$aspectRatio_31["default"] = void 0; + +var ___extend_31 = ___interopRequireDefault_31(_$extend_55); + +/* removed: var _$rect_65 = require("@interactjs/utils/rect"); */; + +var ___Modification_31 = ___interopRequireDefault_31(_$Modification_29); + +/* removed: var _$base_32 = require("./base"); */; + +function ___interopRequireDefault_31(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { ___defineProperty_31(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function ___defineProperty_31(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var aspectRatio = { + start: function start(arg) { + var state = arg.state, + rect = arg.rect, + originalEdges = arg.edges, + coords = arg.pageCoords; + var ratio = state.options.ratio; + var _state$options = state.options, + equalDelta = _state$options.equalDelta, + modifiers = _state$options.modifiers; + + if (ratio === 'preserve') { + ratio = rect.width / rect.height; + } + + state.startCoords = (0, ___extend_31["default"])({}, coords); + state.startRect = (0, ___extend_31["default"])({}, rect); + state.ratio = ratio; + state.equalDelta = equalDelta; + var linkedEdges = state.linkedEdges = { + top: originalEdges.top || originalEdges.left && !originalEdges.bottom, + left: originalEdges.left || originalEdges.top && !originalEdges.right, + bottom: originalEdges.bottom || originalEdges.right && !originalEdges.top, + right: originalEdges.right || originalEdges.bottom && !originalEdges.left + }; + state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right); + + if (state.equalDelta) { + state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1); + } else { + var negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left; + state.edgeSign = negativeSecondaryEdge ? -1 : 1; + } + + (0, ___extend_31["default"])(arg.edges, linkedEdges); + + if (!modifiers || !modifiers.length) { + return; + } + + var subModification = new ___Modification_31["default"](arg.interaction); + subModification.copyFrom(arg.interaction.modification); + subModification.prepareStates(modifiers); + state.subModification = subModification; + subModification.startAll(_objectSpread({}, arg)); + }, + set: function set(arg) { + var state = arg.state, + rect = arg.rect, + coords = arg.coords; + var initialCoords = (0, ___extend_31["default"])({}, coords); + var aspectMethod = state.equalDelta ? setEqualDelta : setRatio; + aspectMethod(state, state.xIsPrimaryAxis, coords, rect); + + if (!state.subModification) { + return null; + } + + var correctedRect = (0, ___extend_31["default"])({}, rect); + (0, _$rect_65.addEdges)(state.linkedEdges, correctedRect, { + x: coords.x - initialCoords.x, + y: coords.y - initialCoords.y + }); + var result = state.subModification.setAll(_objectSpread({}, arg, { + rect: correctedRect, + edges: state.linkedEdges, + pageCoords: coords, + prevCoords: coords, + prevRect: correctedRect + })); + var delta = result.delta; + + if (result.changed) { + var xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y); // do aspect modification again with critical edge axis as primary + + aspectMethod(state, xIsCriticalAxis, result.coords, result.rect); + (0, ___extend_31["default"])(coords, result.coords); + } + + return result.eventProps; + }, + defaults: { + ratio: 'preserve', + equalDelta: false, + modifiers: [], + enabled: false + } +}; +_$aspectRatio_31.aspectRatio = aspectRatio; + +function setEqualDelta(_ref, xIsPrimaryAxis, coords) { + var startCoords = _ref.startCoords, + edgeSign = _ref.edgeSign; + + if (xIsPrimaryAxis) { + coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign; + } else { + coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign; + } +} + +function setRatio(_ref2, xIsPrimaryAxis, coords, rect) { + var startRect = _ref2.startRect, + startCoords = _ref2.startCoords, + ratio = _ref2.ratio, + edgeSign = _ref2.edgeSign; + + if (xIsPrimaryAxis) { + var newHeight = rect.width / ratio; + coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign; + } else { + var newWidth = rect.height * ratio; + coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign; + } +} + +var ___default_31 = (0, _$base_32.makeModifier)(aspectRatio, 'aspectRatio'); + +_$aspectRatio_31["default"] = ___default_31; + +var _$pointer_35 = {}; +"use strict"; + +function ___typeof_35(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_35 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_35 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_35(obj); } + +Object.defineProperty(_$pointer_35, "__esModule", { + value: true +}); +_$pointer_35.getRestrictionRect = getRestrictionRect; +_$pointer_35.restrict = _$pointer_35["default"] = void 0; + +var ___extend_35 = ___interopRequireDefault_35(_$extend_55); + +var __is_35 = ___interopRequireWildcard_35(_$is_59); + +var __rectUtils_35 = ___interopRequireWildcard_35(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +function ___getRequireWildcardCache_35() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_35 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_35(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_35(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_35(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_35(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __start_35(_ref) { + var rect = _ref.rect, + startOffset = _ref.startOffset, + state = _ref.state, + interaction = _ref.interaction, + pageCoords = _ref.pageCoords; + var options = state.options; + var elementRect = options.elementRect; + var offset = (0, ___extend_35["default"])({ + left: 0, + top: 0, + right: 0, + bottom: 0 + }, options.offset || {}); + + if (rect && elementRect) { + var restriction = getRestrictionRect(options.restriction, interaction, pageCoords); + + if (restriction) { + var widthDiff = restriction.right - restriction.left - rect.width; + var heightDiff = restriction.bottom - restriction.top - rect.height; + + if (widthDiff < 0) { + offset.left += widthDiff; + offset.right += widthDiff; + } + + if (heightDiff < 0) { + offset.top += heightDiff; + offset.bottom += heightDiff; + } + } + + offset.left += startOffset.left - rect.width * elementRect.left; + offset.top += startOffset.top - rect.height * elementRect.top; + offset.right += startOffset.right - rect.width * (1 - elementRect.right); + offset.bottom += startOffset.bottom - rect.height * (1 - elementRect.bottom); + } + + state.offset = offset; +} + +function set(_ref2) { + var coords = _ref2.coords, + interaction = _ref2.interaction, + state = _ref2.state; + var options = state.options, + offset = state.offset; + var restriction = getRestrictionRect(options.restriction, interaction, coords); + + if (!restriction) { + return; + } + + var rect = __rectUtils_35.xywhToTlbr(restriction); + coords.x = Math.max(Math.min(rect.right - offset.right, coords.x), rect.left + offset.left); + coords.y = Math.max(Math.min(rect.bottom - offset.bottom, coords.y), rect.top + offset.top); +} + +function getRestrictionRect(value, interaction, coords) { + if (__is_35.func(value)) { + return __rectUtils_35.resolveRectLike(value, interaction.interactable, interaction.element, [coords.x, coords.y, interaction]); + } else { + return __rectUtils_35.resolveRectLike(value, interaction.interactable, interaction.element); + } +} + +var __defaults_35 = { + restriction: null, + elementRect: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrict = { + start: __start_35, + set: set, + defaults: __defaults_35 +}; +_$pointer_35.restrict = restrict; + +var ___default_35 = (0, _$base_32.makeModifier)(restrict, 'restrict'); + +_$pointer_35["default"] = ___default_35; + +var _$edges_34 = {}; +"use strict"; + +function ___typeof_34(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_34 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_34 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_34(obj); } + +Object.defineProperty(_$edges_34, "__esModule", { + value: true +}); +_$edges_34.restrictEdges = _$edges_34["default"] = void 0; + +var ___extend_34 = ___interopRequireDefault_34(_$extend_55); + +var __rectUtils_34 = ___interopRequireWildcard_34(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$pointer_35 = require("./pointer"); */; + +function ___getRequireWildcardCache_34() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_34 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_34(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_34(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_34(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_34(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +// This module adds the options.resize.restrictEdges setting which sets min and +// max for the top, left, bottom and right edges of the target being resized. +// +// interact(target).resize({ +// edges: { top: true, left: true }, +// restrictEdges: { +// inner: { top: 200, left: 200, right: 400, bottom: 400 }, +// outer: { top: 0, left: 0, right: 600, bottom: 600 }, +// }, +// }) +var noInner = { + top: +Infinity, + left: +Infinity, + bottom: -Infinity, + right: -Infinity +}; +var noOuter = { + top: -Infinity, + left: -Infinity, + bottom: +Infinity, + right: +Infinity +}; + +function __start_34(_ref) { + var interaction = _ref.interaction, + startOffset = _ref.startOffset, + state = _ref.state; + var options = state.options; + var offset; + + if (options) { + var offsetRect = (0, _$pointer_35.getRestrictionRect)(options.offset, interaction, interaction.coords.start.page); + offset = __rectUtils_34.rectToXY(offsetRect); + } + + offset = offset || { + x: 0, + y: 0 + }; + state.offset = { + top: offset.y + startOffset.top, + left: offset.x + startOffset.left, + bottom: offset.y - startOffset.bottom, + right: offset.x - startOffset.right + }; +} + +function __set_34(_ref2) { + var coords = _ref2.coords, + edges = _ref2.edges, + interaction = _ref2.interaction, + state = _ref2.state; + var offset = state.offset, + options = state.options; + + if (!edges) { + return; + } + + var page = (0, ___extend_34["default"])({}, coords); + var inner = (0, _$pointer_35.getRestrictionRect)(options.inner, interaction, page) || {}; + var outer = (0, _$pointer_35.getRestrictionRect)(options.outer, interaction, page) || {}; + fixRect(inner, noInner); + fixRect(outer, noOuter); + + if (edges.top) { + coords.y = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top); + } else if (edges.bottom) { + coords.y = Math.max(Math.min(outer.bottom + offset.bottom, page.y), inner.bottom + offset.bottom); + } + + if (edges.left) { + coords.x = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left); + } else if (edges.right) { + coords.x = Math.max(Math.min(outer.right + offset.right, page.x), inner.right + offset.right); + } +} + +function fixRect(rect, defaults) { + var _arr = ['top', 'left', 'bottom', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (!(edge in rect)) { + rect[edge] = defaults[edge]; + } + } + + return rect; +} + +var __defaults_34 = { + inner: null, + outer: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrictEdges = { + noInner: noInner, + noOuter: noOuter, + start: __start_34, + set: __set_34, + defaults: __defaults_34 +}; +_$edges_34.restrictEdges = restrictEdges; + +var ___default_34 = (0, _$base_32.makeModifier)(restrictEdges, 'restrictEdges'); + +_$edges_34["default"] = ___default_34; + +var _$rect_36 = {}; +"use strict"; + +Object.defineProperty(_$rect_36, "__esModule", { + value: true +}); +_$rect_36.restrictRect = _$rect_36["default"] = void 0; + +var ___extend_36 = ___interopRequireDefault_36(_$extend_55); + +/* removed: var _$pointer_35 = require("./pointer"); */; + +/* removed: var _$base_32 = require("../base"); */; + +function ___interopRequireDefault_36(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __defaults_36 = (0, ___extend_36["default"])({ + get elementRect() { + return { + top: 0, + left: 0, + bottom: 1, + right: 1 + }; + }, + + set elementRect(_) {} + +}, _$pointer_35.restrict.defaults); +var restrictRect = { + start: _$pointer_35.restrict.start, + set: _$pointer_35.restrict.set, + defaults: __defaults_36 +}; +_$rect_36.restrictRect = restrictRect; + +var ___default_36 = (0, _$base_32.makeModifier)(restrictRect, 'restrictRect'); + +_$rect_36["default"] = ___default_36; + +var _$size_37 = {}; +"use strict"; + +function ___typeof_37(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_37 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_37 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_37(obj); } + +Object.defineProperty(_$size_37, "__esModule", { + value: true +}); +_$size_37.restrictSize = _$size_37["default"] = void 0; + +var ___extend_37 = ___interopRequireDefault_37(_$extend_55); + +var __rectUtils_37 = ___interopRequireWildcard_37(_$rect_65); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$edges_34 = require("./edges"); */; + +/* removed: var _$pointer_35 = require("./pointer"); */; + +function ___getRequireWildcardCache_37() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_37 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_37(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_37(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_37(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_37(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var noMin = { + width: -Infinity, + height: -Infinity +}; +var noMax = { + width: +Infinity, + height: +Infinity +}; + +function __start_37(arg) { + return _$edges_34.restrictEdges.start(arg); +} + +function __set_37(arg) { + var interaction = arg.interaction, + state = arg.state, + rect = arg.rect, + edges = arg.edges; + var options = state.options; + + if (!edges) { + return; + } + + var minSize = __rectUtils_37.tlbrToXywh((0, _$pointer_35.getRestrictionRect)(options.min, interaction, arg.coords)) || noMin; + var maxSize = __rectUtils_37.tlbrToXywh((0, _$pointer_35.getRestrictionRect)(options.max, interaction, arg.coords)) || noMax; + state.options = { + endOnly: options.endOnly, + inner: (0, ___extend_37["default"])({}, _$edges_34.restrictEdges.noInner), + outer: (0, ___extend_37["default"])({}, _$edges_34.restrictEdges.noOuter) + }; + + if (edges.top) { + state.options.inner.top = rect.bottom - minSize.height; + state.options.outer.top = rect.bottom - maxSize.height; + } else if (edges.bottom) { + state.options.inner.bottom = rect.top + minSize.height; + state.options.outer.bottom = rect.top + maxSize.height; + } + + if (edges.left) { + state.options.inner.left = rect.right - minSize.width; + state.options.outer.left = rect.right - maxSize.width; + } else if (edges.right) { + state.options.inner.right = rect.left + minSize.width; + state.options.outer.right = rect.left + maxSize.width; + } + + _$edges_34.restrictEdges.set(arg); + + state.options = options; +} + +var __defaults_37 = { + min: null, + max: null, + endOnly: false, + enabled: false +}; +var restrictSize = { + start: __start_37, + set: __set_37, + defaults: __defaults_37 +}; +_$size_37.restrictSize = restrictSize; + +var ___default_37 = (0, _$base_32.makeModifier)(restrictSize, 'restrictSize'); + +_$size_37["default"] = ___default_37; + +var _$pointer_39 = {}; +"use strict"; + +function ___typeof_39(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_39 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_39 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_39(obj); } + +Object.defineProperty(_$pointer_39, "__esModule", { + value: true +}); +_$pointer_39.snap = _$pointer_39["default"] = void 0; + +var __utils_39 = ___interopRequireWildcard_39(_$index_58); + +/* removed: var _$base_32 = require("../base"); */; + +function ___getRequireWildcardCache_39() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_39 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_39(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_39(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_39(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function __start_39(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + element = arg.element, + rect = arg.rect, + state = arg.state, + startOffset = arg.startOffset; + var options = state.options; + var origin = options.offsetWithOrigin ? getOrigin(arg) : { + x: 0, + y: 0 + }; + var snapOffset; + + if (options.offset === 'startCoords') { + snapOffset = { + x: interaction.coords.start.page.x, + y: interaction.coords.start.page.y + }; + } else { + var offsetRect = __utils_39.rect.resolveRectLike(options.offset, interactable, element, [interaction]); + snapOffset = __utils_39.rect.rectToXY(offsetRect) || { + x: 0, + y: 0 + }; + snapOffset.x += origin.x; + snapOffset.y += origin.y; + } + + var relativePoints = options.relativePoints; + state.offsets = rect && relativePoints && relativePoints.length ? relativePoints.map(function (relativePoint, index) { + return { + index: index, + relativePoint: relativePoint, + x: startOffset.left - rect.width * relativePoint.x + snapOffset.x, + y: startOffset.top - rect.height * relativePoint.y + snapOffset.y + }; + }) : [__utils_39.extend({ + index: 0, + relativePoint: null + }, snapOffset)]; +} + +function __set_39(arg) { + var interaction = arg.interaction, + coords = arg.coords, + state = arg.state; + var options = state.options, + offsets = state.offsets; + var origin = __utils_39.getOriginXY(interaction.interactable, interaction.element, interaction.prepared.name); + var page = __utils_39.extend({}, coords); + var targets = []; + + if (!options.offsetWithOrigin) { + page.x -= origin.x; + page.y -= origin.y; + } + + for (var _i = 0; _i < offsets.length; _i++) { + var _ref; + + _ref = offsets[_i]; + var _offset = _ref; + var relativeX = page.x - _offset.x; + var relativeY = page.y - _offset.y; + + for (var _index = 0, len = options.targets.length; _index < len; _index++) { + var snapTarget = options.targets[_index]; + var target = void 0; + + if (__utils_39.is.func(snapTarget)) { + target = snapTarget(relativeX, relativeY, interaction, _offset, _index); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + targets.push({ + x: (__utils_39.is.number(target.x) ? target.x : relativeX) + _offset.x, + y: (__utils_39.is.number(target.y) ? target.y : relativeY) + _offset.y, + range: __utils_39.is.number(target.range) ? target.range : options.range, + source: snapTarget, + index: _index, + offset: _offset + }); + } + } + + var closest = { + target: null, + inRange: false, + distance: 0, + range: 0, + delta: { + x: 0, + y: 0 + } + }; + + for (var _i2 = 0; _i2 < targets.length; _i2++) { + var _target = targets[_i2]; + var range = _target.range; + var dx = _target.x - page.x; + var dy = _target.y - page.y; + var distance = __utils_39.hypot(dx, dy); + var inRange = distance <= range; // Infinite targets count as being out of range + // compared to non infinite ones that are in range + + if (range === Infinity && closest.inRange && closest.range !== Infinity) { + inRange = false; + } + + if (!closest.target || (inRange // is the closest target in range? + ? closest.inRange && range !== Infinity // the pointer is relatively deeper in this target + ? distance / range < closest.distance / closest.range // this target has Infinite range and the closest doesn't + : range === Infinity && closest.range !== Infinity || // OR this target is closer that the previous closest + distance < closest.distance : // The other is not in range and the pointer is closer to this target + !closest.inRange && distance < closest.distance)) { + closest.target = _target; + closest.distance = distance; + closest.range = range; + closest.inRange = inRange; + closest.delta.x = dx; + closest.delta.y = dy; + } + } + + if (closest.inRange) { + coords.x = closest.target.x; + coords.y = closest.target.y; + } + + state.closest = closest; + return closest; +} + +function getOrigin(arg) { + var element = arg.interaction.element; + var optionsOrigin = __utils_39.rect.rectToXY(__utils_39.rect.resolveRectLike(arg.state.options.origin, null, null, [element])); + var origin = optionsOrigin || __utils_39.getOriginXY(arg.interactable, element, arg.interaction.prepared.name); + return origin; +} + +var __defaults_39 = { + range: Infinity, + targets: null, + offset: null, + offsetWithOrigin: true, + origin: null, + relativePoints: null, + endOnly: false, + enabled: false +}; +var snap = { + start: __start_39, + set: __set_39, + defaults: __defaults_39 +}; +_$pointer_39.snap = snap; + +var ___default_39 = (0, _$base_32.makeModifier)(snap, 'snap'); + +_$pointer_39["default"] = ___default_39; + +var _$size_40 = {}; +"use strict"; + +function ___typeof_40(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_40 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_40 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_40(obj); } + +Object.defineProperty(_$size_40, "__esModule", { + value: true +}); +_$size_40.snapSize = _$size_40["default"] = void 0; + +var ___extend_40 = ___interopRequireDefault_40(_$extend_55); + +var __is_40 = ___interopRequireWildcard_40(_$is_59); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$pointer_39 = require("./pointer"); */; + +function ___getRequireWildcardCache_40() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_40 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_40(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_40(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_40(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_40(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_40(arr, i) { return ___arrayWithHoles_40(arr) || ___iterableToArrayLimit_40(arr, i) || ___nonIterableRest_40(); } + +function ___nonIterableRest_40() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_40(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_40(arr) { if (Array.isArray(arr)) return arr; } + +function __start_40(arg) { + var state = arg.state, + edges = arg.edges; + var options = state.options; + + if (!edges) { + return null; + } + + arg.state = { + options: { + targets: null, + relativePoints: [{ + x: edges.left ? 0 : 1, + y: edges.top ? 0 : 1 + }], + offset: options.offset || 'self', + origin: { + x: 0, + y: 0 + }, + range: options.range + } + }; + state.targetFields = state.targetFields || [['width', 'height'], ['x', 'y']]; + + _$pointer_39.snap.start(arg); + + state.offsets = arg.state.offsets; + arg.state = state; +} + +function __set_40(arg) { + var interaction = arg.interaction, + state = arg.state, + coords = arg.coords; + var options = state.options, + offsets = state.offsets; + var relative = { + x: coords.x - offsets[0].x, + y: coords.y - offsets[0].y + }; + state.options = (0, ___extend_40["default"])({}, options); + state.options.targets = []; + + for (var _i = 0; _i < (options.targets || []).length; _i++) { + var _ref; + + _ref = (options.targets || [])[_i]; + var snapTarget = _ref; + var target = void 0; + + if (__is_40.func(snapTarget)) { + target = snapTarget(relative.x, relative.y, interaction); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + for (var _i2 = 0; _i2 < state.targetFields.length; _i2++) { + var _ref2; + + _ref2 = state.targetFields[_i2]; + + var _ref3 = _ref2, + _ref4 = ___slicedToArray_40(_ref3, 2), + xField = _ref4[0], + yField = _ref4[1]; + + if (xField in target || yField in target) { + target.x = target[xField]; + target.y = target[yField]; + break; + } + } + + state.options.targets.push(target); + } + + var returnValue = _$pointer_39.snap.set(arg); + + state.options = options; + return returnValue; +} + +var __defaults_40 = { + range: Infinity, + targets: null, + offset: null, + endOnly: false, + enabled: false +}; +var snapSize = { + start: __start_40, + set: __set_40, + defaults: __defaults_40 +}; +_$size_40.snapSize = snapSize; + +var ___default_40 = (0, _$base_32.makeModifier)(snapSize, 'snapSize'); + +_$size_40["default"] = ___default_40; + +var _$edges_38 = {}; +"use strict"; + +Object.defineProperty(_$edges_38, "__esModule", { + value: true +}); +_$edges_38.snapEdges = _$edges_38["default"] = void 0; + +var ___clone_38 = ___interopRequireDefault_38(_$clone_51); + +var ___extend_38 = ___interopRequireDefault_38(_$extend_55); + +/* removed: var _$base_32 = require("../base"); */; + +/* removed: var _$size_40 = require("./size"); */; + +function ___interopRequireDefault_38(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** + * @module modifiers/snapEdges + * + * @description + * This module allows snapping of the edges of targets during resize + * interactions. + * + * @example + * interact(target).resizable({ + * snapEdges: { + * targets: [interact.snappers.grid({ x: 100, y: 50 })], + * }, + * }) + * + * interact(target).resizable({ + * snapEdges: { + * targets: [ + * interact.snappers.grid({ + * top: 50, + * left: 50, + * bottom: 100, + * right: 100, + * }), + * ], + * }, + * }) + */ +function __start_38(arg) { + var edges = arg.edges; + + if (!edges) { + return null; + } + + arg.state.targetFields = arg.state.targetFields || [[edges.left ? 'left' : 'right', edges.top ? 'top' : 'bottom']]; + return _$size_40.snapSize.start(arg); +} + +var snapEdges = { + start: __start_38, + set: _$size_40.snapSize.set, + defaults: (0, ___extend_38["default"])((0, ___clone_38["default"])(_$size_40.snapSize.defaults), { + targets: null, + range: null, + offset: { + x: 0, + y: 0 + } + }) +}; +_$edges_38.snapEdges = snapEdges; + +var ___default_38 = (0, _$base_32.makeModifier)(snapEdges, 'snapEdges'); + +_$edges_38["default"] = ___default_38; + +var _$all_30 = {}; +"use strict"; + +Object.defineProperty(_$all_30, "__esModule", { + value: true +}); +Object.defineProperty(_$all_30, "aspectRatio", { + enumerable: true, + get: function get() { + return _aspectRatio["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictEdges", { + enumerable: true, + get: function get() { + return ___edges_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrict", { + enumerable: true, + get: function get() { + return ___pointer_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictRect", { + enumerable: true, + get: function get() { + return ___rect_30["default"]; + } +}); +Object.defineProperty(_$all_30, "restrictSize", { + enumerable: true, + get: function get() { + return ___size_30["default"]; + } +}); +Object.defineProperty(_$all_30, "snapEdges", { + enumerable: true, + get: function get() { + return _edges2["default"]; + } +}); +Object.defineProperty(_$all_30, "snap", { + enumerable: true, + get: function get() { + return _pointer2["default"]; + } +}); +Object.defineProperty(_$all_30, "snapSize", { + enumerable: true, + get: function get() { + return _size2["default"]; + } +}); + +var _aspectRatio = ___interopRequireDefault_30(_$aspectRatio_31); + +var ___edges_30 = ___interopRequireDefault_30(_$edges_34); + +var ___pointer_30 = ___interopRequireDefault_30(_$pointer_35); + +var ___rect_30 = ___interopRequireDefault_30(_$rect_36); + +var ___size_30 = ___interopRequireDefault_30(_$size_37); + +var _edges2 = ___interopRequireDefault_30(_$edges_38); + +var _pointer2 = ___interopRequireDefault_30(_$pointer_39); + +var _size2 = ___interopRequireDefault_30(_$size_40); + +function ___interopRequireDefault_30(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _$grid_66 = {}; +"use strict"; + +Object.defineProperty(_$grid_66, "__esModule", { + value: true +}); +_$grid_66["default"] = void 0; + +function ___slicedToArray_66(arr, i) { return ___arrayWithHoles_66(arr) || ___iterableToArrayLimit_66(arr, i) || ___nonIterableRest_66(); } + +function ___nonIterableRest_66() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_66(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_66(arr) { if (Array.isArray(arr)) return arr; } + +function createGrid(grid) { + var coordFields = [['x', 'y'], ['left', 'top'], ['right', 'bottom'], ['width', 'height']].filter(function (_ref) { + var _ref2 = ___slicedToArray_66(_ref, 2), + xField = _ref2[0], + yField = _ref2[1]; + + return xField in grid || yField in grid; + }); + + var gridFunc = function gridFunc(x, y) { + var range = grid.range, + _grid$limits = grid.limits, + limits = _grid$limits === void 0 ? { + left: -Infinity, + right: Infinity, + top: -Infinity, + bottom: Infinity + } : _grid$limits, + _grid$offset = grid.offset, + offset = _grid$offset === void 0 ? { + x: 0, + y: 0 + } : _grid$offset; + var result = { + range: range, + grid: grid, + x: null, + y: null + }; + + for (var _i2 = 0; _i2 < coordFields.length; _i2++) { + var _ref3; + + _ref3 = coordFields[_i2]; + + var _ref4 = _ref3, + _ref5 = ___slicedToArray_66(_ref4, 2), + xField = _ref5[0], + yField = _ref5[1]; + + var gridx = Math.round((x - offset.x) / grid[xField]); + var gridy = Math.round((y - offset.y) / grid[yField]); + result[xField] = Math.max(limits.left, Math.min(limits.right, gridx * grid[xField] + offset.x)); + result[yField] = Math.max(limits.top, Math.min(limits.bottom, gridy * grid[yField] + offset.y)); + } + + return result; + }; + + gridFunc.grid = grid; + gridFunc.coordFields = coordFields; + return gridFunc; +} + +var ___default_66 = createGrid; +_$grid_66["default"] = ___default_66; + +var _$index_67 = {}; +"use strict"; + +Object.defineProperty(_$index_67, "__esModule", { + value: true +}); +Object.defineProperty(_$index_67, "grid", { + enumerable: true, + get: function get() { + return _grid["default"]; + } +}); + +var _grid = ___interopRequireDefault_67(_$grid_66); + +function ___interopRequireDefault_67(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _$index_33 = {}; +"use strict"; + +function ___typeof_33(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_33 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_33 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_33(obj); } + +Object.defineProperty(_$index_33, "__esModule", { + value: true +}); +_$index_33["default"] = void 0; + +var ___base_33 = ___interopRequireDefault_33(_$base_32); + +var all = ___interopRequireWildcard_33(_$all_30); + +var ___extend_33 = ___interopRequireDefault_33(_$extend_55); + +var snappers = ___interopRequireWildcard_33(_$index_67); + +function ___getRequireWildcardCache_33() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_33 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_33(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_33(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_33(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_33(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __modifiers_33 = { + id: 'modifiers', + install: function install(scope) { + var interact = scope.interact; + scope.usePlugin(___base_33["default"]); + interact.modifiers = (0, ___extend_33["default"])(interact.modifiers || {}, all); + interact.snappers = (0, ___extend_33["default"])(interact.snappers || {}, snappers); + interact.createSnapGrid = interact.snappers.grid; // for backwrads compatibility + + for (var type in all) { + var _all = all[type], + _defaults = _all._defaults, + _methods = _all._methods; + _defaults._methods = _methods; + scope.defaults.perAction[type] = _defaults; + } + } +}; +var ___default_33 = __modifiers_33; +_$index_33["default"] = ___default_33; + +var _$PointerEvent_42 = {}; +"use strict"; + +Object.defineProperty(_$PointerEvent_42, "__esModule", { + value: true +}); +_$PointerEvent_42.PointerEvent = _$PointerEvent_42["default"] = void 0; + +var ___BaseEvent2_42 = ___interopRequireDefault_42(_$BaseEvent_13); + +var __pointerUtils_42 = ___interopRequireWildcard_42(_$pointerUtils_63); + +function ___getRequireWildcardCache_42() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_42 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_42(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_42(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_42(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_42(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_42(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_42 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_42 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_42(obj); } + +function ___classCallCheck_42(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_42(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_42(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_42(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_42(Constructor, staticProps); return Constructor; } + +function ___possibleConstructorReturn_42(self, call) { if (call && (___typeof_42(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_42(self); } + +function ___getPrototypeOf_42(o) { ___getPrototypeOf_42 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_42(o); } + +function ___assertThisInitialized_42(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ___inherits_42(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_42(subClass, superClass); } + +function ___setPrototypeOf_42(o, p) { ___setPrototypeOf_42 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_42(o, p); } + +function ___defineProperty_42(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var PointerEvent = /*#__PURE__*/function (_BaseEvent) { + ___inherits_42(PointerEvent, _BaseEvent); + + /** */ + function PointerEvent(type, pointer, event, eventTarget, interaction, timeStamp) { + var _this; + + ___classCallCheck_42(this, PointerEvent); + + _this = ___possibleConstructorReturn_42(this, ___getPrototypeOf_42(PointerEvent).call(this, interaction)); + + ___defineProperty_42(___assertThisInitialized_42(_this), "type", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "originalEvent", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pointerId", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pointerType", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "double", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pageX", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "pageY", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "clientX", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "clientY", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "dt", void 0); + + ___defineProperty_42(___assertThisInitialized_42(_this), "eventable", void 0); + + __pointerUtils_42.pointerExtend(___assertThisInitialized_42(_this), event); + + if (event !== pointer) { + __pointerUtils_42.pointerExtend(___assertThisInitialized_42(_this), pointer); + } + + _this.timeStamp = timeStamp; + _this.originalEvent = event; + _this.type = type; + _this.pointerId = __pointerUtils_42.getPointerId(pointer); + _this.pointerType = __pointerUtils_42.getPointerType(pointer); + _this.target = eventTarget; + _this.currentTarget = null; + + if (type === 'tap') { + var pointerIndex = interaction.getPointerIndex(pointer); + _this.dt = _this.timeStamp - interaction.pointers[pointerIndex].downTime; + var interval = _this.timeStamp - interaction.tapTime; + _this["double"] = !!(interaction.prevTap && interaction.prevTap.type !== 'doubletap' && interaction.prevTap.target === _this.target && interval < 500); + } else if (type === 'doubletap') { + _this.dt = pointer.timeStamp - interaction.tapTime; + } + + return _this; + } + + ___createClass_42(PointerEvent, [{ + key: "_subtractOrigin", + value: function _subtractOrigin(_ref) { + var originX = _ref.x, + originY = _ref.y; + this.pageX -= originX; + this.pageY -= originY; + this.clientX -= originX; + this.clientY -= originY; + return this; + } + }, { + key: "_addOrigin", + value: function _addOrigin(_ref2) { + var originX = _ref2.x, + originY = _ref2.y; + this.pageX += originX; + this.pageY += originY; + this.clientX += originX; + this.clientY += originY; + return this; + } + /** + * Prevent the default behaviour of the original Event + */ + + }, { + key: "preventDefault", + value: function preventDefault() { + this.originalEvent.preventDefault(); + } + }]); + + return PointerEvent; +}(___BaseEvent2_42["default"]); + +_$PointerEvent_42.PointerEvent = _$PointerEvent_42["default"] = PointerEvent; + +var _$base_43 = {}; +"use strict"; + +function ___typeof_43(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_43 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_43 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_43(obj); } + +Object.defineProperty(_$base_43, "__esModule", { + value: true +}); +_$base_43["default"] = void 0; + +var ___Interaction_43 = ___interopRequireDefault_43(_$Interaction_18); + +var ___scope_43 = _$scope_24({}); + +var __utils_43 = ___interopRequireWildcard_43(_$index_58); + +var _PointerEvent = ___interopRequireDefault_43(_$PointerEvent_42); + +function ___getRequireWildcardCache_43() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_43 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_43(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_43(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_43(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_43(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __defaults_43 = { + holdDuration: 600, + ignoreFrom: null, + allowFrom: null, + origin: { + x: 0, + y: 0 + } +}; +var pointerEvents = { + id: 'pointer-events/base', + install: __install_43, + listeners: { + 'interactions:new': addInteractionProps, + 'interactions:update-pointer': addHoldInfo, + 'interactions:move': moveAndClearHold, + 'interactions:down': function interactionsDown(arg, scope) { + downAndStartHold(arg, scope); + fire(arg, scope); + }, + 'interactions:up': function interactionsUp(arg, scope) { + clearHold(arg); + fire(arg, scope); + tapAfterUp(arg, scope); + }, + 'interactions:cancel': function interactionsCancel(arg, scope) { + clearHold(arg); + fire(arg, scope); + } + }, + PointerEvent: _PointerEvent["default"], + fire: fire, + collectEventTargets: collectEventTargets, + defaults: __defaults_43, + types: { + down: true, + move: true, + up: true, + cancel: true, + tap: true, + doubletap: true, + hold: true + } +}; + +function fire(arg, scope) { + var interaction = arg.interaction, + pointer = arg.pointer, + event = arg.event, + eventTarget = arg.eventTarget, + type = arg.type, + _arg$targets = arg.targets, + targets = _arg$targets === void 0 ? collectEventTargets(arg, scope) : _arg$targets; + var pointerEvent = new _PointerEvent["default"](type, pointer, event, eventTarget, interaction, scope.now()); + scope.fire('pointerEvents:new', { + pointerEvent: pointerEvent + }); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + targets: targets, + type: type, + pointerEvent: pointerEvent + }; + + for (var i = 0; i < targets.length; i++) { + var target = targets[i]; + + for (var prop in target.props || {}) { + pointerEvent[prop] = target.props[prop]; + } + + var origin = __utils_43.getOriginXY(target.eventable, target.node); + + pointerEvent._subtractOrigin(origin); + + pointerEvent.eventable = target.eventable; + pointerEvent.currentTarget = target.node; + target.eventable.fire(pointerEvent); + + pointerEvent._addOrigin(origin); + + if (pointerEvent.immediatePropagationStopped || pointerEvent.propagationStopped && i + 1 < targets.length && targets[i + 1].node !== pointerEvent.currentTarget) { + break; + } + } + + scope.fire('pointerEvents:fired', signalArg); + + if (type === 'tap') { + // if pointerEvent should make a double tap, create and fire a doubletap + // PointerEvent and use that as the prevTap + var prevTap = pointerEvent["double"] ? fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'doubletap' + }, scope) : pointerEvent; + interaction.prevTap = prevTap; + interaction.tapTime = prevTap.timeStamp; + } + + return pointerEvent; +} + +function collectEventTargets(_ref, scope) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget, + type = _ref.type; + var pointerIndex = interaction.getPointerIndex(pointer); + var pointerInfo = interaction.pointers[pointerIndex]; // do not fire a tap event if the pointer was moved before being lifted + + if (type === 'tap' && (interaction.pointerWasMoved || // or if the pointerup target is different to the pointerdown target + !(pointerInfo && pointerInfo.downTarget === eventTarget))) { + return []; + } + + var path = __utils_43.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: type, + path: path, + targets: [], + node: null + }; + + for (var _i = 0; _i < path.length; _i++) { + var _ref2; + + _ref2 = path[_i]; + var node = _ref2; + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (type === 'hold') { + signalArg.targets = signalArg.targets.filter(function (target) { + return target.eventable.options.holdDuration === interaction.pointers[pointerIndex].hold.duration; + }); + } + + return signalArg.targets; +} + +function addInteractionProps(_ref3) { + var interaction = _ref3.interaction; + interaction.prevTap = null; // the most recent tap event on this interaction + + interaction.tapTime = 0; // time of the most recent tap event +} + +function addHoldInfo(_ref4) { + var down = _ref4.down, + pointerInfo = _ref4.pointerInfo; + + if (!down && pointerInfo.hold) { + return; + } + + pointerInfo.hold = { + duration: Infinity, + timeout: null + }; +} + +function clearHold(_ref5) { + var interaction = _ref5.interaction, + pointerIndex = _ref5.pointerIndex; + + if (interaction.pointers[pointerIndex].hold) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } +} + +function moveAndClearHold(_ref6, scope) { + var interaction = _ref6.interaction, + pointer = _ref6.pointer, + event = _ref6.event, + eventTarget = _ref6.eventTarget, + duplicate = _ref6.duplicate; + var pointerIndex = interaction.getPointerIndex(pointer); + + if (!duplicate && (!interaction.pointerIsDown || interaction.pointerWasMoved)) { + if (interaction.pointerIsDown) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } + + fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'move' + }, scope); + } +} + +function downAndStartHold(_ref7, scope) { + var interaction = _ref7.interaction, + pointer = _ref7.pointer, + event = _ref7.event, + eventTarget = _ref7.eventTarget, + pointerIndex = _ref7.pointerIndex; + var timer = interaction.pointers[pointerIndex].hold; + var path = __utils_43.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'hold', + targets: [], + path: path, + node: null + }; + + for (var _i2 = 0; _i2 < path.length; _i2++) { + var _ref8; + + _ref8 = path[_i2]; + var node = _ref8; + signalArg.node = node; + scope.fire('pointerEvents:collect-targets', signalArg); + } + + if (!signalArg.targets.length) { + return; + } + + var minDuration = Infinity; + + for (var _i3 = 0; _i3 < signalArg.targets.length; _i3++) { + var _ref9; + + _ref9 = signalArg.targets[_i3]; + var target = _ref9; + var holdDuration = target.eventable.options.holdDuration; + + if (holdDuration < minDuration) { + minDuration = holdDuration; + } + } + + timer.duration = minDuration; + timer.timeout = setTimeout(function () { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'hold' + }, scope); + }, minDuration); +} + +function tapAfterUp(_ref10, scope) { + var interaction = _ref10.interaction, + pointer = _ref10.pointer, + event = _ref10.event, + eventTarget = _ref10.eventTarget; + + if (!interaction.pointerWasMoved) { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'tap' + }, scope); + } +} + +function __install_43(scope) { + scope.pointerEvents = pointerEvents; + scope.defaults.actions.pointerEvents = pointerEvents.defaults; + __utils_43.extend(scope.actions.phaselessTypes, pointerEvents.types); +} + +var ___default_43 = pointerEvents; +_$base_43["default"] = ___default_43; + +var _$holdRepeat_44 = {}; +"use strict"; + +Object.defineProperty(_$holdRepeat_44, "__esModule", { + value: true +}); +_$holdRepeat_44["default"] = void 0; + +var ___base_44 = ___interopRequireDefault_44(_$base_43); + +var ___PointerEvent_44 = ___interopRequireDefault_44(_$PointerEvent_42); + +function ___interopRequireDefault_44(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_44(scope) { + scope.usePlugin(___base_44["default"]); + var pointerEvents = scope.pointerEvents; // don't repeat by default + + pointerEvents.defaults.holdRepeatInterval = 0; + pointerEvents.types.holdrepeat = scope.actions.phaselessTypes.holdrepeat = true; +} + +function onNew(_ref) { + var pointerEvent = _ref.pointerEvent; + + if (pointerEvent.type !== 'hold') { + return; + } + + pointerEvent.count = (pointerEvent.count || 0) + 1; +} + +function onFired(_ref2, scope) { + var interaction = _ref2.interaction, + pointerEvent = _ref2.pointerEvent, + eventTarget = _ref2.eventTarget, + targets = _ref2.targets; + + if (pointerEvent.type !== 'hold' || !targets.length) { + return; + } // get the repeat interval from the first eventable + + + var interval = targets[0].eventable.options.holdRepeatInterval; // don't repeat if the interval is 0 or less + + if (interval <= 0) { + return; + } // set a timeout to fire the holdrepeat event + + + interaction.holdIntervalHandle = setTimeout(function () { + scope.pointerEvents.fire({ + interaction: interaction, + eventTarget: eventTarget, + type: 'hold', + pointer: pointerEvent, + event: pointerEvent + }, scope); + }, interval); +} + +function endHoldRepeat(_ref3) { + var interaction = _ref3.interaction; + + // set the interaction's holdStopTime property + // to stop further holdRepeat events + if (interaction.holdIntervalHandle) { + clearInterval(interaction.holdIntervalHandle); + interaction.holdIntervalHandle = null; + } +} + +var holdRepeat = { + id: 'pointer-events/holdRepeat', + install: __install_44, + listeners: ['move', 'up', 'cancel', 'endall'].reduce(function (acc, enderTypes) { + acc["pointerEvents:".concat(enderTypes)] = endHoldRepeat; + return acc; + }, { + 'pointerEvents:new': onNew, + 'pointerEvents:fired': onFired + }) +}; +var ___default_44 = holdRepeat; +_$holdRepeat_44["default"] = ___default_44; + +var _$interactableTargets_46 = {}; +"use strict"; + +Object.defineProperty(_$interactableTargets_46, "__esModule", { + value: true +}); +_$interactableTargets_46["default"] = void 0; + +var ___extend_46 = ___interopRequireDefault_46(_$extend_55); + +function ___interopRequireDefault_46(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_46(scope) { + var Interactable = scope.Interactable; + Interactable.prototype.pointerEvents = pointerEventsMethod; + var __backCompatOption = Interactable.prototype._backCompatOption; + + Interactable.prototype._backCompatOption = function (optionName, newValue) { + var ret = __backCompatOption.call(this, optionName, newValue); + + if (ret === this) { + this.events.options[optionName] = newValue; + } + + return ret; + }; +} + +function pointerEventsMethod(options) { + (0, ___extend_46["default"])(this.events.options, options); + return this; +} + +var plugin = { + id: 'pointer-events/interactableTargets', + install: __install_46, + listeners: { + 'pointerEvents:collect-targets': function pointerEventsCollectTargets(_ref, scope) { + var targets = _ref.targets, + node = _ref.node, + type = _ref.type, + eventTarget = _ref.eventTarget; + scope.interactables.forEachMatch(node, function (interactable) { + var eventable = interactable.events; + var options = eventable.options; + + if (eventable.types[type] && eventable.types[type].length && interactable.testIgnoreAllow(options, node, eventTarget)) { + targets.push({ + node: node, + eventable: eventable, + props: { + interactable: interactable + } + }); + } + }); + }, + 'interactable:new': function interactableNew(_ref2) { + var interactable = _ref2.interactable; + + interactable.events.getRect = function (element) { + return interactable.getRect(element); + }; + }, + 'interactable:set': function interactableSet(_ref3, scope) { + var interactable = _ref3.interactable, + options = _ref3.options; + (0, ___extend_46["default"])(interactable.events.options, scope.pointerEvents.defaults); + (0, ___extend_46["default"])(interactable.events.options, options.pointerEvents || {}); + } + } +}; +var ___default_46 = plugin; +_$interactableTargets_46["default"] = ___default_46; + +var _$index_45 = {}; +"use strict"; + +function ___typeof_45(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_45 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_45 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_45(obj); } + +Object.defineProperty(_$index_45, "__esModule", { + value: true +}); +Object.defineProperty(_$index_45, "holdRepeat", { + enumerable: true, + get: function get() { + return _holdRepeat["default"]; + } +}); +Object.defineProperty(_$index_45, "interactableTargets", { + enumerable: true, + get: function get() { + return _interactableTargets["default"]; + } +}); +_$index_45.pointerEvents = _$index_45["default"] = void 0; + +var __pointerEvents_45 = ___interopRequireWildcard_45(_$base_43); + +_$index_45.pointerEvents = __pointerEvents_45; + +var _holdRepeat = ___interopRequireDefault_45(_$holdRepeat_44); + +var _interactableTargets = ___interopRequireDefault_45(_$interactableTargets_46); + +function ___interopRequireDefault_45(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___getRequireWildcardCache_45() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_45 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_45(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_45(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_45(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +var ___default_45 = { + id: 'pointer-events', + install: function install(scope) { + scope.usePlugin(__pointerEvents_45); + scope.usePlugin(_holdRepeat["default"]); + scope.usePlugin(_interactableTargets["default"]); + } +}; +_$index_45["default"] = ___default_45; + +var _$index_47 = {}; +"use strict"; + +Object.defineProperty(_$index_47, "__esModule", { + value: true +}); +_$index_47.install = __install_47; +_$index_47["default"] = void 0; + +var ___Interactable_47 = ___interopRequireDefault_47(_$Interactable_16({})); + +/* removed: var _$Interaction_18 = require("@interactjs/core/Interaction"); */; + +/* removed: var _$index_58 = require("@interactjs/utils/index"); */; + +function ___interopRequireDefault_47(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_47(scope) { + var Interactable = scope.Interactable; + scope.actions.phases.reflow = true; + /** + * ```js + * const interactable = interact(target) + * const drag = { name: drag, axis: 'x' } + * const resize = { name: resize, edges: { left: true, bottom: true } + * + * interactable.reflow(drag) + * interactable.reflow(resize) + * ``` + * + * Start an action sequence to re-apply modifiers, check drops, etc. + * + * @param { Object } action The action to begin + * @param { string } action.name The name of the action + * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended + */ + + Interactable.prototype.reflow = function (action) { + return reflow(this, action, scope); + }; +} + +function reflow(interactable, action, scope) { + var elements = _$index_58.is.string(interactable.target) ? _$index_58.arr.from(interactable._context.querySelectorAll(interactable.target)) : [interactable.target]; // tslint:disable-next-line variable-name + + var Promise = _$index_58.win.window.Promise; + var promises = Promise ? [] : null; + + var _loop = function _loop() { + _ref = elements[_i]; + var element = _ref; + var rect = interactable.getRect(element); + + if (!rect) { + return "break"; + } + + var runningInteraction = _$index_58.arr.find(scope.interactions.list, function (interaction) { + return interaction.interacting() && interaction.interactable === interactable && interaction.element === element && interaction.prepared.name === action.name; + }); + + var reflowPromise = void 0; + + if (runningInteraction) { + runningInteraction.move(); + + if (promises) { + reflowPromise = runningInteraction._reflowPromise || new Promise(function (resolve) { + runningInteraction._reflowResolve = resolve; + }); + } + } else { + var xywh = _$index_58.rect.tlbrToXywh(rect); + + var coords = { + page: { + x: xywh.x, + y: xywh.y + }, + client: { + x: xywh.x, + y: xywh.y + }, + timeStamp: scope.now() + }; + + var event = _$index_58.pointer.coordsToEvent(coords); + + reflowPromise = startReflow(scope, interactable, element, action, event); + } + + if (promises) { + promises.push(reflowPromise); + } + }; + + for (var _i = 0; _i < elements.length; _i++) { + var _ref; + + var _ret = _loop(); + + if (_ret === "break") break; + } + + return promises && Promise.all(promises).then(function () { + return interactable; + }); +} + +function startReflow(scope, interactable, element, action, event) { + var interaction = scope.interactions["new"]({ + pointerType: 'reflow' + }); + var signalArg = { + interaction: interaction, + event: event, + pointer: event, + eventTarget: element, + phase: 'reflow' + }; + interaction.interactable = interactable; + interaction.element = element; + interaction.prepared = (0, _$index_58.extend)({}, action); + interaction.prevEvent = event; + interaction.updatePointer(event, event, element, true); + + interaction._doPhase(signalArg); + + var reflowPromise = _$index_58.win.window.Promise ? new _$index_58.win.window.Promise(function (resolve) { + interaction._reflowResolve = resolve; + }) : null; + interaction._reflowPromise = reflowPromise; + interaction.start(action, interactable, element); + + if (interaction._interacting) { + interaction.move(signalArg); + interaction.end(event); + } else { + interaction.stop(); + } + + interaction.removePointer(event, event); + interaction.pointerIsDown = false; + return reflowPromise; +} + +var ___default_47 = { + id: 'reflow', + install: __install_47, + listeners: { + // remove completed reflow interactions + 'interactions:stop': function interactionsStop(_ref2, scope) { + var interaction = _ref2.interaction; + + if (interaction.pointerType === 'reflow') { + if (interaction._reflowResolve) { + interaction._reflowResolve(); + } + + _$index_58.arr.remove(scope.interactions.list, interaction); + } + } + } +}; +_$index_47["default"] = ___default_47; + +var _$index_27 = {}; +"use strict"; + +function ___typeof_27(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_27 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_27 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_27(obj); } + +Object.defineProperty(_$index_27, "__esModule", { + value: true +}); +_$index_27.init = __init_27; +_$index_27["default"] = _$index_27.scope = _$index_27.interact = void 0; + +_$index_48; + +var ___scope_27 = _$scope_24({}); + +var ___browser_27 = ___interopRequireDefault_27(_$browser_50); + +var ___events_27 = ___interopRequireDefault_27(_$events_54); + +var __utils_27 = ___interopRequireWildcard_27(_$index_58); + +function ___getRequireWildcardCache_27() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_27 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_27(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_27(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_27(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_27(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** @module interact */ +var globalEvents = {}; +var scope = new ___scope_27.Scope(); +_$index_27.scope = scope; + +function __init_27(win) { + scope.init(win); + return interact; +} +/** + * ```js + * interact('#draggable').draggable(true) + * + * var rectables = interact('rect') + * rectables + * .gesturable(true) + * .on('gesturemove', function (event) { + * // ... + * }) + * ``` + * + * The methods of this variable can be used to set elements as interactables + * and also to change various default settings. + * + * Calling it as a function and passing an element or a valid CSS selector + * string returns an Interactable object which has various methods to configure + * it. + * + * @global + * + * @param {Element | string} target The HTML or SVG Element to interact with + * or CSS selector + * @return {Interactable} + */ + + +var interact = function interact(target, options) { + var interactable = scope.interactables.get(target, options); + + if (!interactable) { + interactable = scope.interactables["new"](target, options); + interactable.events.global = globalEvents; + } + + return interactable; +}; +/** + * Use a plugin + * + * @alias module:interact.use + * + * @param {Object} plugin + * @param {function} plugin.install + * @return {interact} + */ + + +_$index_27.interact = interact; +interact.use = use; + +function use(plugin, options) { + scope.usePlugin(plugin, options); + return interact; +} +/** + * Check if an element or selector has been set with the {@link interact} + * function + * + * @alias module:interact.isSet + * + * @param {Element} element The Element being searched for + * @return {boolean} Indicates if the element or CSS selector was previously + * passed to interact + */ + + +interact.isSet = isSet; + +function isSet(target, options) { + return !!scope.interactables.get(target, options && options.context); +} +/** + * Add a global listener for an InteractEvent or adds a DOM event to `document` + * + * @alias module:interact.on + * + * @param {string | array | object} type The types of events to listen for + * @param {function} listener The function event (s) + * @param {object | boolean} [options] object or useCapture flag for + * addEventListener + * @return {object} interact + */ + + +interact.on = on; + +function on(type, listener, options) { + if (__utils_27.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_27.is.array(type)) { + for (var _i = 0; _i < type.length; _i++) { + var _ref; + + _ref = type[_i]; + var eventType = _ref; + interact.on(eventType, listener, options); + } + + return interact; + } + + if (__utils_27.is.object(type)) { + for (var prop in type) { + interact.on(prop, type[prop], listener); + } + + return interact; + } // if it is an InteractEvent type, add listener to globalEvents + + + if ((0, ___scope_27.isNonNativeEvent)(type, scope.actions)) { + // if this type of event was never bound + if (!globalEvents[type]) { + globalEvents[type] = [listener]; + } else { + globalEvents[type].push(listener); + } + } // If non InteractEvent type, addEventListener to document + else { + ___events_27["default"].add(scope.document, type, listener, { + options: options + }); + } + + return interact; +} +/** + * Removes a global InteractEvent listener or DOM event from `document` + * + * @alias module:interact.off + * + * @param {string | array | object} type The types of events that were listened + * for + * @param {function} listener The listener function to be removed + * @param {object | boolean} options [options] object or useCapture flag for + * removeEventListener + * @return {object} interact + */ + + +interact.off = off; + +function off(type, listener, options) { + if (__utils_27.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_27.is.array(type)) { + for (var _i2 = 0; _i2 < type.length; _i2++) { + var _ref2; + + _ref2 = type[_i2]; + var eventType = _ref2; + interact.off(eventType, listener, options); + } + + return interact; + } + + if (__utils_27.is.object(type)) { + for (var prop in type) { + interact.off(prop, type[prop], listener); + } + + return interact; + } + + if ((0, ___scope_27.isNonNativeEvent)(type, scope.actions)) { + var index; + + if (type in globalEvents && (index = globalEvents[type].indexOf(listener)) !== -1) { + globalEvents[type].splice(index, 1); + } + } else { + ___events_27["default"].remove(scope.document, type, listener, options); + } + + return interact; +} + +interact.debug = debug; + +function debug() { + return scope; +} // expose the functions used to calculate multi-touch properties + + +interact.getPointerAverage = __utils_27.pointer.pointerAverage; +interact.getTouchBBox = __utils_27.pointer.touchBBox; +interact.getTouchDistance = __utils_27.pointer.touchDistance; +interact.getTouchAngle = __utils_27.pointer.touchAngle; +interact.getElementRect = __utils_27.dom.getElementRect; +interact.getElementClientRect = __utils_27.dom.getElementClientRect; +interact.matchesSelector = __utils_27.dom.matchesSelector; +interact.closest = __utils_27.dom.closest; +/** + * @alias module:interact.supportsTouch + * + * @return {boolean} Whether or not the browser supports touch input + */ + +interact.supportsTouch = supportsTouch; + +function supportsTouch() { + return ___browser_27["default"].supportsTouch; +} +/** + * @alias module:interact.supportsPointerEvent + * + * @return {boolean} Whether or not the browser supports PointerEvents + */ + + +interact.supportsPointerEvent = supportsPointerEvent; + +function supportsPointerEvent() { + return ___browser_27["default"].supportsPointerEvent; +} +/** + * Cancels all interactions (end events are not fired) + * + * @alias module:interact.stop + * + * @return {object} interact + */ + + +interact.stop = __stop_27; + +function __stop_27() { + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref3; + + _ref3 = scope.interactions.list[_i3]; + var interaction = _ref3; + interaction.stop(); + } + + return interact; +} +/** + * Returns or sets the distance the pointer must be moved before an action + * sequence occurs. This also affects tolerance for tap events. + * + * @alias module:interact.pointerMoveTolerance + * + * @param {number} [newValue] The movement from the start position must be greater than this value + * @return {interact | number} + */ + + +interact.pointerMoveTolerance = pointerMoveTolerance; + +function pointerMoveTolerance(newValue) { + if (__utils_27.is.number(newValue)) { + scope.interactions.pointerMoveTolerance = newValue; + return interact; + } + + return scope.interactions.pointerMoveTolerance; +} + +interact.addDocument = function (doc, options) { + return scope.addDocument(doc, options); +}; + +interact.removeDocument = function (doc) { + return scope.removeDocument(doc); +}; // eslint-disable-next-line no-undef + + +interact.version = "1.9.4"; +scope.interact = interact; +var ___default_27 = interact; +_$index_27["default"] = ___default_27; + +var _$index_28 = {}; +"use strict"; + +Object.defineProperty(_$index_28, "__esModule", { + value: true +}); +_$index_28.init = __init_28; +_$index_28["default"] = void 0; + +_$index_48; + +var _index2 = ___interopRequireDefault_28(_$index_5); + +var _index3 = ___interopRequireDefault_28(_$index_7); + +var _index4 = ___interopRequireDefault_28(_$index_12); + +var _index5 = ___interopRequireDefault_28(_$index_25); + +var _index6 = ___interopRequireDefault_28(_$index_26); + +var _index7 = ___interopRequireDefault_28(_$index_33); + +var _offset = ___interopRequireDefault_28(_$index_41); + +var _index8 = ___interopRequireDefault_28(_$index_45); + +var _index9 = ___interopRequireDefault_28(_$index_47); + +var _index10 = ___interopRequireWildcard_28(_$index_27); + +function ___getRequireWildcardCache_28() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_28 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_28(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_28(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_28(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___interopRequireDefault_28(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_28(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_28 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_28 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_28(obj); } + +if ((typeof window === "undefined" ? "undefined" : ___typeof_28(window)) === 'object' && !!window) { + __init_28(window); +} + +var ___default_28 = _index10["default"]; +_$index_28["default"] = ___default_28; + +function __init_28(win) { + (0, _index10.init)(win); + + _index10["default"].use(_offset["default"]); // pointerEvents + + + _index10["default"].use(_index8["default"]); // inertia + + + _index10["default"].use(_index6["default"]); // snap, resize, etc. + + + _index10["default"].use(_index7["default"]); // autoStart, hold + + + _index10["default"].use(_index4["default"]); // drag and drop, resize, gesture + + + _index10["default"].use(_index2["default"]); // autoScroll + + + _index10["default"].use(_index3["default"]); // reflow + + + _index10["default"].use(_index9["default"]); // eslint-disable-next-line no-undef + + + if ("production" !== 'production') { + _index10["default"].use(_index5["default"]); + } + + return _index10["default"]; +} + +var _$index_69 = { exports: {} }; +"use strict"; + +Object.defineProperty(_$index_69.exports, "__esModule", { + value: true +}); +Object.defineProperty(_$index_69.exports, "init", { + enumerable: true, + get: function get() { + return ___index_69.init; + } +}); +_$index_69.exports["default"] = void 0; + +var ___index_69 = ___interopRequireWildcard_69(_$index_28); + +function ___getRequireWildcardCache_69() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); ___getRequireWildcardCache_69 = function _getRequireWildcardCache() { return cache; }; return cache; } + +function ___interopRequireWildcard_69(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || ___typeof_69(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = ___getRequireWildcardCache_69(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function ___typeof_69(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_69 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_69 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_69(obj); } + +if (("object" === "undefined" ? "undefined" : ___typeof_69(_$index_69)) === 'object' && !!_$index_69) { + try { + _$index_69.exports = ___index_69["default"]; + } catch (_unused) {} +} + +___index_69["default"]["default"] = ___index_69["default"]; +___index_69["default"].init = ___index_69.init; +var ___default_69 = ___index_69["default"]; +_$index_69.exports["default"] = ___default_69; + +_$index_69 = _$index_69.exports +return _$index_69; + +}); + +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2stZmxhdC9fcHJlbHVkZSIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9zY29wZS50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvaW50ZXJhY3Rpb25zLnRzIiwiLi4vQGludGVyYWN0anMvdHlwZXMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9pc1dpbmRvdy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL3dpbmRvdy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2lzLnRzIiwiLi4vQGludGVyYWN0anMvYWN0aW9ucy9kcmFnLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvYXJyLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZG9tT2JqZWN0cy50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2Jyb3dzZXIudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9jbG9uZS50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvcG9pbnRlckV4dGVuZC50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL2h5cG90LnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvcG9pbnRlclV0aWxzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZXZlbnRzLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvbm9ybWFsaXplTGlzdGVuZXJzLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9FdmVudGFibGUudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9yZWN0LnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvZ2V0T3JpZ2luWFkudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9yYWYudHMiLCIuLi9AaW50ZXJhY3Rqcy91dGlscy9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMudHMiLCIuLi9AaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZVNldC50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvQmFzZUV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9Qb2ludGVySW5mby50cyIsIi4uL0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24udHMiLCIuLi9AaW50ZXJhY3Rqcy9jb3JlL2ludGVyYWN0aW9uRmluZGVyLnRzIiwiLi4vQGludGVyYWN0anMvY29yZS9pbnRlcmFjdGFibGVQcmV2ZW50RGVmYXVsdC50cyIsIi4uL0BpbnRlcmFjdGpzL2FjdGlvbnMvZHJvcC9Ecm9wRXZlbnQudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL2Ryb3AvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL2dlc3R1cmUudHMiLCIuLi9AaW50ZXJhY3Rqcy9hY3Rpb25zL3Jlc2l6ZS50cyIsIi4uL0BpbnRlcmFjdGpzL2FjdGlvbnMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXNjcm9sbC9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvSW50ZXJhY3RhYmxlTWV0aG9kcy50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvYmFzZS50cyIsIi4uL0BpbnRlcmFjdGpzL2F1dG8tc3RhcnQvZHJhZ0F4aXMudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXN0YXJ0L2hvbGQudHMiLCIuLi9AaW50ZXJhY3Rqcy9hdXRvLXN0YXJ0L2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvZGV2LXRvb2xzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL01vZGlmaWNhdGlvbi50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9iYXNlLnRzIiwiLi4vQGludGVyYWN0anMvb2Zmc2V0L2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvaW5lcnRpYS9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9hc3BlY3RSYXRpby50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9yZXN0cmljdC9wb2ludGVyLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3Jlc3RyaWN0L2VkZ2VzLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3Jlc3RyaWN0L3JlY3QudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvcmVzdHJpY3Qvc2l6ZS50cyIsIi4uL0BpbnRlcmFjdGpzL21vZGlmaWVycy9zbmFwL3BvaW50ZXIudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvc25hcC9zaXplLnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL3NuYXAvZWRnZXMudHMiLCIuLi9AaW50ZXJhY3Rqcy9tb2RpZmllcnMvYWxsLnRzIiwiLi4vQGludGVyYWN0anMvdXRpbHMvc25hcHBlcnMvZ3JpZC50cyIsIi4uL0BpbnRlcmFjdGpzL3V0aWxzL3NuYXBwZXJzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvbW9kaWZpZXJzL2luZGV4LnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvUG9pbnRlckV2ZW50LnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvYmFzZS50cyIsIi4uL0BpbnRlcmFjdGpzL3BvaW50ZXItZXZlbnRzL2hvbGRSZXBlYXQudHMiLCIuLi9AaW50ZXJhY3Rqcy9wb2ludGVyLWV2ZW50cy9pbnRlcmFjdGFibGVUYXJnZXRzLnRzIiwiLi4vQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9yZWZsb3cvaW5kZXgudHMiLCIuLi9AaW50ZXJhY3Rqcy9pbnRlcmFjdC9pbmRleC50cyIsIi4uL0BpbnRlcmFjdGpzL2ludGVyYWN0anMvaW5kZXgudHMiLCJpbmRleC50cyIsIi4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2stZmxh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QSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsZUFBQSxFQXhDb0IsSUF3Q3BCLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsU0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsU0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxVQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFNBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLE9BQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLElBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxJQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxVQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsVUFBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxPQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7SUFBQSxvQkFBQSxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsT0FBQSxFQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0lBQUEsb0JBQUEsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFdBQUEsRUFBQSxLQUFBLENBQUEsQ0FBQSxDQUFBOztJQUFBLG9CQUFBLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxXQUFBLEVBQUEsS0FBQSxD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QUEsQ0FBQSxVQUFBLENBQUEsQ0FBQTs7Ozs7Ozs7QUFFQSxJQUFJLENBQUEsUUFBQSxLQUFBLFdBQUEsR0FBQSxXQUFBLEdBQUEsWUFBQSxDQUFPLFVBQVAsQ0FBQSxNQUFrQixRQUFsQixJQUE4QixDQUFDLENBQUMsVUFBcEMsRUFBNEM7RUFDMUMsSUFBSTtJQUFFLGtCQUFBLEdBQWlCLFdBQUEsQ0FBQSxTQUFBLENBQWpCLENBQUE7R0FBTixDQUNBLE9BQUEsT0FBQSxFQUFNLEVBQUU7Q0FDVDs7QUFFQSxXQUFBLENBQUEsU0FBQSxDQUFELENBQUEsU0FBQSxDQUFBLEdBQTRCLFdBQUEsQ0FBQSxTQUFBLENBQTVCLENBQUE7QUFDRSxXQUFBLENBQUEsU0FBQSxDQUFELENBQWtCLElBQWxCLEdBQXlCLFdBQUEsQ0FBQSxJQUF6QixDQUFBO29CQUVjLFdBQUEsQ0FBQSxTQUFBOzs7QUNWZjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5pbnRlcmFjdCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7XG52YXIgY3JlYXRlTW9kdWxlRmFjdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZU1vZHVsZUZhY3RvcnkodCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBlfHx0KGU9e2V4cG9ydHM6e30scGFyZW50OnJ9LGUuZXhwb3J0cyksZS5leHBvcnRzfX07XG4iLCJpbXBvcnQgKiBhcyBhcnIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYXJyJ1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcidcbmltcG9ydCBjbG9uZSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9jbG9uZSdcbmltcG9ydCB7IGdldEVsZW1lbnRSZWN0LCBtYXRjaGVzVXBUbywgbm9kZUNvbnRhaW5zLCB0cnlTZWxlY3RvciB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV2ZW50cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ldmVudHMnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IG5vcm1hbGl6ZUxpc3RlbmVycyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ub3JtYWxpemVMaXN0ZW5lcnMnXG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy93aW5kb3cnXG5pbXBvcnQgeyBBY3Rpb25EZWZhdWx0cywgRGVmYXVsdHMsIE9wdGlvbnMgfSBmcm9tICcuL2RlZmF1bHRPcHRpb25zJ1xuaW1wb3J0IEV2ZW50YWJsZSBmcm9tICcuL0V2ZW50YWJsZSdcbmltcG9ydCB7IEFjdGlvbnMsIGlzTm9uTmF0aXZlRXZlbnQgfSBmcm9tICcuL3Njb3BlJ1xuXG50eXBlIElnbm9yZVZhbHVlID0gc3RyaW5nIHwgSW50ZXJhY3QuRWxlbWVudCB8IGJvb2xlYW5cblxuLyoqICovXG5leHBvcnQgY2xhc3MgSW50ZXJhY3RhYmxlIGltcGxlbWVudHMgUGFydGlhbDxFdmVudGFibGU+IHtcbiAgcHJvdGVjdGVkIGdldCBfZGVmYXVsdHMgKCk6IERlZmF1bHRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmFzZToge30sXG4gICAgICBwZXJBY3Rpb246IHt9LFxuICAgICAgYWN0aW9uczoge30gYXMgQWN0aW9uRGVmYXVsdHMsXG4gICAgfVxuICB9XG5cbiAgcmVhZG9ubHkgb3B0aW9ucyE6IFJlcXVpcmVkPE9wdGlvbnM+XG4gIHJlYWRvbmx5IF9hY3Rpb25zOiBBY3Rpb25zXG4gIHJlYWRvbmx5IHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0XG4gIHJlYWRvbmx5IGV2ZW50cyA9IG5ldyBFdmVudGFibGUoKVxuICByZWFkb25seSBfY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50XG4gIHJlYWRvbmx5IF93aW46IFdpbmRvd1xuICByZWFkb25seSBfZG9jOiBEb2N1bWVudFxuXG4gIC8qKiAqL1xuICBjb25zdHJ1Y3RvciAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM6IGFueSwgZGVmYXVsdENvbnRleHQ6IERvY3VtZW50IHwgSW50ZXJhY3QuRWxlbWVudCkge1xuICAgIHRoaXMuX2FjdGlvbnMgPSBvcHRpb25zLmFjdGlvbnNcbiAgICB0aGlzLnRhcmdldCAgID0gdGFyZ2V0XG4gICAgdGhpcy5fY29udGV4dCA9IG9wdGlvbnMuY29udGV4dCB8fCBkZWZhdWx0Q29udGV4dFxuICAgIHRoaXMuX3dpbiAgICAgPSBnZXRXaW5kb3codHJ5U2VsZWN0b3IodGFyZ2V0KSA/IHRoaXMuX2NvbnRleHQgOiB0YXJnZXQpXG4gICAgdGhpcy5fZG9jICAgICA9IHRoaXMuX3dpbi5kb2N1bWVudFxuXG4gICAgdGhpcy5zZXQob3B0aW9ucylcbiAgfVxuXG4gIHNldE9uRXZlbnRzIChhY3Rpb25OYW1lOiBJbnRlcmFjdC5BY3Rpb25OYW1lLCBwaGFzZXM6IE5vbk51bGxhYmxlPGFueT4pIHtcbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25zdGFydCkpIHsgdGhpcy5vbihgJHthY3Rpb25OYW1lfXN0YXJ0YCwgcGhhc2VzLm9uc3RhcnQpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25tb3ZlKSkgeyB0aGlzLm9uKGAke2FjdGlvbk5hbWV9bW92ZWAsIHBoYXNlcy5vbm1vdmUpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25lbmQpKSB7IHRoaXMub24oYCR7YWN0aW9uTmFtZX1lbmRgLCBwaGFzZXMub25lbmQpIH1cbiAgICBpZiAoaXMuZnVuYyhwaGFzZXMub25pbmVydGlhc3RhcnQpKSB7IHRoaXMub24oYCR7YWN0aW9uTmFtZX1pbmVydGlhc3RhcnRgLCBwaGFzZXMub25pbmVydGlhc3RhcnQpIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1cGRhdGVQZXJBY3Rpb25MaXN0ZW5lcnMgKGFjdGlvbk5hbWU6IEludGVyYWN0LkFjdGlvbk5hbWUsIHByZXY6IEludGVyYWN0Lkxpc3RlbmVycywgY3VyOiBJbnRlcmFjdC5MaXN0ZW5lcnMpIHtcbiAgICBpZiAoaXMuYXJyYXkocHJldikgfHwgaXMub2JqZWN0KHByZXYpKSB7XG4gICAgICB0aGlzLm9mZihhY3Rpb25OYW1lLCBwcmV2KVxuICAgIH1cblxuICAgIGlmIChpcy5hcnJheShjdXIpIHx8IGlzLm9iamVjdChjdXIpKSB7XG4gICAgICB0aGlzLm9uKGFjdGlvbk5hbWUsIGN1cilcbiAgICB9XG4gIH1cblxuICBzZXRQZXJBY3Rpb24gKGFjdGlvbk5hbWU6IEludGVyYWN0LkFjdGlvbk5hbWUsIG9wdGlvbnM6IEludGVyYWN0Lk9yQm9vbGVhbjxPcHRpb25zPikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5fZGVmYXVsdHNcblxuICAgIC8vIGZvciBhbGwgdGhlIGRlZmF1bHQgcGVyLWFjdGlvbiBvcHRpb25zXG4gICAgZm9yIChjb25zdCBvcHRpb25OYW1lXyBpbiBvcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHRpb25OYW1lID0gb3B0aW9uTmFtZV8gYXMga2V5b2YgSW50ZXJhY3QuUGVyQWN0aW9uRGVmYXVsdHNcbiAgICAgIGNvbnN0IGFjdGlvbk9wdGlvbnMgPSB0aGlzLm9wdGlvbnNbYWN0aW9uTmFtZV1cbiAgICAgIGNvbnN0IG9wdGlvblZhbHVlOiBhbnkgPSBvcHRpb25zW29wdGlvbk5hbWVdXG5cbiAgICAgIC8vIHJlbW92ZSBvbGQgZXZlbnQgbGlzdGVuZXJzIGFuZCBhZGQgbmV3IG9uZXNcbiAgICAgIGlmIChvcHRpb25OYW1lID09PSAnbGlzdGVuZXJzJykge1xuICAgICAgICB0aGlzLnVwZGF0ZVBlckFjdGlvbkxpc3RlbmVycyhhY3Rpb25OYW1lLCBhY3Rpb25PcHRpb25zLmxpc3RlbmVycywgb3B0aW9uVmFsdWUgYXMgSW50ZXJhY3QuTGlzdGVuZXJzKVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgb3B0aW9uIHZhbHVlIGlzIGFuIGFycmF5XG4gICAgICBpZiAoaXMuYXJyYXk8YW55PihvcHRpb25WYWx1ZSkpIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IGFyci5mcm9tKG9wdGlvblZhbHVlKVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBhbiBvYmplY3RcbiAgICAgIGVsc2UgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvblZhbHVlKSkge1xuICAgICAgICAvLyBjb3B5IHRoZSBvYmplY3RcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IGV4dGVuZChcbiAgICAgICAgICBhY3Rpb25PcHRpb25zW29wdGlvbk5hbWVdIHx8IHt9IGFzIGFueSxcbiAgICAgICAgICBjbG9uZShvcHRpb25WYWx1ZSkpXG5cbiAgICAgICAgLy8gc2V0IGFuYWJsZWQgZmllbGQgdG8gdHJ1ZSBpZiBpdCBleGlzdHMgaW4gdGhlIGRlZmF1bHRzXG4gICAgICAgIGlmIChpcy5vYmplY3QoZGVmYXVsdHMucGVyQWN0aW9uW29wdGlvbk5hbWVdKSAmJiAnZW5hYmxlZCcgaW4gKGRlZmF1bHRzLnBlckFjdGlvbltvcHRpb25OYW1lXSBhcyBhbnkpKSB7XG4gICAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KS5lbmFibGVkID0gb3B0aW9uVmFsdWUuZW5hYmxlZCAhPT0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBhIGJvb2xlYW4gYW5kIHRoZSBkZWZhdWx0IGlzIGFuIG9iamVjdFxuICAgICAgZWxzZSBpZiAoaXMuYm9vbChvcHRpb25WYWx1ZSkgJiYgaXMub2JqZWN0KGRlZmF1bHRzLnBlckFjdGlvbltvcHRpb25OYW1lXSkpIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KS5lbmFibGVkID0gb3B0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIGlmIGl0J3MgYW55dGhpbmcgZWxzZSwgZG8gYSBwbGFpbiBhc3NpZ25tZW50XG4gICAgICBlbHNlIHtcbiAgICAgICAgKGFjdGlvbk9wdGlvbnNbb3B0aW9uTmFtZV0gYXMgYW55KSA9IG9wdGlvblZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHRvIGdldCBhbiBJbnRlcmFjdGFibGVzIGJvdW5kaW5nIHJlY3QuIENhbiBiZVxuICAgKiBvdmVycmlkZGVuIHVzaW5nIHtAbGluayBJbnRlcmFjdGFibGUucmVjdENoZWNrZXJ9LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbGVtZW50XSBUaGUgZWxlbWVudCB0byBtZWFzdXJlLlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBvYmplY3QncyBib3VuZGluZyByZWN0YW5nbGUuXG4gICAqL1xuICBnZXRSZWN0IChlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gICAgZWxlbWVudCA9IGVsZW1lbnQgfHwgKGlzLmVsZW1lbnQodGhpcy50YXJnZXQpXG4gICAgICA/IHRoaXMudGFyZ2V0XG4gICAgICA6IG51bGwpXG5cbiAgICBpZiAoaXMuc3RyaW5nKHRoaXMudGFyZ2V0KSkge1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnQgfHwgdGhpcy5fY29udGV4dC5xdWVyeVNlbGVjdG9yKHRoaXMudGFyZ2V0KVxuICAgIH1cblxuICAgIHJldHVybiBnZXRFbGVtZW50UmVjdChlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBjYWxjdWxhdGUgdGhlIGludGVyYWN0YWJsZSdzXG4gICAqIGVsZW1lbnQncyByZWN0YW5nbGVcbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NoZWNrZXJdIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGlzIEludGVyYWN0YWJsZSdzXG4gICAqIGJvdW5kaW5nIHJlY3RhbmdsZS4gU2VlIHtAbGluayBJbnRlcmFjdGFibGUuZ2V0UmVjdH1cbiAgICogQHJldHVybiB7ZnVuY3Rpb24gfCBvYmplY3R9IFRoZSBjaGVja2VyIGZ1bmN0aW9uIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICByZWN0Q2hlY2tlciAoY2hlY2tlcjogKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpID0+IGFueSkge1xuICAgIGlmIChpcy5mdW5jKGNoZWNrZXIpKSB7XG4gICAgICB0aGlzLmdldFJlY3QgPSBjaGVja2VyXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrZXIgPT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmdldFJlY3RcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRSZWN0XG4gIH1cblxuICBfYmFja0NvbXBhdE9wdGlvbiAob3B0aW9uTmFtZToga2V5b2YgSW50ZXJhY3QuT3B0aW9ucywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0cnlTZWxlY3RvcihuZXdWYWx1ZSkgfHwgaXMub2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgKHRoaXMub3B0aW9uc1tvcHRpb25OYW1lXSBhcyBhbnkpID0gbmV3VmFsdWVcblxuICAgICAgZm9yIChjb25zdCBhY3Rpb24gaW4gdGhpcy5fYWN0aW9ucy5tYXApIHtcbiAgICAgICAgKHRoaXMub3B0aW9uc1thY3Rpb25dW29wdGlvbk5hbWVdIGFzIGFueSkgPSBuZXdWYWx1ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbb3B0aW9uTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWdpbiBvZiB0aGUgSW50ZXJhY3RhYmxlJ3MgZWxlbWVudC4gIFRoZSB4IGFuZCB5XG4gICAqIG9mIHRoZSBvcmlnaW4gd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gYWN0aW9uIGV2ZW50IGNvb3JkaW5hdGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnQgfCBvYmplY3QgfCBzdHJpbmd9IFtvcmlnaW5dIEFuIEhUTUwgb3IgU1ZHIEVsZW1lbnQgd2hvc2VcbiAgICogcmVjdCB3aWxsIGJlIHVzZWQsIGFuIG9iamVjdCBlZy4geyB4OiAwLCB5OiAwIH0gb3Igc3RyaW5nICdwYXJlbnQnLCAnc2VsZidcbiAgICogb3IgYW55IENTUyBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBjdXJyZW50IG9yaWdpbiBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgb3JpZ2luIChuZXdWYWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tDb21wYXRPcHRpb24oJ29yaWdpbicsIG5ld1ZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB0aGUgbW91c2UgY29vcmRpbmF0ZSB0eXBlcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGVcbiAgICogbW92ZW1lbnQgb2YgdGhlIHBvaW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmV3VmFsdWVdIFVzZSAnY2xpZW50JyBpZiB5b3Ugd2lsbCBiZSBzY3JvbGxpbmcgd2hpbGVcbiAgICogaW50ZXJhY3Rpbmc7IFVzZSAncGFnZScgaWYgeW91IHdhbnQgYXV0b1Njcm9sbCB0byB3b3JrXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IG9iamVjdH0gVGhlIGN1cnJlbnQgZGVsdGFTb3VyY2Ugb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIGRlbHRhU291cmNlIChuZXdWYWx1ZT86IHN0cmluZykge1xuICAgIGlmIChuZXdWYWx1ZSA9PT0gJ3BhZ2UnIHx8IG5ld1ZhbHVlID09PSAnY2xpZW50Jykge1xuICAgICAgdGhpcy5vcHRpb25zLmRlbHRhU291cmNlID0gbmV3VmFsdWVcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRlbHRhU291cmNlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2VsZWN0b3IgY29udGV4dCBOb2RlIG9mIHRoZSBJbnRlcmFjdGFibGUuIFRoZSBkZWZhdWx0IGlzXG4gICAqIGB3aW5kb3cuZG9jdW1lbnRgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtOb2RlfSBUaGUgY29udGV4dCBOb2RlIG9mIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBjb250ZXh0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dFxuICB9XG5cbiAgaW5Db250ZXh0IChlbGVtZW50OiBEb2N1bWVudCB8IE5vZGUpIHtcbiAgICByZXR1cm4gKHRoaXMuX2NvbnRleHQgPT09IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fFxuICAgICAgICAgICAgbm9kZUNvbnRhaW5zKHRoaXMuX2NvbnRleHQsIGVsZW1lbnQpKVxuICB9XG5cbiAgdGVzdElnbm9yZUFsbG93IChcbiAgICB0aGlzOiBJbnRlcmFjdGFibGUsXG4gICAgb3B0aW9uczogeyBpZ25vcmVGcm9tPzogSWdub3JlVmFsdWUsIGFsbG93RnJvbT86IElnbm9yZVZhbHVlIH0sXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsXG4gICkge1xuICAgIHJldHVybiAoIXRoaXMudGVzdElnbm9yZShvcHRpb25zLmlnbm9yZUZyb20sIHRhcmdldE5vZGUsIGV2ZW50VGFyZ2V0KSAmJlxuICAgICAgICAgICAgdGhpcy50ZXN0QWxsb3cob3B0aW9ucy5hbGxvd0Zyb20sIHRhcmdldE5vZGUsIGV2ZW50VGFyZ2V0KSlcbiAgfVxuXG4gIHRlc3RBbGxvdyAoXG4gICAgdGhpczogSW50ZXJhY3RhYmxlLFxuICAgIGFsbG93RnJvbTogSWdub3JlVmFsdWUsXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgKSB7XG4gICAgaWYgKCFhbGxvd0Zyb20pIHsgcmV0dXJuIHRydWUgfVxuXG4gICAgaWYgKCFpcy5lbGVtZW50KGVsZW1lbnQpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoaXMuc3RyaW5nKGFsbG93RnJvbSkpIHtcbiAgICAgIHJldHVybiBtYXRjaGVzVXBUbyhlbGVtZW50LCBhbGxvd0Zyb20sIHRhcmdldE5vZGUpXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLmVsZW1lbnQoYWxsb3dGcm9tKSkge1xuICAgICAgcmV0dXJuIG5vZGVDb250YWlucyhhbGxvd0Zyb20sIGVsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB0ZXN0SWdub3JlIChcbiAgICB0aGlzOiBJbnRlcmFjdGFibGUsXG4gICAgaWdub3JlRnJvbTogSWdub3JlVmFsdWUsXG4gICAgdGFyZ2V0Tm9kZTogTm9kZSxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgKSB7XG4gICAgaWYgKCFpZ25vcmVGcm9tIHx8ICFpcy5lbGVtZW50KGVsZW1lbnQpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoaXMuc3RyaW5nKGlnbm9yZUZyb20pKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlc1VwVG8oZWxlbWVudCwgaWdub3JlRnJvbSwgdGFyZ2V0Tm9kZSlcbiAgICB9XG4gICAgZWxzZSBpZiAoaXMuZWxlbWVudChpZ25vcmVGcm9tKSkge1xuICAgICAgcmV0dXJuIG5vZGVDb250YWlucyhpZ25vcmVGcm9tLCBlbGVtZW50KVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIEludGVyYWN0RXZlbnQgdHlwZSBib3VuZCBnbG9iYWxseVxuICAgKiBhbmQgZGlyZWN0bHkgdG8gdGhpcyBJbnRlcmFjdGFibGVcbiAgICpcbiAgICogQHBhcmFtIHtJbnRlcmFjdEV2ZW50fSBpRXZlbnQgVGhlIEludGVyYWN0RXZlbnQgb2JqZWN0IHRvIGJlIGZpcmVkIG9uIHRoaXNcbiAgICogSW50ZXJhY3RhYmxlXG4gICAqIEByZXR1cm4ge0ludGVyYWN0YWJsZX0gdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIGZpcmUgKGlFdmVudDogb2JqZWN0KSB7XG4gICAgdGhpcy5ldmVudHMuZmlyZShpRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX29uT2ZmIChtZXRob2Q6ICdvbicgfCAnb2ZmJywgdHlwZUFyZzogSW50ZXJhY3QuRXZlbnRUeXBlcywgbGlzdGVuZXJBcmc/OiBJbnRlcmFjdC5MaXN0ZW5lcnNBcmcgfCBudWxsLCBvcHRpb25zPzogYW55KSB7XG4gICAgaWYgKGlzLm9iamVjdCh0eXBlQXJnKSAmJiAhaXMuYXJyYXkodHlwZUFyZykpIHtcbiAgICAgIG9wdGlvbnMgPSBsaXN0ZW5lckFyZ1xuICAgICAgbGlzdGVuZXJBcmcgPSBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgYWRkUmVtb3ZlID0gbWV0aG9kID09PSAnb24nID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5vcm1hbGl6ZUxpc3RlbmVycyh0eXBlQXJnLCBsaXN0ZW5lckFyZylcblxuICAgIGZvciAobGV0IHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ3doZWVsJykgeyB0eXBlID0gYnJvd3Nlci53aGVlbEV2ZW50IH1cblxuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgLy8gaWYgaXQgaXMgYW4gYWN0aW9uIGV2ZW50IHR5cGVcbiAgICAgICAgaWYgKGlzTm9uTmF0aXZlRXZlbnQodHlwZSwgdGhpcy5fYWN0aW9ucykpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50c1ttZXRob2RdKHR5cGUsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICAgIC8vIGRlbGVnYXRlZCBldmVudFxuICAgICAgICBlbHNlIGlmIChpcy5zdHJpbmcodGhpcy50YXJnZXQpKSB7XG4gICAgICAgICAgZXZlbnRzW2Ake2FkZFJlbW92ZX1EZWxlZ2F0ZWAgYXMgJ2FkZERlbGVnYXRlJyB8ICdyZW1vdmVEZWxlZ2F0ZSddKHRoaXMudGFyZ2V0LCB0aGlzLl9jb250ZXh0LCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgbGlzdGVuZXIgZnJvbSB0aGlzIEludGVyYWN0YWJsZSdzIGVsZW1lbnRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgKGV2ZW50c1thZGRSZW1vdmVdIGFzIHR5cGVvZiBldmVudHMucmVtb3ZlKSh0aGlzLnRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgbGlzdGVuZXIgZm9yIGFuIEludGVyYWN0RXZlbnQsIHBvaW50ZXJFdmVudCBvciBET00gZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGVzIFRoZSB0eXBlcyBvZiBldmVudHMgdG8gbGlzdGVuXG4gICAqIGZvclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgYXJyYXkgfCBvYmplY3R9IFtsaXN0ZW5lcl0gVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uKHMpXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAgICogYWRkRXZlbnRMaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBvbiAodHlwZXM6IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyPzogSW50ZXJhY3QuTGlzdGVuZXJzQXJnLCBvcHRpb25zPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uT2ZmKCdvbicsIHR5cGVzLCBsaXN0ZW5lciwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIEludGVyYWN0RXZlbnQsIHBvaW50ZXJFdmVudCBvciBET00gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGVzIFRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCB3ZXJlXG4gICAqIGxpc3RlbmVkIGZvclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgYXJyYXkgfCBvYmplY3R9IFtsaXN0ZW5lcl0gVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uKHMpXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAgICogcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBvZmYgKHR5cGVzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyPzogSW50ZXJhY3QuTGlzdGVuZXJzQXJnLCBvcHRpb25zPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uT2ZmKCdvZmYnLCB0eXBlcywgbGlzdGVuZXIsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIG9wdGlvbnMgb2YgdGhpcyBJbnRlcmFjdGFibGVcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG5ldyBzZXR0aW5ncyB0byBhcHBseVxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBzZXQgKG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnNBcmcpIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuX2RlZmF1bHRzXG5cbiAgICBpZiAoIWlzLm9iamVjdChvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgKHRoaXMub3B0aW9ucyBhcyBSZXF1aXJlZDxPcHRpb25zPikgPSBjbG9uZShkZWZhdWx0cy5iYXNlKSBhcyBSZXF1aXJlZDxPcHRpb25zPlxuXG4gICAgZm9yIChjb25zdCBhY3Rpb25OYW1lXyBpbiB0aGlzLl9hY3Rpb25zLm1ldGhvZERpY3QpIHtcbiAgICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBhY3Rpb25OYW1lXyBhcyBJbnRlcmFjdC5BY3Rpb25OYW1lXG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gdGhpcy5fYWN0aW9ucy5tZXRob2REaWN0W2FjdGlvbk5hbWVdXG5cbiAgICAgIHRoaXMub3B0aW9uc1thY3Rpb25OYW1lXSA9IHt9XG4gICAgICB0aGlzLnNldFBlckFjdGlvbihhY3Rpb25OYW1lLCBleHRlbmQoZXh0ZW5kKHt9LCBkZWZhdWx0cy5wZXJBY3Rpb24pLCBkZWZhdWx0cy5hY3Rpb25zW2FjdGlvbk5hbWVdKSlcblxuICAgICAgdGhpc1ttZXRob2ROYW1lXShvcHRpb25zW2FjdGlvbk5hbWVdKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoaXMuZnVuYyh0aGlzW3NldHRpbmddKSkge1xuICAgICAgICB0aGlzW3NldHRpbmddKG9wdGlvbnNbc2V0dGluZ10pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyBpbnRlcmFjdGFibGUgZnJvbSB0aGUgbGlzdCBvZiBpbnRlcmFjdGFibGVzIGFuZCByZW1vdmUgaXQnc1xuICAgKiBhY3Rpb24gY2FwYWJpbGl0aWVzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICpcbiAgICogQHJldHVybiB7aW50ZXJhY3R9XG4gICAqL1xuICB1bnNldCAoKSB7XG4gICAgZXZlbnRzLnJlbW92ZSh0aGlzLnRhcmdldCBhcyBOb2RlLCAnYWxsJylcblxuICAgIGlmIChpcy5zdHJpbmcodGhpcy50YXJnZXQpKSB7XG4gICAgICAvLyByZW1vdmUgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgZm9yIChjb25zdCB0eXBlIGluIGV2ZW50cy5kZWxlZ2F0ZWRFdmVudHMpIHtcbiAgICAgICAgY29uc3QgZGVsZWdhdGVkID0gZXZlbnRzLmRlbGVnYXRlZEV2ZW50c1t0eXBlXVxuXG4gICAgICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzWzBdID09PSB0aGlzLnRhcmdldCAmJlxuICAgICAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzWzBdID09PSB0aGlzLl9jb250ZXh0KSB7XG4gICAgICAgICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5zcGxpY2UoMCwgMSlcbiAgICAgICAgICBkZWxlZ2F0ZWQuY29udGV4dHMuc3BsaWNlKDAsIDEpXG4gICAgICAgICAgZGVsZWdhdGVkLmxpc3RlbmVycy5zcGxpY2UoMCwgMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50cy5yZW1vdmUodGhpcy5fY29udGV4dCwgdHlwZSwgZXZlbnRzLmRlbGVnYXRlTGlzdGVuZXIpXG4gICAgICAgIGV2ZW50cy5yZW1vdmUodGhpcy5fY29udGV4dCwgdHlwZSwgZXZlbnRzLmRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBldmVudHMucmVtb3ZlKHRoaXMudGFyZ2V0IGFzIE5vZGUsICdhbGwnKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcmFjdGFibGVcbiIsImltcG9ydCBkb21PYmplY3RzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbU9iamVjdHMnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRPcHRpb25zJ1xuaW1wb3J0IEV2ZW50YWJsZSBmcm9tICcuL0V2ZW50YWJsZSdcbmltcG9ydCBJbnRlcmFjdGFibGVCYXNlIGZyb20gJy4vSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IEludGVyYWN0YWJsZVNldCBmcm9tICcuL0ludGVyYWN0YWJsZVNldCdcbmltcG9ydCBJbnRlcmFjdEV2ZW50LCB7IFBoYXNlTWFwIH0gZnJvbSAnLi9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0IGludGVyYWN0aW9ucyBmcm9tICcuL2ludGVyYWN0aW9ucydcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBcmdzIHtcbiAgJ3Njb3BlOmFkZC1kb2N1bWVudCc6IERvY1NpZ25hbEFyZ1xuICAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JzogRG9jU2lnbmFsQXJnXG4gICdpbnRlcmFjdGFibGU6dW5zZXQnOiB7IGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlQmFzZSB9XG4gICdpbnRlcmFjdGFibGU6c2V0JzogeyBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZUJhc2UsIG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnMgfVxuICAnaW50ZXJhY3Rpb25zOmRlc3Ryb3knOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9XG59XG5cbmV4cG9ydCB0eXBlIExpc3RlbmVyTmFtZSA9IGtleW9mIFNpZ25hbEFyZ3NcblxuZXhwb3J0IHR5cGUgTGlzdGVuZXJNYXAgPSB7XG4gIFtQIGluIExpc3RlbmVyTmFtZV0/OiAoYXJnOiBTaWduYWxBcmdzW1BdLCBzY29wZTogU2NvcGUsIHNpZ25hbE5hbWU6IFApID0+IHZvaWQgfCBib29sZWFuXG59XG5cbmludGVyZmFjZSBEb2NTaWduYWxBcmcge1xuICBkb2M6IERvY3VtZW50XG4gIHdpbmRvdzogV2luZG93XG4gIHNjb3BlOiBTY29wZVxuICBvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9XG59XG5cbmNvbnN0IHtcbiAgd2luLFxuICBicm93c2VyLFxuICByYWYsXG4gIGV2ZW50cyxcbn0gPSB1dGlsc1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25NYXAgeyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lIG5vLWVtcHR5LWludGVyZmFjZVxufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25OYW1lID0ga2V5b2YgQWN0aW9uTWFwXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9ucyB7XG4gIG1hcDogQWN0aW9uTWFwXG4gIHBoYXNlczogUGhhc2VNYXBcbiAgbWV0aG9kRGljdDogeyBbUCBpbiBBY3Rpb25OYW1lXT86IHN0cmluZyB9XG4gIHBoYXNlbGVzc1R5cGVzOiB7IFt0eXBlOiBzdHJpbmddOiB0cnVlIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjb3BlICgpIHtcbiAgcmV0dXJuIG5ldyBTY29wZSgpXG59XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRzID0gdHlwZW9mIGRlZmF1bHRzXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIGlkPzogc3RyaW5nXG4gIGxpc3RlbmVycz86IExpc3RlbmVyTWFwXG4gIGJlZm9yZT86IHN0cmluZ1tdXG4gIGluc3RhbGw/IChzY29wZTogU2NvcGUsIG9wdGlvbnM/OiBhbnkpOiB2b2lkXG59XG5cbmV4cG9ydCBjbGFzcyBTY29wZSB7XG4gIGlkID0gYF9faW50ZXJhY3Rfc2NvcGVfJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDApfWBcbiAgaXNJbml0aWFsaXplZCA9IGZhbHNlXG4gIGxpc3RlbmVyTWFwczogQXJyYXk8e1xuICAgIG1hcDogTGlzdGVuZXJNYXBcbiAgICBpZDogc3RyaW5nXG4gIH0+ID0gW11cblxuICBicm93c2VyID0gYnJvd3NlclxuICBldmVudHMgPSBldmVudHNcbiAgdXRpbHMgPSB1dGlsc1xuICBkZWZhdWx0czogRGVmYXVsdHMgPSB1dGlscy5jbG9uZShkZWZhdWx0cykgYXMgRGVmYXVsdHNcbiAgRXZlbnRhYmxlID0gRXZlbnRhYmxlXG4gIGFjdGlvbnM6IEFjdGlvbnMgPSB7XG4gICAgbWFwOiB7fSxcbiAgICBwaGFzZXM6IHtcbiAgICAgIHN0YXJ0OiB0cnVlLFxuICAgICAgbW92ZTogdHJ1ZSxcbiAgICAgIGVuZDogdHJ1ZSxcbiAgICB9LFxuICAgIG1ldGhvZERpY3Q6IHt9LFxuICAgIHBoYXNlbGVzc1R5cGVzOiB7fSxcbiAgfVxuXG4gIEludGVyYWN0RXZlbnQgPSBJbnRlcmFjdEV2ZW50XG4gIEludGVyYWN0YWJsZSE6IHR5cGVvZiBJbnRlcmFjdGFibGVCYXNlXG4gIGludGVyYWN0YWJsZXMgPSBuZXcgSW50ZXJhY3RhYmxlU2V0KHRoaXMpXG5cbiAgLy8gbWFpbiB3aW5kb3dcbiAgX3dpbiE6IFdpbmRvd1xuXG4gIC8vIG1haW4gZG9jdW1lbnRcbiAgZG9jdW1lbnQhOiBEb2N1bWVudFxuXG4gIC8vIG1haW4gd2luZG93XG4gIHdpbmRvdyE6IFdpbmRvd1xuXG4gIC8vIGFsbCBkb2N1bWVudHMgYmVpbmcgbGlzdGVuZWQgdG9cbiAgZG9jdW1lbnRzOiBBcnJheTx7IGRvYzogRG9jdW1lbnQsIG9wdGlvbnM6IGFueSB9PiA9IFtdXG5cbiAgX3BsdWdpbnM6IHtcbiAgICBsaXN0OiBQbHVnaW5bXVxuICAgIG1hcDogeyBbaWQ6IHN0cmluZ106IFBsdWdpbiB9XG4gIH0gPSB7XG4gICAgbGlzdDogW10sXG4gICAgbWFwOiB7fSxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXNcblxuICAgIHRoaXMuSW50ZXJhY3RhYmxlID0gY2xhc3MgZXh0ZW5kcyBJbnRlcmFjdGFibGVCYXNlIHtcbiAgICAgIGdldCBfZGVmYXVsdHMgKCkgeyByZXR1cm4gc2NvcGUuZGVmYXVsdHMgfVxuXG4gICAgICBzZXQgKG9wdGlvbnM6IEludGVyYWN0Lk9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIuc2V0KG9wdGlvbnMpXG5cbiAgICAgICAgc2NvcGUuZmlyZSgnaW50ZXJhY3RhYmxlOnNldCcsIHtcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGludGVyYWN0YWJsZTogdGhpcyxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfVxuXG4gICAgICB1bnNldCAoKSB7XG4gICAgICAgIHN1cGVyLnVuc2V0KClcbiAgICAgICAgc2NvcGUuaW50ZXJhY3RhYmxlcy5saXN0LnNwbGljZShzY29wZS5pbnRlcmFjdGFibGVzLmxpc3QuaW5kZXhPZih0aGlzKSwgMSlcblxuICAgICAgICBzY29wZS5maXJlKCdpbnRlcmFjdGFibGU6dW5zZXQnLCB7IGludGVyYWN0YWJsZTogdGhpcyB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZExpc3RlbmVycyAobWFwOiBMaXN0ZW5lck1hcCwgaWQ/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxpc3RlbmVyTWFwcy5wdXNoKHsgaWQsIG1hcCB9KVxuICB9XG5cbiAgZmlyZTxUIGV4dGVuZHMgTGlzdGVuZXJOYW1lPiAobmFtZTogVCwgYXJnOiBTaWduYWxBcmdzW1RdKTogdm9pZCB8IGZhbHNlIHtcbiAgICBmb3IgKGNvbnN0IHsgbWFwOiB7IFtuYW1lXTogbGlzdGVuZXIgfSB9IG9mIHRoaXMubGlzdGVuZXJNYXBzKSB7XG4gICAgICBpZiAoISFsaXN0ZW5lciAmJiBsaXN0ZW5lcihhcmcgYXMgYW55LCB0aGlzLCBuYW1lIGFzIG5ldmVyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25XaW5kb3dVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB0aGlzLnJlbW92ZURvY3VtZW50KGV2ZW50LnRhcmdldCBhcyBEb2N1bWVudClcblxuICBpbml0ICh3aW5kb3c6IFdpbmRvdykge1xuICAgIHJldHVybiB0aGlzLmlzSW5pdGlhbGl6ZWRcbiAgICAgID8gdGhpc1xuICAgICAgOiBpbml0U2NvcGUodGhpcywgd2luZG93KVxuICB9XG5cbiAgcGx1Z2luSXNJbnN0YWxsZWQgKHBsdWdpbjogUGx1Z2luKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsdWdpbnMubWFwW3BsdWdpbi5pZF0gfHwgdGhpcy5fcGx1Z2lucy5saXN0LmluZGV4T2YocGx1Z2luKSAhPT0gLTFcbiAgfVxuXG4gIHVzZVBsdWdpbiAocGx1Z2luOiBQbHVnaW4sIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gICAgaWYgKHRoaXMucGx1Z2luSXNJbnN0YWxsZWQocGx1Z2luKSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmlkKSB7IHRoaXMuX3BsdWdpbnMubWFwW3BsdWdpbi5pZF0gPSBwbHVnaW4gfVxuICAgIHRoaXMuX3BsdWdpbnMubGlzdC5wdXNoKHBsdWdpbilcblxuICAgIGlmIChwbHVnaW4uaW5zdGFsbCkge1xuICAgICAgcGx1Z2luLmluc3RhbGwodGhpcywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmxpc3RlbmVycyAmJiBwbHVnaW4uYmVmb3JlKSB7XG4gICAgICBsZXQgaW5kZXggPSAwXG4gICAgICBjb25zdCBsZW4gPSB0aGlzLmxpc3RlbmVyTWFwcy5sZW5ndGhcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHBsdWdpbi5iZWZvcmUucmVkdWNlKChhY2MsIGlkKSA9PiB7XG4gICAgICAgIGFjY1tpZF0gPSB0cnVlXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIHt9KVxuXG4gICAgICBmb3IgKDsgaW5kZXggPCBsZW47IGluZGV4KyspIHtcbiAgICAgICAgY29uc3Qgb3RoZXJJZCA9IHRoaXMubGlzdGVuZXJNYXBzW2luZGV4XS5pZFxuXG4gICAgICAgIGlmIChiZWZvcmVbb3RoZXJJZF0pIHsgYnJlYWsgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmxpc3RlbmVyTWFwcy5zcGxpY2UoaW5kZXgsIDAsIHsgaWQ6IHBsdWdpbi5pZCwgbWFwOiBwbHVnaW4ubGlzdGVuZXJzIH0pXG4gICAgfVxuICAgIGVsc2UgaWYgKHBsdWdpbi5saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJNYXBzLnB1c2goeyBpZDogcGx1Z2luLmlkLCBtYXA6IHBsdWdpbi5saXN0ZW5lcnMgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgYWRkRG9jdW1lbnQgKGRvYzogRG9jdW1lbnQsIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHwgZmFsc2Uge1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgZG9jdW1lbnQgaXMgYWxyZWFkeSBrbm93blxuICAgIGlmICh0aGlzLmdldERvY0luZGV4KGRvYykgIT09IC0xKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBjb25zdCB3aW5kb3cgPSB3aW4uZ2V0V2luZG93KGRvYylcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zID8gdXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IHt9XG5cbiAgICB0aGlzLmRvY3VtZW50cy5wdXNoKHsgZG9jLCBvcHRpb25zIH0pXG4gICAgZXZlbnRzLmRvY3VtZW50cy5wdXNoKGRvYylcblxuICAgIC8vIGRvbid0IGFkZCBhbiB1bmxvYWQgZXZlbnQgZm9yIHRoZSBtYWluIGRvY3VtZW50XG4gICAgLy8gc28gdGhhdCB0aGUgcGFnZSBtYXkgYmUgY2FjaGVkIGluIGJyb3dzZXIgaGlzdG9yeVxuICAgIGlmIChkb2MgIT09IHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgIGV2ZW50cy5hZGQod2luZG93LCAndW5sb2FkJywgdGhpcy5vbldpbmRvd1VubG9hZClcbiAgICB9XG5cbiAgICB0aGlzLmZpcmUoJ3Njb3BlOmFkZC1kb2N1bWVudCcsIHsgZG9jLCB3aW5kb3csIHNjb3BlOiB0aGlzLCBvcHRpb25zIH0pXG4gIH1cblxuICByZW1vdmVEb2N1bWVudCAoZG9jOiBEb2N1bWVudCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXREb2NJbmRleChkb2MpXG5cbiAgICBjb25zdCB3aW5kb3cgPSB3aW4uZ2V0V2luZG93KGRvYylcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kb2N1bWVudHNbaW5kZXhdLm9wdGlvbnNcblxuICAgIGV2ZW50cy5yZW1vdmUod2luZG93LCAndW5sb2FkJywgdGhpcy5vbldpbmRvd1VubG9hZClcblxuICAgIHRoaXMuZG9jdW1lbnRzLnNwbGljZShpbmRleCwgMSlcbiAgICBldmVudHMuZG9jdW1lbnRzLnNwbGljZShpbmRleCwgMSlcblxuICAgIHRoaXMuZmlyZSgnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JywgeyBkb2MsIHdpbmRvdywgc2NvcGU6IHRoaXMsIG9wdGlvbnMgfSlcbiAgfVxuXG4gIGdldERvY0luZGV4IChkb2M6IERvY3VtZW50KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRvY3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZG9jdW1lbnRzW2ldLmRvYyA9PT0gZG9jKSB7XG4gICAgICAgIHJldHVybiBpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICBnZXREb2NPcHRpb25zIChkb2M6IERvY3VtZW50KSB7XG4gICAgY29uc3QgZG9jSW5kZXggPSB0aGlzLmdldERvY0luZGV4KGRvYylcblxuICAgIHJldHVybiBkb2NJbmRleCA9PT0gLTEgPyBudWxsIDogdGhpcy5kb2N1bWVudHNbZG9jSW5kZXhdLm9wdGlvbnNcbiAgfVxuXG4gIG5vdyAoKSB7XG4gICAgcmV0dXJuICgodGhpcy53aW5kb3cgYXMgYW55KS5EYXRlIGFzIHR5cGVvZiBEYXRlIHx8IERhdGUpLm5vdygpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uTmF0aXZlRXZlbnQgKHR5cGU6IHN0cmluZywgYWN0aW9uczogQWN0aW9ucykge1xuICBpZiAoYWN0aW9ucy5waGFzZWxlc3NUeXBlc1t0eXBlXSkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgZm9yIChjb25zdCBuYW1lIGluIGFjdGlvbnMubWFwKSB7XG4gICAgaWYgKHR5cGUuaW5kZXhPZihuYW1lKSA9PT0gMCAmJiB0eXBlLnN1YnN0cihuYW1lLmxlbmd0aCkgaW4gYWN0aW9ucy5waGFzZXMpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2NvcGUgKHNjb3BlOiBTY29wZSwgd2luZG93OiBXaW5kb3cpIHtcbiAgc2NvcGUuaXNJbml0aWFsaXplZCA9IHRydWVcbiAgd2luLmluaXQod2luZG93KVxuICBkb21PYmplY3RzLmluaXQod2luZG93KVxuICBicm93c2VyLmluaXQod2luZG93KVxuICByYWYuaW5pdCh3aW5kb3cpXG4gIGV2ZW50cy5pbml0KHdpbmRvdylcblxuICBzY29wZS51c2VQbHVnaW4oaW50ZXJhY3Rpb25zKVxuICBzY29wZS5kb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudFxuICBzY29wZS53aW5kb3cgPSB3aW5kb3dcblxuICByZXR1cm4gc2NvcGVcbn1cbiIsImltcG9ydCBicm93c2VyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2Jyb3dzZXInXG5pbXBvcnQgZG9tT2JqZWN0cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21PYmplY3RzJ1xuaW1wb3J0IHsgbm9kZUNvbnRhaW5zIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZG9tVXRpbHMnXG5pbXBvcnQgZXZlbnRzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V2ZW50cydcbmltcG9ydCAqIGFzIHBvaW50ZXJVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9wb2ludGVyVXRpbHMnXG5pbXBvcnQgSW50ZXJhY3Rpb25CYXNlIGZyb20gJy4vSW50ZXJhY3Rpb24nXG5pbXBvcnQgZmluZGVyLCB7IFNlYXJjaERldGFpbHMgfSBmcm9tICcuL2ludGVyYWN0aW9uRmluZGVyJ1xuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICcuL3Njb3BlJ1xuaW1wb3J0IGludGVyYWN0YWJsZVByZXZlbnREZWZhdWx0IGZyb20gJy4vaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgSW50ZXJhY3Rpb246IHR5cGVvZiBJbnRlcmFjdGlvbkJhc2VcbiAgICBpbnRlcmFjdGlvbnM6IHtcbiAgICAgIG5ldzogPFQgZXh0ZW5kcyBBY3Rpb25OYW1lPiAob3B0aW9uczogYW55KSA9PiBJbnRlcmFjdGlvbkJhc2U8VD5cbiAgICAgIGxpc3Q6IEludGVyYWN0aW9uQmFzZVtdXG4gICAgICBsaXN0ZW5lcnM6IHsgW3R5cGU6IHN0cmluZ106IEludGVyYWN0Lkxpc3RlbmVyIH1cbiAgICAgIGRvY0V2ZW50czogQXJyYXk8eyB0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBJbnRlcmFjdC5MaXN0ZW5lciB9PlxuICAgICAgcG9pbnRlck1vdmVUb2xlcmFuY2U6IG51bWJlclxuICAgIH1cbiAgICBwcmV2VG91Y2hUaW1lOiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2ludGVyYWN0aW9uczpmaW5kJzoge1xuICAgICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uQmFzZVxuICAgICAgc2VhcmNoRGV0YWlsczogU2VhcmNoRGV0YWlsc1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXRob2ROYW1lcyA9IFtcbiAgJ3BvaW50ZXJEb3duJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJVcCcsXG4gICd1cGRhdGVQb2ludGVyJywgJ3JlbW92ZVBvaW50ZXInLCAnd2luZG93Qmx1cicsXG5dXG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCBsaXN0ZW5lcnMgPSB7fSBhcyBhbnlcblxuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2ROYW1lcykge1xuICAgIGxpc3RlbmVyc1ttZXRob2RdID0gZG9PbkludGVyYWN0aW9ucyhtZXRob2QsIHNjb3BlKVxuICB9XG5cbiAgY29uc3QgcEV2ZW50VHlwZXMgPSBicm93c2VyLnBFdmVudFR5cGVzXG4gIGxldCBkb2NFdmVudHM6IHR5cGVvZiBzY29wZS5pbnRlcmFjdGlvbnMuZG9jRXZlbnRzXG5cbiAgaWYgKGRvbU9iamVjdHMuUG9pbnRlckV2ZW50KSB7XG4gICAgZG9jRXZlbnRzID0gW1xuICAgICAgeyB0eXBlOiBwRXZlbnRUeXBlcy5kb3duLCAgIGxpc3RlbmVyOiByZWxlYXNlUG9pbnRlcnNPblJlbW92ZWRFbHMgfSxcbiAgICAgIHsgdHlwZTogcEV2ZW50VHlwZXMuZG93biwgICBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJEb3duIH0sXG4gICAgICB7IHR5cGU6IHBFdmVudFR5cGVzLm1vdmUsICAgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiBwRXZlbnRUeXBlcy51cCwgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcnMucG9pbnRlclVwIH0sXG4gICAgICB7IHR5cGU6IHBFdmVudFR5cGVzLmNhbmNlbCwgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyVXAgfSxcbiAgICBdXG4gIH1cbiAgZWxzZSB7XG4gICAgZG9jRXZlbnRzID0gW1xuICAgICAgeyB0eXBlOiAnbW91c2Vkb3duJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyRG93biB9LFxuICAgICAgeyB0eXBlOiAnbW91c2Vtb3ZlJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiAnbW91c2V1cCcsIGxpc3RlbmVyOiBsaXN0ZW5lcnMucG9pbnRlclVwIH0sXG5cbiAgICAgIHsgdHlwZTogJ3RvdWNoc3RhcnQnLCBsaXN0ZW5lcjogcmVsZWFzZVBvaW50ZXJzT25SZW1vdmVkRWxzIH0sXG4gICAgICB7IHR5cGU6ICd0b3VjaHN0YXJ0JywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyRG93biB9LFxuICAgICAgeyB0eXBlOiAndG91Y2htb3ZlJywgbGlzdGVuZXI6IGxpc3RlbmVycy5wb2ludGVyTW92ZSB9LFxuICAgICAgeyB0eXBlOiAndG91Y2hlbmQnLCBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJVcCB9LFxuICAgICAgeyB0eXBlOiAndG91Y2hjYW5jZWwnLCBsaXN0ZW5lcjogbGlzdGVuZXJzLnBvaW50ZXJVcCB9LFxuICAgIF1cbiAgfVxuXG4gIGRvY0V2ZW50cy5wdXNoKHtcbiAgICB0eXBlOiAnYmx1cicsXG4gICAgbGlzdGVuZXIgKGV2ZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICAgIGludGVyYWN0aW9uLmRvY3VtZW50Qmx1cihldmVudClcbiAgICAgIH1cbiAgICB9LFxuICB9KVxuXG4gIC8vIGZvciBpZ25vcmluZyBicm93c2VyJ3Mgc2ltdWxhdGVkIG1vdXNlIGV2ZW50c1xuICBzY29wZS5wcmV2VG91Y2hUaW1lID0gMFxuXG4gIHNjb3BlLkludGVyYWN0aW9uID0gY2xhc3MgPFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiBleHRlbmRzIEludGVyYWN0aW9uQmFzZTxUPiB7XG4gICAgZ2V0IHBvaW50ZXJNb3ZlVG9sZXJhbmNlICgpIHtcbiAgICAgIHJldHVybiBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2VcbiAgICB9XG5cbiAgICBzZXQgcG9pbnRlck1vdmVUb2xlcmFuY2UgKHZhbHVlKSB7XG4gICAgICBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2UgPSB2YWx1ZVxuICAgIH1cblxuICAgIF9ub3cgKCkgeyByZXR1cm4gc2NvcGUubm93KCkgfVxuICB9XG5cbiAgc2NvcGUuaW50ZXJhY3Rpb25zID0ge1xuICAgIC8vIGFsbCBhY3RpdmUgYW5kIGlkbGUgaW50ZXJhY3Rpb25zXG4gICAgbGlzdDogW10sXG4gICAgbmV3PFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiAob3B0aW9uczogeyBwb2ludGVyVHlwZT86IHN0cmluZywgc2NvcGVGaXJlPzogU2NvcGVbJ2ZpcmUnXSB9KSB7XG4gICAgICBvcHRpb25zLnNjb3BlRmlyZSA9IChuYW1lLCBhcmcpID0+IHNjb3BlLmZpcmUobmFtZSwgYXJnKVxuXG4gICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IG5ldyBzY29wZS5JbnRlcmFjdGlvbjxUPihvcHRpb25zIGFzIFJlcXVpcmVkPHR5cGVvZiBvcHRpb25zPilcblxuICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QucHVzaChpbnRlcmFjdGlvbilcbiAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgIH0sXG4gICAgbGlzdGVuZXJzLFxuICAgIGRvY0V2ZW50cyxcbiAgICBwb2ludGVyTW92ZVRvbGVyYW5jZTogMSxcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbGVhc2VQb2ludGVyc09uUmVtb3ZlZEVscyAoKSB7XG4gICAgLy8gZm9yIGFsbCBpbmFjdGl2ZSB0b3VjaCBpbnRlcmFjdGlvbnMgd2l0aCBwb2ludGVycyBkb3duXG4gICAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgICAgaWYgKCFpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duIHx8XG4gICAgICAgIGludGVyYWN0aW9uLnBvaW50ZXJUeXBlICE9PSAndG91Y2gnIHx8XG4gICAgICAgIGludGVyYWN0aW9uLl9pbnRlcmFjdGluZykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBhIHBvaW50ZXIgaXMgZG93biBvbiBhbiBlbGVtZW50IHRoYXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBET00gdHJlZVxuICAgICAgZm9yIChjb25zdCBwb2ludGVyIG9mIGludGVyYWN0aW9uLnBvaW50ZXJzKSB7XG4gICAgICAgIGlmICghc2NvcGUuZG9jdW1lbnRzLnNvbWUoKHsgZG9jIH0pID0+IG5vZGVDb250YWlucyhkb2MsIHBvaW50ZXIuZG93blRhcmdldCkpKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwb2ludGVyIGZyb20gdGhlIGludGVyYWN0aW9uXG4gICAgICAgICAgaW50ZXJhY3Rpb24ucmVtb3ZlUG9pbnRlcihwb2ludGVyLnBvaW50ZXIsIHBvaW50ZXIuZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzY29wZS51c2VQbHVnaW4oaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQpXG59XG5cbmZ1bmN0aW9uIGRvT25JbnRlcmFjdGlvbnMgKG1ldGhvZCwgc2NvcGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGludGVyYWN0aW9ucyA9IHNjb3BlLmludGVyYWN0aW9ucy5saXN0XG5cbiAgICBjb25zdCBwb2ludGVyVHlwZSA9IHBvaW50ZXJVdGlscy5nZXRQb2ludGVyVHlwZShldmVudClcbiAgICBjb25zdCBbZXZlbnRUYXJnZXQsIGN1ckV2ZW50VGFyZ2V0XSA9IHBvaW50ZXJVdGlscy5nZXRFdmVudFRhcmdldHMoZXZlbnQpXG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdIC8vIFsgW3BvaW50ZXIsIGludGVyYWN0aW9uXSwgLi4uXVxuXG4gICAgaWYgKC9edG91Y2gvLnRlc3QoZXZlbnQudHlwZSkpIHtcbiAgICAgIHNjb3BlLnByZXZUb3VjaFRpbWUgPSBzY29wZS5ub3coKVxuXG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRUb3VjaCBvZiBldmVudC5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgICBjb25zdCBwb2ludGVyID0gY2hhbmdlZFRvdWNoXG4gICAgICAgIGNvbnN0IHBvaW50ZXJJZCA9IHBvaW50ZXJVdGlscy5nZXRQb2ludGVySWQocG9pbnRlcilcbiAgICAgICAgY29uc3Qgc2VhcmNoRGV0YWlsczogU2VhcmNoRGV0YWlscyA9IHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHBvaW50ZXJJZCxcbiAgICAgICAgICBwb2ludGVyVHlwZSxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICAgICAgY3VyRXZlbnRUYXJnZXQsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb24gPSBnZXRJbnRlcmFjdGlvbihzZWFyY2hEZXRhaWxzKVxuXG4gICAgICAgIG1hdGNoZXMucHVzaChbXG4gICAgICAgICAgc2VhcmNoRGV0YWlscy5wb2ludGVyLFxuICAgICAgICAgIHNlYXJjaERldGFpbHMuZXZlbnRUYXJnZXQsXG4gICAgICAgICAgc2VhcmNoRGV0YWlscy5jdXJFdmVudFRhcmdldCxcbiAgICAgICAgICBpbnRlcmFjdGlvbixcbiAgICAgICAgXSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsZXQgaW52YWxpZFBvaW50ZXIgPSBmYWxzZVxuXG4gICAgICBpZiAoIWJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnQgJiYgL21vdXNlLy50ZXN0KGV2ZW50LnR5cGUpKSB7XG4gICAgICAgIC8vIGlnbm9yZSBtb3VzZSBldmVudHMgd2hpbGUgdG91Y2ggaW50ZXJhY3Rpb25zIGFyZSBhY3RpdmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcmFjdGlvbnMubGVuZ3RoICYmICFpbnZhbGlkUG9pbnRlcjsgaSsrKSB7XG4gICAgICAgICAgaW52YWxpZFBvaW50ZXIgPSBpbnRlcmFjdGlvbnNbaV0ucG9pbnRlclR5cGUgIT09ICdtb3VzZScgJiYgaW50ZXJhY3Rpb25zW2ldLnBvaW50ZXJJc0Rvd25cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyeSB0byBpZ25vcmUgbW91c2UgZXZlbnRzIHRoYXQgYXJlIHNpbXVsYXRlZCBieSB0aGUgYnJvd3NlclxuICAgICAgICAvLyBhZnRlciBhIHRvdWNoIGV2ZW50XG4gICAgICAgIGludmFsaWRQb2ludGVyID0gaW52YWxpZFBvaW50ZXIgfHxcbiAgICAgICAgICAoc2NvcGUubm93KCkgLSBzY29wZS5wcmV2VG91Y2hUaW1lIDwgNTAwKSB8fFxuICAgICAgICAgIC8vIG9uIGlPUyBhbmQgRmlyZWZveCBNb2JpbGUsIE1vdXNlRXZlbnQudGltZVN0YW1wIGlzIHplcm8gaWYgc2ltdWxhdGVkXG4gICAgICAgICAgZXZlbnQudGltZVN0YW1wID09PSAwXG4gICAgICB9XG5cbiAgICAgIGlmICghaW52YWxpZFBvaW50ZXIpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRGV0YWlscyA9IHtcbiAgICAgICAgICBwb2ludGVyOiBldmVudCxcbiAgICAgICAgICBwb2ludGVySWQ6IHBvaW50ZXJVdGlscy5nZXRQb2ludGVySWQoZXZlbnQpLFxuICAgICAgICAgIHBvaW50ZXJUeXBlLFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQudHlwZSxcbiAgICAgICAgICBjdXJFdmVudFRhcmdldCxcbiAgICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZ2V0SW50ZXJhY3Rpb24oc2VhcmNoRGV0YWlscylcblxuICAgICAgICBtYXRjaGVzLnB1c2goW1xuICAgICAgICAgIHNlYXJjaERldGFpbHMucG9pbnRlcixcbiAgICAgICAgICBzZWFyY2hEZXRhaWxzLmV2ZW50VGFyZ2V0LFxuICAgICAgICAgIHNlYXJjaERldGFpbHMuY3VyRXZlbnRUYXJnZXQsXG4gICAgICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICAgIF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGZvciAoY29uc3QgW3BvaW50ZXIsIGV2ZW50VGFyZ2V0LCBjdXJFdmVudFRhcmdldCwgaW50ZXJhY3Rpb25dIG9mIG1hdGNoZXMpIHtcbiAgICAgIGludGVyYWN0aW9uW21ldGhvZF0ocG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBjdXJFdmVudFRhcmdldClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJhY3Rpb24gKHNlYXJjaERldGFpbHM6IFNlYXJjaERldGFpbHMpIHtcbiAgY29uc3QgeyBwb2ludGVyVHlwZSwgc2NvcGUgfSA9IHNlYXJjaERldGFpbHNcblxuICBjb25zdCBmb3VuZEludGVyYWN0aW9uID0gZmluZGVyLnNlYXJjaChzZWFyY2hEZXRhaWxzKVxuICBjb25zdCBzaWduYWxBcmcgPSB7IGludGVyYWN0aW9uOiBmb3VuZEludGVyYWN0aW9uLCBzZWFyY2hEZXRhaWxzIH1cblxuICBzY29wZS5maXJlKCdpbnRlcmFjdGlvbnM6ZmluZCcsIHNpZ25hbEFyZylcblxuICByZXR1cm4gc2lnbmFsQXJnLmludGVyYWN0aW9uIHx8IHNjb3BlLmludGVyYWN0aW9ucy5uZXcoeyBwb2ludGVyVHlwZSB9KVxufVxuXG5mdW5jdGlvbiBvbkRvY1NpZ25hbDxUIGV4dGVuZHMgJ3Njb3BlOmFkZC1kb2N1bWVudCcgfCAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50Jz4gKHsgZG9jLCBzY29wZSwgb3B0aW9ucyB9OiBJbnRlcmFjdC5TaWduYWxBcmdzW1RdLCBldmVudE1ldGhvZE5hbWU6ICdhZGQnIHwgJ3JlbW92ZScpIHtcbiAgY29uc3QgeyBkb2NFdmVudHMgfSA9IHNjb3BlLmludGVyYWN0aW9uc1xuICBjb25zdCBldmVudE1ldGhvZCA9IGV2ZW50c1tldmVudE1ldGhvZE5hbWVdXG5cbiAgaWYgKHNjb3BlLmJyb3dzZXIuaXNJT1MgJiYgIW9wdGlvbnMuZXZlbnRzKSB7XG4gICAgb3B0aW9ucy5ldmVudHMgPSB7IHBhc3NpdmU6IGZhbHNlIH1cbiAgfVxuXG4gIC8vIGRlbGVnYXRlIGV2ZW50IGxpc3RlbmVyXG4gIGZvciAoY29uc3QgZXZlbnRUeXBlIGluIGV2ZW50cy5kZWxlZ2F0ZWRFdmVudHMpIHtcbiAgICBldmVudE1ldGhvZChkb2MsIGV2ZW50VHlwZSwgZXZlbnRzLmRlbGVnYXRlTGlzdGVuZXIpXG4gICAgZXZlbnRNZXRob2QoZG9jLCBldmVudFR5cGUsIGV2ZW50cy5kZWxlZ2F0ZVVzZUNhcHR1cmUsIHRydWUpXG4gIH1cblxuICBjb25zdCBldmVudE9wdGlvbnMgPSBvcHRpb25zICYmIG9wdGlvbnMuZXZlbnRzXG5cbiAgZm9yIChjb25zdCB7IHR5cGUsIGxpc3RlbmVyIH0gb2YgZG9jRXZlbnRzKSB7XG4gICAgZXZlbnRNZXRob2QoZG9jLCB0eXBlLCBsaXN0ZW5lciwgZXZlbnRPcHRpb25zKVxuICB9XG59XG5cbmNvbnN0IGludGVyYWN0aW9uczogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ2NvcmUvaW50ZXJhY3Rpb25zJyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ3Njb3BlOmFkZC1kb2N1bWVudCc6IGFyZyA9PiBvbkRvY1NpZ25hbChhcmcsICdhZGQnKSxcbiAgICAnc2NvcGU6cmVtb3ZlLWRvY3VtZW50JzogYXJnID0+IG9uRG9jU2lnbmFsKGFyZywgJ3JlbW92ZScpLFxuICAgICdpbnRlcmFjdGFibGU6dW5zZXQnOiAoeyBpbnRlcmFjdGFibGUgfSwgc2NvcGUpID0+IHtcbiAgICAgIC8vIFN0b3AgYW5kIGRlc3Ryb3kgcmVsYXRlZCBpbnRlcmFjdGlvbnMgd2hlbiBhbiBJbnRlcmFjdGFibGUgaXMgdW5zZXRcbiAgICAgIGZvciAobGV0IGkgPSBzY29wZS5pbnRlcmFjdGlvbnMubGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IHNjb3BlLmludGVyYWN0aW9ucy5saXN0W2ldXG5cbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSAhPT0gaW50ZXJhY3RhYmxlKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICBpbnRlcmFjdGlvbi5zdG9wKClcbiAgICAgICAgc2NvcGUuZmlyZSgnaW50ZXJhY3Rpb25zOmRlc3Ryb3knLCB7IGludGVyYWN0aW9uIH0pXG4gICAgICAgIGludGVyYWN0aW9uLmRlc3Ryb3koKVxuXG4gICAgICAgIGlmIChzY29wZS5pbnRlcmFjdGlvbnMubGlzdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3Quc3BsaWNlKGksIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBvbkRvY1NpZ25hbCxcbiAgZG9PbkludGVyYWN0aW9ucyxcbiAgbWV0aG9kTmFtZXMsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGludGVyYWN0aW9uc1xuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwZXMuZC50c1wiIC8+XG4iLCJleHBvcnQgZGVmYXVsdCAodGhpbmc6IGFueSkgPT4gISEodGhpbmcgJiYgdGhpbmcuV2luZG93KSAmJiAodGhpbmcgaW5zdGFuY2VvZiB0aGluZy5XaW5kb3cpXG4iLCJpbXBvcnQgaXNXaW5kb3cgZnJvbSAnLi9pc1dpbmRvdydcblxuY29uc3Qgd2luID0ge1xuICByZWFsV2luZG93OiB1bmRlZmluZWQgYXMgV2luZG93LFxuICB3aW5kb3c6IHVuZGVmaW5lZCBhcyBXaW5kb3csXG4gIGdldFdpbmRvdyxcbiAgaW5pdCxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKHdpbmRvdzogV2luZG93ICYgeyB3cmFwPzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgfSkge1xuICAvLyBnZXQgd3JhcHBlZCB3aW5kb3cgaWYgdXNpbmcgU2hhZG93IERPTSBwb2x5ZmlsbFxuXG4gIHdpbi5yZWFsV2luZG93ID0gd2luZG93XG5cbiAgLy8gY3JlYXRlIGEgVGV4dE5vZGVcbiAgY29uc3QgZWwgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpXG5cbiAgLy8gY2hlY2sgaWYgaXQncyB3cmFwcGVkIGJ5IGEgcG9seWZpbGxcbiAgaWYgKGVsLm93bmVyRG9jdW1lbnQgIT09IHdpbmRvdy5kb2N1bWVudCAmJlxuICAgICAgdHlwZW9mIHdpbmRvdy53cmFwID09PSAnZnVuY3Rpb24nICYmXG4gICAgd2luZG93LndyYXAoZWwpID09PSBlbCkge1xuICAgIC8vIHVzZSB3cmFwcGVkIHdpbmRvd1xuICAgIHdpbmRvdyA9IHdpbmRvdy53cmFwKHdpbmRvdylcbiAgfVxuXG4gIHdpbi53aW5kb3cgPSB3aW5kb3dcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbi53aW5kb3cgICAgID0gdW5kZWZpbmVkXG4gIHdpbi5yZWFsV2luZG93ID0gdW5kZWZpbmVkXG59XG5lbHNlIHtcbiAgaW5pdCh3aW5kb3cpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3cgKG5vZGU6IGFueSkge1xuICBpZiAoaXNXaW5kb3cobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgY29uc3Qgcm9vdE5vZGUgPSAobm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUpXG5cbiAgcmV0dXJuIHJvb3ROb2RlLmRlZmF1bHRWaWV3IHx8IHdpbi53aW5kb3dcbn1cblxud2luLmluaXQgPSBpbml0XG5cbmV4cG9ydCBkZWZhdWx0IHdpblxuIiwiLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxuXG5pbXBvcnQgaXNXaW5kb3cgZnJvbSAnLi9pc1dpbmRvdydcbmltcG9ydCB3aW4gZnJvbSAnLi93aW5kb3cnXG5cbmV4cG9ydCBjb25zdCB3aW5kb3cgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIFdpbmRvdyA9PlxuICB0aGluZyA9PT0gd2luLndpbmRvdyB8fCBpc1dpbmRvdyh0aGluZylcblxuZXhwb3J0IGNvbnN0IGRvY0ZyYWcgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIERvY3VtZW50RnJhZ21lbnQgPT5cbiAgb2JqZWN0KHRoaW5nKSAmJiB0aGluZy5ub2RlVHlwZSA9PT0gMTFcblxuZXhwb3J0IGNvbnN0IG9iamVjdCA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0+XG4gICEhdGhpbmcgJiYgKHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCcpXG5cbmV4cG9ydCBjb25zdCBmdW5jID0gKHRoaW5nOiBhbnkpOiB0aGluZyBpcyAoLi4uYXJnczogYW55W10pID0+IGFueSA9PlxuICB0eXBlb2YgdGhpbmcgPT09ICdmdW5jdGlvbidcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgbnVtYmVyID0+XG4gIHR5cGVvZiB0aGluZyA9PT0gJ251bWJlcidcblxuZXhwb3J0IGNvbnN0IGJvb2wgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIGJvb2xlYW4gPT5cbiAgdHlwZW9mIHRoaW5nID09PSAnYm9vbGVhbidcblxuZXhwb3J0IGNvbnN0IHN0cmluZyA9ICh0aGluZzogYW55KTogdGhpbmcgaXMgc3RyaW5nID0+XG4gIHR5cGVvZiB0aGluZyA9PT0gJ3N0cmluZydcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnQgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIEludGVyYWN0LkVsZW1lbnQgPT4ge1xuICBpZiAoIXRoaW5nIHx8ICh0eXBlb2YgdGhpbmcgIT09ICdvYmplY3QnKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IF93aW5kb3cgPSB3aW4uZ2V0V2luZG93KHRoaW5nKSB8fCB3aW4ud2luZG93XG5cbiAgcmV0dXJuICgvb2JqZWN0fGZ1bmN0aW9uLy50ZXN0KHR5cGVvZiBfd2luZG93LkVsZW1lbnQpXG4gICAgPyB0aGluZyBpbnN0YW5jZW9mIF93aW5kb3cuRWxlbWVudCAvLyBET00yXG4gICAgOiB0aGluZy5ub2RlVHlwZSA9PT0gMSAmJiB0eXBlb2YgdGhpbmcubm9kZU5hbWUgPT09ICdzdHJpbmcnKVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5PYmplY3Q6IHR5cGVvZiBvYmplY3QgPSAodGhpbmc6IGFueSk6IHRoaW5nIGlzIHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9PlxuICBvYmplY3QodGhpbmcpICYmXG4gICEhdGhpbmcuY29uc3RydWN0b3IgJiZcbiAgL2Z1bmN0aW9uIE9iamVjdFxcYi8udGVzdCh0aGluZy5jb25zdHJ1Y3Rvci50b1N0cmluZygpKVxuXG5leHBvcnQgY29uc3QgYXJyYXkgPSA8VCBleHRlbmRzIHVua25vd24+KHRoaW5nOiBhbnkpOiB0aGluZyBpcyBUW10gPT5cbiAgKG9iamVjdCh0aGluZykgJiZcbiAgKHR5cGVvZiB0aGluZy5sZW5ndGggIT09ICd1bmRlZmluZWQnKSAmJlxuICBmdW5jKHRoaW5nLnNwbGljZSkpXG4iLCJpbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIGRyYWdnYWJsZTogRHJhZ2dhYmxlTWV0aG9kXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBkcmFnOiBJbnRlcmFjdC5EcmFnZ2FibGVPcHRpb25zXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbk1hcCB7XG4gICAgZHJhZz86IHR5cGVvZiBkcmFnXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgRHJhZ0V2ZW50ID0gSW50ZXJhY3QuSW50ZXJhY3RFdmVudDwnZHJhZyc+XG5cbmV4cG9ydCB0eXBlIERyYWdnYWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5EcmFnZ2FibGVPcHRpb25zPlxuXG5mdW5jdGlvbiBpbnN0YWxsIChzY29wZTogU2NvcGUpIHtcbiAgY29uc3Qge1xuICAgIGFjdGlvbnMsXG4gICAgSW50ZXJhY3RhYmxlLFxuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyYWdnYWJsZSA9IGRyYWcuZHJhZ2dhYmxlXG5cbiAgYWN0aW9ucy5tYXAuZHJhZyA9IGRyYWdcbiAgYWN0aW9ucy5tZXRob2REaWN0LmRyYWcgPSAnZHJhZ2dhYmxlJ1xuXG4gIGRlZmF1bHRzLmFjdGlvbnMuZHJhZyA9IGRyYWcuZGVmYXVsdHNcbn1cblxuZnVuY3Rpb24gYmVmb3JlTW92ZSAoeyBpbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICBjb25zdCBheGlzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpc1xuXG4gIGlmIChheGlzID09PSAneCcpIHtcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnBhZ2UueSAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueVxuICAgIGludGVyYWN0aW9uLmNvb3Jkcy5jdXIuY2xpZW50LnkgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQuY2xpZW50LnlcblxuICAgIGludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eS5jbGllbnQueSA9IDBcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHkucGFnZS55ICAgPSAwXG4gIH1cbiAgZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgaW50ZXJhY3Rpb24uY29vcmRzLmN1ci5wYWdlLnggICA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5wYWdlLnhcbiAgICBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLmNsaWVudC54ID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LmNsaWVudC54XG5cbiAgICBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHkuY2xpZW50LnggPSAwXG4gICAgaW50ZXJhY3Rpb24uY29vcmRzLnZlbG9jaXR5LnBhZ2UueCAgID0gMFxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdmUgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICBjb25zdCBheGlzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpc1xuXG4gIGlmIChheGlzID09PSAneCcgfHwgYXhpcyA9PT0gJ3knKSB7XG4gICAgY29uc3Qgb3Bwb3NpdGUgPSBheGlzID09PSAneCcgPyAneScgOiAneCdcblxuICAgIGlFdmVudC5wYWdlW29wcG9zaXRlXSAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2Vbb3Bwb3NpdGVdXG4gICAgaUV2ZW50LmNsaWVudFtvcHBvc2l0ZV0gPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQuY2xpZW50W29wcG9zaXRlXVxuICAgIGlFdmVudC5kZWx0YVtvcHBvc2l0ZV0gPSAwXG4gIH1cbn1cblxuLyoqXG4gKiBgYGBqc1xuICogaW50ZXJhY3QoZWxlbWVudCkuZHJhZ2dhYmxlKHtcbiAqICAgICBvbnN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICogICAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gKiAgICAgb25lbmQgIDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAqXG4gKiAgICAgLy8gdGhlIGF4aXMgaW4gd2hpY2ggdGhlIGZpcnN0IG1vdmVtZW50IG11c3QgYmVcbiAqICAgICAvLyBmb3IgdGhlIGRyYWcgc2VxdWVuY2UgdG8gc3RhcnRcbiAqICAgICAvLyAneHknIGJ5IGRlZmF1bHQgLSBhbnkgZGlyZWN0aW9uXG4gKiAgICAgc3RhcnRBeGlzOiAneCcgfHwgJ3knIHx8ICd4eScsXG4gKlxuICogICAgIC8vICd4eScgYnkgZGVmYXVsdCAtIGRvbid0IHJlc3RyaWN0IHRvIG9uZSBheGlzIChtb3ZlIGluIGFueSBkaXJlY3Rpb24pXG4gKiAgICAgLy8gJ3gnIG9yICd5JyB0byByZXN0cmljdCBtb3ZlbWVudCB0byBlaXRoZXIgYXhpc1xuICogICAgIC8vICdzdGFydCcgdG8gcmVzdHJpY3QgbW92ZW1lbnQgdG8gdGhlIGF4aXMgdGhlIGRyYWcgc3RhcnRlZCBpblxuICogICAgIGxvY2tBeGlzOiAneCcgfHwgJ3knIHx8ICd4eScgfHwgJ3N0YXJ0JyxcbiAqXG4gKiAgICAgLy8gbWF4IG51bWJlciBvZiBkcmFncyB0aGF0IGNhbiBoYXBwZW4gY29uY3VycmVudGx5XG4gKiAgICAgLy8gd2l0aCBlbGVtZW50cyBvZiB0aGlzIEludGVyYWN0YWJsZS4gSW5maW5pdHkgYnkgZGVmYXVsdFxuICogICAgIG1heDogSW5maW5pdHksXG4gKlxuICogICAgIC8vIG1heCBudW1iZXIgb2YgZHJhZ3MgdGhhdCBjYW4gdGFyZ2V0IHRoZSBzYW1lIGVsZW1lbnQrSW50ZXJhY3RhYmxlXG4gKiAgICAgLy8gMSBieSBkZWZhdWx0XG4gKiAgICAgbWF4UGVyRWxlbWVudDogMlxuICogfSlcbiAqXG4gKiB2YXIgaXNEcmFnZ2FibGUgPSBpbnRlcmFjdCgnZWxlbWVudCcpLmRyYWdnYWJsZSgpOyAvLyB0cnVlXG4gKiBgYGBcbiAqXG4gKiBHZXQgb3Igc2V0IHdoZXRoZXIgZHJhZyBhY3Rpb25zIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHRhcmdldFxuICpcbiAqIEBhbGlhcyBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyYWdnYWJsZVxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAqIGxpc3RlbmVycyB0byBiZSBmaXJlZCBvbiBkcmFnIGV2ZW50cyAob2JqZWN0IG1ha2VzIHRoZSBJbnRlcmFjdGFibGVcbiAqIGRyYWdnYWJsZSlcbiAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIGNhbiBiZSB0aGVcbiAqIHRhcmdldCBvZiBkcmFnIGV2ZW50cywgb3IgdGhpcyBJbnRlcmN0YWJsZVxuICovXG5jb25zdCBkcmFnZ2FibGU6IERyYWdnYWJsZU1ldGhvZCA9IGZ1bmN0aW9uIGRyYWdnYWJsZSAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zPzogSW50ZXJhY3QuRHJhZ2dhYmxlT3B0aW9ucyB8IGJvb2xlYW4pOiBhbnkge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgdGhpcy5vcHRpb25zLmRyYWcuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcbiAgICB0aGlzLnNldFBlckFjdGlvbignZHJhZycsIG9wdGlvbnMpXG4gICAgdGhpcy5zZXRPbkV2ZW50cygnZHJhZycsIG9wdGlvbnMpXG5cbiAgICBpZiAoL14oeHl8eHx5fHN0YXJ0KSQvLnRlc3Qob3B0aW9ucy5sb2NrQXhpcykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5kcmFnLmxvY2tBeGlzID0gb3B0aW9ucy5sb2NrQXhpc1xuICAgIH1cbiAgICBpZiAoL14oeHl8eHx5KSQvLnRlc3Qob3B0aW9ucy5zdGFydEF4aXMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZHJhZy5zdGFydEF4aXMgPSBvcHRpb25zLnN0YXJ0QXhpc1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoaXMuYm9vbChvcHRpb25zKSkge1xuICAgIHRoaXMub3B0aW9ucy5kcmFnLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcmV0dXJuIHRoaXMub3B0aW9ucy5kcmFnXG59XG5cbmNvbnN0IGRyYWc6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhY3Rpb25zL2RyYWcnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGJlZm9yZU1vdmUsXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tcmVzdW1lJzogYmVmb3JlTW92ZSxcblxuICAgIC8vIGRyYWdtb3ZlXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IG1vdmUsXG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBhcmcgPT4ge1xuICAgICAgY29uc3QgeyBpbnRlcmFjdGlvbiwgaW50ZXJhY3RhYmxlLCBidXR0b25zIH0gPSBhcmdcbiAgICAgIGNvbnN0IGRyYWdPcHRpb25zID0gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJhZ1xuXG4gICAgICBpZiAoXG4gICAgICAgICEoZHJhZ09wdGlvbnMgJiYgZHJhZ09wdGlvbnMuZW5hYmxlZCkgfHxcbiAgICAgICAgLy8gY2hlY2sgbW91c2VCdXR0b24gc2V0dGluZyBpZiB0aGUgcG9pbnRlciBpcyBkb3duXG4gICAgICAgIChpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duICYmXG4gICAgICAgICAvbW91c2V8cG9pbnRlci8udGVzdChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSkgJiZcbiAgICAgICAoYnV0dG9ucyAmIGludGVyYWN0YWJsZS5vcHRpb25zLmRyYWcubW91c2VCdXR0b25zKSA9PT0gMClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGFyZy5hY3Rpb24gPSB7XG4gICAgICAgIG5hbWU6ICdkcmFnJyxcbiAgICAgICAgYXhpczogKGRyYWdPcHRpb25zLmxvY2tBeGlzID09PSAnc3RhcnQnXG4gICAgICAgICAgPyBkcmFnT3B0aW9ucy5zdGFydEF4aXNcbiAgICAgICAgICA6IGRyYWdPcHRpb25zLmxvY2tBeGlzKSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcbiAgfSxcbiAgZHJhZ2dhYmxlLFxuICBiZWZvcmVNb3ZlLFxuICBtb3ZlLFxuICBkZWZhdWx0czoge1xuICAgIHN0YXJ0QXhpcyA6ICd4eScsXG4gICAgbG9ja0F4aXMgIDogJ3h5JyxcbiAgfSBhcyBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnMsXG5cbiAgZ2V0Q3Vyc29yICgpIHtcbiAgICByZXR1cm4gJ21vdmUnXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWdcbiIsInR5cGUgRmlsdGVyPFQ+ID0gKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IGJvb2xlYW5cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zID0gPFQ+KGFycmF5OiBUW10sIHRhcmdldDogVCkgPT4gYXJyYXkuaW5kZXhPZih0YXJnZXQpICE9PSAtMVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlID0gPFQ+KGFycmF5OiBUW10sIHRhcmdldDogVCkgPT4gYXJyYXkuc3BsaWNlKGFycmF5LmluZGV4T2YodGFyZ2V0KSwgMSlcblxuZXhwb3J0IGNvbnN0IG1lcmdlID0gPFQsIFU+KHRhcmdldDogQXJyYXk8VCB8IFU+LCBzb3VyY2U6IFVbXSkgPT4ge1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKSB7XG4gICAgdGFyZ2V0LnB1c2goaXRlbSlcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRcbn1cblxuZXhwb3J0IGNvbnN0IGZyb20gPSA8VCA9IGFueT4oc291cmNlOiBBcnJheUxpa2U8VD4pID0+IG1lcmdlKFtdIGFzIFRbXSwgc291cmNlIGFzIFRbXSlcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihhcnJheTogVFtdLCBmdW5jOiBGaWx0ZXI8VD4pID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmdW5jKGFycmF5W2ldLCBpLCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbmV4cG9ydCBjb25zdCBmaW5kID0gPFQgPSBhbnk+KGFycmF5OiBUW10sIGZ1bmM6IEZpbHRlcjxUPikgPT4gYXJyYXlbZmluZEluZGV4KGFycmF5LCBmdW5jKV1cbiIsImNvbnN0IGRvbU9iamVjdHM6IHtcbiAgaW5pdDogYW55XG4gIGRvY3VtZW50OiBEb2N1bWVudFxuICBEb2N1bWVudEZyYWdtZW50OiB0eXBlb2YgRG9jdW1lbnRGcmFnbWVudFxuICBTVkdFbGVtZW50OiB0eXBlb2YgU1ZHRWxlbWVudFxuICBTVkdTVkdFbGVtZW50OiB0eXBlb2YgU1ZHU1ZHRWxlbWVudFxuICBTVkdFbGVtZW50SW5zdGFuY2U6IGFueVxuICBFbGVtZW50OiB0eXBlb2YgRWxlbWVudFxuICBIVE1MRWxlbWVudDogdHlwZW9mIEhUTUxFbGVtZW50XG4gIEV2ZW50OiB0eXBlb2YgRXZlbnRcbiAgVG91Y2g6IHR5cGVvZiBUb3VjaFxuICBQb2ludGVyRXZlbnQ6IHR5cGVvZiBQb2ludGVyRXZlbnRcbn0gPVxue1xuICBpbml0LFxuICBkb2N1bWVudDogbnVsbCxcbiAgRG9jdW1lbnRGcmFnbWVudDogbnVsbCxcbiAgU1ZHRWxlbWVudDogbnVsbCxcbiAgU1ZHU1ZHRWxlbWVudDogbnVsbCxcbiAgU1ZHRWxlbWVudEluc3RhbmNlOiBudWxsLFxuICBFbGVtZW50OiBudWxsLFxuICBIVE1MRWxlbWVudDogbnVsbCxcbiAgRXZlbnQ6IG51bGwsXG4gIFRvdWNoOiBudWxsLFxuICBQb2ludGVyRXZlbnQ6IG51bGwsXG59XG5cbmZ1bmN0aW9uIGJsYW5rICgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGRvbU9iamVjdHNcblxuZnVuY3Rpb24gaW5pdCAod2luZG93OiBXaW5kb3cpIHtcbiAgY29uc3Qgd2luID0gd2luZG93IGFzIGFueVxuXG4gIGRvbU9iamVjdHMuZG9jdW1lbnQgICAgICAgICAgID0gd2luLmRvY3VtZW50XG4gIGRvbU9iamVjdHMuRG9jdW1lbnRGcmFnbWVudCAgID0gd2luLkRvY3VtZW50RnJhZ21lbnQgICB8fCBibGFua1xuICBkb21PYmplY3RzLlNWR0VsZW1lbnQgICAgICAgICA9IHdpbi5TVkdFbGVtZW50ICAgICAgICAgfHwgYmxhbmtcbiAgZG9tT2JqZWN0cy5TVkdTVkdFbGVtZW50ICAgICAgPSB3aW4uU1ZHU1ZHRWxlbWVudCAgICAgIHx8IGJsYW5rXG4gIGRvbU9iamVjdHMuU1ZHRWxlbWVudEluc3RhbmNlID0gd2luLlNWR0VsZW1lbnRJbnN0YW5jZSB8fCBibGFua1xuICBkb21PYmplY3RzLkVsZW1lbnQgICAgICAgICAgICA9IHdpbi5FbGVtZW50ICAgICAgICAgICAgfHwgYmxhbmtcbiAgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAgICAgICAgPSB3aW4uSFRNTEVsZW1lbnQgICAgICAgIHx8IGRvbU9iamVjdHMuRWxlbWVudFxuXG4gIGRvbU9iamVjdHMuRXZlbnQgICAgICAgID0gd2luLkV2ZW50XG4gIGRvbU9iamVjdHMuVG91Y2ggICAgICAgID0gd2luLlRvdWNoIHx8IGJsYW5rXG4gIGRvbU9iamVjdHMuUG9pbnRlckV2ZW50ID0gKHdpbi5Qb2ludGVyRXZlbnQgfHwgd2luLk1TUG9pbnRlckV2ZW50KVxufVxuIiwiaW1wb3J0IGRvbU9iamVjdHMgZnJvbSAnLi9kb21PYmplY3RzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCB3aW4gZnJvbSAnLi93aW5kb3cnXG5cbmNvbnN0IGJyb3dzZXIgPSB7XG4gIGluaXQsXG4gIHN1cHBvcnRzVG91Y2g6IG51bGwgYXMgYm9vbGVhbixcbiAgc3VwcG9ydHNQb2ludGVyRXZlbnQ6IG51bGwgYXMgYm9vbGVhbixcbiAgaXNJT1M3OiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzSU9TOiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzSWU5OiBudWxsIGFzIGJvb2xlYW4sXG4gIGlzT3BlcmFNb2JpbGU6IG51bGwgYXMgYm9vbGVhbixcbiAgcHJlZml4ZWRNYXRjaGVzU2VsZWN0b3I6IG51bGwgYXMgc3RyaW5nLFxuICBwRXZlbnRUeXBlczogbnVsbCBhcyB7XG4gICAgdXA6IHN0cmluZ1xuICAgIGRvd246IHN0cmluZ1xuICAgIG92ZXI6IHN0cmluZ1xuICAgIG91dDogc3RyaW5nXG4gICAgbW92ZTogc3RyaW5nXG4gICAgY2FuY2VsOiBzdHJpbmdcbiAgfSxcbiAgd2hlZWxFdmVudDogbnVsbCBhcyBzdHJpbmcsXG59XG5cbmZ1bmN0aW9uIGluaXQgKHdpbmRvdzogYW55KSB7XG4gIGNvbnN0IEVsZW1lbnQgPSBkb21PYmplY3RzLkVsZW1lbnRcbiAgY29uc3QgbmF2aWdhdG9yICA9IHdpbi53aW5kb3cubmF2aWdhdG9yXG5cbiAgLy8gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IHRvdWNoIGlucHV0P1xuICBicm93c2VyLnN1cHBvcnRzVG91Y2ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KSB8fFxuICAgIChpcy5mdW5jKHdpbmRvdy5Eb2N1bWVudFRvdWNoKSAmJiBkb21PYmplY3RzLmRvY3VtZW50IGluc3RhbmNlb2Ygd2luZG93LkRvY3VtZW50VG91Y2gpXG5cbiAgLy8gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IFBvaW50ZXJFdmVudHNcbiAgYnJvd3Nlci5zdXBwb3J0c1BvaW50ZXJFdmVudCA9IG5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCAhPT0gZmFsc2UgJiYgISFkb21PYmplY3RzLlBvaW50ZXJFdmVudFxuXG4gIGJyb3dzZXIuaXNJT1MgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkpXG5cbiAgLy8gc2Nyb2xsaW5nIGRvZXNuJ3QgY2hhbmdlIHRoZSByZXN1bHQgb2YgZ2V0Q2xpZW50UmVjdHMgb24gaU9TIDdcbiAgYnJvd3Nlci5pc0lPUzcgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgJiZcbiAgICAgICAgICAgL09TIDdbXlxcZF0vLnRlc3QobmF2aWdhdG9yLmFwcFZlcnNpb24pKVxuXG4gIGJyb3dzZXIuaXNJZTkgPSAvTVNJRSA5Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgLy8gT3BlcmEgTW9iaWxlIG11c3QgYmUgaGFuZGxlZCBkaWZmZXJlbnRseVxuICBicm93c2VyLmlzT3BlcmFNb2JpbGUgPSAobmF2aWdhdG9yLmFwcE5hbWUgPT09ICdPcGVyYScgJiZcbiAgICBicm93c2VyLnN1cHBvcnRzVG91Y2ggJiZcbiAgICAvUHJlc3RvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKVxuXG4gIC8vIHByZWZpeCBtYXRjaGVzU2VsZWN0b3JcbiAgYnJvd3Nlci5wcmVmaXhlZE1hdGNoZXNTZWxlY3RvciA9ICdtYXRjaGVzJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgID8gJ21hdGNoZXMnXG4gICAgOiAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgICAgPyAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJ1xuICAgICAgOiAnbW96TWF0Y2hlc1NlbGVjdG9yJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgICAgICA/ICdtb3pNYXRjaGVzU2VsZWN0b3InXG4gICAgICAgIDogJ29NYXRjaGVzU2VsZWN0b3InIGluIEVsZW1lbnQucHJvdG90eXBlXG4gICAgICAgICAgPyAnb01hdGNoZXNTZWxlY3RvcidcbiAgICAgICAgICA6ICdtc01hdGNoZXNTZWxlY3RvcidcblxuICBicm93c2VyLnBFdmVudFR5cGVzID0gKGJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnRcbiAgICA/IChkb21PYmplY3RzLlBvaW50ZXJFdmVudCA9PT0gd2luZG93Lk1TUG9pbnRlckV2ZW50XG4gICAgICA/IHtcbiAgICAgICAgdXA6ICAgICAnTVNQb2ludGVyVXAnLFxuICAgICAgICBkb3duOiAgICdNU1BvaW50ZXJEb3duJyxcbiAgICAgICAgb3ZlcjogICAnbW91c2VvdmVyJyxcbiAgICAgICAgb3V0OiAgICAnbW91c2VvdXQnLFxuICAgICAgICBtb3ZlOiAgICdNU1BvaW50ZXJNb3ZlJyxcbiAgICAgICAgY2FuY2VsOiAnTVNQb2ludGVyQ2FuY2VsJyxcbiAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICB1cDogICAgICdwb2ludGVydXAnLFxuICAgICAgICBkb3duOiAgICdwb2ludGVyZG93bicsXG4gICAgICAgIG92ZXI6ICAgJ3BvaW50ZXJvdmVyJyxcbiAgICAgICAgb3V0OiAgICAncG9pbnRlcm91dCcsXG4gICAgICAgIG1vdmU6ICAgJ3BvaW50ZXJtb3ZlJyxcbiAgICAgICAgY2FuY2VsOiAncG9pbnRlcmNhbmNlbCcsXG4gICAgICB9KVxuICAgIDogbnVsbClcblxuICAvLyBiZWNhdXNlIFdlYmtpdCBhbmQgT3BlcmEgc3RpbGwgdXNlICdtb3VzZXdoZWVsJyBldmVudCB0eXBlXG4gIGJyb3dzZXIud2hlZWxFdmVudCA9ICdvbm1vdXNld2hlZWwnIGluIGRvbU9iamVjdHMuZG9jdW1lbnQgPyAnbW91c2V3aGVlbCcgOiAnd2hlZWwnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGJyb3dzZXJcbiIsImltcG9ydCAqIGFzIGFyciBmcm9tICcuL2FycidcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBiYW4tdHlwZXNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsb25lPFQgZXh0ZW5kcyBPYmplY3Q+IChzb3VyY2U6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgZGVzdCA9IHt9IGFzIFBhcnRpYWw8VD5cblxuICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbcHJvcF1cblxuICAgIGlmIChpcy5wbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGRlc3RbcHJvcF0gPSBjbG9uZSh2YWx1ZSkgYXMgYW55XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLmFycmF5KHZhbHVlKSkge1xuICAgICAgZGVzdFtwcm9wXSA9IGFyci5mcm9tKHZhbHVlKSBhcyB0eXBlb2YgdmFsdWVcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkZXN0W3Byb3BdID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVzdFxufVxuIiwiaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi9icm93c2VyJ1xuaW1wb3J0IGRvbU9iamVjdHMgZnJvbSAnLi9kb21PYmplY3RzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCB3aW4sIHsgZ2V0V2luZG93IH0gZnJvbSAnLi93aW5kb3cnXG5cbmV4cG9ydCBmdW5jdGlvbiBub2RlQ29udGFpbnMgKHBhcmVudDogTm9kZSB8IEludGVyYWN0LkV2ZW50VGFyZ2V0LCBjaGlsZDogTm9kZSB8IEludGVyYWN0LkV2ZW50VGFyZ2V0KSB7XG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGlmIChjaGlsZCA9PT0gcGFyZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNoaWxkID0gKGNoaWxkIGFzIE5vZGUpLnBhcmVudE5vZGVcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VzdCAoZWxlbWVudDogTm9kZSwgc2VsZWN0b3I6IHN0cmluZykge1xuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIGlmIChtYXRjaGVzU2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3IpKSB7IHJldHVybiBlbGVtZW50IH1cblxuICAgIGVsZW1lbnQgPSBwYXJlbnROb2RlKGVsZW1lbnQpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyZW50Tm9kZSAobm9kZTogTm9kZSB8IERvY3VtZW50KSB7XG4gIGxldCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGVcblxuICBpZiAoaXMuZG9jRnJhZyhwYXJlbnQpKSB7XG4gICAgLy8gc2tpcCBwYXN0ICNzaGFkby1yb290IGZyYWdtZW50c1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIHdoaWxlICgocGFyZW50ID0gKHBhcmVudCBhcyBhbnkpLmhvc3QpICYmIGlzLmRvY0ZyYWcocGFyZW50KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICByZXR1cm4gcGFyZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgLy8gcmVtb3ZlIC9kZWVwLyBmcm9tIHNlbGVjdG9ycyBpZiBzaGFkb3dET00gcG9seWZpbGwgaXMgdXNlZFxuICBpZiAod2luLndpbmRvdyAhPT0gd2luLnJlYWxXaW5kb3cpIHtcbiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoL1xcL2RlZXBcXC8vZywgJyAnKVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRbYnJvd3Nlci5wcmVmaXhlZE1hdGNoZXNTZWxlY3Rvcl0oc2VsZWN0b3IpXG59XG5cbmNvbnN0IGdldFBhcmVudCA9IGVsID0+IGVsLnBhcmVudE5vZGUgPyBlbC5wYXJlbnROb2RlIDogZWwuaG9zdFxuXG4vLyBUZXN0IGZvciB0aGUgZWxlbWVudCB0aGF0J3MgXCJhYm92ZVwiIGFsbCBvdGhlciBxdWFsaWZpZXJzXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZkRlZXBlc3RFbGVtZW50IChlbGVtZW50czogSW50ZXJhY3QuRWxlbWVudFtdIHwgTm9kZUxpc3RPZjxFbGVtZW50Pikge1xuICBsZXQgZGVlcGVzdFpvbmVQYXJlbnRzID0gW11cbiAgbGV0IGRlZXBlc3Rab25lID0gZWxlbWVudHNbMF1cbiAgbGV0IGluZGV4ID0gZGVlcGVzdFpvbmUgPyAwIDogLTFcbiAgbGV0IGlcbiAgbGV0IG5cblxuICBmb3IgKGkgPSAxOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkcm9wem9uZSA9IGVsZW1lbnRzW2ldXG5cbiAgICAvLyBhbiBlbGVtZW50IG1pZ2h0IGJlbG9uZyB0byBtdWx0aXBsZSBzZWxlY3RvciBkcm9wem9uZXNcbiAgICBpZiAoIWRyb3B6b25lIHx8IGRyb3B6b25lID09PSBkZWVwZXN0Wm9uZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIWRlZXBlc3Rab25lKSB7XG4gICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICBpbmRleCA9IGlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGRlZXBlc3Qgb3IgY3VycmVudCBhcmUgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LnJvb3RFbGVtZW50XG4gICAgLy8gLSBpZiB0aGUgY3VycmVudCBkcm9wem9uZSBpcywgZG8gbm90aGluZyBhbmQgY29udGludWVcbiAgICBpZiAoZHJvcHpvbmUucGFyZW50Tm9kZSA9PT0gZHJvcHpvbmUub3duZXJEb2N1bWVudCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgLy8gLSBpZiBkZWVwZXN0IGlzLCB1cGRhdGUgd2l0aCB0aGUgY3VycmVudCBkcm9wem9uZSBhbmQgY29udGludWUgdG8gbmV4dFxuICAgIGVsc2UgaWYgKGRlZXBlc3Rab25lLnBhcmVudE5vZGUgPT09IGRyb3B6b25lLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIGRlZXBlc3Rab25lID0gZHJvcHpvbmVcbiAgICAgIGluZGV4ID0gaVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHpJbmRleCBvZiBzaWJsaW5nc1xuICAgIGlmIChkcm9wem9uZS5wYXJlbnROb2RlID09PSBkZWVwZXN0Wm9uZS5wYXJlbnROb2RlKSB7XG4gICAgICBjb25zdCBkZWVwZXN0WkluZGV4ID0gcGFyc2VJbnQoZ2V0V2luZG93KGRlZXBlc3Rab25lKS5nZXRDb21wdXRlZFN0eWxlKGRlZXBlc3Rab25lKS56SW5kZXgsIDEwKSB8fCAwXG4gICAgICBjb25zdCBkcm9wem9uZVpJbmRleCA9IHBhcnNlSW50KGdldFdpbmRvdyhkcm9wem9uZSkuZ2V0Q29tcHV0ZWRTdHlsZShkcm9wem9uZSkuekluZGV4LCAxMCkgfHwgMFxuXG4gICAgICBpZiAoZHJvcHpvbmVaSW5kZXggPj0gZGVlcGVzdFpJbmRleCkge1xuICAgICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICAgIGluZGV4ID0gaVxuICAgICAgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIHBvcHVsYXRlIHRoZSBhbmNlc3RyeSBhcnJheSBmb3IgdGhlIGxhdGVzdCBkZWVwZXN0IGRyb3B6b25lXG4gICAgaWYgKCFkZWVwZXN0Wm9uZVBhcmVudHMubGVuZ3RoKSB7XG4gICAgICBsZXQgcGFyZW50ID0gZGVlcGVzdFpvbmVcbiAgICAgIGxldCBwYXJlbnRQYXJlbnRcblxuICAgICAgd2hpbGUgKChwYXJlbnRQYXJlbnQgPSBnZXRQYXJlbnQocGFyZW50KSkgJiYgcGFyZW50UGFyZW50ICE9PSBwYXJlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgICBkZWVwZXN0Wm9uZVBhcmVudHMudW5zaGlmdChwYXJlbnQpXG4gICAgICAgIHBhcmVudCA9IHBhcmVudFBhcmVudFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwYXJlbnRcblxuICAgIC8vIGlmIHRoaXMgZWxlbWVudCBpcyBhbiBzdmcgZWxlbWVudCBhbmQgdGhlIGN1cnJlbnQgZGVlcGVzdCBpcyBhblxuICAgIC8vIEhUTUxFbGVtZW50XG4gICAgaWYgKGRlZXBlc3Rab25lIGluc3RhbmNlb2YgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAmJlxuICAgICAgICBkcm9wem9uZSBpbnN0YW5jZW9mIGRvbU9iamVjdHMuU1ZHRWxlbWVudCAmJlxuICAgICAgICAhKGRyb3B6b25lIGluc3RhbmNlb2YgZG9tT2JqZWN0cy5TVkdTVkdFbGVtZW50KSkge1xuICAgICAgaWYgKGRyb3B6b25lID09PSBkZWVwZXN0Wm9uZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IGRyb3B6b25lLm93bmVyU1ZHRWxlbWVudFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHBhcmVudCA9IGRyb3B6b25lXG4gICAgfVxuXG4gICAgY29uc3QgZHJvcHpvbmVQYXJlbnRzID0gW11cblxuICAgIHdoaWxlIChwYXJlbnQucGFyZW50Tm9kZSAhPT0gcGFyZW50Lm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIGRyb3B6b25lUGFyZW50cy51bnNoaWZ0KHBhcmVudClcbiAgICAgIHBhcmVudCA9IGdldFBhcmVudChwYXJlbnQpXG4gICAgfVxuXG4gICAgbiA9IDBcblxuICAgIC8vIGdldCAocG9zaXRpb24gb2YgbGFzdCBjb21tb24gYW5jZXN0b3IpICsgMVxuICAgIHdoaWxlIChkcm9wem9uZVBhcmVudHNbbl0gJiYgZHJvcHpvbmVQYXJlbnRzW25dID09PSBkZWVwZXN0Wm9uZVBhcmVudHNbbl0pIHtcbiAgICAgIG4rK1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudHMgPSBbXG4gICAgICBkcm9wem9uZVBhcmVudHNbbiAtIDFdLFxuICAgICAgZHJvcHpvbmVQYXJlbnRzW25dLFxuICAgICAgZGVlcGVzdFpvbmVQYXJlbnRzW25dLFxuICAgIF1cblxuICAgIGxldCBjaGlsZCA9IHBhcmVudHNbMF0ubGFzdENoaWxkXG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZCA9PT0gcGFyZW50c1sxXSkge1xuICAgICAgICBkZWVwZXN0Wm9uZSA9IGRyb3B6b25lXG4gICAgICAgIGluZGV4ID0gaVxuICAgICAgICBkZWVwZXN0Wm9uZVBhcmVudHMgPSBkcm9wem9uZVBhcmVudHNcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoY2hpbGQgPT09IHBhcmVudHNbMl0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmdcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5kZXhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNVcFRvIChlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nLCBsaW1pdDogTm9kZSkge1xuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIGlmIChtYXRjaGVzU2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGVsZW1lbnQgPSBwYXJlbnROb2RlKGVsZW1lbnQpIGFzIEludGVyYWN0LkVsZW1lbnRcblxuICAgIGlmIChlbGVtZW50ID09PSBsaW1pdCkge1xuICAgICAgcmV0dXJuIG1hdGNoZXNTZWxlY3RvcihlbGVtZW50LCBzZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdHVhbEVsZW1lbnQgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpIHtcbiAgcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgZG9tT2JqZWN0cy5TVkdFbGVtZW50SW5zdGFuY2VcbiAgICA/IChlbGVtZW50IGFzIFNWR0VsZW1lbnQpLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50XG4gICAgOiBlbGVtZW50KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Nyb2xsWFkgKHJlbGV2YW50V2luZG93KSB7XG4gIHJlbGV2YW50V2luZG93ID0gcmVsZXZhbnRXaW5kb3cgfHwgd2luLndpbmRvd1xuICByZXR1cm4ge1xuICAgIHg6IHJlbGV2YW50V2luZG93LnNjcm9sbFggfHwgcmVsZXZhbnRXaW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgeTogcmVsZXZhbnRXaW5kb3cuc2Nyb2xsWSB8fCByZWxldmFudFdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50Q2xpZW50UmVjdCAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICBjb25zdCBjbGllbnRSZWN0ID0gKGVsZW1lbnQgaW5zdGFuY2VvZiBkb21PYmplY3RzLlNWR0VsZW1lbnRcbiAgICA/IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICA6IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKVswXSlcblxuICByZXR1cm4gY2xpZW50UmVjdCAmJiB7XG4gICAgbGVmdCAgOiBjbGllbnRSZWN0LmxlZnQsXG4gICAgcmlnaHQgOiBjbGllbnRSZWN0LnJpZ2h0LFxuICAgIHRvcCAgIDogY2xpZW50UmVjdC50b3AsXG4gICAgYm90dG9tOiBjbGllbnRSZWN0LmJvdHRvbSxcbiAgICB3aWR0aCA6IGNsaWVudFJlY3Qud2lkdGggIHx8IGNsaWVudFJlY3QucmlnaHQgIC0gY2xpZW50UmVjdC5sZWZ0LFxuICAgIGhlaWdodDogY2xpZW50UmVjdC5oZWlnaHQgfHwgY2xpZW50UmVjdC5ib3R0b20gLSBjbGllbnRSZWN0LnRvcCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudFJlY3QgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQpIHtcbiAgY29uc3QgY2xpZW50UmVjdCA9IGdldEVsZW1lbnRDbGllbnRSZWN0KGVsZW1lbnQpXG5cbiAgaWYgKCFicm93c2VyLmlzSU9TNyAmJiBjbGllbnRSZWN0KSB7XG4gICAgY29uc3Qgc2Nyb2xsID0gZ2V0U2Nyb2xsWFkod2luLmdldFdpbmRvdyhlbGVtZW50KSlcblxuICAgIGNsaWVudFJlY3QubGVmdCAgICs9IHNjcm9sbC54XG4gICAgY2xpZW50UmVjdC5yaWdodCAgKz0gc2Nyb2xsLnhcbiAgICBjbGllbnRSZWN0LnRvcCAgICArPSBzY3JvbGwueVxuICAgIGNsaWVudFJlY3QuYm90dG9tICs9IHNjcm9sbC55XG4gIH1cblxuICByZXR1cm4gY2xpZW50UmVjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aCAobm9kZTogTm9kZSB8IERvY3VtZW50KSB7XG4gIGNvbnN0IHBhdGggPSBbXVxuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgcGF0aC5wdXNoKG5vZGUpXG4gICAgbm9kZSA9IHBhcmVudE5vZGUobm9kZSlcbiAgfVxuXG4gIHJldHVybiBwYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlTZWxlY3RvciAodmFsdWUpIHtcbiAgaWYgKCFpcy5zdHJpbmcodmFsdWUpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGlmIGl0IGlzIGludmFsaWRcbiAgZG9tT2JqZWN0cy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHZhbHVlKVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBQb2ludGVyRXh0ZW5kIHtcbiAgd2Via2l0OiBSZWdFeHBcbiAgW3ByZWZpeDogc3RyaW5nXTogUmVnRXhwXG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJFeHRlbmQgKGRlc3QsIHNvdXJjZSkge1xuICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgY29uc3QgcHJlZml4ZWRQcm9wUkVzID0gcG9pbnRlckV4dGVuZC5wcmVmaXhlZFByb3BSRXNcbiAgICBsZXQgZGVwcmVjYXRlZCA9IGZhbHNlXG5cbiAgICAvLyBza2lwIGRlcHJlY2F0ZWQgcHJlZml4ZWQgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3QgdmVuZG9yIGluIHByZWZpeGVkUHJvcFJFcykge1xuICAgICAgaWYgKHByb3AuaW5kZXhPZih2ZW5kb3IpID09PSAwICYmIHByZWZpeGVkUHJvcFJFc1t2ZW5kb3JdLnRlc3QocHJvcCkpIHtcbiAgICAgICAgZGVwcmVjYXRlZCA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWRlcHJlY2F0ZWQgJiYgdHlwZW9mIHNvdXJjZVtwcm9wXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVzdFtwcm9wXSA9IHNvdXJjZVtwcm9wXVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdFxufVxuXG5wb2ludGVyRXh0ZW5kLnByZWZpeGVkUHJvcFJFcyA9IHtcbiAgd2Via2l0OiAvKE1vdmVtZW50W1hZXXxSYWRpdXNbWFldfFJvdGF0aW9uQW5nbGV8Rm9yY2UpJC8sXG4gIG1vejogLyhQcmVzc3VyZSkkLyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcG9pbnRlckV4dGVuZFxuIiwiZXhwb3J0IGRlZmF1bHQgKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiAgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpXG4iLCJpbXBvcnQgYnJvd3NlciBmcm9tICcuL2Jyb3dzZXInXG5pbXBvcnQgZG9tIGZyb20gJy4vZG9tT2JqZWN0cydcbmltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJy4vZG9tVXRpbHMnXG5pbXBvcnQgaHlwb3QgZnJvbSAnLi9oeXBvdCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5pbXBvcnQgcG9pbnRlckV4dGVuZCBmcm9tICcuL3BvaW50ZXJFeHRlbmQnXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5Q29vcmRzIChkZXN0OiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIsIHNyYzogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIGRlc3QucGFnZSA9IGRlc3QucGFnZSB8fCB7fSBhcyBhbnlcbiAgZGVzdC5wYWdlLnggPSBzcmMucGFnZS54XG4gIGRlc3QucGFnZS55ID0gc3JjLnBhZ2UueVxuXG4gIGRlc3QuY2xpZW50ID0gZGVzdC5jbGllbnQgfHwge30gYXMgYW55XG4gIGRlc3QuY2xpZW50LnggPSBzcmMuY2xpZW50LnhcbiAgZGVzdC5jbGllbnQueSA9IHNyYy5jbGllbnQueVxuXG4gIGRlc3QudGltZVN0YW1wID0gc3JjLnRpbWVTdGFtcFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29vcmREZWx0YXMgKHRhcmdldE9iajogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyLCBwcmV2OiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIsIGN1cjogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIHRhcmdldE9iai5wYWdlLnggICAgPSBjdXIucGFnZS54ICAgIC0gcHJldi5wYWdlLnhcbiAgdGFyZ2V0T2JqLnBhZ2UueSAgICA9IGN1ci5wYWdlLnkgICAgLSBwcmV2LnBhZ2UueVxuICB0YXJnZXRPYmouY2xpZW50LnggID0gY3VyLmNsaWVudC54ICAtIHByZXYuY2xpZW50LnhcbiAgdGFyZ2V0T2JqLmNsaWVudC55ICA9IGN1ci5jbGllbnQueSAgLSBwcmV2LmNsaWVudC55XG4gIHRhcmdldE9iai50aW1lU3RhbXAgPSBjdXIudGltZVN0YW1wIC0gcHJldi50aW1lU3RhbXBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb3JkVmVsb2NpdHkgKHRhcmdldE9iajogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyLCBkZWx0YTogSW50ZXJhY3QuQ29vcmRzU2V0TWVtYmVyKSB7XG4gIGNvbnN0IGR0ID0gTWF0aC5tYXgoZGVsdGEudGltZVN0YW1wIC8gMTAwMCwgMC4wMDEpXG5cbiAgdGFyZ2V0T2JqLnBhZ2UueCAgID0gZGVsdGEucGFnZS54IC8gZHRcbiAgdGFyZ2V0T2JqLnBhZ2UueSAgID0gZGVsdGEucGFnZS55IC8gZHRcbiAgdGFyZ2V0T2JqLmNsaWVudC54ID0gZGVsdGEuY2xpZW50LnggLyBkdFxuICB0YXJnZXRPYmouY2xpZW50LnkgPSBkZWx0YS5jbGllbnQueSAvIGR0XG4gIHRhcmdldE9iai50aW1lU3RhbXAgPSBkdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0WmVyb0Nvb3JkcyAodGFyZ2V0T2JqOiBJbnRlcmFjdC5Db29yZHNTZXRNZW1iZXIpIHtcbiAgdGFyZ2V0T2JqLnBhZ2UueCA9IDBcbiAgdGFyZ2V0T2JqLnBhZ2UueSA9IDBcbiAgdGFyZ2V0T2JqLmNsaWVudC54ID0gMFxuICB0YXJnZXRPYmouY2xpZW50LnkgPSAwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05hdGl2ZVBvaW50ZXIgIChwb2ludGVyOiBhbnkpIHtcbiAgcmV0dXJuIChwb2ludGVyIGluc3RhbmNlb2YgZG9tLkV2ZW50IHx8IHBvaW50ZXIgaW5zdGFuY2VvZiBkb20uVG91Y2gpXG59XG5cbi8vIEdldCBzcGVjaWZpZWQgWC9ZIGNvb3JkcyBmb3IgbW91c2Ugb3IgZXZlbnQudG91Y2hlc1swXVxuZXhwb3J0IGZ1bmN0aW9uIGdldFhZICh0eXBlLCBwb2ludGVyLCB4eSkge1xuICB4eSA9IHh5IHx8IHt9XG4gIHR5cGUgPSB0eXBlIHx8ICdwYWdlJ1xuXG4gIHh5LnggPSBwb2ludGVyW3R5cGUgKyAnWCddXG4gIHh5LnkgPSBwb2ludGVyW3R5cGUgKyAnWSddXG5cbiAgcmV0dXJuIHh5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdlWFkgKHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIHwgSW50ZXJhY3QuSW50ZXJhY3RFdmVudCwgcGFnZT86IEludGVyYWN0LlBvaW50KSB7XG4gIHBhZ2UgPSBwYWdlIHx8IHsgeDogMCwgeTogMCB9XG5cbiAgLy8gT3BlcmEgTW9iaWxlIGhhbmRsZXMgdGhlIHZpZXdwb3J0IGFuZCBzY3JvbGxpbmcgb2RkbHlcbiAgaWYgKGJyb3dzZXIuaXNPcGVyYU1vYmlsZSAmJiBpc05hdGl2ZVBvaW50ZXIocG9pbnRlcikpIHtcbiAgICBnZXRYWSgnc2NyZWVuJywgcG9pbnRlciwgcGFnZSlcblxuICAgIHBhZ2UueCArPSB3aW5kb3cuc2Nyb2xsWFxuICAgIHBhZ2UueSArPSB3aW5kb3cuc2Nyb2xsWVxuICB9XG4gIGVsc2Uge1xuICAgIGdldFhZKCdwYWdlJywgcG9pbnRlciwgcGFnZSlcbiAgfVxuXG4gIHJldHVybiBwYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGllbnRYWSAocG9pbnRlciwgY2xpZW50KSB7XG4gIGNsaWVudCA9IGNsaWVudCB8fCB7fVxuXG4gIGlmIChicm93c2VyLmlzT3BlcmFNb2JpbGUgJiYgaXNOYXRpdmVQb2ludGVyKHBvaW50ZXIpKSB7XG4gICAgLy8gT3BlcmEgTW9iaWxlIGhhbmRsZXMgdGhlIHZpZXdwb3J0IGFuZCBzY3JvbGxpbmcgb2RkbHlcbiAgICBnZXRYWSgnc2NyZWVuJywgcG9pbnRlciwgY2xpZW50KVxuICB9XG4gIGVsc2Uge1xuICAgIGdldFhZKCdjbGllbnQnLCBwb2ludGVyLCBjbGllbnQpXG4gIH1cblxuICByZXR1cm4gY2xpZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludGVySWQgKHBvaW50ZXIpIHtcbiAgcmV0dXJuIGlzLm51bWJlcihwb2ludGVyLnBvaW50ZXJJZCkgPyBwb2ludGVyLnBvaW50ZXJJZCA6IHBvaW50ZXIuaWRlbnRpZmllclxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29vcmRzICh0YXJnZXRPYmosIHBvaW50ZXJzOiBhbnlbXSwgdGltZVN0YW1wOiBudW1iZXIpIHtcbiAgY29uc3QgcG9pbnRlciA9IChwb2ludGVycy5sZW5ndGggPiAxXG4gICAgPyBwb2ludGVyQXZlcmFnZShwb2ludGVycylcbiAgICA6IHBvaW50ZXJzWzBdKVxuXG4gIGNvbnN0IHRtcFhZID0ge30gYXMgeyB4OiBudW1iZXIsIHk6IG51bWJlciB9XG5cbiAgZ2V0UGFnZVhZKHBvaW50ZXIsIHRtcFhZKVxuICB0YXJnZXRPYmoucGFnZS54ID0gdG1wWFkueFxuICB0YXJnZXRPYmoucGFnZS55ID0gdG1wWFkueVxuXG4gIGdldENsaWVudFhZKHBvaW50ZXIsIHRtcFhZKVxuICB0YXJnZXRPYmouY2xpZW50LnggPSB0bXBYWS54XG4gIHRhcmdldE9iai5jbGllbnQueSA9IHRtcFhZLnlcblxuICB0YXJnZXRPYmoudGltZVN0YW1wID0gdGltZVN0YW1wXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaFBhaXIgKGV2ZW50KSB7XG4gIGNvbnN0IHRvdWNoZXMgPSBbXVxuXG4gIC8vIGFycmF5IG9mIHRvdWNoZXMgaXMgc3VwcGxpZWRcbiAgaWYgKGlzLmFycmF5KGV2ZW50KSkge1xuICAgIHRvdWNoZXNbMF0gPSBldmVudFswXVxuICAgIHRvdWNoZXNbMV0gPSBldmVudFsxXVxuICB9XG4gIC8vIGFuIGV2ZW50XG4gIGVsc2Uge1xuICAgIGlmIChldmVudC50eXBlID09PSAndG91Y2hlbmQnKSB7XG4gICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdG91Y2hlc1swXSA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgICAgdG91Y2hlc1sxXSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0b3VjaGVzWzBdID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgICAgdG91Y2hlc1sxXSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzFdXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdG91Y2hlc1swXSA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgIHRvdWNoZXNbMV0gPSBldmVudC50b3VjaGVzWzFdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdWNoZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50ZXJBdmVyYWdlIChwb2ludGVyczogUG9pbnRlckV2ZW50W10gfCBFdmVudFtdKSB7XG4gIGNvbnN0IGF2ZXJhZ2UgPSB7XG4gICAgcGFnZVggIDogMCxcbiAgICBwYWdlWSAgOiAwLFxuICAgIGNsaWVudFg6IDAsXG4gICAgY2xpZW50WTogMCxcbiAgICBzY3JlZW5YOiAwLFxuICAgIHNjcmVlblk6IDAsXG4gIH1cblxuICBmb3IgKGNvbnN0IHBvaW50ZXIgb2YgcG9pbnRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gYXZlcmFnZSkge1xuICAgICAgYXZlcmFnZVtwcm9wXSArPSBwb2ludGVyW3Byb3BdXG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgcHJvcCBpbiBhdmVyYWdlKSB7XG4gICAgYXZlcmFnZVtwcm9wXSAvPSBwb2ludGVycy5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiBhdmVyYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b3VjaEJCb3ggKGV2ZW50OiBFdmVudCB8IEFycmF5PChJbnRlcmFjdC5Qb2ludGVyVHlwZSkgfCBUb3VjaEV2ZW50Pikge1xuICBpZiAoIShldmVudCBhcyBhbnkpLmxlbmd0aCAmJlxuICAgICAgISgoZXZlbnQgYXMgVG91Y2hFdmVudCkudG91Y2hlcyAmJlxuICAgICAgICAoZXZlbnQgYXMgVG91Y2hFdmVudCkudG91Y2hlcy5sZW5ndGggPiAxKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB0b3VjaGVzID0gZ2V0VG91Y2hQYWlyKGV2ZW50KVxuICBjb25zdCBtaW5YID0gTWF0aC5taW4odG91Y2hlc1swXS5wYWdlWCwgdG91Y2hlc1sxXS5wYWdlWClcbiAgY29uc3QgbWluWSA9IE1hdGgubWluKHRvdWNoZXNbMF0ucGFnZVksIHRvdWNoZXNbMV0ucGFnZVkpXG4gIGNvbnN0IG1heFggPSBNYXRoLm1heCh0b3VjaGVzWzBdLnBhZ2VYLCB0b3VjaGVzWzFdLnBhZ2VYKVxuICBjb25zdCBtYXhZID0gTWF0aC5tYXgodG91Y2hlc1swXS5wYWdlWSwgdG91Y2hlc1sxXS5wYWdlWSlcblxuICByZXR1cm4ge1xuICAgIHg6IG1pblgsXG4gICAgeTogbWluWSxcbiAgICBsZWZ0OiBtaW5YLFxuICAgIHRvcDogbWluWSxcbiAgICByaWdodDogbWF4WCxcbiAgICBib3R0b206IG1heFksXG4gICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoRGlzdGFuY2UgKGV2ZW50LCBkZWx0YVNvdXJjZSkge1xuICBjb25zdCBzb3VyY2VYID0gZGVsdGFTb3VyY2UgKyAnWCdcbiAgY29uc3Qgc291cmNlWSA9IGRlbHRhU291cmNlICsgJ1knXG4gIGNvbnN0IHRvdWNoZXMgPSBnZXRUb3VjaFBhaXIoZXZlbnQpXG5cbiAgY29uc3QgZHggPSB0b3VjaGVzWzBdW3NvdXJjZVhdIC0gdG91Y2hlc1sxXVtzb3VyY2VYXVxuICBjb25zdCBkeSA9IHRvdWNoZXNbMF1bc291cmNlWV0gLSB0b3VjaGVzWzFdW3NvdXJjZVldXG5cbiAgcmV0dXJuIGh5cG90KGR4LCBkeSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoQW5nbGUgKGV2ZW50LCBkZWx0YVNvdXJjZSkge1xuICBjb25zdCBzb3VyY2VYID0gZGVsdGFTb3VyY2UgKyAnWCdcbiAgY29uc3Qgc291cmNlWSA9IGRlbHRhU291cmNlICsgJ1knXG4gIGNvbnN0IHRvdWNoZXMgPSBnZXRUb3VjaFBhaXIoZXZlbnQpXG4gIGNvbnN0IGR4ID0gdG91Y2hlc1sxXVtzb3VyY2VYXSAtIHRvdWNoZXNbMF1bc291cmNlWF1cbiAgY29uc3QgZHkgPSB0b3VjaGVzWzFdW3NvdXJjZVldIC0gdG91Y2hlc1swXVtzb3VyY2VZXVxuICBjb25zdCBhbmdsZSA9IDE4MCAqIE1hdGguYXRhbjIoZHksIGR4KSAvIE1hdGguUElcblxuICByZXR1cm4gIGFuZ2xlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludGVyVHlwZSAocG9pbnRlcikge1xuICByZXR1cm4gaXMuc3RyaW5nKHBvaW50ZXIucG9pbnRlclR5cGUpXG4gICAgPyBwb2ludGVyLnBvaW50ZXJUeXBlXG4gICAgOiBpcy5udW1iZXIocG9pbnRlci5wb2ludGVyVHlwZSlcbiAgICAgID8gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAndG91Y2gnLCAncGVuJywgJ21vdXNlJ11bcG9pbnRlci5wb2ludGVyVHlwZV1cbiAgICAgIC8vIGlmIHRoZSBQb2ludGVyRXZlbnQgQVBJIGlzbid0IGF2YWlsYWJsZSwgdGhlbiB0aGUgXCJwb2ludGVyXCIgbXVzdFxuICAgICAgLy8gYmUgZWl0aGVyIGEgTW91c2VFdmVudCwgVG91Y2hFdmVudCwgb3IgVG91Y2ggb2JqZWN0XG4gICAgICA6IC90b3VjaC8udGVzdChwb2ludGVyLnR5cGUpIHx8IHBvaW50ZXIgaW5zdGFuY2VvZiBkb20uVG91Y2hcbiAgICAgICAgPyAndG91Y2gnXG4gICAgICAgIDogJ21vdXNlJ1xufVxuXG4vLyBbIGV2ZW50LnRhcmdldCwgZXZlbnQuY3VycmVudFRhcmdldCBdXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXRzIChldmVudCkge1xuICBjb25zdCBwYXRoID0gaXMuZnVuYyhldmVudC5jb21wb3NlZFBhdGgpID8gZXZlbnQuY29tcG9zZWRQYXRoKCkgOiBldmVudC5wYXRoXG5cbiAgcmV0dXJuIFtcbiAgICBkb21VdGlscy5nZXRBY3R1YWxFbGVtZW50KHBhdGggPyBwYXRoWzBdIDogZXZlbnQudGFyZ2V0KSxcbiAgICBkb21VdGlscy5nZXRBY3R1YWxFbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQpLFxuICBdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdDb29yZHMgKCk6IEludGVyYWN0LkNvb3Jkc1NldE1lbWJlciB7XG4gIHJldHVybiB7XG4gICAgcGFnZSAgICAgOiB7IHg6IDAsIHk6IDAgfSxcbiAgICBjbGllbnQgICA6IHsgeDogMCwgeTogMCB9LFxuICAgIHRpbWVTdGFtcDogMCxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29vcmRzVG9FdmVudCAoY29vcmRzOiBNb2NrQ29vcmRzKSB7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIGNvb3JkcyxcbiAgICBnZXQgcGFnZSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5wYWdlIH0sXG4gICAgZ2V0IGNsaWVudCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5jbGllbnQgfSxcbiAgICBnZXQgdGltZVN0YW1wICgpIHsgcmV0dXJuIHRoaXMuY29vcmRzLnRpbWVTdGFtcCB9LFxuICAgIGdldCBwYWdlWCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5wYWdlLnggfSxcbiAgICBnZXQgcGFnZVkgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMucGFnZS55IH0sXG4gICAgZ2V0IGNsaWVudFggKCkgeyByZXR1cm4gdGhpcy5jb29yZHMuY2xpZW50LnggfSxcbiAgICBnZXQgY2xpZW50WSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy5jbGllbnQueSB9LFxuICAgIGdldCBwb2ludGVySWQgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMucG9pbnRlcklkIH0sXG4gICAgZ2V0IHRhcmdldCAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy50YXJnZXQgfSxcbiAgICBnZXQgdHlwZSAoKSB7IHJldHVybiB0aGlzLmNvb3Jkcy50eXBlIH0sXG4gICAgZ2V0IHBvaW50ZXJUeXBlICgpIHsgcmV0dXJuIHRoaXMuY29vcmRzLnBvaW50ZXJUeXBlIH0sXG4gICAgZ2V0IGJ1dHRvbnMgKCkgeyByZXR1cm4gdGhpcy5jb29yZHMuYnV0dG9ucyB9LFxuICAgIHByZXZlbnREZWZhdWx0ICgpIHt9LFxuICB9XG5cbiAgcmV0dXJuIGV2ZW50IGFzIHR5cGVvZiBldmVudCAmIEludGVyYWN0LlBvaW50ZXJUeXBlICYgSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vY2tDb29yZHMge1xuICBwYWdlOiBJbnRlcmFjdC5Qb2ludFxuICBjbGllbnQ6IEludGVyYWN0LlBvaW50XG4gIHRpbWVTdGFtcD86IG51bWJlclxuICBwb2ludGVySWQ/OiBhbnlcbiAgdGFyZ2V0PzogYW55XG4gIHR5cGU/OiBzdHJpbmdcbiAgcG9pbnRlclR5cGU/OiBzdHJpbmdcbiAgYnV0dG9ucz86IG51bWJlclxufVxuXG5leHBvcnQgeyBwb2ludGVyRXh0ZW5kIH1cbiIsImltcG9ydCB7IGNvbnRhaW5zIH0gZnJvbSAnLi9hcnInXG5pbXBvcnQgKiBhcyBkb21VdGlscyBmcm9tICcuL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnLi9pcydcbmltcG9ydCBwRXh0ZW5kIGZyb20gJy4vcG9pbnRlckV4dGVuZCdcbmltcG9ydCAqIGFzIHBvaW50ZXJVdGlscyBmcm9tICcuL3BvaW50ZXJVdGlscydcblxudHlwZSBMaXN0ZW5lciA9IChldmVudDogRXZlbnQgfCBGYWtlRXZlbnQpID0+IGFueVxuXG5jb25zdCBlbGVtZW50czogRXZlbnRUYXJnZXRbXSA9IFtdXG5jb25zdCB0YXJnZXRzOiBBcnJheTx7XG4gIGV2ZW50czogeyBbdHlwZTogc3RyaW5nXTogTGlzdGVuZXJbXSB9XG4gIHR5cGVDb3VudDogbnVtYmVyXG59PiA9IFtdXG5cbmNvbnN0IGRlbGVnYXRlZEV2ZW50czoge1xuICBbdHlwZTogc3RyaW5nXToge1xuICAgIHNlbGVjdG9yczogc3RyaW5nW11cbiAgICBjb250ZXh0czogTm9kZVtdXG4gICAgbGlzdGVuZXJzOiBBcnJheTxBcnJheTxbTGlzdGVuZXIsIGJvb2xlYW4sIGJvb2xlYW5dPj5cbiAgfVxufSA9IHt9XG5jb25zdCBkb2N1bWVudHM6IERvY3VtZW50W10gPSBbXVxuXG5mdW5jdGlvbiBhZGQgKGVsZW1lbnQ6IEV2ZW50VGFyZ2V0LCB0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgb3B0aW9uYWxBcmc/OiBib29sZWFuIHwgYW55KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbmFsQXJnKVxuICBsZXQgZWxlbWVudEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KVxuICBsZXQgdGFyZ2V0ID0gdGFyZ2V0c1tlbGVtZW50SW5kZXhdXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0YXJnZXQgPSB7XG4gICAgICBldmVudHM6IHt9LFxuICAgICAgdHlwZUNvdW50OiAwLFxuICAgIH1cblxuICAgIGVsZW1lbnRJbmRleCA9IGVsZW1lbnRzLnB1c2goZWxlbWVudCkgLSAxXG4gICAgdGFyZ2V0cy5wdXNoKHRhcmdldClcbiAgfVxuXG4gIGlmICghdGFyZ2V0LmV2ZW50c1t0eXBlXSkge1xuICAgIHRhcmdldC5ldmVudHNbdHlwZV0gPSBbXVxuICAgIHRhcmdldC50eXBlQ291bnQrK1xuICB9XG5cbiAgaWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciAmJiAhY29udGFpbnModGFyZ2V0LmV2ZW50c1t0eXBlXSwgbGlzdGVuZXIpKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyIGFzIGFueSwgZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZSlcbiAgICB0YXJnZXQuZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlIChlbGVtZW50OiBFdmVudFRhcmdldCwgdHlwZTogc3RyaW5nLCBsaXN0ZW5lcj86ICdhbGwnIHwgTGlzdGVuZXIsIG9wdGlvbmFsQXJnPzogYm9vbGVhbiB8IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgY29uc3QgZWxlbWVudEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KVxuICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzW2VsZW1lbnRJbmRleF1cblxuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmV2ZW50cykge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdhbGwnKSB7XG4gICAgZm9yICh0eXBlIGluIHRhcmdldC5ldmVudHMpIHtcbiAgICAgIGlmICh0YXJnZXQuZXZlbnRzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICAgIHJlbW92ZShlbGVtZW50LCB0eXBlLCAnYWxsJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGFyZ2V0LmV2ZW50c1t0eXBlXSkge1xuICAgIGNvbnN0IGxlbiA9IHRhcmdldC5ldmVudHNbdHlwZV0ubGVuZ3RoXG5cbiAgICBpZiAobGlzdGVuZXIgPT09ICdhbGwnKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHJlbW92ZShlbGVtZW50LCB0eXBlLCB0YXJnZXQuZXZlbnRzW3R5cGVdW2ldLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyICYmIHRhcmdldC5ldmVudHNbdHlwZV1baV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyIGFzIGFueSwgZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICB0YXJnZXQuZXZlbnRzW3R5cGVdLnNwbGljZShpLCAxKVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YXJnZXQuZXZlbnRzW3R5cGVdICYmIHRhcmdldC5ldmVudHNbdHlwZV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAodGFyZ2V0LmV2ZW50c1t0eXBlXSBhcyBhbnkpID0gbnVsbFxuICAgICAgdGFyZ2V0LnR5cGVDb3VudC0tXG4gICAgfVxuICB9XG5cbiAgaWYgKCF0YXJnZXQudHlwZUNvdW50KSB7XG4gICAgdGFyZ2V0cy5zcGxpY2UoZWxlbWVudEluZGV4LCAxKVxuICAgIGVsZW1lbnRzLnNwbGljZShlbGVtZW50SW5kZXgsIDEpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGVsZWdhdGUgKHNlbGVjdG9yOiBzdHJpbmcsIGNvbnRleHQ6IE5vZGUsIHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IExpc3RlbmVyLCBvcHRpb25hbEFyZz86IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgaWYgKCFkZWxlZ2F0ZWRFdmVudHNbdHlwZV0pIHtcbiAgICBkZWxlZ2F0ZWRFdmVudHNbdHlwZV0gPSB7XG4gICAgICBjb250ZXh0cyA6IFtdLFxuICAgICAgbGlzdGVuZXJzOiBbXSxcbiAgICAgIHNlbGVjdG9yczogW10sXG4gICAgfVxuXG4gICAgLy8gYWRkIGRlbGVnYXRlIGxpc3RlbmVyIGZ1bmN0aW9uc1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3VtZW50cykge1xuICAgICAgYWRkKGRvYywgdHlwZSwgZGVsZWdhdGVMaXN0ZW5lcilcbiAgICAgIGFkZChkb2MsIHR5cGUsIGRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWxlZ2F0ZWQgPSBkZWxlZ2F0ZWRFdmVudHNbdHlwZV1cbiAgbGV0IGluZGV4XG5cbiAgZm9yIChpbmRleCA9IGRlbGVnYXRlZC5zZWxlY3RvcnMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzW2luZGV4XSA9PT0gc2VsZWN0b3IgJiZcbiAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzW2luZGV4XSA9PT0gY29udGV4dCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgaW5kZXggPSBkZWxlZ2F0ZWQuc2VsZWN0b3JzLmxlbmd0aFxuXG4gICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5wdXNoKHNlbGVjdG9yKVxuICAgIGRlbGVnYXRlZC5jb250ZXh0cy5wdXNoKGNvbnRleHQpXG4gICAgZGVsZWdhdGVkLmxpc3RlbmVycy5wdXNoKFtdKVxuICB9XG5cbiAgLy8ga2VlcCBsaXN0ZW5lciBhbmQgY2FwdHVyZSBhbmQgcGFzc2l2ZSBmbGFnc1xuICBkZWxlZ2F0ZWQubGlzdGVuZXJzW2luZGV4XS5wdXNoKFtsaXN0ZW5lciwgISFvcHRpb25zLmNhcHR1cmUsIG9wdGlvbnMucGFzc2l2ZV0pXG59XG5cbmZ1bmN0aW9uIHJlbW92ZURlbGVnYXRlIChcbiAgc2VsZWN0b3I6IHN0cmluZyxcbiAgY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50LFxuICB0eXBlOiBzdHJpbmcsXG4gIGxpc3RlbmVyPzogTGlzdGVuZXIsXG4gIG9wdGlvbmFsQXJnPzogYW55LFxuKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbmFsQXJnKVxuICBjb25zdCBkZWxlZ2F0ZWQgPSBkZWxlZ2F0ZWRFdmVudHNbdHlwZV1cbiAgbGV0IG1hdGNoRm91bmQgPSBmYWxzZVxuICBsZXQgaW5kZXhcblxuICBpZiAoIWRlbGVnYXRlZCkgeyByZXR1cm4gfVxuXG4gIC8vIGNvdW50IGZyb20gbGFzdCBpbmRleCBvZiBkZWxlZ2F0ZWQgdG8gMFxuICBmb3IgKGluZGV4ID0gZGVsZWdhdGVkLnNlbGVjdG9ycy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgLy8gbG9vayBmb3IgbWF0Y2hpbmcgc2VsZWN0b3IgYW5kIGNvbnRleHQgTm9kZVxuICAgIGlmIChkZWxlZ2F0ZWQuc2VsZWN0b3JzW2luZGV4XSA9PT0gc2VsZWN0b3IgJiZcbiAgICAgICAgZGVsZWdhdGVkLmNvbnRleHRzW2luZGV4XSA9PT0gY29udGV4dCkge1xuICAgICAgY29uc3QgbGlzdGVuZXJzID0gZGVsZWdhdGVkLmxpc3RlbmVyc1tpbmRleF1cblxuICAgICAgLy8gZWFjaCBpdGVtIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkgaXMgYW4gYXJyYXk6IFtmdW5jdGlvbiwgY2FwdHVyZSwgcGFzc2l2ZV1cbiAgICAgIGZvciAobGV0IGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgW2ZuLCBjYXB0dXJlLCBwYXNzaXZlXSA9IGxpc3RlbmVyc1tpXVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBsaXN0ZW5lciBmdW5jdGlvbnMgYW5kIGNhcHR1cmUgYW5kIHBhc3NpdmUgZmxhZ3MgbWF0Y2hcbiAgICAgICAgaWYgKGZuID09PSBsaXN0ZW5lciAmJiBjYXB0dXJlID09PSAhIW9wdGlvbnMuY2FwdHVyZSAmJiBwYXNzaXZlID09PSBvcHRpb25zLnBhc3NpdmUpIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGFycmF5IG9mIGxpc3RlbmVyc1xuICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSlcblxuICAgICAgICAgIC8vIGlmIGFsbCBsaXN0ZW5lcnMgZm9yIHRoaXMgaW50ZXJhY3RhYmxlIGhhdmUgYmVlbiByZW1vdmVkXG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBpbnRlcmFjdGFibGUgZnJvbSB0aGUgZGVsZWdhdGVkIGFycmF5c1xuICAgICAgICAgIGlmICghbGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGVsZWdhdGVkLnNlbGVjdG9ycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICBkZWxlZ2F0ZWQuY29udGV4dHMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgZGVsZWdhdGVkLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpXG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBkZWxlZ2F0ZSBmdW5jdGlvbiBmcm9tIGNvbnRleHRcbiAgICAgICAgICAgIHJlbW92ZShjb250ZXh0LCB0eXBlLCBkZWxlZ2F0ZUxpc3RlbmVyKVxuICAgICAgICAgICAgcmVtb3ZlKGNvbnRleHQsIHR5cGUsIGRlbGVnYXRlVXNlQ2FwdHVyZSwgdHJ1ZSlcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBhcnJheXMgaWYgdGhleSBhcmUgZW1wdHlcbiAgICAgICAgICAgIGlmICghZGVsZWdhdGVkLnNlbGVjdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZGVsZWdhdGVkRXZlbnRzW3R5cGVdID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG9ubHkgcmVtb3ZlIG9uZSBsaXN0ZW5lclxuICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hGb3VuZCkgeyBicmVhayB9XG4gICAgfVxuICB9XG59XG5cbi8vIGJvdW5kIHRvIHRoZSBpbnRlcmFjdGFibGUgY29udGV4dCB3aGVuIGEgRE9NIGV2ZW50XG4vLyBsaXN0ZW5lciBpcyBhZGRlZCB0byBhIHNlbGVjdG9yIGludGVyYWN0YWJsZVxuZnVuY3Rpb24gZGVsZWdhdGVMaXN0ZW5lciAoZXZlbnQ6IEV2ZW50LCBvcHRpb25hbEFyZz86IGFueSkge1xuICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25hbEFyZylcbiAgY29uc3QgZmFrZUV2ZW50ID0gbmV3IEZha2VFdmVudChldmVudClcbiAgY29uc3QgZGVsZWdhdGVkID0gZGVsZWdhdGVkRXZlbnRzW2V2ZW50LnR5cGVdXG4gIGNvbnN0IFtldmVudFRhcmdldF0gPSAocG9pbnRlclV0aWxzLmdldEV2ZW50VGFyZ2V0cyhldmVudCkpXG4gIGxldCBlbGVtZW50OiBOb2RlID0gZXZlbnRUYXJnZXRcblxuICAvLyBjbGltYiB1cCBkb2N1bWVudCB0cmVlIGxvb2tpbmcgZm9yIHNlbGVjdG9yIG1hdGNoZXNcbiAgd2hpbGUgKGlzLmVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbGVnYXRlZC5zZWxlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gZGVsZWdhdGVkLnNlbGVjdG9yc1tpXVxuICAgICAgY29uc3QgY29udGV4dCA9IGRlbGVnYXRlZC5jb250ZXh0c1tpXVxuXG4gICAgICBpZiAoZG9tVXRpbHMubWF0Y2hlc1NlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKSAmJlxuICAgICAgICAgIGRvbVV0aWxzLm5vZGVDb250YWlucyhjb250ZXh0LCBldmVudFRhcmdldCkgJiZcbiAgICAgICAgICBkb21VdGlscy5ub2RlQ29udGFpbnMoY29udGV4dCwgZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZGVsZWdhdGVkLmxpc3RlbmVyc1tpXVxuXG4gICAgICAgIGZha2VFdmVudC5jdXJyZW50VGFyZ2V0ID0gZWxlbWVudFxuXG4gICAgICAgIGZvciAoY29uc3QgW2ZuLCBjYXB0dXJlLCBwYXNzaXZlXSBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICBpZiAoY2FwdHVyZSA9PT0gISFvcHRpb25zLmNhcHR1cmUgJiYgcGFzc2l2ZSA9PT0gb3B0aW9ucy5wYXNzaXZlKSB7XG4gICAgICAgICAgICBmbihmYWtlRXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGRvbVV0aWxzLnBhcmVudE5vZGUoZWxlbWVudClcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxlZ2F0ZVVzZUNhcHR1cmUgKGV2ZW50OiBFdmVudCkge1xuICByZXR1cm4gZGVsZWdhdGVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50LCB0cnVlKVxufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zIChwYXJhbTogb2JqZWN0KSB7XG4gIHJldHVybiBpcy5vYmplY3QocGFyYW0pID8gcGFyYW0gOiB7IGNhcHR1cmU6IHBhcmFtIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZha2VFdmVudCBpbXBsZW1lbnRzIFBhcnRpYWw8RXZlbnQ+IHtcbiAgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXRcblxuICBjb25zdHJ1Y3RvciAocHVibGljIG9yaWdpbmFsRXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZHVwbGljYXRlIHRoZSBldmVudCBzbyB0aGF0IGN1cnJlbnRUYXJnZXQgY2FuIGJlIGNoYW5nZWRcbiAgICBwRXh0ZW5kKHRoaXMsIG9yaWdpbmFsRXZlbnQpXG4gIH1cblxuICBwcmV2ZW50T3JpZ2luYWxEZWZhdWx0ICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgc3RvcFByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgfVxuXG4gIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiAoKSB7XG4gICAgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gIH1cbn1cblxuY29uc3QgZXZlbnRzID0ge1xuICBhZGQsXG4gIHJlbW92ZSxcblxuICBhZGREZWxlZ2F0ZSxcbiAgcmVtb3ZlRGVsZWdhdGUsXG5cbiAgZGVsZWdhdGVMaXN0ZW5lcixcbiAgZGVsZWdhdGVVc2VDYXB0dXJlLFxuICBkZWxlZ2F0ZWRFdmVudHMsXG4gIGRvY3VtZW50cyxcblxuICBzdXBwb3J0c09wdGlvbnM6IGZhbHNlLFxuICBzdXBwb3J0c1Bhc3NpdmU6IGZhbHNlLFxuXG4gIF9lbGVtZW50czogZWxlbWVudHMsXG4gIF90YXJnZXRzOiB0YXJnZXRzLFxuXG4gIGluaXQgKHdpbmRvdzogV2luZG93KSB7XG4gICAgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCB7XG4gICAgICBnZXQgY2FwdHVyZSAoKSB7IHJldHVybiAoZXZlbnRzLnN1cHBvcnRzT3B0aW9ucyA9IHRydWUpIH0sXG4gICAgICBnZXQgcGFzc2l2ZSAoKSB7IHJldHVybiAoZXZlbnRzLnN1cHBvcnRzUGFzc2l2ZSA9IHRydWUpIH0sXG4gICAgfSlcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXZlbnRzXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRlbmQ8VCwgVSBleHRlbmRzIG9iamVjdD4gKGRlc3Q6IFUgJiBQYXJ0aWFsPFQ+LCBzb3VyY2U6IFQpOiBUICYgVSB7XG4gIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAoZGVzdCBhcyB1bmtub3duIGFzIFQpW3Byb3BdID0gc291cmNlW3Byb3BdXG4gIH1cblxuICBjb25zdCByZXQgPSBkZXN0IGFzIFQgJiBVXG5cbiAgcmV0dXJuIHJldFxufVxuIiwiaW1wb3J0IGV4dGVuZCBmcm9tICcuL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJy4vaXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZExpc3RlbmVycyB7XG4gIFt0eXBlOiBzdHJpbmddOiBJbnRlcmFjdC5MaXN0ZW5lcltdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZSAoXG4gIHR5cGU6IEludGVyYWN0LkV2ZW50VHlwZXMsXG4gIGxpc3RlbmVycz86IEludGVyYWN0Lkxpc3RlbmVyc0FyZyB8IEludGVyYWN0Lkxpc3RlbmVyc0FyZ1tdLFxuICByZXN1bHQ/OiBOb3JtYWxpemVkTGlzdGVuZXJzLFxuKTogTm9ybWFsaXplZExpc3RlbmVycyB7XG4gIHJlc3VsdCA9IHJlc3VsdCB8fCB7fVxuXG4gIGlmIChpcy5zdHJpbmcodHlwZSkgJiYgdHlwZS5zZWFyY2goJyAnKSAhPT0gLTEpIHtcbiAgICB0eXBlID0gc3BsaXQodHlwZSlcbiAgfVxuXG4gIGlmIChpcy5hcnJheSh0eXBlKSkge1xuICAgIHJldHVybiB0eXBlLnJlZHVjZTxOb3JtYWxpemVkTGlzdGVuZXJzPihcbiAgICAgIChhY2MsIHQpID0+IGV4dGVuZChhY2MsIG5vcm1hbGl6ZSh0LCBsaXN0ZW5lcnMsIHJlc3VsdCkpLFxuICAgICAgcmVzdWx0LFxuICAgIClcbiAgfVxuXG4gIC8vICh7IHR5cGU6IGZuIH0pIC0+ICgnJywgeyB0eXBlOiBmbiB9KVxuICBpZiAoaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgbGlzdGVuZXJzID0gdHlwZVxuICAgIHR5cGUgPSAnJ1xuICB9XG5cbiAgaWYgKGlzLmZ1bmMobGlzdGVuZXJzKSkge1xuICAgIHJlc3VsdFt0eXBlXSA9IHJlc3VsdFt0eXBlXSB8fCBbXVxuICAgIHJlc3VsdFt0eXBlXS5wdXNoKGxpc3RlbmVycylcbiAgfVxuICBlbHNlIGlmIChpcy5hcnJheShsaXN0ZW5lcnMpKSB7XG4gICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgbm9ybWFsaXplKHR5cGUsIGwsIHJlc3VsdClcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAoaXMub2JqZWN0KGxpc3RlbmVycykpIHtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkVHlwZXMgPSBzcGxpdChwcmVmaXgpLm1hcChwID0+IGAke3R5cGV9JHtwfWApXG5cbiAgICAgIG5vcm1hbGl6ZShjb21iaW5lZFR5cGVzLCBsaXN0ZW5lcnNbcHJlZml4XSwgcmVzdWx0KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgYXMgTm9ybWFsaXplZExpc3RlbmVyc1xufVxuXG5mdW5jdGlvbiBzcGxpdCAodHlwZTogc3RyaW5nKSB7XG4gIHJldHVybiB0eXBlLnRyaW0oKS5zcGxpdCgvICsvKVxufVxuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcbmltcG9ydCBleHRlbmQgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IG5vcm1hbGl6ZSwgeyBOb3JtYWxpemVkTGlzdGVuZXJzIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvbm9ybWFsaXplTGlzdGVuZXJzJ1xuXG5mdW5jdGlvbiBmaXJlVW50aWxJbW1lZGlhdGVTdG9wcGVkPFxuICBUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZSxcbiAgUCBleHRlbmRzIEludGVyYWN0LkV2ZW50UGhhc2UsXG4+IChldmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxULCBQPiwgbGlzdGVuZXJzOiBJbnRlcmFjdC5MaXN0ZW5lcltdKSB7XG4gIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgaWYgKGV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCkgeyBicmVhayB9XG5cbiAgICBsaXN0ZW5lcihldmVudClcbiAgfVxufVxuXG5jbGFzcyBFdmVudGFibGUge1xuICBvcHRpb25zOiBhbnlcbiAgdHlwZXM6IE5vcm1hbGl6ZWRMaXN0ZW5lcnMgPSB7fVxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBnbG9iYWw6IGFueVxuXG4gIGNvbnN0cnVjdG9yIChvcHRpb25zPzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zIHx8IHt9KVxuICB9XG5cbiAgZmlyZSAoZXZlbnQ6IGFueSkge1xuICAgIGxldCBsaXN0ZW5lcnNcbiAgICBjb25zdCBnbG9iYWwgPSB0aGlzLmdsb2JhbFxuXG4gICAgLy8gSW50ZXJhY3RhYmxlI29uKCkgbGlzdGVuZXJzXG4gICAgLy8gdHNsaW50OmRpc2FibGUgbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICAgIGlmICgobGlzdGVuZXJzID0gdGhpcy50eXBlc1tldmVudC50eXBlXSkpIHtcbiAgICAgIGZpcmVVbnRpbEltbWVkaWF0ZVN0b3BwZWQoZXZlbnQsIGxpc3RlbmVycylcbiAgICB9XG5cbiAgICAvLyBpbnRlcmFjdC5vbigpIGxpc3RlbmVyc1xuICAgIGlmICghZXZlbnQucHJvcGFnYXRpb25TdG9wcGVkICYmIGdsb2JhbCAmJiAobGlzdGVuZXJzID0gZ2xvYmFsW2V2ZW50LnR5cGVdKSkgIHtcbiAgICAgIGZpcmVVbnRpbEltbWVkaWF0ZVN0b3BwZWQoZXZlbnQsIGxpc3RlbmVycylcbiAgICB9XG4gIH1cblxuICBvbiAodHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogSW50ZXJhY3QuTGlzdGVuZXJzQXJnKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gbm9ybWFsaXplKHR5cGUsIGxpc3RlbmVyKVxuXG4gICAgZm9yICh0eXBlIGluIGxpc3RlbmVycykge1xuICAgICAgdGhpcy50eXBlc1t0eXBlXSA9IGFyci5tZXJnZSh0aGlzLnR5cGVzW3R5cGVdIHx8IFtdLCBsaXN0ZW5lcnNbdHlwZV0pXG4gICAgfVxuICB9XG5cbiAgb2ZmICh0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBJbnRlcmFjdC5MaXN0ZW5lcnNBcmcpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBub3JtYWxpemUodHlwZSwgbGlzdGVuZXIpXG5cbiAgICBmb3IgKHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBjb25zdCBldmVudExpc3QgPSB0aGlzLnR5cGVzW3R5cGVdXG5cbiAgICAgIGlmICghZXZlbnRMaXN0IHx8ICFldmVudExpc3QubGVuZ3RoKSB7IGNvbnRpbnVlIH1cblxuICAgICAgZm9yIChjb25zdCBzdWJMaXN0ZW5lciBvZiBsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBldmVudExpc3QuaW5kZXhPZihzdWJMaXN0ZW5lcilcblxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZXZlbnRMaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJlY3QgKF9lbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KTogSW50ZXJhY3QuUmVjdCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudGFibGVcbiIsImltcG9ydCB7IGNsb3Nlc3QsIGdldEVsZW1lbnRSZWN0LCBwYXJlbnROb2RlIH0gZnJvbSAnLi9kb21VdGlscydcbmltcG9ydCBleHRlbmQgZnJvbSAnLi9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICcuL2lzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nT3B0aW9uUmVzdWx0ICh2YWx1ZTogYW55LCB0YXJnZXQ6IEludGVyYWN0Lkhhc0dldFJlY3QsIGVsZW1lbnQpIHtcbiAgaWYgKHZhbHVlID09PSAncGFyZW50JykgeyByZXR1cm4gcGFyZW50Tm9kZShlbGVtZW50KSB9XG5cbiAgaWYgKHZhbHVlID09PSAnc2VsZicpIHsgcmV0dXJuIHRhcmdldC5nZXRSZWN0KGVsZW1lbnQpIH1cblxuICByZXR1cm4gY2xvc2VzdChlbGVtZW50LCB2YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWN0TGlrZTxUIGV4dGVuZHMgYW55W10+IChcbiAgdmFsdWU6IEludGVyYWN0LlJlY3RSZXNvbHZhYmxlPFQ+LFxuICB0YXJnZXQ/OiBJbnRlcmFjdC5IYXNHZXRSZWN0LFxuICBlbGVtZW50PzogTm9kZSxcbiAgZnVuY3Rpb25BcmdzPzogVCxcbikge1xuICBsZXQgcmV0dXJuVmFsdWU6IGFueSA9IHZhbHVlXG4gIGlmIChpcy5zdHJpbmcocmV0dXJuVmFsdWUpKSB7XG4gICAgcmV0dXJuVmFsdWUgPSBnZXRTdHJpbmdPcHRpb25SZXN1bHQocmV0dXJuVmFsdWUsIHRhcmdldCwgZWxlbWVudClcbiAgfVxuICBlbHNlIGlmIChpcy5mdW5jKHJldHVyblZhbHVlKSkge1xuICAgIHJldHVyblZhbHVlID0gcmV0dXJuVmFsdWUoLi4uZnVuY3Rpb25BcmdzKVxuICB9XG5cbiAgaWYgKGlzLmVsZW1lbnQocmV0dXJuVmFsdWUpKSB7XG4gICAgcmV0dXJuVmFsdWUgPSBnZXRFbGVtZW50UmVjdChyZXR1cm5WYWx1ZSlcbiAgfVxuXG4gIHJldHVybiByZXR1cm5WYWx1ZSBhcyBJbnRlcmFjdC5SZWN0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWN0VG9YWSAocmVjdCkge1xuICByZXR1cm4gIHJlY3QgJiYge1xuICAgIHg6ICd4JyBpbiByZWN0ID8gcmVjdC54IDogcmVjdC5sZWZ0LFxuICAgIHk6ICd5JyBpbiByZWN0ID8gcmVjdC55IDogcmVjdC50b3AsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHh5d2hUb1RsYnIgKHJlY3QpIHtcbiAgaWYgKHJlY3QgJiYgISgnbGVmdCcgaW4gcmVjdCAmJiAndG9wJyBpbiByZWN0KSkge1xuICAgIHJlY3QgPSBleHRlbmQoe30sIHJlY3QpXG5cbiAgICByZWN0LmxlZnQgICA9IHJlY3QueCB8fCAwXG4gICAgcmVjdC50b3AgICAgPSByZWN0LnkgfHwgMFxuICAgIHJlY3QucmlnaHQgID0gcmVjdC5yaWdodCAgIHx8IChyZWN0LmxlZnQgKyByZWN0LndpZHRoKVxuICAgIHJlY3QuYm90dG9tID0gcmVjdC5ib3R0b20gIHx8IChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0KVxuICB9XG5cbiAgcmV0dXJuIHJlY3Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRsYnJUb1h5d2ggKHJlY3QpIHtcbiAgaWYgKHJlY3QgJiYgISgneCcgaW4gcmVjdCAmJiAneScgaW4gcmVjdCkpIHtcbiAgICByZWN0ID0gZXh0ZW5kKHt9LCByZWN0KVxuXG4gICAgcmVjdC54ICAgICAgPSByZWN0LmxlZnQgfHwgMFxuICAgIHJlY3QueSAgICAgID0gcmVjdC50b3AgIHx8IDBcbiAgICByZWN0LndpZHRoICA9IHJlY3Qud2lkdGggIHx8IChyZWN0LnJpZ2h0IHx8IDAgIC0gcmVjdC54KVxuICAgIHJlY3QuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgfHwgKHJlY3QuYm90dG9tIHx8IDAgLSByZWN0LnkpXG4gIH1cblxuICByZXR1cm4gcmVjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRWRnZXMgKGVkZ2VzOiBJbnRlcmFjdC5FZGdlT3B0aW9ucywgcmVjdDogSW50ZXJhY3QuUmVjdCwgZGVsdGE6IEludGVyYWN0LlBvaW50KSB7XG4gIGlmIChlZGdlcy5sZWZ0KSAgIHsgcmVjdC5sZWZ0ICAgKz0gZGVsdGEueCB9XG4gIGlmIChlZGdlcy5yaWdodCkgIHsgcmVjdC5yaWdodCAgKz0gZGVsdGEueCB9XG4gIGlmIChlZGdlcy50b3ApICAgIHsgcmVjdC50b3AgICAgKz0gZGVsdGEueSB9XG4gIGlmIChlZGdlcy5ib3R0b20pIHsgcmVjdC5ib3R0b20gKz0gZGVsdGEueSB9XG5cbiAgcmVjdC53aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnRcbiAgcmVjdC5oZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG59XG4iLCJpbXBvcnQgeyByZWN0VG9YWSwgcmVzb2x2ZVJlY3RMaWtlIH0gZnJvbSAnLi9yZWN0J1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoXG4gIHRhcmdldDogSW50ZXJhY3QuSGFzR2V0UmVjdCAmIHsgb3B0aW9uczogSW50ZXJhY3QuUGVyQWN0aW9uRGVmYXVsdHMgfSxcbiAgZWxlbWVudDogTm9kZSxcbiAgYWN0aW9uTmFtZT86IEludGVyYWN0LkFjdGlvbk5hbWUsXG4pIHtcbiAgY29uc3QgYWN0aW9uT3B0aW9ucyA9ICh0YXJnZXQub3B0aW9ucyBhcyBhbnkpW2FjdGlvbk5hbWVdXG4gIGNvbnN0IGFjdGlvbk9yaWdpbiA9IGFjdGlvbk9wdGlvbnMgJiYgYWN0aW9uT3B0aW9ucy5vcmlnaW5cbiAgY29uc3Qgb3JpZ2luID0gYWN0aW9uT3JpZ2luIHx8IHRhcmdldC5vcHRpb25zLm9yaWdpblxuXG4gIGNvbnN0IG9yaWdpblJlY3QgPSByZXNvbHZlUmVjdExpa2Uob3JpZ2luLCB0YXJnZXQsIGVsZW1lbnQsIFt0YXJnZXQgJiYgZWxlbWVudF0pXG5cbiAgcmV0dXJuIHJlY3RUb1hZKG9yaWdpblJlY3QpIHx8IHsgeDogMCwgeTogMCB9XG59XG4iLCJsZXQgbGFzdFRpbWUgPSAwXG5sZXQgcmVxdWVzdFxubGV0IGNhbmNlbFxuXG5mdW5jdGlvbiBpbml0ICh3aW5kb3cpIHtcbiAgcmVxdWVzdCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lXG5cbiAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgY29uc3QgdmVuZG9ycyA9IFsnbXMnLCAnbW96JywgJ3dlYmtpdCcsICdvJ11cblxuICAgIGZvciAoY29uc3QgdmVuZG9yIG9mIHZlbmRvcnMpIHtcbiAgICAgIHJlcXVlc3QgPSB3aW5kb3dbYCR7dmVuZG9yfVJlcXVlc3RBbmltYXRpb25GcmFtZWBdXG4gICAgICBjYW5jZWwgPSB3aW5kb3dbYCR7dmVuZG9yfUNhbmNlbEFuaW1hdGlvbkZyYW1lYF0gfHwgd2luZG93W2Ake3ZlbmRvcn1DYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWVgXVxuICAgIH1cbiAgfVxuXG4gIGlmICghcmVxdWVzdCkge1xuICAgIHJlcXVlc3QgPSBjYWxsYmFjayA9PiB7XG4gICAgICBjb25zdCBjdXJyVGltZSA9IERhdGUubm93KClcbiAgICAgIGNvbnN0IHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdGFuZGFyZC9uby1jYWxsYmFjay1saXRlcmFsXG4gICAgICBjb25zdCB0b2tlbiA9IHNldFRpbWVvdXQoKCkgPT4geyBjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpIH0sXG4gICAgICAgIHRpbWVUb0NhbGwpXG5cbiAgICAgIGxhc3RUaW1lID0gY3VyclRpbWUgKyB0aW1lVG9DYWxsXG4gICAgICByZXR1cm4gdG9rZW5cbiAgICB9XG5cbiAgICBjYW5jZWwgPSB0b2tlbiA9PiBjbGVhclRpbWVvdXQodG9rZW4pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICByZXF1ZXN0OiBjYWxsYmFjayA9PiByZXF1ZXN0KGNhbGxiYWNrKSxcbiAgY2FuY2VsOiB0b2tlbiA9PiBjYW5jZWwodG9rZW4pLFxuICBpbml0LFxufVxuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJy4vYXJyJ1xuaW1wb3J0ICogYXMgZG9tIGZyb20gJy4vZG9tVXRpbHMnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICcuL2lzJ1xuaW1wb3J0ICogYXMgcG9pbnRlciBmcm9tICcuL3BvaW50ZXJVdGlscydcbmltcG9ydCAqIGFzIHJlY3QgZnJvbSAnLi9yZWN0J1xuaW1wb3J0IHdpbiBmcm9tICcuL3dpbmRvdydcblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PbmNlPFQ+ICh0aGlzOiBULCBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgbGV0IHdhcm5lZCA9IGZhbHNlXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICByZXR1cm4gZnVuY3Rpb24gKHRoaXM6IFQpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgKHdpbiBhcyBhbnkpLndpbmRvdy5jb25zb2xlLndhcm4obWVzc2FnZSlcbiAgICAgIHdhcm5lZCA9IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUFjdGlvbiAoZGVzdDogSW50ZXJhY3QuQWN0aW9uUHJvcHMsIHNyYzogSW50ZXJhY3QuQWN0aW9uUHJvcHMpIHtcbiAgZGVzdC5uYW1lICA9IHNyYy5uYW1lXG4gIGRlc3QuYXhpcyAgPSBzcmMuYXhpc1xuICBkZXN0LmVkZ2VzID0gc3JjLmVkZ2VzXG5cbiAgcmV0dXJuIGRlc3Rcbn1cblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBicm93c2VyIH0gZnJvbSAnLi9icm93c2VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGV2ZW50cyB9IGZyb20gJy4vZXZlbnRzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBleHRlbmQgfSBmcm9tICcuL2V4dGVuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0T3JpZ2luWFkgfSBmcm9tICcuL2dldE9yaWdpblhZJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoeXBvdCB9IGZyb20gJy4vaHlwb3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vcm1hbGl6ZUxpc3RlbmVycyB9IGZyb20gJy4vbm9ybWFsaXplTGlzdGVuZXJzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByYWYgfSBmcm9tICcuL3JhZidcbmV4cG9ydCB7IHdpbiwgYXJyLCBkb20sIGlzLCBwb2ludGVyLCByZWN0IH1cbiIsIi8vIHRzbGludDpkaXNhYmxlIG5vLWVtcHR5LWludGVyZmFjZVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRzIHtcbiAgYmFzZTogQmFzZURlZmF1bHRzXG4gIHBlckFjdGlvbjogUGVyQWN0aW9uRGVmYXVsdHNcbiAgYWN0aW9uczogQWN0aW9uRGVmYXVsdHNcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VEZWZhdWx0cyB7XG4gIHByZXZlbnREZWZhdWx0PzogJ2F1dG8nIHwgJ25ldmVyJyB8IHN0cmluZ1xuICBkZWx0YVNvdXJjZT86ICdwYWdlJyB8ICdjbGllbnQnXG4gIGNvbnRleHQ/OiBJbnRlcmFjdC5FdmVudFRhcmdldFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlckFjdGlvbkRlZmF1bHRzIHtcbiAgZW5hYmxlZD86IGJvb2xlYW5cbiAgb3JpZ2luPzogSW50ZXJhY3QuUG9pbnQgfCBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGxpc3RlbmVycz86IEludGVyYWN0Lkxpc3RlbmVyc1xuICBhbGxvd0Zyb20/OiBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGlnbm9yZUZyb20/OiBzdHJpbmcgfCBJbnRlcmFjdC5FbGVtZW50XG59XG5cbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSBQYXJ0aWFsPEJhc2VEZWZhdWx0cz4gJiBQYXJ0aWFsPFBlckFjdGlvbkRlZmF1bHRzPiAmIHtcbiAgW1AgaW4ga2V5b2YgQWN0aW9uRGVmYXVsdHNdPzogUGFydGlhbDxBY3Rpb25EZWZhdWx0c1tQXT5cbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIGV4dGVuZHMgQmFzZURlZmF1bHRzLCBQZXJBY3Rpb25EZWZhdWx0cyB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnNBcmcgZXh0ZW5kcyBCYXNlRGVmYXVsdHMsIEludGVyYWN0Lk9yQm9vbGVhbjxQYXJ0aWFsPEFjdGlvbkRlZmF1bHRzPj4ge31cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBEZWZhdWx0cyA9IHtcbiAgYmFzZToge1xuICAgIHByZXZlbnREZWZhdWx0OiAnYXV0bycsXG4gICAgZGVsdGFTb3VyY2U6ICdwYWdlJyxcbiAgfSxcblxuICBwZXJBY3Rpb246IHtcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBvcmlnaW46IHsgeDogMCwgeTogMCB9LFxuICB9LFxuXG4gIGFjdGlvbnM6IHt9IGFzIEFjdGlvbkRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0c1xuIiwiaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcbmltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNpZ25hbEFyZ3Mge1xuICAgICdpbnRlcmFjdGFibGU6bmV3Jzoge1xuICAgICAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgICAgIHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0XG4gICAgICBvcHRpb25zOiBJbnRlcmFjdC5PcHRpb25zQXJnXG4gICAgICB3aW46IFdpbmRvd1xuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgSW50ZXJhY3RhYmxlU2NvcGVQcm9wIHtcbiAgY29udGV4dDogRG9jdW1lbnQgfCBJbnRlcmFjdC5FbGVtZW50XG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVyYWN0YWJsZVNldCB7XG4gIC8vIGFsbCBzZXQgaW50ZXJhY3RhYmxlc1xuICBsaXN0OiBJbnRlcmFjdC5JbnRlcmFjdGFibGVbXSA9IFtdXG5cbiAgc2VsZWN0b3JNYXA6IHtcbiAgICBbc2VsZWN0b3I6IHN0cmluZ106IEludGVyYWN0YWJsZVNjb3BlUHJvcFtdXG4gIH0gPSB7fVxuXG4gIGNvbnN0cnVjdG9yIChwcm90ZWN0ZWQgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gICAgc2NvcGUuYWRkTGlzdGVuZXJzKHtcbiAgICAgICdpbnRlcmFjdGFibGU6dW5zZXQnOiAoeyBpbnRlcmFjdGFibGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRhcmdldCwgX2NvbnRleHQ6IGNvbnRleHQgfSA9IGludGVyYWN0YWJsZVxuICAgICAgICBjb25zdCB0YXJnZXRNYXBwaW5nczogSW50ZXJhY3RhYmxlU2NvcGVQcm9wW10gPSBpcy5zdHJpbmcodGFyZ2V0KVxuICAgICAgICAgID8gdGhpcy5zZWxlY3Rvck1hcFt0YXJnZXRdXG4gICAgICAgICAgOiAodGFyZ2V0IGFzIGFueSlbdGhpcy5zY29wZS5pZF1cblxuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IHRhcmdldE1hcHBpbmdzLmZpbmRJbmRleChtID0+IG0uY29udGV4dCA9PT0gY29udGV4dClcbiAgICAgICAgaWYgKHRhcmdldE1hcHBpbmdzW3RhcmdldEluZGV4XSkge1xuICAgICAgICAvLyBEZXN0cm95aW5nIG1hcHBpbmdJbmZvJ3MgY29udGV4dCBhbmQgaW50ZXJhY3RhYmxlXG4gICAgICAgICAgdGFyZ2V0TWFwcGluZ3NbdGFyZ2V0SW5kZXhdLmNvbnRleHQgPSBudWxsXG4gICAgICAgICAgdGFyZ2V0TWFwcGluZ3NbdGFyZ2V0SW5kZXhdLmludGVyYWN0YWJsZSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRNYXBwaW5ncy5zcGxpY2UodGFyZ2V0SW5kZXgsIDEpXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBuZXcgKHRhcmdldDogSW50ZXJhY3QuVGFyZ2V0LCBvcHRpb25zPzogYW55KTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlIHtcbiAgICBvcHRpb25zID0gZXh0ZW5kKG9wdGlvbnMgfHwge30sIHtcbiAgICAgIGFjdGlvbnM6IHRoaXMuc2NvcGUuYWN0aW9ucyxcbiAgICB9KVxuICAgIGNvbnN0IGludGVyYWN0YWJsZSA9IG5ldyB0aGlzLnNjb3BlLkludGVyYWN0YWJsZSh0YXJnZXQsIG9wdGlvbnMsIHRoaXMuc2NvcGUuZG9jdW1lbnQpXG4gICAgY29uc3QgbWFwcGluZ0luZm8gPSB7IGNvbnRleHQ6IGludGVyYWN0YWJsZS5fY29udGV4dCwgaW50ZXJhY3RhYmxlIH1cblxuICAgIHRoaXMuc2NvcGUuYWRkRG9jdW1lbnQoaW50ZXJhY3RhYmxlLl9kb2MpXG4gICAgdGhpcy5saXN0LnB1c2goaW50ZXJhY3RhYmxlKVxuXG4gICAgaWYgKGlzLnN0cmluZyh0YXJnZXQpKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0b3JNYXBbdGFyZ2V0XSkgeyB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldF0gPSBbXSB9XG4gICAgICB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldF0ucHVzaChtYXBwaW5nSW5mbylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEoKGludGVyYWN0YWJsZS50YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXSkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgdGhpcy5zY29wZS5pZCwge1xuICAgICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgICh0YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXS5wdXNoKG1hcHBpbmdJbmZvKVxuICAgIH1cblxuICAgIHRoaXMuc2NvcGUuZmlyZSgnaW50ZXJhY3RhYmxlOm5ldycsIHtcbiAgICAgIHRhcmdldCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpbnRlcmFjdGFibGUsXG4gICAgICB3aW46IHRoaXMuc2NvcGUuX3dpbixcbiAgICB9KVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG5cbiAgZ2V0ICh0YXJnZXQ6IEludGVyYWN0LlRhcmdldCwgb3B0aW9ucz86IEludGVyYWN0Lk9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0KSB8fCB0aGlzLnNjb3BlLmRvY3VtZW50XG4gICAgY29uc3QgaXNTZWxlY3RvciA9IGlzLnN0cmluZyh0YXJnZXQpXG4gICAgY29uc3QgdGFyZ2V0TWFwcGluZ3M6IEludGVyYWN0YWJsZVNjb3BlUHJvcFtdID0gaXNTZWxlY3RvclxuICAgICAgPyB0aGlzLnNlbGVjdG9yTWFwW3RhcmdldCBhcyBzdHJpbmddXG4gICAgICA6ICh0YXJnZXQgYXMgYW55KVt0aGlzLnNjb3BlLmlkXVxuXG4gICAgaWYgKCF0YXJnZXRNYXBwaW5ncykgeyByZXR1cm4gbnVsbCB9XG5cbiAgICBjb25zdCBmb3VuZCA9IGFyci5maW5kKFxuICAgICAgdGFyZ2V0TWFwcGluZ3MsXG4gICAgICBtID0+IG0uY29udGV4dCA9PT0gY29udGV4dCAmJlxuICAgICAgICAoaXNTZWxlY3RvciB8fCBtLmludGVyYWN0YWJsZS5pbkNvbnRleHQodGFyZ2V0IGFzIGFueSkpKVxuXG4gICAgcmV0dXJuIGZvdW5kICYmIGZvdW5kLmludGVyYWN0YWJsZVxuICB9XG5cbiAgZm9yRWFjaE1hdGNoPFQ+IChub2RlOiBOb2RlLCBjYWxsYmFjazogKGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKSA9PiBUKTogVCB8IHZvaWQge1xuICAgIGZvciAoY29uc3QgaW50ZXJhY3RhYmxlIG9mIHRoaXMubGlzdCkge1xuICAgICAgbGV0IHJldFxuXG4gICAgICBpZiAoKGlzLnN0cmluZyhpbnRlcmFjdGFibGUudGFyZ2V0KVxuICAgICAgLy8gdGFyZ2V0IGlzIGEgc2VsZWN0b3IgYW5kIHRoZSBlbGVtZW50IG1hdGNoZXNcbiAgICAgICAgPyAoaXMuZWxlbWVudChub2RlKSAmJiBkb21VdGlscy5tYXRjaGVzU2VsZWN0b3Iobm9kZSwgaW50ZXJhY3RhYmxlLnRhcmdldCkpXG4gICAgICAgIC8vIHRhcmdldCBpcyB0aGUgZWxlbWVudFxuICAgICAgICA6IG5vZGUgPT09IGludGVyYWN0YWJsZS50YXJnZXQpICYmXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIGNvbnRleHRcbiAgICAgICAgKGludGVyYWN0YWJsZS5pbkNvbnRleHQobm9kZSkpKSB7XG4gICAgICAgIHJldCA9IGNhbGxiYWNrKGludGVyYWN0YWJsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXRcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBCYXNlRXZlbnQ8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWUgPSBhbnk+IHtcbiAgdHlwZTogc3RyaW5nXG4gIHRhcmdldDogRXZlbnRUYXJnZXRcbiAgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXRcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgX2ludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbjxUPlxuICB0aW1lU3RhbXA6IGFueVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuXG4gIGdldCBpbnRlcmFjdGlvbiAoKTogSW50ZXJhY3QuSW50ZXJhY3Rpb25Qcm94eTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW9uLl9wcm94eVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICAgIHRoaXMuX2ludGVyYWN0aW9uID0gaW50ZXJhY3Rpb25cbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0ICgpIHt9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgYW55IG90aGVyIGxpc3RlbmVycyAoZXZlbiBvbiB0aGUgY3VycmVudCB0YXJnZXQpXG4gICAqL1xuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgbGlzdGVuZXJzIG9uIHRoZSByZW1haW5pbmcgdGFyZ2V0c1xuICAgKi9cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VFdmVudFxuIiwiaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgZ2V0T3JpZ2luWFkgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZ2V0T3JpZ2luWFknXG5pbXBvcnQgaHlwb3QgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaHlwb3QnXG5pbXBvcnQgQmFzZUV2ZW50IGZyb20gJy4vQmFzZUV2ZW50J1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgSW50ZXJhY3Rpb24gZnJvbSAnLi9JbnRlcmFjdGlvbidcblxuZXhwb3J0IHR5cGUgRXZlbnRQaGFzZSA9IGtleW9mIFBoYXNlTWFwXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGhhc2VNYXAge1xuICBzdGFydDogdHJ1ZVxuICBtb3ZlOiB0cnVlXG4gIGVuZDogdHJ1ZVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJhY3RFdmVudDxcbiAgVCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWUgPSBuZXZlcixcbiAgUCBleHRlbmRzIEV2ZW50UGhhc2UgPSBFdmVudFBoYXNlLFxuPiBleHRlbmRzIEJhc2VFdmVudDxUPiB7XG4gIHRhcmdldDogSW50ZXJhY3QuRWxlbWVudFxuICBjdXJyZW50VGFyZ2V0OiBJbnRlcmFjdC5FbGVtZW50XG4gIHJlbGF0ZWRUYXJnZXQ6IG51bGwgPSBudWxsXG4gIHNjcmVlblg/OiBudW1iZXJcbiAgc2NyZWVuWT86IG51bWJlclxuICBidXR0b246IG51bWJlclxuICBidXR0b25zOiBudW1iZXJcbiAgY3RybEtleTogYm9vbGVhblxuICBzaGlmdEtleTogYm9vbGVhblxuICBhbHRLZXk6IGJvb2xlYW5cbiAgbWV0YUtleTogYm9vbGVhblxuICBwYWdlOiBJbnRlcmFjdC5Qb2ludFxuICBjbGllbnQ6IEludGVyYWN0LlBvaW50XG4gIGRlbHRhOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICB4MDogbnVtYmVyXG4gIHkwOiBudW1iZXJcbiAgdDA6IG51bWJlclxuICBkdDogbnVtYmVyXG4gIGR1cmF0aW9uOiBudW1iZXJcbiAgY2xpZW50WDA6IG51bWJlclxuICBjbGllbnRZMDogbnVtYmVyXG4gIHZlbG9jaXR5OiBJbnRlcmFjdC5Qb2ludFxuICBzcGVlZDogbnVtYmVyXG4gIHN3aXBlOiBSZXR1cm5UeXBlPEludGVyYWN0RXZlbnQ8VD5bJ2dldFN3aXBlJ10+XG4gIHRpbWVTdGFtcDogYW55XG4gIC8vIGRyYWdcbiAgZHJhZ0VudGVyPzogSW50ZXJhY3QuRWxlbWVudFxuICBkcmFnTGVhdmU/OiBJbnRlcmFjdC5FbGVtZW50XG4gIC8vIHJlc2l6ZVxuICBheGVzPzogJ3gnIHwgJ3knIHwgJ3h5J1xuICBwcmVFbmQ/OiBib29sZWFuXG5cbiAgLyoqICovXG4gIGNvbnN0cnVjdG9yIChcbiAgICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24sXG4gICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgYWN0aW9uTmFtZTogVCxcbiAgICBwaGFzZTogUCxcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgIHByZUVuZD86IGJvb2xlYW4sXG4gICAgdHlwZT86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoaW50ZXJhY3Rpb24pXG5cbiAgICBlbGVtZW50ID0gZWxlbWVudCB8fCBpbnRlcmFjdGlvbi5lbGVtZW50XG5cbiAgICBjb25zdCB0YXJnZXQgICAgICA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZVxuICAgIGNvbnN0IGRlbHRhU291cmNlID0gKCgodGFyZ2V0ICYmIHRhcmdldC5vcHRpb25zKSB8fCBkZWZhdWx0cykgYXMgYW55KS5kZWx0YVNvdXJjZSBhcyAncGFnZScgfCAnY2xpZW50J1xuICAgIGNvbnN0IG9yaWdpbiAgICAgID0gZ2V0T3JpZ2luWFkodGFyZ2V0LCBlbGVtZW50LCBhY3Rpb25OYW1lKVxuICAgIGNvbnN0IHN0YXJ0aW5nICAgID0gcGhhc2UgPT09ICdzdGFydCdcbiAgICBjb25zdCBlbmRpbmcgICAgICA9IHBoYXNlID09PSAnZW5kJ1xuICAgIGNvbnN0IHByZXZFdmVudCAgID0gc3RhcnRpbmcgPyB0aGlzIDogaW50ZXJhY3Rpb24ucHJldkV2ZW50XG4gICAgY29uc3QgY29vcmRzICAgICAgPSBzdGFydGluZ1xuICAgICAgPyBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnRcbiAgICAgIDogZW5kaW5nXG4gICAgICAgID8geyBwYWdlOiBwcmV2RXZlbnQucGFnZSwgY2xpZW50OiBwcmV2RXZlbnQuY2xpZW50LCB0aW1lU3RhbXA6IGludGVyYWN0aW9uLmNvb3Jkcy5jdXIudGltZVN0YW1wIH1cbiAgICAgICAgOiBpbnRlcmFjdGlvbi5jb29yZHMuY3VyXG5cbiAgICB0aGlzLnBhZ2UgICAgICA9IGV4dGVuZCh7fSwgY29vcmRzLnBhZ2UpXG4gICAgdGhpcy5jbGllbnQgICAgPSBleHRlbmQoe30sIGNvb3Jkcy5jbGllbnQpXG4gICAgdGhpcy5yZWN0ICAgICAgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLnJlY3QpXG4gICAgdGhpcy50aW1lU3RhbXAgPSBjb29yZHMudGltZVN0YW1wXG5cbiAgICBpZiAoIWVuZGluZykge1xuICAgICAgdGhpcy5wYWdlLnggLT0gb3JpZ2luLnhcbiAgICAgIHRoaXMucGFnZS55IC09IG9yaWdpbi55XG5cbiAgICAgIHRoaXMuY2xpZW50LnggLT0gb3JpZ2luLnhcbiAgICAgIHRoaXMuY2xpZW50LnkgLT0gb3JpZ2luLnlcbiAgICB9XG5cbiAgICB0aGlzLmN0cmxLZXkgICAgICAgPSBldmVudC5jdHJsS2V5XG4gICAgdGhpcy5hbHRLZXkgICAgICAgID0gZXZlbnQuYWx0S2V5XG4gICAgdGhpcy5zaGlmdEtleSAgICAgID0gZXZlbnQuc2hpZnRLZXlcbiAgICB0aGlzLm1ldGFLZXkgICAgICAgPSBldmVudC5tZXRhS2V5XG4gICAgdGhpcy5idXR0b24gICAgICAgID0gKGV2ZW50IGFzIE1vdXNlRXZlbnQpLmJ1dHRvblxuICAgIHRoaXMuYnV0dG9ucyAgICAgICA9IChldmVudCBhcyBNb3VzZUV2ZW50KS5idXR0b25zXG4gICAgdGhpcy50YXJnZXQgICAgICAgID0gZWxlbWVudFxuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IGVsZW1lbnRcbiAgICB0aGlzLnByZUVuZCAgICAgICAgPSBwcmVFbmRcbiAgICB0aGlzLnR5cGUgICAgICAgICAgPSB0eXBlIHx8IChhY3Rpb25OYW1lICsgKHBoYXNlIHx8ICcnKSlcbiAgICB0aGlzLmludGVyYWN0YWJsZSAgPSB0YXJnZXRcblxuICAgIHRoaXMudDAgPSBzdGFydGluZ1xuICAgICAgPyBpbnRlcmFjdGlvbi5wb2ludGVyc1tpbnRlcmFjdGlvbi5wb2ludGVycy5sZW5ndGggLSAxXS5kb3duVGltZVxuICAgICAgOiBwcmV2RXZlbnQudDBcblxuICAgIHRoaXMueDAgICAgICAgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQucGFnZS54IC0gb3JpZ2luLnhcbiAgICB0aGlzLnkwICAgICAgID0gaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueSAtIG9yaWdpbi55XG4gICAgdGhpcy5jbGllbnRYMCA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5jbGllbnQueCAtIG9yaWdpbi54XG4gICAgdGhpcy5jbGllbnRZMCA9IGludGVyYWN0aW9uLmNvb3Jkcy5zdGFydC5jbGllbnQueSAtIG9yaWdpbi55XG5cbiAgICBpZiAoc3RhcnRpbmcgfHwgZW5kaW5nKSB7XG4gICAgICB0aGlzLmRlbHRhID0geyB4OiAwLCB5OiAwIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRlbHRhID0ge1xuICAgICAgICB4OiB0aGlzW2RlbHRhU291cmNlXS54IC0gcHJldkV2ZW50W2RlbHRhU291cmNlXS54LFxuICAgICAgICB5OiB0aGlzW2RlbHRhU291cmNlXS55IC0gcHJldkV2ZW50W2RlbHRhU291cmNlXS55LFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZHQgICAgICAgID0gaW50ZXJhY3Rpb24uY29vcmRzLmRlbHRhLnRpbWVTdGFtcFxuICAgIHRoaXMuZHVyYXRpb24gID0gdGhpcy50aW1lU3RhbXAgLSB0aGlzLnQwXG5cbiAgICAvLyB2ZWxvY2l0eSBhbmQgc3BlZWQgaW4gcGl4ZWxzIHBlciBzZWNvbmRcbiAgICB0aGlzLnZlbG9jaXR5ID0gZXh0ZW5kKHt9LCBpbnRlcmFjdGlvbi5jb29yZHMudmVsb2NpdHlbZGVsdGFTb3VyY2VdKVxuICAgIHRoaXMuc3BlZWQgPSBoeXBvdCh0aGlzLnZlbG9jaXR5LngsIHRoaXMudmVsb2NpdHkueSlcblxuICAgIHRoaXMuc3dpcGUgPSAoZW5kaW5nIHx8IHBoYXNlID09PSAnaW5lcnRpYXN0YXJ0JykgPyB0aGlzLmdldFN3aXBlKCkgOiBudWxsXG4gIH1cblxuICBnZXQgcGFnZVggKCkgeyByZXR1cm4gdGhpcy5wYWdlLnggfVxuICBzZXQgcGFnZVggKHZhbHVlKSB7IHRoaXMucGFnZS54ID0gdmFsdWUgfVxuICBnZXQgcGFnZVkgKCkgeyByZXR1cm4gdGhpcy5wYWdlLnkgfVxuICBzZXQgcGFnZVkgKHZhbHVlKSB7IHRoaXMucGFnZS55ID0gdmFsdWUgfVxuXG4gIGdldCBjbGllbnRYICgpIHsgcmV0dXJuIHRoaXMuY2xpZW50LnggfVxuICBzZXQgY2xpZW50WCAodmFsdWUpIHsgdGhpcy5jbGllbnQueCA9IHZhbHVlIH1cbiAgZ2V0IGNsaWVudFkgKCkgeyByZXR1cm4gdGhpcy5jbGllbnQueSB9XG4gIHNldCBjbGllbnRZICh2YWx1ZSkgeyB0aGlzLmNsaWVudC55ID0gdmFsdWUgfVxuXG4gIGdldCBkeCAoKSB7IHJldHVybiB0aGlzLmRlbHRhLnggfVxuICBzZXQgZHggKHZhbHVlKSB7IHRoaXMuZGVsdGEueCA9IHZhbHVlIH1cbiAgZ2V0IGR5ICgpIHsgcmV0dXJuIHRoaXMuZGVsdGEueSB9XG4gIHNldCBkeSAodmFsdWUpIHsgdGhpcy5kZWx0YS55ID0gdmFsdWUgfVxuXG4gIGdldCB2ZWxvY2l0eVggKCkgeyByZXR1cm4gdGhpcy52ZWxvY2l0eS54IH1cbiAgc2V0IHZlbG9jaXR5WCAodmFsdWUpIHsgdGhpcy52ZWxvY2l0eS54ID0gdmFsdWUgfVxuICBnZXQgdmVsb2NpdHlZICgpIHsgcmV0dXJuIHRoaXMudmVsb2NpdHkueSB9XG4gIHNldCB2ZWxvY2l0eVkgKHZhbHVlKSB7IHRoaXMudmVsb2NpdHkueSA9IHZhbHVlIH1cblxuICBnZXRTd2lwZSAoKSB7XG4gICAgY29uc3QgaW50ZXJhY3Rpb24gPSB0aGlzLl9pbnRlcmFjdGlvblxuXG4gICAgaWYgKGludGVyYWN0aW9uLnByZXZFdmVudC5zcGVlZCA8IDYwMCB8fFxuICAgICAgICB0aGlzLnRpbWVTdGFtcCAtIGludGVyYWN0aW9uLnByZXZFdmVudC50aW1lU3RhbXAgPiAxNTApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGFuZ2xlID0gMTgwICogTWF0aC5hdGFuMihpbnRlcmFjdGlvbi5wcmV2RXZlbnQudmVsb2NpdHlZLCBpbnRlcmFjdGlvbi5wcmV2RXZlbnQudmVsb2NpdHlYKSAvIE1hdGguUElcbiAgICBjb25zdCBvdmVybGFwID0gMjIuNVxuXG4gICAgaWYgKGFuZ2xlIDwgMCkge1xuICAgICAgYW5nbGUgKz0gMzYwXG4gICAgfVxuXG4gICAgY29uc3QgbGVmdCA9IDEzNSAtIG92ZXJsYXAgPD0gYW5nbGUgJiYgYW5nbGUgPCAyMjUgKyBvdmVybGFwXG4gICAgY29uc3QgdXAgICA9IDIyNSAtIG92ZXJsYXAgPD0gYW5nbGUgJiYgYW5nbGUgPCAzMTUgKyBvdmVybGFwXG5cbiAgICBjb25zdCByaWdodCA9ICFsZWZ0ICYmICgzMTUgLSBvdmVybGFwIDw9IGFuZ2xlIHx8IGFuZ2xlIDwgIDQ1ICsgb3ZlcmxhcClcbiAgICBjb25zdCBkb3duICA9ICF1cCAgICYmICAgNDUgLSBvdmVybGFwIDw9IGFuZ2xlICYmIGFuZ2xlIDwgMTM1ICsgb3ZlcmxhcFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVwLFxuICAgICAgZG93bixcbiAgICAgIGxlZnQsXG4gICAgICByaWdodCxcbiAgICAgIGFuZ2xlLFxuICAgICAgc3BlZWQ6IGludGVyYWN0aW9uLnByZXZFdmVudC5zcGVlZCxcbiAgICAgIHZlbG9jaXR5OiB7XG4gICAgICAgIHg6IGludGVyYWN0aW9uLnByZXZFdmVudC52ZWxvY2l0eVgsXG4gICAgICAgIHk6IGludGVyYWN0aW9uLnByZXZFdmVudC52ZWxvY2l0eVksXG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0ICgpIHt9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgbGlzdGVuZXJzIG9uIHRoZSByZW1haW5pbmcgdGFyZ2V0c1xuICAgKi9cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIERvbid0IGNhbGwgYW55IG90aGVyIGxpc3RlbmVycyAoZXZlbiBvbiB0aGUgY3VycmVudCB0YXJnZXQpXG4gICAqL1xuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVyYWN0RXZlbnRcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1wYXJhbWV0ZXItcHJvcGVydGllcyAqL1xuZXhwb3J0IGNsYXNzIFBvaW50ZXJJbmZvIHtcbiAgY29uc3RydWN0b3IgKFxuICAgIHB1YmxpYyBpZDogbnVtYmVyLFxuICAgIHB1YmxpYyBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgICBwdWJsaWMgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgcHVibGljIGRvd25UaW1lOiBudW1iZXIsXG4gICAgcHVibGljIGRvd25UYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0LFxuICApIHt9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50ZXJJbmZvXG4iLCJpbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBJbnRlcmFjdGFibGUgZnJvbSAnLi9JbnRlcmFjdGFibGUnXG5pbXBvcnQgSW50ZXJhY3RFdmVudCwgeyBFdmVudFBoYXNlIH0gZnJvbSAnLi9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0IFBvaW50ZXJJbmZvIGZyb20gJy4vUG9pbnRlckluZm8nXG5pbXBvcnQgeyBBY3Rpb25OYW1lIH0gZnJvbSAnLi9zY29wZSdcblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25Qcm9wczxUIGV4dGVuZHMgQWN0aW9uTmFtZSA9IEludGVyYWN0LkFjdGlvbk5hbWU+IHtcbiAgbmFtZTogVFxuICBheGlzPzogJ3gnIHwgJ3knIHwgJ3h5J1xuICBlZGdlcz86IEludGVyYWN0LkVkZ2VPcHRpb25zXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb25Qcm9wcyB7XG4gIG5hbWU6IEFjdGlvbk5hbWVcbn1cblxuZXhwb3J0IGVudW0gX1Byb3h5VmFsdWVzIHtcbiAgaW50ZXJhY3RhYmxlID0gJycsXG4gIGVsZW1lbnQgPSAnJyxcbiAgcHJlcGFyZWQgPSAnJyxcbiAgcG9pbnRlcklzRG93biA9ICcnLFxuICBwb2ludGVyV2FzTW92ZWQgPSAnJyxcbiAgX3Byb3h5ID0gJydcbn1cblxuZXhwb3J0IGVudW0gX1Byb3h5TWV0aG9kcyB7XG4gIHN0YXJ0ID0gJycsXG4gIG1vdmUgPSAnJyxcbiAgZW5kID0gJycsXG4gIHN0b3AgPSAnJyxcbiAgaW50ZXJhY3RpbmcgPSAnJ1xufVxuXG5leHBvcnQgdHlwZSBQb2ludGVyQXJnUHJvcHM8VCBleHRlbmRzIHt9ID0ge30+ID0ge1xuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZVxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgcG9pbnRlckluZGV4OiBudW1iZXJcbiAgcG9pbnRlckluZm86IFBvaW50ZXJJbmZvXG4gIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblxufSAmIFRcblxuZXhwb3J0IGludGVyZmFjZSBEb1BoYXNlQXJnPFQgZXh0ZW5kcyBBY3Rpb25OYW1lLCBQIGV4dGVuZHMgRXZlbnRQaGFzZT4ge1xuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICBwaGFzZTogRXZlbnRQaGFzZVxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb248VD5cbiAgaUV2ZW50OiBJbnRlcmFjdEV2ZW50PFQsIFA+XG4gIHByZUVuZD86IGJvb2xlYW5cbiAgdHlwZT86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBEb0FueVBoYXNlQXJnID0gRG9QaGFzZUFyZzxBY3Rpb25OYW1lLCBFdmVudFBoYXNlPlxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB9XG4gICAgJ2ludGVyYWN0aW9uczpkb3duJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICdkb3duJ1xuICAgIH0+XG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICdtb3ZlJ1xuICAgICAgZHg6IG51bWJlclxuICAgICAgZHk6IG51bWJlclxuICAgICAgZHVwbGljYXRlOiBib29sZWFuXG4gICAgfT5cbiAgICAnaW50ZXJhY3Rpb25zOnVwJzogUG9pbnRlckFyZ1Byb3BzPHtcbiAgICAgIHR5cGU6ICd1cCdcbiAgICAgIGN1ckV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldFxuICAgIH0+XG4gICAgJ2ludGVyYWN0aW9uczpjYW5jZWwnOiBTaWduYWxBcmdzWydpbnRlcmFjdGlvbnM6dXAnXSAmIHtcbiAgICAgIHR5cGU6ICdjYW5jZWwnXG4gICAgICBjdXJFdmVudFRhcmdldDogRXZlbnRUYXJnZXRcbiAgICB9XG4gICAgJ2ludGVyYWN0aW9uczp1cGRhdGUtcG9pbnRlcic6IFBvaW50ZXJBcmdQcm9wczx7XG4gICAgICBkb3duOiBib29sZWFuXG4gICAgfT5cbiAgICAnaW50ZXJhY3Rpb25zOnJlbW92ZS1wb2ludGVyJzogUG9pbnRlckFyZ1Byb3BzXG4gICAgJ2ludGVyYWN0aW9uczpibHVyJ1xuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1zdGFydCc6IE9taXQ8RG9BbnlQaGFzZUFyZywgJ2lFdmVudCc+XG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tc3RhcnQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tc3RhcnQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczpiZWZvcmUtYWN0aW9uLW1vdmUnOiBPbWl0PERvQW55UGhhc2VBcmcsICdpRXZlbnQnPlxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IERvQW55UGhhc2VBcmdcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogT21pdDxEb0FueVBoYXNlQXJnLCAnaUV2ZW50Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1lbmQnOiBEb0FueVBoYXNlQXJnXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tZW5kJzogRG9BbnlQaGFzZUFyZ1xuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IHsgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBJbnRlcmFjdGlvblByb3h5PFQgZXh0ZW5kcyBBY3Rpb25OYW1lID0gQWN0aW9uTmFtZT4gPSBQaWNrPFxuSW50ZXJhY3Rpb248VD4sXG5rZXlvZiB0eXBlb2YgX1Byb3h5VmFsdWVzIHwga2V5b2YgdHlwZW9mIF9Qcm94eU1ldGhvZHNcbj5cblxubGV0IGlkQ291bnRlciA9IDBcblxuZXhwb3J0IGNsYXNzIEludGVyYWN0aW9uPFQgZXh0ZW5kcyBBY3Rpb25OYW1lID0gQWN0aW9uTmFtZT4ge1xuICAvLyBjdXJyZW50IGludGVyYWN0YWJsZSBiZWluZyBpbnRlcmFjdGVkIHdpdGhcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdGFibGUgPSBudWxsXG5cbiAgLy8gdGhlIHRhcmdldCBlbGVtZW50IG9mIHRoZSBpbnRlcmFjdGFibGVcbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCA9IG51bGxcbiAgcmVjdDogSW50ZXJhY3QuRnVsbFJlY3RcbiAgX3JlY3RzPzoge1xuICAgIHN0YXJ0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICAgIGNvcnJlY3RlZDogSW50ZXJhY3QuRnVsbFJlY3RcbiAgICBwcmV2aW91czogSW50ZXJhY3QuRnVsbFJlY3RcbiAgICBkZWx0YTogSW50ZXJhY3QuRnVsbFJlY3RcbiAgfVxuICBlZGdlczogSW50ZXJhY3QuRWRnZU9wdGlvbnNcblxuICBfc2NvcGVGaXJlOiBJbnRlcmFjdC5TY29wZVsnZmlyZSddXG5cbiAgLy8gYWN0aW9uIHRoYXQncyByZWFkeSB0byBiZSBmaXJlZCBvbiBuZXh0IG1vdmUgZXZlbnRcbiAgcHJlcGFyZWQ6IEFjdGlvblByb3BzPFQ+ID0ge1xuICAgIG5hbWUgOiBudWxsLFxuICAgIGF4aXMgOiBudWxsLFxuICAgIGVkZ2VzOiBudWxsLFxuICB9XG5cbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuXG4gIC8vIGtlZXAgdHJhY2sgb2YgYWRkZWQgcG9pbnRlcnNcbiAgcG9pbnRlcnM6IFBvaW50ZXJJbmZvW10gPSBbXVxuXG4gIC8vIHBvaW50ZXJkb3duL21vdXNlZG93bi90b3VjaHN0YXJ0IGV2ZW50XG4gIGRvd25FdmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSA9IG51bGxcblxuICBkb3duUG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgPSB7fSBhcyBJbnRlcmFjdC5Qb2ludGVyVHlwZVxuXG4gIF9sYXRlc3RQb2ludGVyOiB7XG4gICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGVcbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZVxuICAgIGV2ZW50VGFyZ2V0OiBOb2RlXG4gIH0gPSB7XG4gICAgcG9pbnRlcjogbnVsbCxcbiAgICBldmVudDogbnVsbCxcbiAgICBldmVudFRhcmdldDogbnVsbCxcbiAgfVxuXG4gIC8vIHByZXZpb3VzIGFjdGlvbiBldmVudFxuICBwcmV2RXZlbnQ6IEludGVyYWN0RXZlbnQ8VCwgRXZlbnRQaGFzZT4gPSBudWxsXG5cbiAgcG9pbnRlcklzRG93biA9IGZhbHNlXG4gIHBvaW50ZXJXYXNNb3ZlZCA9IGZhbHNlXG4gIF9pbnRlcmFjdGluZyA9IGZhbHNlXG4gIF9lbmRpbmcgPSBmYWxzZVxuICBfc3RvcHBlZCA9IHRydWVcbiAgX3Byb3h5OiBJbnRlcmFjdGlvblByb3h5PFQ+ID0gbnVsbFxuXG4gIHNpbXVsYXRpb24gPSBudWxsXG5cbiAgZ2V0IHBvaW50ZXJNb3ZlVG9sZXJhbmNlICgpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgLyoqXG4gICAqIEBhbGlhcyBJbnRlcmFjdGlvbi5wcm90b3R5cGUubW92ZVxuICAgKi9cbiAgZG9Nb3ZlID0gdXRpbHMud2Fybk9uY2UoXG4gICAgZnVuY3Rpb24gKHRoaXM6IEludGVyYWN0aW9uLCBzaWduYWxBcmc6IGFueSkge1xuICAgICAgdGhpcy5tb3ZlKHNpZ25hbEFyZylcbiAgICB9LFxuICAgICdUaGUgaW50ZXJhY3Rpb24uZG9Nb3ZlKCkgbWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gaW50ZXJhY3Rpb24ubW92ZSgpJylcblxuICBjb29yZHM6IEludGVyYWN0LkNvb3Jkc1NldCA9IHtcbiAgICAvLyBTdGFydGluZyBJbnRlcmFjdEV2ZW50IHBvaW50ZXIgY29vcmRpbmF0ZXNcbiAgICBzdGFydDogdXRpbHMucG9pbnRlci5uZXdDb29yZHMoKSxcbiAgICAvLyBQcmV2aW91cyBuYXRpdmUgcG9pbnRlciBtb3ZlIGV2ZW50IGNvb3JkaW5hdGVzXG4gICAgcHJldjogdXRpbHMucG9pbnRlci5uZXdDb29yZHMoKSxcbiAgICAvLyBjdXJyZW50IG5hdGl2ZSBwb2ludGVyIG1vdmUgZXZlbnQgY29vcmRpbmF0ZXNcbiAgICBjdXI6IHV0aWxzLnBvaW50ZXIubmV3Q29vcmRzKCksXG4gICAgLy8gQ2hhbmdlIGluIGNvb3JkaW5hdGVzIGFuZCB0aW1lIG9mIHRoZSBwb2ludGVyXG4gICAgZGVsdGE6IHV0aWxzLnBvaW50ZXIubmV3Q29vcmRzKCksXG4gICAgLy8gcG9pbnRlciB2ZWxvY2l0eVxuICAgIHZlbG9jaXR5OiB1dGlscy5wb2ludGVyLm5ld0Nvb3JkcygpLFxuICB9XG5cbiAgcmVhZG9ubHkgX2lkOiBudW1iZXIgPSBpZENvdW50ZXIrK1xuXG4gIC8qKiAqL1xuICBjb25zdHJ1Y3RvciAoeyBwb2ludGVyVHlwZSwgc2NvcGVGaXJlIH06IHtcbiAgICBwb2ludGVyVHlwZT86IHN0cmluZ1xuICAgIHNjb3BlRmlyZTogSW50ZXJhY3QuU2NvcGVbJ2ZpcmUnXVxuICB9KSB7XG4gICAgdGhpcy5fc2NvcGVGaXJlID0gc2NvcGVGaXJlXG4gICAgdGhpcy5wb2ludGVyVHlwZSA9IHBvaW50ZXJUeXBlXG5cbiAgICBjb25zdCB0aGF0ID0gdGhpc1xuXG4gICAgdGhpcy5fcHJveHkgPSB7fSBhcyBJbnRlcmFjdGlvblByb3h5PFQ+XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBfUHJveHlWYWx1ZXMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLl9wcm94eSwga2V5LCB7XG4gICAgICAgIGdldCAoKSB7IHJldHVybiB0aGF0W2tleV0gfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gX1Byb3h5TWV0aG9kcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuX3Byb3h5LCBrZXksIHtcbiAgICAgICAgdmFsdWU6ICguLi5hcmdzKSA9PiB0aGF0W2tleV0oLi4uYXJncyksXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOm5ldycsIHsgaW50ZXJhY3Rpb246IHRoaXMgfSlcbiAgfVxuXG4gIHBvaW50ZXJEb3duIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCkge1xuICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IHRoaXMudXBkYXRlUG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHRydWUpXG4gICAgY29uc3QgcG9pbnRlckluZm8gPSB0aGlzLnBvaW50ZXJzW3BvaW50ZXJJbmRleF1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOmRvd24nLCB7XG4gICAgICBwb2ludGVyLFxuICAgICAgZXZlbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHBvaW50ZXJJbmRleCxcbiAgICAgIHBvaW50ZXJJbmZvLFxuICAgICAgdHlwZTogJ2Rvd24nLFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBgYGBqc1xuICAgKiBpbnRlcmFjdCh0YXJnZXQpXG4gICAqICAgLmRyYWdnYWJsZSh7XG4gICAqICAgICAvLyBkaXNhYmxlIHRoZSBkZWZhdWx0IGRyYWcgc3RhcnQgYnkgZG93bi0+bW92ZVxuICAgKiAgICAgbWFudWFsU3RhcnQ6IHRydWVcbiAgICogICB9KVxuICAgKiAgIC8vIHN0YXJ0IGRyYWdnaW5nIGFmdGVyIHRoZSB1c2VyIGhvbGRzIHRoZSBwb2ludGVyIGRvd25cbiAgICogICAub24oJ2hvbGQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICogICAgIHZhciBpbnRlcmFjdGlvbiA9IGV2ZW50LmludGVyYWN0aW9uXG4gICAqXG4gICAqICAgICBpZiAoIWludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICogICAgICAgaW50ZXJhY3Rpb24uc3RhcnQoeyBuYW1lOiAnZHJhZycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW50ZXJhY3RhYmxlLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0KVxuICAgKiAgICAgfVxuICAgKiB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogU3RhcnQgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIEludGVyYWN0YWJsZSBhbmQgRWxlbWVudCBhcyB0YXJ0Z2V0cy4gVGhlXG4gICAqIGFjdGlvbiBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoZSB0YXJnZXQgSW50ZXJhY3RhYmxlIGFuZCBhbiBhcHByb3ByaWF0ZVxuICAgKiBudW1iZXIgb2YgcG9pbnRlcnMgbXVzdCBiZSBoZWxkIGRvd24gLSAxIGZvciBkcmFnL3Jlc2l6ZSwgMiBmb3IgZ2VzdHVyZS5cbiAgICpcbiAgICogVXNlIGl0IHdpdGggYGludGVyYWN0YWJsZS48YWN0aW9uPmFibGUoeyBtYW51YWxTdGFydDogZmFsc2UgfSlgIHRvIGFsd2F5c1xuICAgKiBbc3RhcnQgYWN0aW9ucyBtYW51YWxseV0oaHR0cHM6Ly9naXRodWIuY29tL3RheWUvaW50ZXJhY3QuanMvaXNzdWVzLzExNClcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiAgIFRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIC0gZHJhZywgcmVzaXplLCBldGMuXG4gICAqIEBwYXJhbSB7SW50ZXJhY3RhYmxlfSB0YXJnZXQgIFRoZSBJbnRlcmFjdGFibGUgdG8gdGFyZ2V0XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgRE9NIEVsZW1lbnQgdG8gdGFyZ2V0XG4gICAqIEByZXR1cm4ge29iamVjdH0gaW50ZXJhY3RcbiAgICovXG4gIHN0YXJ0IChhY3Rpb246IFN0YXJ0QWN0aW9uLCBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSwgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAgIGlmICh0aGlzLmludGVyYWN0aW5nKCkgfHxcbiAgICAgICAgIXRoaXMucG9pbnRlcklzRG93biB8fFxuICAgICAgICB0aGlzLnBvaW50ZXJzLmxlbmd0aCA8IChhY3Rpb24ubmFtZSA9PT0gJ2dlc3R1cmUnID8gMiA6IDEpIHx8XG4gICAgICAgICFpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb24ubmFtZV0uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgdXRpbHMuY29weUFjdGlvbih0aGlzLnByZXBhcmVkLCBhY3Rpb24pXG5cbiAgICB0aGlzLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICAgIHRoaXMuZWxlbWVudCAgICAgID0gZWxlbWVudFxuICAgIHRoaXMucmVjdCAgICAgICAgID0gaW50ZXJhY3RhYmxlLmdldFJlY3QoZWxlbWVudClcbiAgICB0aGlzLmVkZ2VzICAgICAgICA9IHRoaXMucHJlcGFyZWQuZWRnZXNcbiAgICAgID8gdXRpbHMuZXh0ZW5kKHt9LCB0aGlzLnByZXBhcmVkLmVkZ2VzKVxuICAgICAgOiB7IGxlZnQ6IHRydWUsIHJpZ2h0OiB0cnVlLCB0b3A6IHRydWUsIGJvdHRvbTogdHJ1ZSB9XG4gICAgdGhpcy5fc3RvcHBlZCAgICAgPSBmYWxzZVxuICAgIHRoaXMuX2ludGVyYWN0aW5nID0gdGhpcy5fZG9QaGFzZSh7XG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICAgIGV2ZW50OiB0aGlzLmRvd25FdmVudCxcbiAgICAgIHBoYXNlOiAnc3RhcnQnLFxuICAgIH0pICYmICF0aGlzLl9zdG9wcGVkXG5cbiAgICByZXR1cm4gdGhpcy5faW50ZXJhY3RpbmdcbiAgfVxuXG4gIHBvaW50ZXJNb3ZlIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCkge1xuICAgIGlmICghdGhpcy5zaW11bGF0aW9uICYmICEodGhpcy5tb2RpZmljYXRpb24gJiYgdGhpcy5tb2RpZmljYXRpb24uZW5kUmVzdWx0KSkge1xuICAgICAgdGhpcy51cGRhdGVQb2ludGVyKHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgZHVwbGljYXRlTW92ZSA9ICh0aGlzLmNvb3Jkcy5jdXIucGFnZS54ID09PSB0aGlzLmNvb3Jkcy5wcmV2LnBhZ2UueCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29yZHMuY3VyLnBhZ2UueSA9PT0gdGhpcy5jb29yZHMucHJldi5wYWdlLnkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzLmN1ci5jbGllbnQueCA9PT0gdGhpcy5jb29yZHMucHJldi5jbGllbnQueCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29yZHMuY3VyLmNsaWVudC55ID09PSB0aGlzLmNvb3Jkcy5wcmV2LmNsaWVudC55KVxuXG4gICAgbGV0IGR4XG4gICAgbGV0IGR5XG5cbiAgICAvLyByZWdpc3RlciBtb3ZlbWVudCBncmVhdGVyIHRoYW4gcG9pbnRlck1vdmVUb2xlcmFuY2VcbiAgICBpZiAodGhpcy5wb2ludGVySXNEb3duICYmICF0aGlzLnBvaW50ZXJXYXNNb3ZlZCkge1xuICAgICAgZHggPSB0aGlzLmNvb3Jkcy5jdXIuY2xpZW50LnggLSB0aGlzLmNvb3Jkcy5zdGFydC5jbGllbnQueFxuICAgICAgZHkgPSB0aGlzLmNvb3Jkcy5jdXIuY2xpZW50LnkgLSB0aGlzLmNvb3Jkcy5zdGFydC5jbGllbnQueVxuXG4gICAgICB0aGlzLnBvaW50ZXJXYXNNb3ZlZCA9IHV0aWxzLmh5cG90KGR4LCBkeSkgPiB0aGlzLnBvaW50ZXJNb3ZlVG9sZXJhbmNlXG4gICAgfVxuXG4gICAgY29uc3QgcG9pbnRlckluZGV4ID0gdGhpcy5nZXRQb2ludGVySW5kZXgocG9pbnRlcilcbiAgICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgICBwb2ludGVyLFxuICAgICAgcG9pbnRlckluZGV4LFxuICAgICAgcG9pbnRlckluZm86IHRoaXMucG9pbnRlcnNbcG9pbnRlckluZGV4XSxcbiAgICAgIGV2ZW50LFxuICAgICAgdHlwZTogJ21vdmUnIGFzIGNvbnN0LFxuICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICBkeCxcbiAgICAgIGR5LFxuICAgICAgZHVwbGljYXRlOiBkdXBsaWNhdGVNb3ZlLFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfVxuXG4gICAgaWYgKCFkdXBsaWNhdGVNb3ZlKSB7XG4gICAgICAvLyBzZXQgcG9pbnRlciBjb29yZGluYXRlLCB0aW1lIGNoYW5nZXMgYW5kIHZlbG9jaXR5XG4gICAgICB1dGlscy5wb2ludGVyLnNldENvb3JkVmVsb2NpdHkodGhpcy5jb29yZHMudmVsb2NpdHksIHRoaXMuY29vcmRzLmRlbHRhKVxuICAgIH1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOm1vdmUnLCBzaWduYWxBcmcpXG5cbiAgICBpZiAoIWR1cGxpY2F0ZU1vdmUgJiYgIXRoaXMuc2ltdWxhdGlvbikge1xuICAgICAgLy8gaWYgaW50ZXJhY3RpbmcsIGZpcmUgYW4gJ2FjdGlvbi1tb3ZlJyBzaWduYWwgZXRjXG4gICAgICBpZiAodGhpcy5pbnRlcmFjdGluZygpKSB7XG4gICAgICAgIHNpZ25hbEFyZy50eXBlID0gbnVsbFxuICAgICAgICB0aGlzLm1vdmUoc2lnbmFsQXJnKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wb2ludGVyV2FzTW92ZWQpIHtcbiAgICAgICAgdXRpbHMucG9pbnRlci5jb3B5Q29vcmRzKHRoaXMuY29vcmRzLnByZXYsIHRoaXMuY29vcmRzLmN1cilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAgIC5kcmFnZ2FibGUodHJ1ZSlcbiAgICogICAub24oJ2RyYWdtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAqICAgICBpZiAoc29tZUNvbmRpdGlvbikge1xuICAgKiAgICAgICAvLyBjaGFuZ2UgdGhlIHNuYXAgc2V0dGluZ3NcbiAgICogICAgICAgZXZlbnQuaW50ZXJhY3RhYmxlLmRyYWdnYWJsZSh7IHNuYXA6IHsgdGFyZ2V0czogW10gfX0pXG4gICAqICAgICAgIC8vIGZpcmUgYW5vdGhlciBtb3ZlIGV2ZW50IHdpdGggcmUtY2FsY3VsYXRlZCBzbmFwXG4gICAqICAgICAgIGV2ZW50LmludGVyYWN0aW9uLm1vdmUoKVxuICAgKiAgICAgfVxuICAgKiAgIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBGb3JjZSBhIG1vdmUgb2YgdGhlIGN1cnJlbnQgYWN0aW9uIGF0IHRoZSBzYW1lIGNvb3JkaW5hdGVzLiBVc2VmdWwgaWZcbiAgICogc25hcC9yZXN0cmljdCBoYXMgYmVlbiBjaGFuZ2VkIGFuZCB5b3Ugd2FudCBhIG1vdmVtZW50IHdpdGggdGhlIG5ld1xuICAgKiBzZXR0aW5ncy5cbiAgICovXG4gIG1vdmUgKHNpZ25hbEFyZz8pIHtcbiAgICBpZiAoIXNpZ25hbEFyZyB8fCAhc2lnbmFsQXJnLmV2ZW50KSB7XG4gICAgICB1dGlscy5wb2ludGVyLnNldFplcm9Db29yZHModGhpcy5jb29yZHMuZGVsdGEpXG4gICAgfVxuXG4gICAgc2lnbmFsQXJnID0gdXRpbHMuZXh0ZW5kKHtcbiAgICAgIHBvaW50ZXI6IHRoaXMuX2xhdGVzdFBvaW50ZXIucG9pbnRlcixcbiAgICAgIGV2ZW50OiB0aGlzLl9sYXRlc3RQb2ludGVyLmV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQsXG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICB9LCBzaWduYWxBcmcgfHwge30pXG5cbiAgICBzaWduYWxBcmcucGhhc2UgPSAnbW92ZSdcblxuICAgIHRoaXMuX2RvUGhhc2Uoc2lnbmFsQXJnKVxuICB9XG5cbiAgLy8gRW5kIGludGVyYWN0IG1vdmUgZXZlbnRzIGFuZCBzdG9wIGF1dG8tc2Nyb2xsIHVubGVzcyBzaW11bGF0aW9uIGlzIHJ1bm5pbmdcbiAgcG9pbnRlclVwIChwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSwgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCwgY3VyRXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0KSB7XG4gICAgbGV0IHBvaW50ZXJJbmRleCA9IHRoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG5cbiAgICBpZiAocG9pbnRlckluZGV4ID09PSAtMSkge1xuICAgICAgcG9pbnRlckluZGV4ID0gdGhpcy51cGRhdGVQb2ludGVyKHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IC9jYW5jZWwkL2kudGVzdChldmVudC50eXBlKSA/ICdjYW5jZWwnIDogJ3VwJ1xuXG4gICAgdGhpcy5fc2NvcGVGaXJlKGBpbnRlcmFjdGlvbnM6JHt0eXBlfWAgYXMgJ2ludGVyYWN0aW9uczp1cCcgfCAnaW50ZXJhY3Rpb25zOmNhbmNlbCcsIHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBwb2ludGVySW5kZXgsXG4gICAgICBwb2ludGVySW5mbzogdGhpcy5wb2ludGVyc1twb2ludGVySW5kZXhdLFxuICAgICAgZXZlbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHR5cGU6IHR5cGUgYXMgYW55LFxuICAgICAgY3VyRXZlbnRUYXJnZXQsXG4gICAgICBpbnRlcmFjdGlvbjogdGhpcyxcbiAgICB9KVxuXG4gICAgaWYgKCF0aGlzLnNpbXVsYXRpb24pIHtcbiAgICAgIHRoaXMuZW5kKGV2ZW50KVxuICAgIH1cblxuICAgIHRoaXMucG9pbnRlcklzRG93biA9IGZhbHNlXG4gICAgdGhpcy5yZW1vdmVQb2ludGVyKHBvaW50ZXIsIGV2ZW50KVxuICB9XG5cbiAgZG9jdW1lbnRCbHVyIChldmVudCkge1xuICAgIHRoaXMuZW5kKGV2ZW50KVxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOmJsdXInLCB7IGV2ZW50LCB0eXBlOiAnYmx1cicsIGludGVyYWN0aW9uOiB0aGlzIH0pXG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAgIC5kcmFnZ2FibGUodHJ1ZSlcbiAgICogICAub24oJ21vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICogICAgIGlmIChldmVudC5wYWdlWCA+IDEwMDApIHtcbiAgICogICAgICAgLy8gZW5kIHRoZSBjdXJyZW50IGFjdGlvblxuICAgKiAgICAgICBldmVudC5pbnRlcmFjdGlvbi5lbmQoKVxuICAgKiAgICAgICAvLyBzdG9wIGFsbCBmdXJ0aGVyIGxpc3RlbmVycyBmcm9tIGJlaW5nIGNhbGxlZFxuICAgKiAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgKiAgICAgfVxuICAgKiAgIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gW2V2ZW50XVxuICAgKi9cbiAgZW5kIChldmVudD86IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9lbmRpbmcgPSB0cnVlXG4gICAgZXZlbnQgPSBldmVudCB8fCB0aGlzLl9sYXRlc3RQb2ludGVyLmV2ZW50XG4gICAgbGV0IGVuZFBoYXNlUmVzdWx0XG5cbiAgICBpZiAodGhpcy5pbnRlcmFjdGluZygpKSB7XG4gICAgICBlbmRQaGFzZVJlc3VsdCA9IHRoaXMuX2RvUGhhc2Uoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgICAgIHBoYXNlOiAnZW5kJyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fZW5kaW5nID0gZmFsc2VcblxuICAgIGlmIChlbmRQaGFzZVJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdG9wKClcbiAgICB9XG4gIH1cblxuICBjdXJyZW50QWN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJhY3RpbmcgPyB0aGlzLnByZXBhcmVkLm5hbWUgOiBudWxsXG4gIH1cblxuICBpbnRlcmFjdGluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW5nXG4gIH1cblxuICAvKiogKi9cbiAgc3RvcCAoKSB7XG4gICAgdGhpcy5fc2NvcGVGaXJlKCdpbnRlcmFjdGlvbnM6c3RvcCcsIHsgaW50ZXJhY3Rpb246IHRoaXMgfSlcblxuICAgIHRoaXMuaW50ZXJhY3RhYmxlID0gdGhpcy5lbGVtZW50ID0gbnVsbFxuXG4gICAgdGhpcy5faW50ZXJhY3RpbmcgPSBmYWxzZVxuICAgIHRoaXMuX3N0b3BwZWQgPSB0cnVlXG4gICAgdGhpcy5wcmVwYXJlZC5uYW1lID0gdGhpcy5wcmV2RXZlbnQgPSBudWxsXG4gIH1cblxuICBnZXRQb2ludGVySW5kZXggKHBvaW50ZXIpIHtcbiAgICBjb25zdCBwb2ludGVySWQgPSB1dGlscy5wb2ludGVyLmdldFBvaW50ZXJJZChwb2ludGVyKVxuXG4gICAgLy8gbW91c2UgYW5kIHBlbiBpbnRlcmFjdGlvbnMgbWF5IGhhdmUgb25seSBvbmUgcG9pbnRlclxuICAgIHJldHVybiAodGhpcy5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCB0aGlzLnBvaW50ZXJUeXBlID09PSAncGVuJylcbiAgICAgID8gdGhpcy5wb2ludGVycy5sZW5ndGggLSAxXG4gICAgICA6IHV0aWxzLmFyci5maW5kSW5kZXgodGhpcy5wb2ludGVycywgY3VyUG9pbnRlciA9PiBjdXJQb2ludGVyLmlkID09PSBwb2ludGVySWQpXG4gIH1cblxuICBnZXRQb2ludGVySW5mbyAocG9pbnRlcikge1xuICAgIHJldHVybiB0aGlzLnBvaW50ZXJzW3RoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXVxuICB9XG5cbiAgdXBkYXRlUG9pbnRlciAocG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUsIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLCBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsIGRvd24/OiBib29sZWFuKSB7XG4gICAgY29uc3QgaWQgPSB1dGlscy5wb2ludGVyLmdldFBvaW50ZXJJZChwb2ludGVyKVxuICAgIGxldCBwb2ludGVySW5kZXggPSB0aGlzLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuICAgIGxldCBwb2ludGVySW5mbyA9IHRoaXMucG9pbnRlcnNbcG9pbnRlckluZGV4XVxuXG4gICAgZG93biA9IGRvd24gPT09IGZhbHNlXG4gICAgICA/IGZhbHNlXG4gICAgICA6IGRvd24gfHwgLyhkb3dufHN0YXJ0KSQvaS50ZXN0KGV2ZW50LnR5cGUpXG5cbiAgICBpZiAoIXBvaW50ZXJJbmZvKSB7XG4gICAgICBwb2ludGVySW5mbyA9IG5ldyBQb2ludGVySW5mbyhcbiAgICAgICAgaWQsXG4gICAgICAgIHBvaW50ZXIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKVxuXG4gICAgICBwb2ludGVySW5kZXggPSB0aGlzLnBvaW50ZXJzLmxlbmd0aFxuICAgICAgdGhpcy5wb2ludGVycy5wdXNoKHBvaW50ZXJJbmZvKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHBvaW50ZXJJbmZvLnBvaW50ZXIgPSBwb2ludGVyXG4gICAgfVxuXG4gICAgdXRpbHMucG9pbnRlci5zZXRDb29yZHModGhpcy5jb29yZHMuY3VyLCB0aGlzLnBvaW50ZXJzLm1hcChwID0+IHAucG9pbnRlciksIHRoaXMuX25vdygpKVxuICAgIHV0aWxzLnBvaW50ZXIuc2V0Q29vcmREZWx0YXModGhpcy5jb29yZHMuZGVsdGEsIHRoaXMuY29vcmRzLnByZXYsIHRoaXMuY29vcmRzLmN1cilcblxuICAgIGlmIChkb3duKSB7XG4gICAgICB0aGlzLnBvaW50ZXJJc0Rvd24gPSB0cnVlXG5cbiAgICAgIHBvaW50ZXJJbmZvLmRvd25UaW1lID0gdGhpcy5jb29yZHMuY3VyLnRpbWVTdGFtcFxuICAgICAgcG9pbnRlckluZm8uZG93blRhcmdldCA9IGV2ZW50VGFyZ2V0XG4gICAgICB1dGlscy5wb2ludGVyLnBvaW50ZXJFeHRlbmQodGhpcy5kb3duUG9pbnRlciwgcG9pbnRlcilcblxuICAgICAgaWYgKCF0aGlzLmludGVyYWN0aW5nKCkpIHtcbiAgICAgICAgdXRpbHMucG9pbnRlci5jb3B5Q29vcmRzKHRoaXMuY29vcmRzLnN0YXJ0LCB0aGlzLmNvb3Jkcy5jdXIpXG4gICAgICAgIHV0aWxzLnBvaW50ZXIuY29weUNvb3Jkcyh0aGlzLmNvb3Jkcy5wcmV2LCB0aGlzLmNvb3Jkcy5jdXIpXG5cbiAgICAgICAgdGhpcy5kb3duRXZlbnQgPSBldmVudFxuICAgICAgICB0aGlzLnBvaW50ZXJXYXNNb3ZlZCA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlTGF0ZXN0UG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQpXG5cbiAgICB0aGlzLl9zY29wZUZpcmUoJ2ludGVyYWN0aW9uczp1cGRhdGUtcG9pbnRlcicsIHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBldmVudCxcbiAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgZG93bixcbiAgICAgIHBvaW50ZXJJbmZvLFxuICAgICAgcG9pbnRlckluZGV4LFxuICAgICAgaW50ZXJhY3Rpb246IHRoaXMsXG4gICAgfSlcblxuICAgIHJldHVybiBwb2ludGVySW5kZXhcbiAgfVxuXG4gIHJlbW92ZVBvaW50ZXIgKHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLCBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSkge1xuICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IHRoaXMuZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG5cbiAgICBpZiAocG9pbnRlckluZGV4ID09PSAtMSkgeyByZXR1cm4gfVxuXG4gICAgY29uc3QgcG9pbnRlckluZm8gPSB0aGlzLnBvaW50ZXJzW3BvaW50ZXJJbmRleF1cblxuICAgIHRoaXMuX3Njb3BlRmlyZSgnaW50ZXJhY3Rpb25zOnJlbW92ZS1wb2ludGVyJywge1xuICAgICAgcG9pbnRlcixcbiAgICAgIGV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IG51bGwsXG4gICAgICBwb2ludGVySW5kZXgsXG4gICAgICBwb2ludGVySW5mbyxcbiAgICAgIGludGVyYWN0aW9uOiB0aGlzLFxuICAgIH0pXG5cbiAgICB0aGlzLnBvaW50ZXJzLnNwbGljZShwb2ludGVySW5kZXgsIDEpXG4gIH1cblxuICBfdXBkYXRlTGF0ZXN0UG9pbnRlciAocG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5wb2ludGVyID0gcG9pbnRlclxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnQgPSBldmVudFxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldFxuICB9XG5cbiAgZGVzdHJveSAoKSB7XG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5wb2ludGVyID0gbnVsbFxuICAgIHRoaXMuX2xhdGVzdFBvaW50ZXIuZXZlbnQgPSBudWxsXG4gICAgdGhpcy5fbGF0ZXN0UG9pbnRlci5ldmVudFRhcmdldCA9IG51bGxcbiAgfVxuXG4gIF9jcmVhdGVQcmVwYXJlZEV2ZW50PFAgZXh0ZW5kcyBFdmVudFBoYXNlPiAoZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsIHBoYXNlOiBQLCBwcmVFbmQ/OiBib29sZWFuLCB0eXBlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBJbnRlcmFjdEV2ZW50PFQsIFA+KHRoaXMsIGV2ZW50LCB0aGlzLnByZXBhcmVkLm5hbWUsIHBoYXNlLCB0aGlzLmVsZW1lbnQsIHByZUVuZCwgdHlwZSlcbiAgfVxuXG4gIF9maXJlRXZlbnQ8UCBleHRlbmRzIEV2ZW50UGhhc2U+IChpRXZlbnQ6IEludGVyYWN0RXZlbnQ8VCwgUD4pIHtcbiAgICB0aGlzLmludGVyYWN0YWJsZS5maXJlKGlFdmVudClcblxuICAgIGlmICghdGhpcy5wcmV2RXZlbnQgfHwgaUV2ZW50LnRpbWVTdGFtcCA+PSB0aGlzLnByZXZFdmVudC50aW1lU3RhbXApIHtcbiAgICAgIHRoaXMucHJldkV2ZW50ID0gaUV2ZW50XG4gICAgfVxuICB9XG5cbiAgX2RvUGhhc2U8UCBleHRlbmRzIEV2ZW50UGhhc2U+IChzaWduYWxBcmc6IE9taXQ8RG9QaGFzZUFyZzxULCBQPiwgJ2lFdmVudCc+ICYgeyBpRXZlbnQ/OiBJbnRlcmFjdEV2ZW50PFQsIFA+IH0pIHtcbiAgICBjb25zdCB7IGV2ZW50LCBwaGFzZSwgcHJlRW5kLCB0eXBlIH0gPSBzaWduYWxBcmdcbiAgICBjb25zdCB7IHJlY3QgfSA9IHRoaXNcblxuICAgIGlmIChyZWN0ICYmIHBoYXNlID09PSAnbW92ZScpIHtcbiAgICAgIC8vIHVwZGF0ZSB0aGUgcmVjdCBjaGFuZ2VzIGR1ZSB0byBwb2ludGVyIG1vdmVcbiAgICAgIHV0aWxzLnJlY3QuYWRkRWRnZXModGhpcy5lZGdlcywgcmVjdCwgdGhpcy5jb29yZHMuZGVsdGFbdGhpcy5pbnRlcmFjdGFibGUub3B0aW9ucy5kZWx0YVNvdXJjZV0pXG5cbiAgICAgIHJlY3Qud2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0XG4gICAgICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgICB9XG5cbiAgICBjb25zdCBiZWZvcmVSZXN1bHQgPSB0aGlzLl9zY29wZUZpcmUoYGludGVyYWN0aW9uczpiZWZvcmUtYWN0aW9uLSR7cGhhc2V9YCBhcyBhbnksIHNpZ25hbEFyZylcblxuICAgIGlmIChiZWZvcmVSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBpRXZlbnQgPSBzaWduYWxBcmcuaUV2ZW50ID0gdGhpcy5fY3JlYXRlUHJlcGFyZWRFdmVudChldmVudCwgcGhhc2UsIHByZUVuZCwgdHlwZSlcblxuICAgIHRoaXMuX3Njb3BlRmlyZShgaW50ZXJhY3Rpb25zOmFjdGlvbi0ke3BoYXNlfWAgYXMgYW55LCBzaWduYWxBcmcpXG5cbiAgICBpZiAocGhhc2UgPT09ICdzdGFydCcpIHsgdGhpcy5wcmV2RXZlbnQgPSBpRXZlbnQgfVxuXG4gICAgdGhpcy5fZmlyZUV2ZW50KGlFdmVudClcblxuICAgIHRoaXMuX3Njb3BlRmlyZShgaW50ZXJhY3Rpb25zOmFmdGVyLWFjdGlvbi0ke3BoYXNlfWAgYXMgYW55LCBzaWduYWxBcmcpXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX25vdyAoKSB7IHJldHVybiBEYXRlLm5vdygpIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJhY3Rpb25cbmV4cG9ydCB7IFBvaW50ZXJJbmZvIH1cbiIsImltcG9ydCAqIGFzIGRvbSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21VdGlscydcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hEZXRhaWxzIHtcbiAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGVcbiAgcG9pbnRlcklkOiBudW1iZXJcbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuICBldmVudFR5cGU6IHN0cmluZ1xuICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgY3VyRXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZVxufVxuXG5jb25zdCBmaW5kZXIgPSB7XG4gIG1ldGhvZE9yZGVyOiBbJ3NpbXVsYXRpb25SZXN1bWUnLCAnbW91c2VPclBlbicsICdoYXNQb2ludGVyJywgJ2lkbGUnXSBhcyBjb25zdCxcblxuICBzZWFyY2ggKGRldGFpbHM6IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBmaW5kZXIubWV0aG9kT3JkZXIpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZmluZGVyW21ldGhvZF0oZGV0YWlscylcblxuICAgICAgaWYgKGludGVyYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgLy8gdHJ5IHRvIHJlc3VtZSBzaW11bGF0aW9uIHdpdGggYSBuZXcgcG9pbnRlclxuICBzaW11bGF0aW9uUmVzdW1lICh7IHBvaW50ZXJUeXBlLCBldmVudFR5cGUsIGV2ZW50VGFyZ2V0LCBzY29wZSB9OiBTZWFyY2hEZXRhaWxzKSB7XG4gICAgaWYgKCEvZG93bnxzdGFydC9pLnRlc3QoZXZlbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICBsZXQgZWxlbWVudCA9IGV2ZW50VGFyZ2V0IGFzIE5vZGVcblxuICAgICAgaWYgKGludGVyYWN0aW9uLnNpbXVsYXRpb24gJiYgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbi5hbGxvd1Jlc3VtZSAmJlxuICAgICAgICAgIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpKSB7XG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XG4gICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgdGhlIGludGVyYWN0aW9uIGVsZW1lbnRcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gaW50ZXJhY3Rpb24uZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGludGVyYWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQgPSBkb20ucGFyZW50Tm9kZShlbGVtZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICAvLyBpZiBpdCdzIGEgbW91c2Ugb3IgcGVuIGludGVyYWN0aW9uXG4gIG1vdXNlT3JQZW4gKHsgcG9pbnRlcklkLCBwb2ludGVyVHlwZSwgZXZlbnRUeXBlLCBzY29wZSB9OiBTZWFyY2hEZXRhaWxzKSB7XG4gICAgaWYgKHBvaW50ZXJUeXBlICE9PSAnbW91c2UnICYmIHBvaW50ZXJUeXBlICE9PSAncGVuJykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBsZXQgZmlyc3ROb25BY3RpdmVcblxuICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpIHtcbiAgICAgICAgLy8gaWYgaXQncyBhIGRvd24gZXZlbnQsIHNraXAgaW50ZXJhY3Rpb25zIHdpdGggcnVubmluZyBzaW11bGF0aW9uc1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiAmJiAhaGFzUG9pbnRlcklkKGludGVyYWN0aW9uLCBwb2ludGVySWQpKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICAvLyBpZiB0aGUgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLCByZXR1cm4gaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2Ugc2F2ZSBpdCBhbmQgbG9vayBmb3IgYW5vdGhlciBhY3RpdmUgaW50ZXJhY3Rpb25cbiAgICAgICAgZWxzZSBpZiAoIWZpcnN0Tm9uQWN0aXZlKSB7XG4gICAgICAgICAgZmlyc3ROb25BY3RpdmUgPSBpbnRlcmFjdGlvblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgbm8gYWN0aXZlIG1vdXNlIGludGVyYWN0aW9uIHdhcyBmb3VuZCB1c2UgdGhlIGZpcnN0IGluYWN0aXZlIG1vdXNlXG4gICAgLy8gaW50ZXJhY3Rpb25cbiAgICBpZiAoZmlyc3ROb25BY3RpdmUpIHtcbiAgICAgIHJldHVybiBmaXJzdE5vbkFjdGl2ZVxuICAgIH1cblxuICAgIC8vIGZpbmQgYW55IG1vdXNlIG9yIHBlbiBpbnRlcmFjdGlvbi5cbiAgICAvLyBpZ25vcmUgdGhlIGludGVyYWN0aW9uIGlmIHRoZSBldmVudFR5cGUgaXMgYSAqZG93biwgYW5kIGEgc2ltdWxhdGlvblxuICAgIC8vIGlzIGFjdGl2ZVxuICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUgJiYgISgvZG93bi9pLnRlc3QoZXZlbnRUeXBlKSAmJiBpbnRlcmFjdGlvbi5zaW11bGF0aW9uKSkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIC8vIGdldCBpbnRlcmFjdGlvbiB0aGF0IGhhcyB0aGlzIHBvaW50ZXJcbiAgaGFzUG9pbnRlciAoeyBwb2ludGVySWQsIHNjb3BlIH06IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICBpZiAoaGFzUG9pbnRlcklkKGludGVyYWN0aW9uLCBwb2ludGVySWQpKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgLy8gZ2V0IGZpcnN0IGlkbGUgaW50ZXJhY3Rpb24gd2l0aCBhIG1hdGNoaW5nIHBvaW50ZXJUeXBlXG4gIGlkbGUgKHsgcG9pbnRlclR5cGUsIHNjb3BlIH06IFNlYXJjaERldGFpbHMpIHtcbiAgICBmb3IgKGNvbnN0IGludGVyYWN0aW9uIG9mIHNjb3BlLmludGVyYWN0aW9ucy5saXN0KSB7XG4gICAgICAvLyBpZiB0aGVyZSdzIGFscmVhZHkgYSBwb2ludGVyIGhlbGQgZG93blxuICAgICAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGVcbiAgICAgICAgLy8gZG9uJ3QgYWRkIHRoaXMgcG9pbnRlciBpZiB0aGVyZSBpcyBhIHRhcmdldCBpbnRlcmFjdGFibGUgYW5kIGl0XG4gICAgICAgIC8vIGlzbid0IGdlc3R1cmFibGVcbiAgICAgICAgaWYgKHRhcmdldCAmJiAhKHRhcmdldC5vcHRpb25zLmdlc3R1cmUgJiYgdGFyZ2V0Lm9wdGlvbnMuZ2VzdHVyZS5lbmFibGVkKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG1heGltdW0gb2YgMiBwb2ludGVycyBwZXIgaW50ZXJhY3Rpb25cbiAgICAgIGVsc2UgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSAmJiAocG9pbnRlclR5cGUgPT09IGludGVyYWN0aW9uLnBvaW50ZXJUeXBlKSkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxufVxuXG5mdW5jdGlvbiBoYXNQb2ludGVySWQgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiwgcG9pbnRlcklkOiBudW1iZXIpIHtcbiAgcmV0dXJuIGludGVyYWN0aW9uLnBvaW50ZXJzLnNvbWUoKHsgaWQgfSkgPT4gaWQgPT09IHBvaW50ZXJJZClcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmluZGVyXG4iLCJpbXBvcnQgeyBtYXRjaGVzU2VsZWN0b3IsIG5vZGVDb250YWlucyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV2ZW50cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9ldmVudHMnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcbmltcG9ydCB7IGdldFdpbmRvdyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3dpbmRvdydcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIHByZXZlbnREZWZhdWx0OiB0eXBlb2YgcHJldmVudERlZmF1bHRcbiAgICBjaGVja0FuZFByZXZlbnREZWZhdWx0OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkXG4gIH1cbn1cblxudHlwZSBQcmV2ZW50RGVmYXVsdFZhbHVlID0gJ2Fsd2F5cycgfCAnbmV2ZXInIHwgJ2F1dG8nXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKTogUHJldmVudERlZmF1bHRWYWx1ZVxuZnVuY3Rpb24gcHJldmVudERlZmF1bHQgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU6IFByZXZlbnREZWZhdWx0VmFsdWUpOiB0eXBlb2YgdGhpc1xuZnVuY3Rpb24gcHJldmVudERlZmF1bHQgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU/OiBQcmV2ZW50RGVmYXVsdFZhbHVlKSB7XG4gIGlmICgvXihhbHdheXN8bmV2ZXJ8YXV0bykkLy50ZXN0KG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCA9IG5ld1ZhbHVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGlmIChpcy5ib29sKG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCA9IG5ld1ZhbHVlID8gJ2Fsd2F5cycgOiAnbmV2ZXInXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMucHJldmVudERlZmF1bHRcbn1cblxuZnVuY3Rpb24gY2hlY2tBbmRQcmV2ZW50RGVmYXVsdCAoaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIHNjb3BlOiBJbnRlcmFjdC5TY29wZSwgZXZlbnQ6IEV2ZW50KSB7XG4gIGNvbnN0IHNldHRpbmcgPSBpbnRlcmFjdGFibGUub3B0aW9ucy5wcmV2ZW50RGVmYXVsdFxuXG4gIGlmIChzZXR0aW5nID09PSAnbmV2ZXInKSB7IHJldHVybiB9XG5cbiAgaWYgKHNldHRpbmcgPT09ICdhbHdheXMnKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gc2V0dGluZyA9PT0gJ2F1dG8nXG5cbiAgLy8gaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMgYW5kIGlzbid0IHJ1bm5pbmcgb24gaU9TLFxuICAvLyBkb24ndCBwcmV2ZW50RGVmYXVsdCBvZiB0b3VjaHtzdGFydCxtb3ZlfSBldmVudHMuIENTUyB0b3VjaC1hY3Rpb24gYW5kXG4gIC8vIHVzZXItc2VsZWN0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgY2FsbGluZyBldmVudC5wcmV2ZW50RGVmYXVsdCgpLlxuICBpZiAoZXZlbnRzLnN1cHBvcnRzUGFzc2l2ZSAmJiAvXnRvdWNoKHN0YXJ0fG1vdmUpJC8udGVzdChldmVudC50eXBlKSkge1xuICAgIGNvbnN0IGRvYyA9IGdldFdpbmRvdyhldmVudC50YXJnZXQpLmRvY3VtZW50XG4gICAgY29uc3QgZG9jT3B0aW9ucyA9IHNjb3BlLmdldERvY09wdGlvbnMoZG9jKVxuXG4gICAgaWYgKCEoZG9jT3B0aW9ucyAmJiBkb2NPcHRpb25zLmV2ZW50cykgfHwgZG9jT3B0aW9ucy5ldmVudHMucGFzc2l2ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8vIGRvbid0IHByZXZlbnREZWZhdWx0IG9mIHBvaW50ZXJkb3duIGV2ZW50c1xuICBpZiAoL14obW91c2V8cG9pbnRlcnx0b3VjaCkqKGRvd258c3RhcnQpL2kudGVzdChldmVudC50eXBlKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gZG9uJ3QgcHJldmVudERlZmF1bHQgb24gZWRpdGFibGUgZWxlbWVudHNcbiAgaWYgKGlzLmVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgbWF0Y2hlc1NlbGVjdG9yKGV2ZW50LnRhcmdldCwgJ2lucHV0LHNlbGVjdCx0ZXh0YXJlYSxbY29udGVudGVkaXRhYmxlPXRydWVdLFtjb250ZW50ZWRpdGFibGU9dHJ1ZV0gKicpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG5cbmZ1bmN0aW9uIG9uSW50ZXJhY3Rpb25FdmVudCAoeyBpbnRlcmFjdGlvbiwgZXZlbnQgfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSkge1xuICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5jaGVja0FuZFByZXZlbnREZWZhdWx0KGV2ZW50IGFzIEV2ZW50KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsIChzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgY29uc3QgeyBJbnRlcmFjdGFibGUgfSA9IHNjb3BlXG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3Igc2V0cyB3aGV0aGVyIHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW91ciBpblxuICAgKiByZXNwb25zZSB0byBwb2ludGVyIGV2ZW50cy4gQ2FuIGJlIHNldCB0bzpcbiAgICogIC0gYCdhbHdheXMnYCB0byBhbHdheXMgcHJldmVudFxuICAgKiAgLSBgJ25ldmVyJ2AgdG8gbmV2ZXIgcHJldmVudFxuICAgKiAgLSBgJ2F1dG8nYCB0byBsZXQgaW50ZXJhY3QuanMgdHJ5IHRvIGRldGVybWluZSB3aGF0IHdvdWxkIGJlIGJlc3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuZXdWYWx1ZV0gYCdhbHdheXMnYCwgYCduZXZlcidgIG9yIGAnYXV0bydgXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IEludGVyYWN0YWJsZX0gVGhlIGN1cnJlbnQgc2V0dGluZyBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IHByZXZlbnREZWZhdWx0XG5cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5jaGVja0FuZFByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGNoZWNrQW5kUHJldmVudERlZmF1bHQodGhpcywgc2NvcGUsIGV2ZW50KVxuICB9XG5cbiAgLy8gcHJldmVudCBuYXRpdmUgSFRNTDUgZHJhZyBvbiBpbnRlcmFjdC5qcyB0YXJnZXQgZWxlbWVudHNcbiAgc2NvcGUuaW50ZXJhY3Rpb25zLmRvY0V2ZW50cy5wdXNoKHtcbiAgICB0eXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICBsaXN0ZW5lciAoZXZlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJhY3Rpb24gb2Ygc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QpIHtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLmVsZW1lbnQgJiZcbiAgICAgICAgICAoaW50ZXJhY3Rpb24uZWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0IHx8XG4gICAgICAgICAgIG5vZGVDb250YWlucyhpbnRlcmFjdGlvbi5lbGVtZW50LCBldmVudC50YXJnZXQpKSkge1xuICAgICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5jaGVja0FuZFByZXZlbnREZWZhdWx0KGV2ZW50KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2NvcmUvaW50ZXJhY3RhYmxlUHJldmVudERlZmF1bHQnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IFsnZG93bicsICdtb3ZlJywgJ3VwJywgJ2NhbmNlbCddLnJlZHVjZSgoYWNjLCBldmVudFR5cGUpID0+IHtcbiAgICBhY2NbYGludGVyYWN0aW9uczoke2V2ZW50VHlwZX1gXSA9IG9uSW50ZXJhY3Rpb25FdmVudFxuICAgIHJldHVybiBhY2NcbiAgfSwge30gYXMgYW55KSxcbn1cbiIsImltcG9ydCBCYXNlRXZlbnQgZnJvbSAnQGludGVyYWN0anMvY29yZS9CYXNlRXZlbnQnXG5pbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IEludGVyYWN0RXZlbnQgZnJvbSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50J1xuaW1wb3J0ICogYXMgYXJyIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2FycidcblxuY2xhc3MgRHJvcEV2ZW50IGV4dGVuZHMgQmFzZUV2ZW50IHtcbiAgdGFyZ2V0OiBJbnRlcmFjdC5FbGVtZW50XG4gIGRyb3B6b25lOiBJbnRlcmFjdGFibGVcbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdEV2ZW50PCdkcmFnJz5cbiAgcmVsYXRlZFRhcmdldDogSW50ZXJhY3QuRWxlbWVudFxuICBkcmFnZ2FibGU6IEludGVyYWN0YWJsZVxuICB0aW1lU3RhbXA6IG51bWJlclxuICBwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuICBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBDbGFzcyBvZiBldmVudHMgZmlyZWQgb24gZHJvcHpvbmVzIGR1cmluZyBkcmFncyB3aXRoIGFjY2VwdGFibGUgdGFyZ2V0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChkcm9wU3RhdGU6IGltcG9ydCgnLi8nKS5Ecm9wU3RhdGUsIGRyYWdFdmVudDogSW50ZXJhY3RFdmVudDwnZHJhZyc+LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihkcmFnRXZlbnQuX2ludGVyYWN0aW9uKVxuXG4gICAgY29uc3QgeyBlbGVtZW50LCBkcm9wem9uZSB9ID0gdHlwZSA9PT0gJ2RyYWdsZWF2ZSdcbiAgICAgID8gZHJvcFN0YXRlLnByZXZcbiAgICAgIDogZHJvcFN0YXRlLmN1clxuXG4gICAgdGhpcy50eXBlICAgICAgICAgID0gdHlwZVxuICAgIHRoaXMudGFyZ2V0ICAgICAgICA9IGVsZW1lbnRcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50XG4gICAgdGhpcy5kcm9wem9uZSAgICAgID0gZHJvcHpvbmVcbiAgICB0aGlzLmRyYWdFdmVudCAgICAgPSBkcmFnRXZlbnRcbiAgICB0aGlzLnJlbGF0ZWRUYXJnZXQgPSBkcmFnRXZlbnQudGFyZ2V0XG4gICAgdGhpcy5kcmFnZ2FibGUgICAgID0gZHJhZ0V2ZW50LmludGVyYWN0YWJsZVxuICAgIHRoaXMudGltZVN0YW1wICAgICA9IGRyYWdFdmVudC50aW1lU3RhbXBcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIGEgYGRyb3BhY3RpdmF0ZWAgZXZlbnQsIHRoZSBkcm9wem9uZSBlbGVtZW50IHdpbGwgYmVcbiAgICogZGVhY3RpdmF0ZWQuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYSBgZHJhZ21vdmVgIG9yIGBkcmFnZW50ZXJgLCBhIGBkcmFnbGVhdmVgIHdpbGwgYmUgZmlyZWQgb24gdGhlXG4gICAqIGRyb3B6b25lIGVsZW1lbnQgYW5kIG1vcmUuXG4gICAqL1xuICByZWplY3QgKCkge1xuICAgIGNvbnN0IHsgZHJvcFN0YXRlIH0gPSB0aGlzLl9pbnRlcmFjdGlvblxuXG4gICAgaWYgKFxuICAgICAgKHRoaXMudHlwZSAhPT0gJ2Ryb3BhY3RpdmF0ZScpICYmIChcbiAgICAgICAgIXRoaXMuZHJvcHpvbmUgfHxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSAhPT0gdGhpcy5kcm9wem9uZSB8fFxuICAgICAgICBkcm9wU3RhdGUuY3VyLmVsZW1lbnQgIT09IHRoaXMudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZHJvcFN0YXRlLnByZXYuZHJvcHpvbmUgPSB0aGlzLmRyb3B6b25lXG4gICAgZHJvcFN0YXRlLnByZXYuZWxlbWVudCA9IHRoaXMudGFyZ2V0XG5cbiAgICBkcm9wU3RhdGUucmVqZWN0ZWQgPSB0cnVlXG4gICAgZHJvcFN0YXRlLmV2ZW50cy5lbnRlciA9IG51bGxcblxuICAgIHRoaXMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkcm9wYWN0aXZhdGUnKSB7XG4gICAgICBjb25zdCBhY3RpdmVEcm9wcyA9IGRyb3BTdGF0ZS5hY3RpdmVEcm9wc1xuICAgICAgY29uc3QgaW5kZXggPSBhcnIuZmluZEluZGV4KGFjdGl2ZURyb3BzLCAoeyBkcm9wem9uZSwgZWxlbWVudCB9KSA9PlxuICAgICAgICBkcm9wem9uZSA9PT0gdGhpcy5kcm9wem9uZSAmJiBlbGVtZW50ID09PSB0aGlzLnRhcmdldClcblxuICAgICAgZHJvcFN0YXRlLmFjdGl2ZURyb3BzLnNwbGljZShpbmRleCwgMSlcblxuICAgICAgY29uc3QgZGVhY3RpdmF0ZUV2ZW50ID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIHRoaXMuZHJhZ0V2ZW50LCAnZHJvcGRlYWN0aXZhdGUnKVxuXG4gICAgICBkZWFjdGl2YXRlRXZlbnQuZHJvcHpvbmUgPSB0aGlzLmRyb3B6b25lXG4gICAgICBkZWFjdGl2YXRlRXZlbnQudGFyZ2V0ID0gdGhpcy50YXJnZXRcblxuICAgICAgdGhpcy5kcm9wem9uZS5maXJlKGRlYWN0aXZhdGVFdmVudClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRyb3B6b25lLmZpcmUobmV3IERyb3BFdmVudChkcm9wU3RhdGUsIHRoaXMuZHJhZ0V2ZW50LCAnZHJhZ2xlYXZlJykpXG4gICAgfVxuICB9XG5cbiAgcHJldmVudERlZmF1bHQgKCkge31cblxuICBzdG9wUHJvcGFnYXRpb24gKCkge1xuICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG5cbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERyb3BFdmVudFxuIiwiaW1wb3J0IEludGVyYWN0YWJsZSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZSdcbmltcG9ydCBJbnRlcmFjdEV2ZW50IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RFdmVudCdcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9zY29wZSdcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0IGRyYWcgZnJvbSAnLi4vZHJhZydcbmltcG9ydCBEcm9wRXZlbnQgZnJvbSAnLi9Ecm9wRXZlbnQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcHpvbmVNZXRob2Qge1xuICAob3B0aW9uczogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zIHwgYm9vbGVhbik6IEludGVyYWN0LkludGVyYWN0YWJsZVxuICAoKTogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBkcm9wem9uZTogRHJvcHpvbmVNZXRob2RcbiAgICBkcm9wQ2hlY2s6IChcbiAgICAgIGRyYWdFdmVudDogSW50ZXJhY3RFdmVudCxcbiAgICAgIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLFxuICAgICAgZHJhZ2dhYmxlOiBJbnRlcmFjdGFibGUsXG4gICAgICBkcmFnZ2FibGVFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgICAgZHJvcEVsZW1lbjogSW50ZXJhY3QuRWxlbWVudCxcbiAgICAgIHJlY3Q6IGFueVxuICAgICkgPT4gYm9vbGVhblxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgZHJvcFN0YXRlPzogRHJvcFN0YXRlXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBkcm9wOiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgQWN0aW9uTWFwIHtcbiAgICBkcm9wPzogdHlwZW9mIGRyb3BcbiAgfVxuXG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgZHluYW1pY0Ryb3A/OiBib29sZWFuXG4gIH1cblxuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ2FjdGlvbnMvZHJvcDpzdGFydCc6IERyb3BTaWduYWxBcmdcbiAgICAnYWN0aW9ucy9kcm9wOm1vdmUnOiBEcm9wU2lnbmFsQXJnXG4gICAgJ2FjdGlvbnMvZHJvcDplbmQnOiBEcm9wU2lnbmFsQXJnXG4gIH1cbn1cblxuaW50ZXJmYWNlIERyb3BTaWduYWxBcmcge1xuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdC5EcmFnRXZlbnRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEcm9wU3RhdGUge1xuICBjdXI6IHtcbiAgICBkcm9wem9uZTogSW50ZXJhY3RhYmxlICAgIC8vIHRoZSBkcm9wem9uZSBhIGRyYWcgdGFyZ2V0IG1pZ2h0IGJlIGRyb3BwZWQgaW50b1xuICAgIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQgLy8gdGhlIGVsZW1lbnQgYXQgdGhlIHRpbWUgb2YgY2hlY2tpbmdcbiAgfVxuICBwcmV2OiB7XG4gICAgZHJvcHpvbmU6IEludGVyYWN0YWJsZSAgICAvLyB0aGUgZHJvcHpvbmUgdGhhdCB3YXMgcmVjZW50bHkgZHJhZ2dlZCBhd2F5IGZyb21cbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50IC8vIHRoZSBlbGVtZW50IGF0IHRoZSB0aW1lIG9mIGNoZWNraW5nXG4gIH1cbiAgcmVqZWN0ZWQ6IGJvb2xlYW4gICAgICAgICAgIC8vIHdoZWF0aGVyIHRoZSBwb3RlbnRpYWwgZHJvcCB3YXMgcmVqZWN0ZWQgZnJvbSBhIGxpc3RlbmVyXG4gIGV2ZW50czogYW55ICAgICAgICAgICAgICAgICAvLyB0aGUgZHJvcCBldmVudHMgcmVsYXRlZCB0byB0aGUgY3VycmVudCBkcmFnIGV2ZW50XG4gIGFjdGl2ZURyb3BzOiBBcnJheTx7XG4gICAgZHJvcHpvbmU6IEludGVyYWN0YWJsZVxuICAgIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbiAgICByZWN0OiBJbnRlcmFjdC5SZWN0XG4gIH0+XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgYWN0aW9ucyxcbiAgICAvKiogQGxlbmRzIG1vZHVsZTppbnRlcmFjdCAqL1xuICAgIGludGVyYWN0LFxuICAgIC8qKiBAbGVuZHMgSW50ZXJhY3RhYmxlICovXG4gICAgSW50ZXJhY3RhYmxlLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNoYWRvd1xuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS51c2VQbHVnaW4oZHJhZylcblxuICAvKipcbiAgICpcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QoJy5kcm9wJykuZHJvcHpvbmUoe1xuICAgKiAgIGFjY2VwdDogJy5jYW4tZHJvcCcgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbmdsZS1kcm9wJyksXG4gICAqICAgb3ZlcmxhcDogJ3BvaW50ZXInIHx8ICdjZW50ZXInIHx8IHplcm9Ub09uZVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXR1cm5zIG9yIHNldHMgd2hldGhlciBkcmFnZ2FibGVzIGNhbiBiZSBkcm9wcGVkIG9udG8gdGhpcyB0YXJnZXQgdG9cbiAgICogdHJpZ2dlciBkcm9wIGV2ZW50c1xuICAgKlxuICAgKiBEcm9wem9uZXMgY2FuIHJlY2VpdmUgdGhlIGZvbGxvd2luZyBldmVudHM6XG4gICAqICAtIGBkcm9wYWN0aXZhdGVgIGFuZCBgZHJvcGRlYWN0aXZhdGVgIHdoZW4gYW4gYWNjZXB0YWJsZSBkcmFnIHN0YXJ0cyBhbmQgZW5kc1xuICAgKiAgLSBgZHJhZ2VudGVyYCBhbmQgYGRyYWdsZWF2ZWAgd2hlbiBhIGRyYWdnYWJsZSBlbnRlcnMgYW5kIGxlYXZlcyB0aGUgZHJvcHpvbmVcbiAgICogIC0gYGRyYWdtb3ZlYCB3aGVuIGEgZHJhZ2dhYmxlIHRoYXQgaGFzIGVudGVyZWQgdGhlIGRyb3B6b25lIGlzIG1vdmVkXG4gICAqICAtIGBkcm9wYCB3aGVuIGEgZHJhZ2dhYmxlIGlzIGRyb3BwZWQgaW50byB0aGlzIGRyb3B6b25lXG4gICAqXG4gICAqIFVzZSB0aGUgYGFjY2VwdGAgb3B0aW9uIHRvIGFsbG93IG9ubHkgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gQ1NTXG4gICAqIHNlbGVjdG9yIG9yIGVsZW1lbnQuIFRoZSB2YWx1ZSBjYW4gYmU6XG4gICAqXG4gICAqICAtICoqYW4gRWxlbWVudCoqIC0gb25seSB0aGF0IGVsZW1lbnQgY2FuIGJlIGRyb3BwZWQgaW50byB0aGlzIGRyb3B6b25lLlxuICAgKiAgLSAqKmEgc3RyaW5nKiosIC0gdGhlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZCBtdXN0IG1hdGNoIGl0IGFzIGEgQ1NTIHNlbGVjdG9yLlxuICAgKiAgLSAqKmBudWxsYCoqIC0gYWNjZXB0IG9wdGlvbnMgaXMgY2xlYXJlZCAtIGl0IGFjY2VwdHMgYW55IGVsZW1lbnQuXG4gICAqXG4gICAqIFVzZSB0aGUgYG92ZXJsYXBgIG9wdGlvbiB0byBzZXQgaG93IGRyb3BzIGFyZSBjaGVja2VkIGZvci4gVGhlIGFsbG93ZWRcbiAgICogdmFsdWVzIGFyZTpcbiAgICpcbiAgICogICAtIGAncG9pbnRlcidgLCB0aGUgcG9pbnRlciBtdXN0IGJlIG92ZXIgdGhlIGRyb3B6b25lIChkZWZhdWx0KVxuICAgKiAgIC0gYCdjZW50ZXInYCwgdGhlIGRyYWdnYWJsZSBlbGVtZW50J3MgY2VudGVyIG11c3QgYmUgb3ZlciB0aGUgZHJvcHpvbmVcbiAgICogICAtIGEgbnVtYmVyIGZyb20gMC0xIHdoaWNoIGlzIHRoZSBgKGludGVyc2VjdGlvbiBhcmVhKSAvIChkcmFnZ2FibGUgYXJlYSlgLlxuICAgKiAgIGUuZy4gYDAuNWAgZm9yIGRyb3AgdG8gaGFwcGVuIHdoZW4gaGFsZiBvZiB0aGUgYXJlYSBvZiB0aGUgZHJhZ2dhYmxlIGlzXG4gICAqICAgb3ZlciB0aGUgZHJvcHpvbmVcbiAgICpcbiAgICogVXNlIHRoZSBgY2hlY2tlcmAgb3B0aW9uIHRvIHNwZWNpZnkgYSBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGRyYWdnZWQgZWxlbWVudFxuICAgKiBpcyBvdmVyIHRoaXMgSW50ZXJhY3RhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW4gfCBvYmplY3QgfCBudWxsfSBbb3B0aW9uc10gVGhlIG5ldyBvcHRpb25zIHRvIGJlIHNldC5cbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IEludGVyYWN0YWJsZX0gVGhlIGN1cnJlbnQgc2V0dGluZyBvciB0aGlzIEludGVyYWN0YWJsZVxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5kcm9wem9uZSA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIG9wdGlvbnM/OiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnMgfCBib29sZWFuKSB7XG4gICAgcmV0dXJuIGRyb3B6b25lTWV0aG9kKHRoaXMsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QodGFyZ2V0KVxuICAgKiAuZHJvcENoZWNrZXIoZnVuY3Rpb24oZHJhZ0V2ZW50LCAgICAgICAgIC8vIHJlbGF0ZWQgZHJhZ21vdmUgb3IgZHJhZ2VuZCBldmVudFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsICAgICAgICAgICAgIC8vIFRvdWNoRXZlbnQvUG9pbnRlckV2ZW50L01vdXNlRXZlbnRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsICAgICAgICAgICAvLyBib29sIHJlc3VsdCBvZiB0aGUgZGVmYXVsdCBjaGVja2VyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcm9wem9uZSwgICAgICAgICAgLy8gZHJvcHpvbmUgSW50ZXJhY3RhYmxlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcm9wRWxlbWVudCwgICAgICAgLy8gZHJvcHpvbmUgZWxlbW50XG4gICAqICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGUsICAgICAgICAgLy8gZHJhZ2dhYmxlIEludGVyYWN0YWJsZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlRWxlbWVudCkgey8vIGRyYWdnYWJsZSBlbGVtZW50XG4gICAqXG4gICAqICAgcmV0dXJuIGRyb3BwZWQgJiYgZXZlbnQudGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnYWxsb3ctZHJvcCcpXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmRyb3BDaGVjayA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIGRyYWdFdmVudCwgZXZlbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudCwgZHJvcEVsZW1lbnQsIHJlY3QpIHtcbiAgICByZXR1cm4gZHJvcENoZWNrTWV0aG9kKHRoaXMsIGRyYWdFdmVudCwgZXZlbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudCwgZHJvcEVsZW1lbnQsIHJlY3QpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHdoZXRoZXIgdGhlIGRpbWVuc2lvbnMgb2YgZHJvcHpvbmUgZWxlbWVudHMgYXJlIGNhbGN1bGF0ZWRcbiAgICogb24gZXZlcnkgZHJhZ21vdmUgb3Igb25seSBvbiBkcmFnc3RhcnQgZm9yIHRoZSBkZWZhdWx0IGRyb3BDaGVja2VyXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25ld1ZhbHVlXSBUcnVlIHRvIGNoZWNrIG9uIGVhY2ggbW92ZS4gRmFsc2UgdG8gY2hlY2sgb25seVxuICAgKiBiZWZvcmUgc3RhcnRcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IGludGVyYWN0fSBUaGUgY3VycmVudCBzZXR0aW5nIG9yIGludGVyYWN0XG4gICAqL1xuICBpbnRlcmFjdC5keW5hbWljRHJvcCA9IGZ1bmN0aW9uIChuZXdWYWx1ZT86IGJvb2xlYW4pIHtcbiAgICBpZiAodXRpbHMuaXMuYm9vbChuZXdWYWx1ZSkpIHtcbiAgICAgIC8vIGlmIChkcmFnZ2luZyAmJiBzY29wZS5keW5hbWljRHJvcCAhPT0gbmV3VmFsdWUgJiYgIW5ld1ZhbHVlKSB7XG4gICAgICAvLyAgY2FsY1JlY3RzKGRyb3B6b25lcylcbiAgICAgIC8vIH1cblxuICAgICAgc2NvcGUuZHluYW1pY0Ryb3AgPSBuZXdWYWx1ZVxuXG4gICAgICByZXR1cm4gaW50ZXJhY3RcbiAgICB9XG4gICAgcmV0dXJuIHNjb3BlLmR5bmFtaWNEcm9wXG4gIH1cblxuICB1dGlscy5leHRlbmQoYWN0aW9ucy5waGFzZWxlc3NUeXBlcywge1xuICAgIGRyYWdlbnRlcjogdHJ1ZSxcbiAgICBkcmFnbGVhdmU6IHRydWUsXG4gICAgZHJvcGFjdGl2YXRlOiB0cnVlLFxuICAgIGRyb3BkZWFjdGl2YXRlOiB0cnVlLFxuICAgIGRyb3Btb3ZlOiB0cnVlLFxuICAgIGRyb3A6IHRydWUsXG4gIH0pXG4gIGFjdGlvbnMubWV0aG9kRGljdC5kcm9wID0gJ2Ryb3B6b25lJ1xuXG4gIHNjb3BlLmR5bmFtaWNEcm9wID0gZmFsc2VcblxuICBkZWZhdWx0cy5hY3Rpb25zLmRyb3AgPSBkcm9wLmRlZmF1bHRzXG59XG5cbmZ1bmN0aW9uIGNvbGxlY3REcm9wcyAoeyBpbnRlcmFjdGFibGVzIH0sIGRyYWdnYWJsZUVsZW1lbnQpIHtcbiAgY29uc3QgZHJvcHMgPSBbXVxuXG4gIC8vIGNvbGxlY3QgYWxsIGRyb3B6b25lcyBhbmQgdGhlaXIgZWxlbWVudHMgd2hpY2ggcXVhbGlmeSBmb3IgYSBkcm9wXG4gIGZvciAoY29uc3QgZHJvcHpvbmUgb2YgaW50ZXJhY3RhYmxlcy5saXN0KSB7XG4gICAgaWYgKCFkcm9wem9uZS5vcHRpb25zLmRyb3AuZW5hYmxlZCkgeyBjb250aW51ZSB9XG5cbiAgICBjb25zdCBhY2NlcHQgPSBkcm9wem9uZS5vcHRpb25zLmRyb3AuYWNjZXB0XG5cbiAgICAvLyB0ZXN0IHRoZSBkcmFnZ2FibGUgZHJhZ2dhYmxlRWxlbWVudCBhZ2FpbnN0IHRoZSBkcm9wem9uZSdzIGFjY2VwdCBzZXR0aW5nXG4gICAgaWYgKCh1dGlscy5pcy5lbGVtZW50KGFjY2VwdCkgJiYgYWNjZXB0ICE9PSBkcmFnZ2FibGVFbGVtZW50KSB8fFxuICAgICAgICAodXRpbHMuaXMuc3RyaW5nKGFjY2VwdCkgJiZcbiAgICAgICAgIXV0aWxzLmRvbS5tYXRjaGVzU2VsZWN0b3IoZHJhZ2dhYmxlRWxlbWVudCwgYWNjZXB0KSkgfHxcbiAgICAgICAgKHV0aWxzLmlzLmZ1bmMoYWNjZXB0KSAmJiAhYWNjZXB0KHsgZHJvcHpvbmUsIGRyYWdnYWJsZUVsZW1lbnQgfSkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIHF1ZXJ5IGZvciBuZXcgZWxlbWVudHMgaWYgbmVjZXNzYXJ5XG4gICAgY29uc3QgZHJvcEVsZW1lbnRzID0gdXRpbHMuaXMuc3RyaW5nKGRyb3B6b25lLnRhcmdldClcbiAgICAgID8gZHJvcHpvbmUuX2NvbnRleHQucXVlcnlTZWxlY3RvckFsbChkcm9wem9uZS50YXJnZXQpXG4gICAgICA6IHV0aWxzLmlzLmFycmF5KGRyb3B6b25lLnRhcmdldCkgPyBkcm9wem9uZS50YXJnZXQgOiBbZHJvcHpvbmUudGFyZ2V0XVxuXG4gICAgZm9yIChjb25zdCBkcm9wem9uZUVsZW1lbnQgb2YgZHJvcEVsZW1lbnRzKSB7XG4gICAgICBpZiAoZHJvcHpvbmVFbGVtZW50ICE9PSBkcmFnZ2FibGVFbGVtZW50KSB7XG4gICAgICAgIGRyb3BzLnB1c2goe1xuICAgICAgICAgIGRyb3B6b25lLFxuICAgICAgICAgIGVsZW1lbnQ6IGRyb3B6b25lRWxlbWVudCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZHJvcHNcbn1cblxuZnVuY3Rpb24gZmlyZUFjdGl2YXRpb25FdmVudHMgKGFjdGl2ZURyb3BzLCBldmVudCkge1xuICAvLyBsb29wIHRocm91Z2ggYWxsIGFjdGl2ZSBkcm9wem9uZXMgYW5kIHRyaWdnZXIgZXZlbnRcbiAgZm9yIChjb25zdCB7IGRyb3B6b25lLCBlbGVtZW50IH0gb2YgYWN0aXZlRHJvcHMuc2xpY2UoKSkge1xuICAgIGV2ZW50LmRyb3B6b25lID0gZHJvcHpvbmVcblxuICAgIC8vIHNldCBjdXJyZW50IGVsZW1lbnQgYXMgZXZlbnQgdGFyZ2V0XG4gICAgZXZlbnQudGFyZ2V0ID0gZWxlbWVudFxuICAgIGRyb3B6b25lLmZpcmUoZXZlbnQpXG4gICAgZXZlbnQucHJvcGFnYXRpb25TdG9wcGVkID0gZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2VcbiAgfVxufVxuXG4vLyByZXR1cm4gYSBuZXcgYXJyYXkgb2YgcG9zc2libGUgZHJvcHMuIGdldEFjdGl2ZURyb3BzIHNob3VsZCBhbHdheXMgYmVcbi8vIGNhbGxlZCB3aGVuIGEgZHJhZyBoYXMganVzdCBzdGFydGVkIG9yIGEgZHJhZyBldmVudCBoYXBwZW5zIHdoaWxlXG4vLyBkeW5hbWljRHJvcCBpcyB0cnVlXG5mdW5jdGlvbiBnZXRBY3RpdmVEcm9wcyAoc2NvcGU6IFNjb3BlLCBkcmFnRWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAvLyBnZXQgZHJvcHpvbmVzIGFuZCB0aGVpciBlbGVtZW50cyB0aGF0IGNvdWxkIHJlY2VpdmUgdGhlIGRyYWdnYWJsZVxuICBjb25zdCBhY3RpdmVEcm9wcyA9IGNvbGxlY3REcm9wcyhzY29wZSwgZHJhZ0VsZW1lbnQpXG5cbiAgZm9yIChjb25zdCBhY3RpdmVEcm9wIG9mIGFjdGl2ZURyb3BzKSB7XG4gICAgYWN0aXZlRHJvcC5yZWN0ID0gYWN0aXZlRHJvcC5kcm9wem9uZS5nZXRSZWN0KGFjdGl2ZURyb3AuZWxlbWVudClcbiAgfVxuXG4gIHJldHVybiBhY3RpdmVEcm9wc1xufVxuXG5mdW5jdGlvbiBnZXREcm9wICh7IGRyb3BTdGF0ZSwgaW50ZXJhY3RhYmxlOiBkcmFnZ2FibGUsIGVsZW1lbnQ6IGRyYWdFbGVtZW50IH06IFBhcnRpYWw8SW50ZXJhY3QuSW50ZXJhY3Rpb24+LCBkcmFnRXZlbnQsIHBvaW50ZXJFdmVudCkge1xuICBjb25zdCB2YWxpZERyb3BzID0gW11cblxuICAvLyBjb2xsZWN0IGFsbCBkcm9wem9uZXMgYW5kIHRoZWlyIGVsZW1lbnRzIHdoaWNoIHF1YWxpZnkgZm9yIGEgZHJvcFxuICBmb3IgKGNvbnN0IHsgZHJvcHpvbmUsIGVsZW1lbnQ6IGRyb3B6b25lRWxlbWVudCwgcmVjdCB9IG9mIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcykge1xuICAgIHZhbGlkRHJvcHMucHVzaChkcm9wem9uZS5kcm9wQ2hlY2soZHJhZ0V2ZW50LCBwb2ludGVyRXZlbnQsIGRyYWdnYWJsZSwgZHJhZ0VsZW1lbnQsIGRyb3B6b25lRWxlbWVudCwgcmVjdClcbiAgICAgID8gZHJvcHpvbmVFbGVtZW50XG4gICAgICA6IG51bGwpXG4gIH1cblxuICAvLyBnZXQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZHJvcHpvbmUgYmFzZWQgb24gRE9NIGRlcHRoIGFuZCBvcmRlclxuICBjb25zdCBkcm9wSW5kZXggPSB1dGlscy5kb20uaW5kZXhPZkRlZXBlc3RFbGVtZW50KHZhbGlkRHJvcHMpXG5cbiAgcmV0dXJuIGRyb3BTdGF0ZS5hY3RpdmVEcm9wc1tkcm9wSW5kZXhdIHx8IG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0RHJvcEV2ZW50cyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLCBfcG9pbnRlckV2ZW50LCBkcmFnRXZlbnQpIHtcbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IGRyb3BFdmVudHMgPSB7XG4gICAgZW50ZXIgICAgIDogbnVsbCxcbiAgICBsZWF2ZSAgICAgOiBudWxsLFxuICAgIGFjdGl2YXRlICA6IG51bGwsXG4gICAgZGVhY3RpdmF0ZTogbnVsbCxcbiAgICBtb3ZlICAgICAgOiBudWxsLFxuICAgIGRyb3AgICAgICA6IG51bGwsXG4gIH1cblxuICBpZiAoZHJhZ0V2ZW50LnR5cGUgPT09ICdkcmFnc3RhcnQnKSB7XG4gICAgZHJvcEV2ZW50cy5hY3RpdmF0ZSA9IG5ldyBEcm9wRXZlbnQoZHJvcFN0YXRlLCBkcmFnRXZlbnQsICdkcm9wYWN0aXZhdGUnKVxuXG4gICAgZHJvcEV2ZW50cy5hY3RpdmF0ZS50YXJnZXQgICA9IG51bGxcbiAgICBkcm9wRXZlbnRzLmFjdGl2YXRlLmRyb3B6b25lID0gbnVsbFxuICB9XG4gIGlmIChkcmFnRXZlbnQudHlwZSA9PT0gJ2RyYWdlbmQnKSB7XG4gICAgZHJvcEV2ZW50cy5kZWFjdGl2YXRlID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIGRyYWdFdmVudCwgJ2Ryb3BkZWFjdGl2YXRlJylcblxuICAgIGRyb3BFdmVudHMuZGVhY3RpdmF0ZS50YXJnZXQgICA9IG51bGxcbiAgICBkcm9wRXZlbnRzLmRlYWN0aXZhdGUuZHJvcHpvbmUgPSBudWxsXG4gIH1cblxuICBpZiAoZHJvcFN0YXRlLnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIGRyb3BFdmVudHNcbiAgfVxuXG4gIGlmIChkcm9wU3RhdGUuY3VyLmVsZW1lbnQgIT09IGRyb3BTdGF0ZS5wcmV2LmVsZW1lbnQpIHtcbiAgICAvLyBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBkcm9wem9uZSwgY3JlYXRlIGEgZHJhZ2xlYXZlIGV2ZW50XG4gICAgaWYgKGRyb3BTdGF0ZS5wcmV2LmRyb3B6b25lKSB7XG4gICAgICBkcm9wRXZlbnRzLmxlYXZlID0gbmV3IERyb3BFdmVudChkcm9wU3RhdGUsIGRyYWdFdmVudCwgJ2RyYWdsZWF2ZScpXG5cbiAgICAgIGRyYWdFdmVudC5kcmFnTGVhdmUgICAgPSBkcm9wRXZlbnRzLmxlYXZlLnRhcmdldCAgID0gZHJvcFN0YXRlLnByZXYuZWxlbWVudFxuICAgICAgZHJhZ0V2ZW50LnByZXZEcm9wem9uZSA9IGRyb3BFdmVudHMubGVhdmUuZHJvcHpvbmUgPSBkcm9wU3RhdGUucHJldi5kcm9wem9uZVxuICAgIH1cbiAgICAvLyBpZiBkcm9wem9uZSBpcyBub3QgbnVsbCwgY3JlYXRlIGEgZHJhZ2VudGVyIGV2ZW50XG4gICAgaWYgKGRyb3BTdGF0ZS5jdXIuZHJvcHpvbmUpIHtcbiAgICAgIGRyb3BFdmVudHMuZW50ZXIgPSBuZXcgRHJvcEV2ZW50KGRyb3BTdGF0ZSwgZHJhZ0V2ZW50LCAnZHJhZ2VudGVyJylcblxuICAgICAgZHJhZ0V2ZW50LmRyYWdFbnRlciA9IGRyb3BTdGF0ZS5jdXIuZWxlbWVudFxuICAgICAgZHJhZ0V2ZW50LmRyb3B6b25lID0gZHJvcFN0YXRlLmN1ci5kcm9wem9uZVxuICAgIH1cbiAgfVxuXG4gIGlmIChkcmFnRXZlbnQudHlwZSA9PT0gJ2RyYWdlbmQnICYmIGRyb3BTdGF0ZS5jdXIuZHJvcHpvbmUpIHtcbiAgICBkcm9wRXZlbnRzLmRyb3AgPSBuZXcgRHJvcEV2ZW50KGRyb3BTdGF0ZSwgZHJhZ0V2ZW50LCAnZHJvcCcpXG5cbiAgICBkcmFnRXZlbnQuZHJvcHpvbmUgPSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lXG4gICAgZHJhZ0V2ZW50LnJlbGF0ZWRUYXJnZXQgPSBkcm9wU3RhdGUuY3VyLmVsZW1lbnRcbiAgfVxuICBpZiAoZHJhZ0V2ZW50LnR5cGUgPT09ICdkcmFnbW92ZScgJiYgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSkge1xuICAgIGRyb3BFdmVudHMubW92ZSA9IG5ldyBEcm9wRXZlbnQoZHJvcFN0YXRlLCBkcmFnRXZlbnQsICdkcm9wbW92ZScpXG5cbiAgICBkcm9wRXZlbnRzLm1vdmUuZHJhZ21vdmUgPSBkcmFnRXZlbnRcbiAgICBkcmFnRXZlbnQuZHJvcHpvbmUgPSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lXG4gIH1cblxuICByZXR1cm4gZHJvcEV2ZW50c1xufVxuXG5mdW5jdGlvbiBmaXJlRHJvcEV2ZW50cyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLCBldmVudHMpIHtcbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IHtcbiAgICBhY3RpdmVEcm9wcyxcbiAgICBjdXIsXG4gICAgcHJldixcbiAgfSA9IGRyb3BTdGF0ZVxuXG4gIGlmIChldmVudHMubGVhdmUpIHsgcHJldi5kcm9wem9uZS5maXJlKGV2ZW50cy5sZWF2ZSkgfVxuICBpZiAoZXZlbnRzLm1vdmUpIHsgY3VyLmRyb3B6b25lLmZpcmUoZXZlbnRzLm1vdmUpIH1cbiAgaWYgKGV2ZW50cy5lbnRlcikgeyBjdXIuZHJvcHpvbmUuZmlyZShldmVudHMuZW50ZXIpIH1cbiAgaWYgKGV2ZW50cy5kcm9wKSB7IGN1ci5kcm9wem9uZS5maXJlKGV2ZW50cy5kcm9wKSB9XG5cbiAgaWYgKGV2ZW50cy5kZWFjdGl2YXRlKSB7XG4gICAgZmlyZUFjdGl2YXRpb25FdmVudHMoYWN0aXZlRHJvcHMsIGV2ZW50cy5kZWFjdGl2YXRlKVxuICB9XG5cbiAgZHJvcFN0YXRlLnByZXYuZHJvcHpvbmUgID0gY3VyLmRyb3B6b25lXG4gIGRyb3BTdGF0ZS5wcmV2LmVsZW1lbnQgPSBjdXIuZWxlbWVudFxufVxuXG5mdW5jdGlvbiBvbkV2ZW50Q3JlYXRlZCAoeyBpbnRlcmFjdGlvbiwgaUV2ZW50LCBldmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSB7XG4gIGlmIChpRXZlbnQudHlwZSAhPT0gJ2RyYWdtb3ZlJyAmJiBpRXZlbnQudHlwZSAhPT0gJ2RyYWdlbmQnKSB7IHJldHVybiB9XG5cbiAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG5cbiAgaWYgKHNjb3BlLmR5bmFtaWNEcm9wKSB7XG4gICAgZHJvcFN0YXRlLmFjdGl2ZURyb3BzID0gZ2V0QWN0aXZlRHJvcHMoc2NvcGUsIGludGVyYWN0aW9uLmVsZW1lbnQpXG4gIH1cblxuICBjb25zdCBkcmFnRXZlbnQgPSBpRXZlbnRcbiAgY29uc3QgZHJvcFJlc3VsdCA9IGdldERyb3AoaW50ZXJhY3Rpb24sIGRyYWdFdmVudCwgZXZlbnQpXG5cbiAgLy8gdXBkYXRlIHJlamVjdGVkIHN0YXR1c1xuICBkcm9wU3RhdGUucmVqZWN0ZWQgPSBkcm9wU3RhdGUucmVqZWN0ZWQgJiZcbiAgICAhIWRyb3BSZXN1bHQgJiZcbiAgICBkcm9wUmVzdWx0LmRyb3B6b25lID09PSBkcm9wU3RhdGUuY3VyLmRyb3B6b25lICYmXG4gICAgZHJvcFJlc3VsdC5lbGVtZW50ID09PSBkcm9wU3RhdGUuY3VyLmVsZW1lbnRcblxuICBkcm9wU3RhdGUuY3VyLmRyb3B6b25lICA9IGRyb3BSZXN1bHQgJiYgZHJvcFJlc3VsdC5kcm9wem9uZVxuICBkcm9wU3RhdGUuY3VyLmVsZW1lbnQgPSBkcm9wUmVzdWx0ICYmIGRyb3BSZXN1bHQuZWxlbWVudFxuXG4gIGRyb3BTdGF0ZS5ldmVudHMgPSBnZXREcm9wRXZlbnRzKGludGVyYWN0aW9uLCBldmVudCwgZHJhZ0V2ZW50KVxufVxuXG5mdW5jdGlvbiBkcm9wem9uZU1ldGhvZCAoaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUpOiBJbnRlcmFjdC5Ecm9wem9uZU9wdGlvbnNcbmZ1bmN0aW9uIGRyb3B6b25lTWV0aG9kIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9uczogSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zIHwgYm9vbGVhbilcbmZ1bmN0aW9uIGRyb3B6b25lTWV0aG9kIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9ucz86IEludGVyYWN0LkRyb3B6b25lT3B0aW9ucyB8IGJvb2xlYW4pIHtcbiAgaWYgKHV0aWxzLmlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3AuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcblxuICAgIGlmIChvcHRpb25zLmxpc3RlbmVycykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHV0aWxzLm5vcm1hbGl6ZUxpc3RlbmVycyhvcHRpb25zLmxpc3RlbmVycylcbiAgICAgIC8vIHJlbmFtZSAnZHJvcCcgdG8gJycgYXMgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoICdkcm9wJ1xuICAgICAgY29uc3QgY29ycmVjdGVkID0gT2JqZWN0LmtleXMobm9ybWFsaXplZCkucmVkdWNlKChhY2MsIHR5cGUpID0+IHtcbiAgICAgICAgY29uc3QgY29ycmVjdGVkVHlwZSA9IC9eKGVudGVyfGxlYXZlKS8udGVzdCh0eXBlKVxuICAgICAgICAgID8gYGRyYWcke3R5cGV9YFxuICAgICAgICAgIDogL14oYWN0aXZhdGV8ZGVhY3RpdmF0ZXxtb3ZlKS8udGVzdCh0eXBlKVxuICAgICAgICAgICAgPyBgZHJvcCR7dHlwZX1gXG4gICAgICAgICAgICA6IHR5cGVcblxuICAgICAgICBhY2NbY29ycmVjdGVkVHlwZV0gPSBub3JtYWxpemVkW3R5cGVdXG5cbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfSwge30pXG5cbiAgICAgIGludGVyYWN0YWJsZS5vZmYoaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5saXN0ZW5lcnMpXG4gICAgICBpbnRlcmFjdGFibGUub24oY29ycmVjdGVkKVxuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5saXN0ZW5lcnMgPSBjb3JyZWN0ZWRcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcCkpIHsgaW50ZXJhY3RhYmxlLm9uKCdkcm9wJywgb3B0aW9ucy5vbmRyb3ApIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcGFjdGl2YXRlKSkgeyBpbnRlcmFjdGFibGUub24oJ2Ryb3BhY3RpdmF0ZScsIG9wdGlvbnMub25kcm9wYWN0aXZhdGUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcGRlYWN0aXZhdGUpKSB7IGludGVyYWN0YWJsZS5vbignZHJvcGRlYWN0aXZhdGUnLCBvcHRpb25zLm9uZHJvcGRlYWN0aXZhdGUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJhZ2VudGVyKSkgeyBpbnRlcmFjdGFibGUub24oJ2RyYWdlbnRlcicsIG9wdGlvbnMub25kcmFnZW50ZXIpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJhZ2xlYXZlKSkgeyBpbnRlcmFjdGFibGUub24oJ2RyYWdsZWF2ZScsIG9wdGlvbnMub25kcmFnbGVhdmUpIH1cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhvcHRpb25zLm9uZHJvcG1vdmUpKSB7IGludGVyYWN0YWJsZS5vbignZHJvcG1vdmUnLCBvcHRpb25zLm9uZHJvcG1vdmUpIH1cblxuICAgIGlmICgvXihwb2ludGVyfGNlbnRlcikkLy50ZXN0KG9wdGlvbnMub3ZlcmxhcCBhcyBzdHJpbmcpKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLm92ZXJsYXAgPSBvcHRpb25zLm92ZXJsYXBcbiAgICB9XG4gICAgZWxzZSBpZiAodXRpbHMuaXMubnVtYmVyKG9wdGlvbnMub3ZlcmxhcCkpIHtcbiAgICAgIGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3Aub3ZlcmxhcCA9IE1hdGgubWF4KE1hdGgubWluKDEsIG9wdGlvbnMub3ZlcmxhcCksIDApXG4gICAgfVxuICAgIGlmICgnYWNjZXB0JyBpbiBvcHRpb25zKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmFjY2VwdCA9IG9wdGlvbnMuYWNjZXB0XG4gICAgfVxuICAgIGlmICgnY2hlY2tlcicgaW4gb3B0aW9ucykge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyID0gb3B0aW9ucy5jaGVja2VyXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG5cbiAgaWYgKHV0aWxzLmlzLmJvb2wob3B0aW9ucykpIHtcbiAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gaW50ZXJhY3RhYmxlXG4gIH1cblxuICByZXR1cm4gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcFxufVxuXG5mdW5jdGlvbiBkcm9wQ2hlY2tNZXRob2QgKFxuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgZHJhZ0V2ZW50OiBJbnRlcmFjdEV2ZW50LFxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgZHJhZ2dhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsXG4gIGRyYWdnYWJsZUVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsXG4gIGRyb3BFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICByZWN0OiBhbnksXG4pIHtcbiAgbGV0IGRyb3BwZWQgPSBmYWxzZVxuXG4gIC8vIGlmIHRoZSBkcm9wem9uZSBoYXMgbm8gcmVjdCAoZWcuIGRpc3BsYXk6IG5vbmUpXG4gIC8vIGNhbGwgdGhlIGN1c3RvbSBkcm9wQ2hlY2tlciBvciBqdXN0IHJldHVybiBmYWxzZVxuICBpZiAoIShyZWN0ID0gcmVjdCB8fCBpbnRlcmFjdGFibGUuZ2V0UmVjdChkcm9wRWxlbWVudCkpKSB7XG4gICAgcmV0dXJuIChpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmNoZWNrZXJcbiAgICAgID8gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyKGRyYWdFdmVudCwgZXZlbnQsIGRyb3BwZWQsIGludGVyYWN0YWJsZSwgZHJvcEVsZW1lbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudClcbiAgICAgIDogZmFsc2UpXG4gIH1cblxuICBjb25zdCBkcm9wT3ZlcmxhcCA9IGludGVyYWN0YWJsZS5vcHRpb25zLmRyb3Aub3ZlcmxhcFxuXG4gIGlmIChkcm9wT3ZlcmxhcCA9PT0gJ3BvaW50ZXInKSB7XG4gICAgY29uc3Qgb3JpZ2luID0gdXRpbHMuZ2V0T3JpZ2luWFkoZHJhZ2dhYmxlLCBkcmFnZ2FibGVFbGVtZW50LCAnZHJhZycpXG4gICAgY29uc3QgcGFnZSA9IHV0aWxzLnBvaW50ZXIuZ2V0UGFnZVhZKGRyYWdFdmVudClcblxuICAgIHBhZ2UueCArPSBvcmlnaW4ueFxuICAgIHBhZ2UueSArPSBvcmlnaW4ueVxuXG4gICAgY29uc3QgaG9yaXpvbnRhbCA9IChwYWdlLnggPiByZWN0LmxlZnQpICYmIChwYWdlLnggPCByZWN0LnJpZ2h0KVxuICAgIGNvbnN0IHZlcnRpY2FsICAgPSAocGFnZS55ID4gcmVjdC50b3ApICYmIChwYWdlLnkgPCByZWN0LmJvdHRvbSlcblxuICAgIGRyb3BwZWQgPSBob3Jpem9udGFsICYmIHZlcnRpY2FsXG4gIH1cblxuICBjb25zdCBkcmFnUmVjdCA9IGRyYWdnYWJsZS5nZXRSZWN0KGRyYWdnYWJsZUVsZW1lbnQpXG5cbiAgaWYgKGRyYWdSZWN0ICYmIGRyb3BPdmVybGFwID09PSAnY2VudGVyJykge1xuICAgIGNvbnN0IGN4ID0gZHJhZ1JlY3QubGVmdCArIGRyYWdSZWN0LndpZHRoICAvIDJcbiAgICBjb25zdCBjeSA9IGRyYWdSZWN0LnRvcCAgKyBkcmFnUmVjdC5oZWlnaHQgLyAyXG5cbiAgICBkcm9wcGVkID0gY3ggPj0gcmVjdC5sZWZ0ICYmIGN4IDw9IHJlY3QucmlnaHQgJiYgY3kgPj0gcmVjdC50b3AgJiYgY3kgPD0gcmVjdC5ib3R0b21cbiAgfVxuXG4gIGlmIChkcmFnUmVjdCAmJiB1dGlscy5pcy5udW1iZXIoZHJvcE92ZXJsYXApKSB7XG4gICAgY29uc3Qgb3ZlcmxhcEFyZWEgID0gKE1hdGgubWF4KDAsIE1hdGgubWluKHJlY3QucmlnaHQsIGRyYWdSZWN0LnJpZ2h0KSAtIE1hdGgubWF4KHJlY3QubGVmdCwgZHJhZ1JlY3QubGVmdCkpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgTWF0aC5taW4ocmVjdC5ib3R0b20sIGRyYWdSZWN0LmJvdHRvbSkgLSBNYXRoLm1heChyZWN0LnRvcCwgZHJhZ1JlY3QudG9wKSkpXG5cbiAgICBjb25zdCBvdmVybGFwUmF0aW8gPSBvdmVybGFwQXJlYSAvIChkcmFnUmVjdC53aWR0aCAqIGRyYWdSZWN0LmhlaWdodClcblxuICAgIGRyb3BwZWQgPSBvdmVybGFwUmF0aW8gPj0gZHJvcE92ZXJsYXBcbiAgfVxuXG4gIGlmIChpbnRlcmFjdGFibGUub3B0aW9ucy5kcm9wLmNoZWNrZXIpIHtcbiAgICBkcm9wcGVkID0gaW50ZXJhY3RhYmxlLm9wdGlvbnMuZHJvcC5jaGVja2VyKGRyYWdFdmVudCwgZXZlbnQsIGRyb3BwZWQsIGludGVyYWN0YWJsZSwgZHJvcEVsZW1lbnQsIGRyYWdnYWJsZSwgZHJhZ2dhYmxlRWxlbWVudClcbiAgfVxuXG4gIHJldHVybiBkcm9wcGVkXG59XG5cbmNvbnN0IGRyb3A6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhY3Rpb25zL2Ryb3AnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tc3RhcnQnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGludGVyYWN0aW9uLmRyb3BTdGF0ZSA9IHtcbiAgICAgICAgY3VyOiB7XG4gICAgICAgICAgZHJvcHpvbmU6IG51bGwsXG4gICAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJldjoge1xuICAgICAgICAgIGRyb3B6b25lOiBudWxsLFxuICAgICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdGVkOiBudWxsLFxuICAgICAgICBldmVudHM6IG51bGwsXG4gICAgICAgIGFjdGl2ZURyb3BzOiBbXSxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tc3RhcnQnOiAoeyBpbnRlcmFjdGlvbiwgZXZlbnQsIGlFdmVudDogZHJhZ0V2ZW50IH06IEludGVyYWN0LkRvUGhhc2VBcmc8J2RyYWcnLCBJbnRlcmFjdC5FdmVudFBoYXNlPiwgc2NvcGUpID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICAgICAgY29uc3QgeyBkcm9wU3RhdGUgfSA9IGludGVyYWN0aW9uXG5cbiAgICAgIC8vIHJlc2V0IGFjdGl2ZSBkcm9wem9uZXNcbiAgICAgIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcyA9IG51bGxcbiAgICAgIGRyb3BTdGF0ZS5ldmVudHMgPSBudWxsXG4gICAgICBkcm9wU3RhdGUuYWN0aXZlRHJvcHMgPSBnZXRBY3RpdmVEcm9wcyhzY29wZSwgaW50ZXJhY3Rpb24uZWxlbWVudClcbiAgICAgIGRyb3BTdGF0ZS5ldmVudHMgPSBnZXREcm9wRXZlbnRzKGludGVyYWN0aW9uLCBldmVudCwgZHJhZ0V2ZW50KVxuXG4gICAgICBpZiAoZHJvcFN0YXRlLmV2ZW50cy5hY3RpdmF0ZSkge1xuICAgICAgICBmaXJlQWN0aXZhdGlvbkV2ZW50cyhkcm9wU3RhdGUuYWN0aXZlRHJvcHMsIGRyb3BTdGF0ZS5ldmVudHMuYWN0aXZhdGUpXG4gICAgICAgIHNjb3BlLmZpcmUoJ2FjdGlvbnMvZHJvcDpzdGFydCcsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBGSVhNRSBwcm9wZXIgc2lnbmFsIHR5cGVzXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IG9uRXZlbnRDcmVhdGVkLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLWVuZCc6IG9uRXZlbnRDcmVhdGVkLFxuXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IGZ1bmN0aW9uIGZpcmVEcm9wQWZ0ZXJNb3ZlICh7IGludGVyYWN0aW9uLCBpRXZlbnQ6IGRyYWdFdmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGZpcmVEcm9wRXZlbnRzKGludGVyYWN0aW9uLCBpbnRlcmFjdGlvbi5kcm9wU3RhdGUuZXZlbnRzKVxuXG4gICAgICBzY29wZS5maXJlKCdhY3Rpb25zL2Ryb3A6bW92ZScsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgICAgaW50ZXJhY3Rpb24uZHJvcFN0YXRlLmV2ZW50cyA9IHt9XG4gICAgfSxcblxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLWVuZCc6ICh7IGludGVyYWN0aW9uLCBpRXZlbnQ6IGRyYWdFdmVudCB9OiBJbnRlcmFjdC5Eb1BoYXNlQXJnPCdkcmFnJywgSW50ZXJhY3QuRXZlbnRQaGFzZT4sIHNjb3BlKSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGZpcmVEcm9wRXZlbnRzKGludGVyYWN0aW9uLCBpbnRlcmFjdGlvbi5kcm9wU3RhdGUuZXZlbnRzKVxuICAgICAgc2NvcGUuZmlyZSgnYWN0aW9ucy9kcm9wOmVuZCcsIHsgaW50ZXJhY3Rpb24sIGRyYWdFdmVudCB9KVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOnN0b3AnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ2RyYWcnKSB7IHJldHVybiB9XG5cbiAgICAgIGNvbnN0IHsgZHJvcFN0YXRlIH0gPSBpbnRlcmFjdGlvblxuXG4gICAgICBpZiAoZHJvcFN0YXRlKSB7XG4gICAgICAgIGRyb3BTdGF0ZS5hY3RpdmVEcm9wcyA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmV2ZW50cyA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5kcm9wem9uZSA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLmN1ci5lbGVtZW50ID0gbnVsbFxuICAgICAgICBkcm9wU3RhdGUucHJldi5kcm9wem9uZSA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLnByZXYuZWxlbWVudCA9IG51bGxcbiAgICAgICAgZHJvcFN0YXRlLnJlamVjdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBnZXRBY3RpdmVEcm9wcyxcbiAgZ2V0RHJvcCxcbiAgZ2V0RHJvcEV2ZW50cyxcbiAgZmlyZURyb3BFdmVudHMsXG4gIGRlZmF1bHRzOiB7XG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgYWNjZXB0IDogbnVsbCxcbiAgICBvdmVybGFwOiAncG9pbnRlcicsXG4gIH0gYXMgSW50ZXJhY3QuRHJvcHpvbmVPcHRpb25zLFxufVxuXG5leHBvcnQgZGVmYXVsdCBkcm9wXG4iLCJpbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcblxuZXhwb3J0IHR5cGUgR2VzdHVyYWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9ucz5cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBnZXN0dXJlPzoge1xuICAgICAgYW5nbGU6IG51bWJlciAgICAgICAgICAgLy8gYW5nbGUgZnJvbSBmaXJzdCB0byBzZWNvbmQgdG91Y2hcbiAgICAgIGRpc3RhbmNlOiBudW1iZXJcbiAgICAgIHNjYWxlOiBudW1iZXIgICAgICAgICAgIC8vIGdlc3R1cmUuZGlzdGFuY2UgLyBnZXN0dXJlLnN0YXJ0RGlzdGFuY2VcbiAgICAgIHN0YXJ0QW5nbGU6IG51bWJlciAgICAgIC8vIGFuZ2xlIG9mIGxpbmUgam9pbmluZyB0d28gdG91Y2hlc1xuICAgICAgc3RhcnREaXN0YW5jZTogbnVtYmVyICAgLy8gZGlzdGFuY2UgYmV0d2VlbiB0d28gdG91Y2hlcyBvZiB0b3VjaFN0YXJ0XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBnZXN0dXJhYmxlOiBHZXN0dXJhYmxlTWV0aG9kXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEFjdGlvbkRlZmF1bHRzIHtcbiAgICBnZXN0dXJlOiBJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9uc1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBBY3Rpb25NYXAge1xuICAgIGdlc3R1cmU/OiB0eXBlb2YgZ2VzdHVyZVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VzdHVyZUV2ZW50IGV4dGVuZHMgSW50ZXJhY3QuSW50ZXJhY3RFdmVudDwnZ2VzdHVyZSc+IHtcbiAgZGlzdGFuY2U6IG51bWJlclxuICBhbmdsZTogbnVtYmVyXG4gIGRhOiBudW1iZXIgLy8gYW5nbGUgY2hhbmdlXG4gIHNjYWxlOiBudW1iZXIgLy8gcmF0aW8gb2YgZGlzdGFuY2Ugc3RhcnQgdG8gY3VycmVudCBldmVudFxuICBkczogbnVtYmVyIC8vIHNjYWxlIGNoYW5nZVxuICBib3g6IEludGVyYWN0LlJlY3QgLy8gZW5jbG9zaW5nIGJveCBvZiBhbGwgcG9pbnRzXG4gIHRvdWNoZXM6IEludGVyYWN0LlBvaW50ZXJUeXBlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlU2lnbmFsQXJnIGV4dGVuZHMgSW50ZXJhY3QuRG9QaGFzZUFyZzwnZ2VzdHVyZScsIEludGVyYWN0LkV2ZW50UGhhc2U+IHtcbiAgaUV2ZW50OiBHZXN0dXJlRXZlbnRcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uPCdnZXN0dXJlJz5cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBhY3Rpb25zLFxuICAgIEludGVyYWN0YWJsZSxcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGludGVyYWN0KGVsZW1lbnQpLmdlc3R1cmFibGUoe1xuICAgKiAgICAgb25zdGFydDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAgICogICAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gICAqICAgICBvbmVuZCAgOiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICAgKlxuICAgKiAgICAgLy8gbGltaXQgbXVsdGlwbGUgZ2VzdHVyZXMuXG4gICAqICAgICAvLyBTZWUgdGhlIGV4cGxhbmF0aW9uIGluIHtAbGluayBJbnRlcmFjdGFibGUuZHJhZ2dhYmxlfSBleGFtcGxlXG4gICAqICAgICBtYXg6IEluZmluaXR5LFxuICAgKiAgICAgbWF4UGVyRWxlbWVudDogMSxcbiAgICogfSlcbiAgICpcbiAgICogdmFyIGlzR2VzdHVyZWFibGUgPSBpbnRlcmFjdChlbGVtZW50KS5nZXN0dXJhYmxlKClcbiAgICogYGBgXG4gICAqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIG11bHRpdG91Y2ggZ2VzdHVyZXMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAgICogbGlzdGVuZXJzIHRvIGJlIGZpcmVkIG9uIGdlc3R1cmUgZXZlbnRzIChtYWtlcyB0aGUgSW50ZXJhY3RhYmxlIGdlc3R1cmFibGUpXG4gICAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgY2FuIGJlIHRoZVxuICAgKiB0YXJnZXQgb2YgZ2VzdHVyZSBldmVudHMsIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmdlc3R1cmFibGUgPSBmdW5jdGlvbiAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zOiBJbnRlcmFjdC5HZXN0dXJhYmxlT3B0aW9ucyB8IGJvb2xlYW4pIHtcbiAgICBpZiAodXRpbHMuaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZ2VzdHVyZS5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZVxuICAgICAgdGhpcy5zZXRQZXJBY3Rpb24oJ2dlc3R1cmUnLCBvcHRpb25zKVxuICAgICAgdGhpcy5zZXRPbkV2ZW50cygnZ2VzdHVyZScsIG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzLmJvb2wob3B0aW9ucykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5nZXN0dXJlLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXN0dXJlIGFzIEludGVyYWN0Lk9wdGlvbnNcbiAgfSBhcyBHZXN0dXJhYmxlTWV0aG9kXG5cbiAgYWN0aW9ucy5tYXAuZ2VzdHVyZSA9IGdlc3R1cmVcbiAgYWN0aW9ucy5tZXRob2REaWN0Lmdlc3R1cmUgPSAnZ2VzdHVyYWJsZSdcblxuICBkZWZhdWx0cy5hY3Rpb25zLmdlc3R1cmUgPSBnZXN0dXJlLmRlZmF1bHRzXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUdlc3R1cmVQcm9wcyAoeyBpbnRlcmFjdGlvbiwgaUV2ZW50LCBwaGFzZSB9OiBHZXN0dXJlU2lnbmFsQXJnKSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZ2VzdHVyZScpIHsgcmV0dXJuIH1cblxuICBjb25zdCBwb2ludGVycyA9IGludGVyYWN0aW9uLnBvaW50ZXJzLm1hcChwID0+IHAucG9pbnRlcilcbiAgY29uc3Qgc3RhcnRpbmcgPSBwaGFzZSA9PT0gJ3N0YXJ0J1xuICBjb25zdCBlbmRpbmcgPSBwaGFzZSA9PT0gJ2VuZCdcbiAgY29uc3QgZGVsdGFTb3VyY2UgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5kZWx0YVNvdXJjZVxuXG4gIGlFdmVudC50b3VjaGVzID0gW3BvaW50ZXJzWzBdLCBwb2ludGVyc1sxXV1cblxuICBpZiAoc3RhcnRpbmcpIHtcbiAgICBpRXZlbnQuZGlzdGFuY2UgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2UocG9pbnRlcnMsIGRlbHRhU291cmNlKVxuICAgIGlFdmVudC5ib3ggICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94KHBvaW50ZXJzKVxuICAgIGlFdmVudC5zY2FsZSAgICA9IDFcbiAgICBpRXZlbnQuZHMgICAgICAgPSAwXG4gICAgaUV2ZW50LmFuZ2xlICAgID0gdXRpbHMucG9pbnRlci50b3VjaEFuZ2xlKHBvaW50ZXJzLCBkZWx0YVNvdXJjZSlcbiAgICBpRXZlbnQuZGEgICAgICAgPSAwXG5cbiAgICBpbnRlcmFjdGlvbi5nZXN0dXJlLnN0YXJ0RGlzdGFuY2UgPSBpRXZlbnQuZGlzdGFuY2VcbiAgICBpbnRlcmFjdGlvbi5nZXN0dXJlLnN0YXJ0QW5nbGUgPSBpRXZlbnQuYW5nbGVcbiAgfVxuICBlbHNlIGlmIChlbmRpbmcpIHtcbiAgICBjb25zdCBwcmV2RXZlbnQgPSBpbnRlcmFjdGlvbi5wcmV2RXZlbnQgYXMgR2VzdHVyZUV2ZW50XG5cbiAgICBpRXZlbnQuZGlzdGFuY2UgPSBwcmV2RXZlbnQuZGlzdGFuY2VcbiAgICBpRXZlbnQuYm94ICAgICAgPSBwcmV2RXZlbnQuYm94XG4gICAgaUV2ZW50LnNjYWxlICAgID0gcHJldkV2ZW50LnNjYWxlXG4gICAgaUV2ZW50LmRzICAgICAgID0gMFxuICAgIGlFdmVudC5hbmdsZSAgICA9IHByZXZFdmVudC5hbmdsZVxuICAgIGlFdmVudC5kYSAgICAgICA9IDBcbiAgfVxuICBlbHNlIHtcbiAgICBpRXZlbnQuZGlzdGFuY2UgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2UocG9pbnRlcnMsIGRlbHRhU291cmNlKVxuICAgIGlFdmVudC5ib3ggICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94KHBvaW50ZXJzKVxuICAgIGlFdmVudC5zY2FsZSAgICA9IGlFdmVudC5kaXN0YW5jZSAvIGludGVyYWN0aW9uLmdlc3R1cmUuc3RhcnREaXN0YW5jZVxuICAgIGlFdmVudC5hbmdsZSAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hBbmdsZShwb2ludGVycywgZGVsdGFTb3VyY2UpXG5cbiAgICBpRXZlbnQuZHMgPSBpRXZlbnQuc2NhbGUgLSBpbnRlcmFjdGlvbi5nZXN0dXJlLnNjYWxlXG4gICAgaUV2ZW50LmRhID0gaUV2ZW50LmFuZ2xlIC0gaW50ZXJhY3Rpb24uZ2VzdHVyZS5hbmdsZVxuICB9XG5cbiAgaW50ZXJhY3Rpb24uZ2VzdHVyZS5kaXN0YW5jZSA9IGlFdmVudC5kaXN0YW5jZVxuICBpbnRlcmFjdGlvbi5nZXN0dXJlLmFuZ2xlID0gaUV2ZW50LmFuZ2xlXG5cbiAgaWYgKHV0aWxzLmlzLm51bWJlcihpRXZlbnQuc2NhbGUpICYmXG4gICAgICBpRXZlbnQuc2NhbGUgIT09IEluZmluaXR5ICYmXG4gICAgICAhaXNOYU4oaUV2ZW50LnNjYWxlKSkge1xuICAgIGludGVyYWN0aW9uLmdlc3R1cmUuc2NhbGUgPSBpRXZlbnQuc2NhbGVcbiAgfVxufVxuXG5jb25zdCBnZXN0dXJlOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYWN0aW9ucy9nZXN0dXJlJyxcbiAgYmVmb3JlOiBbJ2FjdGlvbnMvZHJhZycsICdhY3Rpb25zL3Jlc2l6ZSddLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1zdGFydCc6IHVwZGF0ZUdlc3R1cmVQcm9wcyxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1tb3ZlJzogdXBkYXRlR2VzdHVyZVByb3BzLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLWVuZCc6IHVwZGF0ZUdlc3R1cmVQcm9wcyxcblxuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogKHsgaW50ZXJhY3Rpb24gfSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24uZ2VzdHVyZSA9IHtcbiAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgc3RhcnRBbmdsZTogMCxcbiAgICAgICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBhcmcgPT4ge1xuICAgICAgaWYgKGFyZy5pbnRlcmFjdGlvbi5wb2ludGVycy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2VzdHVyZU9wdGlvbnMgPSBhcmcuaW50ZXJhY3RhYmxlLm9wdGlvbnMuZ2VzdHVyZVxuXG4gICAgICBpZiAoIShnZXN0dXJlT3B0aW9ucyAmJiBnZXN0dXJlT3B0aW9ucy5lbmFibGVkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGFyZy5hY3Rpb24gPSB7IG5hbWU6ICdnZXN0dXJlJyB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgfSxcblxuICBnZXRDdXJzb3IgKCkge1xuICAgIHJldHVybiAnJ1xuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBnZXN0dXJlXG4iLCJpbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyBkb20gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZG9tVXRpbHMnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuXG5leHBvcnQgdHlwZSBFZGdlTmFtZSA9ICd0b3AnIHwgJ2xlZnQnIHwgJ2JvdHRvbScgfCAncmlnaHQnXG5cbmV4cG9ydCB0eXBlIFJlc2l6YWJsZU1ldGhvZCA9IEludGVyYWN0LkFjdGlvbk1ldGhvZDxJbnRlcmFjdC5SZXNpemFibGVPcHRpb25zPlxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0YWJsZSB7XG4gICAgcmVzaXphYmxlOiBSZXNpemFibGVNZXRob2RcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIHJlc2l6ZUF4ZXM6ICd4JyB8ICd5JyB8ICd4eSdcbiAgICByZXNpemVTdGFydEFzcGVjdFJhdGlvOiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xuICAgIHJlc2l6ZTogSW50ZXJhY3QuUmVzaXphYmxlT3B0aW9uc1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBBY3Rpb25NYXAge1xuICAgIHJlc2l6ZT86IHR5cGVvZiByZXNpemVcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2l6ZUV2ZW50PFAgZXh0ZW5kcyBJbnRlcmFjdC5FdmVudFBoYXNlID0gSW50ZXJhY3QuRXZlbnRQaGFzZT4gZXh0ZW5kcyBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PCdyZXNpemUnLCBQPiB7XG4gIGRlbHRhUmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGVkZ2VzPzogSW50ZXJhY3QuQWN0aW9uUHJvcHNbJ2VkZ2VzJ11cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IFNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBhY3Rpb25zLFxuICAgIGJyb3dzZXIsXG4gICAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgICBJbnRlcmFjdGFibGUsIC8vIHRzbGludDpkaXNhYmxlLWxpbmUgbm8tc2hhZG93ZWQtdmFyaWFibGVcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgLy8gTGVzcyBQcmVjaXNpb24gd2l0aCB0b3VjaCBpbnB1dFxuXG4gIHJlc2l6ZS5jdXJzb3JzID0gaW5pdEN1cnNvcnMoYnJvd3NlcilcbiAgcmVzaXplLmRlZmF1bHRNYXJnaW4gPSBicm93c2VyLnN1cHBvcnRzVG91Y2ggfHwgYnJvd3Nlci5zdXBwb3J0c1BvaW50ZXJFdmVudCA/IDIwIDogMTBcblxuICAvKipcbiAgICogYGBganNcbiAgICogaW50ZXJhY3QoZWxlbWVudCkucmVzaXphYmxlKHtcbiAgICogICBvbnN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpIHt9LFxuICAgKiAgIG9ubW92ZSA6IGZ1bmN0aW9uIChldmVudCkge30sXG4gICAqICAgb25lbmQgIDogZnVuY3Rpb24gKGV2ZW50KSB7fSxcbiAgICpcbiAgICogICBlZGdlczoge1xuICAgKiAgICAgdG9wICAgOiB0cnVlLCAgICAgICAvLyBVc2UgcG9pbnRlciBjb29yZHMgdG8gY2hlY2sgZm9yIHJlc2l6ZS5cbiAgICogICAgIGxlZnQgIDogZmFsc2UsICAgICAgLy8gRGlzYWJsZSByZXNpemluZyBmcm9tIGxlZnQgZWRnZS5cbiAgICogICAgIGJvdHRvbTogJy5yZXNpemUtcycsLy8gUmVzaXplIGlmIHBvaW50ZXIgdGFyZ2V0IG1hdGNoZXMgc2VsZWN0b3JcbiAgICogICAgIHJpZ2h0IDogaGFuZGxlRWwgICAgLy8gUmVzaXplIGlmIHBvaW50ZXIgdGFyZ2V0IGlzIHRoZSBnaXZlbiBFbGVtZW50XG4gICAqICAgfSxcbiAgICpcbiAgICogICAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgY2FuIGJlIGFkanVzdGVkIGluZGVwZW5kZW50bHkuIFdoZW4gYHRydWVgLCB3aWR0aCBhbmRcbiAgICogICAgIC8vIGhlaWdodCBhcmUgYWRqdXN0ZWQgYXQgYSAxOjEgcmF0aW8uXG4gICAqICAgICBzcXVhcmU6IGZhbHNlLFxuICAgKlxuICAgKiAgICAgLy8gV2lkdGggYW5kIGhlaWdodCBjYW4gYmUgYWRqdXN0ZWQgaW5kZXBlbmRlbnRseS4gV2hlbiBgdHJ1ZWAsIHdpZHRoIGFuZFxuICAgKiAgICAgLy8gaGVpZ2h0IG1haW50YWluIHRoZSBhc3BlY3QgcmF0aW8gdGhleSBoYWQgd2hlbiByZXNpemluZyBzdGFydGVkLlxuICAgKiAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogZmFsc2UsXG4gICAqXG4gICAqICAgLy8gYSB2YWx1ZSBvZiAnbm9uZScgd2lsbCBsaW1pdCB0aGUgcmVzaXplIHJlY3QgdG8gYSBtaW5pbXVtIG9mIDB4MFxuICAgKiAgIC8vICduZWdhdGUnIHdpbGwgYWxsb3cgdGhlIHJlY3QgdG8gaGF2ZSBuZWdhdGl2ZSB3aWR0aC9oZWlnaHRcbiAgICogICAvLyAncmVwb3NpdGlvbicgd2lsbCBrZWVwIHRoZSB3aWR0aC9oZWlnaHQgcG9zaXRpdmUgYnkgc3dhcHBpbmdcbiAgICogICAvLyB0aGUgdG9wIGFuZCBib3R0b20gZWRnZXMgYW5kL29yIHN3YXBwaW5nIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlc1xuICAgKiAgIGludmVydDogJ25vbmUnIHx8ICduZWdhdGUnIHx8ICdyZXBvc2l0aW9uJ1xuICAgKlxuICAgKiAgIC8vIGxpbWl0IG11bHRpcGxlIHJlc2l6ZXMuXG4gICAqICAgLy8gU2VlIHRoZSBleHBsYW5hdGlvbiBpbiB0aGUge0BsaW5rIEludGVyYWN0YWJsZS5kcmFnZ2FibGV9IGV4YW1wbGVcbiAgICogICBtYXg6IEluZmluaXR5LFxuICAgKiAgIG1heFBlckVsZW1lbnQ6IDEsXG4gICAqIH0pXG4gICAqXG4gICAqIHZhciBpc1Jlc2l6ZWFibGUgPSBpbnRlcmFjdChlbGVtZW50KS5yZXNpemFibGUoKVxuICAgKiBgYGBcbiAgICpcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgcmVzaXplIGFjdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdH0gW29wdGlvbnNdIHRydWUvZmFsc2Ugb3IgQW4gb2JqZWN0IHdpdGggZXZlbnRcbiAgICogbGlzdGVuZXJzIHRvIGJlIGZpcmVkIG9uIHJlc2l6ZSBldmVudHMgKG9iamVjdCBtYWtlcyB0aGUgSW50ZXJhY3RhYmxlXG4gICAqIHJlc2l6YWJsZSlcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IEludGVyYWN0YWJsZX0gQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBjYW4gYmUgdGhlXG4gICAqIHRhcmdldCBvZiByZXNpemUgZWxlbWVudHMsIG9yIHRoaXMgSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLnJlc2l6YWJsZSA9IGZ1bmN0aW9uICh0aGlzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsIG9wdGlvbnM6IEludGVyYWN0LlJlc2l6YWJsZU9wdGlvbnMgfCBib29sZWFuKSB7XG4gICAgcmV0dXJuIHJlc2l6YWJsZSh0aGlzLCBvcHRpb25zLCBzY29wZSlcbiAgfSBhcyBSZXNpemFibGVNZXRob2RcblxuICBhY3Rpb25zLm1hcC5yZXNpemUgPSByZXNpemVcbiAgYWN0aW9ucy5tZXRob2REaWN0LnJlc2l6ZSA9ICdyZXNpemFibGUnXG5cbiAgZGVmYXVsdHMuYWN0aW9ucy5yZXNpemUgPSByZXNpemUuZGVmYXVsdHNcbn1cblxuZnVuY3Rpb24gcmVzaXplQ2hlY2tlciAoYXJnKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgcmVjdCwgYnV0dG9ucyB9ID0gYXJnXG5cbiAgaWYgKCFyZWN0KSB7IHJldHVybiB1bmRlZmluZWQgfVxuXG4gIGNvbnN0IHBhZ2UgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZSlcbiAgY29uc3QgcmVzaXplT3B0aW9ucyA9IGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZVxuXG4gIGlmIChcbiAgICAhKHJlc2l6ZU9wdGlvbnMgJiYgcmVzaXplT3B0aW9ucy5lbmFibGVkKSB8fFxuICAgIC8vIGNoZWNrIG1vdXNlQnV0dG9uIHNldHRpbmcgaWYgdGhlIHBvaW50ZXIgaXMgZG93blxuICAgIChpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duICYmXG4gICAgIC9tb3VzZXxwb2ludGVyLy50ZXN0KGludGVyYWN0aW9uLnBvaW50ZXJUeXBlKSAmJlxuICAgKGJ1dHRvbnMgJiByZXNpemVPcHRpb25zLm1vdXNlQnV0dG9ucykgPT09IDApXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIGlmIHVzaW5nIHJlc2l6ZS5lZGdlc1xuICBpZiAoaXMub2JqZWN0KHJlc2l6ZU9wdGlvbnMuZWRnZXMpKSB7XG4gICAgY29uc3QgcmVzaXplRWRnZXMgPSB7XG4gICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgIHJpZ2h0OiBmYWxzZSxcbiAgICAgIHRvcDogZmFsc2UsXG4gICAgICBib3R0b206IGZhbHNlLFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWRnZSBpbiByZXNpemVFZGdlcykge1xuICAgICAgcmVzaXplRWRnZXNbZWRnZV0gPSBjaGVja1Jlc2l6ZUVkZ2UoZWRnZSxcbiAgICAgICAgcmVzaXplT3B0aW9ucy5lZGdlc1tlZGdlXSxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgaW50ZXJhY3Rpb24uX2xhdGVzdFBvaW50ZXIuZXZlbnRUYXJnZXQsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHJlY3QsXG4gICAgICAgIHJlc2l6ZU9wdGlvbnMubWFyZ2luIHx8IHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuICAgIH1cblxuICAgIHJlc2l6ZUVkZ2VzLmxlZnQgPSByZXNpemVFZGdlcy5sZWZ0ICYmICFyZXNpemVFZGdlcy5yaWdodFxuICAgIHJlc2l6ZUVkZ2VzLnRvcCAgPSByZXNpemVFZGdlcy50b3AgICYmICFyZXNpemVFZGdlcy5ib3R0b21cblxuICAgIGlmIChyZXNpemVFZGdlcy5sZWZ0IHx8IHJlc2l6ZUVkZ2VzLnJpZ2h0IHx8IHJlc2l6ZUVkZ2VzLnRvcCB8fCByZXNpemVFZGdlcy5ib3R0b20pIHtcbiAgICAgIGFyZy5hY3Rpb24gPSB7XG4gICAgICAgIG5hbWU6ICdyZXNpemUnLFxuICAgICAgICBlZGdlczogcmVzaXplRWRnZXMsXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGNvbnN0IHJpZ2h0ICA9IHJlc2l6ZU9wdGlvbnMuYXhpcyAhPT0gJ3knICYmIHBhZ2UueCA+IChyZWN0LnJpZ2h0ICAtIHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuICAgIGNvbnN0IGJvdHRvbSA9IHJlc2l6ZU9wdGlvbnMuYXhpcyAhPT0gJ3gnICYmIHBhZ2UueSA+IChyZWN0LmJvdHRvbSAtIHJlc2l6ZS5kZWZhdWx0TWFyZ2luKVxuXG4gICAgaWYgKHJpZ2h0IHx8IGJvdHRvbSkge1xuICAgICAgYXJnLmFjdGlvbiA9IHtcbiAgICAgICAgbmFtZTogJ3Jlc2l6ZScsXG4gICAgICAgIGF4ZXM6IChyaWdodCA/ICd4JyA6ICcnKSArIChib3R0b20gPyAneScgOiAnJyksXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyZy5hY3Rpb24gPyBmYWxzZSA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiByZXNpemFibGUgKGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBvcHRpb25zOiBJbnRlcmFjdC5PckJvb2xlYW48SW50ZXJhY3QuUmVzaXphYmxlT3B0aW9ucz4gfCBib29sZWFuLCBzY29wZTogU2NvcGUpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZS5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZVxuICAgIGludGVyYWN0YWJsZS5zZXRQZXJBY3Rpb24oJ3Jlc2l6ZScsIG9wdGlvbnMpXG4gICAgaW50ZXJhY3RhYmxlLnNldE9uRXZlbnRzKCdyZXNpemUnLCBvcHRpb25zKVxuXG4gICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmF4aXMpICYmIC9eeCR8XnkkfF54eSQvLnRlc3Qob3B0aW9ucy5heGlzKSkge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLmF4aXMgPSBvcHRpb25zLmF4aXNcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5heGlzID09PSBudWxsKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemUuYXhpcyA9IHNjb3BlLmRlZmF1bHRzLmFjdGlvbnMucmVzaXplLmF4aXNcbiAgICB9XG5cbiAgICBpZiAoaXMuYm9vbChvcHRpb25zLnByZXNlcnZlQXNwZWN0UmF0aW8pKSB7XG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemUucHJlc2VydmVBc3BlY3RSYXRpbyA9IG9wdGlvbnMucHJlc2VydmVBc3BlY3RSYXRpb1xuICAgIH1cbiAgICBlbHNlIGlmIChpcy5ib29sKG9wdGlvbnMuc3F1YXJlKSkge1xuICAgICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLnNxdWFyZSA9IG9wdGlvbnMuc3F1YXJlXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0YWJsZVxuICB9XG4gIGlmIChpcy5ib29sKG9wdGlvbnMpKSB7XG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMucmVzaXplLmVuYWJsZWQgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gaW50ZXJhY3RhYmxlXG4gIH1cbiAgcmV0dXJuIGludGVyYWN0YWJsZS5vcHRpb25zLnJlc2l6ZVxufVxuXG5mdW5jdGlvbiBjaGVja1Jlc2l6ZUVkZ2UgKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHBhZ2U6IEludGVyYWN0LlBvaW50LFxuICBlbGVtZW50OiBOb2RlLFxuICBpbnRlcmFjdGFibGVFbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICByZWN0OiBJbnRlcmFjdC5SZWN0LFxuICBtYXJnaW46IG51bWJlcixcbikge1xuICAvLyBmYWxzZSwgJycsIHVuZGVmaW5lZCwgbnVsbFxuICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gdHJ1ZSB2YWx1ZSwgdXNlIHBvaW50ZXIgY29vcmRzIGFuZCBlbGVtZW50IHJlY3RcbiAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgLy8gaWYgZGltZW5zaW9ucyBhcmUgbmVnYXRpdmUsIFwic3dpdGNoXCIgZWRnZXNcbiAgICBjb25zdCB3aWR0aCAgPSBpcy5udW1iZXIocmVjdC53aWR0aCkgPyByZWN0LndpZHRoICA6IHJlY3QucmlnaHQgIC0gcmVjdC5sZWZ0XG4gICAgY29uc3QgaGVpZ2h0ID0gaXMubnVtYmVyKHJlY3QuaGVpZ2h0KSA/IHJlY3QuaGVpZ2h0IDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuXG4gICAgLy8gZG9uJ3QgdXNlIG1hcmdpbiBncmVhdGVyIHRoYW4gaGFsZiB0aGUgcmVsZXZlbnQgZGltZW5zaW9uXG4gICAgbWFyZ2luID0gTWF0aC5taW4obWFyZ2luLCAobmFtZSA9PT0gJ2xlZnQnIHx8IG5hbWUgPT09ICdyaWdodCcgPyB3aWR0aCA6IGhlaWdodCkgLyAyKVxuXG4gICAgaWYgKHdpZHRoIDwgMCkge1xuICAgICAgaWYgICAgICAobmFtZSA9PT0gJ2xlZnQnKSAgeyBuYW1lID0gJ3JpZ2h0JyB9XG4gICAgICBlbHNlIGlmIChuYW1lID09PSAncmlnaHQnKSB7IG5hbWUgPSAnbGVmdCcgIH1cbiAgICB9XG4gICAgaWYgKGhlaWdodCA8IDApIHtcbiAgICAgIGlmICAgICAgKG5hbWUgPT09ICd0b3AnKSAgICB7IG5hbWUgPSAnYm90dG9tJyB9XG4gICAgICBlbHNlIGlmIChuYW1lID09PSAnYm90dG9tJykgeyBuYW1lID0gJ3RvcCcgICAgfVxuICAgIH1cblxuICAgIGlmIChuYW1lID09PSAnbGVmdCcpIHsgcmV0dXJuIHBhZ2UueCA8ICgod2lkdGggID49IDAgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0KSArIG1hcmdpbikgfVxuICAgIGlmIChuYW1lID09PSAndG9wJykgeyByZXR1cm4gcGFnZS55IDwgKChoZWlnaHQgPj0gMCA/IHJlY3QudG9wIDogcmVjdC5ib3R0b20pICsgbWFyZ2luKSB9XG5cbiAgICBpZiAobmFtZSA9PT0gJ3JpZ2h0JykgeyByZXR1cm4gcGFnZS54ID4gKCh3aWR0aCAgPj0gMCA/IHJlY3QucmlnaHQgOiByZWN0LmxlZnQpIC0gbWFyZ2luKSB9XG4gICAgaWYgKG5hbWUgPT09ICdib3R0b20nKSB7IHJldHVybiBwYWdlLnkgPiAoKGhlaWdodCA+PSAwID8gcmVjdC5ib3R0b20gOiByZWN0LnRvcCkgLSBtYXJnaW4pIH1cbiAgfVxuXG4gIC8vIHRoZSByZW1haW5pbmcgY2hlY2tzIHJlcXVpcmUgYW4gZWxlbWVudFxuICBpZiAoIWlzLmVsZW1lbnQoZWxlbWVudCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICByZXR1cm4gaXMuZWxlbWVudCh2YWx1ZSlcbiAgLy8gdGhlIHZhbHVlIGlzIGFuIGVsZW1lbnQgdG8gdXNlIGFzIGEgcmVzaXplIGhhbmRsZVxuICAgID8gdmFsdWUgPT09IGVsZW1lbnRcbiAgICAvLyBvdGhlcndpc2UgY2hlY2sgaWYgZWxlbWVudCBtYXRjaGVzIHZhbHVlIGFzIHNlbGVjdG9yXG4gICAgOiBkb20ubWF0Y2hlc1VwVG8oZWxlbWVudCwgdmFsdWUsIGludGVyYWN0YWJsZUVsZW1lbnQpXG59XG5cbmZ1bmN0aW9uIGluaXRDdXJzb3JzIChicm93c2VyOiB0eXBlb2YgaW1wb3J0ICgnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcicpLmRlZmF1bHQpIHtcbiAgcmV0dXJuIChicm93c2VyLmlzSWU5ID8ge1xuICAgIHggOiAnZS1yZXNpemUnLFxuICAgIHkgOiAncy1yZXNpemUnLFxuICAgIHh5OiAnc2UtcmVzaXplJyxcblxuICAgIHRvcCAgICAgICAgOiAnbi1yZXNpemUnLFxuICAgIGxlZnQgICAgICAgOiAndy1yZXNpemUnLFxuICAgIGJvdHRvbSAgICAgOiAncy1yZXNpemUnLFxuICAgIHJpZ2h0ICAgICAgOiAnZS1yZXNpemUnLFxuICAgIHRvcGxlZnQgICAgOiAnc2UtcmVzaXplJyxcbiAgICBib3R0b21yaWdodDogJ3NlLXJlc2l6ZScsXG4gICAgdG9wcmlnaHQgICA6ICduZS1yZXNpemUnLFxuICAgIGJvdHRvbWxlZnQgOiAnbmUtcmVzaXplJyxcbiAgfSA6IHtcbiAgICB4IDogJ2V3LXJlc2l6ZScsXG4gICAgeSA6ICducy1yZXNpemUnLFxuICAgIHh5OiAnbndzZS1yZXNpemUnLFxuXG4gICAgdG9wICAgICAgICA6ICducy1yZXNpemUnLFxuICAgIGxlZnQgICAgICAgOiAnZXctcmVzaXplJyxcbiAgICBib3R0b20gICAgIDogJ25zLXJlc2l6ZScsXG4gICAgcmlnaHQgICAgICA6ICdldy1yZXNpemUnLFxuICAgIHRvcGxlZnQgICAgOiAnbndzZS1yZXNpemUnLFxuICAgIGJvdHRvbXJpZ2h0OiAnbndzZS1yZXNpemUnLFxuICAgIHRvcHJpZ2h0ICAgOiAnbmVzdy1yZXNpemUnLFxuICAgIGJvdHRvbWxlZnQgOiAnbmVzdy1yZXNpemUnLFxuICB9KVxufVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpRXZlbnQsIGludGVyYWN0aW9uIH06IHsgaUV2ZW50OiBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PGFueSwgYW55PiwgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUgIT09ICdyZXNpemUnIHx8ICFpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzaXplRXZlbnQgPSBpRXZlbnQgYXMgUmVzaXplRXZlbnRcbiAgY29uc3QgcmVjdCA9IGludGVyYWN0aW9uLnJlY3RcblxuICBpbnRlcmFjdGlvbi5fcmVjdHMgPSB7XG4gICAgc3RhcnQ6IGV4dGVuZCh7fSwgcmVjdCksXG4gICAgY29ycmVjdGVkOiBleHRlbmQoe30sIHJlY3QpLFxuICAgIHByZXZpb3VzOiBleHRlbmQoe30sIHJlY3QpLFxuICAgIGRlbHRhOiB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQgOiAwLFxuICAgICAgd2lkdGggOiAwLFxuICAgICAgdG9wIDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICB9LFxuICB9XG5cbiAgcmVzaXplRXZlbnQuZWRnZXMgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlc1xuICByZXNpemVFdmVudC5yZWN0ID0gaW50ZXJhY3Rpb24uX3JlY3RzLmNvcnJlY3RlZFxuICByZXNpemVFdmVudC5kZWx0YVJlY3QgPSBpbnRlcmFjdGlvbi5fcmVjdHMuZGVsdGFcbn1cblxuZnVuY3Rpb24gbW92ZSAoeyBpRXZlbnQsIGludGVyYWN0aW9uIH06IHsgaUV2ZW50OiBJbnRlcmFjdC5JbnRlcmFjdEV2ZW50PGFueSwgYW55PiwgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUgIT09ICdyZXNpemUnIHx8ICFpbnRlcmFjdGlvbi5wcmVwYXJlZC5lZGdlcykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IHJlc2l6ZUV2ZW50ID0gaUV2ZW50IGFzIFJlc2l6ZUV2ZW50XG4gIGNvbnN0IHJlc2l6ZU9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5yZXNpemVcbiAgY29uc3QgaW52ZXJ0ID0gcmVzaXplT3B0aW9ucy5pbnZlcnRcbiAgY29uc3QgaW52ZXJ0aWJsZSA9IGludmVydCA9PT0gJ3JlcG9zaXRpb24nIHx8IGludmVydCA9PT0gJ25lZ2F0ZSdcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGNvbnN0IGN1cnJlbnQgPSBpbnRlcmFjdGlvbi5yZWN0XG4gIGNvbnN0IHsgc3RhcnQ6IHN0YXJ0UmVjdCwgY29ycmVjdGVkLCBkZWx0YTogZGVsdGFSZWN0LCBwcmV2aW91cyB9ID0gaW50ZXJhY3Rpb24uX3JlY3RzXG5cbiAgZXh0ZW5kKHByZXZpb3VzLCBjb3JyZWN0ZWQpXG5cbiAgaWYgKGludmVydGlibGUpIHtcbiAgICAvLyBpZiBpbnZlcnRpYmxlLCBjb3B5IHRoZSBjdXJyZW50IHJlY3RcbiAgICBleHRlbmQoY29ycmVjdGVkLCBjdXJyZW50KVxuXG4gICAgaWYgKGludmVydCA9PT0gJ3JlcG9zaXRpb24nKSB7XG4gICAgICAvLyBzd2FwIGVkZ2UgdmFsdWVzIGlmIG5lY2Vzc2FyeSB0byBrZWVwIHdpZHRoL2hlaWdodCBwb3NpdGl2ZVxuICAgICAgaWYgKGNvcnJlY3RlZC50b3AgPiBjb3JyZWN0ZWQuYm90dG9tKSB7XG4gICAgICAgIGNvbnN0IHN3YXAgPSBjb3JyZWN0ZWQudG9wXG5cbiAgICAgICAgY29ycmVjdGVkLnRvcCA9IGNvcnJlY3RlZC5ib3R0b21cbiAgICAgICAgY29ycmVjdGVkLmJvdHRvbSA9IHN3YXBcbiAgICAgIH1cbiAgICAgIGlmIChjb3JyZWN0ZWQubGVmdCA+IGNvcnJlY3RlZC5yaWdodCkge1xuICAgICAgICBjb25zdCBzd2FwID0gY29ycmVjdGVkLmxlZnRcblxuICAgICAgICBjb3JyZWN0ZWQubGVmdCA9IGNvcnJlY3RlZC5yaWdodFxuICAgICAgICBjb3JyZWN0ZWQucmlnaHQgPSBzd2FwXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIGlmIG5vdCBpbnZlcnRpYmxlLCByZXN0cmljdCB0byBtaW5pbXVtIG9mIDB4MCByZWN0XG4gICAgY29ycmVjdGVkLnRvcCAgICA9IE1hdGgubWluKGN1cnJlbnQudG9wLCBzdGFydFJlY3QuYm90dG9tKVxuICAgIGNvcnJlY3RlZC5ib3R0b20gPSBNYXRoLm1heChjdXJyZW50LmJvdHRvbSwgc3RhcnRSZWN0LnRvcClcbiAgICBjb3JyZWN0ZWQubGVmdCAgID0gTWF0aC5taW4oY3VycmVudC5sZWZ0LCBzdGFydFJlY3QucmlnaHQpXG4gICAgY29ycmVjdGVkLnJpZ2h0ICA9IE1hdGgubWF4KGN1cnJlbnQucmlnaHQsIHN0YXJ0UmVjdC5sZWZ0KVxuICB9XG5cbiAgY29ycmVjdGVkLndpZHRoICA9IGNvcnJlY3RlZC5yaWdodCAgLSBjb3JyZWN0ZWQubGVmdFxuICBjb3JyZWN0ZWQuaGVpZ2h0ID0gY29ycmVjdGVkLmJvdHRvbSAtIGNvcnJlY3RlZC50b3BcblxuICBmb3IgKGNvbnN0IGVkZ2UgaW4gY29ycmVjdGVkKSB7XG4gICAgZGVsdGFSZWN0W2VkZ2VdID0gY29ycmVjdGVkW2VkZ2VdIC0gcHJldmlvdXNbZWRnZV1cbiAgfVxuXG4gIHJlc2l6ZUV2ZW50LmVkZ2VzID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQuZWRnZXNcbiAgcmVzaXplRXZlbnQucmVjdCA9IGNvcnJlY3RlZFxuICByZXNpemVFdmVudC5kZWx0YVJlY3QgPSBkZWx0YVJlY3Rcbn1cblxuZnVuY3Rpb24gZW5kICh7IGlFdmVudCwgaW50ZXJhY3Rpb24gfTogeyBpRXZlbnQ6IEludGVyYWN0LkludGVyYWN0RXZlbnQ8YW55LCBhbnk+LCBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24gfSkge1xuICBpZiAoaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSAhPT0gJ3Jlc2l6ZScgfHwgIWludGVyYWN0aW9uLnByZXBhcmVkLmVkZ2VzKSB7IHJldHVybiB9XG5cbiAgY29uc3QgcmVzaXplRXZlbnQgPSBpRXZlbnQgYXMgUmVzaXplRXZlbnRcblxuICByZXNpemVFdmVudC5lZGdlcyA9IGludGVyYWN0aW9uLnByZXBhcmVkLmVkZ2VzXG4gIHJlc2l6ZUV2ZW50LnJlY3QgPSBpbnRlcmFjdGlvbi5fcmVjdHMuY29ycmVjdGVkXG4gIHJlc2l6ZUV2ZW50LmRlbHRhUmVjdCA9IGludGVyYWN0aW9uLl9yZWN0cy5kZWx0YVxufVxuXG5mdW5jdGlvbiB1cGRhdGVFdmVudEF4ZXMgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbiB9OiB7IGlFdmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxhbnksIGFueT4sIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB9KSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAncmVzaXplJyB8fCAhaW50ZXJhY3Rpb24ucmVzaXplQXhlcykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9uc1xuICBjb25zdCByZXNpemVFdmVudCA9IGlFdmVudCBhcyBSZXNpemVFdmVudFxuXG4gIGlmIChvcHRpb25zLnJlc2l6ZS5zcXVhcmUpIHtcbiAgICBpZiAoaW50ZXJhY3Rpb24ucmVzaXplQXhlcyA9PT0gJ3knKSB7XG4gICAgICByZXNpemVFdmVudC5kZWx0YS54ID0gcmVzaXplRXZlbnQuZGVsdGEueVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJlc2l6ZUV2ZW50LmRlbHRhLnkgPSByZXNpemVFdmVudC5kZWx0YS54XG4gICAgfVxuICAgIHJlc2l6ZUV2ZW50LmF4ZXMgPSAneHknXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzaXplRXZlbnQuYXhlcyA9IGludGVyYWN0aW9uLnJlc2l6ZUF4ZXNcblxuICAgIGlmIChpbnRlcmFjdGlvbi5yZXNpemVBeGVzID09PSAneCcpIHtcbiAgICAgIHJlc2l6ZUV2ZW50LmRlbHRhLnkgPSAwXG4gICAgfVxuICAgIGVsc2UgaWYgKGludGVyYWN0aW9uLnJlc2l6ZUF4ZXMgPT09ICd5Jykge1xuICAgICAgcmVzaXplRXZlbnQuZGVsdGEueCA9IDBcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcmVzaXplOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYWN0aW9ucy9yZXNpemUnLFxuICBiZWZvcmU6IFsnYWN0aW9ucy9kcmFnJ10sXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogKHsgaW50ZXJhY3Rpb24gfSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24ucmVzaXplQXhlcyA9ICd4eSdcbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tc3RhcnQnOiBhcmcgPT4ge1xuICAgICAgc3RhcnQoYXJnKVxuICAgICAgdXBkYXRlRXZlbnRBeGVzKGFyZylcbiAgICB9LFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBhcmcgPT4ge1xuICAgICAgbW92ZShhcmcpXG4gICAgICB1cGRhdGVFdmVudEF4ZXMoYXJnKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tZW5kJzogZW5kLFxuICAgICdhdXRvLXN0YXJ0OmNoZWNrJzogcmVzaXplQ2hlY2tlcixcbiAgfSxcblxuICBkZWZhdWx0czoge1xuICAgIHNxdWFyZTogZmFsc2UsXG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgYXhpczogJ3h5JyxcblxuICAgIC8vIHVzZSBkZWZhdWx0IG1hcmdpblxuICAgIG1hcmdpbjogTmFOLFxuXG4gICAgLy8gb2JqZWN0IHdpdGggcHJvcHMgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIHdoaWNoIGFyZVxuICAgIC8vIHRydWUvZmFsc2UgdmFsdWVzIHRvIHJlc2l6ZSB3aGVuIHRoZSBwb2ludGVyIGlzIG92ZXIgdGhhdCBlZGdlLFxuICAgIC8vIENTUyBzZWxlY3RvcnMgdG8gbWF0Y2ggdGhlIGhhbmRsZXMgZm9yIGVhY2ggZGlyZWN0aW9uXG4gICAgLy8gb3IgdGhlIEVsZW1lbnRzIGZvciBlYWNoIGhhbmRsZVxuICAgIGVkZ2VzOiBudWxsLFxuXG4gICAgLy8gYSB2YWx1ZSBvZiAnbm9uZScgd2lsbCBsaW1pdCB0aGUgcmVzaXplIHJlY3QgdG8gYSBtaW5pbXVtIG9mIDB4MFxuICAgIC8vICduZWdhdGUnIHdpbGwgYWxvdyB0aGUgcmVjdCB0byBoYXZlIG5lZ2F0aXZlIHdpZHRoL2hlaWdodFxuICAgIC8vICdyZXBvc2l0aW9uJyB3aWxsIGtlZXAgdGhlIHdpZHRoL2hlaWdodCBwb3NpdGl2ZSBieSBzd2FwcGluZ1xuICAgIC8vIHRoZSB0b3AgYW5kIGJvdHRvbSBlZGdlcyBhbmQvb3Igc3dhcHBpbmcgdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzXG4gICAgaW52ZXJ0OiAnbm9uZScsXG4gIH0gYXMgSW50ZXJhY3QuUmVzaXphYmxlT3B0aW9ucyxcblxuICBjdXJzb3JzOiBudWxsIGFzIFJldHVyblR5cGU8dHlwZW9mIGluaXRDdXJzb3JzPixcblxuICBnZXRDdXJzb3IgKHsgZWRnZXMsIGF4aXMsIG5hbWUgfTogSW50ZXJhY3QuQWN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjdXJzb3JzID0gcmVzaXplLmN1cnNvcnNcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsXG5cbiAgICBpZiAoYXhpcykge1xuICAgICAgcmVzdWx0ID0gY3Vyc29yc1tuYW1lICsgYXhpc11cbiAgICB9XG4gICAgZWxzZSBpZiAoZWRnZXMpIHtcbiAgICAgIGxldCBjdXJzb3JLZXkgPSAnJ1xuXG4gICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgWyd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnXSkge1xuICAgICAgICBpZiAoZWRnZXNbZWRnZV0pIHtcbiAgICAgICAgICBjdXJzb3JLZXkgKz0gZWRnZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCA9IGN1cnNvcnNbY3Vyc29yS2V5XVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfSxcblxuICBkZWZhdWx0TWFyZ2luOiBudWxsIGFzIG51bWJlcixcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVzaXplXG4iLCJpbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgZHJhZyBmcm9tICcuL2RyYWcnXG5pbXBvcnQgZHJvcCBmcm9tICcuL2Ryb3AvaW5kZXgnXG5pbXBvcnQgZ2VzdHVyZSBmcm9tICcuL2dlc3R1cmUnXG5pbXBvcnQgcmVzaXplIGZyb20gJy4vcmVzaXplJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnYWN0aW9ucycsXG4gIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICAgIHNjb3BlLnVzZVBsdWdpbihnZXN0dXJlKVxuICAgIHNjb3BlLnVzZVBsdWdpbihyZXNpemUpXG4gICAgc2NvcGUudXNlUGx1Z2luKGRyYWcpXG4gICAgc2NvcGUudXNlUGx1Z2luKGRyb3ApXG4gIH0sXG59XG5cbmV4cG9ydCB7XG4gIGdlc3R1cmUsXG4gIHJlc2l6ZSxcbiAgZHJhZyxcbiAgZHJvcCxcbn1cbiIsImltcG9ydCAqIGFzIGRvbVV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5pbXBvcnQgcmFmIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JhZidcbmltcG9ydCB7IGdldFN0cmluZ09wdGlvblJlc3VsdCB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JlY3QnXG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy93aW5kb3cnXG5cbnR5cGUgU2NvcGUgPSBpbXBvcnQgKCdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJykuU2NvcGVcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNjb3BlIHtcbiAgICBhdXRvU2Nyb2xsOiB0eXBlb2YgYXV0b1Njcm9sbFxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgYXV0b1Njcm9sbD86IHR5cGVvZiBhdXRvU2Nyb2xsXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIFBlckFjdGlvbkRlZmF1bHRzIHtcbiAgICBhdXRvU2Nyb2xsPzogQXV0b1Njcm9sbE9wdGlvbnNcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TY3JvbGxPcHRpb25zIHtcbiAgY29udGFpbmVyPzogV2luZG93IHwgSFRNTEVsZW1lbnRcbiAgbWFyZ2luPzogbnVtYmVyXG4gIGRpc3RhbmNlPzogbnVtYmVyXG4gIGludGVydmFsPzogbnVtYmVyXG4gIHNwZWVkPzogbnVtYmVyXG4gIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgZGVmYXVsdHMsXG4gICAgYWN0aW9ucyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUuYXV0b1Njcm9sbCA9IGF1dG9TY3JvbGxcbiAgYXV0b1Njcm9sbC5ub3cgPSAoKSA9PiBzY29wZS5ub3coKVxuXG4gIGFjdGlvbnMucGhhc2VsZXNzVHlwZXMuYXV0b3Njcm9sbCA9IHRydWVcbiAgZGVmYXVsdHMucGVyQWN0aW9uLmF1dG9TY3JvbGwgPSBhdXRvU2Nyb2xsLmRlZmF1bHRzXG59XG5cbmNvbnN0IGF1dG9TY3JvbGwgPSB7XG4gIGRlZmF1bHRzOiB7XG4gICAgZW5hYmxlZCAgOiBmYWxzZSxcbiAgICBtYXJnaW4gICA6IDYwLFxuXG4gICAgLy8gdGhlIGl0ZW0gdGhhdCBpcyBzY3JvbGxlZCAoV2luZG93IG9yIEhUTUxFbGVtZW50KVxuICAgIGNvbnRhaW5lcjogbnVsbCBhcyBBdXRvU2Nyb2xsT3B0aW9uc1snY29udGFpbmVyJ10sXG5cbiAgICAvLyB0aGUgc2Nyb2xsIHNwZWVkIGluIHBpeGVscyBwZXIgc2Vjb25kXG4gICAgc3BlZWQgICAgOiAzMDAsXG4gIH0gYXMgQXV0b1Njcm9sbE9wdGlvbnMsXG5cbiAgbm93OiBEYXRlLm5vdyxcblxuICBpbnRlcmFjdGlvbjogbnVsbCBhcyBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgaTogMCwgLy8gdGhlIGhhbmRsZSByZXR1cm5lZCBieSB3aW5kb3cuc2V0SW50ZXJ2YWxcblxuICAvLyBEaXJlY3Rpb24gZWFjaCBwdWxzZSBpcyB0byBzY3JvbGwgaW5cbiAgeDogMCxcbiAgeTogMCxcblxuICBpc1Njcm9sbGluZzogZmFsc2UsXG4gIHByZXZUaW1lOiAwLFxuICBtYXJnaW46IDAsXG4gIHNwZWVkOiAwLFxuXG4gIHN0YXJ0IChpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24pIHtcbiAgICBhdXRvU2Nyb2xsLmlzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgIHJhZi5jYW5jZWwoYXV0b1Njcm9sbC5pKVxuXG4gICAgaW50ZXJhY3Rpb24uYXV0b1Njcm9sbCA9IGF1dG9TY3JvbGxcbiAgICBhdXRvU2Nyb2xsLmludGVyYWN0aW9uID0gaW50ZXJhY3Rpb25cbiAgICBhdXRvU2Nyb2xsLnByZXZUaW1lID0gYXV0b1Njcm9sbC5ub3coKVxuICAgIGF1dG9TY3JvbGwuaSA9IHJhZi5yZXF1ZXN0KGF1dG9TY3JvbGwuc2Nyb2xsKVxuICB9LFxuXG4gIHN0b3AgKCkge1xuICAgIGF1dG9TY3JvbGwuaXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgIGlmIChhdXRvU2Nyb2xsLmludGVyYWN0aW9uKSB7XG4gICAgICBhdXRvU2Nyb2xsLmludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgfVxuICAgIHJhZi5jYW5jZWwoYXV0b1Njcm9sbC5pKVxuICB9LFxuXG4gIC8vIHNjcm9sbCB0aGUgd2luZG93IGJ5IHRoZSB2YWx1ZXMgaW4gc2Nyb2xsLngveVxuICBzY3JvbGwgKCkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGF1dG9TY3JvbGxcbiAgICBjb25zdCB7IGludGVyYWN0YWJsZSwgZWxlbWVudCB9ID0gaW50ZXJhY3Rpb25cbiAgICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb25OYW1lXS5hdXRvU2Nyb2xsXG4gICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbnMuY29udGFpbmVyLCBpbnRlcmFjdGFibGUsIGVsZW1lbnQpXG4gICAgY29uc3Qgbm93ID0gYXV0b1Njcm9sbC5ub3coKVxuICAgIC8vIGNoYW5nZSBpbiB0aW1lIGluIHNlY29uZHNcbiAgICBjb25zdCBkdCA9IChub3cgLSBhdXRvU2Nyb2xsLnByZXZUaW1lKSAvIDEwMDBcbiAgICAvLyBkaXNwbGFjZW1lbnRcbiAgICBjb25zdCBzID0gb3B0aW9ucy5zcGVlZCAqIGR0XG5cbiAgICBpZiAocyA+PSAxKSB7XG4gICAgICBjb25zdCBzY3JvbGxCeSA9IHtcbiAgICAgICAgeDogYXV0b1Njcm9sbC54ICogcyxcbiAgICAgICAgeTogYXV0b1Njcm9sbC55ICogcyxcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbEJ5LnggfHwgc2Nyb2xsQnkueSkge1xuICAgICAgICBjb25zdCBwcmV2U2Nyb2xsID0gZ2V0U2Nyb2xsKGNvbnRhaW5lcilcblxuICAgICAgICBpZiAoaXMud2luZG93KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICBjb250YWluZXIuc2Nyb2xsQnkoc2Nyb2xsQnkueCwgc2Nyb2xsQnkueSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICBjb250YWluZXIuc2Nyb2xsTGVmdCArPSBzY3JvbGxCeS54XG4gICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCAgKz0gc2Nyb2xsQnkueVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VyU2Nyb2xsID0gZ2V0U2Nyb2xsKGNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgZGVsdGEgPSB7XG4gICAgICAgICAgeDogY3VyU2Nyb2xsLnggLSBwcmV2U2Nyb2xsLngsXG4gICAgICAgICAgeTogY3VyU2Nyb2xsLnkgLSBwcmV2U2Nyb2xsLnksXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsdGEueCB8fCBkZWx0YS55KSB7XG4gICAgICAgICAgaW50ZXJhY3RhYmxlLmZpcmUoe1xuICAgICAgICAgICAgdHlwZTogJ2F1dG9zY3JvbGwnLFxuICAgICAgICAgICAgdGFyZ2V0OiBlbGVtZW50LFxuICAgICAgICAgICAgaW50ZXJhY3RhYmxlLFxuICAgICAgICAgICAgZGVsdGEsXG4gICAgICAgICAgICBpbnRlcmFjdGlvbixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF1dG9TY3JvbGwucHJldlRpbWUgPSBub3dcbiAgICB9XG5cbiAgICBpZiAoYXV0b1Njcm9sbC5pc1Njcm9sbGluZykge1xuICAgICAgcmFmLmNhbmNlbChhdXRvU2Nyb2xsLmkpXG4gICAgICBhdXRvU2Nyb2xsLmkgPSByYWYucmVxdWVzdChhdXRvU2Nyb2xsLnNjcm9sbClcbiAgICB9XG4gIH0sXG4gIGNoZWNrIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSwgYWN0aW9uTmFtZTogSW50ZXJhY3QuQWN0aW9uTmFtZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1xuXG4gICAgcmV0dXJuIG9wdGlvbnNbYWN0aW9uTmFtZV0uYXV0b1Njcm9sbCAmJiBvcHRpb25zW2FjdGlvbk5hbWVdLmF1dG9TY3JvbGwuZW5hYmxlZFxuICB9LFxuICBvbkludGVyYWN0aW9uTW92ZTxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKHsgaW50ZXJhY3Rpb24sIHBvaW50ZXIgfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb248VD4sIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIH0pIHtcbiAgICBpZiAoIShpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpICYmXG4gICAgICAgICAgYXV0b1Njcm9sbC5jaGVjayhpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLnNpbXVsYXRpb24pIHtcbiAgICAgIGF1dG9TY3JvbGwueCA9IGF1dG9TY3JvbGwueSA9IDBcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCB0b3BcbiAgICBsZXQgcmlnaHRcbiAgICBsZXQgYm90dG9tXG4gICAgbGV0IGxlZnRcblxuICAgIGNvbnN0IHsgaW50ZXJhY3RhYmxlLCBlbGVtZW50IH0gPSBpbnRlcmFjdGlvblxuICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lXG4gICAgY29uc3Qgb3B0aW9ucyA9IGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbk5hbWVdLmF1dG9TY3JvbGxcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXIob3B0aW9ucy5jb250YWluZXIsIGludGVyYWN0YWJsZSwgZWxlbWVudClcblxuICAgIGlmIChpcy53aW5kb3coY29udGFpbmVyKSkge1xuICAgICAgbGVmdCAgID0gcG9pbnRlci5jbGllbnRYIDwgYXV0b1Njcm9sbC5tYXJnaW5cbiAgICAgIHRvcCAgICA9IHBvaW50ZXIuY2xpZW50WSA8IGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICByaWdodCAgPSBwb2ludGVyLmNsaWVudFggPiBjb250YWluZXIuaW5uZXJXaWR0aCAgLSBhdXRvU2Nyb2xsLm1hcmdpblxuICAgICAgYm90dG9tID0gcG9pbnRlci5jbGllbnRZID4gY29udGFpbmVyLmlubmVySGVpZ2h0IC0gYXV0b1Njcm9sbC5tYXJnaW5cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCByZWN0ID0gZG9tVXRpbHMuZ2V0RWxlbWVudENsaWVudFJlY3QoY29udGFpbmVyKVxuXG4gICAgICBsZWZ0ICAgPSBwb2ludGVyLmNsaWVudFggPCByZWN0LmxlZnQgICArIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICB0b3AgICAgPSBwb2ludGVyLmNsaWVudFkgPCByZWN0LnRvcCAgICArIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICByaWdodCAgPSBwb2ludGVyLmNsaWVudFggPiByZWN0LnJpZ2h0ICAtIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgICBib3R0b20gPSBwb2ludGVyLmNsaWVudFkgPiByZWN0LmJvdHRvbSAtIGF1dG9TY3JvbGwubWFyZ2luXG4gICAgfVxuXG4gICAgYXV0b1Njcm9sbC54ID0gKHJpZ2h0ID8gMSA6IGxlZnQgPyAtMSA6IDApXG4gICAgYXV0b1Njcm9sbC55ID0gKGJvdHRvbSA/IDEgOiAgdG9wID8gLTEgOiAwKVxuXG4gICAgaWYgKCFhdXRvU2Nyb2xsLmlzU2Nyb2xsaW5nKSB7XG4gICAgICAvLyBzZXQgdGhlIGF1dG9TY3JvbGwgcHJvcGVydGllcyB0byB0aG9zZSBvZiB0aGUgdGFyZ2V0XG4gICAgICBhdXRvU2Nyb2xsLm1hcmdpbiA9IG9wdGlvbnMubWFyZ2luXG4gICAgICBhdXRvU2Nyb2xsLnNwZWVkICA9IG9wdGlvbnMuc3BlZWRcblxuICAgICAgYXV0b1Njcm9sbC5zdGFydChpbnRlcmFjdGlvbilcbiAgICB9XG4gIH0sXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250YWluZXIgKHZhbHVlOiBhbnksIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gIHJldHVybiAoaXMuc3RyaW5nKHZhbHVlKSA/IGdldFN0cmluZ09wdGlvblJlc3VsdCh2YWx1ZSwgaW50ZXJhY3RhYmxlLCBlbGVtZW50KSA6IHZhbHVlKSB8fCBnZXRXaW5kb3coZWxlbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjcm9sbCAoY29udGFpbmVyOiBhbnkpIHtcbiAgaWYgKGlzLndpbmRvdyhjb250YWluZXIpKSB7IGNvbnRhaW5lciA9IHdpbmRvdy5kb2N1bWVudC5ib2R5IH1cblxuICByZXR1cm4geyB4OiBjb250YWluZXIuc2Nyb2xsTGVmdCwgeTogY29udGFpbmVyLnNjcm9sbFRvcCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxTaXplIChjb250YWluZXI6IGFueSkge1xuICBpZiAoaXMud2luZG93KGNvbnRhaW5lcikpIHsgY29udGFpbmVyID0gd2luZG93LmRvY3VtZW50LmJvZHkgfVxuXG4gIHJldHVybiB7IHg6IGNvbnRhaW5lci5zY3JvbGxXaWR0aCwgeTogY29udGFpbmVyLnNjcm9sbEhlaWdodCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxTaXplRGVsdGE8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+ICh7IGludGVyYWN0aW9uLCBlbGVtZW50IH06IHtcbiAgaW50ZXJhY3Rpb246IFBhcnRpYWw8SW50ZXJhY3QuSW50ZXJhY3Rpb248VD4+XG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbn0sIGZ1bmM6IGFueSkge1xuICBjb25zdCBzY3JvbGxPcHRpb25zID0gaW50ZXJhY3Rpb24gJiYgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLm9wdGlvbnNbaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZV0uYXV0b1Njcm9sbFxuXG4gIGlmICghc2Nyb2xsT3B0aW9ucyB8fCAhc2Nyb2xsT3B0aW9ucy5lbmFibGVkKSB7XG4gICAgZnVuYygpXG4gICAgcmV0dXJuIHsgeDogMCwgeTogMCB9XG4gIH1cblxuICBjb25zdCBzY3JvbGxDb250YWluZXIgPSBnZXRDb250YWluZXIoXG4gICAgc2Nyb2xsT3B0aW9ucy5jb250YWluZXIsXG4gICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLFxuICAgIGVsZW1lbnQsXG4gIClcblxuICBjb25zdCBwcmV2U2l6ZSA9IGdldFNjcm9sbChzY3JvbGxDb250YWluZXIpXG4gIGZ1bmMoKVxuICBjb25zdCBjdXJTaXplID0gZ2V0U2Nyb2xsKHNjcm9sbENvbnRhaW5lcilcblxuICByZXR1cm4ge1xuICAgIHg6IGN1clNpemUueCAtIHByZXZTaXplLngsXG4gICAgeTogY3VyU2l6ZS55IC0gcHJldlNpemUueSxcbiAgfVxufVxuXG5jb25zdCBhdXRvU2Nyb2xsUGx1Z2luOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnYXV0by1zY3JvbGwnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgfSxcblxuICAgICdpbnRlcmFjdGlvbnM6ZGVzdHJveSc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TY3JvbGwgPSBudWxsXG4gICAgICBhdXRvU2Nyb2xsLnN0b3AoKVxuICAgICAgaWYgKGF1dG9TY3JvbGwuaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgYXV0b1Njcm9sbC5pbnRlcmFjdGlvbiA9IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogYXV0b1Njcm9sbC5zdG9wLFxuXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24tbW92ZSc6IChhcmc6IGFueSkgPT4gYXV0b1Njcm9sbC5vbkludGVyYWN0aW9uTW92ZShhcmcpLFxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBhdXRvU2Nyb2xsUGx1Z2luXG4iLCJpbXBvcnQgeyB3YXJuT25jZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBnZXRBY3Rpb246IChcbiAgICAgIHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLFxuICAgICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gICAgICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sXG4gICAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICAgICkgPT4gSW50ZXJhY3QuQWN0aW9uUHJvcHMgfCBudWxsXG4gICAgc3R5bGVDdXJzb3I6IHR5cGVvZiBzdHlsZUN1cnNvclxuICAgIGFjdGlvbkNoZWNrZXI6IHR5cGVvZiBhY3Rpb25DaGVja2VyXG4gICAgaWdub3JlRnJvbToge1xuICAgICAgKC4uLmFyZ3M6IGFueVtdKTogSW50ZXJhY3RhYmxlXG4gICAgICAoKTogYm9vbGVhblxuICAgIH1cbiAgICBhbGxvd0Zyb206IHtcbiAgICAgICguLi5hcmdzOiBhbnlbXSk6IEludGVyYWN0YWJsZVxuICAgICAgKCk6IGJvb2xlYW5cbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBwb2ludGVySXNEb3duOiBib29sZWFuXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICAvKiogQGxlbmRzIEludGVyYWN0YWJsZSAqL1xuICAgIEludGVyYWN0YWJsZSwgLy8gdHNsaW50OmRpc2FibGUtbGluZSBuby1zaGFkb3dlZC12YXJpYWJsZVxuICB9ID0gc2NvcGVcblxuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmdldEFjdGlvbiA9IGZ1bmN0aW9uIGdldEFjdGlvbiAoXG4gICAgdGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLFxuICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlLFxuICAgIGV2ZW50OiBJbnRlcmFjdC5Qb2ludGVyRXZlbnRUeXBlLFxuICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICApOiBJbnRlcmFjdC5BY3Rpb25Qcm9wcyB7XG4gICAgY29uc3QgYWN0aW9uID0gZGVmYXVsdEFjdGlvbkNoZWNrZXIodGhpcywgZXZlbnQsIGludGVyYWN0aW9uLCBlbGVtZW50LCBzY29wZSlcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlcikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hY3Rpb25DaGVja2VyKHBvaW50ZXIsIGV2ZW50LCBhY3Rpb24sIHRoaXMsIGVsZW1lbnQsIGludGVyYWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBgYGBqc1xuICAgKiBpbnRlcmFjdChlbGVtZW50LCB7IGlnbm9yZUZyb206IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduby1hY3Rpb24nKSB9KVxuICAgKiAvLyBvclxuICAgKiBpbnRlcmFjdChlbGVtZW50KS5pZ25vcmVGcm9tKCdpbnB1dCwgdGV4dGFyZWEsIGEnKVxuICAgKiBgYGBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogSWYgdGhlIHRhcmdldCBvZiB0aGUgYG1vdXNlZG93bmAsIGBwb2ludGVyZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50IG9yIGFueVxuICAgKiBvZiBpdCdzIHBhcmVudHMgbWF0Y2ggdGhlIGdpdmVuIENTUyBzZWxlY3RvciBvciBFbGVtZW50LCBub1xuICAgKiBkcmFnL3Jlc2l6ZS9nZXN0dXJlIGlzIHN0YXJ0ZWQuXG4gICAqXG4gICAqIERvbid0IHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCBzZXQgdGhlIGBpZ25vcmVGcm9tYCBvcHRpb24gZm9yIGVhY2ggYWN0aW9uXG4gICAqIG9yIGZvciBgcG9pbnRlckV2ZW50c2BcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogaW50ZXJhY3QodGFyZ2V0dClcbiAgICogICAuZHJhZ2dhYmxlKHtcbiAgICogICAgIGlnbm9yZUZyb206ICdpbnB1dCwgdGV4dGFyZWEsIGFbaHJlZl0nJyxcbiAgICogICB9KVxuICAgKiAgIC5wb2ludGVyRXZlbnRzKHtcbiAgICogICAgIGlnbm9yZUZyb206ICdbbm8tcG9pbnRlcl0nLFxuICAgKiAgIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRWxlbWVudCB8IG51bGx9IFtuZXdWYWx1ZV0gYSBDU1Mgc2VsZWN0b3Igc3RyaW5nLCBhblxuICAgKiBFbGVtZW50IG9yIGBudWxsYCB0byBub3QgaWdub3JlIGFueSBlbGVtZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBFbGVtZW50IHwgb2JqZWN0fSBUaGUgY3VycmVudCBpZ25vcmVGcm9tIHZhbHVlIG9yIHRoaXNcbiAgICogSW50ZXJhY3RhYmxlXG4gICAqL1xuICBJbnRlcmFjdGFibGUucHJvdG90eXBlLmlnbm9yZUZyb20gPSB3YXJuT25jZShmdW5jdGlvbiAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBuZXdWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrQ29tcGF0T3B0aW9uKCdpZ25vcmVGcm9tJywgbmV3VmFsdWUpXG4gIH0sICdJbnRlcmFjdGFibGUuaWdub3JlRnJvbSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBJbnRlcmFjdGJsZS5kcmFnZ2FibGUoe2lnbm9yZUZyb206IG5ld1ZhbHVlfSkuJylcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICpcbiAgICogQSBkcmFnL3Jlc2l6ZS9nZXN0dXJlIGlzIHN0YXJ0ZWQgb25seSBJZiB0aGUgdGFyZ2V0IG9mIHRoZSBgbW91c2Vkb3duYCxcbiAgICogYHBvaW50ZXJkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQgb3IgYW55IG9mIGl0J3MgcGFyZW50cyBtYXRjaCB0aGUgZ2l2ZW5cbiAgICogQ1NTIHNlbGVjdG9yIG9yIEVsZW1lbnQuXG4gICAqXG4gICAqIERvbid0IHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCBzZXQgdGhlIGBhbGxvd0Zyb21gIG9wdGlvbiBmb3IgZWFjaCBhY3Rpb25cbiAgICogb3IgZm9yIGBwb2ludGVyRXZlbnRzYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpbnRlcmFjdCh0YXJnZXR0KVxuICAgKiAgIC5yZXNpemFibGUoe1xuICAgKiAgICAgYWxsb3dGcm9tOiAnLnJlc2l6ZS1oYW5kbGUnLFxuICAgKiAgIC5wb2ludGVyRXZlbnRzKHtcbiAgICogICAgIGFsbG93RnJvbTogJy5oYW5kbGUnLCxcbiAgICogICB9KVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEVsZW1lbnQgfCBudWxsfSBbbmV3VmFsdWVdIGEgQ1NTIHNlbGVjdG9yIHN0cmluZywgYW5cbiAgICogRWxlbWVudCBvciBgbnVsbGAgdG8gYWxsb3cgZnJvbSBhbnkgZWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBFbGVtZW50IHwgb2JqZWN0fSBUaGUgY3VycmVudCBhbGxvd0Zyb20gdmFsdWUgb3IgdGhpc1xuICAgKiBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuYWxsb3dGcm9tID0gd2Fybk9uY2UoZnVuY3Rpb24gKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja0NvbXBhdE9wdGlvbignYWxsb3dGcm9tJywgbmV3VmFsdWUpXG4gIH0sICdJbnRlcmFjdGFibGUuYWxsb3dGcm9tKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIEludGVyYWN0YmxlLmRyYWdnYWJsZSh7YWxsb3dGcm9tOiBuZXdWYWx1ZX0pLicpXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGludGVyYWN0KCcucmVzaXplLWRyYWcnKVxuICAgKiAgIC5yZXNpemFibGUodHJ1ZSlcbiAgICogICAuZHJhZ2dhYmxlKHRydWUpXG4gICAqICAgLmFjdGlvbkNoZWNrZXIoZnVuY3Rpb24gKHBvaW50ZXIsIGV2ZW50LCBhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgaW50ZXJhY3Rpb24pIHtcbiAgICpcbiAgICogICBpZiAoaW50ZXJhY3QubWF0Y2hlc1NlbGVjdG9yKGV2ZW50LnRhcmdldCwgJy5kcmFnLWhhbmRsZScpKSB7XG4gICAqICAgICAvLyBmb3JjZSBkcmFnIHdpdGggaGFuZGxlIHRhcmdldFxuICAgKiAgICAgYWN0aW9uLm5hbWUgPSBkcmFnXG4gICAqICAgfVxuICAgKiAgIGVsc2Uge1xuICAgKiAgICAgLy8gcmVzaXplIGZyb20gdGhlIHRvcCBhbmQgcmlnaHQgZWRnZXNcbiAgICogICAgIGFjdGlvbi5uYW1lICA9ICdyZXNpemUnXG4gICAqICAgICBhY3Rpb24uZWRnZXMgPSB7IHRvcDogdHJ1ZSwgcmlnaHQ6IHRydWUgfVxuICAgKiAgIH1cbiAgICpcbiAgICogICByZXR1cm4gYWN0aW9uXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXR1cm5zIG9yIHNldHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvblxuICAgKiBwb2ludGVyRG93blxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uIHwgbnVsbH0gW2NoZWNrZXJdIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBwb2ludGVyIGV2ZW50LFxuICAgKiBkZWZhdWx0QWN0aW9uIHN0cmluZywgaW50ZXJhY3RhYmxlLCBlbGVtZW50IGFuZCBpbnRlcmFjdGlvbiBhcyBwYXJhbWV0ZXJzXG4gICAqIGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIG5hbWUgcHJvcGVydHkgJ2RyYWcnICdyZXNpemUnIG9yICdnZXN0dXJlJyBhbmRcbiAgICogb3B0aW9uYWxseSBhbiBgZWRnZXNgIG9iamVjdCB3aXRoIGJvb2xlYW4gJ3RvcCcsICdsZWZ0JywgJ2JvdHRvbScgYW5kIHJpZ2h0XG4gICAqIHByb3BzLlxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbiB8IEludGVyYWN0YWJsZX0gVGhlIGNoZWNrZXIgZnVuY3Rpb24gb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuYWN0aW9uQ2hlY2tlciA9IGFjdGlvbkNoZWNrZXJcblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHdoZXRoZXIgdGhlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGNoYW5nZWQgZGVwZW5kaW5nIG9uIHRoZVxuICAgKiBhY3Rpb24gdGhhdCB3b3VsZCBiZSBwZXJmb3JtZWQgaWYgdGhlIG1vdXNlIHdlcmUgcHJlc3NlZCBhbmQgZHJhZ2dlZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbbmV3VmFsdWVdXG4gICAqIEByZXR1cm4ge2Jvb2xlYW4gfCBJbnRlcmFjdGFibGV9IFRoZSBjdXJyZW50IHNldHRpbmcgb3IgdGhpcyBJbnRlcmFjdGFibGVcbiAgICovXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuc3R5bGVDdXJzb3IgPSBzdHlsZUN1cnNvclxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QWN0aW9uQ2hlY2tlciAoXG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLFxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50LFxuICBzY29wZTogSW50ZXJhY3QuU2NvcGUsXG4pIHtcbiAgY29uc3QgcmVjdCA9IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQpXG4gIGNvbnN0IGJ1dHRvbnMgPSAoZXZlbnQgYXMgTW91c2VFdmVudCkuYnV0dG9ucyB8fCAoe1xuICAgIDA6IDEsXG4gICAgMTogNCxcbiAgICAzOiA4LFxuICAgIDQ6IDE2LFxuICB9KVsoZXZlbnQgYXMgTW91c2VFdmVudCkuYnV0dG9uIGFzIDAgfCAxIHwgMyB8IDRdXG4gIGNvbnN0IGFyZyA9IHtcbiAgICBhY3Rpb246IG51bGwsXG4gICAgaW50ZXJhY3RhYmxlLFxuICAgIGludGVyYWN0aW9uLFxuICAgIGVsZW1lbnQsXG4gICAgcmVjdCxcbiAgICBidXR0b25zLFxuICB9XG5cbiAgc2NvcGUuZmlyZSgnYXV0by1zdGFydDpjaGVjaycsIGFyZylcblxuICByZXR1cm4gYXJnLmFjdGlvblxufVxuXG5mdW5jdGlvbiBzdHlsZUN1cnNvciAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlKTogYm9vbGVhblxuZnVuY3Rpb24gc3R5bGVDdXJzb3IgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU6IGJvb2xlYW4pOiB0eXBlb2YgdGhpc1xuZnVuY3Rpb24gc3R5bGVDdXJzb3IgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgbmV3VmFsdWU/OiBib29sZWFuKSB7XG4gIGlmIChpcy5ib29sKG5ld1ZhbHVlKSkge1xuICAgIHRoaXMub3B0aW9ucy5zdHlsZUN1cnNvciA9IG5ld1ZhbHVlXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgaWYgKG5ld1ZhbHVlID09PSBudWxsKSB7XG4gICAgZGVsZXRlIHRoaXMub3B0aW9ucy5zdHlsZUN1cnNvclxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMuc3R5bGVDdXJzb3Jcbn1cblxuZnVuY3Rpb24gYWN0aW9uQ2hlY2tlciAodGhpczogSW50ZXJhY3QuSW50ZXJhY3RhYmxlLCBjaGVja2VyOiBhbnkpIHtcbiAgaWYgKGlzLmZ1bmMoY2hlY2tlcikpIHtcbiAgICB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlciA9IGNoZWNrZXJcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoY2hlY2tlciA9PT0gbnVsbCkge1xuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlclxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB0aGlzLm9wdGlvbnMuYWN0aW9uQ2hlY2tlclxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnYXV0by1zdGFydC9pbnRlcmFjdGFibGVNZXRob2RzJyxcbiAgaW5zdGFsbCxcbn1cbiIsImltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2luZGV4J1xuaW1wb3J0IEludGVyYWN0YWJsZU1ldGhvZHMgZnJvbSAnLi9JbnRlcmFjdGFibGVNZXRob2RzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvaW50ZXJhY3QvaW5kZXgnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0U3RhdGljIHtcbiAgICBtYXhJbnRlcmFjdGlvbnM6IChuZXdWYWx1ZTogYW55KSA9PiBhbnlcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2NvcGUge1xuICAgIGF1dG9TdGFydDogQXV0b1N0YXJ0XG4gICAgbWF4SW50ZXJhY3Rpb25zOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICB9XG5cbiAgaW50ZXJmYWNlIFNpZ25hbEFyZ3Mge1xuICAgICdhdXRvU3RhcnQ6YmVmb3JlLXN0YXJ0JzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXVxuICAgICdhdXRvU3RhcnQ6cHJlcGFyZWQnOiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9XG4gICAgJ2F1dG8tc3RhcnQ6Y2hlY2snOiBDaGVja1NpZ25hbEFyZ1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBCYXNlRGVmYXVsdHMge1xuICAgIGFjdGlvbkNoZWNrZXI/OiBhbnlcbiAgICBjdXJzb3JDaGVja2VyPzogYW55XG4gICAgc3R5bGVDdXJzb3I/OiBhbnlcbiAgfVxuXG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgbWFudWFsU3RhcnQ/OiBib29sZWFuXG4gICAgbWF4PzogbnVtYmVyXG4gICAgbWF4UGVyRWxlbWVudD86IG51bWJlclxuICAgIGFsbG93RnJvbT86IHN0cmluZyB8IEludGVyYWN0LkVsZW1lbnRcbiAgICBpZ25vcmVGcm9tPzogc3RyaW5nIHwgSW50ZXJhY3QuRWxlbWVudFxuICAgIGN1cnNvckNoZWNrZXI/OiBJbnRlcmFjdC5DdXJzb3JDaGVja2VyXG5cbiAgICAvLyBvbmx5IGFsbG93IGxlZnQgYnV0dG9uIGJ5IGRlZmF1bHRcbiAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9ucyNSZXR1cm5fdmFsdWVcbiAgICBtb3VzZUJ1dHRvbnM/OiAwIHwgMSB8IDIgfCA0IHwgMTZcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2hlY2tTaWduYWxBcmcge1xuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZVxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudFxuICBhY3Rpb246IEludGVyYWN0LkFjdGlvblByb3BzXG4gIGJ1dHRvbnM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TdGFydCB7XG4gIC8vIEFsbG93IHRoaXMgbWFueSBpbnRlcmFjdGlvbnMgdG8gaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gIG1heEludGVyYWN0aW9uczogbnVtYmVyXG4gIHdpdGhpbkludGVyYWN0aW9uTGltaXQ6IHR5cGVvZiB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0XG4gIGN1cnNvckVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlcmFjdCxcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKEludGVyYWN0YWJsZU1ldGhvZHMpXG5cbiAgZGVmYXVsdHMuYmFzZS5hY3Rpb25DaGVja2VyID0gbnVsbFxuICBkZWZhdWx0cy5iYXNlLnN0eWxlQ3Vyc29yID0gdHJ1ZVxuXG4gIHV0aWxzLmV4dGVuZChkZWZhdWx0cy5wZXJBY3Rpb24sIHtcbiAgICBtYW51YWxTdGFydDogZmFsc2UsXG4gICAgbWF4OiBJbmZpbml0eSxcbiAgICBtYXhQZXJFbGVtZW50OiAxLFxuICAgIGFsbG93RnJvbTogIG51bGwsXG4gICAgaWdub3JlRnJvbTogbnVsbCxcblxuICAgIC8vIG9ubHkgYWxsb3cgbGVmdCBidXR0b24gYnkgZGVmYXVsdFxuICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTW91c2VFdmVudC9idXR0b25zI1JldHVybl92YWx1ZVxuICAgIG1vdXNlQnV0dG9uczogMSxcbiAgfSlcblxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGludGVyYWN0aW9ucyBhbGxvd2VkLiAgQnlcbiAgICogZGVmYXVsdCBvbmx5IDEgaW50ZXJhY3Rpb24gaXMgYWxsb3dlZCBhdCBhIHRpbWUgKGZvciBiYWNrd2FyZHNcbiAgICogY29tcGF0aWJpbGl0eSkuIFRvIGFsbG93IG11bHRpcGxlIGludGVyYWN0aW9ucyBvbiB0aGUgc2FtZSBJbnRlcmFjdGFibGVzIGFuZFxuICAgKiBlbGVtZW50cywgeW91IG5lZWQgdG8gZW5hYmxlIGl0IGluIHRoZSBkcmFnZ2FibGUsIHJlc2l6YWJsZSBhbmQgZ2VzdHVyYWJsZVxuICAgKiBgJ21heCdgIGFuZCBgJ21heFBlckVsZW1lbnQnYCBvcHRpb25zLlxuICAgKlxuICAgKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0Lm1heEludGVyYWN0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW25ld1ZhbHVlXSBBbnkgbnVtYmVyLiBuZXdWYWx1ZSA8PSAwIG1lYW5zIG5vIGludGVyYWN0aW9ucy5cbiAgICovXG4gIGludGVyYWN0Lm1heEludGVyYWN0aW9ucyA9IG5ld1ZhbHVlID0+IG1heEludGVyYWN0aW9ucyhuZXdWYWx1ZSwgc2NvcGUpXG5cbiAgc2NvcGUuYXV0b1N0YXJ0ID0ge1xuICAgIC8vIEFsbG93IHRoaXMgbWFueSBpbnRlcmFjdGlvbnMgdG8gaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gICAgbWF4SW50ZXJhY3Rpb25zOiBJbmZpbml0eSxcbiAgICB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0LFxuICAgIGN1cnNvckVsZW1lbnQ6IG51bGwsXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZU9uRG93biAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IH06IEludGVyYWN0LlNpZ25hbEFyZ3NbJ2ludGVyYWN0aW9uczpkb3duJ10sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBpZiAoaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSkgeyByZXR1cm4gfVxuXG4gIGNvbnN0IGFjdGlvbkluZm8gPSBnZXRBY3Rpb25JbmZvKGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHNjb3BlKVxuICBwcmVwYXJlKGludGVyYWN0aW9uLCBhY3Rpb25JbmZvLCBzY29wZSlcbn1cblxuZnVuY3Rpb24gcHJlcGFyZU9uTW92ZSAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IH06IEludGVyYWN0LlNpZ25hbEFyZ3NbJ2ludGVyYWN0aW9uczptb3ZlJ10sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBpZiAoaW50ZXJhY3Rpb24ucG9pbnRlclR5cGUgIT09ICdtb3VzZScgfHxcbiAgICAgIGludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24gfHxcbiAgICAgIGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHsgcmV0dXJuIH1cblxuICBjb25zdCBhY3Rpb25JbmZvID0gZ2V0QWN0aW9uSW5mbyhpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnQsIHNjb3BlKVxuICBwcmVwYXJlKGludGVyYWN0aW9uLCBhY3Rpb25JbmZvLCBzY29wZSlcbn1cblxuZnVuY3Rpb24gc3RhcnRPbk1vdmUgKGFyZzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGFyZ1xuXG4gIGlmICghaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93biB8fFxuICAgICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKSB8fFxuICAgICAgIWludGVyYWN0aW9uLnBvaW50ZXJXYXNNb3ZlZCB8fFxuICAgICAgIWludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNjb3BlLmZpcmUoJ2F1dG9TdGFydDpiZWZvcmUtc3RhcnQnLCBhcmcpXG5cbiAgY29uc3QgeyBpbnRlcmFjdGFibGUgfSA9IGludGVyYWN0aW9uXG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lXG5cbiAgaWYgKGFjdGlvbk5hbWUgJiYgaW50ZXJhY3RhYmxlKSB7XG4gICAgLy8gY2hlY2sgbWFudWFsU3RhcnQgYW5kIGludGVyYWN0aW9uIGxpbWl0XG4gICAgaWYgKGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbk5hbWVdLm1hbnVhbFN0YXJ0IHx8XG4gICAgICAgICF3aXRoaW5JbnRlcmFjdGlvbkxpbWl0KGludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudCwgaW50ZXJhY3Rpb24ucHJlcGFyZWQsIHNjb3BlKSkge1xuICAgICAgaW50ZXJhY3Rpb24uc3RvcCgpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaW50ZXJhY3Rpb24uc3RhcnQoaW50ZXJhY3Rpb24ucHJlcGFyZWQsIGludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudClcbiAgICAgIHNldEludGVyYWN0aW9uQ3Vyc29yKGludGVyYWN0aW9uLCBzY29wZSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJDdXJzb3JPblN0b3AgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHsgaW50ZXJhY3RhYmxlIH0gPSBpbnRlcmFjdGlvblxuXG4gIGlmIChpbnRlcmFjdGFibGUgJiYgaW50ZXJhY3RhYmxlLm9wdGlvbnMuc3R5bGVDdXJzb3IpIHtcbiAgICBzZXRDdXJzb3IoaW50ZXJhY3Rpb24uZWxlbWVudCwgJycsIHNjb3BlKVxuICB9XG59XG5cbi8vIENoZWNrIGlmIHRoZSBjdXJyZW50IGludGVyYWN0YWJsZSBzdXBwb3J0cyB0aGUgYWN0aW9uLlxuLy8gSWYgc28sIHJldHVybiB0aGUgdmFsaWRhdGVkIGFjdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbFxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpb248VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+IChcbiAgYWN0aW9uOiBJbnRlcmFjdC5BY3Rpb25Qcm9wczxUPixcbiAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUsXG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGlmIChpbnRlcmFjdGFibGUudGVzdElnbm9yZUFsbG93KGludGVyYWN0YWJsZS5vcHRpb25zW2FjdGlvbi5uYW1lXSwgZWxlbWVudCwgZXZlbnRUYXJnZXQpICYmXG4gICAgICBpbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb24ubmFtZV0uZW5hYmxlZCAmJlxuICAgICAgd2l0aGluSW50ZXJhY3Rpb25MaW1pdChpbnRlcmFjdGFibGUsIGVsZW1lbnQsIGFjdGlvbiwgc2NvcGUpKSB7XG4gICAgcmV0dXJuIGFjdGlvblxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNYXRjaGVzIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gIG1hdGNoZXM6IEludGVyYWN0LkludGVyYWN0YWJsZVtdLFxuICBtYXRjaEVsZW1lbnRzOiBJbnRlcmFjdC5FbGVtZW50W10sXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtYXRjaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2ldXG4gICAgY29uc3QgbWF0Y2hFbGVtZW50ID0gbWF0Y2hFbGVtZW50c1tpXVxuICAgIGNvbnN0IG1hdGNoQWN0aW9uID0gbWF0Y2guZ2V0QWN0aW9uKHBvaW50ZXIsIGV2ZW50LCBpbnRlcmFjdGlvbiwgbWF0Y2hFbGVtZW50KVxuXG4gICAgaWYgKCFtYXRjaEFjdGlvbikgeyBjb250aW51ZSB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSB2YWxpZGF0ZUFjdGlvbihcbiAgICAgIG1hdGNoQWN0aW9uLFxuICAgICAgbWF0Y2gsXG4gICAgICBtYXRjaEVsZW1lbnQsXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHNjb3BlKVxuXG4gICAgaWYgKGFjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBpbnRlcmFjdGFibGU6IG1hdGNoLFxuICAgICAgICBlbGVtZW50OiBtYXRjaEVsZW1lbnQsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBudWxsLCBpbnRlcmFjdGFibGU6IG51bGwsIGVsZW1lbnQ6IG51bGwgfVxufVxuXG5mdW5jdGlvbiBnZXRBY3Rpb25JbmZvIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSxcbiAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUsXG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldCxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGxldCBtYXRjaGVzOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVbXSA9IFtdXG4gIGxldCBtYXRjaEVsZW1lbnRzOiBJbnRlcmFjdC5FbGVtZW50W10gPSBbXVxuXG4gIGxldCBlbGVtZW50ID0gZXZlbnRUYXJnZXQgYXMgSW50ZXJhY3QuRWxlbWVudFxuXG4gIGZ1bmN0aW9uIHB1c2hNYXRjaGVzIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSkge1xuICAgIG1hdGNoZXMucHVzaChpbnRlcmFjdGFibGUpXG4gICAgbWF0Y2hFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gIH1cblxuICB3aGlsZSAodXRpbHMuaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIG1hdGNoZXMgPSBbXVxuICAgIG1hdGNoRWxlbWVudHMgPSBbXVxuXG4gICAgc2NvcGUuaW50ZXJhY3RhYmxlcy5mb3JFYWNoTWF0Y2goZWxlbWVudCwgcHVzaE1hdGNoZXMpXG5cbiAgICBjb25zdCBhY3Rpb25JbmZvID0gdmFsaWRhdGVNYXRjaGVzKGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgbWF0Y2hlcywgbWF0Y2hFbGVtZW50cywgZXZlbnRUYXJnZXQsIHNjb3BlKVxuXG4gICAgaWYgKGFjdGlvbkluZm8uYWN0aW9uICYmXG4gICAgICAhYWN0aW9uSW5mby5pbnRlcmFjdGFibGUub3B0aW9uc1thY3Rpb25JbmZvLmFjdGlvbi5uYW1lXS5tYW51YWxTdGFydCkge1xuICAgICAgcmV0dXJuIGFjdGlvbkluZm9cbiAgICB9XG5cbiAgICBlbGVtZW50ID0gdXRpbHMuZG9tLnBhcmVudE5vZGUoZWxlbWVudCkgYXMgSW50ZXJhY3QuRWxlbWVudFxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBudWxsLCBpbnRlcmFjdGFibGU6IG51bGwsIGVsZW1lbnQ6IG51bGwgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlIChcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICB7IGFjdGlvbiwgaW50ZXJhY3RhYmxlLCBlbGVtZW50IH06IHtcbiAgICBhY3Rpb246IEludGVyYWN0LkFjdGlvblByb3BzXG4gICAgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGVcbiAgICBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50XG4gIH0sXG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZSxcbikge1xuICBhY3Rpb24gPSBhY3Rpb24gfHwgeyBuYW1lOiBudWxsIH1cblxuICBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUgPSBpbnRlcmFjdGFibGVcbiAgaW50ZXJhY3Rpb24uZWxlbWVudCA9IGVsZW1lbnRcbiAgdXRpbHMuY29weUFjdGlvbihpbnRlcmFjdGlvbi5wcmVwYXJlZCwgYWN0aW9uKVxuXG4gIGludGVyYWN0aW9uLnJlY3QgPSBpbnRlcmFjdGFibGUgJiYgYWN0aW9uLm5hbWVcbiAgICA/IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQpXG4gICAgOiBudWxsXG5cbiAgc2V0SW50ZXJhY3Rpb25DdXJzb3IoaW50ZXJhY3Rpb24sIHNjb3BlKVxuXG4gIHNjb3BlLmZpcmUoJ2F1dG9TdGFydDpwcmVwYXJlZCcsIHsgaW50ZXJhY3Rpb24gfSlcbn1cblxuZnVuY3Rpb24gd2l0aGluSW50ZXJhY3Rpb25MaW1pdDxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKFxuICBpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSxcbiAgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCxcbiAgYWN0aW9uOiBJbnRlcmFjdC5BY3Rpb25Qcm9wczxUPixcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGFibGUub3B0aW9uc1xuICBjb25zdCBtYXhBY3Rpb25zID0gb3B0aW9uc1thY3Rpb24ubmFtZV0ubWF4XG4gIGNvbnN0IG1heFBlckVsZW1lbnQgPSBvcHRpb25zW2FjdGlvbi5uYW1lXS5tYXhQZXJFbGVtZW50XG4gIGNvbnN0IGF1dG9TdGFydE1heCA9IHNjb3BlLmF1dG9TdGFydC5tYXhJbnRlcmFjdGlvbnNcbiAgbGV0IGFjdGl2ZUludGVyYWN0aW9ucyA9IDBcbiAgbGV0IGludGVyYWN0YWJsZUNvdW50ID0gMFxuICBsZXQgZWxlbWVudENvdW50ID0gMFxuXG4gIC8vIG5vIGFjdGlvbnMgaWYgYW55IG9mIHRoZXNlIHZhbHVlcyA9PSAwXG4gIGlmICghKG1heEFjdGlvbnMgJiYgbWF4UGVyRWxlbWVudCAmJiBhdXRvU3RhcnRNYXgpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgIGNvbnN0IG90aGVyQWN0aW9uID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuXG4gICAgaWYgKCFpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpKSB7IGNvbnRpbnVlIH1cblxuICAgIGFjdGl2ZUludGVyYWN0aW9ucysrXG5cbiAgICBpZiAoYWN0aXZlSW50ZXJhY3Rpb25zID49IGF1dG9TdGFydE1heCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLmludGVyYWN0YWJsZSAhPT0gaW50ZXJhY3RhYmxlKSB7IGNvbnRpbnVlIH1cblxuICAgIGludGVyYWN0YWJsZUNvdW50ICs9IG90aGVyQWN0aW9uID09PSBhY3Rpb24ubmFtZSA/IDEgOiAwXG5cbiAgICBpZiAoaW50ZXJhY3RhYmxlQ291bnQgPj0gbWF4QWN0aW9ucykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGludGVyYWN0aW9uLmVsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnRDb3VudCsrXG5cbiAgICAgIGlmIChvdGhlckFjdGlvbiA9PT0gYWN0aW9uLm5hbWUgJiYgZWxlbWVudENvdW50ID49IG1heFBlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF1dG9TdGFydE1heCA+IDBcbn1cblxuZnVuY3Rpb24gbWF4SW50ZXJhY3Rpb25zIChuZXdWYWx1ZTogYW55LCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgaWYgKHV0aWxzLmlzLm51bWJlcihuZXdWYWx1ZSkpIHtcbiAgICBzY29wZS5hdXRvU3RhcnQubWF4SW50ZXJhY3Rpb25zID0gbmV3VmFsdWVcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICByZXR1cm4gc2NvcGUuYXV0b1N0YXJ0Lm1heEludGVyYWN0aW9uc1xufVxuXG5mdW5jdGlvbiBzZXRDdXJzb3IgKGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIGN1cnNvcjogc3RyaW5nLCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgY29uc3QgeyBjdXJzb3JFbGVtZW50OiBwcmV2Q3Vyc29yRWxlbWVudCB9ID0gc2NvcGUuYXV0b1N0YXJ0XG5cbiAgaWYgKHByZXZDdXJzb3JFbGVtZW50ICYmIHByZXZDdXJzb3JFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgcHJldkN1cnNvckVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJydcbiAgfVxuXG4gIGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3Vyc29yID0gY3Vyc29yXG4gIGVsZW1lbnQuc3R5bGUuY3Vyc29yID0gY3Vyc29yXG4gIHNjb3BlLmF1dG9TdGFydC5jdXJzb3JFbGVtZW50ID0gY3Vyc29yID8gZWxlbWVudCA6IG51bGxcbn1cblxuZnVuY3Rpb24gc2V0SW50ZXJhY3Rpb25DdXJzb3I8VCBleHRlbmRzIEludGVyYWN0LkFjdGlvbk5hbWU+IChpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb248VD4sIHNjb3BlOiBJbnRlcmFjdC5TY29wZSkge1xuICBjb25zdCB7IGludGVyYWN0YWJsZSwgZWxlbWVudCwgcHJlcGFyZWQgfSA9IGludGVyYWN0aW9uXG5cbiAgaWYgKCEoaW50ZXJhY3Rpb24ucG9pbnRlclR5cGUgPT09ICdtb3VzZScgJiYgaW50ZXJhY3RhYmxlICYmIGludGVyYWN0YWJsZS5vcHRpb25zLnN0eWxlQ3Vyc29yKSkge1xuICAgIC8vIGNsZWFyIHByZXZpb3VzIHRhcmdldCBlbGVtZW50IGN1cnNvclxuICAgIGlmIChzY29wZS5hdXRvU3RhcnQuY3Vyc29yRWxlbWVudCkge1xuICAgICAgc2V0Q3Vyc29yKHNjb3BlLmF1dG9TdGFydC5jdXJzb3JFbGVtZW50LCAnJywgc2NvcGUpXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgY3Vyc29yID0gJydcblxuICBpZiAocHJlcGFyZWQubmFtZSkge1xuICAgIGNvbnN0IGN1cnNvckNoZWNrZXI6IEludGVyYWN0LkN1cnNvckNoZWNrZXIgPSBpbnRlcmFjdGFibGUub3B0aW9uc1twcmVwYXJlZC5uYW1lXS5jdXJzb3JDaGVja2VyXG5cbiAgICBpZiAodXRpbHMuaXMuZnVuYyhjdXJzb3JDaGVja2VyKSkge1xuICAgICAgY3Vyc29yID0gY3Vyc29yQ2hlY2tlcihwcmVwYXJlZCwgaW50ZXJhY3RhYmxlLCBlbGVtZW50LCBpbnRlcmFjdGlvbi5faW50ZXJhY3RpbmcpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY3Vyc29yID0gc2NvcGUuYWN0aW9ucy5tYXBbcHJlcGFyZWQubmFtZV0uZ2V0Q3Vyc29yKHByZXBhcmVkKVxuICAgIH1cbiAgfVxuXG4gIHNldEN1cnNvcihpbnRlcmFjdGlvbi5lbGVtZW50LCBjdXJzb3IgfHwgJycsIHNjb3BlKVxufVxuXG5jb25zdCBhdXRvU3RhcnQ6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0L2Jhc2UnLFxuICBiZWZvcmU6IFsnYWN0aW9ucycsICdhY3Rpb25zL2RyYWcnLCAnYWN0aW9ucy9yZXNpemUnLCAnYWN0aW9ucy9nZXN0dXJlJ10sXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6ZG93bic6IHByZXBhcmVPbkRvd24sXG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogKGFyZywgc2NvcGUpID0+IHtcbiAgICAgIHByZXBhcmVPbk1vdmUoYXJnLCBzY29wZSlcbiAgICAgIHN0YXJ0T25Nb3ZlKGFyZywgc2NvcGUpXG4gICAgfSxcbiAgICAnaW50ZXJhY3Rpb25zOnN0b3AnOiBjbGVhckN1cnNvck9uU3RvcCxcbiAgfSxcbiAgbWF4SW50ZXJhY3Rpb25zLFxuICB3aXRoaW5JbnRlcmFjdGlvbkxpbWl0LFxuICB2YWxpZGF0ZUFjdGlvbixcbn0gYXMgSW50ZXJhY3QuUGx1Z2luXG5cbmV4cG9ydCBkZWZhdWx0IGF1dG9TdGFydFxuIiwiaW1wb3J0IHsgcGFyZW50Tm9kZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaXMnXG5pbXBvcnQgYXV0b1N0YXJ0IGZyb20gJy4vYmFzZSdcblxuZnVuY3Rpb24gYmVmb3JlU3RhcnQgKHsgaW50ZXJhY3Rpb24sIGV2ZW50VGFyZ2V0LCBkeCwgZHkgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGlmIChpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lICE9PSAnZHJhZycpIHsgcmV0dXJuIH1cblxuICAvLyBjaGVjayBpZiBhIGRyYWcgaXMgaW4gdGhlIGNvcnJlY3QgYXhpc1xuICBjb25zdCBhYnNYID0gTWF0aC5hYnMoZHgpXG4gIGNvbnN0IGFic1kgPSBNYXRoLmFicyhkeSlcbiAgY29uc3QgdGFyZ2V0T3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zLmRyYWdcbiAgY29uc3Qgc3RhcnRBeGlzID0gdGFyZ2V0T3B0aW9ucy5zdGFydEF4aXNcbiAgY29uc3QgY3VycmVudEF4aXMgPSAoYWJzWCA+IGFic1kgPyAneCcgOiBhYnNYIDwgYWJzWSA/ICd5JyA6ICd4eScpXG5cbiAgaW50ZXJhY3Rpb24ucHJlcGFyZWQuYXhpcyA9IHRhcmdldE9wdGlvbnMubG9ja0F4aXMgPT09ICdzdGFydCdcbiAgICA/IGN1cnJlbnRBeGlzWzBdICBhcyAneCcgfCAneScgLy8gYWx3YXlzIGxvY2sgdG8gb25lIGF4aXMgZXZlbiBpZiBjdXJyZW50QXhpcyA9PT0gJ3h5J1xuICAgIDogdGFyZ2V0T3B0aW9ucy5sb2NrQXhpc1xuXG4gIC8vIGlmIHRoZSBtb3ZlbWVudCBpc24ndCBpbiB0aGUgc3RhcnRBeGlzIG9mIHRoZSBpbnRlcmFjdGFibGVcbiAgaWYgKGN1cnJlbnRBeGlzICE9PSAneHknICYmIHN0YXJ0QXhpcyAhPT0gJ3h5JyAmJiBzdGFydEF4aXMgIT09IGN1cnJlbnRBeGlzKSB7XG4gICAgLy8gY2FuY2VsIHRoZSBwcmVwYXJlZCBhY3Rpb25cbiAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gbnVsbFxuXG4gICAgLy8gdGhlbiB0cnkgdG8gZ2V0IGEgZHJhZyBmcm9tIGFub3RoZXIgaW5lcmFjdGFibGVcbiAgICBsZXQgZWxlbWVudCA9IGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnRcblxuICAgIGNvbnN0IGdldERyYWdnYWJsZSA9IGZ1bmN0aW9uIChpbnRlcmFjdGFibGU6IEludGVyYWN0LkludGVyYWN0YWJsZSk6IEludGVyYWN0LkludGVyYWN0YWJsZSB8IHZvaWQge1xuICAgICAgaWYgKGludGVyYWN0YWJsZSA9PT0gaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlKSB7IHJldHVybiB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUub3B0aW9ucy5kcmFnXG5cbiAgICAgIGlmICghb3B0aW9ucy5tYW51YWxTdGFydCAmJlxuICAgICAgICAgIGludGVyYWN0YWJsZS50ZXN0SWdub3JlQWxsb3cob3B0aW9ucywgZWxlbWVudCwgZXZlbnRUYXJnZXQpKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGludGVyYWN0YWJsZS5nZXRBY3Rpb24oXG4gICAgICAgICAgaW50ZXJhY3Rpb24uZG93blBvaW50ZXIsIGludGVyYWN0aW9uLmRvd25FdmVudCwgaW50ZXJhY3Rpb24sIGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKGFjdGlvbiAmJlxuICAgICAgICAgICAgYWN0aW9uLm5hbWUgPT09ICdkcmFnJyAmJlxuICAgICAgICAgICAgY2hlY2tTdGFydEF4aXMoY3VycmVudEF4aXMsIGludGVyYWN0YWJsZSkgJiZcbiAgICAgICAgICAgIGF1dG9TdGFydC52YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgZXZlbnRUYXJnZXQsIHNjb3BlKSkge1xuICAgICAgICAgIHJldHVybiBpbnRlcmFjdGFibGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoZWNrIGFsbCBpbnRlcmFjdGFibGVzXG4gICAgd2hpbGUgKGlzLmVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMuZm9yRWFjaE1hdGNoKGVsZW1lbnQsIGdldERyYWdnYWJsZSlcblxuICAgICAgaWYgKGludGVyYWN0YWJsZSkge1xuICAgICAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gJ2RyYWcnXG4gICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICAgICAgICBpbnRlcmFjdGlvbi5lbGVtZW50ID0gZWxlbWVudFxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50ID0gcGFyZW50Tm9kZShlbGVtZW50KSBhcyBJbnRlcmFjdC5FbGVtZW50XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrU3RhcnRBeGlzIChzdGFydEF4aXM6IHN0cmluZywgaW50ZXJhY3RhYmxlOiBJbnRlcmFjdC5JbnRlcmFjdGFibGUpIHtcbiAgaWYgKCFpbnRlcmFjdGFibGUpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCB0aGlzQXhpcyA9IGludGVyYWN0YWJsZS5vcHRpb25zLmRyYWcuc3RhcnRBeGlzXG5cbiAgcmV0dXJuIChzdGFydEF4aXMgPT09ICd4eScgfHwgdGhpc0F4aXMgPT09ICd4eScgfHwgdGhpc0F4aXMgPT09IHN0YXJ0QXhpcylcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2F1dG8tc3RhcnQvZHJhZ0F4aXMnLFxuICBsaXN0ZW5lcnM6IHsgJ2F1dG9TdGFydDpiZWZvcmUtc3RhcnQnOiBiZWZvcmVTdGFydCB9LFxufVxuIiwiaW1wb3J0IGJhc2VQbHVnaW4gZnJvbSAnLi9iYXNlJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgUGVyQWN0aW9uRGVmYXVsdHMge1xuICAgIGhvbGQ/OiBudW1iZXJcbiAgICBkZWxheT86IG51bWJlclxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgYXV0b1N0YXJ0SG9sZFRpbWVyPzogYW55XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKGJhc2VQbHVnaW4pXG5cbiAgZGVmYXVsdHMucGVyQWN0aW9uLmhvbGQgPSAwXG4gIGRlZmF1bHRzLnBlckFjdGlvbi5kZWxheSA9IDBcbn1cblxuZnVuY3Rpb24gZ2V0SG9sZER1cmF0aW9uIChpbnRlcmFjdGlvbikge1xuICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQgJiYgaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuXG4gIGlmICghYWN0aW9uTmFtZSkgeyByZXR1cm4gbnVsbCB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zXG5cbiAgcmV0dXJuIG9wdGlvbnNbYWN0aW9uTmFtZV0uaG9sZCB8fCBvcHRpb25zW2FjdGlvbk5hbWVdLmRlbGF5XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0L2hvbGQnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmF1dG9TdGFydEhvbGRUaW1lciA9IG51bGxcbiAgICB9LFxuXG4gICAgJ2F1dG9TdGFydDpwcmVwYXJlZCc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGhvbGQgPSBnZXRIb2xkRHVyYXRpb24oaW50ZXJhY3Rpb24pXG5cbiAgICAgIGlmIChob2xkID4gMCkge1xuICAgICAgICBpbnRlcmFjdGlvbi5hdXRvU3RhcnRIb2xkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5zdGFydChpbnRlcmFjdGlvbi5wcmVwYXJlZCwgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLCBpbnRlcmFjdGlvbi5lbGVtZW50KVxuICAgICAgICB9LCBob2xkKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOm1vdmUnOiAoeyBpbnRlcmFjdGlvbiwgZHVwbGljYXRlIH0pID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyV2FzTW92ZWQgJiYgIWR1cGxpY2F0ZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaW50ZXJhY3Rpb24uYXV0b1N0YXJ0SG9sZFRpbWVyKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBwcmV2ZW50IHJlZ3VsYXIgZG93bi0+bW92ZSBhdXRvU3RhcnRcbiAgICAnYXV0b1N0YXJ0OmJlZm9yZS1zdGFydCc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGhvbGQgPSBnZXRIb2xkRHVyYXRpb24oaW50ZXJhY3Rpb24pXG5cbiAgICAgIGlmIChob2xkID4gMCkge1xuICAgICAgICBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID0gbnVsbFxuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGdldEhvbGREdXJhdGlvbixcbn1cbiIsImltcG9ydCBhdXRvU3RhcnQgZnJvbSAnLi9iYXNlJ1xuaW1wb3J0IGRyYWdBeGlzIGZyb20gJy4vZHJhZ0F4aXMnXG5pbXBvcnQgaG9sZCBmcm9tICcuL2hvbGQnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdhdXRvLXN0YXJ0JyxcbiAgaW5zdGFsbCAoc2NvcGUpIHtcbiAgICBzY29wZS51c2VQbHVnaW4oYXV0b1N0YXJ0KVxuICAgIHNjb3BlLnVzZVBsdWdpbihob2xkKVxuICAgIHNjb3BlLnVzZVBsdWdpbihkcmFnQXhpcylcbiAgfSxcbn1cblxuZXhwb3J0IHtcbiAgYXV0b1N0YXJ0LFxuICBob2xkLFxuICBkcmFnQXhpcyxcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbi8qIGdsb2JhbCBwcm9jZXNzICovXG5pbXBvcnQgZG9tT2JqZWN0cyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21PYmplY3RzJ1xuaW1wb3J0IHsgcGFyZW50Tm9kZSB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2RvbVV0aWxzJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBpcyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pcydcbmltcG9ydCB3aW4gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvd2luZG93J1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2NvcGUge1xuICAgIGxvZ2dlcjogTG9nZ2VyXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnIHtcbiAgaW50ZXJmYWNlIEJhc2VEZWZhdWx0cyB7XG4gICAgZGV2VG9vbHM/OiBEZXZUb29sc09wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0YWJsZSB7XG4gICAgZGV2VG9vbHM/OiBJbnRlcmFjdC5PcHRpb25NZXRob2Q8RGV2VG9vbHNPcHRpb25zPlxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2VG9vbHNPcHRpb25zIHtcbiAgaWdub3JlOiB7IFtQIGluIGtleW9mIHR5cGVvZiBDaGVja05hbWVdPzogYm9vbGVhbiB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgd2FybjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG4gIGVycm9yOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbiAgbG9nOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGVjayB7XG4gIG5hbWU6IENoZWNrTmFtZVxuICB0ZXh0OiBzdHJpbmdcbiAgcGVyZm9ybTogKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikgPT4gYm9vbGVhblxuICBnZXRJbmZvOiAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uKSA9PiBhbnlbXVxufVxuXG5lbnVtIENoZWNrTmFtZSB7XG4gIHRvdWNoQWN0aW9uID0gJ3RvdWNoQWN0aW9uJyxcbiAgYm94U2l6aW5nID0gJ2JveFNpemluZycsXG4gIG5vTGlzdGVuZXJzID0gJ25vTGlzdGVuZXJzJyxcbn1cblxuY29uc3QgcHJlZml4ICA9ICdbaW50ZXJhY3QuanNdICdcbmNvbnN0IGxpbmtzID0ge1xuICB0b3VjaEFjdGlvbjogJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy90b3VjaC1hY3Rpb24nLFxuICBib3hTaXppbmc6ICdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYm94LXNpemluZycsXG59XG5cbmNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbidcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5mdW5jdGlvbiBpbnN0YWxsIChzY29wZTogSW50ZXJhY3QuU2NvcGUsIHsgbG9nZ2VyIH06IHsgbG9nZ2VyPzogTG9nZ2VyIH0gPSB7fSkge1xuICBjb25zdCB7XG4gICAgSW50ZXJhY3RhYmxlLFxuICAgIGRlZmF1bHRzLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS5sb2dnZXIgPSBsb2dnZXIgfHwgY29uc29sZVxuXG4gIGRlZmF1bHRzLmJhc2UuZGV2VG9vbHMgPSB7XG4gICAgaWdub3JlOiB7fSxcbiAgfVxuXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUuZGV2VG9vbHMgPSBmdW5jdGlvbiAob3B0aW9ucz86IG9iamVjdCkge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBleHRlbmQodGhpcy5vcHRpb25zLmRldlRvb2xzLCBvcHRpb25zKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRldlRvb2xzXG4gIH1cbn1cblxuY29uc3QgY2hlY2tzOiBDaGVja1tdID0gW1xuICB7XG4gICAgbmFtZTogQ2hlY2tOYW1lLnRvdWNoQWN0aW9uLFxuICAgIHBlcmZvcm0gKHsgZWxlbWVudCB9KSB7XG4gICAgICByZXR1cm4gIXBhcmVudEhhc1N0eWxlKGVsZW1lbnQsICd0b3VjaEFjdGlvbicsIC9wYW4tfHBpbmNofG5vbmUvKVxuICAgIH0sXG4gICAgZ2V0SW5mbyAoeyBlbGVtZW50IH0pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGxpbmtzLnRvdWNoQWN0aW9uLFxuICAgICAgXVxuICAgIH0sXG4gICAgdGV4dDogJ0NvbnNpZGVyIGFkZGluZyBDU1MgXCJ0b3VjaC1hY3Rpb246IG5vbmVcIiB0byB0aGlzIGVsZW1lbnRcXG4nLFxuICB9LFxuXG4gIHtcbiAgICBuYW1lOiBDaGVja05hbWUuYm94U2l6aW5nLFxuICAgIHBlcmZvcm0gKGludGVyYWN0aW9uKSB7XG4gICAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGludGVyYWN0aW9uXG5cbiAgICAgIHJldHVybiBpbnRlcmFjdGlvbi5wcmVwYXJlZC5uYW1lID09PSAncmVzaXplJyAmJlxuICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgZG9tT2JqZWN0cy5IVE1MRWxlbWVudCAmJlxuICAgICAgICAhaGFzU3R5bGUoZWxlbWVudCwgJ2JveFNpemluZycsIC9ib3JkZXItYm94LylcbiAgICB9LFxuICAgIHRleHQ6ICdDb25zaWRlciBhZGRpbmcgQ1NTIFwiYm94LXNpemluZzogYm9yZGVyLWJveFwiIHRvIHRoaXMgcmVzaXphYmxlIGVsZW1lbnQnLFxuICAgIGdldEluZm8gKHsgZWxlbWVudCB9KSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBlbGVtZW50LFxuICAgICAgICBsaW5rcy5ib3hTaXppbmcsXG4gICAgICBdXG4gICAgfSxcbiAgfSxcblxuICB7XG4gICAgbmFtZTogQ2hlY2tOYW1lLm5vTGlzdGVuZXJzLFxuICAgIHBlcmZvcm0gKGludGVyYWN0aW9uKSB7XG4gICAgICBjb25zdCBhY3Rpb25OYW1lID0gaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZVxuICAgICAgY29uc3QgbW92ZUxpc3RlbmVycyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5ldmVudHMudHlwZXNbYCR7YWN0aW9uTmFtZX1tb3ZlYF0gfHwgW11cblxuICAgICAgcmV0dXJuICFtb3ZlTGlzdGVuZXJzLmxlbmd0aFxuICAgIH0sXG4gICAgZ2V0SW5mbyAoaW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUsXG4gICAgICAgIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSxcbiAgICAgIF1cbiAgICB9LFxuICAgIHRleHQ6ICdUaGVyZSBhcmUgbm8gbGlzdGVuZXJzIHNldCBmb3IgdGhpcyBhY3Rpb24nLFxuICB9LFxuXVxuXG5mdW5jdGlvbiBoYXNTdHlsZSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIHByb3A6IGtleW9mIENTU1N0eWxlRGVjbGFyYXRpb24sIHN0eWxlUmU6IFJlZ0V4cCkge1xuICByZXR1cm4gc3R5bGVSZS50ZXN0KGVsZW1lbnQuc3R5bGVbcHJvcF0gfHwgd2luLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW3Byb3BdKVxufVxuXG5mdW5jdGlvbiBwYXJlbnRIYXNTdHlsZSAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCwgcHJvcDoga2V5b2YgQ1NTU3R5bGVEZWNsYXJhdGlvbiwgc3R5bGVSZTogUmVnRXhwKSB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50IGFzIEhUTUxFbGVtZW50XG5cbiAgd2hpbGUgKGlzLmVsZW1lbnQocGFyZW50KSkge1xuICAgIGlmIChoYXNTdHlsZShwYXJlbnQsIHByb3AsIHN0eWxlUmUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudE5vZGUocGFyZW50KSBhcyBIVE1MRWxlbWVudFxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IGlkID0gJ2Rldi10b29scydcbmNvbnN0IGRlZmF1bHRFeHBvcnQ6IEludGVyYWN0LlBsdWdpbiA9IGlzUHJvZHVjdGlvblxuICA/IHsgaWQsIGluc3RhbGw6ICgpID0+IHt9IH1cbiAgOiB7XG4gICAgaWQsXG4gICAgaW5zdGFsbCxcbiAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLXN0YXJ0JzogKHsgaW50ZXJhY3Rpb24gfSwgc2NvcGUpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiBjaGVja3MpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlICYmIGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zXG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKG9wdGlvbnMgJiYgb3B0aW9ucy5kZXZUb29scyAmJiBvcHRpb25zLmRldlRvb2xzLmlnbm9yZVtjaGVjay5uYW1lXSkgJiZcbiAgICAgICAgICAgIGNoZWNrLnBlcmZvcm0oaW50ZXJhY3Rpb24pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzY29wZS5sb2dnZXIud2FybihwcmVmaXggKyBjaGVjay50ZXh0LCAuLi5jaGVjay5nZXRJbmZvKGludGVyYWN0aW9uKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBjaGVja3MsXG4gICAgQ2hlY2tOYW1lLFxuICAgIGxpbmtzLFxuICAgIHByZWZpeCxcbiAgfVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0XG4iLCJpbXBvcnQgY2xvbmUgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvY2xvbmUnXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXIsIE1vZGlmaWVyQXJnLCBNb2RpZmllclN0YXRlIH0gZnJvbSAnLi9iYXNlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWNhdGlvblJlc3VsdCB7XG4gIGRlbHRhOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0RGVsdGE6IEludGVyYWN0LlJlY3RcbiAgY29vcmRzOiBJbnRlcmFjdC5Qb2ludFxuICByZWN0OiBJbnRlcmFjdC5GdWxsUmVjdFxuICBldmVudFByb3BzOiBhbnlbXVxuICBjaGFuZ2VkOiBib29sZWFuXG59XG5cbmludGVyZmFjZSBNZXRob2RBcmcge1xuICBwaGFzZTogSW50ZXJhY3QuRXZlbnRQaGFzZVxuICBwYWdlQ29vcmRzPzogSW50ZXJhY3QuUG9pbnRcbiAgcmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHByZUVuZD86IGJvb2xlYW5cbiAgc2tpcE1vZGlmaWVycz86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2RpZmljYXRpb24ge1xuICBzdGF0ZXM6IE1vZGlmaWVyU3RhdGVbXSA9IFtdXG4gIHN0YXJ0T2Zmc2V0OiBJbnRlcmFjdC5SZWN0ID0geyBsZWZ0OiAwLCByaWdodDogMCwgdG9wOiAwLCBib3R0b206IDAgfVxuICBzdGFydERlbHRhOiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgcmVzdWx0PzogTW9kaWZpY2F0aW9uUmVzdWx0ID0gbnVsbFxuICBlbmRSZXN1bHQ/OiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgZWRnZXM6IEludGVyYWN0LkVkZ2VPcHRpb25zXG5cbiAgY29uc3RydWN0b3IgKHJlYWRvbmx5IGludGVyYWN0aW9uOiBSZWFkb25seTxJbnRlcmFjdC5JbnRlcmFjdGlvbj4pIHtcbiAgICB0aGlzLnJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpXG4gIH1cblxuICBzdGFydCAoXG4gICAgeyBwaGFzZSB9OiBNZXRob2RBcmcsXG4gICAgcGFnZUNvb3JkczogSW50ZXJhY3QuUG9pbnQsXG4gICkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCBtb2RpZmllckxpc3QgPSBnZXRNb2RpZmllckxpc3QoaW50ZXJhY3Rpb24pXG4gICAgdGhpcy5wcmVwYXJlU3RhdGVzKG1vZGlmaWVyTGlzdClcblxuICAgIHRoaXMuZWRnZXMgPSBleHRlbmQoe30sIGludGVyYWN0aW9uLmVkZ2VzKVxuICAgIHRoaXMuc3RhcnRPZmZzZXQgPSBnZXRSZWN0T2Zmc2V0KGludGVyYWN0aW9uLnJlY3QsIHBhZ2VDb29yZHMpXG4gICAgdGhpcy5zdGFydERlbHRhID0geyB4OiAwLCB5OiAwIH1cblxuICAgIGNvbnN0IGFyZzogTWV0aG9kQXJnID0ge1xuICAgICAgcGhhc2UsXG4gICAgICBwYWdlQ29vcmRzLFxuICAgICAgcHJlRW5kOiBmYWxzZSxcbiAgICB9XG5cbiAgICB0aGlzLnJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpXG4gICAgdGhpcy5zdGFydEFsbChhcmcpXG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdCA9IHRoaXMuc2V0QWxsKGFyZylcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZpbGxBcmcgKGFyZzogUGFydGlhbDxNb2RpZmllckFyZz4pIHtcbiAgICBjb25zdCB7IGludGVyYWN0aW9uIH0gPSB0aGlzXG5cbiAgICBhcmcuaW50ZXJhY3Rpb24gPSBpbnRlcmFjdGlvblxuICAgIGFyZy5pbnRlcmFjdGFibGUgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGVcbiAgICBhcmcuZWxlbWVudCA9IGludGVyYWN0aW9uLmVsZW1lbnRcbiAgICBhcmcucmVjdCA9IGFyZy5yZWN0IHx8IGludGVyYWN0aW9uLnJlY3RcbiAgICBhcmcuZWRnZXMgPSB0aGlzLmVkZ2VzXG4gICAgYXJnLnN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldFxuICB9XG5cbiAgc3RhcnRBbGwgKGFyZzogTWV0aG9kQXJnICYgUGFydGlhbDxNb2RpZmllckFyZz4pIHtcbiAgICB0aGlzLmZpbGxBcmcoYXJnKVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgaWYgKHN0YXRlLm1ldGhvZHMuc3RhcnQpIHtcbiAgICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgICAgc3RhdGUubWV0aG9kcy5zdGFydChhcmcgYXMgTW9kaWZpZXJBcmcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QWxsIChhcmc6IE1ldGhvZEFyZyAmIFBhcnRpYWw8TW9kaWZpZXJBcmc+KTogTW9kaWZpY2F0aW9uUmVzdWx0IHtcbiAgICB0aGlzLmZpbGxBcmcoYXJnKVxuXG4gICAgY29uc3Qge1xuICAgICAgcGhhc2UsXG4gICAgICBwcmVFbmQsXG4gICAgICBza2lwTW9kaWZpZXJzLFxuICAgICAgcmVjdDogdW5tb2RpZmllZFJlY3QsXG4gICAgfSA9IGFyZ1xuXG4gICAgYXJnLmNvb3JkcyA9IGV4dGVuZCh7fSwgYXJnLnBhZ2VDb29yZHMpXG4gICAgYXJnLnJlY3QgPSBleHRlbmQoe30sIHVubW9kaWZpZWRSZWN0KVxuXG4gICAgY29uc3Qgc3RhdGVzID0gc2tpcE1vZGlmaWVyc1xuICAgICAgPyB0aGlzLnN0YXRlcy5zbGljZShza2lwTW9kaWZpZXJzKVxuICAgICAgOiB0aGlzLnN0YXRlc1xuXG4gICAgY29uc3QgbmV3UmVzdWx0ID0gY3JlYXRlUmVzdWx0KGFyZy5jb29yZHMsIGFyZy5yZWN0KVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiBzdGF0ZXMpIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcbiAgICAgIGNvbnN0IGxhc3RNb2RpZmllckNvb3JkcyA9IGV4dGVuZCh7fSwgYXJnLmNvb3JkcylcbiAgICAgIGxldCByZXR1cm5WYWx1ZSA9IG51bGxcblxuICAgICAgaWYgKHN0YXRlLm1ldGhvZHMuc2V0ICYmIHRoaXMuc2hvdWxkRG8ob3B0aW9ucywgcHJlRW5kLCBwaGFzZSkpIHtcbiAgICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBzdGF0ZS5tZXRob2RzLnNldChhcmcgYXMgTW9kaWZpZXJBcmcpXG5cbiAgICAgICAgcmVjdFV0aWxzLmFkZEVkZ2VzKHRoaXMuaW50ZXJhY3Rpb24uZWRnZXMsIGFyZy5yZWN0LCB7IHg6IGFyZy5jb29yZHMueCAtIGxhc3RNb2RpZmllckNvb3Jkcy54LCB5OiBhcmcuY29vcmRzLnkgLSBsYXN0TW9kaWZpZXJDb29yZHMueSB9KVxuICAgICAgfVxuXG4gICAgICBuZXdSZXN1bHQuZXZlbnRQcm9wcy5wdXNoKHJldHVyblZhbHVlKVxuICAgIH1cblxuICAgIG5ld1Jlc3VsdC5kZWx0YS54ID0gYXJnLmNvb3Jkcy54IC0gYXJnLnBhZ2VDb29yZHMueFxuICAgIG5ld1Jlc3VsdC5kZWx0YS55ID0gYXJnLmNvb3Jkcy55IC0gYXJnLnBhZ2VDb29yZHMueVxuXG4gICAgbmV3UmVzdWx0LnJlY3REZWx0YS5sZWZ0ICAgPSBhcmcucmVjdC5sZWZ0IC0gdW5tb2RpZmllZFJlY3QubGVmdFxuICAgIG5ld1Jlc3VsdC5yZWN0RGVsdGEucmlnaHQgID0gYXJnLnJlY3QucmlnaHQgLSB1bm1vZGlmaWVkUmVjdC5yaWdodFxuICAgIG5ld1Jlc3VsdC5yZWN0RGVsdGEudG9wICAgID0gYXJnLnJlY3QudG9wIC0gdW5tb2RpZmllZFJlY3QudG9wXG4gICAgbmV3UmVzdWx0LnJlY3REZWx0YS5ib3R0b20gPSBhcmcucmVjdC5ib3R0b20gLSB1bm1vZGlmaWVkUmVjdC5ib3R0b21cblxuICAgIGNvbnN0IHByZXZDb29yZHMgPSB0aGlzLnJlc3VsdC5jb29yZHNcbiAgICBjb25zdCBwcmV2UmVjdCA9IHRoaXMucmVzdWx0LnJlY3RcblxuICAgIGlmIChwcmV2Q29vcmRzICYmIHByZXZSZWN0KSB7XG4gICAgICBjb25zdCByZWN0Q2hhbmdlZCA9IG5ld1Jlc3VsdC5yZWN0LmxlZnQgIT09IHByZXZSZWN0LmxlZnQgfHxcbiAgICAgICAgbmV3UmVzdWx0LnJlY3QucmlnaHQgIT09IHByZXZSZWN0LnJpZ2h0IHx8XG4gICAgICAgIG5ld1Jlc3VsdC5yZWN0LnRvcCAhPT0gcHJldlJlY3QudG9wIHx8XG4gICAgICAgIG5ld1Jlc3VsdC5yZWN0LmJvdHRvbSAhPT0gcHJldlJlY3QuYm90dG9tXG5cbiAgICAgIG5ld1Jlc3VsdC5jaGFuZ2VkID0gcmVjdENoYW5nZWQgfHxcbiAgICAgICAgcHJldkNvb3Jkcy54ICE9PSBuZXdSZXN1bHQuY29vcmRzLnggfHxcbiAgICAgICAgcHJldkNvb3Jkcy55ICE9PSBuZXdSZXN1bHQuY29vcmRzLnlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3UmVzdWx0XG4gIH1cblxuICBhcHBseVRvSW50ZXJhY3Rpb24gKGFyZzogeyBwaGFzZTogSW50ZXJhY3QuRXZlbnRQaGFzZSwgcmVjdD86IEludGVyYWN0LlJlY3QgfSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCB7IHBoYXNlIH0gPSBhcmdcbiAgICBjb25zdCBjdXJDb29yZHMgPSBpbnRlcmFjdGlvbi5jb29yZHMuY3VyXG4gICAgY29uc3Qgc3RhcnRDb29yZHMgPSBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnRcbiAgICBjb25zdCB7IHJlc3VsdCwgc3RhcnREZWx0YSB9ID0gdGhpc1xuICAgIGNvbnN0IGN1ckRlbHRhID0gcmVzdWx0LmRlbHRhXG5cbiAgICBpZiAocGhhc2UgPT09ICdzdGFydCcpIHtcbiAgICAgIGV4dGVuZCh0aGlzLnN0YXJ0RGVsdGEsIHJlc3VsdC5kZWx0YSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb29yZHNTZXQsIGRlbHRhXSBvZiBbW3N0YXJ0Q29vcmRzLCBzdGFydERlbHRhXSwgW2N1ckNvb3JkcywgY3VyRGVsdGFdXSBhcyBjb25zdCkge1xuICAgICAgY29vcmRzU2V0LnBhZ2UueCAgICs9IGRlbHRhLnhcbiAgICAgIGNvb3Jkc1NldC5wYWdlLnkgICArPSBkZWx0YS55XG4gICAgICBjb29yZHNTZXQuY2xpZW50LnggKz0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LmNsaWVudC55ICs9IGRlbHRhLnlcbiAgICB9XG5cbiAgICBjb25zdCB7IHJlY3REZWx0YSB9ID0gdGhpcy5yZXN1bHRcbiAgICBjb25zdCByZWN0ID0gYXJnLnJlY3QgfHwgaW50ZXJhY3Rpb24ucmVjdFxuXG4gICAgcmVjdC5sZWZ0ICAgKz0gcmVjdERlbHRhLmxlZnRcbiAgICByZWN0LnJpZ2h0ICArPSByZWN0RGVsdGEucmlnaHRcbiAgICByZWN0LnRvcCAgICArPSByZWN0RGVsdGEudG9wXG4gICAgcmVjdC5ib3R0b20gKz0gcmVjdERlbHRhLmJvdHRvbVxuXG4gICAgcmVjdC53aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnRcbiAgICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgfVxuXG4gIHNldEFuZEFwcGx5IChhcmc6IFBhcnRpYWw8SW50ZXJhY3QuRG9BbnlQaGFzZUFyZz4gJiB7XG4gICAgcGhhc2U6IEludGVyYWN0LkV2ZW50UGhhc2VcbiAgICBwcmVFbmQ/OiBib29sZWFuXG4gICAgc2tpcE1vZGlmaWVycz86IG51bWJlclxuICAgIG1vZGlmaWVkQ29vcmRzPzogSW50ZXJhY3QuUG9pbnRcbiAgfSk6IHZvaWQgfCBmYWxzZSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdGlvbiB9ID0gdGhpc1xuICAgIGNvbnN0IHsgcGhhc2UsIHByZUVuZCwgc2tpcE1vZGlmaWVycyB9ID0gYXJnXG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNldEFsbCh7XG4gICAgICBwcmVFbmQsXG4gICAgICBwaGFzZSxcbiAgICAgIHBhZ2VDb29yZHM6IGFyZy5tb2RpZmllZENvb3JkcyB8fCBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnBhZ2UsXG4gICAgfSlcblxuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0XG5cbiAgICAvLyBkb24ndCBmaXJlIGFuIGFjdGlvbiBtb3ZlIGlmIGEgbW9kaWZpZXIgd291bGQga2VlcCB0aGUgZXZlbnQgaW4gdGhlIHNhbWVcbiAgICAvLyBjb3JkaW5hdGVzIGFzIGJlZm9yZVxuICAgIGlmICghcmVzdWx0LmNoYW5nZWQgJiYgKCFza2lwTW9kaWZpZXJzIHx8IHNraXBNb2RpZmllcnMgPCB0aGlzLnN0YXRlcy5sZW5ndGgpICYmIGludGVyYWN0aW9uLmludGVyYWN0aW5nKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChhcmcubW9kaWZpZWRDb29yZHMpIHtcbiAgICAgIGNvbnN0IHsgcGFnZSB9ID0gaW50ZXJhY3Rpb24uY29vcmRzLmN1clxuICAgICAgY29uc3QgYWRqdXN0bWVudCA9IHtcbiAgICAgICAgeDogYXJnLm1vZGlmaWVkQ29vcmRzLnggLSBwYWdlLngsXG4gICAgICAgIHk6IGFyZy5tb2RpZmllZENvb3Jkcy55IC0gcGFnZS55LFxuICAgICAgfVxuXG4gICAgICByZXN1bHQuY29vcmRzLnggKz0gYWRqdXN0bWVudC54XG4gICAgICByZXN1bHQuY29vcmRzLnkgKz0gYWRqdXN0bWVudC55XG4gICAgICByZXN1bHQuZGVsdGEueCArPSBhZGp1c3RtZW50LnhcbiAgICAgIHJlc3VsdC5kZWx0YS55ICs9IGFkanVzdG1lbnQueVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlUb0ludGVyYWN0aW9uKGFyZylcbiAgfVxuXG4gIGJlZm9yZUVuZCAoYXJnOiBPbWl0PEludGVyYWN0LkRvQW55UGhhc2VBcmcsICdpRXZlbnQnPiAmIHsgc3RhdGU/OiBNb2RpZmllclN0YXRlIH0pOiB2b2lkIHwgZmFsc2Uge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGV2ZW50IH0gPSBhcmdcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0YXRlc1xuXG4gICAgaWYgKCFzdGF0ZXMgfHwgIXN0YXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBkb1ByZWVuZCA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHN0YXRlcykge1xuICAgICAgYXJnLnN0YXRlID0gc3RhdGVcbiAgICAgIGNvbnN0IHsgb3B0aW9ucywgbWV0aG9kcyB9ID0gc3RhdGVcblxuICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBtZXRob2RzLmJlZm9yZUVuZCAmJiBtZXRob2RzLmJlZm9yZUVuZChhcmcgYXMgdW5rbm93biBhcyBNb2RpZmllckFyZylcblxuICAgICAgaWYgKGVuZFBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZW5kUmVzdWx0ID0gZW5kUG9zaXRpb25cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGRvUHJlZW5kID0gZG9QcmVlbmQgfHwgKCFkb1ByZWVuZCAmJiB0aGlzLnNob3VsZERvKG9wdGlvbnMsIHRydWUsIGFyZy5waGFzZSwgdHJ1ZSkpXG4gICAgfVxuXG4gICAgaWYgKGRvUHJlZW5kKSB7XG4gICAgICAvLyB0cmlnZ2VyIGEgZmluYWwgbW9kaWZpZWQgbW92ZSBiZWZvcmUgZW5kaW5nXG4gICAgICBpbnRlcmFjdGlvbi5tb3ZlKHsgZXZlbnQsIHByZUVuZDogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIHN0b3AgKGFyZzogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IGFyZ1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlcyB8fCAhdGhpcy5zdGF0ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBtb2RpZmllckFyZzogUGFydGlhbDxNb2RpZmllckFyZz4gPSBleHRlbmQoe1xuICAgICAgc3RhdGVzOiB0aGlzLnN0YXRlcyxcbiAgICAgIGludGVyYWN0YWJsZTogaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlLFxuICAgICAgZWxlbWVudDogaW50ZXJhY3Rpb24uZWxlbWVudCxcbiAgICAgIHJlY3Q6IG51bGwsXG4gICAgfSwgYXJnKVxuXG4gICAgdGhpcy5maWxsQXJnKG1vZGlmaWVyQXJnKVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiB0aGlzLnN0YXRlcykge1xuICAgICAgbW9kaWZpZXJBcmcuc3RhdGUgPSBzdGF0ZVxuXG4gICAgICBpZiAoc3RhdGUubWV0aG9kcy5zdG9wKSB7IHN0YXRlLm1ldGhvZHMuc3RvcChtb2RpZmllckFyZyBhcyBNb2RpZmllckFyZykgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGVzID0gbnVsbFxuICAgIHRoaXMuZW5kUmVzdWx0ID0gbnVsbFxuICB9XG5cbiAgcHJlcGFyZVN0YXRlcyAobW9kaWZpZXJMaXN0OiBNb2RpZmllcltdKSB7XG4gICAgdGhpcy5zdGF0ZXMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1vZGlmaWVyTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucywgbWV0aG9kcywgbmFtZSB9ID0gbW9kaWZpZXJMaXN0W2luZGV4XVxuXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVuYWJsZWQgPT09IGZhbHNlKSB7IGNvbnRpbnVlIH1cblxuICAgICAgdGhpcy5zdGF0ZXMucHVzaCh7XG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIG1ldGhvZHMsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBuYW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZXNcbiAgfVxuXG4gIHJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyAoeyBpbnRlcmFjdGlvbjogeyBjb29yZHMsIHJlY3QsIG1vZGlmaWNhdGlvbiB9IH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgICBpZiAoIW1vZGlmaWNhdGlvbi5yZXN1bHQpIHsgcmV0dXJuIH1cblxuICAgIGNvbnN0IHsgc3RhcnREZWx0YSB9ID0gbW9kaWZpY2F0aW9uXG4gICAgY29uc3QgeyBkZWx0YTogY3VyRGVsdGEsIHJlY3REZWx0YSB9ID0gbW9kaWZpY2F0aW9uLnJlc3VsdFxuXG4gICAgY29uc3QgY29vcmRzQW5kRGVsdGFzID0gW1xuICAgICAgW2Nvb3Jkcy5zdGFydCwgc3RhcnREZWx0YV0sXG4gICAgICBbY29vcmRzLmN1ciwgY3VyRGVsdGFdLFxuICAgIF1cblxuICAgIGZvciAoY29uc3QgW2Nvb3Jkc1NldCwgZGVsdGFdIG9mIGNvb3Jkc0FuZERlbHRhcyBhcyBhbnkpIHtcbiAgICAgIGNvb3Jkc1NldC5wYWdlLnggLT0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LnBhZ2UueSAtPSBkZWx0YS55XG4gICAgICBjb29yZHNTZXQuY2xpZW50LnggLT0gZGVsdGEueFxuICAgICAgY29vcmRzU2V0LmNsaWVudC55IC09IGRlbHRhLnlcbiAgICB9XG5cbiAgICByZWN0LmxlZnQgLT0gcmVjdERlbHRhLmxlZnRcbiAgICByZWN0LnJpZ2h0IC09IHJlY3REZWx0YS5yaWdodFxuICAgIHJlY3QudG9wIC09IHJlY3REZWx0YS50b3BcbiAgICByZWN0LmJvdHRvbSAtPSByZWN0RGVsdGEuYm90dG9tXG4gIH1cblxuICBzaG91bGREbyAob3B0aW9ucywgcHJlRW5kPzogYm9vbGVhbiwgcGhhc2U/OiBzdHJpbmcsIHJlcXVpcmVFbmRPbmx5PzogYm9vbGVhbikge1xuICAgIGlmIChcbiAgICAgIC8vIGlnbm9yZSBkaXNhYmxlZCBtb2RpZmllcnNcbiAgICAgICghb3B0aW9ucyB8fCBvcHRpb25zLmVuYWJsZWQgPT09IGZhbHNlKSB8fFxuICAgICAgLy8gY2hlY2sgaWYgd2UgcmVxdWlyZSBlbmRPbmx5IG9wdGlvbiB0byBmaXJlIG1vdmUgYmVmb3JlIGVuZFxuICAgICAgKHJlcXVpcmVFbmRPbmx5ICYmICFvcHRpb25zLmVuZE9ubHkpIHx8XG4gICAgICAvLyBkb24ndCBhcHBseSBlbmRPbmx5IG1vZGlmaWVycyB3aGVuIG5vdCBlbmRpbmdcbiAgICAgIChvcHRpb25zLmVuZE9ubHkgJiYgIXByZUVuZCkgfHxcbiAgICAgIC8vIGNoZWNrIGlmIG1vZGlmaWVyIHNob3VsZCBydW4gYmUgYXBwbGllZCBvbiBzdGFydFxuICAgICAgKHBoYXNlID09PSAnc3RhcnQnICYmICFvcHRpb25zLnNldFN0YXJ0KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvcHlGcm9tIChvdGhlcjogTW9kaWZpY2F0aW9uKSB7XG4gICAgdGhpcy5zdGFydE9mZnNldCA9IG90aGVyLnN0YXJ0T2Zmc2V0XG4gICAgdGhpcy5zdGFydERlbHRhID0gb3RoZXIuc3RhcnREZWx0YVxuICAgIHRoaXMuZWRnZXMgPSBvdGhlci5lZGdlc1xuICAgIHRoaXMuc3RhdGVzID0gb3RoZXIuc3RhdGVzLm1hcChzID0+IGNsb25lKHMpIGFzIE1vZGlmaWVyU3RhdGUpXG4gICAgdGhpcy5yZXN1bHQgPSBjcmVhdGVSZXN1bHQoZXh0ZW5kKHt9LCBvdGhlci5yZXN1bHQuY29vcmRzKSwgZXh0ZW5kKHt9LCBvdGhlci5yZXN1bHQucmVjdCkpXG4gIH1cblxuICBkZXN0cm95ICgpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcykge1xuICAgICAgdGhpc1twcm9wXSA9IG51bGxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVzdWx0IChjb29yZHM/OiBJbnRlcmFjdC5Qb2ludCwgcmVjdD86IEludGVyYWN0LkZ1bGxSZWN0KTogTW9kaWZpY2F0aW9uUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICByZWN0LFxuICAgIGNvb3JkcyxcbiAgICBkZWx0YTogeyB4OiAwLCB5OiAwIH0sXG4gICAgcmVjdERlbHRhOiB7XG4gICAgICBsZWZ0ICA6IDAsXG4gICAgICByaWdodCA6IDAsXG4gICAgICB0b3AgICA6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgfSxcbiAgICBldmVudFByb3BzOiBbXSxcbiAgICBjaGFuZ2VkOiB0cnVlLFxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyTGlzdCAoaW50ZXJhY3Rpb24pIHtcbiAgY29uc3QgYWN0aW9uT3B0aW9ucyA9IGludGVyYWN0aW9uLmludGVyYWN0YWJsZS5vcHRpb25zW2ludGVyYWN0aW9uLnByZXBhcmVkLm5hbWVdXG4gIGNvbnN0IGFjdGlvbk1vZGlmaWVycyA9IGFjdGlvbk9wdGlvbnMubW9kaWZpZXJzXG5cbiAgaWYgKGFjdGlvbk1vZGlmaWVycyAmJiBhY3Rpb25Nb2RpZmllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFjdGlvbk1vZGlmaWVycy5maWx0ZXIoXG4gICAgICBtb2RpZmllciA9PiAhbW9kaWZpZXIub3B0aW9ucyB8fCBtb2RpZmllci5vcHRpb25zLmVuYWJsZWQgIT09IGZhbHNlLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBbJ3NuYXAnLCAnc25hcFNpemUnLCAnc25hcEVkZ2VzJywgJ3Jlc3RyaWN0JywgJ3Jlc3RyaWN0RWRnZXMnLCAncmVzdHJpY3RTaXplJ11cbiAgICAubWFwKHR5cGUgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGFjdGlvbk9wdGlvbnNbdHlwZV1cblxuICAgICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5lbmFibGVkICYmIHtcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgbWV0aG9kczogb3B0aW9ucy5fbWV0aG9kcyxcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIobSA9PiAhIW0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN0T2Zmc2V0IChyZWN0LCBjb29yZHMpIHtcbiAgcmV0dXJuIHJlY3RcbiAgICA/IHtcbiAgICAgIGxlZnQgIDogY29vcmRzLnggLSByZWN0LmxlZnQsXG4gICAgICB0b3AgICA6IGNvb3Jkcy55IC0gcmVjdC50b3AsXG4gICAgICByaWdodCA6IHJlY3QucmlnaHQgIC0gY29vcmRzLngsXG4gICAgICBib3R0b206IHJlY3QuYm90dG9tIC0gY29vcmRzLnksXG4gICAgfVxuICAgIDoge1xuICAgICAgbGVmdCAgOiAwLFxuICAgICAgdG9wICAgOiAwLFxuICAgICAgcmlnaHQgOiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgIH1cbn1cbiIsImltcG9ydCBNb2RpZmljYXRpb24gZnJvbSAnLi9Nb2RpZmljYXRpb24nXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgbW9kaWZpY2F0aW9uPzogTW9kaWZpY2F0aW9uXG4gIH1cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RFdmVudCcge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RFdmVudCB7XG4gICAgbW9kaWZpZXJzPzogQXJyYXk8e1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9PlxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgbW9kaWZpZXJzPzogTW9kaWZpZXJbXVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZXI8XG4gIERlZmF1bHRzID0gYW55LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUgPSBhbnksXG4gIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBhbnlcbj4ge1xuICBvcHRpb25zPzogRGVmYXVsdHNcbiAgbWV0aG9kczoge1xuICAgIHN0YXJ0PzogKGFyZzogTW9kaWZpZXJBcmc8U3RhdGU+KSA9PiB2b2lkXG4gICAgc2V0OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IHZvaWRcbiAgICBiZWZvcmVFbmQ/OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IEludGVyYWN0LlBvaW50IHwgdm9pZFxuICAgIHN0b3A/OiAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pID0+IHZvaWRcbiAgfVxuICBuYW1lPzogTmFtZVxufVxuXG5leHBvcnQgdHlwZSBNb2RpZmllclN0YXRlPFxuICBEZWZhdWx0cyA9IHt9LFxuICBTdGF0ZVByb3BzIGV4dGVuZHMgeyBbcHJvcDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgTmFtZSBleHRlbmRzIHN0cmluZyA9IGFueVxuPiA9IHtcbiAgb3B0aW9uczogRGVmYXVsdHNcbiAgbWV0aG9kcz86IE1vZGlmaWVyPERlZmF1bHRzPlsnbWV0aG9kcyddXG4gIGluZGV4PzogbnVtYmVyXG4gIG5hbWU/OiBOYW1lXG59ICYgU3RhdGVQcm9wc1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWVyQXJnPFN0YXRlIGV4dGVuZHMgTW9kaWZpZXJTdGF0ZSA9IE1vZGlmaWVyU3RhdGU+IHtcbiAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uXG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3QuSW50ZXJhY3RhYmxlXG4gIHBoYXNlOiBJbnRlcmFjdC5FdmVudFBoYXNlXG4gIHJlY3Q6IEludGVyYWN0LkZ1bGxSZWN0XG4gIGVkZ2VzOiBJbnRlcmFjdC5FZGdlT3B0aW9uc1xuICBzdGF0ZT86IFN0YXRlXG4gIGVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnRcbiAgcGFnZUNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHByZXZDb29yZHM/OiBJbnRlcmFjdC5Qb2ludFxuICBwcmV2UmVjdD86IEludGVyYWN0LkZ1bGxSZWN0XG4gIGNvb3Jkcz86IEludGVyYWN0LlBvaW50XG4gIHN0YXJ0T2Zmc2V0PzogSW50ZXJhY3QuUmVjdFxuICBwcmVFbmQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZXJNb2R1bGU8XG4gIERlZmF1bHRzIGV4dGVuZHMgeyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUsXG4+IHtcbiAgZGVmYXVsdHM/OiBEZWZhdWx0c1xuICBzdGFydD8gKGFyZzogTW9kaWZpZXJBcmc8U3RhdGU+KTogdm9pZFxuICBzZXQ/IChhcmc6IE1vZGlmaWVyQXJnPFN0YXRlPik6IGFueVxuICBiZWZvcmVFbmQ/IChhcmc6IE1vZGlmaWVyQXJnPFN0YXRlPik6IEludGVyYWN0LlBvaW50IHwgdm9pZFxuICBzdG9wPyAoYXJnOiBNb2RpZmllckFyZzxTdGF0ZT4pOiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTW9kaWZpZXI8XG4gIERlZmF1bHRzIGV4dGVuZHMgeyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICBTdGF0ZSBleHRlbmRzIE1vZGlmaWVyU3RhdGUsXG4gIE5hbWUgZXh0ZW5kcyBzdHJpbmdcbj4gKFxuICBtb2R1bGU6IE1vZGlmaWVyTW9kdWxlPERlZmF1bHRzLCBTdGF0ZT4sXG4gIG5hbWU/OiBOYW1lLFxuKSB7XG4gIGNvbnN0IHsgZGVmYXVsdHMgfSA9IG1vZHVsZVxuICBjb25zdCBtZXRob2RzID0ge1xuICAgIHN0YXJ0OiBtb2R1bGUuc3RhcnQsXG4gICAgc2V0OiBtb2R1bGUuc2V0LFxuICAgIGJlZm9yZUVuZDogbW9kdWxlLmJlZm9yZUVuZCxcbiAgICBzdG9wOiBtb2R1bGUuc3RvcCxcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVyID0gKF9vcHRpb25zPzogUGFydGlhbDxEZWZhdWx0cz4pID0+IHtcbiAgICBjb25zdCBvcHRpb25zOiBEZWZhdWx0cyA9IChfb3B0aW9ucyB8fCB7fSkgYXMgRGVmYXVsdHNcblxuICAgIG9wdGlvbnMuZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2VcblxuICAgIC8vIGFkZCBtaXNzaW5nIGRlZmF1bHRzIHRvIG9wdGlvbnNcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGVmYXVsdHMpIHtcbiAgICAgIGlmICghKHByb3AgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IGRlZmF1bHRzW3Byb3BdXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbTogTW9kaWZpZXI8RGVmYXVsdHMsIFN0YXRlLCBOYW1lPiA9IHsgb3B0aW9ucywgbWV0aG9kcywgbmFtZSB9XG5cbiAgICByZXR1cm4gbVxuICB9XG5cbiAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZm9yIGJhY2t3cmFkcyBjb21wYXRpYmlsaXR5XG4gICAgbW9kaWZpZXIuX2RlZmF1bHRzID0gZGVmYXVsdHNcbiAgICBtb2RpZmllci5fbWV0aG9kcyA9IG1ldGhvZHNcbiAgfVxuXG4gIHJldHVybiBtb2RpZmllclxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRXZlbnRNb2RpZmllcnMgKHsgaUV2ZW50LCBpbnRlcmFjdGlvbjogeyBtb2RpZmljYXRpb246IHsgcmVzdWx0IH0gfSB9OiB7XG4gIGlFdmVudDogSW50ZXJhY3QuSW50ZXJhY3RFdmVudDxJbnRlcmFjdC5BY3Rpb25OYW1lLCBJbnRlcmFjdC5FdmVudFBoYXNlPlxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb25cbn0pIHtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGlFdmVudC5tb2RpZmllcnMgPSByZXN1bHQuZXZlbnRQcm9wc1xuICB9XG59XG5cbmNvbnN0IG1vZGlmaWVyc0Jhc2U6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdtb2RpZmllcnMvYmFzZScsXG4gIGluc3RhbGw6IHNjb3BlID0+IHtcbiAgICBzY29wZS5kZWZhdWx0cy5wZXJBY3Rpb24ubW9kaWZpZXJzID0gW11cbiAgfSxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGlvbi5tb2RpZmljYXRpb24gPSBuZXcgTW9kaWZpY2F0aW9uKGludGVyYWN0aW9uKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tc3RhcnQnOiBhcmcgPT4ge1xuICAgICAgY29uc3QgeyBtb2RpZmljYXRpb24gfSA9IGFyZy5pbnRlcmFjdGlvblxuXG4gICAgICBtb2RpZmljYXRpb24uc3RhcnQoYXJnLCBhcmcuaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UpXG4gICAgICBhcmcuaW50ZXJhY3Rpb24uZWRnZXMgPSBtb2RpZmljYXRpb24uZWRnZXNcbiAgICAgIG1vZGlmaWNhdGlvbi5hcHBseVRvSW50ZXJhY3Rpb24oYXJnKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnNldEFuZEFwcGx5KGFyZyksXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uYmVmb3JlRW5kKGFyZyksXG5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1zdGFydCc6IGFkZEV2ZW50TW9kaWZpZXJzLFxuICAgICdpbnRlcmFjdGlvbnM6YWN0aW9uLW1vdmUnOiBhZGRFdmVudE1vZGlmaWVycyxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1lbmQnOiBhZGRFdmVudE1vZGlmaWVycyxcblxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXN0YXJ0JzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24ucmVzdG9yZUludGVyYWN0aW9uQ29vcmRzKGFyZyksXG4gICAgJ2ludGVyYWN0aW9uczphZnRlci1hY3Rpb24tbW92ZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uc3RvcChhcmcpLFxuICB9LFxuICBiZWZvcmU6IFsnYWN0aW9ucycsICdhY3Rpb24vZHJhZycsICdhY3Rpb25zL3Jlc2l6ZScsICdhY3Rpb25zL2dlc3R1cmUnXSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbW9kaWZpZXJzQmFzZVxuIiwiaW1wb3J0IHsgX1Byb3h5TWV0aG9kcyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgKiBhcyByZWN0VXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmVjdCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nIHtcbiAgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICBvZmZzZXRCeT86IHR5cGVvZiBvZmZzZXRCeVxuICAgIG9mZnNldDoge1xuICAgICAgdG90YWw6IEludGVyYWN0LlBvaW50XG4gICAgICBwZW5kaW5nOiBJbnRlcmFjdC5Qb2ludFxuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgZW51bSBfUHJveHlNZXRob2RzIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgb2Zmc2V0QnkgPSAnJ1xuICB9XG59XG5cbihfUHJveHlNZXRob2RzIGFzIGFueSkub2Zmc2V0QnkgPSAnJ1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkVG90YWwgKGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICBpZiAoIWludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24pIHsgcmV0dXJuIH1cblxuICBhZGRUb0Nvb3JkcyhpbnRlcmFjdGlvbi5jb29yZHMuY3VyLCBpbnRlcmFjdGlvbi5vZmZzZXQudG90YWwpXG5cbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueCA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueSA9IDBcbn1cblxuZnVuY3Rpb24gYmVmb3JlQWN0aW9uICh7IGludGVyYWN0aW9uIH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgYXBwbHlQZW5kaW5nKGludGVyYWN0aW9uKVxufVxuXG5mdW5jdGlvbiBiZWZvcmVFbmQgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSk6IGJvb2xlYW4gfCB2b2lkIHtcbiAgY29uc3QgaGFkUGVuZGluZyA9IGFwcGx5UGVuZGluZyhpbnRlcmFjdGlvbilcblxuICBpZiAoIWhhZFBlbmRpbmcpIHsgcmV0dXJuIH1cblxuICBpbnRlcmFjdGlvbi5tb3ZlKHsgb2Zmc2V0OiB0cnVlIH0pXG4gIGludGVyYWN0aW9uLmVuZCgpXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGVuZCAoeyBpbnRlcmFjdGlvbiB9OiB7IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbiB9KSB7XG4gIGludGVyYWN0aW9uLm9mZnNldC50b3RhbC54ID0gMFxuICBpbnRlcmFjdGlvbi5vZmZzZXQudG90YWwueSA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueCA9IDBcbiAgaW50ZXJhY3Rpb24ub2Zmc2V0LnBlbmRpbmcueSA9IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGVuZGluZyAoaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uKSB7XG4gIGlmICghaGFzUGVuZGluZyhpbnRlcmFjdGlvbikpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IHsgcGVuZGluZyB9ID0gaW50ZXJhY3Rpb24ub2Zmc2V0XG5cbiAgYWRkVG9Db29yZHMoaW50ZXJhY3Rpb24uY29vcmRzLmN1ciwgcGVuZGluZylcbiAgYWRkVG9Db29yZHMoaW50ZXJhY3Rpb24uY29vcmRzLmRlbHRhLCBwZW5kaW5nKVxuICByZWN0VXRpbHMuYWRkRWRnZXMoaW50ZXJhY3Rpb24uZWRnZXMsIGludGVyYWN0aW9uLnJlY3QsIHBlbmRpbmcpXG5cbiAgcGVuZGluZy54ID0gMFxuICBwZW5kaW5nLnkgPSAwXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gb2Zmc2V0QnkgKHRoaXM6IEludGVyYWN0LkludGVyYWN0aW9uLCB7IHgsIHkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgdGhpcy5vZmZzZXQucGVuZGluZy54ICs9IHhcbiAgdGhpcy5vZmZzZXQucGVuZGluZy55ICs9IHlcblxuICB0aGlzLm9mZnNldC50b3RhbC54ICs9IHhcbiAgdGhpcy5vZmZzZXQudG90YWwueSArPSB5XG59XG5cbmZ1bmN0aW9uIGFkZFRvQ29vcmRzICh7IHBhZ2UsIGNsaWVudCB9LCB7IHgsIHkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgcGFnZS54ICs9IHhcbiAgcGFnZS55ICs9IHlcbiAgY2xpZW50LnggKz0geFxuICBjbGllbnQueSArPSB5XG59XG5cbmZ1bmN0aW9uIGhhc1BlbmRpbmcgKGludGVyYWN0aW9uKSB7XG4gIHJldHVybiAhIShpbnRlcmFjdGlvbi5vZmZzZXQucGVuZGluZy54IHx8IGludGVyYWN0aW9uLm9mZnNldC5wZW5kaW5nLnkpXG59XG5cbmNvbnN0IG9mZnNldDogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ29mZnNldCcsXG4gIGluc3RhbGwgKHNjb3BlKSB7XG4gICAgc2NvcGUuSW50ZXJhY3Rpb24ucHJvdG90eXBlLm9mZnNldEJ5ID0gb2Zmc2V0QnlcbiAgfSxcbiAgbGlzdGVuZXJzOiB7XG4gICAgJ2ludGVyYWN0aW9uczpuZXcnOiAoeyBpbnRlcmFjdGlvbiB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGlvbi5vZmZzZXQgPSB7XG4gICAgICAgIHRvdGFsOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgcGVuZGluZzogeyB4OiAwLCB5OiAwIH0sXG4gICAgICB9XG4gICAgfSxcbiAgICAnaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJzogKHsgaW50ZXJhY3Rpb24gfSkgPT4gYWRkVG90YWwoaW50ZXJhY3Rpb24pLFxuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1zdGFydCc6IGJlZm9yZUFjdGlvbixcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tbW92ZSc6IGJlZm9yZUFjdGlvbixcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogYmVmb3JlRW5kLFxuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IGVuZCxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgb2Zmc2V0XG4iLCJpbXBvcnQgKiBhcyBtb2RpZmllcnMgZnJvbSAnQGludGVyYWN0anMvbW9kaWZpZXJzL2Jhc2UnXG5pbXBvcnQgTW9kaWZpY2F0aW9uIGZyb20gJ0BpbnRlcmFjdGpzL21vZGlmaWVycy9Nb2RpZmljYXRpb24nXG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0BpbnRlcmFjdGpzL29mZnNldC9pbmRleCdcbmltcG9ydCAqIGFzIGRvbSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9kb21VdGlscydcbmltcG9ydCBoeXBvdCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9oeXBvdCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IHsgY29weUNvb3JkcyB9IGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3BvaW50ZXJVdGlscydcbmltcG9ydCByYWYgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmFmJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50JyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgaW50ZXJmYWNlIFBoYXNlTWFwIHtcbiAgICByZXN1bWU/OiB0cnVlXG4gICAgaW5lcnRpYXN0YXJ0PzogdHJ1ZVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgaW5lcnRpYT86IEluZXJ0aWFTdGF0ZVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL2RlZmF1bHRPcHRpb25zJyB7XG4gIGludGVyZmFjZSBQZXJBY3Rpb25EZWZhdWx0cyB7XG4gICAgaW5lcnRpYT86IHtcbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICByZXNpc3RhbmNlPzogbnVtYmVyICAgICAgICAvLyB0aGUgbGFtYmRhIGluIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgICBtaW5TcGVlZD86IG51bWJlciAgICAgICAgICAvLyB0YXJnZXQgc3BlZWQgbXVzdCBiZSBhYm92ZSB0aGlzIGZvciBpbmVydGlhIHRvIHN0YXJ0XG4gICAgICBlbmRTcGVlZD86IG51bWJlciAgICAgICAgICAvLyB0aGUgc3BlZWQgYXQgd2hpY2ggaW5lcnRpYSBpcyBzbG93IGVub3VnaCB0byBzdG9wXG4gICAgICBhbGxvd1Jlc3VtZT86IHRydWUgICAgICAgICAvLyBhbGxvdyByZXN1bWluZyBhbiBhY3Rpb24gaW4gaW5lcnRpYSBwaGFzZVxuICAgICAgc21vb3RoRW5kRHVyYXRpb24/OiBudW1iZXIgLy8gYW5pbWF0ZSB0byBzbmFwL3Jlc3RyaWN0IGVuZE9ubHkgaWYgdGhlcmUncyBubyBpbmVydGlhXG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTaWduYWxBcmdzIHtcbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24taW5lcnRpYXN0YXJ0JzogT21pdDxJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdpbmVydGlhc3RhcnQnPiwgJ2lFdmVudCc+XG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24taW5lcnRpYXN0YXJ0JzogSW50ZXJhY3QuRG9QaGFzZUFyZzxJbnRlcmFjdC5BY3Rpb25OYW1lLCAnaW5lcnRpYXN0YXJ0Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFmdGVyLWFjdGlvbi1pbmVydGlhc3RhcnQnOiBJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdpbmVydGlhc3RhcnQnPlxuICAgICdpbnRlcmFjdGlvbnM6YmVmb3JlLWFjdGlvbi1yZXN1bWUnOiBPbWl0PEludGVyYWN0LkRvUGhhc2VBcmc8SW50ZXJhY3QuQWN0aW9uTmFtZSwgJ3Jlc3VtZSc+LCAnaUV2ZW50Jz5cbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1yZXN1bWUnOiBJbnRlcmFjdC5Eb1BoYXNlQXJnPEludGVyYWN0LkFjdGlvbk5hbWUsICdyZXN1bWUnPlxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXJlc3VtZSc6IEludGVyYWN0LkRvUGhhc2VBcmc8SW50ZXJhY3QuQWN0aW9uTmFtZSwgJ3Jlc3VtZSc+XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHtcbiAgICBkZWZhdWx0cyxcbiAgfSA9IHNjb3BlXG5cbiAgc2NvcGUudXNlUGx1Z2luKG9mZnNldClcbiAgc2NvcGUudXNlUGx1Z2luKG1vZGlmaWVycy5kZWZhdWx0KVxuICBzY29wZS5hY3Rpb25zLnBoYXNlcy5pbmVydGlhc3RhcnQgPSB0cnVlXG4gIHNjb3BlLmFjdGlvbnMucGhhc2VzLnJlc3VtZSA9IHRydWVcblxuICBkZWZhdWx0cy5wZXJBY3Rpb24uaW5lcnRpYSA9IHtcbiAgICBlbmFibGVkICAgICAgICAgIDogZmFsc2UsXG4gICAgcmVzaXN0YW5jZSAgICAgICA6IDEwLCAgICAvLyB0aGUgbGFtYmRhIGluIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgbWluU3BlZWQgICAgICAgICA6IDEwMCwgICAvLyB0YXJnZXQgc3BlZWQgbXVzdCBiZSBhYm92ZSB0aGlzIGZvciBpbmVydGlhIHRvIHN0YXJ0XG4gICAgZW5kU3BlZWQgICAgICAgICA6IDEwLCAgICAvLyB0aGUgc3BlZWQgYXQgd2hpY2ggaW5lcnRpYSBpcyBzbG93IGVub3VnaCB0byBzdG9wXG4gICAgYWxsb3dSZXN1bWUgICAgICA6IHRydWUsICAvLyBhbGxvdyByZXN1bWluZyBhbiBhY3Rpb24gaW4gaW5lcnRpYSBwaGFzZVxuICAgIHNtb290aEVuZER1cmF0aW9uOiAzMDAsICAgLy8gYW5pbWF0ZSB0byBzbmFwL3Jlc3RyaWN0IGVuZE9ubHkgaWYgdGhlcmUncyBubyBpbmVydGlhXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZXJ0aWFTdGF0ZSB7XG4gIGFjdGl2ZSA9IGZhbHNlXG4gIGlzTW9kaWZpZWQgPSBmYWxzZVxuICBzbW9vdGhFbmQgPSBmYWxzZVxuICBhbGxvd1Jlc3VtZSA9IGZhbHNlXG5cbiAgbW9kaWZpY2F0aW9uOiBNb2RpZmljYXRpb24gPSBudWxsXG4gIG1vZGlmaWVyQ291bnQgPSAwXG4gIG1vZGlmaWVyQXJnOiBtb2RpZmllcnMuTW9kaWZpZXJBcmcgPSBudWxsXG5cbiAgc3RhcnRDb29yZHM6IEludGVyYWN0LlBvaW50ID0gbnVsbFxuICB0MCA9IDBcbiAgdjAgPSAwXG5cbiAgdGUgPSAwXG4gIHRhcmdldE9mZnNldDogSW50ZXJhY3QuUG9pbnQgPSBudWxsXG4gIG1vZGlmaWVkT2Zmc2V0OiBJbnRlcmFjdC5Qb2ludCA9IG51bGxcbiAgY3VycmVudE9mZnNldDogSW50ZXJhY3QuUG9pbnQgPSBudWxsXG5cbiAgbGFtYmRhX3YwPyA9IDAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgb25lX3ZlX3YwPyA9IDAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgdGltZW91dDogbnVtYmVyID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yIChcbiAgICBwcml2YXRlIHJlYWRvbmx5IGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgKSB7fVxuXG4gIHN0YXJ0IChldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhpbnRlcmFjdGlvbilcblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudDogdmVsb2NpdHlDbGllbnQgfSA9IGludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eVxuICAgIGNvbnN0IHBvaW50ZXJTcGVlZCA9IGh5cG90KHZlbG9jaXR5Q2xpZW50LngsIHZlbG9jaXR5Q2xpZW50LnkpXG4gICAgY29uc3QgbW9kaWZpY2F0aW9uID0gdGhpcy5tb2RpZmljYXRpb24gfHwgKHRoaXMubW9kaWZpY2F0aW9uID0gbmV3IE1vZGlmaWNhdGlvbihpbnRlcmFjdGlvbikpXG5cbiAgICBtb2RpZmljYXRpb24uY29weUZyb20oaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uKVxuXG4gICAgdGhpcy50MCA9IGludGVyYWN0aW9uLl9ub3coKVxuICAgIHRoaXMuYWxsb3dSZXN1bWUgPSBvcHRpb25zLmFsbG93UmVzdW1lXG4gICAgdGhpcy52MCA9IHBvaW50ZXJTcGVlZFxuICAgIHRoaXMuY3VycmVudE9mZnNldCA9IHsgeDogMCwgeTogMCB9XG4gICAgdGhpcy5zdGFydENvb3JkcyA9IGludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZVxuXG4gICAgdGhpcy5tb2RpZmllckFyZyA9IHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgaW50ZXJhY3RhYmxlOiBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsXG4gICAgICBlbGVtZW50OiBpbnRlcmFjdGlvbi5lbGVtZW50LFxuICAgICAgcmVjdDogaW50ZXJhY3Rpb24ucmVjdCxcbiAgICAgIGVkZ2VzOiBpbnRlcmFjdGlvbi5lZGdlcyxcbiAgICAgIHBhZ2VDb29yZHM6IHRoaXMuc3RhcnRDb29yZHMsXG4gICAgICBwcmVFbmQ6IHRydWUsXG4gICAgICBwaGFzZTogJ2luZXJ0aWFzdGFydCcsXG4gICAgfVxuXG4gICAgY29uc3QgdGhyb3duID0gKFxuICAgICAgKHRoaXMudDAgLSBpbnRlcmFjdGlvbi5jb29yZHMuY3VyLnRpbWVTdGFtcCkgPCA1MCAmJlxuICAgICAgcG9pbnRlclNwZWVkID4gb3B0aW9ucy5taW5TcGVlZCAmJlxuICAgICAgcG9pbnRlclNwZWVkID4gb3B0aW9ucy5lbmRTcGVlZFxuICAgIClcblxuICAgIGlmICh0aHJvd24pIHtcbiAgICAgIHRoaXMuc3RhcnRJbmVydGlhKClcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kaWZpY2F0aW9uLnJlc3VsdCA9IG1vZGlmaWNhdGlvbi5zZXRBbGwodGhpcy5tb2RpZmllckFyZylcblxuICAgICAgaWYgKCFtb2RpZmljYXRpb24ucmVzdWx0LmNoYW5nZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhcnRTbW9vdGhFbmQoKVxuICAgIH1cblxuICAgIC8vIGZvcmNlIG1vZGlmaWNhdGlvbiBjaGFuZ2VcbiAgICBpbnRlcmFjdGlvbi5tb2RpZmljYXRpb24ucmVzdWx0LnJlY3QgPSBudWxsXG5cbiAgICAvLyBicmluZyBpbmVydGlhc3RhcnQgZXZlbnQgdG8gdGhlIHRhcmdldCBjb29yZHNcbiAgICBpbnRlcmFjdGlvbi5vZmZzZXRCeSh0aGlzLnRhcmdldE9mZnNldClcbiAgICBpbnRlcmFjdGlvbi5fZG9QaGFzZSh7XG4gICAgICBpbnRlcmFjdGlvbixcbiAgICAgIGV2ZW50LFxuICAgICAgcGhhc2U6ICdpbmVydGlhc3RhcnQnLFxuICAgIH0pXG4gICAgaW50ZXJhY3Rpb24ub2Zmc2V0QnkoeyB4OiAtdGhpcy50YXJnZXRPZmZzZXQueCwgeTogLXRoaXMudGFyZ2V0T2Zmc2V0LnkgfSlcbiAgICAvLyBmb3JjZSBtb2RpZmljYXRpb24gY2hhbmdlXG4gICAgaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3VsdC5yZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlXG4gICAgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiA9IHRoaXNcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzdGFydEluZXJ0aWEgKCkge1xuICAgIGNvbnN0IHN0YXJ0VmVsb2NpdHkgPSB0aGlzLmludGVyYWN0aW9uLmNvb3Jkcy52ZWxvY2l0eS5jbGllbnRcbiAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyh0aGlzLmludGVyYWN0aW9uKVxuICAgIGNvbnN0IGxhbWJkYSA9IG9wdGlvbnMucmVzaXN0YW5jZVxuICAgIGNvbnN0IGluZXJ0aWFEdXIgPSAtTWF0aC5sb2cob3B0aW9ucy5lbmRTcGVlZCAvIHRoaXMudjApIC8gbGFtYmRhXG5cbiAgICB0aGlzLnRhcmdldE9mZnNldCA9IHtcbiAgICAgIHg6IChzdGFydFZlbG9jaXR5LnggLSBpbmVydGlhRHVyKSAvIGxhbWJkYSxcbiAgICAgIHk6IChzdGFydFZlbG9jaXR5LnkgLSBpbmVydGlhRHVyKSAvIGxhbWJkYSxcbiAgICB9XG5cbiAgICB0aGlzLnRlID0gaW5lcnRpYUR1clxuICAgIHRoaXMubGFtYmRhX3YwID0gbGFtYmRhIC8gdGhpcy52MFxuICAgIHRoaXMub25lX3ZlX3YwID0gMSAtIG9wdGlvbnMuZW5kU3BlZWQgLyB0aGlzLnYwXG5cbiAgICBjb25zdCB7IG1vZGlmaWNhdGlvbiwgbW9kaWZpZXJBcmcgfSA9IHRoaXNcblxuICAgIG1vZGlmaWVyQXJnLnBhZ2VDb29yZHMgPSB7XG4gICAgICB4OiB0aGlzLnN0YXJ0Q29vcmRzLnggKyB0aGlzLnRhcmdldE9mZnNldC54LFxuICAgICAgeTogdGhpcy5zdGFydENvb3Jkcy55ICsgdGhpcy50YXJnZXRPZmZzZXQueSxcbiAgICB9XG5cbiAgICBtb2RpZmljYXRpb24ucmVzdWx0ID0gbW9kaWZpY2F0aW9uLnNldEFsbChtb2RpZmllckFyZylcblxuICAgIGlmIChtb2RpZmljYXRpb24ucmVzdWx0LmNoYW5nZWQpIHtcbiAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWVcbiAgICAgIHRoaXMubW9kaWZpZWRPZmZzZXQgPSB7XG4gICAgICAgIHg6IHRoaXMudGFyZ2V0T2Zmc2V0LnggKyBtb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLngsXG4gICAgICAgIHk6IHRoaXMudGFyZ2V0T2Zmc2V0LnkgKyBtb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLnksXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5pbmVydGlhVGljaygpKVxuICB9XG5cbiAgc3RhcnRTbW9vdGhFbmQgKCkge1xuICAgIHRoaXMuc21vb3RoRW5kID0gdHJ1ZVxuICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWVcbiAgICB0aGlzLnRhcmdldE9mZnNldCA9IHtcbiAgICAgIHg6IHRoaXMubW9kaWZpY2F0aW9uLnJlc3VsdC5kZWx0YS54LFxuICAgICAgeTogdGhpcy5tb2RpZmljYXRpb24ucmVzdWx0LmRlbHRhLnksXG4gICAgfVxuXG4gICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5zbW9vdGhFbmRUaWNrKCkpXG4gIH1cblxuICBpbmVydGlhVGljayAoKSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdGlvbiB9ID0gdGhpc1xuICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGludGVyYWN0aW9uKVxuICAgIGNvbnN0IGxhbWJkYSA9IG9wdGlvbnMucmVzaXN0YW5jZVxuICAgIGNvbnN0IHQgPSAoaW50ZXJhY3Rpb24uX25vdygpIC0gdGhpcy50MCkgLyAxMDAwXG5cbiAgICBpZiAodCA8IHRoaXMudGUpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gIDEgLSAoTWF0aC5leHAoLWxhbWJkYSAqIHQpIC0gdGhpcy5sYW1iZGFfdjApIC8gdGhpcy5vbmVfdmVfdjBcbiAgICAgIGxldCBuZXdPZmZzZXQ6IEludGVyYWN0LlBvaW50XG5cbiAgICAgIGlmICh0aGlzLmlzTW9kaWZpZWQpIHtcbiAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0UXVhZHJhdGljQ3VydmVQb2ludChcbiAgICAgICAgICAwLCAwLFxuICAgICAgICAgIHRoaXMudGFyZ2V0T2Zmc2V0LngsIHRoaXMudGFyZ2V0T2Zmc2V0LnksXG4gICAgICAgICAgdGhpcy5tb2RpZmllZE9mZnNldC54LCB0aGlzLm1vZGlmaWVkT2Zmc2V0LnksXG4gICAgICAgICAgcHJvZ3Jlc3MsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBuZXdPZmZzZXQgPSB7XG4gICAgICAgICAgeDogdGhpcy50YXJnZXRPZmZzZXQueCAqIHByb2dyZXNzLFxuICAgICAgICAgIHk6IHRoaXMudGFyZ2V0T2Zmc2V0LnkgKiBwcm9ncmVzcyxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWx0YSA9IHsgeDogbmV3T2Zmc2V0LnggLSB0aGlzLmN1cnJlbnRPZmZzZXQueCwgeTogbmV3T2Zmc2V0LnkgLSB0aGlzLmN1cnJlbnRPZmZzZXQueSB9XG5cbiAgICAgIHRoaXMuY3VycmVudE9mZnNldC54ICs9IGRlbHRhLnhcbiAgICAgIHRoaXMuY3VycmVudE9mZnNldC55ICs9IGRlbHRhLnlcblxuICAgICAgaW50ZXJhY3Rpb24ub2Zmc2V0QnkoZGVsdGEpXG4gICAgICBpbnRlcmFjdGlvbi5tb3ZlKClcblxuICAgICAgdGhpcy50aW1lb3V0ID0gcmFmLnJlcXVlc3QoKCkgPT4gdGhpcy5pbmVydGlhVGljaygpKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KHtcbiAgICAgICAgeDogdGhpcy5tb2RpZmllZE9mZnNldC54IC0gdGhpcy5jdXJyZW50T2Zmc2V0LngsXG4gICAgICAgIHk6IHRoaXMubW9kaWZpZWRPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIHNtb290aEVuZFRpY2sgKCkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcbiAgICBjb25zdCB0ID0gaW50ZXJhY3Rpb24uX25vdygpIC0gdGhpcy50MFxuICAgIGNvbnN0IHsgc21vb3RoRW5kRHVyYXRpb246IGR1cmF0aW9uIH0gPSBnZXRPcHRpb25zKGludGVyYWN0aW9uKVxuXG4gICAgaWYgKHQgPCBkdXJhdGlvbikge1xuICAgICAgY29uc3QgbmV3T2Zmc2V0ID0ge1xuICAgICAgICB4OiBlYXNlT3V0UXVhZCh0LCAwLCB0aGlzLnRhcmdldE9mZnNldC54LCBkdXJhdGlvbiksXG4gICAgICAgIHk6IGVhc2VPdXRRdWFkKHQsIDAsIHRoaXMudGFyZ2V0T2Zmc2V0LnksIGR1cmF0aW9uKSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbHRhID0ge1xuICAgICAgICB4OiBuZXdPZmZzZXQueCAtIHRoaXMuY3VycmVudE9mZnNldC54LFxuICAgICAgICB5OiBuZXdPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRPZmZzZXQueCArPSBkZWx0YS54XG4gICAgICB0aGlzLmN1cnJlbnRPZmZzZXQueSArPSBkZWx0YS55XG5cbiAgICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KGRlbHRhKVxuICAgICAgaW50ZXJhY3Rpb24ubW92ZSh7IHNraXBNb2RpZmllcnM6IHRoaXMubW9kaWZpZXJDb3VudCB9KVxuXG4gICAgICB0aGlzLnRpbWVvdXQgPSByYWYucmVxdWVzdCgoKSA9PiB0aGlzLnNtb290aEVuZFRpY2soKSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpbnRlcmFjdGlvbi5vZmZzZXRCeSh7XG4gICAgICAgIHg6IHRoaXMudGFyZ2V0T2Zmc2V0LnggLSB0aGlzLmN1cnJlbnRPZmZzZXQueCxcbiAgICAgICAgeTogdGhpcy50YXJnZXRPZmZzZXQueSAtIHRoaXMuY3VycmVudE9mZnNldC55LFxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIHJlc3VtZSAoeyBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSkge1xuICAgIGNvbnN0IHsgaW50ZXJhY3Rpb24gfSA9IHRoaXNcblxuICAgIC8vIHVuZG8gaW5lcnRpYSBjaGFuZ2VzIHRvIGludGVyYWN0aW9uIGNvb3Jkc1xuICAgIGludGVyYWN0aW9uLm9mZnNldEJ5KHtcbiAgICAgIHg6IC10aGlzLmN1cnJlbnRPZmZzZXQueCxcbiAgICAgIHk6IC10aGlzLmN1cnJlbnRPZmZzZXQueSxcbiAgICB9KVxuXG4gICAgLy8gdXBkYXRlIHBvaW50ZXIgYXQgcG9pbnRlciBkb3duIHBvc2l0aW9uXG4gICAgaW50ZXJhY3Rpb24udXBkYXRlUG9pbnRlcihwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHRydWUpXG5cbiAgICAvLyBmaXJlIHJlc3VtZSBzaWduYWxzIGFuZCBldmVudFxuICAgIGludGVyYWN0aW9uLl9kb1BoYXNlKHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgZXZlbnQsXG4gICAgICBwaGFzZTogJ3Jlc3VtZScsXG4gICAgfSlcbiAgICBjb3B5Q29vcmRzKGludGVyYWN0aW9uLmNvb3Jkcy5wcmV2LCBpbnRlcmFjdGlvbi5jb29yZHMuY3VyKVxuXG4gICAgdGhpcy5zdG9wKClcbiAgfVxuXG4gIGVuZCAoKSB7XG4gICAgdGhpcy5pbnRlcmFjdGlvbi5tb3ZlKClcbiAgICB0aGlzLmludGVyYWN0aW9uLmVuZCgpXG4gICAgdGhpcy5zdG9wKClcbiAgfVxuXG4gIHN0b3AgKCkge1xuICAgIHRoaXMuYWN0aXZlID0gdGhpcy5zbW9vdGhFbmQgPSBmYWxzZVxuICAgIHRoaXMuaW50ZXJhY3Rpb24uc2ltdWxhdGlvbiA9IG51bGxcbiAgICByYWYuY2FuY2VsKHRoaXMudGltZW91dClcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpbnRlcmFjdGlvbiwgZXZlbnQgfTogSW50ZXJhY3QuRG9QaGFzZUFyZzxJbnRlcmFjdC5BY3Rpb25OYW1lLCAnZW5kJz4pIHtcbiAgaWYgKCFpbnRlcmFjdGlvbi5faW50ZXJhY3RpbmcgfHwgaW50ZXJhY3Rpb24uc2ltdWxhdGlvbikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBzdGFydGVkID0gaW50ZXJhY3Rpb24uaW5lcnRpYS5zdGFydChldmVudClcblxuICAvLyBwcmV2ZW50IGFjdGlvbiBlbmQgaWYgaW5lcnRpYSBvciBzbW9vdGhFbmRcbiAgcmV0dXJuIHN0YXJ0ZWQgPyBmYWxzZSA6IG51bGxcbn1cblxuLy8gQ2hlY2sgaWYgdGhlIGRvd24gZXZlbnQgaGl0cyB0aGUgY3VycmVudCBpbmVydGlhIHRhcmdldFxuLy8gY29udHJvbCBzaG91bGQgYmUgcmV0dXJuIHRvIHRoZSB1c2VyXG5mdW5jdGlvbiByZXN1bWUgKGFyZzogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSkge1xuICBjb25zdCB7IGludGVyYWN0aW9uLCBldmVudFRhcmdldCB9ID0gYXJnXG4gIGNvbnN0IHN0YXRlID0gaW50ZXJhY3Rpb24uaW5lcnRpYVxuXG4gIGlmICghc3RhdGUuYWN0aXZlKSB7IHJldHVybiB9XG5cbiAgbGV0IGVsZW1lbnQgPSBldmVudFRhcmdldCBhcyBOb2RlXG5cbiAgLy8gY2xpbWIgdXAgdGhlIERPTSB0cmVlIGZyb20gdGhlIGV2ZW50IHRhcmdldFxuICB3aGlsZSAoaXMuZWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIGlmIGludGVyYWN0aW9uIGVsZW1lbnQgaXMgdGhlIGN1cnJlbnQgaW5lcnRpYSB0YXJnZXQgZWxlbWVudFxuICAgIGlmIChlbGVtZW50ID09PSBpbnRlcmFjdGlvbi5lbGVtZW50KSB7XG4gICAgICBzdGF0ZS5yZXN1bWUoYXJnKVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZG9tLnBhcmVudE5vZGUoZWxlbWVudClcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wICh7IGludGVyYWN0aW9uIH06IHsgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uIH0pIHtcbiAgY29uc3Qgc3RhdGUgPSBpbnRlcmFjdGlvbi5pbmVydGlhXG5cbiAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgIHN0YXRlLnN0b3AoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvbnMgKHsgaW50ZXJhY3RhYmxlLCBwcmVwYXJlZCB9OiBJbnRlcmFjdC5JbnRlcmFjdGlvbikge1xuICByZXR1cm4gaW50ZXJhY3RhYmxlICYmXG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnMgJiZcbiAgICBwcmVwYXJlZC5uYW1lICYmXG4gICAgaW50ZXJhY3RhYmxlLm9wdGlvbnNbcHJlcGFyZWQubmFtZV0uaW5lcnRpYVxufVxuXG5jb25zdCBpbmVydGlhOiBJbnRlcmFjdC5QbHVnaW4gPSB7XG4gIGlkOiAnaW5lcnRpYScsXG4gIGJlZm9yZTogWydtb2RpZmllcnMvYmFzZSddLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAnaW50ZXJhY3Rpb25zOm5ldyc6ICh7IGludGVyYWN0aW9uIH0pID0+IHtcbiAgICAgIGludGVyYWN0aW9uLmluZXJ0aWEgPSBuZXcgSW5lcnRpYVN0YXRlKGludGVyYWN0aW9uKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tZW5kJzogc3RhcnQsXG4gICAgJ2ludGVyYWN0aW9uczpkb3duJzogcmVzdW1lLFxuICAgICdpbnRlcmFjdGlvbnM6c3RvcCc6IHN0b3AsXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24tcmVzdW1lJzogYXJnID0+IHtcbiAgICAgIGNvbnN0IHsgbW9kaWZpY2F0aW9uIH0gPSBhcmcuaW50ZXJhY3Rpb25cblxuICAgICAgbW9kaWZpY2F0aW9uLnN0b3AoYXJnKVxuICAgICAgbW9kaWZpY2F0aW9uLnN0YXJ0KGFyZywgYXJnLmludGVyYWN0aW9uLmNvb3Jkcy5jdXIucGFnZSlcbiAgICAgIG1vZGlmaWNhdGlvbi5hcHBseVRvSW50ZXJhY3Rpb24oYXJnKVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3Rpb25zOmJlZm9yZS1hY3Rpb24taW5lcnRpYXN0YXJ0JzogYXJnID0+IGFyZy5pbnRlcmFjdGlvbi5tb2RpZmljYXRpb24uc2V0QW5kQXBwbHkoYXJnKSxcbiAgICAnaW50ZXJhY3Rpb25zOmFjdGlvbi1yZXN1bWUnOiBtb2RpZmllcnMuYWRkRXZlbnRNb2RpZmllcnMsXG4gICAgJ2ludGVyYWN0aW9uczphY3Rpb24taW5lcnRpYXN0YXJ0JzogbW9kaWZpZXJzLmFkZEV2ZW50TW9kaWZpZXJzLFxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLWluZXJ0aWFzdGFydCc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuICAgICdpbnRlcmFjdGlvbnM6YWZ0ZXItYWN0aW9uLXJlc3VtZSc6IGFyZyA9PiBhcmcuaW50ZXJhY3Rpb24ubW9kaWZpY2F0aW9uLnJlc3RvcmVJbnRlcmFjdGlvbkNvb3JkcyhhcmcpLFxuICB9LFxufVxuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81NjM0NTI4LzIyODA4ODhcbmZ1bmN0aW9uIF9nZXRRQmV6aWVyVmFsdWUgKHQ6IG51bWJlciwgcDE6IG51bWJlciwgcDI6IG51bWJlciwgcDM6IG51bWJlcikge1xuICBjb25zdCBpVCA9IDEgLSB0XG4gIHJldHVybiBpVCAqIGlUICogcDEgKyAyICogaVQgKiB0ICogcDIgKyB0ICogdCAqIHAzXG59XG5cbmZ1bmN0aW9uIGdldFF1YWRyYXRpY0N1cnZlUG9pbnQgKFxuICBzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIGNwWDogbnVtYmVyLCBjcFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAgX2dldFFCZXppZXJWYWx1ZShwb3NpdGlvbiwgc3RhcnRYLCBjcFgsIGVuZFgpLFxuICAgIHk6ICBfZ2V0UUJlemllclZhbHVlKHBvc2l0aW9uLCBzdGFydFksIGNwWSwgZW5kWSksXG4gIH1cbn1cblxuLy8gaHR0cDovL2dpem1hLmNvbS9lYXNpbmcvXG5mdW5jdGlvbiBlYXNlT3V0UXVhZCAodDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIHQgLz0gZFxuICByZXR1cm4gLWMgKiB0ICogKHQgLSAyKSArIGJcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5lcnRpYVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIG1vZGlmaWVycy9hc3BlY3RSYXRpb1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgZm9yY2VzIGVsZW1lbnRzIHRvIGJlIHJlc2l6ZWQgd2l0aCBhIHNwZWNpZmllZCBkeC9keSByYXRpby5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJhY3QodGFyZ2V0KS5yZXNpemFibGUoe1xuICogICBtb2RpZmllcnM6IFtcbiAqICAgICBpbnRlcmFjdC5tb2RpZmllcnMuc25hcFNpemUoe1xuICogICAgICAgdGFyZ2V0czogWyBpbnRlcmFjdC5jcmVhdGVTbmFwR3JpZCh7IHg6IDIwLCB5OiAyMCB9KSBdLFxuICogICAgIH0pLFxuICogICAgIGludGVyYWN0LmFzcGVjdFJhdGlvKHsgcmF0aW86ICdwcmVzZXJ2ZScgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqL1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCB7IGFkZEVkZ2VzIH0gZnJvbSAnQGludGVyYWN0anMvdXRpbHMvcmVjdCdcbmltcG9ydCB7IE1vZGlmaWVyLCBNb2RpZmllck1vZHVsZSwgTW9kaWZpZXJTdGF0ZSB9IGZyb20gJy4vYmFzZSdcbmltcG9ydCBNb2RpZmljYXRpb24gZnJvbSAnLi9Nb2RpZmljYXRpb24nXG5pbXBvcnQgeyBtYWtlTW9kaWZpZXIgfSBmcm9tICcuL2Jhc2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNwZWN0UmF0aW9PcHRpb25zIHtcbiAgcmF0aW8/OiBudW1iZXIgfCAncHJlc2VydmUnXG4gIGVxdWFsRGVsdGE/OiBib29sZWFuXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW11cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgQXNwZWN0UmF0aW9TdGF0ZSA9IE1vZGlmaWVyU3RhdGU8QXNwZWN0UmF0aW9PcHRpb25zLCB7XG4gIHN0YXJ0Q29vcmRzOiBJbnRlcmFjdC5Qb2ludFxuICBzdGFydFJlY3Q6IEludGVyYWN0LlJlY3RcbiAgbGlua2VkRWRnZXM6IEludGVyYWN0LkVkZ2VPcHRpb25zXG4gIHJhdGlvOiBudW1iZXJcbiAgZXF1YWxEZWx0YTogYm9vbGVhblxuICB4SXNQcmltYXJ5QXhpczogYm9vbGVhblxuICBlZGdlU2lnbjogMSB8IC0xXG4gIHN1Yk1vZGlmaWNhdGlvbjogTW9kaWZpY2F0aW9uXG59PlxuXG5jb25zdCBhc3BlY3RSYXRpbzogTW9kaWZpZXJNb2R1bGU8QXNwZWN0UmF0aW9PcHRpb25zLCBBc3BlY3RSYXRpb1N0YXRlPiA9IHtcbiAgc3RhcnQgKGFyZykge1xuICAgIGNvbnN0IHsgc3RhdGUsIHJlY3QsIGVkZ2VzOiBvcmlnaW5hbEVkZ2VzLCBwYWdlQ29vcmRzOiBjb29yZHMgfSA9IGFyZ1xuICAgIGxldCB7IHJhdGlvIH0gPSBzdGF0ZS5vcHRpb25zXG4gICAgY29uc3QgeyBlcXVhbERlbHRhLCBtb2RpZmllcnMgfSA9IHN0YXRlLm9wdGlvbnNcblxuICAgIGlmIChyYXRpbyA9PT0gJ3ByZXNlcnZlJykge1xuICAgICAgcmF0aW8gPSByZWN0LndpZHRoIC8gcmVjdC5oZWlnaHRcbiAgICB9XG5cbiAgICBzdGF0ZS5zdGFydENvb3JkcyA9IGV4dGVuZCh7fSwgY29vcmRzKVxuICAgIHN0YXRlLnN0YXJ0UmVjdCA9IGV4dGVuZCh7fSwgcmVjdClcbiAgICBzdGF0ZS5yYXRpbyA9IHJhdGlvXG4gICAgc3RhdGUuZXF1YWxEZWx0YSA9IGVxdWFsRGVsdGFcblxuICAgIGNvbnN0IGxpbmtlZEVkZ2VzID0gc3RhdGUubGlua2VkRWRnZXMgPSB7XG4gICAgICB0b3AgICA6IG9yaWdpbmFsRWRnZXMudG9wICAgIHx8IChvcmlnaW5hbEVkZ2VzLmxlZnQgICAmJiAhb3JpZ2luYWxFZGdlcy5ib3R0b20pLFxuICAgICAgbGVmdCAgOiBvcmlnaW5hbEVkZ2VzLmxlZnQgICB8fCAob3JpZ2luYWxFZGdlcy50b3AgICAgJiYgIW9yaWdpbmFsRWRnZXMucmlnaHQpLFxuICAgICAgYm90dG9tOiBvcmlnaW5hbEVkZ2VzLmJvdHRvbSB8fCAob3JpZ2luYWxFZGdlcy5yaWdodCAgJiYgIW9yaWdpbmFsRWRnZXMudG9wKSxcbiAgICAgIHJpZ2h0IDogb3JpZ2luYWxFZGdlcy5yaWdodCAgfHwgKG9yaWdpbmFsRWRnZXMuYm90dG9tICYmICFvcmlnaW5hbEVkZ2VzLmxlZnQpLFxuICAgIH1cblxuICAgIHN0YXRlLnhJc1ByaW1hcnlBeGlzID0gISEob3JpZ2luYWxFZGdlcy5sZWZ0IHx8IG9yaWdpbmFsRWRnZXMucmlnaHQpXG5cbiAgICBpZiAoc3RhdGUuZXF1YWxEZWx0YSkge1xuICAgICAgc3RhdGUuZWRnZVNpZ24gPSAobGlua2VkRWRnZXMubGVmdCA/IDEgOiAtMSkgKiAobGlua2VkRWRnZXMudG9wID8gMSA6IC0xKSBhcyAxIHwgLTFcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZVNlY29uZGFyeUVkZ2UgPSBzdGF0ZS54SXNQcmltYXJ5QXhpcyA/IGxpbmtlZEVkZ2VzLnRvcCA6IGxpbmtlZEVkZ2VzLmxlZnRcbiAgICAgIHN0YXRlLmVkZ2VTaWduID0gbmVnYXRpdmVTZWNvbmRhcnlFZGdlID8gLTEgOiAxXG4gICAgfVxuXG4gICAgZXh0ZW5kKGFyZy5lZGdlcywgbGlua2VkRWRnZXMpXG5cbiAgICBpZiAoIW1vZGlmaWVycyB8fCAhbW9kaWZpZXJzLmxlbmd0aCkgeyByZXR1cm4gfVxuXG4gICAgY29uc3Qgc3ViTW9kaWZpY2F0aW9uID0gbmV3IE1vZGlmaWNhdGlvbihhcmcuaW50ZXJhY3Rpb24pXG5cbiAgICBzdWJNb2RpZmljYXRpb24uY29weUZyb20oYXJnLmludGVyYWN0aW9uLm1vZGlmaWNhdGlvbilcbiAgICBzdWJNb2RpZmljYXRpb24ucHJlcGFyZVN0YXRlcyhtb2RpZmllcnMpXG5cbiAgICBzdGF0ZS5zdWJNb2RpZmljYXRpb24gPSBzdWJNb2RpZmljYXRpb25cbiAgICBzdWJNb2RpZmljYXRpb24uc3RhcnRBbGwoeyAuLi5hcmcgfSlcbiAgfSxcblxuICBzZXQgKGFyZykge1xuICAgIGNvbnN0IHsgc3RhdGUsIHJlY3QsIGNvb3JkcyB9ID0gYXJnXG4gICAgY29uc3QgaW5pdGlhbENvb3JkcyA9IGV4dGVuZCh7fSwgY29vcmRzKVxuICAgIGNvbnN0IGFzcGVjdE1ldGhvZCA9IHN0YXRlLmVxdWFsRGVsdGEgPyBzZXRFcXVhbERlbHRhIDogc2V0UmF0aW9cblxuICAgIGFzcGVjdE1ldGhvZChzdGF0ZSwgc3RhdGUueElzUHJpbWFyeUF4aXMsIGNvb3JkcywgcmVjdClcblxuICAgIGlmICghc3RhdGUuc3ViTW9kaWZpY2F0aW9uKSB7IHJldHVybiBudWxsIH1cblxuICAgIGNvbnN0IGNvcnJlY3RlZFJlY3QgPSBleHRlbmQoe30sIHJlY3QpXG5cbiAgICBhZGRFZGdlcyhzdGF0ZS5saW5rZWRFZGdlcywgY29ycmVjdGVkUmVjdCwgeyB4OiBjb29yZHMueCAtIGluaXRpYWxDb29yZHMueCwgeTogY29vcmRzLnkgLSBpbml0aWFsQ29vcmRzLnkgfSlcblxuICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLnN1Yk1vZGlmaWNhdGlvbi5zZXRBbGwoe1xuICAgICAgLi4uYXJnLFxuICAgICAgcmVjdDogY29ycmVjdGVkUmVjdCxcbiAgICAgIGVkZ2VzOiBzdGF0ZS5saW5rZWRFZGdlcyxcbiAgICAgIHBhZ2VDb29yZHM6IGNvb3JkcyxcbiAgICAgIHByZXZDb29yZHM6IGNvb3JkcyxcbiAgICAgIHByZXZSZWN0OiBjb3JyZWN0ZWRSZWN0LFxuICAgIH0pXG5cbiAgICBjb25zdCB7IGRlbHRhIH0gPSByZXN1bHRcblxuICAgIGlmIChyZXN1bHQuY2hhbmdlZCkge1xuICAgICAgY29uc3QgeElzQ3JpdGljYWxBeGlzID0gTWF0aC5hYnMoZGVsdGEueCkgPiBNYXRoLmFicyhkZWx0YS55KVxuXG4gICAgICAvLyBkbyBhc3BlY3QgbW9kaWZpY2F0aW9uIGFnYWluIHdpdGggY3JpdGljYWwgZWRnZSBheGlzIGFzIHByaW1hcnlcbiAgICAgIGFzcGVjdE1ldGhvZChzdGF0ZSwgeElzQ3JpdGljYWxBeGlzLCByZXN1bHQuY29vcmRzLCByZXN1bHQucmVjdClcbiAgICAgIGV4dGVuZChjb29yZHMsIHJlc3VsdC5jb29yZHMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5ldmVudFByb3BzXG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICByYXRpbzogJ3ByZXNlcnZlJyxcbiAgICBlcXVhbERlbHRhOiBmYWxzZSxcbiAgICBtb2RpZmllcnM6IFtdLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICB9LFxufVxuXG5mdW5jdGlvbiBzZXRFcXVhbERlbHRhICh7IHN0YXJ0Q29vcmRzLCBlZGdlU2lnbiB9OiBBc3BlY3RSYXRpb1N0YXRlLCB4SXNQcmltYXJ5QXhpczogYm9vbGVhbiwgY29vcmRzOiBJbnRlcmFjdC5Qb2ludCkge1xuICBpZiAoeElzUHJpbWFyeUF4aXMpIHtcbiAgICBjb29yZHMueSA9IHN0YXJ0Q29vcmRzLnkgKyAoY29vcmRzLnggLSBzdGFydENvb3Jkcy54KSAqIGVkZ2VTaWduXG4gIH1cbiAgZWxzZSB7XG4gICAgY29vcmRzLnggPSBzdGFydENvb3Jkcy54ICsgKGNvb3Jkcy55IC0gc3RhcnRDb29yZHMueSkgKiBlZGdlU2lnblxuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJhdGlvICh7IHN0YXJ0UmVjdCwgc3RhcnRDb29yZHMsIHJhdGlvLCBlZGdlU2lnbiB9OiBBc3BlY3RSYXRpb1N0YXRlLCB4SXNQcmltYXJ5QXhpczogYm9vbGVhbiwgY29vcmRzOiBJbnRlcmFjdC5Qb2ludCwgcmVjdDogSW50ZXJhY3QuUmVjdCkge1xuICBpZiAoeElzUHJpbWFyeUF4aXMpIHtcbiAgICBjb25zdCBuZXdIZWlnaHQgPSByZWN0LndpZHRoIC8gcmF0aW9cblxuICAgIGNvb3Jkcy55ID0gc3RhcnRDb29yZHMueSArIChuZXdIZWlnaHQgLSBzdGFydFJlY3QuaGVpZ2h0KSAqIGVkZ2VTaWduXG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc3QgbmV3V2lkdGggPSByZWN0LmhlaWdodCAqIHJhdGlvXG5cbiAgICBjb29yZHMueCA9IHN0YXJ0Q29vcmRzLnggKyAobmV3V2lkdGggLSBzdGFydFJlY3Qud2lkdGgpICogZWRnZVNpZ25cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIoYXNwZWN0UmF0aW8sICdhc3BlY3RSYXRpbycpXG5leHBvcnQgeyBhc3BlY3RSYXRpbyB9XG4iLCJpbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0ICogYXMgcmVjdFV0aWxzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL3JlY3QnXG5pbXBvcnQgeyBNb2RpZmllckFyZywgTW9kaWZpZXJNb2R1bGUsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdHJpY3RPcHRpb25zIHtcbiAgLy8gd2hlcmUgdG8gZHJhZyBvdmVyXG4gIHJlc3RyaWN0aW9uOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbbnVtYmVyLCBudW1iZXIsIEludGVyYWN0LkludGVyYWN0aW9uXT5cbiAgLy8gd2hhdCBwYXJ0IG9mIHNlbGYgaXMgYWxsb3dlZCB0byBkcmFnIG92ZXJcbiAgZWxlbWVudFJlY3Q6IEludGVyYWN0LlJlY3RcbiAgb2Zmc2V0OiBJbnRlcmFjdC5SZWN0XG4gIC8vIHJlc3RyaWN0IGp1c3QgYmVmb3JlIHRoZSBlbmQgZHJhZ1xuICBlbmRPbmx5OiBib29sZWFuXG4gIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0U3RhdGUgPSBNb2RpZmllclN0YXRlPFJlc3RyaWN0T3B0aW9ucywge1xuICBvZmZzZXQ6IEludGVyYWN0LlJlY3Rcbn0+XG5cbmZ1bmN0aW9uIHN0YXJ0ICh7IHJlY3QsIHN0YXJ0T2Zmc2V0LCBzdGF0ZSwgaW50ZXJhY3Rpb24sIHBhZ2VDb29yZHMgfTogTW9kaWZpZXJBcmc8UmVzdHJpY3RTdGF0ZT4pIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBjb25zdCB7IGVsZW1lbnRSZWN0IH0gPSBvcHRpb25zXG4gIGNvbnN0IG9mZnNldDogSW50ZXJhY3QuUmVjdCA9IGV4dGVuZCh7XG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICB9LCBvcHRpb25zLm9mZnNldCB8fCB7fSlcblxuICBpZiAocmVjdCAmJiBlbGVtZW50UmVjdCkge1xuICAgIGNvbnN0IHJlc3RyaWN0aW9uID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMucmVzdHJpY3Rpb24sIGludGVyYWN0aW9uLCBwYWdlQ29vcmRzKVxuXG4gICAgaWYgKHJlc3RyaWN0aW9uKSB7XG4gICAgICBjb25zdCB3aWR0aERpZmYgPSAocmVzdHJpY3Rpb24ucmlnaHQgLSByZXN0cmljdGlvbi5sZWZ0KSAtIHJlY3Qud2lkdGhcbiAgICAgIGNvbnN0IGhlaWdodERpZmYgPSAocmVzdHJpY3Rpb24uYm90dG9tIC0gcmVzdHJpY3Rpb24udG9wKSAtIHJlY3QuaGVpZ2h0XG5cbiAgICAgIGlmICh3aWR0aERpZmYgPCAwKSB7XG4gICAgICAgIG9mZnNldC5sZWZ0ICs9IHdpZHRoRGlmZlxuICAgICAgICBvZmZzZXQucmlnaHQgKz0gd2lkdGhEaWZmXG4gICAgICB9XG4gICAgICBpZiAoaGVpZ2h0RGlmZiA8IDApIHtcbiAgICAgICAgb2Zmc2V0LnRvcCArPSBoZWlnaHREaWZmXG4gICAgICAgIG9mZnNldC5ib3R0b20gKz0gaGVpZ2h0RGlmZlxuICAgICAgfVxuICAgIH1cblxuICAgIG9mZnNldC5sZWZ0ICs9IHN0YXJ0T2Zmc2V0LmxlZnQgLSAocmVjdC53aWR0aCAgKiBlbGVtZW50UmVjdC5sZWZ0KVxuICAgIG9mZnNldC50b3AgICs9IHN0YXJ0T2Zmc2V0LnRvcCAgLSAocmVjdC5oZWlnaHQgKiBlbGVtZW50UmVjdC50b3ApXG5cbiAgICBvZmZzZXQucmlnaHQgICs9IHN0YXJ0T2Zmc2V0LnJpZ2h0ICAtIChyZWN0LndpZHRoICAqICgxIC0gZWxlbWVudFJlY3QucmlnaHQpKVxuICAgIG9mZnNldC5ib3R0b20gKz0gc3RhcnRPZmZzZXQuYm90dG9tIC0gKHJlY3QuaGVpZ2h0ICogKDEgLSBlbGVtZW50UmVjdC5ib3R0b20pKVxuICB9XG5cbiAgc3RhdGUub2Zmc2V0ID0gb2Zmc2V0XG59XG5cbmZ1bmN0aW9uIHNldCAoeyBjb29yZHMsIGludGVyYWN0aW9uLCBzdGF0ZSB9OiBNb2RpZmllckFyZzxSZXN0cmljdFN0YXRlPikge1xuICBjb25zdCB7IG9wdGlvbnMsIG9mZnNldCB9ID0gc3RhdGVcblxuICBjb25zdCByZXN0cmljdGlvbiA9IGdldFJlc3RyaWN0aW9uUmVjdChvcHRpb25zLnJlc3RyaWN0aW9uLCBpbnRlcmFjdGlvbiwgY29vcmRzKVxuXG4gIGlmICghcmVzdHJpY3Rpb24pIHsgcmV0dXJuIH1cblxuICBjb25zdCByZWN0ID0gcmVjdFV0aWxzLnh5d2hUb1RsYnIocmVzdHJpY3Rpb24pXG5cbiAgY29vcmRzLnggPSBNYXRoLm1heChNYXRoLm1pbihyZWN0LnJpZ2h0ICAtIG9mZnNldC5yaWdodCwgY29vcmRzLngpLCByZWN0LmxlZnQgKyBvZmZzZXQubGVmdClcbiAgY29vcmRzLnkgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0LmJvdHRvbSAtIG9mZnNldC5ib3R0b20sIGNvb3Jkcy55KSwgcmVjdC50b3AgICsgb2Zmc2V0LnRvcClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc3RyaWN0aW9uUmVjdCAoXG4gIHZhbHVlOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbbnVtYmVyLCBudW1iZXIsIEludGVyYWN0LkludGVyYWN0aW9uXT4sXG4gIGludGVyYWN0aW9uOiBJbnRlcmFjdC5JbnRlcmFjdGlvbixcbiAgY29vcmRzPzogSW50ZXJhY3QuUG9pbnQsXG4pIHtcbiAgaWYgKGlzLmZ1bmModmFsdWUpKSB7XG4gICAgcmV0dXJuIHJlY3RVdGlscy5yZXNvbHZlUmVjdExpa2UodmFsdWUsIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSwgaW50ZXJhY3Rpb24uZWxlbWVudCwgW2Nvb3Jkcy54LCBjb29yZHMueSwgaW50ZXJhY3Rpb25dKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZWN0VXRpbHMucmVzb2x2ZVJlY3RMaWtlKHZhbHVlLCBpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLmVsZW1lbnQpXG4gIH1cbn1cblxuY29uc3QgZGVmYXVsdHM6IFJlc3RyaWN0T3B0aW9ucyA9IHtcbiAgcmVzdHJpY3Rpb246IG51bGwsXG4gIGVsZW1lbnRSZWN0OiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3Q6IE1vZGlmaWVyTW9kdWxlPFJlc3RyaWN0T3B0aW9ucywgUmVzdHJpY3RTdGF0ZT4gPSB7XG4gIHN0YXJ0LFxuICBzZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIocmVzdHJpY3QsICdyZXN0cmljdCcpXG5leHBvcnQgeyByZXN0cmljdCB9XG4iLCIvLyBUaGlzIG1vZHVsZSBhZGRzIHRoZSBvcHRpb25zLnJlc2l6ZS5yZXN0cmljdEVkZ2VzIHNldHRpbmcgd2hpY2ggc2V0cyBtaW4gYW5kXG4vLyBtYXggZm9yIHRoZSB0b3AsIGxlZnQsIGJvdHRvbSBhbmQgcmlnaHQgZWRnZXMgb2YgdGhlIHRhcmdldCBiZWluZyByZXNpemVkLlxuLy9cbi8vIGludGVyYWN0KHRhcmdldCkucmVzaXplKHtcbi8vICAgZWRnZXM6IHsgdG9wOiB0cnVlLCBsZWZ0OiB0cnVlIH0sXG4vLyAgIHJlc3RyaWN0RWRnZXM6IHtcbi8vICAgICBpbm5lcjogeyB0b3A6IDIwMCwgbGVmdDogMjAwLCByaWdodDogNDAwLCBib3R0b206IDQwMCB9LFxuLy8gICAgIG91dGVyOiB7IHRvcDogICAwLCBsZWZ0OiAgIDAsIHJpZ2h0OiA2MDAsIGJvdHRvbTogNjAwIH0sXG4vLyAgIH0sXG4vLyB9KVxuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBnZXRSZXN0cmljdGlvblJlY3QsIFJlc3RyaWN0T3B0aW9ucyB9IGZyb20gJy4vcG9pbnRlcidcblxuZXhwb3J0IGludGVyZmFjZSBSZXN0cmljdEVkZ2VzT3B0aW9ucyB7XG4gIGlubmVyOiBSZXN0cmljdE9wdGlvbnNbJ3Jlc3RyaWN0aW9uJ11cbiAgb3V0ZXI6IFJlc3RyaWN0T3B0aW9uc1sncmVzdHJpY3Rpb24nXVxuICBvZmZzZXQ/OiBSZXN0cmljdE9wdGlvbnNbJ29mZnNldCddXG4gIGVuZE9ubHk6IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgUmVzdHJpY3RFZGdlc1N0YXRlID0gTW9kaWZpZXJTdGF0ZTxSZXN0cmljdEVkZ2VzT3B0aW9ucywge1xuICBpbm5lcjogSW50ZXJhY3QuUmVjdFxuICBvdXRlcjogSW50ZXJhY3QuUmVjdFxuICBvZmZzZXQ6IFJlc3RyaWN0RWRnZXNPcHRpb25zWydvZmZzZXQnXVxufT5cblxuY29uc3Qgbm9Jbm5lciA9IHsgdG9wOiArSW5maW5pdHksIGxlZnQ6ICtJbmZpbml0eSwgYm90dG9tOiAtSW5maW5pdHksIHJpZ2h0OiAtSW5maW5pdHkgfVxuY29uc3Qgbm9PdXRlciA9IHsgdG9wOiAtSW5maW5pdHksIGxlZnQ6IC1JbmZpbml0eSwgYm90dG9tOiArSW5maW5pdHksIHJpZ2h0OiArSW5maW5pdHkgfVxuXG5mdW5jdGlvbiBzdGFydCAoeyBpbnRlcmFjdGlvbiwgc3RhcnRPZmZzZXQsIHN0YXRlIH06IE1vZGlmaWVyQXJnPFJlc3RyaWN0RWRnZXNTdGF0ZT4pIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBsZXQgb2Zmc2V0XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBjb25zdCBvZmZzZXRSZWN0ID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMub2Zmc2V0LCBpbnRlcmFjdGlvbiwgaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UpXG5cbiAgICBvZmZzZXQgPSByZWN0VXRpbHMucmVjdFRvWFkob2Zmc2V0UmVjdClcbiAgfVxuXG4gIG9mZnNldCA9IG9mZnNldCB8fCB7IHg6IDAsIHk6IDAgfVxuXG4gIHN0YXRlLm9mZnNldCA9IHtcbiAgICB0b3A6ICAgIG9mZnNldC55ICsgc3RhcnRPZmZzZXQudG9wLFxuICAgIGxlZnQ6ICAgb2Zmc2V0LnggKyBzdGFydE9mZnNldC5sZWZ0LFxuICAgIGJvdHRvbTogb2Zmc2V0LnkgLSBzdGFydE9mZnNldC5ib3R0b20sXG4gICAgcmlnaHQ6ICBvZmZzZXQueCAtIHN0YXJ0T2Zmc2V0LnJpZ2h0LFxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCAoeyBjb29yZHMsIGVkZ2VzLCBpbnRlcmFjdGlvbiwgc3RhdGUgfTogTW9kaWZpZXJBcmc8UmVzdHJpY3RFZGdlc1N0YXRlPikge1xuICBjb25zdCB7IG9mZnNldCwgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYWdlID0gZXh0ZW5kKHt9LCBjb29yZHMpXG4gIGNvbnN0IGlubmVyID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMuaW5uZXIsIGludGVyYWN0aW9uLCBwYWdlKSB8fCB7fSBhcyBJbnRlcmFjdC5SZWN0XG4gIGNvbnN0IG91dGVyID0gZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMub3V0ZXIsIGludGVyYWN0aW9uLCBwYWdlKSB8fCB7fSBhcyBJbnRlcmFjdC5SZWN0XG5cbiAgZml4UmVjdChpbm5lciwgbm9Jbm5lcilcbiAgZml4UmVjdChvdXRlciwgbm9PdXRlcilcblxuICBpZiAoZWRnZXMudG9wKSB7XG4gICAgY29vcmRzLnkgPSBNYXRoLm1pbihNYXRoLm1heChvdXRlci50b3AgICAgKyBvZmZzZXQudG9wLCAgICBwYWdlLnkpLCBpbm5lci50b3AgICAgKyBvZmZzZXQudG9wKVxuICB9XG4gIGVsc2UgaWYgKGVkZ2VzLmJvdHRvbSkge1xuICAgIGNvb3Jkcy55ID0gTWF0aC5tYXgoTWF0aC5taW4ob3V0ZXIuYm90dG9tICsgb2Zmc2V0LmJvdHRvbSwgcGFnZS55KSwgaW5uZXIuYm90dG9tICsgb2Zmc2V0LmJvdHRvbSlcbiAgfVxuICBpZiAoZWRnZXMubGVmdCkge1xuICAgIGNvb3Jkcy54ID0gTWF0aC5taW4oTWF0aC5tYXgob3V0ZXIubGVmdCAgICsgb2Zmc2V0LmxlZnQsICAgcGFnZS54KSwgaW5uZXIubGVmdCAgICsgb2Zmc2V0LmxlZnQpXG4gIH1cbiAgZWxzZSBpZiAoZWRnZXMucmlnaHQpIHtcbiAgICBjb29yZHMueCA9IE1hdGgubWF4KE1hdGgubWluKG91dGVyLnJpZ2h0ICArIG9mZnNldC5yaWdodCwgIHBhZ2UueCksIGlubmVyLnJpZ2h0ICArIG9mZnNldC5yaWdodClcbiAgfVxufVxuXG5mdW5jdGlvbiBmaXhSZWN0IChyZWN0LCBkZWZhdWx0cykge1xuICBmb3IgKGNvbnN0IGVkZ2Ugb2YgWyd0b3AnLCAnbGVmdCcsICdib3R0b20nLCAncmlnaHQnXSkge1xuICAgIGlmICghKGVkZ2UgaW4gcmVjdCkpIHtcbiAgICAgIHJlY3RbZWRnZV0gPSBkZWZhdWx0c1tlZGdlXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWN0XG59XG5cbmNvbnN0IGRlZmF1bHRzOiBSZXN0cmljdEVkZ2VzT3B0aW9ucyA9IHtcbiAgaW5uZXI6IG51bGwsXG4gIG91dGVyOiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3RFZGdlcyA9IHtcbiAgbm9Jbm5lcixcbiAgbm9PdXRlcixcbiAgc3RhcnQsXG4gIHNldCxcbiAgZGVmYXVsdHMsXG59XG5cbmV4cG9ydCBkZWZhdWx0IG1ha2VNb2RpZmllcihyZXN0cmljdEVkZ2VzLCAncmVzdHJpY3RFZGdlcycpXG5leHBvcnQgeyByZXN0cmljdEVkZ2VzIH1cbiIsImltcG9ydCBleHRlbmQgZnJvbSAnLi4vLi4vdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IHsgcmVzdHJpY3QgfSBmcm9tICcuL3BvaW50ZXInXG5pbXBvcnQgeyBtYWtlTW9kaWZpZXIgfSBmcm9tICcuLi9iYXNlJ1xuXG5jb25zdCBkZWZhdWx0cyA9IGV4dGVuZCh7XG4gIGdldCBlbGVtZW50UmVjdCAoKSB7XG4gICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IDEsIHJpZ2h0OiAxIH1cbiAgfSxcbiAgc2V0IGVsZW1lbnRSZWN0IChfKSB7fSxcbn0sIHJlc3RyaWN0LmRlZmF1bHRzKVxuXG5jb25zdCByZXN0cmljdFJlY3QgPSB7XG4gIHN0YXJ0OiByZXN0cmljdC5zdGFydCxcbiAgc2V0OiByZXN0cmljdC5zZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIocmVzdHJpY3RSZWN0LCAncmVzdHJpY3RSZWN0JylcbmV4cG9ydCB7IHJlc3RyaWN0UmVjdCB9XG4iLCJpbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIHJlY3RVdGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9yZWN0J1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyU3RhdGUsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBSZXN0cmljdEVkZ2VzU3RhdGUsIHJlc3RyaWN0RWRnZXMgfSBmcm9tICcuL2VkZ2VzJ1xuaW1wb3J0IHsgZ2V0UmVzdHJpY3Rpb25SZWN0LCBSZXN0cmljdE9wdGlvbnMgfSBmcm9tICcuL3BvaW50ZXInXG5cbmNvbnN0IG5vTWluID0geyB3aWR0aDogLUluZmluaXR5LCBoZWlnaHQ6IC1JbmZpbml0eSB9XG5jb25zdCBub01heCA9IHsgd2lkdGg6ICtJbmZpbml0eSwgaGVpZ2h0OiArSW5maW5pdHkgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RyaWN0U2l6ZU9wdGlvbnMge1xuICBtaW4/OiBJbnRlcmFjdC5TaXplIHwgSW50ZXJhY3QuUG9pbnQgfCBSZXN0cmljdE9wdGlvbnNbJ3Jlc3RyaWN0aW9uJ11cbiAgbWF4PzogSW50ZXJhY3QuU2l6ZSB8IEludGVyYWN0LlBvaW50IHwgUmVzdHJpY3RPcHRpb25zWydyZXN0cmljdGlvbiddXG4gIGVuZE9ubHk6IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gc3RhcnQgKGFyZzogTW9kaWZpZXJBcmc8UmVzdHJpY3RFZGdlc1N0YXRlPikge1xuICByZXR1cm4gcmVzdHJpY3RFZGdlcy5zdGFydChhcmcpXG59XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0U2l6ZVN0YXRlID1cbiAgUmVzdHJpY3RFZGdlc1N0YXRlICYgTW9kaWZpZXJTdGF0ZTxSZXN0cmljdFNpemVPcHRpb25zICYgeyBpbm5lcjogSW50ZXJhY3QuUmVjdCwgb3V0ZXI6IEludGVyYWN0LlJlY3QgfSwge1xuICAgIG1pbjogSW50ZXJhY3QuUmVjdFxuICAgIG1heDogSW50ZXJhY3QuUmVjdFxuICB9PlxuXG5mdW5jdGlvbiBzZXQgKGFyZzogTW9kaWZpZXJBcmc8UmVzdHJpY3RTaXplU3RhdGU+KSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIHN0YXRlLCByZWN0LCBlZGdlcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtaW5TaXplID0gcmVjdFV0aWxzLnRsYnJUb1h5d2goZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMubWluIGFzIGFueSwgaW50ZXJhY3Rpb24sIGFyZy5jb29yZHMpKSB8fCBub01pblxuICBjb25zdCBtYXhTaXplID0gcmVjdFV0aWxzLnRsYnJUb1h5d2goZ2V0UmVzdHJpY3Rpb25SZWN0KG9wdGlvbnMubWF4IGFzIGFueSwgaW50ZXJhY3Rpb24sIGFyZy5jb29yZHMpKSB8fCBub01heFxuXG4gIHN0YXRlLm9wdGlvbnMgPSB7XG4gICAgZW5kT25seTogb3B0aW9ucy5lbmRPbmx5LFxuICAgIGlubmVyOiBleHRlbmQoe30sIHJlc3RyaWN0RWRnZXMubm9Jbm5lciksXG4gICAgb3V0ZXI6IGV4dGVuZCh7fSwgcmVzdHJpY3RFZGdlcy5ub091dGVyKSxcbiAgfVxuXG4gIGlmIChlZGdlcy50b3ApIHtcbiAgICBzdGF0ZS5vcHRpb25zLmlubmVyLnRvcCA9IHJlY3QuYm90dG9tIC0gbWluU2l6ZS5oZWlnaHRcbiAgICBzdGF0ZS5vcHRpb25zLm91dGVyLnRvcCA9IHJlY3QuYm90dG9tIC0gbWF4U2l6ZS5oZWlnaHRcbiAgfVxuICBlbHNlIGlmIChlZGdlcy5ib3R0b20pIHtcbiAgICBzdGF0ZS5vcHRpb25zLmlubmVyLmJvdHRvbSA9IHJlY3QudG9wICsgbWluU2l6ZS5oZWlnaHRcbiAgICBzdGF0ZS5vcHRpb25zLm91dGVyLmJvdHRvbSA9IHJlY3QudG9wICsgbWF4U2l6ZS5oZWlnaHRcbiAgfVxuICBpZiAoZWRnZXMubGVmdCkge1xuICAgIHN0YXRlLm9wdGlvbnMuaW5uZXIubGVmdCA9IHJlY3QucmlnaHQgLSBtaW5TaXplLndpZHRoXG4gICAgc3RhdGUub3B0aW9ucy5vdXRlci5sZWZ0ID0gcmVjdC5yaWdodCAtIG1heFNpemUud2lkdGhcbiAgfVxuICBlbHNlIGlmIChlZGdlcy5yaWdodCkge1xuICAgIHN0YXRlLm9wdGlvbnMuaW5uZXIucmlnaHQgPSByZWN0LmxlZnQgKyBtaW5TaXplLndpZHRoXG4gICAgc3RhdGUub3B0aW9ucy5vdXRlci5yaWdodCA9IHJlY3QubGVmdCArIG1heFNpemUud2lkdGhcbiAgfVxuXG4gIHJlc3RyaWN0RWRnZXMuc2V0KGFyZylcblxuICBzdGF0ZS5vcHRpb25zID0gb3B0aW9uc1xufVxuXG5jb25zdCBkZWZhdWx0czogUmVzdHJpY3RTaXplT3B0aW9ucyA9IHtcbiAgbWluOiBudWxsLFxuICBtYXg6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3QgcmVzdHJpY3RTaXplID0ge1xuICBzdGFydCxcbiAgc2V0LFxuICBkZWZhdWx0cyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHJlc3RyaWN0U2l6ZSwgJ3Jlc3RyaWN0U2l6ZScpXG5leHBvcnQgeyByZXN0cmljdFNpemUgfVxuIiwiaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaW5kZXgnXG5pbXBvcnQgeyBNb2RpZmllckFyZywgTW9kaWZpZXJTdGF0ZSwgbWFrZU1vZGlmaWVyIH0gZnJvbSAnLi4vYmFzZSdcblxuZXhwb3J0IGludGVyZmFjZSBPZmZzZXQge1xuICB4OiBudW1iZXJcbiAgeTogbnVtYmVyXG4gIGluZGV4OiBudW1iZXJcbiAgcmVsYXRpdmVQb2ludD86IEludGVyYWN0LlBvaW50XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU25hcFBvc2l0aW9uIHtcbiAgeD86IG51bWJlclxuICB5PzogbnVtYmVyXG4gIHJhbmdlPzogbnVtYmVyXG4gIG9mZnNldD86IE9mZnNldFxuICBbaW5kZXg6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgdHlwZSBTbmFwRnVuY3Rpb24gPSAoXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24sXG4gIG9mZnNldDogT2Zmc2V0LFxuICBpbmRleDogbnVtYmVyXG4pID0+IFNuYXBQb3NpdGlvblxuZXhwb3J0IHR5cGUgU25hcFRhcmdldCA9IFNuYXBQb3NpdGlvbiB8IFNuYXBGdW5jdGlvblxuZXhwb3J0IGludGVyZmFjZSBTbmFwT3B0aW9ucyB7XG4gIHRhcmdldHM6IFNuYXBUYXJnZXRbXVxuICAvLyB0YXJnZXQgcmFuZ2VcbiAgcmFuZ2U6IG51bWJlclxuICAvLyBzZWxmIHBvaW50cyBmb3Igc25hcHBpbmcuIFswLDBdID0gdG9wIGxlZnQsIFsxLDFdID0gYm90dG9tIHJpZ2h0XG4gIHJlbGF0aXZlUG9pbnRzOiBJbnRlcmFjdC5Qb2ludFtdXG4gIC8vIHN0YXJ0Q29vcmRzID0gb2Zmc2V0IHNuYXBwaW5nIGZyb20gZHJhZyBzdGFydCBwYWdlIHBvc2l0aW9uXG4gIG9mZnNldDogSW50ZXJhY3QuUG9pbnQgfCBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbSW50ZXJhY3QuSW50ZXJhY3Rpb25dPiB8ICdzdGFydENvb3JkcydcbiAgb2Zmc2V0V2l0aE9yaWdpbj86IGJvb2xlYW5cbiAgb3JpZ2luOiBJbnRlcmFjdC5SZWN0UmVzb2x2YWJsZTxbSW50ZXJhY3QuRWxlbWVudF0+IHwgSW50ZXJhY3QuUG9pbnRcbiAgZW5kT25seT86IGJvb2xlYW5cbiAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgU25hcFN0YXRlID0gTW9kaWZpZXJTdGF0ZTxTbmFwT3B0aW9ucywge1xuICBvZmZzZXRzPzogT2Zmc2V0W11cbiAgY2xvc2VzdD86IGFueVxuICB0YXJnZXRGaWVsZHM/OiBzdHJpbmdbXVtdXG59PlxuXG5mdW5jdGlvbiBzdGFydCAoYXJnOiBNb2RpZmllckFyZzxTbmFwU3RhdGU+KSB7XG4gIGNvbnN0IHsgaW50ZXJhY3Rpb24sIGludGVyYWN0YWJsZSwgZWxlbWVudCwgcmVjdCwgc3RhdGUsIHN0YXJ0T2Zmc2V0IH0gPSBhcmdcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBzdGF0ZVxuICBjb25zdCBvcmlnaW4gPSBvcHRpb25zLm9mZnNldFdpdGhPcmlnaW5cbiAgICA/IGdldE9yaWdpbihhcmcpXG4gICAgOiB7IHg6IDAsIHk6IDAgfVxuXG4gIGxldCBzbmFwT2Zmc2V0OiBJbnRlcmFjdC5Qb2ludFxuXG4gIGlmIChvcHRpb25zLm9mZnNldCA9PT0gJ3N0YXJ0Q29vcmRzJykge1xuICAgIHNuYXBPZmZzZXQgPSB7XG4gICAgICB4OiBpbnRlcmFjdGlvbi5jb29yZHMuc3RhcnQucGFnZS54LFxuICAgICAgeTogaW50ZXJhY3Rpb24uY29vcmRzLnN0YXJ0LnBhZ2UueSxcbiAgICB9XG4gIH1cbiAgZWxzZSAge1xuICAgIGNvbnN0IG9mZnNldFJlY3QgPSB1dGlscy5yZWN0LnJlc29sdmVSZWN0TGlrZShvcHRpb25zLm9mZnNldCBhcyBhbnksIGludGVyYWN0YWJsZSwgZWxlbWVudCwgW2ludGVyYWN0aW9uXSlcblxuICAgIHNuYXBPZmZzZXQgPSB1dGlscy5yZWN0LnJlY3RUb1hZKG9mZnNldFJlY3QpIHx8IHsgeDogMCwgeTogMCB9XG4gICAgc25hcE9mZnNldC54ICs9IG9yaWdpbi54XG4gICAgc25hcE9mZnNldC55ICs9IG9yaWdpbi55XG4gIH1cblxuICBjb25zdCB7IHJlbGF0aXZlUG9pbnRzIH0gPSBvcHRpb25zXG5cbiAgc3RhdGUub2Zmc2V0cyA9IHJlY3QgJiYgcmVsYXRpdmVQb2ludHMgJiYgcmVsYXRpdmVQb2ludHMubGVuZ3RoXG4gICAgPyAgcmVsYXRpdmVQb2ludHMubWFwKChyZWxhdGl2ZVBvaW50LCBpbmRleCkgPT4gKHtcbiAgICAgIGluZGV4LFxuICAgICAgcmVsYXRpdmVQb2ludCxcbiAgICAgIHg6IHN0YXJ0T2Zmc2V0LmxlZnQgLSAocmVjdC53aWR0aCAgKiByZWxhdGl2ZVBvaW50LngpICsgc25hcE9mZnNldC54LFxuICAgICAgeTogc3RhcnRPZmZzZXQudG9wICAtIChyZWN0LmhlaWdodCAqIHJlbGF0aXZlUG9pbnQueSkgKyBzbmFwT2Zmc2V0LnksXG4gICAgfSkpXG4gICAgOiBbdXRpbHMuZXh0ZW5kKHtcbiAgICAgIGluZGV4OiAwLFxuICAgICAgcmVsYXRpdmVQb2ludDogbnVsbCxcbiAgICB9LCBzbmFwT2Zmc2V0KV1cbn1cblxuZnVuY3Rpb24gc2V0IChhcmc6IE1vZGlmaWVyQXJnPFNuYXBTdGF0ZT4pIHtcbiAgY29uc3QgeyBpbnRlcmFjdGlvbiwgY29vcmRzLCBzdGF0ZSB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucywgb2Zmc2V0cyB9ID0gc3RhdGVcblxuICBjb25zdCBvcmlnaW4gPSB1dGlscy5nZXRPcmlnaW5YWShpbnRlcmFjdGlvbi5pbnRlcmFjdGFibGUsIGludGVyYWN0aW9uLmVsZW1lbnQsIGludGVyYWN0aW9uLnByZXBhcmVkLm5hbWUpXG4gIGNvbnN0IHBhZ2UgPSB1dGlscy5leHRlbmQoe30sIGNvb3JkcylcbiAgY29uc3QgdGFyZ2V0cyA9IFtdXG5cbiAgaWYgKCFvcHRpb25zLm9mZnNldFdpdGhPcmlnaW4pIHtcbiAgICBwYWdlLnggLT0gb3JpZ2luLnhcbiAgICBwYWdlLnkgLT0gb3JpZ2luLnlcbiAgfVxuXG4gIGZvciAoY29uc3Qgb2Zmc2V0IG9mIG9mZnNldHMpIHtcbiAgICBjb25zdCByZWxhdGl2ZVggPSBwYWdlLnggLSBvZmZzZXQueFxuICAgIGNvbnN0IHJlbGF0aXZlWSA9IHBhZ2UueSAtIG9mZnNldC55XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDAsIGxlbiA9IG9wdGlvbnMudGFyZ2V0cy5sZW5ndGg7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzbmFwVGFyZ2V0ID0gb3B0aW9ucy50YXJnZXRzW2luZGV4XVxuICAgICAgbGV0IHRhcmdldFxuXG4gICAgICBpZiAodXRpbHMuaXMuZnVuYyhzbmFwVGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0KHJlbGF0aXZlWCwgcmVsYXRpdmVZLCBpbnRlcmFjdGlvbiwgb2Zmc2V0LCBpbmRleClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0XG4gICAgICB9XG5cbiAgICAgIGlmICghdGFyZ2V0KSB7IGNvbnRpbnVlIH1cblxuICAgICAgdGFyZ2V0cy5wdXNoKHtcbiAgICAgICAgeDogKHV0aWxzLmlzLm51bWJlcih0YXJnZXQueCkgPyB0YXJnZXQueCA6IHJlbGF0aXZlWCkgKyBvZmZzZXQueCxcbiAgICAgICAgeTogKHV0aWxzLmlzLm51bWJlcih0YXJnZXQueSkgPyB0YXJnZXQueSA6IHJlbGF0aXZlWSkgKyBvZmZzZXQueSxcblxuICAgICAgICByYW5nZTogdXRpbHMuaXMubnVtYmVyKHRhcmdldC5yYW5nZSkgPyB0YXJnZXQucmFuZ2UgOiBvcHRpb25zLnJhbmdlLFxuICAgICAgICBzb3VyY2U6IHNuYXBUYXJnZXQsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBvZmZzZXQsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNsb3Nlc3QgPSB7XG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIGluUmFuZ2U6IGZhbHNlLFxuICAgIGRpc3RhbmNlOiAwLFxuICAgIHJhbmdlOiAwLFxuICAgIGRlbHRhOiB7IHg6IDAsIHk6IDAgfSxcbiAgfVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCByYW5nZSA9IHRhcmdldC5yYW5nZVxuICAgIGNvbnN0IGR4ID0gdGFyZ2V0LnggLSBwYWdlLnhcbiAgICBjb25zdCBkeSA9IHRhcmdldC55IC0gcGFnZS55XG4gICAgY29uc3QgZGlzdGFuY2UgPSB1dGlscy5oeXBvdChkeCwgZHkpXG4gICAgbGV0IGluUmFuZ2UgPSBkaXN0YW5jZSA8PSByYW5nZVxuXG4gICAgLy8gSW5maW5pdGUgdGFyZ2V0cyBjb3VudCBhcyBiZWluZyBvdXQgb2YgcmFuZ2VcbiAgICAvLyBjb21wYXJlZCB0byBub24gaW5maW5pdGUgb25lcyB0aGF0IGFyZSBpbiByYW5nZVxuICAgIGlmIChyYW5nZSA9PT0gSW5maW5pdHkgJiYgY2xvc2VzdC5pblJhbmdlICYmIGNsb3Nlc3QucmFuZ2UgIT09IEluZmluaXR5KSB7XG4gICAgICBpblJhbmdlID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIWNsb3Nlc3QudGFyZ2V0IHx8IChpblJhbmdlXG4gICAgICAvLyBpcyB0aGUgY2xvc2VzdCB0YXJnZXQgaW4gcmFuZ2U/XG4gICAgICA/IChjbG9zZXN0LmluUmFuZ2UgJiYgcmFuZ2UgIT09IEluZmluaXR5XG4gICAgICAgIC8vIHRoZSBwb2ludGVyIGlzIHJlbGF0aXZlbHkgZGVlcGVyIGluIHRoaXMgdGFyZ2V0XG4gICAgICAgID8gZGlzdGFuY2UgLyByYW5nZSA8IGNsb3Nlc3QuZGlzdGFuY2UgLyBjbG9zZXN0LnJhbmdlXG4gICAgICAgIC8vIHRoaXMgdGFyZ2V0IGhhcyBJbmZpbml0ZSByYW5nZSBhbmQgdGhlIGNsb3Nlc3QgZG9lc24ndFxuICAgICAgICA6IChyYW5nZSA9PT0gSW5maW5pdHkgJiYgY2xvc2VzdC5yYW5nZSAhPT0gSW5maW5pdHkpIHx8XG4gICAgICAgICAgLy8gT1IgdGhpcyB0YXJnZXQgaXMgY2xvc2VyIHRoYXQgdGhlIHByZXZpb3VzIGNsb3Nlc3RcbiAgICAgICAgICBkaXN0YW5jZSA8IGNsb3Nlc3QuZGlzdGFuY2UpXG4gICAgICAvLyBUaGUgb3RoZXIgaXMgbm90IGluIHJhbmdlIGFuZCB0aGUgcG9pbnRlciBpcyBjbG9zZXIgdG8gdGhpcyB0YXJnZXRcbiAgICAgIDogKCFjbG9zZXN0LmluUmFuZ2UgJiYgZGlzdGFuY2UgPCBjbG9zZXN0LmRpc3RhbmNlKSkpIHtcbiAgICAgIGNsb3Nlc3QudGFyZ2V0ID0gdGFyZ2V0XG4gICAgICBjbG9zZXN0LmRpc3RhbmNlID0gZGlzdGFuY2VcbiAgICAgIGNsb3Nlc3QucmFuZ2UgPSByYW5nZVxuICAgICAgY2xvc2VzdC5pblJhbmdlID0gaW5SYW5nZVxuICAgICAgY2xvc2VzdC5kZWx0YS54ID0gZHhcbiAgICAgIGNsb3Nlc3QuZGVsdGEueSA9IGR5XG4gICAgfVxuICB9XG5cbiAgaWYgKGNsb3Nlc3QuaW5SYW5nZSkge1xuICAgIGNvb3Jkcy54ID0gY2xvc2VzdC50YXJnZXQueFxuICAgIGNvb3Jkcy55ID0gY2xvc2VzdC50YXJnZXQueVxuICB9XG5cbiAgc3RhdGUuY2xvc2VzdCA9IGNsb3Nlc3RcbiAgcmV0dXJuIGNsb3Nlc3Rcbn1cblxuZnVuY3Rpb24gZ2V0T3JpZ2luIChhcmc6IFBhcnRpYWw8TW9kaWZpZXJBcmc8U25hcFN0YXRlPj4pIHtcbiAgY29uc3QgeyBlbGVtZW50IH0gPSBhcmcuaW50ZXJhY3Rpb25cbiAgY29uc3Qgb3B0aW9uc09yaWdpbiA9IHV0aWxzLnJlY3QucmVjdFRvWFkoXG4gICAgdXRpbHMucmVjdC5yZXNvbHZlUmVjdExpa2UoYXJnLnN0YXRlLm9wdGlvbnMub3JpZ2luIGFzIGFueSwgbnVsbCwgbnVsbCwgW2VsZW1lbnRdKSxcbiAgKVxuICBjb25zdCBvcmlnaW4gPSBvcHRpb25zT3JpZ2luIHx8IHV0aWxzLmdldE9yaWdpblhZKFxuICAgIGFyZy5pbnRlcmFjdGFibGUsXG4gICAgZWxlbWVudCxcbiAgICBhcmcuaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSxcbiAgKVxuXG4gIHJldHVybiBvcmlnaW5cbn1cblxuY29uc3QgZGVmYXVsdHM6IFNuYXBPcHRpb25zID0ge1xuICByYW5nZSAgOiBJbmZpbml0eSxcbiAgdGFyZ2V0czogbnVsbCxcbiAgb2Zmc2V0OiBudWxsLFxuICBvZmZzZXRXaXRoT3JpZ2luOiB0cnVlLFxuICBvcmlnaW46IG51bGwsXG4gIHJlbGF0aXZlUG9pbnRzOiBudWxsLFxuICBlbmRPbmx5OiBmYWxzZSxcbiAgZW5hYmxlZDogZmFsc2UsXG59XG5jb25zdCBzbmFwID0ge1xuICBzdGFydCxcbiAgc2V0LFxuICBkZWZhdWx0cyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHNuYXAsICdzbmFwJylcbmV4cG9ydCB7IHNuYXAgfVxuIiwiLy8gVGhpcyBtb2R1bGUgYWxsb3dzIHNuYXBwaW5nIG9mIHRoZSBzaXplIG9mIHRhcmdldHMgZHVyaW5nIHJlc2l6ZVxuLy8gaW50ZXJhY3Rpb25zLlxuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2V4dGVuZCdcbmltcG9ydCAqIGFzIGlzIGZyb20gJ0BpbnRlcmFjdGpzL3V0aWxzL2lzJ1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIG1ha2VNb2RpZmllciB9IGZyb20gJy4uL2Jhc2UnXG5pbXBvcnQgeyBTbmFwT3B0aW9ucywgU25hcFN0YXRlLCBzbmFwIH0gZnJvbSAnLi9wb2ludGVyJ1xuXG5leHBvcnQgdHlwZSBTbmFwU2l6ZU9wdGlvbnMgPSBQaWNrPFxuU25hcE9wdGlvbnMsXG4ndGFyZ2V0cycgfCAnb2Zmc2V0JyB8ICdlbmRPbmx5JyB8ICdyYW5nZScgfCAnZW5hYmxlZCdcbj5cblxuZnVuY3Rpb24gc3RhcnQgKGFyZzogTW9kaWZpZXJBcmc8U25hcFN0YXRlPikge1xuICBjb25zdCB7IHN0YXRlLCBlZGdlcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gc3RhdGVcblxuICBpZiAoIWVkZ2VzKSB7IHJldHVybiBudWxsIH1cblxuICBhcmcuc3RhdGUgPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgdGFyZ2V0czogbnVsbCxcbiAgICAgIHJlbGF0aXZlUG9pbnRzOiBbe1xuICAgICAgICB4OiBlZGdlcy5sZWZ0ID8gMCA6IDEsXG4gICAgICAgIHk6IGVkZ2VzLnRvcCA/IDAgOiAxLFxuICAgICAgfV0sXG4gICAgICBvZmZzZXQ6IG9wdGlvbnMub2Zmc2V0IHx8ICdzZWxmJyxcbiAgICAgIG9yaWdpbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICByYW5nZTogb3B0aW9ucy5yYW5nZSxcbiAgICB9LFxuICB9XG5cbiAgc3RhdGUudGFyZ2V0RmllbGRzID0gc3RhdGUudGFyZ2V0RmllbGRzIHx8IFtcbiAgICBbJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgIFsneCcsICd5J10sXG4gIF1cblxuICBzbmFwLnN0YXJ0KGFyZylcbiAgc3RhdGUub2Zmc2V0cyA9IGFyZy5zdGF0ZS5vZmZzZXRzXG5cbiAgYXJnLnN0YXRlID0gc3RhdGVcbn1cblxuZnVuY3Rpb24gc2V0IChhcmcpIHtcbiAgY29uc3QgeyBpbnRlcmFjdGlvbiwgc3RhdGUsIGNvb3JkcyB9ID0gYXJnXG4gIGNvbnN0IHsgb3B0aW9ucywgb2Zmc2V0cyB9ID0gc3RhdGVcbiAgY29uc3QgcmVsYXRpdmUgPSB7XG4gICAgeDogY29vcmRzLnggLSBvZmZzZXRzWzBdLngsXG4gICAgeTogY29vcmRzLnkgLSBvZmZzZXRzWzBdLnksXG4gIH1cblxuICBzdGF0ZS5vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKVxuICBzdGF0ZS5vcHRpb25zLnRhcmdldHMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc25hcFRhcmdldCBvZiAob3B0aW9ucy50YXJnZXRzIHx8IFtdKSkge1xuICAgIGxldCB0YXJnZXRcblxuICAgIGlmIChpcy5mdW5jKHNuYXBUYXJnZXQpKSB7XG4gICAgICB0YXJnZXQgPSBzbmFwVGFyZ2V0KHJlbGF0aXZlLngsIHJlbGF0aXZlLnksIGludGVyYWN0aW9uKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRhcmdldCA9IHNuYXBUYXJnZXRcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCkgeyBjb250aW51ZSB9XG5cbiAgICBmb3IgKGNvbnN0IFt4RmllbGQsIHlGaWVsZF0gb2Ygc3RhdGUudGFyZ2V0RmllbGRzKSB7XG4gICAgICBpZiAoeEZpZWxkIGluIHRhcmdldCB8fCB5RmllbGQgaW4gdGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC54ID0gdGFyZ2V0W3hGaWVsZF1cbiAgICAgICAgdGFyZ2V0LnkgPSB0YXJnZXRbeUZpZWxkXVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGUub3B0aW9ucy50YXJnZXRzLnB1c2godGFyZ2V0KVxuICB9XG5cbiAgY29uc3QgcmV0dXJuVmFsdWUgPSBzbmFwLnNldChhcmcpXG5cbiAgc3RhdGUub3B0aW9ucyA9IG9wdGlvbnNcblxuICByZXR1cm4gcmV0dXJuVmFsdWVcbn1cblxuY29uc3QgZGVmYXVsdHM6IFNuYXBTaXplT3B0aW9ucyA9IHtcbiAgcmFuZ2U6IEluZmluaXR5LFxuICB0YXJnZXRzOiBudWxsLFxuICBvZmZzZXQ6IG51bGwsXG4gIGVuZE9ubHk6IGZhbHNlLFxuICBlbmFibGVkOiBmYWxzZSxcbn1cblxuY29uc3Qgc25hcFNpemUgPSB7XG4gIHN0YXJ0LFxuICBzZXQsXG4gIGRlZmF1bHRzLFxufVxuXG5leHBvcnQgZGVmYXVsdCBtYWtlTW9kaWZpZXIoc25hcFNpemUsICdzbmFwU2l6ZScpXG5leHBvcnQgeyBzbmFwU2l6ZSB9XG4iLCIvKipcbiAqIEBtb2R1bGUgbW9kaWZpZXJzL3NuYXBFZGdlc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgYWxsb3dzIHNuYXBwaW5nIG9mIHRoZSBlZGdlcyBvZiB0YXJnZXRzIGR1cmluZyByZXNpemVcbiAqIGludGVyYWN0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJhY3QodGFyZ2V0KS5yZXNpemFibGUoe1xuICogICBzbmFwRWRnZXM6IHtcbiAqICAgICB0YXJnZXRzOiBbaW50ZXJhY3Quc25hcHBlcnMuZ3JpZCh7IHg6IDEwMCwgeTogNTAgfSldLFxuICogICB9LFxuICogfSlcbiAqXG4gKiBpbnRlcmFjdCh0YXJnZXQpLnJlc2l6YWJsZSh7XG4gKiAgIHNuYXBFZGdlczoge1xuICogICAgIHRhcmdldHM6IFtcbiAqICAgICAgIGludGVyYWN0LnNuYXBwZXJzLmdyaWQoe1xuICogICAgICAgIHRvcDogNTAsXG4gKiAgICAgICAgbGVmdDogNTAsXG4gKiAgICAgICAgYm90dG9tOiAxMDAsXG4gKiAgICAgICAgcmlnaHQ6IDEwMCxcbiAqICAgICAgIH0pLFxuICogICAgIF0sXG4gKiAgIH0sXG4gKiB9KVxuICovXG5cbmltcG9ydCBjbG9uZSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9jbG9uZSdcbmltcG9ydCBleHRlbmQgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXh0ZW5kJ1xuaW1wb3J0IHsgTW9kaWZpZXJBcmcsIE1vZGlmaWVyTW9kdWxlLCBtYWtlTW9kaWZpZXIgfSBmcm9tICcuLi9iYXNlJ1xuaW1wb3J0IHsgU25hcE9wdGlvbnMsIFNuYXBTdGF0ZSB9IGZyb20gJy4vcG9pbnRlcidcbmltcG9ydCB7IHNuYXBTaXplIH0gZnJvbSAnLi9zaXplJ1xuXG5leHBvcnQgdHlwZSBTbmFwRWRnZXNPcHRpb25zID0gUGljazxTbmFwT3B0aW9ucywgJ3RhcmdldHMnIHwgJ3JhbmdlJyB8ICdvZmZzZXQnIHwgJ2VuZE9ubHknIHwgJ2VuYWJsZWQnPlxuXG5mdW5jdGlvbiBzdGFydCAoYXJnOiBNb2RpZmllckFyZzxTbmFwU3RhdGU+KSB7XG4gIGNvbnN0IHsgZWRnZXMgfSA9IGFyZ1xuXG4gIGlmICghZWRnZXMpIHsgcmV0dXJuIG51bGwgfVxuXG4gIGFyZy5zdGF0ZS50YXJnZXRGaWVsZHMgPSBhcmcuc3RhdGUudGFyZ2V0RmllbGRzIHx8IFtcbiAgICBbZWRnZXMubGVmdCA/ICdsZWZ0JyA6ICdyaWdodCcsIGVkZ2VzLnRvcCA/ICd0b3AnIDogJ2JvdHRvbSddLFxuICBdXG5cbiAgcmV0dXJuIHNuYXBTaXplLnN0YXJ0KGFyZylcbn1cblxuY29uc3Qgc25hcEVkZ2VzOiBNb2RpZmllck1vZHVsZTxTbmFwRWRnZXNPcHRpb25zLCBTbmFwU3RhdGU+ID0ge1xuICBzdGFydCxcbiAgc2V0OiBzbmFwU2l6ZS5zZXQsXG4gIGRlZmF1bHRzOiBleHRlbmQoXG4gICAgY2xvbmUoc25hcFNpemUuZGVmYXVsdHMpLFxuICAgIHtcbiAgICAgIHRhcmdldHM6IG51bGwsXG4gICAgICByYW5nZTogbnVsbCxcbiAgICAgIG9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gICAgfSBhcyBjb25zdCxcbiAgKSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFrZU1vZGlmaWVyKHNuYXBFZGdlcywgJ3NuYXBFZGdlcycpXG5leHBvcnQgeyBzbmFwRWRnZXMgfVxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3BlY3RSYXRpbyB9IGZyb20gJy4vYXNwZWN0UmF0aW8nXG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlc3RyaWN0RWRnZXMgfSBmcm9tICcuL3Jlc3RyaWN0L2VkZ2VzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXN0cmljdCB9IGZyb20gJy4vcmVzdHJpY3QvcG9pbnRlcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVzdHJpY3RSZWN0IH0gZnJvbSAnLi9yZXN0cmljdC9yZWN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXN0cmljdFNpemUgfSBmcm9tICcuL3Jlc3RyaWN0L3NpemUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHNuYXBFZGdlcyB9IGZyb20gJy4vc25hcC9lZGdlcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc25hcCB9IGZyb20gJy4vc25hcC9wb2ludGVyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzbmFwU2l6ZSB9IGZyb20gJy4vc25hcC9zaXplJ1xuIiwiZnVuY3Rpb24gY3JlYXRlR3JpZCAoZ3JpZDogKFBhcnRpYWw8SW50ZXJhY3QuUmVjdD4gfCBJbnRlcmFjdC5Qb2ludCkgJiB7IHJhbmdlPzogbnVtYmVyLCBsaW1pdHM/OiBJbnRlcmFjdC5SZWN0LCBvZmZzZXQ/OiBJbnRlcmFjdC5Qb2ludCB9KSB7XG4gIGNvbnN0IGNvb3JkRmllbGRzID0gKFtcbiAgICBbJ3gnLCAneSddLFxuICAgIFsnbGVmdCcsICd0b3AnXSxcbiAgICBbJ3JpZ2h0JywgJ2JvdHRvbSddLFxuICAgIFsnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIF0gYXMgY29uc3QpLmZpbHRlcigoW3hGaWVsZCwgeUZpZWxkXSkgPT4geEZpZWxkIGluIGdyaWQgfHwgeUZpZWxkIGluIGdyaWQpXG5cbiAgY29uc3QgZ3JpZEZ1bmM6IEludGVyYWN0LlNuYXBGdW5jdGlvbiAmIHtcbiAgICBncmlkOiB0eXBlb2YgZ3JpZFxuICAgIGNvb3JkRmllbGRzOiB0eXBlb2YgY29vcmRGaWVsZHNcbiAgfSA9ICh4LCB5KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmFuZ2UsXG4gICAgICBsaW1pdHMgPSB7XG4gICAgICAgIGxlZnQgIDogLUluZmluaXR5LFxuICAgICAgICByaWdodCA6ICBJbmZpbml0eSxcbiAgICAgICAgdG9wICAgOiAtSW5maW5pdHksXG4gICAgICAgIGJvdHRvbTogIEluZmluaXR5LFxuICAgICAgfSxcbiAgICAgIG9mZnNldCA9IHsgeDogMCwgeTogMCB9LFxuICAgIH0gPSBncmlkXG5cbiAgICBjb25zdCByZXN1bHQ6IEludGVyYWN0LlNuYXBUYXJnZXQgJiB7XG4gICAgICBncmlkOiB0eXBlb2YgZ3JpZFxuICAgIH0gPSB7IHJhbmdlLCBncmlkLCB4OiBudWxsIGFzIG51bWJlciwgeTogbnVsbCBhcyBudW1iZXIgfVxuXG4gICAgZm9yIChjb25zdCBbeEZpZWxkLCB5RmllbGRdIG9mIGNvb3JkRmllbGRzKSB7XG4gICAgICBjb25zdCBncmlkeCA9IE1hdGgucm91bmQoKHggLSBvZmZzZXQueCkgLyAoZ3JpZCBhcyBhbnkpW3hGaWVsZF0pXG4gICAgICBjb25zdCBncmlkeSA9IE1hdGgucm91bmQoKHkgLSBvZmZzZXQueSkgLyAoZ3JpZCBhcyBhbnkpW3lGaWVsZF0pXG5cbiAgICAgIHJlc3VsdFt4RmllbGRdID0gTWF0aC5tYXgobGltaXRzLmxlZnQsIE1hdGgubWluKGxpbWl0cy5yaWdodCwgZ3JpZHggKiAoZ3JpZCBhcyBhbnkpW3hGaWVsZF0gKyBvZmZzZXQueCkpXG4gICAgICByZXN1bHRbeUZpZWxkXSA9IE1hdGgubWF4KGxpbWl0cy50b3AsIE1hdGgubWluKGxpbWl0cy5ib3R0b20sIGdyaWR5ICogKGdyaWQgYXMgYW55KVt5RmllbGRdICsgb2Zmc2V0LnkpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGdyaWRGdW5jLmdyaWQgPSBncmlkXG4gIGdyaWRGdW5jLmNvb3JkRmllbGRzID0gY29vcmRGaWVsZHNcblxuICByZXR1cm4gZ3JpZEZ1bmNcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlR3JpZFxuIiwiaW1wb3J0IGdyaWQgZnJvbSAnLi9ncmlkJ1xuXG5leHBvcnQgeyBncmlkIH1cbiIsImltcG9ydCBiYXNlIGZyb20gJy4vYmFzZSdcblxuaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vYWxsJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5pbXBvcnQgKiBhcyBzbmFwcGVycyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9zbmFwcGVycy9pbmRleCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2ludGVyYWN0L2luZGV4JyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdFN0YXRpYyB7XG4gICAgbW9kaWZpZXJzOiB0eXBlb2YgYWxsXG4gICAgc25hcHBlcnM6IHR5cGVvZiBzbmFwcGVyc1xuICAgIGNyZWF0ZVNuYXBHcmlkOiB0eXBlb2Ygc25hcHBlcnMuZ3JpZFxuICB9XG59XG5cbmNvbnN0IG1vZGlmaWVyczogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ21vZGlmaWVycycsXG4gIGluc3RhbGwgKHNjb3BlKSB7XG4gICAgY29uc3QgeyBpbnRlcmFjdCB9ID0gc2NvcGVcblxuICAgIHNjb3BlLnVzZVBsdWdpbihiYXNlKVxuXG4gICAgaW50ZXJhY3QubW9kaWZpZXJzID0gZXh0ZW5kKGludGVyYWN0Lm1vZGlmaWVycyB8fCB7fSwgYWxsKVxuICAgIGludGVyYWN0LnNuYXBwZXJzID0gZXh0ZW5kKGludGVyYWN0LnNuYXBwZXJzIHx8IHt9LCBzbmFwcGVycylcbiAgICBpbnRlcmFjdC5jcmVhdGVTbmFwR3JpZCA9IGludGVyYWN0LnNuYXBwZXJzLmdyaWRcblxuICAgIC8vIGZvciBiYWNrd3JhZHMgY29tcGF0aWJpbGl0eVxuICAgIGZvciAoY29uc3QgdHlwZSBpbiBhbGwpIHtcbiAgICAgIGNvbnN0IHsgX2RlZmF1bHRzLCBfbWV0aG9kcyB9ID0gYWxsW3R5cGUgYXMga2V5b2YgdHlwZW9mIGFsbF1cblxuICAgICAgOyhfZGVmYXVsdHMgYXMgYW55KS5fbWV0aG9kcyA9IF9tZXRob2RzXG4gICAgICA7KHNjb3BlLmRlZmF1bHRzLnBlckFjdGlvbiBhcyBhbnkpW3R5cGVdID0gX2RlZmF1bHRzXG4gICAgfVxuICB9LFxufVxuXG5leHBvcnQgZGVmYXVsdCBtb2RpZmllcnNcbiIsImltcG9ydCBCYXNlRXZlbnQgZnJvbSAnLi4vY29yZS9CYXNlRXZlbnQnXG5pbXBvcnQgKiBhcyBwb2ludGVyVXRpbHMgZnJvbSAnLi4vdXRpbHMvcG9pbnRlclV0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2ludGVyRXZlbnQ8VCBleHRlbmRzIHN0cmluZyA9IGFueT4gZXh0ZW5kcyBCYXNlRXZlbnQge1xuICB0eXBlOiBUXG4gIG9yaWdpbmFsRXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGVcbiAgcG9pbnRlcklkOiBudW1iZXJcbiAgcG9pbnRlclR5cGU6IHN0cmluZ1xuICBkb3VibGU6IGJvb2xlYW5cbiAgcGFnZVg6IG51bWJlclxuICBwYWdlWTogbnVtYmVyXG4gIGNsaWVudFg6IG51bWJlclxuICBjbGllbnRZOiBudW1iZXJcbiAgZHQ6IG51bWJlclxuICBldmVudGFibGU6IGFueVxuICBba2V5OiBzdHJpbmddOiBhbnlcblxuICAvKiogKi9cbiAgY29uc3RydWN0b3IgKFxuICAgIHR5cGU6IFQsXG4gICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PixcbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSxcbiAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXQsXG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0LkludGVyYWN0aW9uLFxuICAgIHRpbWVTdGFtcDogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcihpbnRlcmFjdGlvbilcbiAgICBwb2ludGVyVXRpbHMucG9pbnRlckV4dGVuZCh0aGlzLCBldmVudClcblxuICAgIGlmIChldmVudCAhPT0gcG9pbnRlcikge1xuICAgICAgcG9pbnRlclV0aWxzLnBvaW50ZXJFeHRlbmQodGhpcywgcG9pbnRlcilcbiAgICB9XG5cbiAgICB0aGlzLnRpbWVTdGFtcCAgICAgPSB0aW1lU3RhbXBcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBldmVudFxuICAgIHRoaXMudHlwZSAgICAgICAgICA9IHR5cGVcbiAgICB0aGlzLnBvaW50ZXJJZCAgICAgPSBwb2ludGVyVXRpbHMuZ2V0UG9pbnRlcklkKHBvaW50ZXIpXG4gICAgdGhpcy5wb2ludGVyVHlwZSAgID0gcG9pbnRlclV0aWxzLmdldFBvaW50ZXJUeXBlKHBvaW50ZXIpXG4gICAgdGhpcy50YXJnZXQgICAgICAgID0gZXZlbnRUYXJnZXRcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsXG5cbiAgICBpZiAodHlwZSA9PT0gJ3RhcCcpIHtcbiAgICAgIGNvbnN0IHBvaW50ZXJJbmRleCA9IGludGVyYWN0aW9uLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuICAgICAgdGhpcy5kdCA9IHRoaXMudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XS5kb3duVGltZVxuXG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24udGFwVGltZVxuXG4gICAgICB0aGlzLmRvdWJsZSA9ICEhKGludGVyYWN0aW9uLnByZXZUYXAgJiZcbiAgICAgICAgaW50ZXJhY3Rpb24ucHJldlRhcC50eXBlICE9PSAnZG91YmxldGFwJyAmJlxuICAgICAgICBpbnRlcmFjdGlvbi5wcmV2VGFwLnRhcmdldCA9PT0gdGhpcy50YXJnZXQgJiZcbiAgICAgICAgaW50ZXJ2YWwgPCA1MDApXG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdkb3VibGV0YXAnKSB7XG4gICAgICB0aGlzLmR0ID0gKHBvaW50ZXIgYXMgUG9pbnRlckV2ZW50PCd0YXAnPikudGltZVN0YW1wIC0gaW50ZXJhY3Rpb24udGFwVGltZVxuICAgIH1cbiAgfVxuXG4gIF9zdWJ0cmFjdE9yaWdpbiAoeyB4OiBvcmlnaW5YLCB5OiBvcmlnaW5ZIH06IEludGVyYWN0LlBvaW50KSB7XG4gICAgdGhpcy5wYWdlWCAgIC09IG9yaWdpblhcbiAgICB0aGlzLnBhZ2VZICAgLT0gb3JpZ2luWVxuICAgIHRoaXMuY2xpZW50WCAtPSBvcmlnaW5YXG4gICAgdGhpcy5jbGllbnRZIC09IG9yaWdpbllcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBfYWRkT3JpZ2luICh7IHg6IG9yaWdpblgsIHk6IG9yaWdpblkgfTogSW50ZXJhY3QuUG9pbnQpIHtcbiAgICB0aGlzLnBhZ2VYICAgKz0gb3JpZ2luWFxuICAgIHRoaXMucGFnZVkgICArPSBvcmlnaW5ZXG4gICAgdGhpcy5jbGllbnRYICs9IG9yaWdpblhcbiAgICB0aGlzLmNsaWVudFkgKz0gb3JpZ2luWVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgb3JpZ2luYWwgRXZlbnRcbiAgICovXG4gIHByZXZlbnREZWZhdWx0ICgpIHtcbiAgICB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG59XG5cbmV4cG9ydCB7IFBvaW50ZXJFdmVudCB9XG4iLCJpbXBvcnQgeyBQZXJBY3Rpb25EZWZhdWx0cyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgRXZlbnRhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvRXZlbnRhYmxlJ1xuaW1wb3J0IEludGVyYWN0aW9uIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3Rpb24nXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcbmltcG9ydCBQb2ludGVyRXZlbnQgZnJvbSAnLi9Qb2ludGVyRXZlbnQnXG5cbmV4cG9ydCB0eXBlIEV2ZW50VGFyZ2V0TGlzdCA9IEFycmF5PHtcbiAgbm9kZTogTm9kZVxuICBldmVudGFibGU6IEV2ZW50YWJsZVxuICBwcm9wczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufT5cblxuZXhwb3J0IGludGVyZmFjZSBQb2ludGVyRXZlbnRPcHRpb25zIGV4dGVuZHMgUGVyQWN0aW9uRGVmYXVsdHMge1xuICBlbmFibGVkPzogdW5kZWZpbmVkIC8vIG5vdCB1c2VkXG4gIGhvbGREdXJhdGlvbj86IG51bWJlclxuICBpZ25vcmVGcm9tPzogYW55XG4gIGFsbG93RnJvbT86IGFueVxuICBvcmlnaW4/OiBJbnRlcmFjdC5Qb2ludCB8IHN0cmluZyB8IEludGVyYWN0LkVsZW1lbnRcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnIHtcbiAgaW50ZXJmYWNlIFNjb3BlIHtcbiAgICBwb2ludGVyRXZlbnRzOiB0eXBlb2YgcG9pbnRlckV2ZW50c1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0aW9uJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGlvbiB7XG4gICAgcHJldlRhcD86IFBvaW50ZXJFdmVudDxzdHJpbmc+XG4gICAgdGFwVGltZT86IG51bWJlclxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL1BvaW50ZXJJbmZvJyB7XG4gIGludGVyZmFjZSBQb2ludGVySW5mbyB7XG4gICAgaG9sZD86IHtcbiAgICAgIGR1cmF0aW9uOiBudW1iZXJcbiAgICAgIHRpbWVvdXQ6IGFueVxuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9kZWZhdWx0T3B0aW9ucycge1xuICBpbnRlcmZhY2UgQWN0aW9uRGVmYXVsdHMge1xuICAgIHBvaW50ZXJFdmVudHM6IEludGVyYWN0Lk9wdGlvbnNcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9zY29wZScge1xuICBpbnRlcmZhY2UgU2lnbmFsQXJncyB7XG4gICAgJ3BvaW50ZXJFdmVudHM6bmV3JzogeyBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+IH1cbiAgICAncG9pbnRlckV2ZW50czpmaXJlZCc6IHtcbiAgICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblxuICAgICAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICAgICAgZXZlbnQ6IEludGVyYWN0LlBvaW50ZXJFdmVudFR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICAgICAgZXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gICAgICBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICB0YXJnZXRzPzogRXZlbnRUYXJnZXRMaXN0XG4gICAgICB0eXBlOiBzdHJpbmdcbiAgICB9XG4gICAgJ3BvaW50ZXJFdmVudHM6Y29sbGVjdC10YXJnZXRzJzoge1xuICAgICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uXG4gICAgICBwb2ludGVyOiBJbnRlcmFjdC5Qb2ludGVyVHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgICBldmVudFRhcmdldDogSW50ZXJhY3QuRXZlbnRUYXJnZXRcbiAgICAgIHRhcmdldHM/OiBFdmVudFRhcmdldExpc3RcbiAgICAgIHR5cGU6IHN0cmluZ1xuICAgICAgcGF0aDogTm9kZVtdXG4gICAgICBub2RlOiBudWxsXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlZmF1bHRzOiBQb2ludGVyRXZlbnRPcHRpb25zID0ge1xuICBob2xkRHVyYXRpb246IDYwMCxcbiAgaWdub3JlRnJvbSAgOiBudWxsLFxuICBhbGxvd0Zyb20gICA6IG51bGwsXG4gIG9yaWdpbiAgICAgIDogeyB4OiAwLCB5OiAwIH0sXG59XG5cbmNvbnN0IHBvaW50ZXJFdmVudHMgPSB7XG4gIGlkOiAncG9pbnRlci1ldmVudHMvYmFzZScsXG4gIGluc3RhbGwsXG4gIGxpc3RlbmVyczoge1xuICAgICdpbnRlcmFjdGlvbnM6bmV3JzogYWRkSW50ZXJhY3Rpb25Qcm9wcyxcbiAgICAnaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJzogYWRkSG9sZEluZm8sXG4gICAgJ2ludGVyYWN0aW9uczptb3ZlJzogbW92ZUFuZENsZWFySG9sZCxcbiAgICAnaW50ZXJhY3Rpb25zOmRvd24nOiAoYXJnLCBzY29wZSkgPT4ge1xuICAgICAgZG93bkFuZFN0YXJ0SG9sZChhcmcsIHNjb3BlKVxuICAgICAgZmlyZShhcmcsIHNjb3BlKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczp1cCc6IChhcmcsIHNjb3BlKSA9PiB7XG4gICAgICBjbGVhckhvbGQoYXJnKVxuICAgICAgZmlyZShhcmcsIHNjb3BlKVxuICAgICAgdGFwQWZ0ZXJVcChhcmcsIHNjb3BlKVxuICAgIH0sXG4gICAgJ2ludGVyYWN0aW9uczpjYW5jZWwnOiAoYXJnLCBzY29wZSkgPT4ge1xuICAgICAgY2xlYXJIb2xkKGFyZylcbiAgICAgIGZpcmUoYXJnLCBzY29wZSlcbiAgICB9LFxuICB9LFxuICBQb2ludGVyRXZlbnQsXG4gIGZpcmUsXG4gIGNvbGxlY3RFdmVudFRhcmdldHMsXG4gIGRlZmF1bHRzLFxuICB0eXBlczoge1xuICAgIGRvd246IHRydWUsXG4gICAgbW92ZTogdHJ1ZSxcbiAgICB1cDogdHJ1ZSxcbiAgICBjYW5jZWw6IHRydWUsXG4gICAgdGFwOiB0cnVlLFxuICAgIGRvdWJsZXRhcDogdHJ1ZSxcbiAgICBob2xkOiB0cnVlLFxuICB9IGFzIHsgW3R5cGU6IHN0cmluZ106IHRydWUgfSxcbn1cblxuZnVuY3Rpb24gZmlyZTxUIGV4dGVuZHMgc3RyaW5nPiAoXG4gIGFyZzoge1xuICAgIHBvaW50ZXI6IEludGVyYWN0LlBvaW50ZXJUeXBlIHwgUG9pbnRlckV2ZW50PGFueT5cbiAgICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gICAgZXZlbnRUYXJnZXQ6IEludGVyYWN0LkV2ZW50VGFyZ2V0XG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uXG4gICAgdHlwZTogVFxuICAgIHRhcmdldHM/OiBFdmVudFRhcmdldExpc3RcbiAgfSxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlcmFjdGlvbixcbiAgICBwb2ludGVyLFxuICAgIGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0LFxuICAgIHR5cGUsXG4gICAgdGFyZ2V0cyA9IGNvbGxlY3RFdmVudFRhcmdldHMoYXJnLCBzY29wZSksXG4gIH0gPSBhcmdcblxuICBjb25zdCBwb2ludGVyRXZlbnQgPSBuZXcgUG9pbnRlckV2ZW50KHR5cGUsIHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCwgaW50ZXJhY3Rpb24sIHNjb3BlLm5vdygpKVxuXG4gIHNjb3BlLmZpcmUoJ3BvaW50ZXJFdmVudHM6bmV3JywgeyBwb2ludGVyRXZlbnQgfSlcblxuICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgaW50ZXJhY3Rpb24sXG4gICAgcG9pbnRlcixcbiAgICBldmVudCxcbiAgICBldmVudFRhcmdldCxcbiAgICB0YXJnZXRzLFxuICAgIHR5cGUsXG4gICAgcG9pbnRlckV2ZW50LFxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0c1tpXVxuXG4gICAgZm9yIChjb25zdCBwcm9wIGluIHRhcmdldC5wcm9wcyB8fCB7fSkge1xuICAgICAgKHBvaW50ZXJFdmVudCBhcyBhbnkpW3Byb3BdID0gdGFyZ2V0LnByb3BzW3Byb3BdXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luID0gdXRpbHMuZ2V0T3JpZ2luWFkodGFyZ2V0LmV2ZW50YWJsZSwgdGFyZ2V0Lm5vZGUpXG5cbiAgICBwb2ludGVyRXZlbnQuX3N1YnRyYWN0T3JpZ2luKG9yaWdpbilcbiAgICBwb2ludGVyRXZlbnQuZXZlbnRhYmxlID0gdGFyZ2V0LmV2ZW50YWJsZVxuICAgIHBvaW50ZXJFdmVudC5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0Lm5vZGVcblxuICAgIHRhcmdldC5ldmVudGFibGUuZmlyZShwb2ludGVyRXZlbnQpXG5cbiAgICBwb2ludGVyRXZlbnQuX2FkZE9yaWdpbihvcmlnaW4pXG5cbiAgICBpZiAocG9pbnRlckV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCB8fFxuICAgICAgICAocG9pbnRlckV2ZW50LnByb3BhZ2F0aW9uU3RvcHBlZCAmJlxuICAgICAgICAgICAgKGkgKyAxKSA8IHRhcmdldHMubGVuZ3RoICYmIHRhcmdldHNbaSArIDFdLm5vZGUgIT09IHBvaW50ZXJFdmVudC5jdXJyZW50VGFyZ2V0KSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBzY29wZS5maXJlKCdwb2ludGVyRXZlbnRzOmZpcmVkJywgc2lnbmFsQXJnKVxuXG4gIGlmICh0eXBlID09PSAndGFwJykge1xuICAgIC8vIGlmIHBvaW50ZXJFdmVudCBzaG91bGQgbWFrZSBhIGRvdWJsZSB0YXAsIGNyZWF0ZSBhbmQgZmlyZSBhIGRvdWJsZXRhcFxuICAgIC8vIFBvaW50ZXJFdmVudCBhbmQgdXNlIHRoYXQgYXMgdGhlIHByZXZUYXBcbiAgICBjb25zdCBwcmV2VGFwID0gcG9pbnRlckV2ZW50LmRvdWJsZVxuICAgICAgPyBmaXJlKHtcbiAgICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICAgIHBvaW50ZXIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgdHlwZTogJ2RvdWJsZXRhcCcsXG4gICAgICB9LCBzY29wZSlcbiAgICAgIDogcG9pbnRlckV2ZW50XG5cbiAgICBpbnRlcmFjdGlvbi5wcmV2VGFwID0gcHJldlRhcFxuICAgIGludGVyYWN0aW9uLnRhcFRpbWUgPSBwcmV2VGFwLnRpbWVTdGFtcFxuICB9XG5cbiAgcmV0dXJuIHBvaW50ZXJFdmVudFxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RXZlbnRUYXJnZXRzPFQgZXh0ZW5kcyBzdHJpbmc+ICh7IGludGVyYWN0aW9uLCBwb2ludGVyLCBldmVudCwgZXZlbnRUYXJnZXQsIHR5cGUgfToge1xuICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb25cbiAgcG9pbnRlcjogSW50ZXJhY3QuUG9pbnRlclR5cGUgfCBQb2ludGVyRXZlbnQ8YW55PlxuICBldmVudDogSW50ZXJhY3QuUG9pbnRlckV2ZW50VHlwZSB8IFBvaW50ZXJFdmVudDxhbnk+XG4gIGV2ZW50VGFyZ2V0OiBJbnRlcmFjdC5FdmVudFRhcmdldFxuICB0eXBlOiBUXG59LCBzY29wZTogSW50ZXJhY3QuU2NvcGUpIHtcbiAgY29uc3QgcG9pbnRlckluZGV4ID0gaW50ZXJhY3Rpb24uZ2V0UG9pbnRlckluZGV4KHBvaW50ZXIpXG4gIGNvbnN0IHBvaW50ZXJJbmZvID0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XVxuXG4gIC8vIGRvIG5vdCBmaXJlIGEgdGFwIGV2ZW50IGlmIHRoZSBwb2ludGVyIHdhcyBtb3ZlZCBiZWZvcmUgYmVpbmcgbGlmdGVkXG4gIGlmICh0eXBlID09PSAndGFwJyAmJiAoaW50ZXJhY3Rpb24ucG9pbnRlcldhc01vdmVkIHx8XG4gICAgICAvLyBvciBpZiB0aGUgcG9pbnRlcnVwIHRhcmdldCBpcyBkaWZmZXJlbnQgdG8gdGhlIHBvaW50ZXJkb3duIHRhcmdldFxuICAgICAgIShwb2ludGVySW5mbyAmJiBwb2ludGVySW5mby5kb3duVGFyZ2V0ID09PSBldmVudFRhcmdldCkpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBwYXRoID0gdXRpbHMuZG9tLmdldFBhdGgoZXZlbnRUYXJnZXQgYXMgSW50ZXJhY3QuRWxlbWVudCB8IERvY3VtZW50KVxuICBjb25zdCBzaWduYWxBcmcgPSB7XG4gICAgaW50ZXJhY3Rpb24sXG4gICAgcG9pbnRlcixcbiAgICBldmVudCxcbiAgICBldmVudFRhcmdldCxcbiAgICB0eXBlLFxuICAgIHBhdGgsXG4gICAgdGFyZ2V0czogW10gYXMgRXZlbnRUYXJnZXRMaXN0LFxuICAgIG5vZGU6IG51bGwsXG4gIH1cblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgcGF0aCkge1xuICAgIHNpZ25hbEFyZy5ub2RlID0gbm9kZVxuXG4gICAgc2NvcGUuZmlyZSgncG9pbnRlckV2ZW50czpjb2xsZWN0LXRhcmdldHMnLCBzaWduYWxBcmcpXG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ2hvbGQnKSB7XG4gICAgc2lnbmFsQXJnLnRhcmdldHMgPSBzaWduYWxBcmcudGFyZ2V0cy5maWx0ZXIodGFyZ2V0ID0+XG4gICAgICB0YXJnZXQuZXZlbnRhYmxlLm9wdGlvbnMuaG9sZER1cmF0aW9uID09PSBpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQuZHVyYXRpb24pXG4gIH1cblxuICByZXR1cm4gc2lnbmFsQXJnLnRhcmdldHNcbn1cblxuZnVuY3Rpb24gYWRkSW50ZXJhY3Rpb25Qcm9wcyAoeyBpbnRlcmFjdGlvbiB9KSB7XG4gIGludGVyYWN0aW9uLnByZXZUYXAgPSBudWxsICAgLy8gdGhlIG1vc3QgcmVjZW50IHRhcCBldmVudCBvbiB0aGlzIGludGVyYWN0aW9uXG4gIGludGVyYWN0aW9uLnRhcFRpbWUgPSAwICAgICAvLyB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCB0YXAgZXZlbnRcbn1cblxuZnVuY3Rpb24gYWRkSG9sZEluZm8gKHsgZG93biwgcG9pbnRlckluZm8gfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOnVwZGF0ZS1wb2ludGVyJ10pIHtcbiAgaWYgKCFkb3duICYmIHBvaW50ZXJJbmZvLmhvbGQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHBvaW50ZXJJbmZvLmhvbGQgPSB7IGR1cmF0aW9uOiBJbmZpbml0eSwgdGltZW91dDogbnVsbCB9XG59XG5cbmZ1bmN0aW9uIGNsZWFySG9sZCAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlckluZGV4IH0pIHtcbiAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJzW3BvaW50ZXJJbmRleF0uaG9sZCkge1xuICAgIGNsZWFyVGltZW91dChpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQudGltZW91dClcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQW5kQ2xlYXJIb2xkIChcbiAgeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBkdXBsaWNhdGUgfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOm1vdmUnXSxcbiAgc2NvcGU6IEludGVyYWN0LlNjb3BlLFxuKSB7XG4gIGNvbnN0IHBvaW50ZXJJbmRleCA9IGludGVyYWN0aW9uLmdldFBvaW50ZXJJbmRleChwb2ludGVyKVxuXG4gIGlmICghZHVwbGljYXRlICYmICghaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93biB8fCBpbnRlcmFjdGlvbi5wb2ludGVyV2FzTW92ZWQpKSB7XG4gICAgaWYgKGludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd24pIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcmFjdGlvbi5wb2ludGVyc1twb2ludGVySW5kZXhdLmhvbGQudGltZW91dClcbiAgICB9XG5cbiAgICBmaXJlKHtcbiAgICAgIGludGVyYWN0aW9uLFxuICAgICAgcG9pbnRlcixcbiAgICAgIGV2ZW50LFxuICAgICAgZXZlbnRUYXJnZXQ6IGV2ZW50VGFyZ2V0IGFzIEludGVyYWN0LkVsZW1lbnQsXG4gICAgICB0eXBlOiAnbW92ZScsXG4gICAgfSwgc2NvcGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gZG93bkFuZFN0YXJ0SG9sZCAoeyBpbnRlcmFjdGlvbiwgcG9pbnRlciwgZXZlbnQsIGV2ZW50VGFyZ2V0LCBwb2ludGVySW5kZXggfTogSW50ZXJhY3QuU2lnbmFsQXJnc1snaW50ZXJhY3Rpb25zOmRvd24nXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGNvbnN0IHRpbWVyID0gaW50ZXJhY3Rpb24ucG9pbnRlcnNbcG9pbnRlckluZGV4XS5ob2xkXG4gIGNvbnN0IHBhdGggPSB1dGlscy5kb20uZ2V0UGF0aChldmVudFRhcmdldCBhcyBJbnRlcmFjdC5FbGVtZW50IHwgRG9jdW1lbnQpXG4gIGNvbnN0IHNpZ25hbEFyZyA9IHtcbiAgICBpbnRlcmFjdGlvbixcbiAgICBwb2ludGVyLFxuICAgIGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0LFxuICAgIHR5cGU6ICdob2xkJyxcbiAgICB0YXJnZXRzOiBbXSBhcyBFdmVudFRhcmdldExpc3QsXG4gICAgcGF0aCxcbiAgICBub2RlOiBudWxsLFxuICB9XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIHBhdGgpIHtcbiAgICBzaWduYWxBcmcubm9kZSA9IG5vZGVcblxuICAgIHNjb3BlLmZpcmUoJ3BvaW50ZXJFdmVudHM6Y29sbGVjdC10YXJnZXRzJywgc2lnbmFsQXJnKVxuICB9XG5cbiAgaWYgKCFzaWduYWxBcmcudGFyZ2V0cy5sZW5ndGgpIHsgcmV0dXJuIH1cblxuICBsZXQgbWluRHVyYXRpb24gPSBJbmZpbml0eVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHNpZ25hbEFyZy50YXJnZXRzKSB7XG4gICAgY29uc3QgaG9sZER1cmF0aW9uID0gdGFyZ2V0LmV2ZW50YWJsZS5vcHRpb25zLmhvbGREdXJhdGlvblxuXG4gICAgaWYgKGhvbGREdXJhdGlvbiA8IG1pbkR1cmF0aW9uKSB7XG4gICAgICBtaW5EdXJhdGlvbiA9IGhvbGREdXJhdGlvblxuICAgIH1cbiAgfVxuXG4gIHRpbWVyLmR1cmF0aW9uID0gbWluRHVyYXRpb25cbiAgdGltZXIudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGZpcmUoe1xuICAgICAgaW50ZXJhY3Rpb24sXG4gICAgICBldmVudFRhcmdldCxcbiAgICAgIHBvaW50ZXIsXG4gICAgICBldmVudCxcbiAgICAgIHR5cGU6ICdob2xkJyxcbiAgICB9LCBzY29wZSlcbiAgfSwgbWluRHVyYXRpb24pXG59XG5cbmZ1bmN0aW9uIHRhcEFmdGVyVXAgKHsgaW50ZXJhY3Rpb24sIHBvaW50ZXIsIGV2ZW50LCBldmVudFRhcmdldCB9OiBJbnRlcmFjdC5TaWduYWxBcmdzWydpbnRlcmFjdGlvbnM6dXAnXSwgc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIGlmICghaW50ZXJhY3Rpb24ucG9pbnRlcldhc01vdmVkKSB7XG4gICAgZmlyZSh7IGludGVyYWN0aW9uLCBldmVudFRhcmdldCwgcG9pbnRlciwgZXZlbnQsIHR5cGU6ICd0YXAnIH0sIHNjb3BlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBzY29wZS5wb2ludGVyRXZlbnRzID0gcG9pbnRlckV2ZW50c1xuICBzY29wZS5kZWZhdWx0cy5hY3Rpb25zLnBvaW50ZXJFdmVudHMgPSBwb2ludGVyRXZlbnRzLmRlZmF1bHRzXG4gIHV0aWxzLmV4dGVuZChzY29wZS5hY3Rpb25zLnBoYXNlbGVzc1R5cGVzLCBwb2ludGVyRXZlbnRzLnR5cGVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCBwb2ludGVyRXZlbnRzXG4iLCJpbXBvcnQgeyBMaXN0ZW5lck1hcCB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvc2NvcGUnXG5pbXBvcnQgYmFzZVBsdWdpbiBmcm9tICcuL2Jhc2UnXG5pbXBvcnQgUG9pbnRlckV2ZW50IGZyb20gJy4vUG9pbnRlckV2ZW50J1xuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIGhvbGRJbnRlcnZhbEhhbmRsZT86IGFueVxuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9wb2ludGVyLWV2ZW50cy9Qb2ludGVyRXZlbnQnIHtcbiAgaW50ZXJmYWNlIFBvaW50ZXJFdmVudDxUIGV4dGVuZHMgc3RyaW5nID0gYW55PiB7XG4gICAgY291bnQ/OiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvcG9pbnRlci1ldmVudHMvYmFzZScge1xuICBpbnRlcmZhY2UgUG9pbnRlckV2ZW50T3B0aW9ucyB7XG4gICAgaG9sZFJlcGVhdEludGVydmFsPzogbnVtYmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gIHNjb3BlLnVzZVBsdWdpbihiYXNlUGx1Z2luKVxuXG4gIGNvbnN0IHtcbiAgICBwb2ludGVyRXZlbnRzLFxuICB9ID0gc2NvcGVcblxuICAvLyBkb24ndCByZXBlYXQgYnkgZGVmYXVsdFxuICBwb2ludGVyRXZlbnRzLmRlZmF1bHRzLmhvbGRSZXBlYXRJbnRlcnZhbCA9IDBcbiAgcG9pbnRlckV2ZW50cy50eXBlcy5ob2xkcmVwZWF0ID0gc2NvcGUuYWN0aW9ucy5waGFzZWxlc3NUeXBlcy5ob2xkcmVwZWF0ID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBvbk5ldyAoeyBwb2ludGVyRXZlbnQgfTogeyBwb2ludGVyRXZlbnQ6IFBvaW50ZXJFdmVudDxhbnk+IH0pIHtcbiAgaWYgKHBvaW50ZXJFdmVudC50eXBlICE9PSAnaG9sZCcpIHsgcmV0dXJuIH1cblxuICBwb2ludGVyRXZlbnQuY291bnQgPSAocG9pbnRlckV2ZW50LmNvdW50IHx8IDApICsgMVxufVxuXG5mdW5jdGlvbiBvbkZpcmVkIChcbiAgeyBpbnRlcmFjdGlvbiwgcG9pbnRlckV2ZW50LCBldmVudFRhcmdldCwgdGFyZ2V0cyB9OiBJbnRlcmFjdC5TaWduYWxBcmdzWydwb2ludGVyRXZlbnRzOmZpcmVkJ10sXG4gIHNjb3BlOiBJbnRlcmFjdC5TY29wZSxcbikge1xuICBpZiAocG9pbnRlckV2ZW50LnR5cGUgIT09ICdob2xkJyB8fCAhdGFyZ2V0cy5sZW5ndGgpIHsgcmV0dXJuIH1cblxuICAvLyBnZXQgdGhlIHJlcGVhdCBpbnRlcnZhbCBmcm9tIHRoZSBmaXJzdCBldmVudGFibGVcbiAgY29uc3QgaW50ZXJ2YWwgPSB0YXJnZXRzWzBdLmV2ZW50YWJsZS5vcHRpb25zLmhvbGRSZXBlYXRJbnRlcnZhbFxuXG4gIC8vIGRvbid0IHJlcGVhdCBpZiB0aGUgaW50ZXJ2YWwgaXMgMCBvciBsZXNzXG4gIGlmIChpbnRlcnZhbCA8PSAwKSB7IHJldHVybiB9XG5cbiAgLy8gc2V0IGEgdGltZW91dCB0byBmaXJlIHRoZSBob2xkcmVwZWF0IGV2ZW50XG4gIGludGVyYWN0aW9uLmhvbGRJbnRlcnZhbEhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHNjb3BlLnBvaW50ZXJFdmVudHMuZmlyZSh7XG4gICAgICBpbnRlcmFjdGlvbixcbiAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgdHlwZTogJ2hvbGQnLFxuICAgICAgcG9pbnRlcjogcG9pbnRlckV2ZW50LFxuICAgICAgZXZlbnQ6IHBvaW50ZXJFdmVudCxcbiAgICB9LCBzY29wZSlcbiAgfSwgaW50ZXJ2YWwpXG59XG5cbmZ1bmN0aW9uIGVuZEhvbGRSZXBlYXQgKHsgaW50ZXJhY3Rpb24gfTogeyBpbnRlcmFjdGlvbjogSW50ZXJhY3QuSW50ZXJhY3Rpb24gfSkge1xuICAvLyBzZXQgdGhlIGludGVyYWN0aW9uJ3MgaG9sZFN0b3BUaW1lIHByb3BlcnR5XG4gIC8vIHRvIHN0b3AgZnVydGhlciBob2xkUmVwZWF0IGV2ZW50c1xuICBpZiAoaW50ZXJhY3Rpb24uaG9sZEludGVydmFsSGFuZGxlKSB7XG4gICAgY2xlYXJJbnRlcnZhbChpbnRlcmFjdGlvbi5ob2xkSW50ZXJ2YWxIYW5kbGUpXG4gICAgaW50ZXJhY3Rpb24uaG9sZEludGVydmFsSGFuZGxlID0gbnVsbFxuICB9XG59XG5cbmNvbnN0IGhvbGRSZXBlYXQ6IEludGVyYWN0LlBsdWdpbiA9IHtcbiAgaWQ6ICdwb2ludGVyLWV2ZW50cy9ob2xkUmVwZWF0JyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiBbJ21vdmUnLCAndXAnLCAnY2FuY2VsJywgJ2VuZGFsbCddLnJlZHVjZShcbiAgICAoYWNjLCBlbmRlclR5cGVzKSA9PiB7XG4gICAgICAoYWNjIGFzIGFueSlbYHBvaW50ZXJFdmVudHM6JHtlbmRlclR5cGVzfWBdID0gZW5kSG9sZFJlcGVhdFxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sXG4gICAge1xuICAgICAgJ3BvaW50ZXJFdmVudHM6bmV3Jzogb25OZXcsXG4gICAgICAncG9pbnRlckV2ZW50czpmaXJlZCc6IG9uRmlyZWQsXG4gICAgfSBhcyBMaXN0ZW5lck1hcCxcbiAgKSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgaG9sZFJlcGVhdFxuIiwiaW1wb3J0IHsgU2NvcGUgfSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJ1xuaW1wb3J0IGV4dGVuZCBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9leHRlbmQnXG5cbnR5cGUgSW50ZXJhY3RhYmxlID0gaW1wb3J0ICgnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGFibGUnKS5kZWZhdWx0XG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL0ludGVyYWN0YWJsZScge1xuICBpbnRlcmZhY2UgSW50ZXJhY3RhYmxlIHtcbiAgICBwb2ludGVyRXZlbnRzOiB0eXBlb2YgcG9pbnRlckV2ZW50c01ldGhvZFxuICAgIF9fYmFja0NvbXBhdE9wdGlvbjogKG9wdGlvbk5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkgPT4gYW55XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoc2NvcGU6IFNjb3BlKSB7XG4gIGNvbnN0IHsgSW50ZXJhY3RhYmxlIH0gPSBzY29wZVxuXG4gIEludGVyYWN0YWJsZS5wcm90b3R5cGUucG9pbnRlckV2ZW50cyA9IHBvaW50ZXJFdmVudHNNZXRob2RcblxuICBjb25zdCBfX2JhY2tDb21wYXRPcHRpb24gPSBJbnRlcmFjdGFibGUucHJvdG90eXBlLl9iYWNrQ29tcGF0T3B0aW9uXG5cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5fYmFja0NvbXBhdE9wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25OYW1lLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IHJldCA9IF9fYmFja0NvbXBhdE9wdGlvbi5jYWxsKHRoaXMsIG9wdGlvbk5hbWUsIG5ld1ZhbHVlKVxuXG4gICAgaWYgKHJldCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5ldmVudHMub3B0aW9uc1tvcHRpb25OYW1lXSA9IG5ld1ZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJFdmVudHNNZXRob2QgKHRoaXM6IEludGVyYWN0LkludGVyYWN0YWJsZSwgb3B0aW9uczogYW55KSB7XG4gIGV4dGVuZCh0aGlzLmV2ZW50cy5vcHRpb25zLCBvcHRpb25zKVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmNvbnN0IHBsdWdpbjogSW50ZXJhY3QuUGx1Z2luID0ge1xuICBpZDogJ3BvaW50ZXItZXZlbnRzL2ludGVyYWN0YWJsZVRhcmdldHMnLFxuICBpbnN0YWxsLFxuICBsaXN0ZW5lcnM6IHtcbiAgICAncG9pbnRlckV2ZW50czpjb2xsZWN0LXRhcmdldHMnOiAoe1xuICAgICAgdGFyZ2V0cyxcbiAgICAgIG5vZGUsXG4gICAgICB0eXBlLFxuICAgICAgZXZlbnRUYXJnZXQsXG4gICAgfSwgc2NvcGUpID0+IHtcbiAgICAgIHNjb3BlLmludGVyYWN0YWJsZXMuZm9yRWFjaE1hdGNoKG5vZGUsIChpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSkgPT4ge1xuICAgICAgICBjb25zdCBldmVudGFibGUgPSBpbnRlcmFjdGFibGUuZXZlbnRzXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBldmVudGFibGUub3B0aW9uc1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBldmVudGFibGUudHlwZXNbdHlwZV0gJiZcbiAgICAgICAgICBldmVudGFibGUudHlwZXNbdHlwZV0ubGVuZ3RoICYmXG4gICAgICAgIGludGVyYWN0YWJsZS50ZXN0SWdub3JlQWxsb3cob3B0aW9ucywgbm9kZSwgZXZlbnRUYXJnZXQpKSB7XG4gICAgICAgICAgdGFyZ2V0cy5wdXNoKHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBldmVudGFibGUsXG4gICAgICAgICAgICBwcm9wczogeyBpbnRlcmFjdGFibGUgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICAnaW50ZXJhY3RhYmxlOm5ldyc6ICh7IGludGVyYWN0YWJsZSB9KSA9PiB7XG4gICAgICBpbnRlcmFjdGFibGUuZXZlbnRzLmdldFJlY3QgPSBmdW5jdGlvbiAoZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gaW50ZXJhY3RhYmxlLmdldFJlY3QoZWxlbWVudClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2ludGVyYWN0YWJsZTpzZXQnOiAoeyBpbnRlcmFjdGFibGUsIG9wdGlvbnMgfSwgc2NvcGUpID0+IHtcbiAgICAgIGV4dGVuZChpbnRlcmFjdGFibGUuZXZlbnRzLm9wdGlvbnMsIHNjb3BlLnBvaW50ZXJFdmVudHMuZGVmYXVsdHMpXG4gICAgICBleHRlbmQoaW50ZXJhY3RhYmxlLmV2ZW50cy5vcHRpb25zLCBvcHRpb25zLnBvaW50ZXJFdmVudHMgfHwge30pXG4gICAgfSxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcGx1Z2luXG4iLCJpbXBvcnQgKiBhcyBwb2ludGVyRXZlbnRzIGZyb20gJy4vYmFzZSdcbmltcG9ydCBob2xkUmVwZWF0IGZyb20gJy4vaG9sZFJlcGVhdCdcbmltcG9ydCBpbnRlcmFjdGFibGVUYXJnZXRzIGZyb20gJy4vaW50ZXJhY3RhYmxlVGFyZ2V0cydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ3BvaW50ZXItZXZlbnRzJyxcbiAgaW5zdGFsbCAoc2NvcGU6IEludGVyYWN0LlNjb3BlKSB7XG4gICAgc2NvcGUudXNlUGx1Z2luKHBvaW50ZXJFdmVudHMpXG4gICAgc2NvcGUudXNlUGx1Z2luKGhvbGRSZXBlYXQpXG4gICAgc2NvcGUudXNlUGx1Z2luKGludGVyYWN0YWJsZVRhcmdldHMpXG4gIH0sXG59XG5cbmV4cG9ydCB7XG4gIHBvaW50ZXJFdmVudHMsXG4gIGhvbGRSZXBlYXQsXG4gIGludGVyYWN0YWJsZVRhcmdldHMsXG59XG4iLCJpbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IHsgQWN0aW9uUHJvcHMsIEludGVyYWN0aW9uIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbidcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAnQGludGVyYWN0anMvY29yZS9zY29wZSdcbmltcG9ydCB7IGFyciwgZXh0ZW5kLCBpcywgcG9pbnRlciBhcyBwb2ludGVyVXRpbHMsIHJlY3QgYXMgcmVjdFV0aWxzLCB3aW4gfSBmcm9tICdAaW50ZXJhY3Rqcy91dGlscy9pbmRleCdcblxuZGVjbGFyZSBtb2R1bGUgJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJyB7XG4gIGludGVyZmFjZSBJbnRlcmFjdGFibGUge1xuICAgIHJlZmxvdzogKGFjdGlvbjogQWN0aW9uUHJvcHMpID0+IFJldHVyblR5cGU8dHlwZW9mIHJlZmxvdz5cbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdGlvbicge1xuICBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIF9yZWZsb3dQcm9taXNlOiBQcm9taXNlPHZvaWQ+XG4gICAgX3JlZmxvd1Jlc29sdmU6ICgpID0+IHZvaWRcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGludGVyYWN0anMvY29yZS9JbnRlcmFjdEV2ZW50JyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgaW50ZXJmYWNlIFBoYXNlTWFwIHtcbiAgICByZWZsb3c/OiB0cnVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGwgKHNjb3BlOiBTY29wZSkge1xuICBjb25zdCB7XG4gICAgLyoqIEBsZW5kcyBJbnRlcmFjdGFibGUgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgSW50ZXJhY3RhYmxlLFxuICB9ID0gc2NvcGVcblxuICBzY29wZS5hY3Rpb25zLnBoYXNlcy5yZWZsb3cgPSB0cnVlXG5cbiAgLyoqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IGludGVyYWN0YWJsZSA9IGludGVyYWN0KHRhcmdldClcbiAgICogY29uc3QgZHJhZyA9IHsgbmFtZTogZHJhZywgYXhpczogJ3gnIH1cbiAgICogY29uc3QgcmVzaXplID0geyBuYW1lOiByZXNpemUsIGVkZ2VzOiB7IGxlZnQ6IHRydWUsIGJvdHRvbTogdHJ1ZSB9XG4gICAqXG4gICAqIGludGVyYWN0YWJsZS5yZWZsb3coZHJhZylcbiAgICogaW50ZXJhY3RhYmxlLnJlZmxvdyhyZXNpemUpXG4gICAqIGBgYFxuICAgKlxuICAgKiBTdGFydCBhbiBhY3Rpb24gc2VxdWVuY2UgdG8gcmUtYXBwbHkgbW9kaWZpZXJzLCBjaGVjayBkcm9wcywgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0geyBPYmplY3QgfSBhY3Rpb24gVGhlIGFjdGlvbiB0byBiZWdpblxuICAgKiBAcGFyYW0geyBzdHJpbmcgfSBhY3Rpb24ubmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG4gICAqIEByZXR1cm5zIHsgUHJvbWlzZSB9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBgSW50ZXJhY3RhYmxlYCB3aGVuIGFjdGlvbnMgb24gYWxsIHRhcmdldHMgaGF2ZSBlbmRlZFxuICAgKi9cbiAgSW50ZXJhY3RhYmxlLnByb3RvdHlwZS5yZWZsb3cgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgcmV0dXJuIHJlZmxvdyh0aGlzLCBhY3Rpb24sIHNjb3BlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlZmxvdzxUIGV4dGVuZHMgSW50ZXJhY3QuQWN0aW9uTmFtZT4gKGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlLCBhY3Rpb246IEFjdGlvblByb3BzPFQ+LCBzY29wZTogU2NvcGUpOiBQcm9taXNlPEludGVyYWN0YWJsZT4ge1xuICBjb25zdCBlbGVtZW50cyA9IChpcy5zdHJpbmcoaW50ZXJhY3RhYmxlLnRhcmdldClcbiAgICA/IGFyci5mcm9tKGludGVyYWN0YWJsZS5fY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKGludGVyYWN0YWJsZS50YXJnZXQpKVxuICAgIDogW2ludGVyYWN0YWJsZS50YXJnZXRdKSBhcyBJbnRlcmFjdC5FbGVtZW50W11cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgdmFyaWFibGUtbmFtZVxuICBjb25zdCBQcm9taXNlID0gKHdpbi53aW5kb3cgYXMgYW55KS5Qcm9taXNlXG4gIGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlPG51bGw+PiB8IG51bGwgPSBQcm9taXNlID8gW10gOiBudWxsXG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgcmVjdCA9IGludGVyYWN0YWJsZS5nZXRSZWN0KGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50KVxuXG4gICAgaWYgKCFyZWN0KSB7IGJyZWFrIH1cblxuICAgIGNvbnN0IHJ1bm5pbmdJbnRlcmFjdGlvbiA9IGFyci5maW5kKFxuICAgICAgc2NvcGUuaW50ZXJhY3Rpb25zLmxpc3QsXG4gICAgICAoaW50ZXJhY3Rpb246IEludGVyYWN0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvbi5pbnRlcmFjdGluZygpICYmXG4gICAgICAgICAgaW50ZXJhY3Rpb24uaW50ZXJhY3RhYmxlID09PSBpbnRlcmFjdGFibGUgJiZcbiAgICAgICAgICBpbnRlcmFjdGlvbi5lbGVtZW50ID09PSBlbGVtZW50ICYmXG4gICAgICAgICAgaW50ZXJhY3Rpb24ucHJlcGFyZWQubmFtZSA9PT0gYWN0aW9uLm5hbWVcbiAgICAgIH0pXG4gICAgbGV0IHJlZmxvd1Byb21pc2U6IFByb21pc2U8bnVsbD5cblxuICAgIGlmIChydW5uaW5nSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJ1bm5pbmdJbnRlcmFjdGlvbi5tb3ZlKClcblxuICAgICAgaWYgKHByb21pc2VzKSB7XG4gICAgICAgIHJlZmxvd1Byb21pc2UgPSBydW5uaW5nSW50ZXJhY3Rpb24uX3JlZmxvd1Byb21pc2UgfHwgbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgIHJ1bm5pbmdJbnRlcmFjdGlvbi5fcmVmbG93UmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB4eXdoID0gcmVjdFV0aWxzLnRsYnJUb1h5d2gocmVjdClcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgcGFnZSAgICAgOiB7IHg6IHh5d2gueCwgeTogeHl3aC55IH0sXG4gICAgICAgIGNsaWVudCAgIDogeyB4OiB4eXdoLngsIHk6IHh5d2gueSB9LFxuICAgICAgICB0aW1lU3RhbXA6IHNjb3BlLm5vdygpLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBldmVudCA9IHBvaW50ZXJVdGlscy5jb29yZHNUb0V2ZW50KGNvb3JkcylcbiAgICAgIHJlZmxvd1Byb21pc2UgPSBzdGFydFJlZmxvdzxUPihzY29wZSwgaW50ZXJhY3RhYmxlLCBlbGVtZW50LCBhY3Rpb24sIGV2ZW50KVxuICAgIH1cblxuICAgIGlmIChwcm9taXNlcykge1xuICAgICAgcHJvbWlzZXMucHVzaChyZWZsb3dQcm9taXNlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcm9taXNlcyAmJiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiBpbnRlcmFjdGFibGUpXG59XG5cbmZ1bmN0aW9uIHN0YXJ0UmVmbG93PFQgZXh0ZW5kcyBJbnRlcmFjdC5BY3Rpb25OYW1lPiAoc2NvcGU6IFNjb3BlLCBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZSwgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCwgYWN0aW9uOiBBY3Rpb25Qcm9wczxUPiwgZXZlbnQ6IGFueSkge1xuICBjb25zdCBpbnRlcmFjdGlvbiA9IHNjb3BlLmludGVyYWN0aW9ucy5uZXcoeyBwb2ludGVyVHlwZTogJ3JlZmxvdycgfSlcbiAgY29uc3Qgc2lnbmFsQXJnID0ge1xuICAgIGludGVyYWN0aW9uLFxuICAgIGV2ZW50LFxuICAgIHBvaW50ZXI6IGV2ZW50LFxuICAgIGV2ZW50VGFyZ2V0OiBlbGVtZW50LFxuICAgIHBoYXNlOiAncmVmbG93JyxcbiAgfSBhcyBjb25zdFxuXG4gIGludGVyYWN0aW9uLmludGVyYWN0YWJsZSA9IGludGVyYWN0YWJsZVxuICBpbnRlcmFjdGlvbi5lbGVtZW50ID0gZWxlbWVudFxuICBpbnRlcmFjdGlvbi5wcmVwYXJlZCA9IGV4dGVuZCh7fSwgYWN0aW9uKVxuICBpbnRlcmFjdGlvbi5wcmV2RXZlbnQgPSBldmVudFxuICBpbnRlcmFjdGlvbi51cGRhdGVQb2ludGVyKGV2ZW50LCBldmVudCwgZWxlbWVudCwgdHJ1ZSlcblxuICBpbnRlcmFjdGlvbi5fZG9QaGFzZShzaWduYWxBcmcpXG5cbiAgY29uc3QgcmVmbG93UHJvbWlzZSA9ICh3aW4ud2luZG93IGFzIHVua25vd24gYXMgYW55KS5Qcm9taXNlXG4gICAgPyBuZXcgKHdpbi53aW5kb3cgYXMgdW5rbm93biBhcyBhbnkpLlByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgaW50ZXJhY3Rpb24uX3JlZmxvd1Jlc29sdmUgPSByZXNvbHZlXG4gICAgfSlcbiAgICA6IG51bGxcblxuICBpbnRlcmFjdGlvbi5fcmVmbG93UHJvbWlzZSA9IHJlZmxvd1Byb21pc2VcbiAgaW50ZXJhY3Rpb24uc3RhcnQoYWN0aW9uLCBpbnRlcmFjdGFibGUsIGVsZW1lbnQpXG5cbiAgaWYgKGludGVyYWN0aW9uLl9pbnRlcmFjdGluZykge1xuICAgIGludGVyYWN0aW9uLm1vdmUoc2lnbmFsQXJnKVxuICAgIGludGVyYWN0aW9uLmVuZChldmVudClcbiAgfVxuICBlbHNlIHtcbiAgICBpbnRlcmFjdGlvbi5zdG9wKClcbiAgfVxuXG4gIGludGVyYWN0aW9uLnJlbW92ZVBvaW50ZXIoZXZlbnQsIGV2ZW50KVxuICBpbnRlcmFjdGlvbi5wb2ludGVySXNEb3duID0gZmFsc2VcblxuICByZXR1cm4gcmVmbG93UHJvbWlzZVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAncmVmbG93JyxcbiAgaW5zdGFsbCxcbiAgbGlzdGVuZXJzOiB7XG4gICAgLy8gcmVtb3ZlIGNvbXBsZXRlZCByZWZsb3cgaW50ZXJhY3Rpb25zXG4gICAgJ2ludGVyYWN0aW9uczpzdG9wJzogKHsgaW50ZXJhY3Rpb24gfSwgc2NvcGUpID0+IHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbi5wb2ludGVyVHlwZSA9PT0gJ3JlZmxvdycpIHtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uLl9yZWZsb3dSZXNvbHZlKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX3JlZmxvd1Jlc29sdmUoKVxuICAgICAgICB9XG5cbiAgICAgICAgYXJyLnJlbW92ZShzY29wZS5pbnRlcmFjdGlvbnMubGlzdCwgaW50ZXJhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn0gYXMgSW50ZXJhY3QuUGx1Z2luXG4iLCIvKiogQG1vZHVsZSBpbnRlcmFjdCAqL1xuXG5pbXBvcnQgJ0BpbnRlcmFjdGpzL3R5cGVzL2luZGV4J1xuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvZGVmYXVsdE9wdGlvbnMnXG5pbXBvcnQgSW50ZXJhY3RhYmxlIGZyb20gJ0BpbnRlcmFjdGpzL2NvcmUvSW50ZXJhY3RhYmxlJ1xuaW1wb3J0IHsgaXNOb25OYXRpdmVFdmVudCwgU2NvcGUgfSBmcm9tICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJ1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvYnJvd3NlcidcbmltcG9ydCBldmVudHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvZXZlbnRzJ1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGludGVyYWN0anMvdXRpbHMvaW5kZXgnXG5cbmRlY2xhcmUgbW9kdWxlICdAaW50ZXJhY3Rqcy9jb3JlL3Njb3BlJyB7XG4gIGludGVyZmFjZSBTY29wZSB7XG4gICAgaW50ZXJhY3Q/OiBJbnRlcmFjdFN0YXRpY1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3RTdGF0aWMge1xuICAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM/OiBPcHRpb25zKTogSW50ZXJhY3RhYmxlXG4gIG9uOiB0eXBlb2Ygb25cbiAgcG9pbnRlck1vdmVUb2xlcmFuY2U6IHR5cGVvZiBwb2ludGVyTW92ZVRvbGVyYW5jZVxuICBzdG9wOiB0eXBlb2Ygc3RvcFxuICBzdXBwb3J0c1BvaW50ZXJFdmVudDogdHlwZW9mIHN1cHBvcnRzUG9pbnRlckV2ZW50XG4gIHN1cHBvcnRzVG91Y2g6IHR5cGVvZiBzdXBwb3J0c1RvdWNoXG4gIGRlYnVnOiB0eXBlb2YgZGVidWdcbiAgb2ZmOiB0eXBlb2Ygb2ZmXG4gIGlzU2V0OiB0eXBlb2YgaXNTZXRcbiAgdXNlOiB0eXBlb2YgdXNlXG4gIGdldFBvaW50ZXJBdmVyYWdlOiB0eXBlb2YgdXRpbHMucG9pbnRlci5wb2ludGVyQXZlcmFnZVxuICBnZXRUb3VjaEJCb3g6IHR5cGVvZiB1dGlscy5wb2ludGVyLnRvdWNoQkJveFxuICBnZXRUb3VjaERpc3RhbmNlOiB0eXBlb2YgdXRpbHMucG9pbnRlci50b3VjaERpc3RhbmNlXG4gIGdldFRvdWNoQW5nbGU6IHR5cGVvZiB1dGlscy5wb2ludGVyLnRvdWNoQW5nbGVcbiAgZ2V0RWxlbWVudFJlY3Q6IHR5cGVvZiB1dGlscy5kb20uZ2V0RWxlbWVudFJlY3RcbiAgZ2V0RWxlbWVudENsaWVudFJlY3Q6IHR5cGVvZiB1dGlscy5kb20uZ2V0RWxlbWVudENsaWVudFJlY3RcbiAgbWF0Y2hlc1NlbGVjdG9yOiB0eXBlb2YgdXRpbHMuZG9tLm1hdGNoZXNTZWxlY3RvclxuICBjbG9zZXN0OiB0eXBlb2YgdXRpbHMuZG9tLmNsb3Nlc3RcbiAgYWRkRG9jdW1lbnQ6IHR5cGVvZiBzY29wZS5hZGREb2N1bWVudFxuICByZW1vdmVEb2N1bWVudDogdHlwZW9mIHNjb3BlLnJlbW92ZURvY3VtZW50XG4gIGR5bmFtaWNEcm9wOiAobmV3VmFsdWU/OiBib29sZWFuKSA9PiBib29sZWFuIHwgSW50ZXJhY3QuaW50ZXJhY3RcbiAgdmVyc2lvbjogc3RyaW5nXG59XG5cbmNvbnN0IGdsb2JhbEV2ZW50czogYW55ID0ge31cbmNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKClcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKHdpbjogV2luZG93KSB7XG4gIHNjb3BlLmluaXQod2luKVxuXG4gIHJldHVybiBpbnRlcmFjdFxufVxuXG4vKipcbiAqIGBgYGpzXG4gKiBpbnRlcmFjdCgnI2RyYWdnYWJsZScpLmRyYWdnYWJsZSh0cnVlKVxuICpcbiAqIHZhciByZWN0YWJsZXMgPSBpbnRlcmFjdCgncmVjdCcpXG4gKiByZWN0YWJsZXNcbiAqICAgLmdlc3R1cmFibGUodHJ1ZSlcbiAqICAgLm9uKCdnZXN0dXJlbW92ZScsIGZ1bmN0aW9uIChldmVudCkge1xuICogICAgICAgLy8gLi4uXG4gKiAgIH0pXG4gKiBgYGBcbiAqXG4gKiBUaGUgbWV0aG9kcyBvZiB0aGlzIHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIHNldCBlbGVtZW50cyBhcyBpbnRlcmFjdGFibGVzXG4gKiBhbmQgYWxzbyB0byBjaGFuZ2UgdmFyaW91cyBkZWZhdWx0IHNldHRpbmdzLlxuICpcbiAqIENhbGxpbmcgaXQgYXMgYSBmdW5jdGlvbiBhbmQgcGFzc2luZyBhbiBlbGVtZW50IG9yIGEgdmFsaWQgQ1NTIHNlbGVjdG9yXG4gKiBzdHJpbmcgcmV0dXJucyBhbiBJbnRlcmFjdGFibGUgb2JqZWN0IHdoaWNoIGhhcyB2YXJpb3VzIG1ldGhvZHMgdG8gY29uZmlndXJlXG4gKiBpdC5cbiAqXG4gKiBAZ2xvYmFsXG4gKlxuICogQHBhcmFtIHtFbGVtZW50IHwgc3RyaW5nfSB0YXJnZXQgVGhlIEhUTUwgb3IgU1ZHIEVsZW1lbnQgdG8gaW50ZXJhY3Qgd2l0aFxuICogb3IgQ1NTIHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtJbnRlcmFjdGFibGV9XG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcmFjdDogSW50ZXJhY3RTdGF0aWMgPSBmdW5jdGlvbiBpbnRlcmFjdCAodGFyZ2V0OiBJbnRlcmFjdC5UYXJnZXQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgbGV0IGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMuZ2V0KHRhcmdldCwgb3B0aW9ucylcblxuICBpZiAoIWludGVyYWN0YWJsZSkge1xuICAgIGludGVyYWN0YWJsZSA9IHNjb3BlLmludGVyYWN0YWJsZXMubmV3KHRhcmdldCwgb3B0aW9ucylcbiAgICBpbnRlcmFjdGFibGUuZXZlbnRzLmdsb2JhbCA9IGdsb2JhbEV2ZW50c1xuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0YWJsZVxufSBhcyBJbnRlcmFjdFN0YXRpY1xuXG4vKipcbiAqIFVzZSBhIHBsdWdpblxuICpcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3QudXNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBsdWdpblxuICogQHBhcmFtIHtmdW5jdGlvbn0gcGx1Z2luLmluc3RhbGxcbiAqIEByZXR1cm4ge2ludGVyYWN0fVxuICovXG5pbnRlcmFjdC51c2UgPSB1c2VcbmZ1bmN0aW9uIHVzZSAocGx1Z2luOiBJbnRlcmFjdC5QbHVnaW4sIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIHNjb3BlLnVzZVBsdWdpbihwbHVnaW4sIG9wdGlvbnMpXG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZWxlbWVudCBvciBzZWxlY3RvciBoYXMgYmVlbiBzZXQgd2l0aCB0aGUge0BsaW5rIGludGVyYWN0fVxuICogZnVuY3Rpb25cbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0LmlzU2V0XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBFbGVtZW50IGJlaW5nIHNlYXJjaGVkIGZvclxuICogQHJldHVybiB7Ym9vbGVhbn0gSW5kaWNhdGVzIGlmIHRoZSBlbGVtZW50IG9yIENTUyBzZWxlY3RvciB3YXMgcHJldmlvdXNseVxuICogcGFzc2VkIHRvIGludGVyYWN0XG4gKi9cbmludGVyYWN0LmlzU2V0ID0gaXNTZXRcbmZ1bmN0aW9uIGlzU2V0ICh0YXJnZXQ6IEludGVyYWN0LkVsZW1lbnQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgcmV0dXJuICEhc2NvcGUuaW50ZXJhY3RhYmxlcy5nZXQodGFyZ2V0LCBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dClcbn1cblxuLyoqXG4gKiBBZGQgYSBnbG9iYWwgbGlzdGVuZXIgZm9yIGFuIEludGVyYWN0RXZlbnQgb3IgYWRkcyBhIERPTSBldmVudCB0byBgZG9jdW1lbnRgXG4gKlxuICogQGFsaWFzIG1vZHVsZTppbnRlcmFjdC5vblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGUgVGhlIHR5cGVzIG9mIGV2ZW50cyB0byBsaXN0ZW4gZm9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gZXZlbnQgKHMpXG4gKiBAcGFyYW0ge29iamVjdCB8IGJvb2xlYW59IFtvcHRpb25zXSBvYmplY3Qgb3IgdXNlQ2FwdHVyZSBmbGFnIGZvclxuICogYWRkRXZlbnRMaXN0ZW5lclxuICogQHJldHVybiB7b2JqZWN0fSBpbnRlcmFjdFxuICovXG5pbnRlcmFjdC5vbiA9IG9uXG5mdW5jdGlvbiBvbiAodHlwZTogc3RyaW5nIHwgSW50ZXJhY3QuRXZlbnRUeXBlcywgbGlzdGVuZXI6IEludGVyYWN0Lkxpc3RlbmVyc0FyZywgb3B0aW9ucz86IG9iamVjdCkge1xuICBpZiAodXRpbHMuaXMuc3RyaW5nKHR5cGUpICYmIHR5cGUuc2VhcmNoKCcgJykgIT09IC0xKSB7XG4gICAgdHlwZSA9IHR5cGUudHJpbSgpLnNwbGl0KC8gKy8pXG4gIH1cblxuICBpZiAodXRpbHMuaXMuYXJyYXkodHlwZSkpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiAodHlwZSBhcyBhbnlbXSkpIHtcbiAgICAgIGludGVyYWN0Lm9uKGV2ZW50VHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0XG4gIH1cblxuICBpZiAodXRpbHMuaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIHR5cGUpIHtcbiAgICAgIGludGVyYWN0Lm9uKHByb3AsICh0eXBlIGFzIGFueSlbcHJvcF0sIGxpc3RlbmVyKVxuICAgIH1cblxuICAgIHJldHVybiBpbnRlcmFjdFxuICB9XG5cbiAgLy8gaWYgaXQgaXMgYW4gSW50ZXJhY3RFdmVudCB0eXBlLCBhZGQgbGlzdGVuZXIgdG8gZ2xvYmFsRXZlbnRzXG4gIGlmIChpc05vbk5hdGl2ZUV2ZW50KHR5cGUsIHNjb3BlLmFjdGlvbnMpKSB7XG4gICAgLy8gaWYgdGhpcyB0eXBlIG9mIGV2ZW50IHdhcyBuZXZlciBib3VuZFxuICAgIGlmICghZ2xvYmFsRXZlbnRzW3R5cGVdKSB7XG4gICAgICBnbG9iYWxFdmVudHNbdHlwZV0gPSBbbGlzdGVuZXJdXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZ2xvYmFsRXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpXG4gICAgfVxuICB9XG4gIC8vIElmIG5vbiBJbnRlcmFjdEV2ZW50IHR5cGUsIGFkZEV2ZW50TGlzdGVuZXIgdG8gZG9jdW1lbnRcbiAgZWxzZSB7XG4gICAgZXZlbnRzLmFkZChzY29wZS5kb2N1bWVudCwgdHlwZSwgbGlzdGVuZXIgYXMgSW50ZXJhY3QuTGlzdGVuZXIsIHsgb3B0aW9ucyB9KVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGdsb2JhbCBJbnRlcmFjdEV2ZW50IGxpc3RlbmVyIG9yIERPTSBldmVudCBmcm9tIGBkb2N1bWVudGBcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0Lm9mZlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXkgfCBvYmplY3R9IHR5cGUgVGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHdlcmUgbGlzdGVuZWRcbiAqIGZvclxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIGJlIHJlbW92ZWRcbiAqIEBwYXJhbSB7b2JqZWN0IHwgYm9vbGVhbn0gb3B0aW9ucyBbb3B0aW9uc10gb2JqZWN0IG9yIHVzZUNhcHR1cmUgZmxhZyBmb3JcbiAqIHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAqIEByZXR1cm4ge29iamVjdH0gaW50ZXJhY3RcbiAqL1xuaW50ZXJhY3Qub2ZmID0gb2ZmXG5mdW5jdGlvbiBvZmYgKHR5cGU6IEludGVyYWN0LkV2ZW50VHlwZXMsIGxpc3RlbmVyOiBhbnksIG9wdGlvbnM/OiBvYmplY3QpIHtcbiAgaWYgKHV0aWxzLmlzLnN0cmluZyh0eXBlKSAmJiB0eXBlLnNlYXJjaCgnICcpICE9PSAtMSkge1xuICAgIHR5cGUgPSB0eXBlLnRyaW0oKS5zcGxpdCgvICsvKVxuICB9XG5cbiAgaWYgKHV0aWxzLmlzLmFycmF5KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgdHlwZSkge1xuICAgICAgaW50ZXJhY3Qub2ZmKGV2ZW50VHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyYWN0XG4gIH1cblxuICBpZiAodXRpbHMuaXMub2JqZWN0KHR5cGUpKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIHR5cGUpIHtcbiAgICAgIGludGVyYWN0Lm9mZihwcm9wLCB0eXBlW3Byb3BdLCBsaXN0ZW5lcilcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJhY3RcbiAgfVxuXG4gIGlmIChpc05vbk5hdGl2ZUV2ZW50KHR5cGUsIHNjb3BlLmFjdGlvbnMpKSB7XG4gICAgbGV0IGluZGV4XG5cbiAgICBpZiAodHlwZSBpbiBnbG9iYWxFdmVudHMgJiZcbiAgICAgICAgKGluZGV4ID0gZ2xvYmFsRXZlbnRzW3R5cGVdLmluZGV4T2YobGlzdGVuZXIpKSAhPT0gLTEpIHtcbiAgICAgIGdsb2JhbEV2ZW50c1t0eXBlXS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGV2ZW50cy5yZW1vdmUoc2NvcGUuZG9jdW1lbnQsIHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbmludGVyYWN0LmRlYnVnID0gZGVidWdcbmZ1bmN0aW9uIGRlYnVnICgpIHtcbiAgcmV0dXJuIHNjb3BlXG59XG5cbi8vIGV4cG9zZSB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gY2FsY3VsYXRlIG11bHRpLXRvdWNoIHByb3BlcnRpZXNcbmludGVyYWN0LmdldFBvaW50ZXJBdmVyYWdlICA9IHV0aWxzLnBvaW50ZXIucG9pbnRlckF2ZXJhZ2VcbmludGVyYWN0LmdldFRvdWNoQkJveCAgICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hCQm94XG5pbnRlcmFjdC5nZXRUb3VjaERpc3RhbmNlICAgPSB1dGlscy5wb2ludGVyLnRvdWNoRGlzdGFuY2VcbmludGVyYWN0LmdldFRvdWNoQW5nbGUgICAgICA9IHV0aWxzLnBvaW50ZXIudG91Y2hBbmdsZVxuXG5pbnRlcmFjdC5nZXRFbGVtZW50UmVjdCAgICAgICA9IHV0aWxzLmRvbS5nZXRFbGVtZW50UmVjdFxuaW50ZXJhY3QuZ2V0RWxlbWVudENsaWVudFJlY3QgPSB1dGlscy5kb20uZ2V0RWxlbWVudENsaWVudFJlY3RcbmludGVyYWN0Lm1hdGNoZXNTZWxlY3RvciAgICAgID0gdXRpbHMuZG9tLm1hdGNoZXNTZWxlY3RvclxuaW50ZXJhY3QuY2xvc2VzdCAgICAgICAgICAgICAgPSB1dGlscy5kb20uY2xvc2VzdFxuXG4vKipcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3Quc3VwcG9ydHNUb3VjaFxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBicm93c2VyIHN1cHBvcnRzIHRvdWNoIGlucHV0XG4gKi9cbmludGVyYWN0LnN1cHBvcnRzVG91Y2ggPSBzdXBwb3J0c1RvdWNoXG5mdW5jdGlvbiBzdXBwb3J0c1RvdWNoICgpIHtcbiAgcmV0dXJuIGJyb3dzZXIuc3VwcG9ydHNUb3VjaFxufVxuXG4vKipcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3Quc3VwcG9ydHNQb2ludGVyRXZlbnRcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgYnJvd3NlciBzdXBwb3J0cyBQb2ludGVyRXZlbnRzXG4gKi9cbmludGVyYWN0LnN1cHBvcnRzUG9pbnRlckV2ZW50ID0gc3VwcG9ydHNQb2ludGVyRXZlbnRcbmZ1bmN0aW9uIHN1cHBvcnRzUG9pbnRlckV2ZW50ICgpIHtcbiAgcmV0dXJuIGJyb3dzZXIuc3VwcG9ydHNQb2ludGVyRXZlbnRcbn1cblxuLyoqXG4gKiBDYW5jZWxzIGFsbCBpbnRlcmFjdGlvbnMgKGVuZCBldmVudHMgYXJlIG5vdCBmaXJlZClcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmludGVyYWN0LnN0b3BcbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9IGludGVyYWN0XG4gKi9cbmludGVyYWN0LnN0b3AgPSBzdG9wXG5mdW5jdGlvbiBzdG9wICgpIHtcbiAgZm9yIChjb25zdCBpbnRlcmFjdGlvbiBvZiBzY29wZS5pbnRlcmFjdGlvbnMubGlzdCkge1xuICAgIGludGVyYWN0aW9uLnN0b3AoKVxuICB9XG5cbiAgcmV0dXJuIGludGVyYWN0XG59XG5cbi8qKlxuICogUmV0dXJucyBvciBzZXRzIHRoZSBkaXN0YW5jZSB0aGUgcG9pbnRlciBtdXN0IGJlIG1vdmVkIGJlZm9yZSBhbiBhY3Rpb25cbiAqIHNlcXVlbmNlIG9jY3Vycy4gVGhpcyBhbHNvIGFmZmVjdHMgdG9sZXJhbmNlIGZvciB0YXAgZXZlbnRzLlxuICpcbiAqIEBhbGlhcyBtb2R1bGU6aW50ZXJhY3QucG9pbnRlck1vdmVUb2xlcmFuY2VcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW25ld1ZhbHVlXSBUaGUgbW92ZW1lbnQgZnJvbSB0aGUgc3RhcnQgcG9zaXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZVxuICogQHJldHVybiB7aW50ZXJhY3QgfCBudW1iZXJ9XG4gKi9cbmludGVyYWN0LnBvaW50ZXJNb3ZlVG9sZXJhbmNlID0gcG9pbnRlck1vdmVUb2xlcmFuY2VcbmZ1bmN0aW9uIHBvaW50ZXJNb3ZlVG9sZXJhbmNlIChuZXdWYWx1ZT86IG51bWJlcikge1xuICBpZiAodXRpbHMuaXMubnVtYmVyKG5ld1ZhbHVlKSkge1xuICAgIHNjb3BlLmludGVyYWN0aW9ucy5wb2ludGVyTW92ZVRvbGVyYW5jZSA9IG5ld1ZhbHVlXG5cbiAgICByZXR1cm4gaW50ZXJhY3RcbiAgfVxuXG4gIHJldHVybiBzY29wZS5pbnRlcmFjdGlvbnMucG9pbnRlck1vdmVUb2xlcmFuY2Vcbn1cblxuaW50ZXJhY3QuYWRkRG9jdW1lbnQgPSAoZG9jLCBvcHRpb25zKSA9PiBzY29wZS5hZGREb2N1bWVudChkb2MsIG9wdGlvbnMpXG5pbnRlcmFjdC5yZW1vdmVEb2N1bWVudCA9IGRvYyA9PiBzY29wZS5yZW1vdmVEb2N1bWVudChkb2MpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuaW50ZXJhY3QudmVyc2lvbiA9IHByb2Nlc3MuZW52Lm5wbV9wYWNrYWdlX3ZlcnNpb25cblxuc2NvcGUuaW50ZXJhY3QgPSBpbnRlcmFjdFxuXG5leHBvcnQgeyBzY29wZSB9XG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuIiwiaW1wb3J0ICdAaW50ZXJhY3Rqcy90eXBlcy9pbmRleCdcbmltcG9ydCBhY3Rpb25zIGZyb20gJ0BpbnRlcmFjdGpzL2FjdGlvbnMvaW5kZXgnXG5pbXBvcnQgYXV0b1Njcm9sbCBmcm9tICdAaW50ZXJhY3Rqcy9hdXRvLXNjcm9sbC9pbmRleCdcbmltcG9ydCBhdXRvU3RhcnQgZnJvbSAnQGludGVyYWN0anMvYXV0by1zdGFydC9pbmRleCdcbmltcG9ydCBkZXZUb29scyBmcm9tICdAaW50ZXJhY3Rqcy9kZXYtdG9vbHMvaW5kZXgnXG5pbXBvcnQgaW5lcnRpYSBmcm9tICdAaW50ZXJhY3Rqcy9pbmVydGlhL2luZGV4J1xuaW1wb3J0IG1vZGlmaWVycyBmcm9tICdAaW50ZXJhY3Rqcy9tb2RpZmllcnMvaW5kZXgnXG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0BpbnRlcmFjdGpzL29mZnNldCdcbmltcG9ydCBwb2ludGVyRXZlbnRzIGZyb20gJ0BpbnRlcmFjdGpzL3BvaW50ZXItZXZlbnRzL2luZGV4J1xuaW1wb3J0IHJlZmxvdyBmcm9tICdAaW50ZXJhY3Rqcy9yZWZsb3cvaW5kZXgnXG5pbXBvcnQgaW50ZXJhY3QsIHsgaW5pdCBhcyBpbml0SW50ZXJhY3QgfSBmcm9tICdAaW50ZXJhY3Rqcy9pbnRlcmFjdC9pbmRleCdcblxuaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmICEhd2luZG93KSB7XG4gIGluaXQod2luZG93KVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCAod2luOiBXaW5kb3cpIHtcbiAgaW5pdEludGVyYWN0KHdpbilcblxuICBpbnRlcmFjdC51c2Uob2Zmc2V0KVxuXG4gIC8vIHBvaW50ZXJFdmVudHNcbiAgaW50ZXJhY3QudXNlKHBvaW50ZXJFdmVudHMpXG5cbiAgLy8gaW5lcnRpYVxuICBpbnRlcmFjdC51c2UoaW5lcnRpYSlcblxuICAvLyBzbmFwLCByZXNpemUsIGV0Yy5cbiAgaW50ZXJhY3QudXNlKG1vZGlmaWVycylcblxuICAvLyBhdXRvU3RhcnQsIGhvbGRcbiAgaW50ZXJhY3QudXNlKGF1dG9TdGFydClcblxuICAvLyBkcmFnIGFuZCBkcm9wLCByZXNpemUsIGdlc3R1cmVcbiAgaW50ZXJhY3QudXNlKGFjdGlvbnMpXG5cbiAgLy8gYXV0b1Njcm9sbFxuICBpbnRlcmFjdC51c2UoYXV0b1Njcm9sbClcblxuICAvLyByZWZsb3dcbiAgaW50ZXJhY3QudXNlKHJlZmxvdylcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpbnRlcmFjdC51c2UoZGV2VG9vbHMpXG4gIH1cblxuICByZXR1cm4gaW50ZXJhY3Rcbn1cbiIsImltcG9ydCBpbnRlcmFjdCwgeyBpbml0IH0gZnJvbSAnQGludGVyYWN0anMvaW50ZXJhY3Rqcy9pbmRleCdcblxuaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmICEhbW9kdWxlKSB7XG4gIHRyeSB7IG1vZHVsZS5leHBvcnRzID0gaW50ZXJhY3QgfVxuICBjYXRjaCB7fVxufVxuXG4oaW50ZXJhY3QgYXMgYW55KS5kZWZhdWx0ID0gaW50ZXJhY3RcbjsoaW50ZXJhY3QgYXMgYW55KS5pbml0ID0gaW5pdFxuXG5leHBvcnQgZGVmYXVsdCBpbnRlcmFjdFxuZXhwb3J0IHsgaW5pdCB9XG4iLCJcbnJldHVybiBfJGluZGV4XzY5O1xuXG59KTtcbiJdfQ== diff --git a/interactjs/dist/interact.min.js.map.map b/interactjs/dist/interact.min.js.map.map new file mode 100644 index 000000000..bfd305d24 --- /dev/null +++ b/interactjs/dist/interact.min.js.map.map @@ -0,0 +1 @@ +{"sources":[],"file":"interact.min.js.map"} \ No newline at end of file

)CdQ3F!eKyF|9D2V!F-rhUpJ8J+l7g0OBBVM#THTI&O8)>EGR%u6Gd9D9pm5!S}%&6DxW}^f|7=Y zPoO3(pTZY#?(7(|!5}5Nn!D%DotZmlW)?smSMcEE<^aT$6gw#LlwubPI9BYTffL0! zyu-EPCnz{Y#ZR&1d{F!hr_NW!&#~mXis$jseXDo@U)-kR7sMBeUt-T&RQw9By@BF9 z3f?cpmw4m-R{RHncaC**(V--ipJ<~6LkW2fi6RVfh%vcYt9@z>&M0LBSf-Q|Et8wU zCt43_*JB)mHR71wb`K@~5Cizwp{`A2uuJ^_Bcl3k{7ree$8&@l?;^2nagS+NqCDBfkB?pJws=PbK~+A7|2 z{gCDJKI-i%m4LD$n{WIwWR|c+NRy`C1#)1sSBI7FiH6z-QkhY&Q_|%I3exQ zQ`X1M?cZH4^M&BSyr;2z$+^SZUMA*0001Z+HKHROw(}?!13=vX`$@Br+fGR zZ%e`5O6%Txi$Yrz0gF{}p>fY>OnlS0Uevf}oDXW;D{d2gcE<2)oFcV80@g$H)63L{HN*d{8kVzKVW(;E)$9N_%kx5Ku3R9WJbY?JW^G#k0Wdx>E$NBBVtKRLiL?sA*s%w`TdsNz1=+~FRNdB8&+@iBD0 zXFTC4C-8-Cwv(4U=LLQ~^Oa4^rG|OTr5?ItoaPMYxxh`%a*kVU z;HYGAjq6;IY{`*awo0DlOMw(hkrYdb(O28l;MYvSx*ChcQW4f^QL5UdE3HbqvbxB$pfSg`>Cj#;?~00;nMAg}==M6d%RaIhCe zARtS)01i=0um)3FSgr#ump{<1pq_<0a34Kp8x=7I1^|9 literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-Regular-webfont.eot b/interactjs/dist/api/fonts/OpenSans-Regular-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..6bbc3cf58cb011a6b4bf3cb1612ce212608f7274 GIT binary patch literal 19836 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interactjs/dist/api/fonts/OpenSans-Regular-webfont.woff b/interactjs/dist/api/fonts/OpenSans-Regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e231183dce4c7b452afc9e7799586fd285e146f4 GIT binary patch literal 22660 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 ML;wL%uV=LY00kR;TmS$7 literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-Semibold-webfont.eot b/interactjs/dist/api/fonts/OpenSans-Semibold-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..d8375dd0ab130207f023358d62ef6ff357108b7f GIT binary patch literal 20028 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 h1{iKYDIA5bqxNz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interactjs/dist/api/fonts/OpenSans-Semibold-webfont.ttf b/interactjs/dist/api/fonts/OpenSans-Semibold-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..b3290843a7a3e621867b169c8487de9a8c7a8054 GIT binary patch literal 39476 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 F{{Vm_4C4R* literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-Semibold-webfont.woff b/interactjs/dist/api/fonts/OpenSans-Semibold-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..28d6adee03b8d2301e06680fce413eb94887b57e GIT binary patch literal 22908 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 G2><}8D24q1 literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.eot b/interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..0ab1db22e69ec331510563590527277ba5d68cc1 GIT binary patch literal 20962 zcma%hWl$VUu;Ahji!Z*oE$$W;cXxLQ?wSO5cX!v|PH>mtL4vym_mKPE{d@Q8dTOeB z+G@Ibs-~xU_S67?YgGUM_P+rS_z$BYA;KZU!@|PD!05sP{^KdC{(%MT7=Qs#hX3UM z0|hVu@c-cRgg=A-ga0?s08{`j04spge@Yqvv;VOB|D~(|j)2bqbAU6z0bu!`2|7Ry z;PIc_;Xkg$e`^px`#&qU|Fl2kV?TmsE? z)2-|$(gXE~(%ml+=io6Tcy^AADM~B#I7H?lYIs@}6@;NQPs9^3Q_Y%NeNmrfRK8iu zoZe%~4sjD)79&kskK@hE&8xz-mpE~P*eWGT4{p1~=%*#7plTk6I2+bL2Nz1r zzzht|rw(!3wr4^9RljECGIH_5@bu2v{2ae(fkj&Oa6=4)pOBG1(TE^R7+`${o9LX; zM`#kv^b0VL z)znC5&kw-wVm!|63xp8~dmBJsiY0wvjSz#z#zIE}WckH+p35pu0*`B$q(qQV!&2v z{a#p>^q@u#ylIDaHb6B3vx~A|4KQ#bCh?F$muhJ~xjF&02b57UL7ag`I^Wp)%n}Dr zGh;QV9>8>t9jxK}a^L|nZ( zny%D3cgZa{RyY&)h(k^2`0Kjsmg~xXx{p^&siHF^Ly6)8`^ z1Ws)gci$U_@23V+$(Y|Sf+XRy0xjKE&qTKmz4T49bBdqmY%I)4rBHBCxkt7n(H!7p0r+6zClcHPk$F-Kh!V{kR852=r{;@#npWA+K~e$;BA zcbl~oSQiXOnW!lfk-?SReQj0$98HBx6~Yu^w6&9nh2URH8VSZ<)&FvCU}UUxsJy{r z*%+fhcH?rh@epCs1;PZL+J05m3iRU1k3SrFQBfl4tCD_4}+K_ zgt8bjF%+?smQoH)1uwjm-%S*UJPAISef^3`ha6LFJVR*K8D{9o#4&dr`_@j4mYAeW zTr+7(ZhjC3_rQ4@spU~)=UF9bPpUAC&%Fk$PEx3wT`zx+_IHQ?Lw~^Z771Qb6X({~-D?W)xqO=}Z3+Lc&`EY$n ziO4XU>7qqpjOHcvnpPOOe|9LE_&~GTk_eVn&O|kAv;yl&Gb3^!p$}_qC_oRt`ku)6 z0SCBsS09B?ecSj6&sz@n)a5Evg&^MeQ)q>u)C(%LQZQS}(m)O|@y3RqsLDDPrs$jv zYbx?K-Q0{I#pSq0#L3asdl@sFL)-D$S<-udasl7grrciJy3~w0Ni8aZn#%~nqc_7tAb|Wi?xN34OFBg0SJKhPF2MlS8o!6RyOph=2rd?BZ&PSt})gTec-r zKpjpzj_*3^FU#J993(q~VFwIg)4dgmfvAZX{w2c}&N2x(BR2Y~$T}*F1t{o<;o}>2 z)DB|f0Zcgz0&$evL(32a77CP6U8+EkjDHC3>j|qZHO1QeYn0_lEL;-tWc*ckTet_~ zgNQ1sxz=D539xSoLP7{JkA>cTdmJB~HIsE;j{cUTDD1G}Tbk1(aUQqTWY=I4*%D~n z!X}m@Z%O(UdZ@#McUr#^O2h&XZi$lgZ5`eZ^1jQMA>`^<(69&LbIE#zx*|64g;Q>= z4tsF?#nI&i!sP5*wVR?gVg{R_`0c%4^^^%m8jj507vYF6qfjA*GaOFn?Dn z<}_Tm!-SN%qt zumEOAa`0Y@zoJok_F9?a;pB5&`wTNrxtPPC^gG#-h#8tI99XKlz(3%AHD=4B&uvTe zdnVF=@IQ{V*)uec*m^?Frgq<_ZF#v}V&Yq8<$_TJ#9WYJECIn-H`hKS)|vB6WVmC& z%K(1aDJU#>zxG9dk7#&>f`1$#uAVa_A+xljL$Sc)SSjYaX9)E+21r_#@$!?zaWfG* zP8mp4AWS)$N7QIn9AWsmd$m{fUtv7_fC-{=kPkW$1!3TXKkNa7wqoyb_@Os zkBekxS?j?+&48i?WO0JXudI<2Z1j8xB&6Pg}7oU^vShNc9dE)9G|hb&ZdTEQux$q!v4U3DSopTP55M}? zFg6$O^%|3YBOw&4Z%6G6S}ByDfjG42C0P>TX{5G}d==gblBDVTQ6F09Fqhm+TD(USjQss_%i zZk9ehI6PXp-<47$J6^@L*3`lF(HuYAjNEI6n14Xgx+Ri zKffPE)_FU>qzC&tFUDhv*+3*({v&Raq89enoU>hk9Wn)QKg-hoZF z#N8Z6^=BZN3G-cK8iKrUD}`+1wo)k9)s7jJu0DwOl~FbhaadP#r+ ze*CP+Zyu?iXB1SnByR|70+c9?8&6GYunpVv+wlBe{IeSW`%-TBXa?U#VoIqV3IN`T zdyP_1p}0|EB=B_*rAzYPB^t)HU<@bmFI#-bUiQw;Dq}^tE0I5H|R3ZK7QWCW6l6uo_`hWD$Yi%jw4e|C7I0vC%MnQsp8K)3RPnKNy8&6 zH)l`jj-86QY!~}oJjjrWQz^MA%8FqSrASaI=#>4_W^f{oZ3m3{1;}i@C)2RQs9%gV zs3Sd6*O-?JZozu4GttOKoP;pNgC5(PKVMERZm-s~x=t)$HG^FhPe1H2S-XL%fl6pV zzKX?k7&!)mDYULZ&X!7WAUst;R|K9rkegHgBaJou2sLI;PdsY63AQr?nLZLF^vUl? zR7{Tr##xr+clO`H?tFBqSULFH3v~9R{JFU6`H)fu9z1io<}VmusbD1|nhDH9ePz)lF%~?|d{XI6$ctjV zP~nHatKCRcuAY%+)Jk1P_K;#op>m3V9`PlMPc*>`Z!i3{)6=aQo=rTAX=i$0W|8S zsxPk}-VuDD!I3l~1UPqsa#7fpIRynN5iCHzON&9nk5y4)3Znv+R8b@32eCM}JM8J% zT_!c|2JEyV^=CTe8fC$vCNu6FQLqOi0y?E(B4|uNj~^!iU{OgBLVl`2HiI=~4V|Ow zH=pAVQ?@yrA`u?zFT`iGT0-wk##eFbPG8=!GckIMZq@N?byOpgA4JkkobHe2l)RYF z=Z3aOjc0+xlK!LtJ(1z@?Q=KE?*_7juwf zEQY@!^t1|eAlzLAw7tiP)6e#!p1d^lXP-0}(->2=G6IrBq>jIuacmu5I1b8_T&#?K z!&GgsQY;TIfeuhp_tg#jt5W^busV^AXZk%ZB`>lvcAntY%b~x_foI<|!9)<4M}KdE zS{Ui`^Y|a^seS06+SLd(ls}{?rq;`?&S&w9dU9Dwd1gw{_p`lxnO!!6u++KjZ@x^q z=uv}q_fi$CnbveYxbl$zKPx*e@EI31a}%*H5H^%i1&;Vh1$Fb=8vJxL^75|pFH>py zZ$k5G2bPxPx=8`VFg@v1QlFcK^m}v-tC`R;<-!OzrA72WvH*4SH z^X&}VOGLo$O-ta~?nF^6JF`LajQjlQS2LKF>2x>$ql0TqjDJWPtS+yz&S|2By*~6U zCPX6e_lrGKzv3Bb=urfALS=WE!T#!0stf#IrhA7ZBS>(0D9!*!Qv*ZR#4L2V91W42 zglwDkQP!`ARgA`wEwE{k$c{ALv@A_Lg0$C&rN1KoWQNciLpHg zw}|hNEz(hkFD*Sys^Lcom9vDDYymLEjgsXqc!GDuV~V~>j*^4%a*Y&!*@PE4Ylth% zYYct+UR)YS*&LYjr3T?_+2Z{0A?pe?sR`+HCQ3fA|M}aFvMD@2_=Bwx|2#P%cgR0^ zS~%oojR{?N(0}Xg@lT3=q?mr(x^)Hl8a5QxUTGe}&SC{gqeH^q%!k@QT>dta)^E#i zg!>g&8DS5iO;12zBF$0w&L8T`Dp0uHMX7*vYhUPUdS621A$*-t1g0t3QHyN&174uO zX_*NH)ejKS=hc3@zUY>vl`uRPUYah66LGXrrwto~^U&q3Y>84xzYoODei*G5W5-P{ zFh|AOIuLG~TB zUETHjx5(ep)`*DB1`~y51I7KgnKt$Z*v=VPn%}4M=1S$bFOe6X$gOB2Rz}j3HNdkG z5PYPWGyS09eP{ZTNRwQ-)V0xEO09)NI8Sv1%M- zVT$qN>?9HCcyvfa0U`ofh)cYf>@cq^;)f%G&E2X^b*OmKY8^dZYy<(ikXJ< z+UEv2wAln04+7VJiUs%2L~;EqfKT_p3`ZtYwkL%_4pQ@{G&%{6fh$}MwevMZ8uJR4 zx-%GDwxviE=6ms@A0;Od2rmB!l-T3ADFv>_3DJD^0D6)(_zs@xM&-(U+vNd?v`T$2J_liVD-hS8H`H!&5UY-ws#Rsd7h35_i1Gr8Ep znhlV^IkF8U<$+6z0^BA~Sq$i~gE!@im5kIM2O~C9%s3|bL+wV*abpb79|GxEVnSFk zlyWEOz7W~ClyWYpNt;&C2PB}Eb~v#ztbm0rE$PWJcRsbGL_Apw8gv(q2UvB;Z2S-* zSv&Rkn2L`WAbBe{!sEll)?Sj_zN%Pj1fq_EU9~i31Qz=V*)D^o2l5YjJT`VFcQ}Su zPw1U7jXCw7#|oB$R9fnd_0+sAzZjYH7?3^iS6S|>SY_@MUq6aCNE!~UXibf9Y6x!5 z7v;+qF7`h;Aod|LWTQl*jo?it5_D25Ybe8aqeT1G561-<(4zD6Pp`w)-o!#lnVga>BwuA4*WdR=g6=fxm8Fqv8Y4zhWkk)Kf(Kh@<{@-lJ4K_EOrk?>Et9+f0q*sh7Cny&x+i-m}8lu&JOTW#v4B zL@l#S<5w!#3iXL*z$uHx8&U`=5A8NeKM=h|*8=t05xRHHeUJ-V=1f2@vMf~Ig&+Zi z2x**s-&tJPj01;SFw#gdvl~T%Bsh>r)s7q`y1pCp$t88hu?xK-9T-LkI=u`8j?I1a z6*5ZdS;q@05z*Y+dv+2FYpxcme3CM?9F}g9EzG(25XKEZv;MEfqTuYl3x_t(zR*pe zPYzmlrcuohXE1%2X3(xz)?g4CbQ^E%D~3Fzk+8-E|0+ zYZHGyA!P4~rNU>(^=FvZc^Auu4|5zc7SF((l(@@Hn5 zoexs0W#iA;&++1&6lsz4BK35P_$0E4&o`WNogs*SlcjdjzvW_bBr7iL1c8CDHvK^PJWHV)juxv^bpUjZ((ye}mni#oavY>P#e=Tmd2D0!(=wD)r ziX}(ji(-Ll@gkU|NVwfSs-nqSptA9YN15c8Pa;EApRBFA9tKEJd<6U>$I^c9OwnSB z)C~FzBLE>xZZ}%H`vHCc^4Iz9=*YP*sOkqo2OW#V<-%4H8*$0w4EN;xYbz&*POhl4 zVvmG|i5ugAtzX@41cokzQ|4OEBL2Hunbs!0$&i*;_2?vBSfq3 zx~6_<(G$Wegm(?`T?c`FHfhKr&M}T1v&Xl(%UZ$3#_fNG_m^uJNWTgL0Nh#fs8SIw z{8<^`>8K~j%QHi(f4Gfq`ZK}9e)N_S{VDWi`YkA6sAR62+1+o+m5SYpr}#LThhiPA zt)qo~Uv5ws5X!Hnpfxnrt1Aj{=={OFwl=O%XKJ!!+G&hCn2XT=r)TmUb?&YTIf1e( z9)AoMkB=}|Z|FU?b=@m+cw-V-#NzSb-cO=eF{wT+O?__IIQlgYI28Uz*-dxTlJ0iy&TGVJe zbH{y?SHxUXts?o=3U&QNZLV7EIx7__Gap8tDx(BbY*W5kJJ<(2XGuO&`6I>jMJ2$A z(2rqxS(u7nkp4DdwLQW*c;qSKou2dsX<=PABy!g1H%O(>HU+aVL&HoMAGq71Gkh|# z$|1izKXMXhe`)6#gCsB?mtww+&SeunokmR(hovK9-E;n-X*g^tt`MoG$qke5vZD#w zrL%42E9}gzZl>c7z%Cv;ZL_KUF-4F_W7~wdr;+41X2xuIWb~#!LO^@AzM)8@B*uN@!M}V~Jf= zCc-+FSN?wPM=r)GuCr2vuvO__ndm+ArO6pVFB$9CFscwFEOHq_Bj?Z`P6;TD*32HL(ku*grWe z$vQA^hX}%k=T5QnhmA7|2!#Ka!4d*0|K1x~j3TcK69g>tR`akAv6M49BfF@^&}X&T zhOia~pNK$+=V!ZcDFk7Ril^{w5A*EvL6^m$yQvh#=%3g@25o}qh3Se57_WqW}c zHL$dzoi!IYTlw|0?Oq~@ar2>4ZBAlVvLsy`3t~G^`H9qG4!;RG(hX_S8Pgxjp`%(? zC*{hswno{qzWn-ngInGSe+7vcuSkaa)ZxMz!X=#vbzF}0&Kll+6cX182`xbZ?w^D! z5v2r)Slm;=5fRCof1&ZvBLupC_yoCm4HD}vO`_`mMKai=bM$y#{AHj4#0fqv=SnQt z7@UWH3e66s*IrFzkZhyMnuyGVwYWse07Q~ra|O@FDVveSVk88J!$9yW)bZ4&jpShs zmmQ9V%`~A$CG)xZiY|vpZ%R6Xa7=1u-9Sc`_Ln019Y?JEN{j(3HcR%E!~ zbQslzkub_sWRN(cTeY&!qVGP(gzgSw@(g_Ucw9byK-PDQxnoPammAMBSeHGggAdE? zr~)DYye5d<@T`r+M|W~QGQ4Po9G9N`Z@w+bB z*ahiX=?MX4RE2y`XG{JZk*6#99Fs(bN5y%$0I_LqL1cum6n6JyHjyYz=S)-2T>N2s z3+^B9>S_7m_K0L`M#QYMKnBc7am^S;7?T{r+=f-wcAQ!;Nx>6pT`E;i6-i72&UWZv zIIW8UCn@3ryQ=pezwaH?<9N}WS=BcGB8h1?d(y<>onV64waJ+7$rt5P?aR~!5Rkeu ztW@v25=a!#Xtgf(Gu4qwhFsn$iPO0a-M8;~KK-3Wv>O#g8bf$%c?d+m@OsYj68y5j zw#(|YI$VPuF#ayjc%8%3mKlM^YXXlmB+NTlZuqt2GB%MF695xid(p7p1n3eCfVjAw z5Nguy3b0%PRBEFm9b;+C*_I2w@hqq9sx?w3wFQ;fCzdTI4C+mSd_8e*F0mvosMP=F zUu;vw)*IhBBLtHH<640 zPX$O(ln78`JKJbu()gkIna9mDXzs1L9FKo8o%^QOe-+o1zi}-I2fO&JJD=DQV4@`# z{}q%;(ak)oijI-2ud`*-L&VF1s=TpxnVD*>1 z$K?WZm^m7Q*M2U-dAxGxkZN%b40_YI9hJh2JLgo;bla)7#@o!Kzp+)!XC+Etlb>kb zN##B^Fk_?nGbu-x%RrS!+jeLR&A$+FV`W_uQ9i;AE2Z4q)qU43ak)kL^u<{EcN{Gq zhuG?TsA>l0<+lKQ$h^h((BZJu_u)a{_P3vsGuS{}Np|<|7%zj&#?u6Bh-E=-=~hFE zKMJU_3ZwyX{l}OHtD-)z9g8aT%Vg-#k%Fz^vJ3bIy9=caMiy>MSn&5L_0QD&Y~+LU z%^28XC~120MoALT%ZT;TV$DG0;EQ3(BtO`&I%2ACsO+YA09$U#VAENVbu9i*qlI`u zL#NtPI}>&0UkXd(`6ByAUz)UVjY#i;yV_>6-^jjjDGo~Dh|%A{H!!YJUdggFv$QJB zhX46F6g9of#qwVtHTR6~pxti|`}in5hO1oCivLdrVdC28--DBrfzn|19O}5dRxUgR zr$9bzmDW$(sO;#_#pxqym-fJci9!w*;h@pXg6H-yv2QjNj9By%F+n*>nrAO)E z8#*fa1d5#?M86^OMrTq(dv{r2V$wm~Rn7Tu6oNZs)=D%Eg<%2i(_%Gk#E|}74r@3@ z9&W?6Pu(Ijj%XzO-iROCL4=G~^=A~XsJ{6%ZY+Jw6jY2x;%|Fz)W0zYwy^Iz+C#O^1h17FR)*_YyH z&OTM(>Gawe+Zll*6h{3Ra}UJnap@eI$5Jh+Ck5+IX%$Y&a(@;pnrmQFPzoHh&4J2O zp!a?%3J~qO^MG)CIC#X!=H0K0VUdplGuS>TD5Sg~`_fJFo+W%{ph@F8JOVNI39S+* zY|c|Hki@%Zy2W3?2bLalpYk^MjcNV6Oq*bCl}0c}Mlom0+Jsa!&wwtX$hnu>6Fw7& z4DyE9EYHHIRHCa;hy@>2ZP~$d))$8Z#MJjwcv5_AIEq5WrVXA9qPMoMP%)L?!qqrWOnON@Cu)VYqjR|4=DrN z7khbs`cWD?X}k!5oZN*%GHDu#sg70;<9v-N;ByLy;6L(W&x+rx*=9>soNw`rWZUcz zxpSfzH(22@_(}EC_eo%=+@LI^kY3Do%_$xcI4RKWV&B4_7?P+#ir6dI0C zKSfeOI~i=*#~5b>s7{bZKOnJZe>5!pwgiVy3Ok6AU&x4$9WpF$&bvDYO^hW=j?X+E z_%K5d3)*0|sgxOtffvt{htZd3qhI@^x3_FrxOk+6J##`f*Zgp&m|uhc*=7cgrB~3>%USL>EF#QpwC zFoiogS>I%*Zi2e?Q`@H>qSR*R9_jmI_{J89hTZ~9>>xL76{&3ia)rgzcUs=xndic& zoIiMRuu{l#!gm$m?nu6e_$Mi5$W(C2TvjJM6ydTdyrsFY2KI**4Ox^)1>#fZbT8vCl89Y zx5*QObbA$Cxk6_XnaXzy?fx!T5Avy4*gj*J`n*k+h{{6CunBjLA|WL&?2_GM3DlW8 zmmep2>7V7jqh1cak)S;mhTWjOSR#2+q2w5`wm1*rWh`ie_Q&5N!-f6sb?{)c&h40(<*)X1l{(t-t; zfyUC|Z*R%#c&{N|H-kZed?t}kqvgPYxtX!Ug7{d=jtg^j5>LVdm1+W-lF*~V=U1*06&m|$5X7R> zFRd$UlOain@Y`$@@*9p7nbgv%IJo4rgdqm=)Fc+qtT;lAo)?p?T$kjBiSo;(vz&$) z;-HbPNp7Pj-J;oSWoLg`sv z=cCfE$y;x}^$Zu=Szpf!+5%iuJQZFvHH@Bv)WFHoxV7cMz0)-#mXwD5o>gp|%7=g$ zJsJ;9j_VcJTxa%8)p*Fqt5SzRhmHv*Cv(MSnQjX|)#i9B~ zyv?e04ZAnk+LRKOtOX9-1lGxVD3Qh_L0Y0XBXbg4g@RH$UW~i)( zy)1J*y=~wb({$tLq+gP~{^#oS+sK!64b%({>F|FD2YqtDDdcOb2tg5I1#fV`s<>!ZR!r z1ZiKW_;34R85*nv4#R3_dO61|g*D?UV^!RDRHB!mr#j?hqTg(yM-;gA|T!T6dUg`mpEOUhF(R=B{{LLTaZwSo03F-j`&&+Z*{PvCX?S%xTj2$Y&3(wXRH&R(&tsw(4O%#Y21fe^eXDeBxG*5s#2?EGbl`(}rlnWm z*wx?Qs2#iO{9r5lw*KsGoQT&hRD5dq>*#v{v!xO$EPB|um7WkFkOjuxLA?IciuTR2 ztOz4&FI>6hSwh*)?A9-S4LL*2ShOlx#gE{+@JO<-Ub9PbtJ%82V@o9+1iUQ>W#?NI1I z&v;es{Xw2tKrQUisDDo;kID**_u4sM7`=vs&=HM&h7p3RX5PzGdg-cWhqd6>ek!S9 zpO#Rh9M09qGeoanIODXLu^2HcE~2&RW3$bT&Ea! zgRTh?5(LKzUF%{}h*iJJM=$5m_OJPZ7fTP1d}; zI?dXImv2>qXHDe}&18>I{JfmY6cSniXN#sYqJMp8junW`LpgKc4aN<(mC|+EFVy`q zz5leq|FMrc@`WTTjEX>-z5m-dx9Z$LSt#+As7bHA$TgnaO-b~l4R_l}4oM+(}DWIOUKobA3 zRMM&Uw}th8zITU+qOKeGxA&$ei^utHbN}7zl?t$iC{QP*RdaU`e{al zRa;72p;{h2CzuGA(;mDSB#lZj5kSsivOo&-7D5T`LA+T=;{UWv!WiHDYVq1nxCpJ| z6`!`0*z4O8vf(tbgA2%00Y*>ccn%EFP8HP{T=N!JYs1^w(>Pw=Qg&Z#fH3_f@Q(gk zw>1}@lm%dhL5B*K=Ya)P3?$Ui5oD9J+pB?~ujJTC>@`11>QN3&_+DMD1CKt@4>-Xn z6Rsa%e>e5B&WpS#?X@P8f>10j2X3gC=j%{MQ>@_F;pwt`PEMN{fw=&xNM9K z7Ol2a`*51eTW}YF^(*Z88ava+#F_mkCuPL-psg_2_;dhfM(Gz6&>*w;mCY!rn==K- z&T5z1$T8?=J)rHLl_9PgnWiTx$sNbl(+ONmfcK9% z%dUeCt7g3A5no}LKtCK>O!-m#BwF)+r7#yuHHOf2srQ0ODH)CKMC8I@KIuJMc$$ov zP;z2Ko&_Cz^2OT;8u^U|3=L{m*|Xz=1#&qWO$|xP)j-R+%)~-B;6HKwuzBJ_GVs9w zrKFwhv{V+78+G634L%O#o{e~moyBu>5C@=x(WgR3N+Gzn&v_&PRLgH4t{_CpI=$GF zfV~~UC2f0g9>5V$kFhH`cM}55JiJbkh|HF&*u~kQl_IA{K75lU?Q=u&_KiWSVlHTV4OegsGq2|D=q0&-P2uckn;5BW^YymnZ+=iyaqOn+hR+r z<%xbt-Obf3^6AaO`To5>#=ne~@@flcy5o(X$!(M50!zSMT)y1xQE8*o94Y+50I(wuIjDWrila*e7gm>ke-MoEUr?MrHiH$z1 zPvwxsyYOXy1yNO;W9T(|92(x@m_mM!<_GD_;UEI%@;OOoyWI_n(-$M2(F@&L_PeTu z%N~A|qTRWuYs-?E`sJXNEffBTL#k9HLa18|%x9`t_W8bg0&mFoargqH{L<2!)qo50 zPaZH&6oH+(3?H7$5{vUg{U`a{cj9@&dU_JVWv4y$yN<8ogs~=2^2#=mg zT;Qe)6l~xyrSHf;g%SZEfgmCWYQk06*I%gpa&_a_cno}jqSfx#al@&FB3ZMcd}R+o zFBSEaC~qc+fBmn2jT?tWpXv4Ob;Ng+Ve>7WZacsJJ(CsvjCf>_uuvV?XV9a(W?^m= zch9{-_)zB6M%sE=G^BhpGA||XTRj`ywPT4jQ%jFP8qjUpsh}KRp;A&f2^T_HsgebY z-hx{!kn(e~e@-0Dl9H1jcL?Bv3z$np9}3h2!MW(O`=(2Wpum-1Eh&Kr^{#@OYV^!) z?+L7307Nqe>V9Q>h04V2A}%BxlaN4o(ZncZ6@Mk^c?O2WL2|4F5=kaYbV}OlT7JJd z3LHD7%njb+c(gaqFe1Fiz4I)+9>IxX7Se}doc?l|G_7o5=0(6UUMDgB*6+OOY}6VC zq@n94!{5L(+OKL^Q?@goDvYk;x)#ezPgDHRk$8<~HcchFpmx`B6JbtoEuvFlH@0C_ z|NRRDU`WLvS7bhGD>JvFj=K-PCu-7WUM=>5~az^pkSf?M~eh%xfm3%E$w0lL=?CxE)zw z7rmC7Do);fxT8_>E{K~VJhZ9U=<+dDa?+m5y0z)cNvbd8q9l~ts;&MiGe*u*IU(6& z{)9H}c)z>50m7{GWZ=z_eY)>{uC-$aH07H_`Vwy7aLLxl(VZ}2+CqXf9b6R*z~fYZ zu5v|1Vqbv{EZuim8z`?JyMq#gij%BOZkJ9|mR%))6G1#*J77?TbaPKAvQoz>BO^c^ z`UWqqkuHB2_?6~x?W^mM5ig7)CcI(}pZ_bP2*h}k2#oCK(4yw4cD$oEG9P3mBcnqH z6+x6p+^yob~pghjC2pR zRWidQ1Hq5W9Uuc#nB$IdxkbdcgKb_G=>ta`%{z<3AKxFeCiO`zM?%`715=!M z-AVJaAvjNQ+<=5Z74=oG`gb{6K9f#2low~EdBD2=MlyOXGft#HITs!&2eC$XLQC#* z3^EVc_!6uWZa`(!*vxpv4Zq!`8j}No#?9f0%Qwr?Ym2!HCP{S^q*VOCsTh8>yp}`^ z-?ijW$u~ykB|q8&9(wL_z3vyXhEg<#x696cpA~B)<(2MnGt%qFacJv+pYRJaBfe*7 zwaSU-hL%1LJc*!0Q3*^ecUsn>OX3)Vcc8t<4tTd2JsAQ~hmgFU7NU~i5RQE)?zE(8 znH7E_9F%ksjM5L)28+LgW&Hwa$p6AeMtengRk8ows=|sDZc0Y+A-Oqie=92VM)Gj_ zc7q@L9b~4_=7~QAtN7*?{n*Gfn~B_tn;(?EBp)lOoOkSK#70w8K0(L?4UREL@Ylsi zh3E9kxn8{hrRvY?m(2F7E=JDs_{)s3RB0ql5;fJ)6oT}a*;1I70te-(KYy|vy57HN zm3vrkJ{R*jE|?62kx)Si3ypm&cK%H=?+yI5&sMypq>G+PGMLQ0z(`{2Gq<$nIE|X zUx=O%6mI%lnlzlK-c;}|*>p&4Vww95qY96goYWujUO2Nd4w%tpo!o=f@6t$?VVKP^ zS26+fkSq3N2IQ6O?JAE`VlOXV!yait*fP^bW69hgqg@fXzgHpmw zg$~4Y-;{I{_IOqnnw{ixd=1V^YMB|;_lmidWEzG{Hav!>B$U!ZyDq!8%tyMfI~ZM0 zD5ZNGG%2;27ao#ZIn5~&scfYgr2;;yaPx(ZSQMX`+vcP_@R&W(THS28KbHy-j!G%R zFxs-FRfR;wgQlCR;$zTxeMJJ%BJc$Sneb90sQN36W4bSNU3x*-eR#bO;E&&lOC|K( zxDU&vPo}|*_t&vvlu{bJ3~_sCZ-ccuEPoU%z3{I3k)(O)1uZ)bP1m<=`L~ds`9-d! z|L#|9|MXNK_ibmrR%PMnZEkkwl63L#KU!7%A}_FT!cPr*TSd2=B%;=>z1MWlur zb&BhAC-Vuhg{(p%#%x{hq!=QRY=_^JKKdg(PW1`}+TI2gVF=GPV&4lN!ntxJ8d12$ zL2T>Y!cD&!WZinQ-=Ut*xA_scw?%{+K>W##5Ln-s@^&gpV&Z87=`V`J^Qa^Q1At)0 zeGH&+E~SDUeT=moBYyQY#)MuOR{{|_ioLh|%oA;Z9RRj|^!q(oBpq2hJXJ29rKmsi zV!wUDW(~2&p7yJvkkvs0_iH}N%n19)Tv6Npr7#0M6J$qASdBT9 zi7?KvrHo*`^G?>3XBuWS75C@lU(2)J*`c^JVweK!uWLoLfeO*~u5KC_QkZG<+}!xz z`^@%h#l*L9lgPE1ScloELZ1=738E%NEM1C<+zU8h`k_y^eKqpXXp2(wifC9dPC;f3 zsg&;munqL6q-6k!flkk`AYJAv+gE;De0@VJMBDwyYYcQv)RoFyOLRvW*uWvQ%U@WB zP~rblsnp^)%8h7?)rX7ohw;##Q?zasbs9&)0UO?mXLu!09}nq^cA6?qnTIwwgT3a8 zTUV|-9QU<(=?sxnm%Vx=j83B8TvfwXI`G97N!E0-%A^J|IqaveODg$P0_Dz)NERk^ z!`pQ4PWnFqO%by05Vb%S$`|l?%NYO=>K%wKMiV5MNKDsE`G7MZgt!u_$c1qjSvV$T zDG6wip&IHQXTCUS6tF#p4G57L9@t)0{b2MZAE8xf1ZnX!B&fNJ2lSF8>$hLG$3i3w zS80Go3o*#1`Nn1P@Yp*$8P|6^u9<{?uUf>17~IfGNLdQGRL55d>6iS{vzOT zP?nfjz=9z{waD-_VGRC?1S1eC29lcKx4zpuCg?Z)V0Abq<7E-N+)R2Oia|`|kjbt; zPaU=i-4*!s`~jXQZ^vPtjuYl^(;a`(Fvi9VO2M*FilAwijINMGGh}V-Nd*Ib;d%a$ z)7F3ws0hTk##tV#vMz(qkQmw-Q1PLA%Yk_c#){+`3>rUxI5q%>jWQ!>HR6BcnD{~2t{00=+s77k-#%T?mG}SfYPi#tDsX9rdb?9uZ4MQ79`A6N*_iQraF@D zB8h=HgqlREd4!zKgBZu8!$3k&-n7>g+o<)(WZaYN>=X$C8tW8J3*`|3LQUjXTb69_ zb_#2pd&xA3rXR9Qfb4XRUdhE~I{CW?#Pn$U(Xj1{*u)rOE%9k^)*7?~ z876MA_k~CYUgd7j4E% zsFk{p%&hrsZFw(YmN~Xp9MBa4RZ0@O&@L`VQ%(>9YuQDhVn3hc`5WUvJpyQZ2mxNK zz;LSXi$>Y=xMg<*LP|)$+OsAAQ1w~ypVKvzo}EhmfTP*~Fkl-Ibki@<6aqBXX1Gz# z^0X@S{H5Ben&U}LZ9Qf}{AuKXr?XF*!OV;!Ga|3Z&VypgD#FT624E)+4LlGAeDJ))!PRHXL*(MGSM1ThY3!iO7X6? z+~h>ZJ%;bc0tRzC9z-BDH`2B=u|Xv&jS2)|A0zH5aV4U71$v~ZE2alY+GmJu8-y6T z)a0Z>poS6k8-+)Y%x@t@NDZ2{*WK{-s73_tS}l>aN|g@Vw@My0w4*x2%e;3zkTMA} z^vdqP&Xq*oR82!IPSP$q?qd!#w1?aynrlN@!TO-bLqw_QyR-sF;u;Dn7&1b13q5B; z!%8m%@f_IROPdpsEDd{rnK5^{a(O}yx378C4NP9X`6_V`C8`NFXqwH<-b-xu#2fK} zvm-Ai(|Gn?K(vq$y_qi7Hg@snMCqlfEf8$Q~X zUk`1c0CkLu*Wr1Lz?JBIRM5$o@JNoM7?7kDmSTp-`)#aL!w1X*9khx0i@nRxuz_Pf zsuA4^242{6yCED42v!ZEG_v&YQ2+r3aKWZ1lZYnPVE_ORUM(~3n-+}Wh2728a5&6@ zp-gB9to;!k8AK7Ph;bkzgzN$qBql@pr)|B*xHA~6h&3f*n2J|j1lVO;uT8MOwy-pL z)=Lh6s?Gsoal(gf&4&=?^tl&tMl1$MJukmx>d;yP3%k0MN-3}>Dy*O^ml}i{G3BDO zba+HQaCO647d4{?0y_*xx!QrhhjlKhUOgv&2SX}a@(`5!RgBgdH7AP4hB6~F>Mi2VFGLfN)q z(QCO<&zHDC*mRN2DAPm)K@bWBJqTj)!ciVu2(C~ppgdcIbjuoI$j5{eAR)sy6#xLN zBm>h|oZ;A@hAyA320{HYKw+%&<>?49wwj?vxR*rmGfXUwSV~~u9b(eP{64GrC3aoS2yHSH_e8!_|JE89UEEEECt!ILvW)Gs(GF15sd z1x}vY-e$0uq;^Swnt_9f&1$vFG>ODfQ#5%+(0%3R0lFkIBpGR>5b*SIDh=K48li+` zDo`&f_z_Da?QK+3bP+AjWK=619vp@lq7oa=YsD|Eo4*rMTsV?UZyUDahpmu4s48HB zbynrQlD(-Cy_tK<9}CyCjBD-Xl>{M z$`;&&mTvWCBiPRy@I{vT5!i-91o!N z{B~m-!J2yzwuZzOc1R7hm~lk~X_7cj>&w^+R5X;^G%|of8wluTInde(?+u@e3wF(` z*@e3EK_Qd?f&C7q385}7gDFU6aUi#_m~8sdAM3JZeS)&E)E7fjVbW=J&B5lj!A-ax z0HAv-wXWaOgNBF2Om0FAz6|PV0$fF`a;))Yvj%qyc@YC?5Z$1NP|=u3>vP1p`UXM+ zoyS-4owSTGjP7TP+g3r4jLpAm-Z-ouS_%?mDwR*!71A`>5z`?k4sqCv`pJT!i3!y} zwvT$w$k>``xVfEd`I|x%Cp1D=gbJHM=K{3fQXu=Pz`6+w5Dd*rAQ# znVfrLAIH#ETqAEydX+NlRuH4&XyeW3qL_+d(Q(-Zn%;#tWg)nVgD_)8 z5ni?m0gxtu4^hM17hdN~*&(WoP+d~l5XMsaZOh{Xzez0C7V|TdJ6waktpZA_bp+Ld zzS54{VD3eZLK1QzKvK1%o0=ft+pORz0J2cTgCfnoF)eb?br9XlTT38T^mG|fb(nDQ zSXSwjF)gUk17}rDB8m{y2%jkeh0~_Rp=nGsp|L2amgquD=cuH(xrflZ$jF6uQo#Xj zMzs|{VxVs<Hqie8A|uFi-4C~w_+L# zauBU#6m{;Z1>0O;^mN5E-`^BzU)GG`=G_%6C50jbUC-Brj{O^_dKRa2LF33gB%mpd z7%L7O5Vm}xnR2@wtEMp>zK}N$SB4TWW7lug%5wmnFjCizlEzkl9we*C$ZmT_y7_X& zdngWuTDhDV5zY6^OE(KKn87{Ct_v-ovkQ>JoUbO;%}@1nzX}P4Q+&|dDvPcBB&PD@ zDecm2!)uoWr;bn%Rt`(XR*fS&Rm4E;)r23YJ77SvC>lgW&RlNew0lI}%FzX2!GA#- z$~!Ogo>=_k9FNCuzA#@CtZxjXJpPUPu$Unf}{%dl}iMF>Ii~<5X)_Si(Zbvdr+1!Nqi6uO~c{T zmGCBI4$Lv&m}ng*u+p3pxNBRKDrFvA2jGGc=P_J}wWNN@zDCd^Lg972QFkI=?H0eiAI3$4Odg9z}Gm{9bP({)m!lH^= z;7bUo5SdWd=0(+`bkNa^*)*^s2&ygl{LC~W=XzcL;9thV2)nezjw*u|BeFl$o zdJf<}=!`1k;9lYg-j4vY{}l%bq8=b-LB-DPBN_WY#V4T^bN1G}tvS46ahouQp@R7| zBHk>zkyr(;EL+pv0ti0$`En=`IqV04G3gCft0u{!sJtvj4h`4iLv9d9ynQ$z+4wO^ z7^EU6d&Alh{VYH6J-y`RJp8fXIcBH<9bW5Hela~xI(xaP9L_2~xzcJ-HXvqPp${&? z7XySN*<)A(<>@tY0n(vO(_|g5-8Bg(5cuNnDq1ZtO?E6;qhjBy6b(0d0(d_%6i8U*jsSfRBD(lK=n! literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.svg b/interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.svg new file mode 100755 index 000000000..7166ec1b9 --- /dev/null +++ b/interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.ttf b/interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..d2d6318f6640448517db133a40a6a5a36d36ed48 GIT binary patch literal 40252 zcmb@v31AdO_6Jd9yX&gULelwuuX-j4m%IP(`;0~R^i;j7diCnn zJ9`*sj9KuH!a5felnsDF~N zphSG%XY%YRGuHawKLDSr0q@BvHFIaMxj3ViT(I&c{`(4EQ;+r6RAk1L$_{`Z= z6krpdw3dFXoQ-EnUcsPp7Bykfz0+CJlzS&lV_m1$+&7c;6Lncji-1M#{@XpDHtF7( z%;<$qeQ7-z88_Z5pjERE*@yfIzKQ>ca$TyBcA)%T`dr!}he#FjgD3}-Pn0I5N!p>i zs{e{VVF)*LFqEQ9#NB)p`rN_ro}tv(%h<~>-`ETAuDAUG+71-$uL96p{{UC~>8{ET z3OEGI2ajNS|BTg!4uFgz{a$w!BmGf~dJ{&ziFIL#Epu2lOJO}xdZF}TR+iVYhZVG} zV1+0}D8(%&SP9B7lu~>y!?hgO;kb@KsX%!caF(Myg0cc-CCVz47Xfb@>i!Bax1+p_ zvIFH6l$|KA;=5fauc7Qlc^%~d%0ZMvC~u-1Mmd7=Hu^b=@(#)|ln?OiB;a$F&JHsh zOKPcS9Z|ZXbVJET|2Hv!xNx8d-0A?t^Pzl!tM@9OV&|6(}oFR-wFz?@ppz zLi^8A0$RuD8{cZwy4!e8;5)+OVzdj!e9b5cpa&Ys-Fm!)I-jFN11qC}mC?8Ln2pvw zFs7ck_Co1{IsMWoo=4ryC@-LFL3t7NX=EpH{R7}%MhRrW>d(xKl8Ch-%xGAt2UhBV zm3m;M9$2XdR_fU$)cYKzK+Gyc;MX^^wpH|Dh;~9A`Y6C^6rvQN6r+>?(lC@#+?U~6 zj_Yt-M_~39xK?5mqfn|)Mx%^DKX=;^zcl}Cfcq=-za8aelpQFqpzK6>72oYbc@1SZ z%IhcxP!6ITLU|MAFv<~>w=t%pDDR*gLwOftB0PS8?;0?+-=p|e&mWj+z4CSo22gghuRwM(lz{;I9GrYXJTlfWHRd zuMzlb1pXRwC+7SaBPb=b=^sN+C)SN-2waSr1mvwu1V%u~z_b7kix*vwip*!Va)Q zY$#6L!x--o{FSkH+53>bz^eiEB>pN`1N$SOe~!O#UJ1&NjbgPo$!Cc|KIS(HU&Bp{+s>) z+j(T!gqd_dW672A53hLU#0L$(|KsJ0e|U?%fAXup{`t$lea9AE`kX!T*z$F2)<5y& z<4G{nYaI|GvlGK_ME^Ta{AARI71(^K-g$Esgj*xusG2%<^<* z4@>jdt0$*>c$$5p-Sb|FM@bsxQSz%Q98O2{nhLw8q@=>(aaTs$Jw52IM`fkms)JwRaBQm*OXRPI4kj;yQ~6VMAPWKU8Q@JG>;)SbssipZgoz& zM~9Ej9H-sGoH;d~hsL8bkJ2&SqffKbh@|`p9-cqGI!_G3pgm-%&b>y(Rc+5-ijoy6Sd1RNfCQoZ@Oxvr|<$HKdUb@GW26%S6$CO)4D8P*~r_$p`pGxt` z51-OKerfi@3L8)VOh88-|J-W(nrh%4<4yPYrwuHx*lXZKlUAkz9Z2l8hz6>27S{t z7Jbt-4t>)#9(~i*j=t&YK;LvtK;LwAqHnq;rrG-l`f;UU%7NAPTp+ZX7N7=KPhv+$ zx+f{k<4X0oKzYd^vO>^?kMx{1J)HJ6!z*rmh!sxvbZEsV5BDT@^zg9G0(~j%r+f2P z9n*wsTw<8b3sM0V8jKEi`8U$3+Bi)mp*2&f< z-P7p~-(uw_phgCe$HHCqPWD3DW0>?kYt|Gx3$b%5#$yg1j=kK8^DrxV>70hXL3{XL zRPpHZQzxzI7H(4`WTty#SSa4=w$B$HcjL5J_N9K=yT!IJ@^WQmOsI% zVO-;APA^t5rgTr1x5r!`TC3?yz$|>2@1EwgccSSRfIs!A?6fzDTS3{`t&f5Hw#PkM zAB)<)rZ?5;nda%7>igy=Er~w{VV1?@0R6lzph{N3(PgerX`y z(Y8*kKPDEY?U;RxHixB?Ck-3KeV6A0zz4Y1;z>uHoHS1cF1du8d|=OB05d?)YG*8!7G>@eZp6+-&PTXbVu3AtH9{0e9nlw*lYwhv$LDZfg?x^-e zaYt1rrFpuwR-H^AMAa$cj;hv*JE}T0&6CwywT?cBs?)?BRh=&GsOpTgRF83zM@}qR zNbEbE7%wyjNYTL%Qu3f7Owz>&)Jj|+hCM59^&rTlFe70(M&%CjN`sMSZ^7ZSx zN+u5IJ9K<5!Tz1RLtY|a8<^8=mmq`lVLDln0iWe5P^J`vV$kc*xop;lq;eTOph(Iy z&lXA5&pubIJJkFSDTE5agVv4BA9TMMl^#bc?z5zX){cFi@9HD%lQ;10_?=q+;Ni7N-(W&Vz&1 z3yTgczP4!3yz6EjQLbJK;mM2kEoxe{XHip7)7RHaugkUSpLeQb`8Fy$dE8FELmfqB zr}}3eM_O6mmeop;J`^K&K@%S8wxlMx>@krM;ejSUNj7o}HfNwGprpbL{fu*Hw&aPB zcomi)NY0CPTZkH_-TbujV1(6drKPdzgSj(1DLE^S+bo@UR=4i`d8Q%UW=Kkw<0Re> zPm<*z@DH1O>F<9?UzL7x^^lK7mv3J6{U@$f&X*n>=^xJzk#o%31TTUJl85E61p=%dEIp{geOr!IRRYJpVC+#-|Xi>exDH z6$QGFAjL(pSlAD;*<%Aek(g3PW(weXZqkpYIT^TAI1>|Z?fDSZ3Rcd7{V@6|`F|X2{5FZy6#aZ`m8R;%(TuOXORBTjiOmsxJ zIoP0M{@gz>IF%<50y4W2GHh0fNI0uoDABWvJGteq-%6p`6>9bqol0MXiePgr!^QfrvN8CBAiF`X_<2c(4u z_;c2|Q)r-L6WRw{Gj@#`V)s~jJHfyk4hP>aKu(b_gsU+ zLnQ75962*o%J^ATFYq4#NFJ^3YJOk+NlKI+=7l^^{WqGuFO5)^>*HZhi*-i@1qQ$% z*~I!|bTwv9lW`eb7K1-e=B{j=MV@#c-x#1ix$E5IFSl`*x~-6pcjTN?Bh$ddC!AWF;>}$z36f$fRE^;!C<=zXF3ksnI!3kF`cB# z7pyQuAC}4;Sq?K!iZF-S$^W6Q;ENCNMe3>p(t-ngiMsrNx>~?(saLP@5%7=dS-9JR zC1AXchK!UIb5AMv-mNoR9X#c$K3INv%zR5 zR+902+|oG!5SDC*AtRmtoX(GZ^by)QTE65%xD|7uHAIUt5`}nPVglAM+eeZhL&wEm#}j( zyLJ!F3Q-1aQNMZX_`5r}?a5VzX1GhAe4y?bskCQ991THIz455Pt1ycam<$xX} zE=yHlU4m%=@1Pkk-d%|fXJSX9T&vy?76%rk2kPkn1irJnIh@(z+HTBB|5Lk`u6g~e!A$*Pn2a_ej9Iy*uHqh`Fn>pbje!3y%o9UQ!_6a0P~FS;oR}9?0|j{ryAz zL#^gevpK|wk&=|*$mS3(99S%;-oO>x*}Sjwn>V;*r+W6RIxH_f-Nu8~;T9Cv>lILycefl0Dn zmh`n)RJ~5tSNWFGijxbYEyHNTaBxLA;-fl5cW^mEory+ks-;^L$5w(I<4j<3rgr*> zqgyA=ac4r1Y_o>XT6BTCKA1NmwP?mU_1XaalCzuNSpB!>j$h!v8umcmzRb$}&T-NN ze(W6Iz+*N<9uHTW)&J}|_4+pTZ|ncjsb=@&GfBM)$K=jjDQI&E)_5~;tiM?z#w;{} zl31PDte8_XIpjqHUn2d`JT_I{?r8Q?zCE||`VW}nAmCvvc!!NS;X}!CckLJvs#mbp za&#Q$dKow|13h~=3YeKIk+Z}MS4MnnPyn-Wo8GrN2BK|o%4UVQglK0G2eP(a7CNiL zwZmGvwEx#zUR^kK@mDW=^fjMdHB`-cdgc5HbJx~Hjk$NofVoSmb?5eNdgMgTkT>pK z^zPI%J9)~gf=wg$Uuyca`;)a}Wl3vzJaxIV{bG=;Ex{5dL(&(rJdsI?%l5ah^)sMH5o5iVbCxZ$3%S(ky_I>ZD z|JlD{+M>Bf8++^Ly!Z0Km4AQ!y>n_!>C(K>74x=L%h%7TW7Ka~+0Uo`%>A~0d}K5C zTmSd8u{)}#&OEwd`Z5|jog3GcI-DCev65cqVY^AUNlZ)ti?g&lMdWt(=jcSK8JyF1 zx9@0?575~%baG+S=WU0K)Up}pBK4(*Kd6J-r2tRB3!GAnO$A2~ywxV-#4!i^n}~oc zI^S6teUnl}=cZ@elxe<>#R2*mw@atI{Q@HR=UjGKiB=j3(tex=9a3F9i-(!G65UiG z?`$rV-nz{9EaKmsP+r-H)4F`z3kNZ`_7(4jmGgel4Sx2t8A zEJqkenJ4cg*mD2<`_)+ogk|vNap+}?!(yU=@VU~V=3;8VxA6>KaYBt)q?TeF+giSs zPY8N)v7YYkL7=5T3`D}V0OP`F2xD!htdB1sXe=Qv23#dFF-4Dawja-KJCQW5pf}Kw z)Nbv#5;|@1w4tuy!v=2{GUWV6uYIs|XYJ@<^&+8m{Ggn^{OF1|Mhz|**14b}+vS<_ z+6xO$EGV8oT-_!xJrNR##3r^B=y&N3z+;)mo^*$Xag&_Oxv3)@PO03WSG+=b2ID3L z*sle7;~dZ{tO`qG&>KdA6$>>bAeYoqp;8B%AfTuFS}+-3aM=W%=x$9(Shw`*>F(Dv zuUB4@)8$I0{S*N8Ra0Y<+ifH$fHGKursgC%6BH>dgk^Tk4#Qqc6q1Rfs}id7YCBL9 zlk~e5eD=ursR8;)p2aIx{d0Y{;l-mT#SJZbpipi3?lX1QyFBv7nZI26?lZKi{i+8;6*fX3z?H3ZSF1$B=^orl#|JC15t5014 zul;Jo^P^tjJuX0%ICTAK^_%(A4o-RDiKqSnwH{~cDp2DP-C5bNkp_9r}m9uyD) zou`r%kPF$B4pgJj7-S5B&>EtL(hJ3%JD|EtNm+V>EcaHUFQ{@b58d&%o*n$NNABjE z)H>ba>qXLJzV(f6Yj>(1+B-5l*i88d{5=?a!OnWQvvGRs&?S~zr${Cp$rPr?31T#U|veGNo|HsT;5#& z!;>$+wC?DEc_%rIms;bTcf0)CA zd1BKCd%1C)XXl15FzJ;3ECS zXQk5Ve8Ot0DnlJZfDuI=(sYey$;Q;?ugm$*DXOtriq;)Er_TFG?a>NeogCS0@8IHz+@Blyp&wGZd^F;qy7%0hM;&~w7ni!V0+)7o zEM^K7k&hyABp?^GMG8?X4xvrZ?#h&54pT;4eXRMzwV3etOQr5hzn3;P&j7jZl16Cj zBh>};&2kSHK00^&&8 z@I=lgBiLvF4^VsubmjSHvv}%N^?awls;RAT_1H(1osM> z(M=ZcVbKgQLPo~sCh08ztXs^}Vzy|CjcgFJ%;pZR^jEJpJw1=6`OG>FZLIlOY5m0J z-(jl#c1SVJ6MXa{F9K|xS2h%)zEs*K8zPj(D;q*OG!y`u`m+=bt@4KL9A*azK>sz` zTUZx&C-4}FcZOaX%PZ9LUmi-%&^Iqpj?MqPX%jkLt}MA;EY}{{e1qsvj6ru9V=xo` z8T2k02bZ9HHu)xUu$s+Qu-Y(afZU1WmHOtH-9xiM6g$->b+XVqyLK@9UUCqrbqks0c)>EcT3W(JErdcBONLy z`G|`*xUKopnk!3xwPDTW#arZh^;>n&mpm04z@NYMH}$hI@2RhS`1;XzdD$nsj%mD1 z0ZtIRV_~%8asGfjNE;EN29{Hn1LZteK@#oQ@tQIT_NB8j2h=z2=o-#1jNNx)-l7H4 zNcDB~!pym#7(V3dZ=}W-H_VuL_L};0Gmv|h=B;iQ^A16j6jmFHs^E~p0!$+;OI{OR zJ3e5Jw3*{V<6I7_J`}bDW}qYPu4qu3{=|*y7azvo6&J_UxGHruFS;EcM|s(WR(#Y0 zAAu~KIF=u%0b^A35MLF!62gm@)q5EPW8v12Ak+>FcbE+rq=phG->?PB$-Z-s?^#S( zDgEN=>#zMsZ92bx@vfcoA6Ot2HNy_`&Id1l*{yk%RCH?7@~LDIPKK`38$2_SrMo*u zfM-VPam>L`g|n_5!}N;pu(>$Xz!%Bt-Kt99h)M1Q69pM31lxoN1W724%iGj1)ZeUm zeedcmrOT&I%v$`Xb>}=IURpWhk+}X-o}bTm|K{qzD>d_K^QV>N&Rjn9p;OaGzdK~! z*o?xy18NRpY!Dfg6Tpvw!S;d`4Oa6%^b`<17Izz-+dlOBZag;3sf;;K1S63v&5swOLWsC%!3$$Z>7oa(Oiw#F`dN zd3caEpN|+bkUc7fY)C%-VIW(6K&~FfXjbZ_7OMr^%VG&J+Q32NWMT23j;w}E>eOO0 zWI~YVnL3xMy7Y=Zqd;BS!m_@$1nSFr^W}evmt|v2xrI;uSuTF7?um^}hcJ#kkN)QJ zO8K6qw_ZJ3aVb?EBF5D6B^-$u z{kK$n{pWo!4)`@+luDXCutOba{t8UL7p))RlL5AoMY|*PfXjGJdu)b=n&r?`6G3%a zl6djROkd#^6I`hy%Pz0fqP`I3|(uLG=>i=d}%fMxP(q&{+j$mun@g_^y?#Gypi z1qW8Q+##1X?@E=IIh%G%D|RaV&+ooLhH>8VHSF6VfM=kw;l#!N!&}88i4Js{Glu3c z;5g?S)l$BM?@7L_Ubw6t)nE5qpQ5elWiY~3fFsWFJKIP(L~XwN(uIpY3n}$K2X=Ad zA6oz7%pcBtyM+7tH)O&)g)!7!;$1E$^F8WvwS1%QInRIegkP5wsaSQ#pfF*7=&;SP za6%^V+UhYvpT)(3Ibaknsd_07Ieb(dB1OtCH&sddn!R+8hw*G|DZ)H#@T7s{`Ctr( zaLZY~nGB_bRcT(+`8c_Ydh{_omtvKR@+Q3l>l^6~M+hbwh=Y6Xc32MymeYMAw-!yoeMb5$d^+}Pv!;MntAsjrw;um1b-$&+ZV8JKH{-payZ+gjBvbM1m7##f&lg16U)txapxHr)st?8dP+ zXN1!n92lUvOjtM%*QT57BnpQBO-x0Ys9~XMXMyh~<&0m~!Oy*q7k^h6*frQVYSV}( zx2^plVA!?^V}=iZYJ_#vh|PMdy1)P18FNOSKlGvc!WsF>Gug;5WBnYJ)Ko2J)403D5A|KRr< zx!+{p6`0yi7t~hiqK6ciFNuAzKa}kZT#H&_$4}64itk_*>=87DO zQG;g)o~S@NQ-t;(gu_;IHHC`DNjuU%S5kqQfE8YCC2Qo>0BcZjzY3Lp07{pVQh74vsC)s*Eu9 z1Igg;5)kf{ea##!A<26P{gk&bSYJEbL=AUFkc zEi5IOq^5XIMsvkMYoxiYy}oOk=FHZXFj@2Y11sd~Ru;s+7jyMYw+^%V_gU(BR{f3o zw~xM9TR&*b#8p3?Eh$k4&0aX`-d`OaHD|?u@!bn^28_#6N>@924SoMhV+VIqj4>p9 z`TZY!wrTm4P2JK<^Cx8td+mdNSZ}-+S~q0C;OUbxdj-fR2d@}fIC#jT!yd;ngZ?sr zl49)RC`O(nub74zW9Q-<@`%`S^)O6%b-^eWm0&en5)Cj!Sm3K6ZydyL$cb1*FUtdB zk3Al`Z1#!t@r~efJ)=8WjODM6dGtx!T50Pj*Q)Cm)pYQ<>kqy%ux{-0PYfF049kGv z>G)@a?mFbBVAgw}CmB2?Owbg*#dyStB-|e&5(PpZ6QL;}Jn^*hpgB|+(%TzgAq{2n z;vt1uIVA(K3NjiSztfG+E6?g)SlaFSXB3UjB=x##75xUl(lyrY=c958hM_S;w-Gx! z@{&0;10wTicO;MopNdj-+jo_2*j;R4=3t)@0qzvv4iH9!_T!ub;?G*1%$0A|pOg0U zltG2v2Vlf`g6xkdCvG?n?lKI~MxNoP77Xm0|lU)*khxG+c5xk z4T&Z3B!7+dw~{O@89r)mcb5qzK~DZ-f^p!xQ&y}Ef9$*UmPOOwPM!4Kdh@)QZ-c%Y z4~LnaQYL?Q--74Xy5}{|m9~ycT6XQ68ZT`vO<$#cs-`NX=lMrZxuhhd$H)T*)iH+%REz7 zZnUk&Mod|LZ^NTveDkM0`&j;L+Jz)TURAP{iBK$~z1Ahc=fMEM`^j2>bIFzD5~?rB zab7ndRH)WyCOVJg;_+2uHV&ImGwO+w?>DsUc<;~ax%BFZKT5}@En5H6+FA1-{b}`w z>cPEVpFGV6z4Z;|0vr5U@bMDh$inPxGDVw=26k0V@~S372EO>&@5ZVbLnZfxHX5muO$vzREWJ4cxkXRU`Pi-${Lx{3~5bh>N&3Us5lCQe^+kpZ74aV}VqtHgI(O*TeDeEEdE2;g_1J08tJfYUyEe`$c{S!8!scl!?T2%T z%$8t$(QbTzu~&Sk)V_{_Z5gZ)f;|Z)vQ97(kP0F)qup_>Uy5^uY7kEcp=*Z;F>j&H zm|y`8;UU5ou9FQ&xV(Q8+NuS`fw6cLdueC};#rEpsuf>auRbL^4lUaVP|KW)jB z&klXCY0zU2-cyw`d1^%`UjF*qxgU)x$T0&wI)}gK~PO7i9M?pFn$!Q(Tek z(iOp*If*a_3nVZ=CmvFzV3?;kn6Yq&NLX290xn%Jv3elx2}(uavB&3WMlwq(+i*`@axOsmli!fGj77S-@X-QEZsL{ z<%WoW#Y$=OmUZ1$-23U{{C79@oV#zvvyb;*+)pY3o+qN85{y;Y!SER}i!97w!MQlR z$jpn8zz&9xVA#PZ>^D42Gf45jF8?Mw$PiO*9|u?KAcYY}V` zV*xvwWH(SgOa?^o*xIa?;*fc8F1(7uNQnA~J{GpHa6|#YOqz`tCkMKN5YTD|lOQX} zgDhN*%u?T1uV-8iluY`ZR35J4nciHI@zsyb*QL1yXZk(Z+#3VBf8-WVwKT1Hd)D8& zUYsdOVqm-l?@Uq3F)m>TGwC58fpB20q5)wk$Y=>Wm>D)9VXqQaFpHCatDaYX;FtdT z(-Szq!Dl>{G4rUml2m@DLO-`?uaCw|l46r>-~1p$rCC8K`3eo*efuEh)8nV8=9 z{r;5SFkb3+gT4Hm`(#H>%>l~i`Tb5v%=TUg2; zAl_`(hj?W{A)9j!{Yf)zWg>XA=eP=+OiY2unU-563s0-3hE=~22KM)MNA#> z5sFUmy1I3kn=28#BSg#%Vw#wncLJH-DW&o(+L|a?P_4wYlbjSG+)vDH(c|I$6ZRj7 zts5g|w#A(4H)4oWcj&vmMIQ}tJbt8nqWa0pE8mpzOL*3d`_1~!uVm+(OpEK);V|u~ zSyFE$Rjvhn^>O#4-30OiUkv8lEpxd)mPM9^g3##PL41XlpdiVGnuP`IPP4EeeA$pi zXFtsUWIm_J2jb$qBJ=(}6Q6d^7+o-`OV=g6rflqg|KLF*r33wXzdJo5IWDqauVb?u z4!e!yp-{B%c>@lNxq~Aa482O5QWX2`nP!kXo@~R zx7fK5vby4k2&Y8^&q1Jqx1RPb&JKK@*7hyvb|`iRsgkl%SXp_<>T*TWhSWK;=~N4C z%@Sx8CJ9{zDQ9!~BabcpdZTl*>w%j5B{dVaRSJXDimle)C7j)IjOUyV-@ZK{{jIF^ zKd+y)Fx7rMU#IQQs~Eyz%rA!Jy4@f+k_xz#1FH&LO3>9Rg*-q4op6Cu7_u&qXpdqO z>D(gf!>J#`V@yJ{F+k8YkTajcdvM9dm=W6v5|k^BZm(EB_pOdS`QQZA;|Lp9Chbda z>Xvk-tMh}zlYNu^qWfsXo5knUzwLf@{K}5!-%tPR_T4=7t>aigPn|wt>7r$Q`z~FublmKPBbUxw+IQ!Y z(NzyWTs3-$^y$oTsMELqvU$rUOuu*Bk_Ah9_g=DK$++274?Zwv%!3aR{UF*}xsE*@ z&U(1B2$wtunwt@W<0Qwc|$yuSY}p zF`%MSNSSsF_?!^nP6#m<9Ex~U(_hs5rmuk5A z?W@o0w`%Z+ntNt1T`+a}gd%=_Y_LyOXsrPj5vz`x#s_WNxWY5GIefm@qZg#;7Wz#j{ zEVi-Cfs`HY4kXh*lmnuFlI9RXPjeee4}@QU@xsc3iCR!%dm9DPFN8KjoQCfz=-;_# zVXusSe5vnFH?hy4jLrj!Gcvtb@CLkVM?W5WF^sub78~Lo2zP;OHKH#vTm!4fJ0j5y z-fu*65OMOlA40#(#X(|06%O^XdSdQf#{G{_9_xXAffYa6lSD^ zhFK{PK2gfHhANpN1V|FGX!5o>ORi=-oHlRq$=`l?dd)+5bxo_z@Ub7B=3_oOsc!$| zyt?hg;vGEkwb!|8+jjNx>pRs;I~BiYpI1M%Tef8W`?tUUPtL|{^#ZjyrM`Ifw7UJ{ z^L*5)o$436_i)FKm$~!xS5*-^B(bfsB=^>xhEFDz?H%Yz0{-EyBs)3jUI<@R$v8*@!H1waf>(R86?hsn3JVXp1*OipVGCuZ`IVX<Ln z>pi)2j_&l7QO)I3`(;0J??adGZ9Y={;?M;rRv@HV!aG_fDxvb1u(Jj-2R3Mwxpyar(XolfnTP4 z7llY5f`pJ@Zw)J1{$Gh-ey?iyr)PFo?SmC~m|9*`KB}s$NV@c2Hh`(@fka5|`Rd#9 zOm#|8|9g61d1m3AA1?h7aE4#``8h3vPV$_@j@$_uiuw^%c+778lh{xu>{RS@!7hr(#n@L2Ye8ajoz{ zBSsku8>^fUHt5dobg)W@dN2$i-VZxS!XoPRhG9l-Fa#R%0s;bp1A>uRL8l9Xqqw78 z0ux0nw@YGDSI9f1Cl690(?NBO`n3pN=4^;m4Bz=#=(5P}2?XH=XqgJK=0(Q?5u(HM zY>6TdhC8xd-l*etX)wXuA?<439>W7?4RrSCTs5&I@9D8~S7%I`zlYD2idTIxuCyqr zQ@4`E-Ln^t%bzu~3f6x(NTr^lZzt>L?i~-(L#PVGH5{7SKt%ov9STDI5WElHtP zr97w8;dG|ll>Xw=tFpSKaxM7TaBs9t ztKGq8NrX@}Ij8@e_tPi;^}EC2egij;oStDc#pS?+_}w~0Bn&9J@mqfJ#-3xdCJei0 zn|fT|uX%hqkhEKEQVzf>A55{U5PwPi@{W$qdzh%SptB%KWz!-|Iq?UlS?CiX-7_7^ zfwe~;>sR*skN@zkl&?1FC;z7&Nru;Na76`b!9O=iJ^2Z_PVi6Mn+@=c%#%il9WEpb zS^@AZ$Q6lBDF(cgx4^N1_f#>Qi{RTKfsnE!>@rB{SYD})T2W*YJS<_(1O&ENNWBr} zFtUbaXCfh`ar@)$?ipQH7vzuM(6z{|UaPx5cvVn!hg8$f>PR%^?0uBgp3|es1U*Yp0TB#Dliu95><| z4}=`0Md^Ztjf8-%abv55Bs^d(Wb%pN>RIrQME*&CMMe|pw>zc-exd*hKc)Sn+4EuWV!-F!}(crup}iltrT^XlA{ zJpQ=@7u6zl>0>-{!~RdXs*YX2i}}5S)Si-BGKY`m)q~U$ZJiJ%qC2TOB-RP{A<673 zX(O&lZ1HCdtM(V^{pL4WxqDb}kUuhPVv%Np^?*PRrvf}m$e}V$_BTmJoKnoFjDlx| zqR7Z<3X4v3H0ROwXgg)NL)eEJMZpo`xD24<5_CfLsyOtYz^*RRddHimsQ0(1_xt1^ z^ghsCM7`_LyG|d22s{!Ib@19iT!IWE>vf}H)fUlf5SE64IaBAHr*v?{M@P2n)Pzpa z=XCU$p*u@`P8WU34l(n;;P`*jtY`BS#@=^FQ1oaw?jH~pDf#(3xk;B0Dj7{W9Ocp2 z{XLk@&*Y~w)xzXs)SHY|!3If>wP$*16blI8Wr0E3ko^4o%b34^tC=g>-RBpY!U9M6 zlK}yNWh^idto7FBm2Ou^2f;JD$Xk=HHoJl4wlwon*4y19!Yb+XNC1#PfLL}( zud76&B1V5pGKR?%9)_bg*c41>urZF-T)^Ia8|?Y)G+_62_d+a{Ugw1kp&0p6lD_UP z&?9V?(Du-Yjs^S`x4}QfMgjf+cfVMh1r+P;z@RhK>0!y!)#2p=cN%{*qEp&tV8RSq z`}oLEbPImYu({}Cu)CO`^Bg~JL?WXRiHs&g00K%(y3t5nxxE*_Hzhh9@iEw(h@Ewr zUA{R5w(oDQq2De2)v?j&54H)dKjhaLIfNj671E4u@5W?GN~HW0Yb(n9;!<1J+HezW zJv$vegSp*(0a*vGj6@~)qg&xp)UO0r6sb6*t|DIaj?e|&BX`F@ahJjH9Ad0Eb@e8l z9`*+lv@8>^q}MtKJAkGxA!}bSjgXKKO9&X1_Fo9B5-A*S7r`G~6QUs6kn8@@^zRXB zNeff2%iH88k;HK=RrMP$MK=##Q>xAu89tQGaYoJJ&r8djmk{4UObX@B2wscvfx?pn zh2JmH0zc-Cq;M@8d0zavo_9>P!#zbJ7_l4*rb@;})$2LL5(t768YJ{#sT{Hj0{Fbi zs%Co2LIP6C%5?U%0-G%znN!m{J_q!qDRjA4SZ*_|KRic<`NJ&u2?C*ycdVpeGVA z0IY$dgLbgJFM?@HvGLiFei8O5)*rAT)kaxEWIa?eux%su_^l(q9lCGmCTDxRh<(ux zFLexoge!Fv_ssBi2Mx>L9ld>rg>VoYB;LAX4MJuIlx3$0vB-Ew0yaC@a2%#N$meFbQ|Cb`S|M=0LkfpCYdXYelvT zjn8z|D2dHNZ^$cjIq=RBES65eNe3+AG=j_u)qsPecrD3@5Df`-Cd9?s!h&N$VqA%a z81QW^XXXyD=fh4TU^`-A-ylNJA?sMjbsB84PTT_9m1vLu-(a6&X8{{Kw_~DRMhXbn zf})43nMO`wk;3+I3-k`j?Z<9xH}<02@N$M-1pFd*KDI4zVnC*)QST3OHY%f$*?0%| zaj_x6T{?G4OG!?0IUTWGj=niN3%kATZ5oO`9rvx_0ZDFGb?i*r#iEJpA|(b?5nt zL2}*zbyG!l)9D`X0;RyY$Y=4==Ck5_MJ^>tkZcGlWV$=YBlJ_yJ&0bXR3bV@98zs5 zFPz85AetMo+pe%gL#&tg-3{)19u2tQHqo|QY5oq7@g}Iqc94HzyrN?kBd6y0c>PcwWGf~fYc~2+BaZREbV=fZ{o!-?!m?S2>i}x zlL0f$of6~+Zy|Oh=@%j#1O`#1jzlYn0^%Tm5*Qk)izmcNB8PS&WV8TKV3OMjibV8~ zZZsN^Oix}$U$evnFli{vu!S%OjFs>c!F<$etyCr=lKI2wIg}%rS@Y$0&AqBUCl@SQ zBzO6j`Y-jo?$EzJRQU@}%@{BC4|092${~F;>&Xh;d3J2Uc)@)+@PLlN79nP$b2xP% zBa)m2=?XfNNWB(e%vqTvFa`Q!@ATw7;g6QRVL5mojTYh$ryyQc6$h=!XQOBf*@5aL zTyF+AedgsC_3bvGES&2*U%ztn!v6Vvi>DPOeRJy2qz50IIzOYLbVy~@_+ev*|E8OI zt>aq={Cq!bWUca>zka-R)vFJW9NgLw#~acNB|r?nS{p- z=^zwxsildOlkjcBYXd}@hRb;{SObrZ$`MZ7b? zyX+`&M?9w$>2sIXw@*cT3!By+?_SfE#7;|+o_4oI35+71AZSbX^DVS>CY15#G^M2< zjCWuOFxB{ID!?y9GV%c9Xm~vQ%L2K-KW5aHeuTgjnne)J4zn2O2?J%iZ-dg-mcSVU z%3w1Qx|}bK={7h-;s4)9LzdqH2&IUk{cm%+1zc@s@R~YhmmwjTb;=*0RLt^&rMF zm=%l=v9N{8lz>|aFHl=D@mwq!A*t6L0o*bfZ!lqCt_C8&hZtDbwBFG#y@tdHjQmec zfeL|$9^JckPV1O-$88wo)o(SvSbqx+P9ySomk$TG(yod5`J4QzAbKH@+enUSAGzIv z1NVSimlk%yo7>(pA0m&Nu<$?5M5aBcUypcFdb8yKo}`UE*ai_NnM=kFSTmE1U|4#h z_ddbvVsg9@vE6a%`YSqrqyrjFMhON@cwwbL<7mX3`1>nm^a?Q~d<6SRCKDoNc@W%C z+QuYTbU%2&{PlNe4NFCEt`7t>FA>m+4d4ai+urUX00@BX?Y8bU06ZW7L(tlb(cBdj zZGxUXQaj@9zrA}5=sBQk=Z@K_*<>G$jufFL!N@{{fWcCDikb4=k`ZOn7MBcpg8bSB z?*UG!Q{;C+*paJ!=2tjHacN;2%C^tTY|mJY!(SS^@|iV%Usv%^nyLR&k(pa3KK2r2 zR;4S8<}Nw#M$^jS&sPr~IQ;3dV)?}>uesvi{%xLh^*rQ;eRA+DAOG>lsx9;S7eBY; z(78VI7M8y=^w>*0=#i?KTh;4pr;eA6NXn}21%DOsTI63L$FG%Mp_4*bWBcp2}4@LG>Tuu{n|8X!=<8hcnMOjr;w+H$fG-DW*PO-UBndcRmz zSdTg+Cm@poeh#u8MMx2_9%<)-e7&8_QKZQn&oEZu9-f{8%aH^0nE(|Z#(YF2B2*qB z*;?uwc2y9xbyyrIUK8UafefJ`lxGm&FY(llNv`-<3WoAe3`m60-B0rKYqzJvZ|iqH z)NS;e;(}GFUBBoQUAOhC*L(YImv`5$UpfnasbAA={hs=qvC;0zu4x@$acb)r#v!8& z^{TCBl21%D<90oh>gkh;#Pci4K7jo+@IuA|*4nlTG#qF@}6m`I{d`(b+PR=VS8ZF=|2%FIYlxeZSw!VwK4 zUSEpP@RUKa=y5^Ax$489VHdpJUKpGc+u+P^fyPH( zO`m-WB0X$ol<9mkCcX6y;_}G%8YPymPyu ztwTFlb?R4uH9*6@jm$V&Y7b7+wz);S!!&ajhD$H~5MF1@x$;fKT)|4HC({n;O!!qX zWwG9c$e~oy5Mco#mzoUcASW3KK=8^GtQ20IQbm3FQV8PXk`m)m<5NRj>GTc{_)Eiu za&8s@QN9-r+cJ|7AgG1&Bza>mrB!KFb<0Yw7hHUPgL?ho$xF+xZmfPHMen!xdQr*f zwL@x0SFJ4`uS-wKezvH1&C*5Z)N?KBig!Odv5kjr9$fIR#~xpH9h9%Ai#R}M;nJ| z2h;lBVV?RIBioqI&Ij|D7T<=GN*k${J+_A`hH7wlZ8bF3QSI~*ZT@Es-9_DYrxk9H6D8t9o+F*OB3NKS_tw&82?|bv^)`sZf|I&-QLwmcUZ)|rO5DEI> zaj`dB9to@df|rSPYIhE3bFce5&OVL%IJB2x!t_I-ly~X@S%#Wn2#ZN(_uG+z*c7lN z{3MmjN$wU@L3~sr;-j>8^$Y7eEI9OgVgLZ6JtDKTw>b_47bbX;T*weyND>2H3jrIW z*?@N|Q)pDXSWXqxe;swwLRMlNr)Zcwiq15EP5#z~h*`bV5 zHbP2`g@>)coeTdE4gyz9GF;fR*#>$cy7TuWH&xKWyF$+{nd(fM~(bQ`q|2-hU?Wq zDbmqjtDZf*mshW=ec=o*KGJu3^}LBg)XSHWos!Gh%vOB&SbBK#pB>nHBCko?d$Z`g ztkCxJON`As%I8EMn`9gTGR}8~65sJ8D`}iesqTjvVO|eLn17+siVULOCQ9Mep z7?XC+-FZy&=Q6hV5KOG(xYNee0Zt6~!NA9T!B0ZMy3?@IezEGEMn?Ain?@$&i#w0) z6oNPRzS$umPB{Lw-!teyQW!_ziWr?FS0iZ{Lf9P!r%fj1ruuM9A%^oV4czI!T=&-L z;4PY*C%JCIwO>12YkRug`q$|hdqo=-#CljQF`Ap?xjW866aRjp`Yq#v_~!%O=F{}^ zg1)6LI8zwsT{2QrT+aBmb@3ObUikY(j+REp!g7qXDV$65|HByk4zZDlzCb#If{Y>f z!JrTzHdhY>dlR_CK}BX{5Hn1&-YhO_xD$C?W@7!`JYmGNg|kG8D8Dt`SICl-^D812 zA?4C*Ur5D(>Lc=mz3*^Ij7T)Y@JNv~&=lLf!v%T*tj>spxpVezl2knQ@l>P8-}QXg zxof8J`PZL#>Ctav%C}UH9x-C$h*E3S@T#$D7bE-Pn>WsU{Fau*yG{M~%JEa{x$((~ zc!LdONDWWgdbh(<-E)l1bo;lW$S2H0WCE{6iW`aXI_Swdoi+D1L`B24?yaXqYXG@b zx7Dh2`-87137nFrn+sW8kN8Mme!ovB_2%~@F)$kMPCy07rSLf#O7SkeFy>&52P2`| z5fdQOT>`~k;B`Zlh!0UD7!c?OBK(XJ#kIq#F5<*AQts%h3B#Zk;wqM#6aoCq#;q+V z2rKKqw}5cT0=3pcmlesXU4N+^(T2Abj9$J*boPeY!egSs9X2>4@Sn>O;!iIS(>v|H z*O-#8SQH&zj0pi+yk}n@+niZG!uK+~Cx=Mad;uf$*3YKt#RERin?tV(w6?wv&!&Zr zSfZ7nc9!tGB09y6m}EIehEH(-1Q&XD0)1t?^()^~ zL;D7mumur!NQ99}(V3L003+h<^xA6SMGK%SESAsIuR-tBS{GRI)g)uO@BWrn2*Lqy z0|CEF146vF7t;BC_t1i13hUB2(aBj>X6K$=dLr#3BQYZuKcf;FBD^pOJOMwXf>#(( zij(hrzQvM*3^GK%`Cd*yZ=8Z-(r3y!yYQ{ftG_?;hmEXd$M@s!`EbdLZ>R^=Pcq~= zbMlwZs@mB+X5_k&HC5|hpCGNCx+fw2o!|7ajvjsJuO~m@gWq_sYRc2g-u$@FtOuQ4 z-bqcA4?XnLllR@vUEj@`7xLQU(Z>2IM={!?CBrr>*`-Mch)<5ewSenWv&Oh`udETTZlwQh>Url!nvb1+3uYDq+t zUz*TK!tOOVLo>U^NthIVR7NgOADGwQp42sTbI!C#fkdlzygU32k zoLPO;FNtrq{+ksl#NvcNIUmvqYcpYp2EjoDnlq2H%5QWhQoK=cM4PXjQ7*TNHtZ;S*7zbqi(2Ur|NaLbH23~ zMuK5#wt>YzjJXf)zL748yKnsYo)y;^<%K;cJZkG0<%`Do8({3Lr*Uy10$rj!OBQa% z5m=L!_)Oj5er)`u5P`jr4?LIIV3=Wqy-;>kYEz7Se8>$#0Q3VnT{J0ve(6o`>k8Jt z_Uw$NwsqC>q-`7a%xT!Lrx9Zyi}QY^)UzNi7sFsx%$z`hvQ2d*Y|>&s8-~S@E2Q%w z=*x4*=9YS^4qtYvdlIM%bjGAAp);m`143pu^~G)~ib*+a^8(loUsuHTB0gm2r3fKA zuf^Bo=A{VF{N>En`o<|q@{}!P53#x;PcAAz%!A@(33U7!+mqsc9_gn82b7#1>ywac zfc}o6+l4aCH2zJ0m^tEeAuhogf|?MU29p%nOXNZh;#L-Je1+>yvq$^AfI1g0YcUVN zwa`$+fQ2mvYl6^>Wl)T@-OFHMOZv~EgtrnrYs1)?1I>?nK1`3c=DjWb=ytD^M&3Aj z=4s~yXdOaV68naybcZ45^KfoiEF?_hKt4034S`TJR3J5sLpDCzLogN+972qfAI1sM zb?g=BboxnHSPs&=7-8dy3!XtQI>@5h&J)KfusR?vGsDil!6tsR^AmpY5Txp06*|jl zfysZEbA`3{bqn^6VM}bDI*TtWv3d43FMn*+)9s&~-DF!G;J4EH;#79uvC@|&RA)Y- zleTYZ9XsyjS6|3JoWqpsFHcKq#YX3lq^zCM5E+zco^(#f`?dkPU}JN+krqroG20Xv zuHn)OQZY`kxHt(cQNrFi^*j@|+#hO0Q-EKXp8$^e?FCSE!FB|0UWy5U(u;El;~K(Q zu3sE3{Cr2~K-@3-Ly@!-nS8G@ki`OS z8VJEO2!8tTm7IcuJsxQ28;JQF=Qk%`E@4?9cG8W;9xoU7(-r$-R);CQj}I)LfElp6 zit@zYDYtM2OPD?8{IJdynu$Gz{qB}9Hx(o>>I^s+y_xoBi^9AvTwQxpkq-|lsGcrYa))9(0+IsFYtm@a58GE;YG*sV(5(*<3RBEtw7*~M^6wH z1gqnOL9HP;9Jqi6pNb297Q=CoJ6tUCZ*R|?V^7Hql~_zPU&i-si8!2+c{>c-U_Wsr z<Y9Q9yuc>@O$Bsw;rZx&Slo*5P$fbNIz{ zAa)|7aRqs~IoYE}se%ea6BFXOC{-`3kPxV{+!Ux1c7gajUNy1=l|~3p-Fi}OL~2T4 z{3ZfS@L}n!_eD9vfaJ2Ieg-62XGl`VYfTmR6z1Gl411CZUwt|J&2`fNw2DVtfo8kV?+4aACF~!r9=~eV70A?X-aG z?yglFyA6#P!HxK@Q9l?Rj8!+VDPttOR}9^-=`=`tr#hFVi}-Va zUqSH_hh(zJWpqL}oSZnK%h9i=HM%8~$G)Ny(qicRF7{R{RkRoHnk0+2755RQN(o34 z+zdcH;0ZtxU@DI9t1@aG6pg%({-N%5Vv|MRHJnnWPjg1nN2y!Fc zdSwlD>#x&cWwCdi;-YTFNmiG6%R+*NasDo)5tEQZzYrT9q`db_3}BIfi+vRV)Sm6 zFM21->rwu3=pojyE7EcA7PP-!#l81q_}|g+w+8-4cpS_h6EGXys^3COq*L^Y5=9g6 zu8HHGhsn!P#vIxu!p?(6=cxwquPX<tCSR z@@nrHfp?Dk+dzK`VW5Se1E+-sf)1P(8h}!GDJ|(v#7_F9!Hn_9FU^|p9e9Rh=58miT=R*1VBECJhx+=y^Wb^;Im6rj0UTr z$S}jO%UEaJZ2ZCJ9-lw>Z1efVH`=$zx7xSGcfar10r3OM2eb`1?U&?N=eNu63;$sM z0{^xCyZz6a{7iOJk*Ut~qG`M7SU^F*ezV@Z!F(;SDDZ;CZkcU)*Wwu%G;rg3@yT4p_Fi?@~7mfAXPm!iX? zi=tbiFU5q%6vixy*&K5u=4xzYtSk1#*!N?9z(L^TxM$RWrd&x4PaT)~u3fSh z+THda)5fK_9YGG4V~gXGQ*m~tx1{e%|2iWwW7S>0>oYcI?94cpaWT`JnVDIVxhivC z=C!QQtZaNsvg)!{;rq#myb)_hY#!+t*)r<+(IulR#JGQ%3b6~E1CVGD^knM5Yw7GI zzMl^I2hv9v@nKUI{sw^RXB3Mk)h|JAy+!lOG?g}KeuW(5(fm3JWkR$7`RFNyjnl#n z)W#NQej_DHVVZvcjgTNYFUs}9c)m#U`@{dK<~LD^EaV4}rbBar#7rCEUafJHPD|5sK(C7vtcn@;sK7rNLDB32DTt@Jm5gY1+BNY;F5 z=oMDF53%c!+ic`xg?2?f(#;jWJil7_>L>+!19S1d4lyR7j5=x*zL_)!F{%(}Hp;(W zls_9G(`gK1OcyC;;I{#>lL7xvF4jKzSSb%D(zPOgtEj#GSL8BT)S*#p4bLY<egqidv~5H_9M?TmYDBC0kWVG*qdxUb!}nyZU<=~!rG$N!3JUN!~=^^k(zUV(Z z&;I;yJNNYE<=>Txf^o6_wV7qP13pXNY$W(8h`HD8%6*YVUPo^uoN= zdlgWPyzcaYhzK@Bv4t!oH=uWoi7mvHvD4>=69yAs?_or=K$kiQ^W0#Z4}`*^Kp1o_ z!y#i430p^2vQad}V0?^&%tZopg@@8G$fzZu?J2+qA4eRhTRLi%2|48vSOt%w(a<2u zp?h$>crK`v2aLIZtpf1>IN-049snL61P;ezzpt1k0+%JYMrJZFPzviiWzZ3tN)J;x zO`{5`#CF<5(Nh(JDGkOQ1QYX9n2VGtvrrhrVDww2`*b z_jHx6Vf_9(#>)3-J1{<-)`E);1J4KPefp4&&{6t;&I5ZN(=j?uJHU2L@_I~>1WMuo?DYNk?a6P9`kbcao0jHVT|29( zVdjj=#v1jNqd;{tG&d_<$!}_?=YjcJeG2mIqCRj%ec+1vz)d%bW;+~?2fFCs#L{-g zo}2Oy?6%W%tDD8R+;YrZcSyd~ir1#%2i*EeWu@-)A@0N}71h>Nzbkc1ag}bCKRu?( zEycJxaI`tB!%vT&ApA_}P!fIeC%QVIDLt%R&s^=XY(;UYJ9kBCyIyv+$MdHyh4>@G Z0p^q`UCg`8t*mL+fyY_#j+!w<{{z_tFYy2X literal 0 HcmV?d00001 diff --git a/interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.woff b/interactjs/dist/api/fonts/OpenSans-SemiboldItalic-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..d4dfca402e53e59ec985ff4c6312864da493fa83 GIT binary patch literal 23764 zcmZsB1B@t5u0G9r;*#E)E6@*MoSVZ)f8~oLAe}NB( z4FDo0FQ@d&9RdJ=6aoN1=F&K#35qGH2m%0rh5yFSq-v6a0c0mKEgI+{W1*06-b!H;&)+0C(;k}6TN{C(>2He5rz*Owg>TuWCyUrG{_Bgf)5pB zk4t-N3qjjYf*y*{3RGy1GOUkXop8dr>7Qkv)h4ko)~IXbsjK2qh*=r}BQN&--l+oY zD`6gNm(B;aBZT(}Fw)lx=`Gh!!4C8FDo4*ZhEAXvi(NEG9Yndk()%us@kae-J-Xtr zhKTB@@&8;Xh8yr+nJx{t(c>B#fGGs)AamGr+1tlAqQfz>6AuFHAQVuHeA%q1Ah zGkxVnm{3nNYH>9~7pnv9j+W*AF4^FEV+V}WyG-D8`I2bm&L}38L7tYD`qH7eq^VW= zAl+np$l0O3pJ>XN{6)0N=krOFKL>6q{3KonDH`%a@`d@LLNTG3Ff5o;yKLZ7`4vk7 zJA!5(kryW25!h3mRspK!K{Ueae<*S{Fu2gUFj^3(rdo5F@cPAOLAgdBTImeizQNu7 zLO;#+u#FAirw2f{VfsW`K?dl7)bx?7`_ZEZSS;IN*>*`cH8=M*IvW;QK|{8*A{bFs zs3YBRa8$U;U6rp&*A<%hR8Z|);q8K2G#2T@LSbQWFgcl>PtE3L3i3qwqI_Y$u-`cz z8%|GVe+ePJFkfD)*h-H2mK@91`ficc4r_m-e(X8+hs^0d-T?fY1u-b`q>(zylSPztSJ zv`^2vgjO>-=e&g>8J@1sHsxCht%O#?=wP+8I@|m&1oBo9RLKB!PNa&+NBgF(`;_4( zP^?z(T@h!ua&DSwWDgwLv~gcjlerey0zH&(aaabfsb~7x+(KM7rC%avAnuP%%hz-@ zfotSySr1PIoY*(tblMENOtpr)A%)Xku^yVIY>3u|*K5`WmBrlDh0)x|{e%$>mDE5@ zcFN|$QMr5srACLK-KmUgg(}t~^2-Y8HnYP<*I(7H!n7yaX3?y=ru72Xt^(OgMLhi) z%Z}EDCkE9*U7w1TCmhuhBhG41jIYr%yjgsNFy=~Donclh;X=>6pH`zquGprFRNvzj zw36`BBy~;I9z-A5k3+fGQ0?a59Q8jr%rM+=RA1l0;Q`VhUb32c+(2G}PIAh0c0z)B z%&1mhAF$lu^#@N}-w2YP{_XvPoE`$??E^@nmV8usID7I@7z`F3Dq5r06Fq=18roAo z6V$u`J_tDoXg~|h6ig1xFO*GxJ#3E!7%BeckN7))3L~RC5I_L}CdzLv{VxVn1;a>v zeG`3yoFU7}-d=LJ{0utAe+&%t^z;r54Gd1T^bB>}`ud(Xy?^0hkQV_A!GuQi&A>#! zws)wlEq>m2#Q$e}eSK4ZeGD*BF!)#CLx#XN zYG^qBM#vzbcoHDvJH|zZPcvp?Xwyo4&SB@Mvsj?C!0^E2!0f=pz|6qzz?8r!!A`-5 zeoT=faOfV5?;r525vau;fKn=m>L>vLegQ!Nu<{8+5i}xsw1c0TAG{yFN5B1_{-5q2 z^zZJkkK?{Ea4}qLZ~NW8ZSW3UYtP#IzCdsrxJX>}9lqk*#3z!)BVu4tRF7eZ)k?dB%Fj`#+JAzwVL?_i;# z!=%Ng$Ec~Q%dE|=&#Pgri(+nr5Gd%JUFGk83{Pnr4m&pe^2xyRep z-;hWj#j-}}jAqxDLL;)sjP%$wK$ai?hma|I|2=ztU^@)hK>7<-FfdkxRD7^dKSFE? zKePJWuOF~cxsM;PelvRm6c7N-9(YFg^&Axow*^t;luqKX9*Ov>USiXNQ*#$s$;57^vnpD&yD*}Rgp1^W z9b!0@?;Y_|mPQoMcq6dd_m1ik`|xc?Rre_@keZT&$E?}7lBKk#T~jKNDwFOU;VVig zXP8Ky1hV@JTh++c@z=$>m?aS9u=yk!*@IrmC4eX}LfBJGLlMj8@KeiSO(er~3lqY# zz!X_ApGpS`+VLo_v1i(gn!xn`Ii?V4*Xi0EcQ|m~)`Lq_B3;_>MAz-ry(^USQ;HT7 z{j5@OC}4sq4k?CdMidT6`)-LbmQ{i>njlkAy1)%yU6*V$ho9vy+_@-JFe@!hxrokL z$Hj`_2z!jO%90%wPdA6rtw<|WxeiS=17|SUQ;;yt`5*#1r;F!QfU7Un{rP9Rh=*d9 z7Y9t7xJItx@#jjx4!^&jTy0YOKvdY-y(Dr2Jg9hcn37X_>_Qlt2|g9;bcD5{B$J?vo4mAUF(dRq|AlHtSH{l zi_)nZp~fCN6lRs!zBO(~wbc=CkY@Q-*J=U>PC2rJUtXSDjs_X@Lt}c)`~Bn#?cX;x ze(nSC`(g_1^%iM`0-p_JlXXxfWplKA%Bw_*V)HZ^1{tqqWR`U|X$B#$Y4NF_w6+WF; z`y3N8ONu_Z49q@sGav17Nk}(d+*|AuG%Grq!l^Dno9R5CT9MK&Uxl4TDd&gbE=R^% zO`#0``lAXis3bgMn_UmkNK{m}qvkE&ybSL}t%Czg4jU4toPJi^0Plqn?Pnvx4I z;lo;xO>phUgP=4+2U}rX;4G~M&+;^4-Hq@rWTSNYxg zMSJz?XvYJvGdp6C7O?7+mUyo{GqGQmdwn5qF zVF%(kLhzD=?J_yq0(#5B_MsiZLyr=ylAOTy0y{$BCJNPx!S)e3vI2G!hwV~1LKr$i zAUfItbCZVcLUMrUB?;ZeBvc?}^c)GY`gb>+lFD0_fJL#QW+Yf4J@cZa`sgF9g`p;R z8Xvv~zb8XUeQgse`qhRn;>B#H%lqy3EBZBuFX~YfK4sh$xe_0x^f_(M_2pd~RGI&7 zlz;$$KR*C)zuy&Ikorj?>+HNtHz^fUYsEI6MHZQ<@_%4#*f$;lECYaS0(AK~f)(S1 zsKdg4n?D43RB1RhA)(>Xub>kFc;%Cb zzQU=GSA63Y?OM2C+lZDZ%zQr2^j|j`nKxiZ5e9i}I1a1N&IL@AirbA42 z42#`R5isNn+?K2*xGyz+AWfVel-8ab{8oWrhGF-@b03oY2z8PuQEU}jJvRN70-q>Nv@4xO%x%xMqQ;Plq@Q*v+_;v7JRNplv~3EtxjdbFJqK$YN_2@LoET{@`INQi-s@%<)Ub~gsYi+AUBAP|WXlQcwu$>3{{SLuH z<2s*ve)DR@dFm>T&BdQ>DLa0L+Gp-}`3!N>m~Zkzcx|qeTMzwIRAzftUcAlT_Y&%T zZ?--Vy4xp3p=mSdejkYhKULl-oy$rNHJ@l#|MuM6$U@c~21ttnR`CI=YqH?&FL zj!7a1wS@qtKix|^NV5xsu{l1y9&3x%4dip@4))9!^V)xCS znR~+Ba8thd^FFp&M0Nf$qxYV^+xj!Jpt|j5a(-{Jad=FlmA4(Clf_DBmtTLG{jxME zhSgoB)%_^)cA09%+8Now(-kovEA)1y7DAbiVG$4dBq-%=Dwf>qKu)89H*HkS720!; zV#q0s4?+?21sS}{-Yxw%nJS)s_H4qjZLs%dOY7e>>ccyKoz7G#`I8dAUzy-bRG(TPDO{Ib_d*%4i9=7f2MkA&QG2 zOf7>I;+PyG-}TFd<}k-w5#J!pLL4xS@6Yyj+`&3w2B=L9owHy_F9k${)&wNKgVtvz z_8zu3!)e^9DSFGB`I>mhdnkUQLH!qaRd@v%1MOE;gU{-Kz_B1)0kEfy2r+s_?>#<= z0QM~pw`^|4_>zq8>2U)G4*dpdUq;b=+tU5}6|(6_xuwJ04;L&KDdmH>OGMjh+apA! z6C5OE8~zQ^UOxUYwH^0yFO=2o>F_vL+o)68<^_>+{KGePQ8jgTZwI#TaeqcuXF7i8 z<6ai%1}y50-2?Spu#g6VDTF^DaCMIkiLMf;3{e=*A1ojZgEyI`@1s4wrev9bw2Izqjw9zfn9Xs;ZN?bUBm#G$D&$He56(PYKjF!Dh*wHx4 zA;NNO-DiPJyJ5Tvt;PUFM+uBqQgV!P7j1XCaq|{{3;}nsPrPA;*5u!T-u&HMgPB2g z*B6y`AdNp%Ay2;vJu46zDH-5Z7Xj)RZ+E9$U+~^r+rb3s2`qI6tFXoctiLxoK9{t0 zFL!>e{F*`#*e-0-_ny`?4f9-={}+wo=Bs+l^*ZBcQcRYI+v{O{w!X=JJZfjgj5gzG2Q5y@FYx zoJ-i%M14^0RiRYv4;^dQoy3+4hYJbY^Wv`U=+G^9{K6p?`u4WJg*N0GJkC>p(I0z^=uL19_oc>|y?__QVm1RNzdWVMdT*t8Fe-NQrkRF;ef+)tH~JTMwwd zbN06li8>`mOvcNAoev>oXmGeZ9=+isQgm{c+5{yzjhao57XCp3 zE8{-e<$_L*I|v}-CyugTHu}M45_z5wM4hb)eB%e@)sqId;{=O;&|MTKO z3H}sKmUK5~+6g#f8_tVL(K7b4=5yb4b?rdfo4Lvp)WbwpW=%TnBLK3n9GG)<;x$9?4KkLJEFfFS zH!@qil@lK~;F`?4UEbI)g@}CboA`U_Lz1;L9E{nB#>fz)dtfdw6O$Ux5YT)uo3wwjCboL? za(#CBS6sreD+elzq52-gm9!Xe{96v7wH>r$HHp*uIh$Mbj$@fT91FU;FYV)t=+z+t zYy?WXPtJkBwr{p5JpuC%|GlcCqvT|h2IfrlZNo+(-%6B8{2?K+%dB%BhB!G@7+_0I z&gS|!|B!N9S~@*~N^VRFJ%Sq)Q|;7c@jfig4WjCt9&W4Q?YVso+D5xdVG_}2QS+~B$3jiOk|Mlu8)t%7ec=D%gtw~&CX6c&AWkHY0acmo zN7ey^k;+&-TiX3w0xpUV%iEjX{{Adf)?jT%dZ&MQf&Fcbbte6($Vn3I-&=iaqUhWH zbmo4}OwAk2u$&b%s@nFro~N+{Dggo`e1R zgBO6UTM}$QIRu%2Y`U_b25CnSB8K}netw_{c*kEEK~qjv(Txm zV!d$0!TUt>17pcZan8<@%#!EGbzjz@=bpS2LPlgu*S6OaZJR6>(PTtvNSI`rSaPwIHgd66%DB?i`}>rmcq zB2j%%Q)qf!&y$m&_a*l;jMfDjC8~Dc_q%F(w%#6lJ|!W=I$W&SQEEfqrpF-{@C}#h z%w97wQE@!%7MPb6De!RX26@8y)_G(=M6`-9{rP>n@J9~>3AH;mQTVmIQ4tx>2)V4vJ_WP=1tU^-#dfGgwOeQ<5S=lecSNz1ub^P~J^dU>^(mfYX z&48uQq<{{VJ_H^?O~FlAjo-;BpSiI?8r!|xwIK}8$wp=ayaI6VCN1%@XeTMg=EcAD zn$!q6{U0qcZOPwN*R${{?$sc0qZ^brXqYPa)VOgMW8CODf;75}!ZNy{LI6Gl{MaI_ z+{gw^(02JSm(J}elD5ud2mlIfyXpzFaqyh6{%foIHeA27i-H;9MhGgca@uUD@o4&# zKJbbfB?L^-L!}!T@bauZ3)ak(-q0lUR9)*4@9NF@cV}Rc2R17PVI!NYv33d@KLBMX z*TmK4F~HSLLVuc9AED#(q6Oz7D|y>OU+(P^ zVMbiF(UWdVN0V?Hsn^1X9`h{_B)XHdMr0?Ku)L0h8GC@$H8@XCiwiO5WozsN zv2V!tpzDYx>e%KlNo<>i4bJ`3US9ru2j?4PgDVA(pS)59j(`#E)_^J-G`ydO`5jyL z&-wkTP1H9nk5#o*7%cv%op;%9>&=e)3cOC&Lmchrx$DA6+JgX6anOH7T)2a1gF&K1 zlS{L6Bq0tVu7yM#2(H|)=8k=Vm#~q3ro_B_zB_lJB2c61Z!B-0l^*yEt%vt)hv!gO z*BOq-?VnOu@GsCqTHAfMtbg6dZBqTl%-V<~kF-t!jT)EG?IPXQX$m0C{fRC2ZKc54 zp6Jv`{N4omZ7dv=V{1~?_6n*W*#jr0!O!YIPZ2^1%ZBIunR_uk5H{6vD?pyk)t-DK z_{rxDA;Q!Q5?l+79gRYWsfo-_v;i&mx}qplBzroa*DHP!v}UTbI=xmt!BOK2nuP=x zZnpi-DzsV(F|lzvNJqo#I!Solw3wM5 z@#5`feVjqUItQB~r%G?~9uy)oTkcevr{^^q?d^;JH?Y}dyd4SPMV#uArwfiYgq4`3 zm*)|@0s;wiHGIWouP4m;$kNh<&DU=zh+_@zlZ3emHBf2p`K+wIZZmQj6eXx+ z+UE|x1?rd!`lBQKj4zBX0bDi^vfl;dqba38!&w~M613RaRH@1Ggxi#!z174Xke8(8 zuKx3oZD`j~d#5E^O9aWV3aXfgTe|OrS`cwcY-k=^k>5|8Ijx2Yo&f~D2=L1Q?8<}{ zOIfwtQiu9LfUI5|m$Ph*(xW$F1h5=kh=*&e5%@`)NEOGRn4Ecq(a^5t0T0@Y9)z*@*{9PHk+GD$ z@AKs;z9u_;&tV@dU1k0^;kCV zpBi4G0|PK@?H{r-ok*Cl*ijPVOs}%0%uB0>2?2siGb1mA%7OC+e9wLMY|2;#=Uf5N zO!6XS5}2x!{WjhE1eROghyyzNEMcx&wso|!eMqUA_XXZP{2}Y)LU30T55lU=VzLKZ znRgB&Wr>E5_wrAFEzekNpyR!5;k?$8IrJLebQ-EqB5h!(Na8G7`Dmp=C>Lmi|fHgtn zF#BfR)V3x?XL%0D{dKBC56|J1Cy(2bWC5I0Q4I#k@CMETY*C+dSq?^l1a?J%m7~9i zu&~T3l;7M0XqJo;-~XD*Fn4&hy-mc`i*;3+EGFNtD*P5>)_FZPPv_)f>Xc(VWE)36 zoOY(uxt_Hb!0#VQ+6Fcbv8*i3xZ{dk%vN~;d7Y+u&8T7~7U5$>%zHzkKwzMn$8T2D zQF=nvP-7GLjx2{%33}7{Wfyul!{_WLKKwSrS!yoT8D77~vSep6v^%NoVvZJ&PVCpX zfZbN334N}*@^IyP(_wo8P8q) zos6JvqhkPZKh=W#&3f*+U2-_x#pBQeEE3>5ht~)%6I^}L9cMvFrvqs)F?qH6VAIQN z?a3i!@P}izu&&2$V@>xG~h{}-MPAv zEf_%7hip)h`md;8Vi^u{n+2+X?-S#8GUd{+V@Fpx#*>|*+(5A6vOnQFG%geLTSJ%; zD09cE)xlFn4JE{C&+n0()rmRw=3=NW?WDbxe)NBb8zF4LU1zIt)v}w(Yy3N_f4EO8 zlc^u_T%4aAdm6Bm?Y^{)#$mFU?8egjvc=n9R~tw51)N<8@hs$S95usNM@C!%i6~>O z?F$gP5T4zwJyK};!$cV5OSb&?#%d5>cPv1RSo$gN9>4vpPEt?U6;%-U!|cf9#N^*V zV>RxU(&8@rSzY3@lR^yzU_)|r&b>HC^K+h#mVWm-iGG!~o5(Tths@A2N02K&eM4sLm72cezfbNpu~q=xqyrB@HajZcx} zQ_)~Kbi%}q-%rEuZfbL$qsw`E9j#E){R1}<<0kV&;xS;heRWoHAPcR>U^sf4I3miE zzq$$C+k*b=0L>+F-(fLc94KebZb$$fC@-BjWGnL8dq#QM*4>P2s`5s4fU9MvBh#$Hq1LP&zaTKu#Ql0d`+hgW%VDj!!9C>L zr#XtA5Bf>QbI#W|2g)4<;l8;C8YyB(KwBX!uvk_J>(O%mcWw~zEFV(+Hk7-y)mU8h zd$hB%4@0d+7l9Nd)yxEr;%e(2Lr?M~Mavi}OD(Km);+J72*?Vks;SD=0>@NvbIzctVsZx(){u z;i1l+i)o>Y+{a7)L@`KhWi5WG<-WIjBMN@u|mrQ>pkTI)f2T?bz8%0Bpi5~l6OpPphdsP>A45?J# z`*)|vkyDJBH3eOX+;PY2xo(CESey(~hEiE%y_^eOP^G(p9B$6)`d+A+_J#r{yO|pvEIg``a)N6#V5Y)KKJU53GlE_qfIPO1SuDEu- zE;yxiIljpporeot_-b-_e(LhneDLwS5AGwB+*h@BYQJ`T!5&}5|0ZC3uKbll*k1^+ zo7;mu72;-Ur;GVFP|`XE*ZJ^Q)>psRZqe-yOK3#CFS1r28Oul_S{!->)aMTqE0fr4 z5%E~*>*hKXw|ahpbkokhqW;)}UCl=KabCN^#%Ec-+Q83yab=KAlRal82ex-lTkSD%c?l7NSf$Q`v$8ksm6!?@n<5ffP3mc5q!>-QKn^K9|WA9N- zmyUh2A_fZl`haT{S;~x=n%qu&Ye?24YLkrZAeQPc*=egSwyK#>D;i5pi_#g@ec@dnA=FArkR zZ~=zCl0OsJP~f90&{54|*gDPmY|ZV5R4-vB*Rrc-(Qj@$hVyo+XKX!}R$e<7&R(nQ z7Cs}AwOexp?a7G9OAJq=k0cZ?E8C1Z>u*Y^%K?%!YSS(#I+!s9!0pK3uyhtcl|;1u z^nfkYQtFzIgO#siJH8*P!R5|7jbd!VXQ&TFHd-ssx(+vFa=Uz+s~g@sJXv|8I@v;z z`c+E$xe2wZso;f_II8{g`tLxxke12Z=|k4Y(zcq4~Aqcj3;Bd{=lIHwUvd-*aT<4t@)p=sA z75CGe0JYK5Av5q=niyx#oN*+mt9PT0)i=&Tk7}OK1mGpbZv@O+8XGoCIV2%9TDBxW zdsz_HTU+DE@C4Awtd=G8ZWM7&VGmB&`+3SBbs)OSbpJ8@c>7QtazXepqH3ebjbG(j zX<@$@^kT!*+T<~CM5G3enlsi=ZpM!4Sncwi^62YbJ(468_3%a zCkJl$-RXS5IYv10%YHb#Is0+qO9Q%`u9y-+eVR4Et9fS}PMb?Td8lmF#s zmZgLCUYlQUa*5B&B6Rh6O54Ak#+bGjI6T%=?9sEI=}B@mZ)e$_!iKA7VXCJv-UKxy z7{1&m5%LU~)r~^n5Fu4W^GE<16SL=jJuDxK8`(F^yI8!n9(zTJZGid$73AUQ>_o1= z&g1ZZ4%km;bo({Juh2fC_c(VWWaQWpq0X}l`xu{w3O`R~m)P=zf|61o^TY^EnfxOH zPLk#NTzh-WoW1`za`o#858Me+Qe{!gnlW$12M$P8Wm2q?z&n#tv=Jx%XulI#rRr{< zx=+9L4hl$-%5Lk9Au3WeYkbE$n_ehn`%yZM!0NnfXnmw9#atITU69!+E9GZd|fHv=Ar?B^yOEAx!^+ zhtJ4ruU~fZCrPQJq;{O4X2PoIJ79%Up=O7&t@H!Gt&>7msmTGE za3(x}ZzuPwOFnwvf5>dQc2;e>@ihUEwG%(1?S~0|wMIsrpKv2&CEfXC7&hf*d7jTD zdAoFuIYTf6@8W+JS7Q_x5osutCi!>aff|$MYVu2CEx)q3OP{RpD=WUluF2*C+6#Ff zvz3AAxz8jRG;cTiI1w^6V5WpY1PR1M>!l3%XN4{TfN3$Sz*9dl^5NxVC4R_{5;y2f z553=(yJoZv8bX-6*`s+&zOdJSM^*ibupY!~5Qba=ok2Rs;_IDki{8R1gVfM{<}g zDI0|=8_kMh7X>#EMLWYe0-=;UDf=bY-j< z?(NdP-yd?=gsLu58eI5ASvw0ppI8REvg)o&I;^5^DsF1mh>0Pfy zU2*C4$FArm&{1+!+2~`xLzTos4&}3jvK9k;DRCOIBp`Xj4wt}ZN9scc31o>BM6$*_ z(SQ>DR#usYxdz0?#NIx2z8MTc5|T-WFzkv$=!7Z1%h?+iOgf~t(pU9B2EWSLC)d&r zf=~CE`b{x~vwu6-rk-Z@IMjvCRN|=f_JYztV*^}8+69=)%=PXqcfKNDQHKJmb%2s+~L9EfG_<76lLAxdBv`+b) z8U{X*pxtKBL==4F~#yVx#+uS82`M9jC4&dl-To7i^4t8+?p){no z_VYr;Yw3}hXxsSqN5eL^gL@1{$3DgMu|Y+sg6vfBgSfKmul2>E(S;dr#wGFJ9uMorVGTm151P(`D)rix?{GU@HHz!{xHdx3qGVk`L0gjPsA!GVdtR+GimQ6p z87hwKb8!iZx+tdjXabzeEjpkE-&#n+U9SP*3I`w)R=_OkPedj~Id|sllC@K$TwYAb z!AdtDaui2O>I~cvS;qSpBMp8uax_utj!}rHIEfL=)QGy4h71;1p~Q*uS#lZ>i>_@h zBda1i*Cp$>4&x`Pr$0;Wo1qb&{~3q9;pEBY8IG zb+~VR(+?SBI#cc&IISc0Uf+g8KC;3GC``vY`%^$2{L~|lT6aq{`@QeR_oV-c?HWc@ zrSu^cR^((<^cGT`R3E~$sidapZTWKGgxlF;c^{flcR*>zyts(U`#KLC_pnlNJaSts z@ix)?=wTp!_qUDe&qMJcO?l?jC&%Wv-YzZp^sqLfaG>D>GScw3jRkW#5;+(mxqDDZXWRr~i2^eFf7PP z)60cg=t^<>Qio;X1j26mb@VKX!XSApoEYzc@QN~=FjXk)LZL`V??z=8`t$SCyue~!}9ke zBa&p%R73mwsdd8C-m}4ghkfdKx;&lTN{Wa#kf0GlAv8@38!s58VUjzU_3R~V@fr1o z-Zkrea_MhN2Q*aCg2M`BJX|FI9*7>EBpzY8rp1tBtT~OU+l^y6>H662je+S6 zfN=Xh9(DqfC_!y(r1(Nv;2uGd2OuX$mqH^qw(Kb`?yQiF3xX(wc>n=HSd$gVQ*4!E z2vx;K11waiU6jG74k_g_t$MZh=ElhaUIujgq5}Ir41kri;;IuY?|^wGFIoQyi3Pe< za}MxBQ~~_t)|1U%f=0Z^<464Gi4dfuR@43j-JC8Dy_oNmof2uAdBB_r?gagUa-r@Q z304tLUOH&`FV$HX-!fm+t3m^yn{&-TE<9uk!-9c5X1dqgApc=1$>55#u=oIaq7#TwnQh z&HT(OwNS3p%uE(AuG#BzmL5HM4bd z1EYxF3D}e*)Q|bs3%Z9fSE5$yl{S^te(QBAOHz21&FewYJ@)dR&<2O>gvP5zeWwlN z5*L*T)K!i_yDP~6XNbb1ui#4OFq+InQ|05KNR-ItRLUr1aJ#t+~&9esh*(6vmZ|h(V?UGb`<_Ogx^7f3UR&qw3 z^lH|n9=xBj%Ml17d+=4_2*gV?>gBNJzU1vqFr&K#<&?v2p367$2%rsgQR0M1e-M2V z>ZP5!A<}rUcB0E9ay0!QH7p|rd%|Gjzg{Y}BX+tTYNr836*&3MV{MSWJmWyGx_Wl2 zu$IvFMdw_BE~`mNIDhnGh-z&a`HZ)=P&_C6z*=qfEYmY*d3DxfAR;>wSv+pXd3)6> z?yP+KQ2mE^mO+<4pLc*No%Pt7_}N_xdJ!VI)pjs2s|=w9p>`)_Zh&r#yxVA0hQ-=7uFe3*i05kxIW&BJ=63gicF)EA4uq^j#m?+|R$~mM1L1B%%H5Ma0sd z3@l9o5P?PU=T$xX%wq&o>68YA3x?>@DPfM{|M3r<3n1@b46IdgRW<+znuM)i-oP*| zVB3~_)3;v)@fc39{^M&qFJ`T~W2e>W);_XBC2EjMD#H0Py#KAJr0h+3Y9?>*h~HnA zn%mO%kg{OelG&owlvheD1%sR~brwEkHk3I5LvNrW;h-S+t*W$}tu^^M~`@^ly`PYz#W_93*t)(0NG4|gpyHzmnGW>;fs^ONK zKM$T3%IY&aA-w?nt0zPvD5$H3+UoS-VDJy@vxKwgTH9745=U+ssBWcMzcSqxm}fba z^Hn+gtBB5So+uiCZ-O1XwbtJVV&x#q*+BM+SIjAzy^#@&$1cz3)7)c82hK}}jJu40 z4ClIh?$I+wH6G4#P3CbrFjcPrI>Cl!@Xwu>2jKM*X44I~%l>@3%ej`^{0eNgJk6TJ^6Z z;P2+L`jU%go^KQ@WXvDut?95lcIq2WHHK)a$s{%vcP+Um4{-56%w}KIzHe)j=G!B5 zFC@4ABP&dO$7x>ho&hz;9gUs(*l1WLLkaBj7zxxvZ%>O?yVE1A{!r_~rd=Axc7PlN zyri5U_c*(`!ZH9YHFR7Yyv0$SJ3x#_>h??J@~a#=`YVN^{yAq85D7h6{>sENsOq(x zvDbLZcKdoa24GJAC)gV&w<)IE!m=^Xp~@r^YrxW=zG%p2dTG^9BulXh42V@4TWP zZdgw2W%A2x0Y3Yo86@D@U^G<8dXm=^o1q5B~fEhooy!Hy5Lnw^-TGF}sG z6De2PM6^nqh$hfF(f`(i13e?~>iued{M5)q_jj`Ax>?VKX2v~VDG3#R7 zx5s0C6~!YZ2^3Zb9`IVF4q1vyrQlH>f=Aiy@VMpRuDvg%x5cAdnlt%-jmOD0g!aCf zk>=!7ngAmG)mTOEJ_}ilMibzO_GV0U3MSeBCIfCW`gUzR%6M%6l|+h4diUEgB`n4r zz(x4wCR|RN5Pn7pT5=EpXP8JGYtU&7M1^W0d|Ss2!8!$YyqD_Dg4u^8GI0Z@Eh zpmdC-;8eOYq|@o{2q*ggm(|eB?_h9BK@tBNl$+>GNvwbi$9@hK-V6vvg7|6G)gcgn z4NN8c@pW?~QFdi#v9wUP)RZKz!+R^X8AD`HxOx-c>e~_eTA@_mz>?_oASw`WmCE85 zJl)NL7p4$N*NI5|ZVBLavZsL11qjn8Fc^l>Ye-b;>i=#ikb)7SPj+U{?%h&uxedep z@vX8Cx7QEt-{@=rt$${5fA07Q{?eL+apDrurUYPc(GvVz|3oWY}8tbb*I(P<8`fzOZ)`r~TXO=WI z4`^6e{<{%JU&P^$RL|Nbx2&E%iBs)aJEOK=Z$(~Z3+?d>%IjbydxV!M*&})hOQaSe zdMg&Ww3Gx+K=JJ4@V+G)Me3WI6Qe8=jaW;#I zWsjmrlqz5sxRwwbSETqHzd@+NH#$9yh>{)TGYLX`j%Il{N#yDRt#7a?!V73I0;|{b z_rIx?{x_YLV0X6^XF?n;hSDbMl0_bCh(;5#rz5+}JHHp3H_b^TF=SqtRFp#I6-EEN zWw)G{+QK`{tL`%I$uAJ9@l|GaPvt~a$HWpARh%jmW9nk4Z<<-tF>}w1Tj8wjn44<} z(dEkA_5VYqLKB#k)^Ss{><-Kc;i4p#sX*gcI_|LbPpws^w)xVOWEMx0S^jaic@|tB zy3+oAvpgB;X}%gRfmJVm4Ugt2)VC@(Y|vQR5(>uVi%`;Cn5Mfr-miQ!nPmyZMCCjOjRZMc zEILsfa?=PgF4jiRd^mzMnEFTnglAI40jHE3{gjX{AwDHJ-ksn!In(JK9w{zwBn!@s ztSqEM1ExUqu9WixYA?yk?$!0nMz##T@azV;<=}~n%dc&$eKJkdEN&?pS+lyNuBLi* z@gyNV&AYj%`0=HSn&swpdBr=Q9p8>k&kY~^uQg9ByK!y7srrfc%{e}=Zni=veu?5U zGCGY?d`2h2If~ENGuY{*QH6mj(ug&n6VzqYlVD9|f#xV(pgBtM5;KG2I-aHgL`@lZ zzPj6tjQ;;PBjsoB&g1x-#&vGg3XbhqXlSA@F#gtqn3or4i@~@@Iz9GtBqhejWY{ur zG-gc-&hP|9?_T4*A$q7((Yr4o)Z5o9koV&SPN0Qgg1~SKsM(HgE{n;T;&h0K0sV3- znDdJm%s{>m00LP5{Pg86ZfEaR{x%{ZC^EM`r>(m z*JAR@W7EbgnUX74tUaQ_httngJ~djDhozAtzn2^L_FrDRw(j}UxcKnEnY9g5O5{ry zT@K=Ow4oJO)}%+a{nZXUWqnP`KABB`{n}0%5PIXy)TDTJ@TYvAK`Qmauu4>>B;Xh`C+rrBQ;Csa7!ZOD-ip=~6(Q}8mXd((xCUCKgG!qK}fdEkp8aG1ph4BDCV%e*=~+@O2#iCy`p+aSNTlN~6mNT7;GL>m%4{ zyYjlDs5fFCo_h1tav<&(@j6d0!OHrPt$Gg7@KBmC_NjjSo*yF2+OtJkN2~H=Kd` zVxuAg=5Q>M1fX{!Mi5$ZSipJyyA$X~s+&IwyeoyiTUn_9OGaw2+iJdAr_yqwsBp{5 zZbAprYl8Vb3cW}0S)fwjNtzA6%_v`AIzYO^0M>+n{R#Teu{5dIt7o!<;ILDeB%BncY}AhX2CO$_a@ZX>IM7c<_pGxcm2+m{TRm5OfB1hkqV}EN zPrB=aB`>@#ACy1J;O5R9w0w5;uC{Sw*N&Z7z3#QiWYzS&NeRFEcz~s*rs?k|KElIa zf46$t)63rcaKP*b9ld_%PUe~(`g#3*_haXk*$swQpO|@f&pwK6QqIqEx}2ZYqi|eG z@2q1-XY3|+T29IF)uBgcG!QhIOw7~8coKhscZ+t|3$ecFFo|P#iPFM8`dvIEoI1t^ z4gx&~kVJCO=15PZm3MC*HhTH=9gja~yPonGe<63?titGrR;Et=kXi~7$A8ZKByM4S zL3Uq!NH-s1{d&|l;?R&l7f?v`pVZsmgAU~6etM+7e(A&0>K;;;t0zOr4X9y1lcTpYh70{=Y z07)0jH{WJ3y{ZM2-w45f-yr?g22`#*S;RIq?Myf7bxMC<1dgEnrAa*qZR&TJJel!? z%8rL{<>^BUa}!fCO{@Bz>QPcKATBl2x+?StbSX^yM`@>iX{PXu-T%8>ul zXD7IAWaWSN9VKpVup6H^c1#&3E%>j;NpXR33%K`4FLr-kyw8TQaIJodBWV zTJm3fKM%Qa;sigiVL?SoU2lxmeU=^7s2)Z@T0sWALRDix$i0dM733zfD>i8&{FO zZOxaKc}8BO^zuL)aX~nXTxguHDj6fK6WC_}-@u4PfzQ`qtY*Esl`8s08mwxO9z(I( za|^Y`Vi`na5n>@mNr~~a@QjwvnUuTp*s+QWyTX(vckqDNU%^}6NtVOw$@aouCdBR! z?}54X^WV$E%kAk#%jIDBfu`y}=x z$=xUNYd_!J)VzTg50T5Hbm`Kzy~H+8t{~^zz9W%s8F>4mw#$_6G(;N3j|$$4p!ZvI z=0h9pMms<1#_RM4eE$U5B51?}#rHR)pu5<97)EGU*w2apnM@!}W~}0QU>L{BRc!1{ zsq>qa%HtkZ!6Gr62@z=ErE))?2D1zL)ao#$yhZE3zD&8{tXIelXDSuzO#HQhz6@Z2 zN|035H(v#Kn-O4rV+qdak>0&qYI0JnEhakBV$^HYl7JIP0y{E5e!4_;q00zH7l?w> zJLn=%5=fzRQFVT^QhD6P7O28EUsfnd{spQ7D7lsDk6T`Cc=OYhz9@p}#bP&O!VZZz ziifmEOhA3nKy(+5Rag|6U?e=3Xd(u_Cuq8`4A6RP_3Q(Emk<1$?MDwnxiY;-7>5jo z;A@?l&?Sbe2wP-W7_CvEtJD}tD1*HU1QGiI=*y5^|KALUs7sFwg5FRa3gK7B0kcyv zDjJ;c8#thUKc!G1E!CAmOQ}L`h3t#_nr?q9q}|)~jz~w~S^6yn7{b!fFUnyTNUrGK ztX*N zX`g_FLA8b8ZTvrk?6MO80C?JCU}RumV3eG7=zag|cz&C&4DuWdAaM4o#6cMSkLjNX z`!4ok24)5h1}2aw0HMSU_juZ4U}Rw6NcuYyNHY9m`p3e)iy?(UlmQvM2LOUT1~mWx z0C?JMlRs!vQ543%ckg*Op@V~DlTwP54kcs=9UQXA<4q!QaS#bof<&=|5+oD}89Ibg zI!I{=MMO%65~OsJ8l+Ifp@>K+MFIwg(xFg_1P76j>vvyT4W+}6@4oZyxqr@gt~x~! z2OtSRIg%LF4{+#DAT0%COdX5<9Bz9@I8;^KRaN^~rm)L@&((Fis^*bW-N*SY^b;!^NBYTs_S`t)mW4>kc4o@D>9-e!=V!Up=6L|OWKH=lxGvM># z%j28Ew~p@uzZ?G%0XBg-0^bCE1YZdm2;~SJ6Z$7CB0Nv{lZb)H5m5)xS)$LxT*PLH zoe&ohcM@+AUn9XHAtg~Hu>%O7NQOwRkYbVYk;;?0B`qaAOGZh?OD0FALsm)FMz%S8@V{STk<^eYVr~Cb@JQfA1Ej&L@8WQR8tI5Y*E~%_)bYi$wz6L(mQ1tWiRC_ zoel)tFRsko?2Q8}gZLsd;ROtnXKm+Cz=H?<Z&$)I^h zD^BZ>_BI_J9S@xrokO}3x;DBAx^22U^rZAo=zY?c(f80lX24|NWw62Em!XH@1|tz8 z7o!zM?~GZDx0y^c*<hs?g2OPJdLVTgI2 zc^42~v2e1OV6n{7$a0$1B z00A@snE(U;0eIS-Q_C&{Q4l>n?HP|?Az~rDu&^+#^+Y0eUh#;qAZ%=UdfFIfjPx|Z z2lxcB78^g{8%V4ye2zG`x(34#k(;`GZrxLL>(v1I@eCVQODBMsl41*^Jf%2;Zd@t0 zv5OnUE%5QGxD`W|r??HSwXC=ux7MlR4vb}n6?b7eGpD#4yO|5cJ;X1Hd$DEviu*8N zUn=g$h<&a20fY9v;zxM)6BbZHk&;j@5TO8v67U=lg{a~f=giHp_NjGnNAcldl9E+4 ziE(O|$gYxCrXL6M#4)YS9*F-cj^JX0x`@cZCiO?C35rl5BTr75@2|-FWokmqk`anU zfqP7Lmhu-bPJAr`q$ZBA&iT!YHs)RwZ;8a3_Ov9gg`zQWq~`-xBo=N#;;MJ4#;m^Ay?IB? zR3y~SV1nyRmdpD_>ric7K@~FpYnL$BW63I#J`~AKd*X`E3ahgw*+h~_n*YhCJQDIu zrDo|TATK>N+L(F%+H0RLct6Jd;mehni@Ys2_^eU0#yObBBG%dYMfrc+rgQlF6z=dg z&xtT`B|3$kXbp2!vURwoV% zxx3>||Npk@hPSN6-JQW!fw7H_0>cTefspV9!Crvi8uS4OZox_58Hb0#D|Gb78<$)@ zxnFXZ`yEm6yE&X*y!X#1T&di6oIs3aO-#P6nA|kxdS{Q)NBBuIzc|1#?sA*s%wje>sOCO3+~FRNdB8&+ z@iBb8XFTC4C-CuuoxJ2ZFYxo3uWVut0p>D~TI$$GJ@aWGNFyN@u#iQ3Vlhi-Vkyg6 z#zpqCk`=6CHDCC~C0=ooQ(WdX?|36|5-$moC`pnmDUvE_k}esNDOr-uY0hw-3*6)^ z=eWfNj!F*KxXu;Hl|0F3s}x9~6iKm^NU70R+tlFKOrg4f#bT+9=(H$R?b4N2rCnLk zq8@HkYD!&cRoawxWtq~UELZ-U=ZvVSxtbQ|4fsOAn(C@Xf8 + + + + + Global - Documentation + + + + + + + + + + + +