25 lines
85 KiB
JavaScript
25 lines
85 KiB
JavaScript
"use strict";
|
|
/*
|
|
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
* This devtool is neither made for production nor for readable output files.
|
|
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
* or disable the default devtool with "devtool: false".
|
|
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
*/
|
|
exports.id = "vendor-chunks/lenis";
|
|
exports.ids = ["vendor-chunks/lenis"];
|
|
exports.modules = {
|
|
|
|
/***/ "(ssr)/./node_modules/lenis/dist/lenis.mjs":
|
|
/*!*******************************************!*\
|
|
!*** ./node_modules/lenis/dist/lenis.mjs ***!
|
|
\*******************************************/
|
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
|
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Lenis)\n/* harmony export */ });\n// package.json\nvar version = \"1.3.11\";\n\n// packages/core/src/maths.ts\nfunction clamp(min, input, max) {\n return Math.max(min, Math.min(input, max));\n}\nfunction lerp(x, y, t) {\n return (1 - t) * x + t * y;\n}\nfunction damp(x, y, lambda, deltaTime) {\n return lerp(x, y, 1 - Math.exp(-lambda * deltaTime));\n}\nfunction modulo(n, d) {\n return (n % d + d) % d;\n}\n\n// packages/core/src/animate.ts\nvar Animate = class {\n isRunning = false;\n value = 0;\n from = 0;\n to = 0;\n currentTime = 0;\n // These are instanciated in the fromTo method\n lerp;\n duration;\n easing;\n onUpdate;\n /**\n * Advance the animation by the given delta time\n *\n * @param deltaTime - The time in seconds to advance the animation\n */\n advance(deltaTime) {\n if (!this.isRunning) return;\n let completed = false;\n if (this.duration && this.easing) {\n this.currentTime += deltaTime;\n const linearProgress = clamp(0, this.currentTime / this.duration, 1);\n completed = linearProgress >= 1;\n const easedProgress = completed ? 1 : this.easing(linearProgress);\n this.value = this.from + (this.to - this.from) * easedProgress;\n } else if (this.lerp) {\n this.value = damp(this.value, this.to, this.lerp * 60, deltaTime);\n if (Math.round(this.value) === this.to) {\n this.value = this.to;\n completed = true;\n }\n } else {\n this.value = this.to;\n completed = true;\n }\n if (completed) {\n this.stop();\n }\n this.onUpdate?.(this.value, completed);\n }\n /** Stop the animation */\n stop() {\n this.isRunning = false;\n }\n /**\n * Set up the animation from a starting value to an ending value\n * with optional parameters for lerping, duration, easing, and onUpdate callback\n *\n * @param from - The starting value\n * @param to - The ending value\n * @param options - Options for the animation\n */\n fromTo(from, to, { lerp: lerp2, duration, easing, onStart, onUpdate }) {\n this.from = this.value = from;\n this.to = to;\n this.lerp = lerp2;\n this.duration = duration;\n this.easing = easing;\n this.currentTime = 0;\n this.isRunning = true;\n onStart?.();\n this.onUpdate = onUpdate;\n }\n};\n\n// packages/core/src/debounce.ts\nfunction debounce(callback, delay) {\n let timer;\n return function(...args) {\n let context = this;\n clearTimeout(timer);\n timer = setTimeout(() => {\n timer = void 0;\n callback.apply(context, args);\n }, delay);\n };\n}\n\n// packages/core/src/dimensions.ts\nvar Dimensions = class {\n constructor(wrapper, content, { autoResize = true, debounce: debounceValue = 250 } = {}) {\n this.wrapper = wrapper;\n this.content = content;\n if (autoResize) {\n this.debouncedResize = debounce(this.resize, debounceValue);\n if (this.wrapper instanceof Window) {\n window.addEventListener(\"resize\", this.debouncedResize, false);\n } else {\n this.wrapperResizeObserver = new ResizeObserver(this.debouncedResize);\n this.wrapperResizeObserver.observe(this.wrapper);\n }\n this.contentResizeObserver = new ResizeObserver(this.debouncedResize);\n this.contentResizeObserver.observe(this.content);\n }\n this.resize();\n }\n width = 0;\n height = 0;\n scrollHeight = 0;\n scrollWidth = 0;\n // These are instanciated in the constructor as they need information from the options\n debouncedResize;\n wrapperResizeObserver;\n contentResizeObserver;\n destroy() {\n this.wrapperResizeObserver?.disconnect();\n this.contentResizeObserver?.disconnect();\n if (this.wrapper === window && this.debouncedResize) {\n window.removeEventListener(\"resize\", this.debouncedResize, false);\n }\n }\n resize = () => {\n this.onWrapperResize();\n this.onContentResize();\n };\n onWrapperResize = () => {\n if (this.wrapper instanceof Window) {\n this.width = window.innerWidth;\n this.height = window.innerHeight;\n } else {\n this.width = this.wrapper.clientWidth;\n this.height = this.wrapper.clientHeight;\n }\n };\n onContentResize = () => {\n if (this.wrapper instanceof Window) {\n this.scrollHeight = this.content.scrollHeight;\n this.scrollWidth = this.content.scrollWidth;\n } else {\n this.scrollHeight = this.wrapper.scrollHeight;\n this.scrollWidth = this.wrapper.scrollWidth;\n }\n };\n get limit() {\n return {\n x: this.scrollWidth - this.width,\n y: this.scrollHeight - this.height\n };\n }\n};\n\n// packages/core/src/emitter.ts\nvar Emitter = class {\n events = {};\n /**\n * Emit an event with the given data\n * @param event Event name\n * @param args Data to pass to the event handlers\n */\n emit(event, ...args) {\n let callbacks = this.events[event] || [];\n for (let i = 0, length = callbacks.length; i < length; i++) {\n callbacks[i]?.(...args);\n }\n }\n /**\n * Add a callback to the event\n * @param event Event name\n * @param cb Callback function\n * @returns Unsubscribe function\n */\n on(event, cb) {\n this.events[event]?.push(cb) || (this.events[event] = [cb]);\n return () => {\n this.events[event] = this.events[event]?.filter((i) => cb !== i);\n };\n }\n /**\n * Remove a callback from the event\n * @param event Event name\n * @param callback Callback function\n */\n off(event, callback) {\n this.events[event] = this.events[event]?.filter((i) => callback !== i);\n }\n /**\n * Remove all event listeners and clean up\n */\n destroy() {\n this.events = {};\n }\n};\n\n// packages/core/src/virtual-scroll.ts\nvar LINE_HEIGHT = 100 / 6;\nvar listenerOptions = { passive: false };\nvar VirtualScroll = class {\n constructor(element, options = { wheelMultiplier: 1, touchMultiplier: 1 }) {\n this.element = element;\n this.options = options;\n window.addEventListener(\"resize\", this.onWindowResize, false);\n this.onWindowResize();\n this.element.addEventListener(\"wheel\", this.onWheel, listenerOptions);\n this.element.addEventListener(\n \"touchstart\",\n this.onTouchStart,\n listenerOptions\n );\n this.element.addEventListener(\n \"touchmove\",\n this.onTouchMove,\n listenerOptions\n );\n this.element.addEventListener(\"touchend\", this.onTouchEnd, listenerOptions);\n }\n touchStart = {\n x: 0,\n y: 0\n };\n lastDelta = {\n x: 0,\n y: 0\n };\n window = {\n width: 0,\n height: 0\n };\n emitter = new Emitter();\n /**\n * Add an event listener for the given event and callback\n *\n * @param event Event name\n * @param callback Callback function\n */\n on(event, callback) {\n return this.emitter.on(event, callback);\n }\n /** Remove all event listeners and clean up */\n destroy() {\n this.emitter.destroy();\n window.removeEventListener(\"resize\", this.onWindowResize, false);\n this.element.removeEventListener(\"wheel\", this.onWheel, listenerOptions);\n this.element.removeEventListener(\n \"touchstart\",\n this.onTouchStart,\n listenerOptions\n );\n this.element.removeEventListener(\n \"touchmove\",\n this.onTouchMove,\n listenerOptions\n );\n this.element.removeEventListener(\n \"touchend\",\n this.onTouchEnd,\n listenerOptions\n );\n }\n /**\n * Event handler for 'touchstart' event\n *\n * @param event Touch event\n */\n onTouchStart = (event) => {\n const { clientX, clientY } = event.targetTouches ? event.targetTouches[0] : event;\n this.touchStart.x = clientX;\n this.touchStart.y = clientY;\n this.lastDelta = {\n x: 0,\n y: 0\n };\n this.emitter.emit(\"scroll\", {\n deltaX: 0,\n deltaY: 0,\n event\n });\n };\n /** Event handler for 'touchmove' event */\n onTouchMove = (event) => {\n const { clientX, clientY } = event.targetTouches ? event.targetTouches[0] : event;\n const deltaX = -(clientX - this.touchStart.x) * this.options.touchMultiplier;\n const deltaY = -(clientY - this.touchStart.y) * this.options.touchMultiplier;\n this.touchStart.x = clientX;\n this.touchStart.y = clientY;\n this.lastDelta = {\n x: deltaX,\n y: deltaY\n };\n this.emitter.emit(\"scroll\", {\n deltaX,\n deltaY,\n event\n });\n };\n onTouchEnd = (event) => {\n this.emitter.emit(\"scroll\", {\n deltaX: this.lastDelta.x,\n deltaY: this.lastDelta.y,\n event\n });\n };\n /** Event handler for 'wheel' event */\n onWheel = (event) => {\n let { deltaX, deltaY, deltaMode } = event;\n const multiplierX = deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.window.width : 1;\n const multiplierY = deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.window.height : 1;\n deltaX *= multiplierX;\n deltaY *= multiplierY;\n deltaX *= this.options.wheelMultiplier;\n deltaY *= this.options.wheelMultiplier;\n this.emitter.emit(\"scroll\", { deltaX, deltaY, event });\n };\n onWindowResize = () => {\n this.window = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n };\n};\n\n// packages/core/src/lenis.ts\nvar defaultEasing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t));\nvar Lenis = class {\n _isScrolling = false;\n // true when scroll is animating\n _isStopped = false;\n // true if user should not be able to scroll - enable/disable programmatically\n _isLocked = false;\n // same as isStopped but enabled/disabled when scroll reaches target\n _preventNextNativeScrollEvent = false;\n _resetVelocityTimeout = null;\n __rafID = null;\n /**\n * Whether or not the user is touching the screen\n */\n isTouching;\n /**\n * The time in ms since the lenis instance was created\n */\n time = 0;\n /**\n * User data that will be forwarded through the scroll event\n *\n * @example\n * lenis.scrollTo(100, {\n * userData: {\n * foo: 'bar'\n * }\n * })\n */\n userData = {};\n /**\n * The last velocity of the scroll\n */\n lastVelocity = 0;\n /**\n * The current velocity of the scroll\n */\n velocity = 0;\n /**\n * The direction of the scroll\n */\n direction = 0;\n /**\n * The options passed to the lenis instance\n */\n options;\n /**\n * The target scroll value\n */\n targetScroll;\n /**\n * The animated scroll value\n */\n animatedScroll;\n // These are instanciated here as they don't need information from the options\n animate = new Animate();\n emitter = new Emitter();\n // These are instanciated in the constructor as they need information from the options\n dimensions;\n // This is not private because it's used in the Snap class\n virtualScroll;\n constructor({\n wrapper = window,\n content = document.documentElement,\n eventsTarget = wrapper,\n smoothWheel = true,\n syncTouch = false,\n syncTouchLerp = 0.075,\n touchInertiaExponent = 1.7,\n duration,\n // in seconds\n easing,\n lerp: lerp2 = 0.1,\n infinite = false,\n orientation = \"vertical\",\n // vertical, horizontal\n gestureOrientation = orientation === \"horizontal\" ? \"both\" : \"vertical\",\n // vertical, horizontal, both\n touchMultiplier = 1,\n wheelMultiplier = 1,\n autoResize = true,\n prevent,\n virtualScroll,\n overscroll = true,\n autoRaf = false,\n anchors = false,\n autoToggle = false,\n // https://caniuse.com/?search=transition-behavior\n allowNestedScroll = false,\n __experimental__naiveDimensions = false\n } = {}) {\n window.lenisVersion = version;\n if (!wrapper || wrapper === document.documentElement) {\n wrapper = window;\n }\n if (typeof duration === \"number\" && typeof easing !== \"function\") {\n easing = defaultEasing;\n } else if (typeof easing === \"function\" && typeof duration !== \"number\") {\n duration = 1;\n }\n this.options = {\n wrapper,\n content,\n eventsTarget,\n smoothWheel,\n syncTouch,\n syncTouchLerp,\n touchInertiaExponent,\n duration,\n easing,\n lerp: lerp2,\n infinite,\n gestureOrientation,\n orientation,\n touchMultiplier,\n wheelMultiplier,\n autoResize,\n prevent,\n virtualScroll,\n overscroll,\n autoRaf,\n anchors,\n autoToggle,\n allowNestedScroll,\n __experimental__naiveDimensions\n };\n this.dimensions = new Dimensions(wrapper, content, { autoResize });\n this.updateClassName();\n this.targetScroll = this.animatedScroll = this.actualScroll;\n this.options.wrapper.addEventListener(\"scroll\", this.onNativeScroll, false);\n this.options.wrapper.addEventListener(\"scrollend\", this.onScrollEnd, {\n capture: true\n });\n if (this.options.anchors && this.options.wrapper === window) {\n this.options.wrapper.addEventListener(\n \"click\",\n this.onClick,\n false\n );\n }\n this.options.wrapper.addEventListener(\n \"pointerdown\",\n this.onPointerDown,\n false\n );\n this.virtualScroll = new VirtualScroll(eventsTarget, {\n touchMultiplier,\n wheelMultiplier\n });\n this.virtualScroll.on(\"scroll\", this.onVirtualScroll);\n if (this.options.autoToggle) {\n this.rootElement.addEventListener(\"transitionend\", this.onTransitionEnd, {\n passive: true\n });\n }\n if (this.options.autoRaf) {\n this.__rafID = requestAnimationFrame(this.raf);\n }\n }\n /**\n * Destroy the lenis instance, remove all event listeners and clean up the class name\n */\n destroy() {\n this.emitter.destroy();\n this.options.wrapper.removeEventListener(\n \"scroll\",\n this.onNativeScroll,\n false\n );\n this.options.wrapper.removeEventListener(\"scrollend\", this.onScrollEnd, {\n capture: true\n });\n this.options.wrapper.removeEventListener(\n \"pointerdown\",\n this.onPointerDown,\n false\n );\n if (this.options.anchors && this.options.wrapper === window) {\n this.options.wrapper.removeEventListener(\n \"click\",\n this.onClick,\n false\n );\n }\n this.virtualScroll.destroy();\n this.dimensions.destroy();\n this.cleanUpClassName();\n if (this.__rafID) {\n cancelAnimationFrame(this.__rafID);\n }\n }\n on(event, callback) {\n return this.emitter.on(event, callback);\n }\n off(event, callback) {\n return this.emitter.off(event, callback);\n }\n onScrollEnd = (e) => {\n if (!(e instanceof CustomEvent)) {\n if (this.isScrolling === \"smooth\" || this.isScrolling === false) {\n e.stopPropagation();\n }\n }\n };\n dispatchScrollendEvent = () => {\n this.options.wrapper.dispatchEvent(\n new CustomEvent(\"scrollend\", {\n bubbles: this.options.wrapper === window,\n // cancelable: false,\n detail: {\n lenisScrollEnd: true\n }\n })\n );\n };\n onTransitionEnd = (event) => {\n if (event.propertyName.includes(\"overflow\")) {\n const property = this.isHorizontal ? \"overflow-x\" : \"overflow-y\";\n const overflow = getComputedStyle(this.rootElement)[property];\n if ([\"hidden\", \"clip\"].includes(overflow)) {\n this.internalStop();\n } else {\n this.internalStart();\n }\n }\n };\n setScroll(scroll) {\n if (this.isHorizontal) {\n this.options.wrapper.scrollTo({ left: scroll, behavior: \"instant\" });\n } else {\n this.options.wrapper.scrollTo({ top: scroll, behavior: \"instant\" });\n }\n }\n onClick = (event) => {\n const path = event.composedPath();\n const anchor = path.find(\n (node) => node instanceof HTMLAnchorElement && (node.getAttribute(\"href\")?.startsWith(\"#\") || node.getAttribute(\"href\")?.startsWith(\"/#\") || node.getAttribute(\"href\")?.startsWith(\"./#\"))\n );\n if (anchor) {\n const id = anchor.getAttribute(\"href\");\n if (id) {\n const options = typeof this.options.anchors === \"object\" && this.options.anchors ? this.options.anchors : void 0;\n let target = `#${id.split(\"#\")[1]}`;\n if ([\"#\", \"/#\", \"./#\", \"#top\", \"/#top\", \"./#top\"].includes(id)) {\n target = 0;\n }\n this.scrollTo(target, options);\n }\n }\n };\n onPointerDown = (event) => {\n if (event.button === 1) {\n this.reset();\n }\n };\n onVirtualScroll = (data) => {\n if (typeof this.options.virtualScroll === \"function\" && this.options.virtualScroll(data) === false)\n return;\n const { deltaX, deltaY, event } = data;\n this.emitter.emit(\"virtual-scroll\", { deltaX, deltaY, event });\n if (event.ctrlKey) return;\n if (event.lenisStopPropagation) return;\n const isTouch = event.type.includes(\"touch\");\n const isWheel = event.type.includes(\"wheel\");\n this.isTouching = event.type === \"touchstart\" || event.type === \"touchmove\";\n const isClickOrTap = deltaX === 0 && deltaY === 0;\n const isTapToStop = this.options.syncTouch && isTouch && event.type === \"touchstart\" && isClickOrTap && !this.isStopped && !this.isLocked;\n if (isTapToStop) {\n this.reset();\n return;\n }\n const isUnknownGesture = this.options.gestureOrientation === \"vertical\" && deltaY === 0 || this.options.gestureOrientation === \"horizontal\" && deltaX === 0;\n if (isClickOrTap || isUnknownGesture) {\n return;\n }\n let composedPath = event.composedPath();\n composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement));\n const prevent = this.options.prevent;\n if (!!composedPath.find(\n (node) => node instanceof HTMLElement && (typeof prevent === \"function\" && prevent?.(node) || node.hasAttribute?.(\"data-lenis-prevent\") || isTouch && node.hasAttribute?.(\"data-lenis-prevent-touch\") || isWheel && node.hasAttribute?.(\"data-lenis-prevent-wheel\") || this.options.allowNestedScroll && this.checkNestedScroll(node, { deltaX, deltaY }))\n ))\n return;\n if (this.isStopped || this.isLocked) {\n if (event.cancelable) {\n event.preventDefault();\n }\n return;\n }\n const isSmooth = this.options.syncTouch && isTouch || this.options.smoothWheel && isWheel;\n if (!isSmooth) {\n this.isScrolling = \"native\";\n this.animate.stop();\n event.lenisStopPropagation = true;\n return;\n }\n let delta = deltaY;\n if (this.options.gestureOrientation === \"both\") {\n delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX;\n } else if (this.options.gestureOrientation === \"horizontal\") {\n delta = deltaX;\n }\n if (!this.options.overscroll || this.options.infinite || this.options.wrapper !== window && this.limit > 0 && (this.animatedScroll > 0 && this.animatedScroll < this.limit || this.animatedScroll === 0 && deltaY > 0 || this.animatedScroll === this.limit && deltaY < 0)) {\n event.lenisStopPropagation = true;\n }\n if (event.cancelable) {\n event.preventDefault();\n }\n const isSyncTouch = isTouch && this.options.syncTouch;\n const isTouchEnd = isTouch && event.type === \"touchend\";\n const hasTouchInertia = isTouchEnd;\n if (hasTouchInertia) {\n delta = Math.sign(this.velocity) * Math.pow(Math.abs(this.velocity), this.options.touchInertiaExponent);\n }\n this.scrollTo(this.targetScroll + delta, {\n programmatic: false,\n ...isSyncTouch ? {\n lerp: hasTouchInertia ? this.options.syncTouchLerp : 1\n // immediate: !hasTouchInertia,\n } : {\n lerp: this.options.lerp,\n duration: this.options.duration,\n easing: this.options.easing\n }\n });\n };\n /**\n * Force lenis to recalculate the dimensions\n */\n resize() {\n this.dimensions.resize();\n this.animatedScroll = this.targetScroll = this.actualScroll;\n this.emit();\n }\n emit() {\n this.emitter.emit(\"scroll\", this);\n }\n onNativeScroll = () => {\n if (this._resetVelocityTimeout !== null) {\n clearTimeout(this._resetVelocityTimeout);\n this._resetVelocityTimeout = null;\n }\n if (this._preventNextNativeScrollEvent) {\n this._preventNextNativeScrollEvent = false;\n return;\n }\n if (this.isScrolling === false || this.isScrolling === \"native\") {\n const lastScroll = this.animatedScroll;\n this.animatedScroll = this.targetScroll = this.actualScroll;\n this.lastVelocity = this.velocity;\n this.velocity = this.animatedScroll - lastScroll;\n this.direction = Math.sign(\n this.animatedScroll - lastScroll\n );\n if (!this.isStopped) {\n this.isScrolling = \"native\";\n }\n this.emit();\n if (this.velocity !== 0) {\n this._resetVelocityTimeout = setTimeout(() => {\n this.lastVelocity = this.velocity;\n this.velocity = 0;\n this.isScrolling = false;\n this.emit();\n }, 400);\n }\n }\n };\n reset() {\n this.isLocked = false;\n this.isScrolling = false;\n this.animatedScroll = this.targetScroll = this.actualScroll;\n this.lastVelocity = this.velocity = 0;\n this.animate.stop();\n }\n /**\n * Start lenis scroll after it has been stopped\n */\n start() {\n if (!this.isStopped) return;\n if (this.options.autoToggle) {\n this.rootElement.style.removeProperty(\"overflow\");\n return;\n }\n this.internalStart();\n }\n internalStart() {\n if (!this.isStopped) return;\n this.reset();\n this.isStopped = false;\n this.emit();\n }\n /**\n * Stop lenis scroll\n */\n stop() {\n if (this.isStopped) return;\n if (this.options.autoToggle) {\n this.rootElement.style.setProperty(\"overflow\", \"clip\");\n return;\n }\n this.internalStop();\n }\n internalStop() {\n if (this.isStopped) return;\n this.reset();\n this.isStopped = true;\n this.emit();\n }\n /**\n * RequestAnimationFrame for lenis\n *\n * @param time The time in ms from an external clock like `requestAnimationFrame` or Tempus\n */\n raf = (time) => {\n const deltaTime = time - (this.time || time);\n this.time = time;\n this.animate.advance(deltaTime * 1e-3);\n if (this.options.autoRaf) {\n this.__rafID = requestAnimationFrame(this.raf);\n }\n };\n /**\n * Scroll to a target value\n *\n * @param target The target value to scroll to\n * @param options The options for the scroll\n *\n * @example\n * lenis.scrollTo(100, {\n * offset: 100,\n * duration: 1,\n * easing: (t) => 1 - Math.cos((t * Math.PI) / 2),\n * lerp: 0.1,\n * onStart: () => {\n * console.log('onStart')\n * },\n * onComplete: () => {\n * console.log('onComplete')\n * },\n * })\n */\n scrollTo(target, {\n offset = 0,\n immediate = false,\n lock = false,\n duration = this.options.duration,\n easing = this.options.easing,\n lerp: lerp2 = this.options.lerp,\n onStart,\n onComplete,\n force = false,\n // scroll even if stopped\n programmatic = true,\n // called from outside of the class\n userData\n } = {}) {\n if ((this.isStopped || this.isLocked) && !force) return;\n if (typeof target === \"string\" && [\"top\", \"left\", \"start\"].includes(target)) {\n target = 0;\n } else if (typeof target === \"string\" && [\"bottom\", \"right\", \"end\"].includes(target)) {\n target = this.limit;\n } else {\n let node;\n if (typeof target === \"string\") {\n node = document.querySelector(target);\n } else if (target instanceof HTMLElement && target?.nodeType) {\n node = target;\n }\n if (node) {\n if (this.options.wrapper !== window) {\n const wrapperRect = this.rootElement.getBoundingClientRect();\n offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top;\n }\n const rect = node.getBoundingClientRect();\n target = (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll;\n }\n }\n if (typeof target !== \"number\") return;\n target += offset;\n target = Math.round(target);\n if (this.options.infinite) {\n if (programmatic) {\n this.targetScroll = this.animatedScroll = this.scroll;\n const distance = target - this.animatedScroll;\n if (distance > this.limit / 2) {\n target = target - this.limit;\n } else if (distance < -this.limit / 2) {\n target = target + this.limit;\n }\n }\n } else {\n target = clamp(0, target, this.limit);\n }\n if (target === this.targetScroll) {\n onStart?.(this);\n onComplete?.(this);\n return;\n }\n this.userData = userData ?? {};\n if (immediate) {\n this.animatedScroll = this.targetScroll = target;\n this.setScroll(this.scroll);\n this.reset();\n this.preventNextNativeScrollEvent();\n this.emit();\n onComplete?.(this);\n this.userData = {};\n requestAnimationFrame(() => {\n this.dispatchScrollendEvent();\n });\n return;\n }\n if (!programmatic) {\n this.targetScroll = target;\n }\n if (typeof duration === \"number\" && typeof easing !== \"function\") {\n easing = defaultEasing;\n } else if (typeof easing === \"function\" && typeof duration !== \"number\") {\n duration = 1;\n }\n this.animate.fromTo(this.animatedScroll, target, {\n duration,\n easing,\n lerp: lerp2,\n onStart: () => {\n if (lock) this.isLocked = true;\n this.isScrolling = \"smooth\";\n onStart?.(this);\n },\n onUpdate: (value, completed) => {\n this.isScrolling = \"smooth\";\n this.lastVelocity = this.velocity;\n this.velocity = value - this.animatedScroll;\n this.direction = Math.sign(this.velocity);\n this.animatedScroll = value;\n this.setScroll(this.scroll);\n if (programmatic) {\n this.targetScroll = value;\n }\n if (!completed) this.emit();\n if (completed) {\n this.reset();\n this.emit();\n onComplete?.(this);\n this.userData = {};\n requestAnimationFrame(() => {\n this.dispatchScrollendEvent();\n });\n this.preventNextNativeScrollEvent();\n }\n }\n });\n }\n preventNextNativeScrollEvent() {\n this._preventNextNativeScrollEvent = true;\n requestAnimationFrame(() => {\n this._preventNextNativeScrollEvent = false;\n });\n }\n checkNestedScroll(node, { deltaX, deltaY }) {\n const time = Date.now();\n const cache = node._lenis ??= {};\n let hasOverflowX, hasOverflowY, isScrollableX, isScrollableY, scrollWidth, scrollHeight, clientWidth, clientHeight;\n const gestureOrientation = this.options.gestureOrientation;\n if (time - (cache.time ?? 0) > 2e3) {\n cache.time = Date.now();\n const computedStyle = window.getComputedStyle(node);\n cache.computedStyle = computedStyle;\n const overflowXString = computedStyle.overflowX;\n const overflowYString = computedStyle.overflowY;\n hasOverflowX = [\"auto\", \"overlay\", \"scroll\"].includes(overflowXString);\n hasOverflowY = [\"auto\", \"overlay\", \"scroll\"].includes(overflowYString);\n cache.hasOverflowX = hasOverflowX;\n cache.hasOverflowY = hasOverflowY;\n if (!hasOverflowX && !hasOverflowY) return false;\n if (gestureOrientation === \"vertical\" && !hasOverflowY) return false;\n if (gestureOrientation === \"horizontal\" && !hasOverflowX) return false;\n scrollWidth = node.scrollWidth;\n scrollHeight = node.scrollHeight;\n clientWidth = node.clientWidth;\n clientHeight = node.clientHeight;\n isScrollableX = scrollWidth > clientWidth;\n isScrollableY = scrollHeight > clientHeight;\n cache.isScrollableX = isScrollableX;\n cache.isScrollableY = isScrollableY;\n cache.scrollWidth = scrollWidth;\n cache.scrollHeight = scrollHeight;\n cache.clientWidth = clientWidth;\n cache.clientHeight = clientHeight;\n } else {\n isScrollableX = cache.isScrollableX;\n isScrollableY = cache.isScrollableY;\n hasOverflowX = cache.hasOverflowX;\n hasOverflowY = cache.hasOverflowY;\n scrollWidth = cache.scrollWidth;\n scrollHeight = cache.scrollHeight;\n clientWidth = cache.clientWidth;\n clientHeight = cache.clientHeight;\n }\n if (!hasOverflowX && !hasOverflowY || !isScrollableX && !isScrollableY) {\n return false;\n }\n if (gestureOrientation === \"vertical\" && (!hasOverflowY || !isScrollableY))\n return false;\n if (gestureOrientation === \"horizontal\" && (!hasOverflowX || !isScrollableX))\n return false;\n let orientation;\n if (gestureOrientation === \"horizontal\") {\n orientation = \"x\";\n } else if (gestureOrientation === \"vertical\") {\n orientation = \"y\";\n } else {\n const isScrollingX = deltaX !== 0;\n const isScrollingY = deltaY !== 0;\n if (isScrollingX && hasOverflowX && isScrollableX) {\n orientation = \"x\";\n }\n if (isScrollingY && hasOverflowY && isScrollableY) {\n orientation = \"y\";\n }\n }\n if (!orientation) return false;\n let scroll, maxScroll, delta, hasOverflow, isScrollable;\n if (orientation === \"x\") {\n scroll = node.scrollLeft;\n maxScroll = scrollWidth - clientWidth;\n delta = deltaX;\n hasOverflow = hasOverflowX;\n isScrollable = isScrollableX;\n } else if (orientation === \"y\") {\n scroll = node.scrollTop;\n maxScroll = scrollHeight - clientHeight;\n delta = deltaY;\n hasOverflow = hasOverflowY;\n isScrollable = isScrollableY;\n } else {\n return false;\n }\n const willScroll = delta > 0 ? scroll < maxScroll : scroll > 0;\n return willScroll && hasOverflow && isScrollable;\n }\n /**\n * The root element on which lenis is instanced\n */\n get rootElement() {\n return this.options.wrapper === window ? document.documentElement : this.options.wrapper;\n }\n /**\n * The limit which is the maximum scroll value\n */\n get limit() {\n if (this.options.__experimental__naiveDimensions) {\n if (this.isHorizontal) {\n return this.rootElement.scrollWidth - this.rootElement.clientWidth;\n } else {\n return this.rootElement.scrollHeight - this.rootElement.clientHeight;\n }\n } else {\n return this.dimensions.limit[this.isHorizontal ? \"x\" : \"y\"];\n }\n }\n /**\n * Whether or not the scroll is horizontal\n */\n get isHorizontal() {\n return this.options.orientation === \"horizontal\";\n }\n /**\n * The actual scroll value\n */\n get actualScroll() {\n const wrapper = this.options.wrapper;\n return this.isHorizontal ? wrapper.scrollX ?? wrapper.scrollLeft : wrapper.scrollY ?? wrapper.scrollTop;\n }\n /**\n * The current scroll value\n */\n get scroll() {\n return this.options.infinite ? modulo(this.animatedScroll, this.limit) : this.animatedScroll;\n }\n /**\n * The progress of the scroll relative to the limit\n */\n get progress() {\n return this.limit === 0 ? 1 : this.scroll / this.limit;\n }\n /**\n * Current scroll state\n */\n get isScrolling() {\n return this._isScrolling;\n }\n set isScrolling(value) {\n if (this._isScrolling !== value) {\n this._isScrolling = value;\n this.updateClassName();\n }\n }\n /**\n * Check if lenis is stopped\n */\n get isStopped() {\n return this._isStopped;\n }\n set isStopped(value) {\n if (this._isStopped !== value) {\n this._isStopped = value;\n this.updateClassName();\n }\n }\n /**\n * Check if lenis is locked\n */\n get isLocked() {\n return this._isLocked;\n }\n set isLocked(value) {\n if (this._isLocked !== value) {\n this._isLocked = value;\n this.updateClassName();\n }\n }\n /**\n * Check if lenis is smooth scrolling\n */\n get isSmooth() {\n return this.isScrolling === \"smooth\";\n }\n /**\n * The class name applied to the wrapper element\n */\n get className() {\n let className = \"lenis\";\n if (this.options.autoToggle) className += \" lenis-autoToggle\";\n if (this.isStopped) className += \" lenis-stopped\";\n if (this.isLocked) className += \" lenis-locked\";\n if (this.isScrolling) className += \" lenis-scrolling\";\n if (this.isScrolling === \"smooth\") className += \" lenis-smooth\";\n return className;\n }\n updateClassName() {\n this.cleanUpClassName();\n this.rootElement.className = `${this.rootElement.className} ${this.className}`.trim();\n }\n cleanUpClassName() {\n this.rootElement.className = this.rootElement.className.replace(/lenis(-\\w+)?/g, \"\").trim();\n }\n};\n\n//# sourceMappingURL=lenis.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvbGVuaXMvZGlzdC9sZW5pcy5tanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0RBQWtEO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQyxtREFBbUQsSUFBSTtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFlBQVk7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSxtQ0FBbUMsd0NBQXdDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksbUJBQW1CO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFlBQVksbUJBQW1CO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsVUFBVSw0QkFBNEI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHVCQUF1QjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsWUFBWTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLG1DQUFtQztBQUN6RSxNQUFNO0FBQ04sc0NBQXNDLGtDQUFrQztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGlCQUFpQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHdCQUF3QjtBQUNwQywwQ0FBMEMsdUJBQXVCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOFVBQThVLGdCQUFnQjtBQUM5VjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsNEJBQTRCLGdCQUFnQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsNEJBQTRCLEVBQUUsZUFBZTtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0U7QUFDRiIsInNvdXJjZXMiOlsiL2hvbWUvTmljaG9sYWkvRG9jdW1lbnRzL0Rldi9iaW9oYXphcmQtdmZ4LTIvbm9kZV9tb2R1bGVzL2xlbmlzL2Rpc3QvbGVuaXMubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHBhY2thZ2UuanNvblxudmFyIHZlcnNpb24gPSBcIjEuMy4xMVwiO1xuXG4vLyBwYWNrYWdlcy9jb3JlL3NyYy9tYXRocy50c1xuZnVuY3Rpb24gY2xhbXAobWluLCBpbnB1dCwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKGlucHV0LCBtYXgpKTtcbn1cbmZ1bmN0aW9uIGxlcnAoeCwgeSwgdCkge1xuICByZXR1cm4gKDEgLSB0KSAqIHggKyB0ICogeTtcbn1cbmZ1bmN0aW9uIGRhbXAoeCwgeSwgbGFtYmRhLCBkZWx0YVRpbWUpIHtcbiAgcmV0dXJuIGxlcnAoeCwgeSwgMSAtIE1hdGguZXhwKC1sYW1iZGEgKiBkZWx0YVRpbWUpKTtcbn1cbmZ1bmN0aW9uIG1vZHVsbyhuLCBkKSB7XG4gIHJldHVybiAobiAlIGQgKyBkKSAlIGQ7XG59XG5cbi8vIHBhY2thZ2VzL2NvcmUvc3JjL2FuaW1hdGUudHNcbnZhciBBbmltYXRlID0gY2xhc3Mge1xuICBpc1J1bm5pbmcgPSBmYWxzZTtcbiAgdmFsdWUgPSAwO1xuICBmcm9tID0gMDtcbiAgdG8gPSAwO1xuICBjdXJyZW50VGltZSA9IDA7XG4gIC8vIFRoZXNlIGFyZSBpbnN0YW5jaWF0ZWQgaW4gdGhlIGZyb21UbyBtZXRob2RcbiAgbGVycDtcbiAgZHVyYXRpb247XG4gIGVhc2luZztcbiAgb25VcGRhdGU7XG4gIC8qKlxuICAgKiBBZHZhbmNlIHRoZSBhbmltYXRpb24gYnkgdGhlIGdpdmVuIGRlbHRhIHRpbWVcbiAgICpcbiAgICogQHBhcmFtIGRlbHRhVGltZSAtIFRoZSB0aW1lIGluIHNlY29uZHMgdG8gYWR2YW5jZSB0aGUgYW5pbWF0aW9uXG4gICAqL1xuICBhZHZhbmNlKGRlbHRhVGltZSkge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHJldHVybjtcbiAgICBsZXQgY29tcGxldGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZHVyYXRpb24gJiYgdGhpcy5lYXNpbmcpIHtcbiAgICAgIHRoaXMuY3VycmVudFRpbWUgKz0gZGVsdGFUaW1lO1xuICAgICAgY29uc3QgbGluZWFyUHJvZ3Jlc3MgPSBjbGFtcCgwLCB0aGlzLmN1cnJlbnRUaW1lIC8gdGhpcy5kdXJhdGlvbiwgMSk7XG4gICAgICBjb21wbGV0ZWQgPSBsaW5lYXJQcm9ncmVzcyA+PSAxO1xuICAgICAgY29uc3QgZWFzZWRQcm9ncmVzcyA9IGNvbXBsZXRlZCA/IDEgOiB0aGlzLmVhc2luZyhsaW5lYXJQcm9ncmVzcyk7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5mcm9tICsgKHRoaXMudG8gLSB0aGlzLmZyb20pICogZWFzZWRQcm9ncmVzcztcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVycCkge1xuICAgICAgdGhpcy52YWx1ZSA9IGRhbXAodGhpcy52YWx1ZSwgdGhpcy50bywgdGhpcy5sZXJwICogNjAsIGRlbHRhVGltZSk7XG4gICAgICBpZiAoTWF0aC5yb3VuZCh0aGlzLnZhbHVlKSA9PT0gdGhpcy50bykge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy50bztcbiAgICAgICAgY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudG87XG4gICAgICBjb21wbGV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29tcGxldGVkKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICB9XG4gICAgdGhpcy5vblVwZGF0ZT8uKHRoaXMudmFsdWUsIGNvbXBsZXRlZCk7XG4gIH1cbiAgLyoqIFN0b3AgdGhlIGFuaW1hdGlvbiAqL1xuICBzdG9wKCkge1xuICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB1cCB0aGUgYW5pbWF0aW9uIGZyb20gYSBzdGFydGluZyB2YWx1ZSB0byBhbiBlbmRpbmcgdmFsdWVcbiAgICogd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBsZXJwaW5nLCBkdXJhdGlvbiwgZWFzaW5nLCBhbmQgb25VcGRhdGUgY2FsbGJhY2tcbiAgICpcbiAgICogQHBhcmFtIGZyb20gLSBUaGUgc3RhcnRpbmcgdmFsdWVcbiAgICogQHBhcmFtIHRvIC0gVGhlIGVuZGluZyB2YWx1ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBhbmltYXRpb25cbiAgICovXG4gIGZyb21Ubyhmcm9tLCB0bywgeyBsZXJwOiBsZXJwMiwgZHVyYXRpb24sIGVhc2luZywgb25TdGFydCwgb25VcGRhdGUgfSkge1xuICAgIHRoaXMuZnJvbSA9IHRoaXMudmFsdWUgPSBmcm9tO1xuICAgIHRoaXMudG8gPSB0bztcbiAgICB0aGlzLmxlcnAgPSBsZXJwMjtcbiAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgdGhpcy5lYXNpbmcgPSBlYXNpbmc7XG4gICAgdGhpcy5jdXJyZW50VGltZSA9IDA7XG4gICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xuICAgIG9uU3RhcnQ/LigpO1xuICAgIHRoaXMub25VcGRhdGUgPSBvblVwZGF0ZTtcbiAgfVxufTtcblxuLy8gcGFja2FnZXMvY29yZS9zcmMvZGVib3VuY2UudHNcbmZ1bmN0aW9uIGRlYm91bmNlKGNhbGxiYWNrLCBkZWxheSkge1xuICBsZXQgdGltZXI7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgbGV0IGNvbnRleHQgPSB0aGlzO1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRpbWVyID0gdm9pZCAwO1xuICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfSwgZGVsYXkpO1xuICB9O1xufVxuXG4vLyBwYWNrYWdlcy9jb3JlL3NyYy9kaW1lbnNpb25zLnRzXG52YXIgRGltZW5zaW9ucyA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Iod3JhcHBlciwgY29udGVudCwgeyBhdXRvUmVzaXplID0gdHJ1ZSwgZGVib3VuY2U6IGRlYm91bmNlVmFsdWUgPSAyNTAgfSA9IHt9KSB7XG4gICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjtcbiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgIGlmIChhdXRvUmVzaXplKSB7XG4gICAgICB0aGlzLmRlYm91bmNlZFJlc2l6ZSA9IGRlYm91bmNlKHRoaXMucmVzaXplLCBkZWJvdW5jZVZhbHVlKTtcbiAgICAgIGlmICh0aGlzLndyYXBwZXIgaW5zdGFuY2VvZiBXaW5kb3cpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5kZWJvdW5jZWRSZXNpemUsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud3JhcHBlclJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHRoaXMuZGVib3VuY2VkUmVzaXplKTtcbiAgICAgICAgdGhpcy53cmFwcGVyUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLndyYXBwZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5kZWJvdW5jZWRSZXNpemUpO1xuICAgICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRlbnQpO1xuICAgIH1cbiAgICB0aGlzLnJlc2l6ZSgpO1xuICB9XG4gIHdpZHRoID0gMDtcbiAgaGVpZ2h0ID0gMDtcbiAgc2Nyb2xsSGVpZ2h0ID0gMDtcbiAgc2Nyb2xsV2lkdGggPSAwO1xuICAvLyBUaGVzZSBhcmUgaW5zdGFuY2lhdGVkIGluIHRoZSBjb25zdHJ1Y3RvciBhcyB0aGV5IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3B0aW9uc1xuICBkZWJvdW5jZWRSZXNpemU7XG4gIHdyYXBwZXJSZXNpemVPYnNlcnZlcjtcbiAgY29udGVudFJlc2l6ZU9ic2VydmVyO1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMud3JhcHBlclJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAodGhpcy53cmFwcGVyID09PSB3aW5kb3cgJiYgdGhpcy5kZWJvdW5jZWRSZXNpemUpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMuZGVib3VuY2VkUmVzaXplLCBmYWxzZSk7XG4gICAgfVxuICB9XG4gIHJlc2l6ZSA9ICgpID0+IHtcbiAgICB0aGlzLm9uV3JhcHBlclJlc2l6ZSgpO1xuICAgIHRoaXMub25Db250ZW50UmVzaXplKCk7XG4gIH07XG4gIG9uV3JhcHBlclJlc2l6ZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy53cmFwcGVyIGluc3RhbmNlb2YgV2luZG93KSB7XG4gICAgICB0aGlzLndpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53aWR0aCA9IHRoaXMud3JhcHBlci5jbGllbnRXaWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy53cmFwcGVyLmNsaWVudEhlaWdodDtcbiAgICB9XG4gIH07XG4gIG9uQ29udGVudFJlc2l6ZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy53cmFwcGVyIGluc3RhbmNlb2YgV2luZG93KSB7XG4gICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMuY29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB0aGlzLnNjcm9sbFdpZHRoID0gdGhpcy5jb250ZW50LnNjcm9sbFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMud3JhcHBlci5zY3JvbGxIZWlnaHQ7XG4gICAgICB0aGlzLnNjcm9sbFdpZHRoID0gdGhpcy53cmFwcGVyLnNjcm9sbFdpZHRoO1xuICAgIH1cbiAgfTtcbiAgZ2V0IGxpbWl0KCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLnNjcm9sbFdpZHRoIC0gdGhpcy53aWR0aCxcbiAgICAgIHk6IHRoaXMuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5oZWlnaHRcbiAgICB9O1xuICB9XG59O1xuXG4vLyBwYWNrYWdlcy9jb3JlL3NyYy9lbWl0dGVyLnRzXG52YXIgRW1pdHRlciA9IGNsYXNzIHtcbiAgZXZlbnRzID0ge307XG4gIC8qKlxuICAgKiBFbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIGRhdGFcbiAgICogQHBhcmFtIGV2ZW50IEV2ZW50IG5hbWVcbiAgICogQHBhcmFtIGFyZ3MgRGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBoYW5kbGVyc1xuICAgKi9cbiAgZW1pdChldmVudCwgLi4uYXJncykge1xuICAgIGxldCBjYWxsYmFja3MgPSB0aGlzLmV2ZW50c1tldmVudF0gfHwgW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgY2FsbGJhY2tzW2ldPy4oLi4uYXJncyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBjYWxsYmFjayB0byB0aGUgZXZlbnRcbiAgICogQHBhcmFtIGV2ZW50IEV2ZW50IG5hbWVcbiAgICogQHBhcmFtIGNiIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIFVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAqL1xuICBvbihldmVudCwgY2IpIHtcbiAgICB0aGlzLmV2ZW50c1tldmVudF0/LnB1c2goY2IpIHx8ICh0aGlzLmV2ZW50c1tldmVudF0gPSBbY2JdKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5ldmVudHNbZXZlbnRdID0gdGhpcy5ldmVudHNbZXZlbnRdPy5maWx0ZXIoKGkpID0+IGNiICE9PSBpKTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBldmVudFxuICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZVxuICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIG9mZihldmVudCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmV2ZW50c1tldmVudF0gPSB0aGlzLmV2ZW50c1tldmVudF0/LmZpbHRlcigoaSkgPT4gY2FsbGJhY2sgIT09IGkpO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgY2xlYW4gdXBcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5ldmVudHMgPSB7fTtcbiAgfVxufTtcblxuLy8gcGFja2FnZXMvY29yZS9zcmMvdmlydHVhbC1zY3JvbGwudHNcbnZhciBMSU5FX0hFSUdIVCA9IDEwMCAvIDY7XG52YXIgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiBmYWxzZSB9O1xudmFyIFZpcnR1YWxTY3JvbGwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG9wdGlvbnMgPSB7IHdoZWVsTXVsdGlwbGllcjogMSwgdG91Y2hNdWx0aXBsaWVyOiAxIH0pIHtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xuICAgIHRoaXMub25XaW5kb3dSZXNpemUoKTtcbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHRoaXMub25XaGVlbCwgbGlzdGVuZXJPcHRpb25zKTtcbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwidG91Y2hzdGFydFwiLFxuICAgICAgdGhpcy5vblRvdWNoU3RhcnQsXG4gICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJ0b3VjaG1vdmVcIixcbiAgICAgIHRoaXMub25Ub3VjaE1vdmUsXG4gICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5vblRvdWNoRW5kLCBsaXN0ZW5lck9wdGlvbnMpO1xuICB9XG4gIHRvdWNoU3RhcnQgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG4gIGxhc3REZWx0YSA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbiAgd2luZG93ID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuICBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTtcbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIGV2ZW50IGFuZCBjYWxsYmFja1xuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZVxuICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIG9uKGV2ZW50LCBjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub24oZXZlbnQsIGNhbGxiYWNrKTtcbiAgfVxuICAvKiogUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnMgYW5kIGNsZWFuIHVwICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5lbWl0dGVyLmRlc3Ryb3koKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uV2luZG93UmVzaXplLCBmYWxzZSk7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCB0aGlzLm9uV2hlZWwsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBcInRvdWNoc3RhcnRcIixcbiAgICAgIHRoaXMub25Ub3VjaFN0YXJ0LFxuICAgICAgbGlzdGVuZXJPcHRpb25zXG4gICAgKTtcbiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwidG91Y2htb3ZlXCIsXG4gICAgICB0aGlzLm9uVG91Y2hNb3ZlLFxuICAgICAgbGlzdGVuZXJPcHRpb25zXG4gICAgKTtcbiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwidG91Y2hlbmRcIixcbiAgICAgIHRoaXMub25Ub3VjaEVuZCxcbiAgICAgIGxpc3RlbmVyT3B0aW9uc1xuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEV2ZW50IGhhbmRsZXIgZm9yICd0b3VjaHN0YXJ0JyBldmVudFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVG91Y2ggZXZlbnRcbiAgICovXG4gIG9uVG91Y2hTdGFydCA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gZXZlbnQudGFyZ2V0VG91Y2hlcyA/IGV2ZW50LnRhcmdldFRvdWNoZXNbMF0gOiBldmVudDtcbiAgICB0aGlzLnRvdWNoU3RhcnQueCA9IGNsaWVudFg7XG4gICAgdGhpcy50b3VjaFN0YXJ0LnkgPSBjbGllbnRZO1xuICAgIHRoaXMubGFzdERlbHRhID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICAgIHRoaXMuZW1pdHRlci5lbWl0KFwic2Nyb2xsXCIsIHtcbiAgICAgIGRlbHRhWDogMCxcbiAgICAgIGRlbHRhWTogMCxcbiAgICAgIGV2ZW50XG4gICAgfSk7XG4gIH07XG4gIC8qKiBFdmVudCBoYW5kbGVyIGZvciAndG91Y2htb3ZlJyBldmVudCAqL1xuICBvblRvdWNoTW92ZSA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gZXZlbnQudGFyZ2V0VG91Y2hlcyA/IGV2ZW50LnRhcmdldFRvdWNoZXNbMF0gOiBldmVudDtcbiAgICBjb25zdCBkZWx0YVggPSAtKGNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnQueCkgKiB0aGlzLm9wdGlvbnMudG91Y2hNdWx0aXBsaWVyO1xuICAgIGNvbnN0IGRlbHRhWSA9IC0oY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydC55KSAqIHRoaXMub3B0aW9ucy50b3VjaE11bHRpcGxpZXI7XG4gICAgdGhpcy50b3VjaFN0YXJ0LnggPSBjbGllbnRYO1xuICAgIHRoaXMudG91Y2hTdGFydC55ID0gY2xpZW50WTtcbiAgICB0aGlzLmxhc3REZWx0YSA9IHtcbiAgICAgIHg6IGRlbHRhWCxcbiAgICAgIHk6IGRlbHRhWVxuICAgIH07XG4gICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJzY3JvbGxcIiwge1xuICAgICAgZGVsdGFYLFxuICAgICAgZGVsdGFZLFxuICAgICAgZXZlbnRcbiAgICB9KTtcbiAgfTtcbiAgb25Ub3VjaEVuZCA9IChldmVudCkgPT4ge1xuICAgIHRoaXMuZW1pdHRlci5lbWl0KFwic2Nyb2xsXCIsIHtcbiAgICAgIGRlbHRhWDogdGhpcy5sYXN0RGVsdGEueCxcbiAgICAgIGRlbHRhWTogdGhpcy5sYXN0RGVsdGEueSxcbiAgICAgIGV2ZW50XG4gICAgfSk7XG4gIH07XG4gIC8qKiBFdmVudCBoYW5kbGVyIGZvciAnd2hlZWwnIGV2ZW50ICovXG4gIG9uV2hlZWwgPSAoZXZlbnQpID0+IHtcbiAgICBsZXQgeyBkZWx0YVgsIGRlbHRhWSwgZGVsdGFNb2RlIH0gPSBldmVudDtcbiAgICBjb25zdCBtdWx0aXBsaWVyWCA9IGRlbHRhTW9kZSA9PT0gMSA/IExJTkVfSEVJR0hUIDogZGVsdGFNb2RlID09PSAyID8gdGhpcy53aW5kb3cud2lkdGggOiAxO1xuICAgIGNvbnN0IG11bHRpcGxpZXJZID0gZGVsdGFNb2RlID09PSAxID8gTElORV9IRUlHSFQgOiBkZWx0YU1vZGUgPT09IDIgPyB0aGlzLndpbmRvdy5oZWlnaHQgOiAxO1xuICAgIGRlbHRhWCAqPSBtdWx0aXBsaWVyWDtcbiAgICBkZWx0YVkgKj0gbXVsdGlwbGllclk7XG4gICAgZGVsdGFYICo9IHRoaXMub3B0aW9ucy53aGVlbE11bHRpcGxpZXI7XG4gICAgZGVsdGFZICo9IHRoaXMub3B0aW9ucy53aGVlbE11bHRpcGxpZXI7XG4gICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJzY3JvbGxcIiwgeyBkZWx0YVgsIGRlbHRhWSwgZXZlbnQgfSk7XG4gIH07XG4gIG9uV2luZG93UmVzaXplID0gKCkgPT4ge1xuICAgIHRoaXMud2luZG93ID0ge1xuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICB9O1xuICB9O1xufTtcblxuLy8gcGFja2FnZXMvY29yZS9zcmMvbGVuaXMudHNcbnZhciBkZWZhdWx0RWFzaW5nID0gKHQpID0+IE1hdGgubWluKDEsIDEuMDAxIC0gTWF0aC5wb3coMiwgLTEwICogdCkpO1xudmFyIExlbmlzID0gY2xhc3Mge1xuICBfaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgLy8gdHJ1ZSB3aGVuIHNjcm9sbCBpcyBhbmltYXRpbmdcbiAgX2lzU3RvcHBlZCA9IGZhbHNlO1xuICAvLyB0cnVlIGlmIHVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHNjcm9sbCAtIGVuYWJsZS9kaXNhYmxlIHByb2dyYW1tYXRpY2FsbHlcbiAgX2lzTG9ja2VkID0gZmFsc2U7XG4gIC8vIHNhbWUgYXMgaXNTdG9wcGVkIGJ1dCBlbmFibGVkL2Rpc2FibGVkIHdoZW4gc2Nyb2xsIHJlYWNoZXMgdGFyZ2V0XG4gIF9wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50ID0gZmFsc2U7XG4gIF9yZXNldFZlbG9jaXR5VGltZW91dCA9IG51bGw7XG4gIF9fcmFmSUQgPSBudWxsO1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHVzZXIgaXMgdG91Y2hpbmcgdGhlIHNjcmVlblxuICAgKi9cbiAgaXNUb3VjaGluZztcbiAgLyoqXG4gICAqIFRoZSB0aW1lIGluIG1zIHNpbmNlIHRoZSBsZW5pcyBpbnN0YW5jZSB3YXMgY3JlYXRlZFxuICAgKi9cbiAgdGltZSA9IDA7XG4gIC8qKlxuICAgKiBVc2VyIGRhdGEgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0aHJvdWdoIHRoZSBzY3JvbGwgZXZlbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbGVuaXMuc2Nyb2xsVG8oMTAwLCB7XG4gICAqICAgdXNlckRhdGE6IHtcbiAgICogICAgIGZvbzogJ2JhcidcbiAgICogICB9XG4gICAqIH0pXG4gICAqL1xuICB1c2VyRGF0YSA9IHt9O1xuICAvKipcbiAgICogVGhlIGxhc3QgdmVsb2NpdHkgb2YgdGhlIHNjcm9sbFxuICAgKi9cbiAgbGFzdFZlbG9jaXR5ID0gMDtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHZlbG9jaXR5IG9mIHRoZSBzY3JvbGxcbiAgICovXG4gIHZlbG9jaXR5ID0gMDtcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHNjcm9sbFxuICAgKi9cbiAgZGlyZWN0aW9uID0gMDtcbiAgLyoqXG4gICAqIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgbGVuaXMgaW5zdGFuY2VcbiAgICovXG4gIG9wdGlvbnM7XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHNjcm9sbCB2YWx1ZVxuICAgKi9cbiAgdGFyZ2V0U2Nyb2xsO1xuICAvKipcbiAgICogVGhlIGFuaW1hdGVkIHNjcm9sbCB2YWx1ZVxuICAgKi9cbiAgYW5pbWF0ZWRTY3JvbGw7XG4gIC8vIFRoZXNlIGFyZSBpbnN0YW5jaWF0ZWQgaGVyZSBhcyB0aGV5IGRvbid0IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3B0aW9uc1xuICBhbmltYXRlID0gbmV3IEFuaW1hdGUoKTtcbiAgZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG4gIC8vIFRoZXNlIGFyZSBpbnN0YW5jaWF0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFzIHRoZXkgbmVlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcHRpb25zXG4gIGRpbWVuc2lvbnM7XG4gIC8vIFRoaXMgaXMgbm90IHByaXZhdGUgYmVjYXVzZSBpdCdzIHVzZWQgaW4gdGhlIFNuYXAgY2xhc3NcbiAgdmlydHVhbFNjcm9sbDtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHdyYXBwZXIgPSB3aW5kb3csXG4gICAgY29udGVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICBldmVudHNUYXJnZXQgPSB3cmFwcGVyLFxuICAgIHNtb290aFdoZWVsID0gdHJ1ZSxcbiAgICBzeW5jVG91Y2ggPSBmYWxzZSxcbiAgICBzeW5jVG91Y2hMZXJwID0gMC4wNzUsXG4gICAgdG91Y2hJbmVydGlhRXhwb25lbnQgPSAxLjcsXG4gICAgZHVyYXRpb24sXG4gICAgLy8gaW4gc2Vjb25kc1xuICAgIGVhc2luZyxcbiAgICBsZXJwOiBsZXJwMiA9IDAuMSxcbiAgICBpbmZpbml0ZSA9IGZhbHNlLFxuICAgIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiLFxuICAgIC8vIHZlcnRpY2FsLCBob3Jpem9udGFsXG4gICAgZ2VzdHVyZU9yaWVudGF0aW9uID0gb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiID8gXCJib3RoXCIgOiBcInZlcnRpY2FsXCIsXG4gICAgLy8gdmVydGljYWwsIGhvcml6b250YWwsIGJvdGhcbiAgICB0b3VjaE11bHRpcGxpZXIgPSAxLFxuICAgIHdoZWVsTXVsdGlwbGllciA9IDEsXG4gICAgYXV0b1Jlc2l6ZSA9IHRydWUsXG4gICAgcHJldmVudCxcbiAgICB2aXJ0dWFsU2Nyb2xsLFxuICAgIG92ZXJzY3JvbGwgPSB0cnVlLFxuICAgIGF1dG9SYWYgPSBmYWxzZSxcbiAgICBhbmNob3JzID0gZmFsc2UsXG4gICAgYXV0b1RvZ2dsZSA9IGZhbHNlLFxuICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vP3NlYXJjaD10cmFuc2l0aW9uLWJlaGF2aW9yXG4gICAgYWxsb3dOZXN0ZWRTY3JvbGwgPSBmYWxzZSxcbiAgICBfX2V4cGVyaW1lbnRhbF9fbmFpdmVEaW1lbnNpb25zID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgd2luZG93LmxlbmlzVmVyc2lvbiA9IHZlcnNpb247XG4gICAgaWYgKCF3cmFwcGVyIHx8IHdyYXBwZXIgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgd3JhcHBlciA9IHdpbmRvdztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgZWFzaW5nICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGVhc2luZyA9IGRlZmF1bHRFYXNpbmc7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZWFzaW5nID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGR1cmF0aW9uICE9PSBcIm51bWJlclwiKSB7XG4gICAgICBkdXJhdGlvbiA9IDE7XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIHdyYXBwZXIsXG4gICAgICBjb250ZW50LFxuICAgICAgZXZlbnRzVGFyZ2V0LFxuICAgICAgc21vb3RoV2hlZWwsXG4gICAgICBzeW5jVG91Y2gsXG4gICAgICBzeW5jVG91Y2hMZXJwLFxuICAgICAgdG91Y2hJbmVydGlhRXhwb25lbnQsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGVhc2luZyxcbiAgICAgIGxlcnA6IGxlcnAyLFxuICAgICAgaW5maW5pdGUsXG4gICAgICBnZXN0dXJlT3JpZW50YXRpb24sXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIHRvdWNoTXVsdGlwbGllcixcbiAgICAgIHdoZWVsTXVsdGlwbGllcixcbiAgICAgIGF1dG9SZXNpemUsXG4gICAgICBwcmV2ZW50LFxuICAgICAgdmlydHVhbFNjcm9sbCxcbiAgICAgIG92ZXJzY3JvbGwsXG4gICAgICBhdXRvUmFmLFxuICAgICAgYW5jaG9ycyxcbiAgICAgIGF1dG9Ub2dnbGUsXG4gICAgICBhbGxvd05lc3RlZFNjcm9sbCxcbiAgICAgIF9fZXhwZXJpbWVudGFsX19uYWl2ZURpbWVuc2lvbnNcbiAgICB9O1xuICAgIHRoaXMuZGltZW5zaW9ucyA9IG5ldyBEaW1lbnNpb25zKHdyYXBwZXIsIGNvbnRlbnQsIHsgYXV0b1Jlc2l6ZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpO1xuICAgIHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMuYWN0dWFsU2Nyb2xsO1xuICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vbk5hdGl2ZVNjcm9sbCwgZmFsc2UpO1xuICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxlbmRcIiwgdGhpcy5vblNjcm9sbEVuZCwge1xuICAgICAgY2FwdHVyZTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYW5jaG9ycyAmJiB0aGlzLm9wdGlvbnMud3JhcHBlciA9PT0gd2luZG93KSB7XG4gICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBcImNsaWNrXCIsXG4gICAgICAgIHRoaXMub25DbGljayxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBvaW50ZXJkb3duXCIsXG4gICAgICB0aGlzLm9uUG9pbnRlckRvd24sXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsID0gbmV3IFZpcnR1YWxTY3JvbGwoZXZlbnRzVGFyZ2V0LCB7XG4gICAgICB0b3VjaE11bHRpcGxpZXIsXG4gICAgICB3aGVlbE11bHRpcGxpZXJcbiAgICB9KTtcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGwub24oXCJzY3JvbGxcIiwgdGhpcy5vblZpcnR1YWxTY3JvbGwpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1RvZ2dsZSkge1xuICAgICAgdGhpcy5yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCB0aGlzLm9uVHJhbnNpdGlvbkVuZCwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvUmFmKSB7XG4gICAgICB0aGlzLl9fcmFmSUQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yYWYpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRGVzdHJveSB0aGUgbGVuaXMgaW5zdGFuY2UsIHJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzIGFuZCBjbGVhbiB1cCB0aGUgY2xhc3MgbmFtZVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmVtaXR0ZXIuZGVzdHJveSgpO1xuICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBcInNjcm9sbFwiLFxuICAgICAgdGhpcy5vbk5hdGl2ZVNjcm9sbCxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsZW5kXCIsIHRoaXMub25TY3JvbGxFbmQsIHtcbiAgICAgIGNhcHR1cmU6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgXCJwb2ludGVyZG93blwiLFxuICAgICAgdGhpcy5vblBvaW50ZXJEb3duLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYW5jaG9ycyAmJiB0aGlzLm9wdGlvbnMud3JhcHBlciA9PT0gd2luZG93KSB7XG4gICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBcImNsaWNrXCIsXG4gICAgICAgIHRoaXMub25DbGljayxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmlydHVhbFNjcm9sbC5kZXN0cm95KCk7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRlc3Ryb3koKTtcbiAgICB0aGlzLmNsZWFuVXBDbGFzc05hbWUoKTtcbiAgICBpZiAodGhpcy5fX3JhZklEKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fcmFmSUQpO1xuICAgIH1cbiAgfVxuICBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0dGVyLm9uKGV2ZW50LCBjYWxsYmFjayk7XG4gIH1cbiAgb2ZmKGV2ZW50LCBjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub2ZmKGV2ZW50LCBjYWxsYmFjayk7XG4gIH1cbiAgb25TY3JvbGxFbmQgPSAoZSkgPT4ge1xuICAgIGlmICghKGUgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nID09PSBcInNtb290aFwiIHx8IHRoaXMuaXNTY3JvbGxpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBkaXNwYXRjaFNjcm9sbGVuZEV2ZW50ID0gKCkgPT4ge1xuICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJzY3JvbGxlbmRcIiwge1xuICAgICAgICBidWJibGVzOiB0aGlzLm9wdGlvbnMud3JhcHBlciA9PT0gd2luZG93LFxuICAgICAgICAvLyBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgbGVuaXNTY3JvbGxFbmQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xuICBvblRyYW5zaXRpb25FbmQgPSAoZXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQucHJvcGVydHlOYW1lLmluY2x1ZGVzKFwib3ZlcmZsb3dcIikpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5pc0hvcml6b250YWwgPyBcIm92ZXJmbG93LXhcIiA6IFwib3ZlcmZsb3cteVwiO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMucm9vdEVsZW1lbnQpW3Byb3BlcnR5XTtcbiAgICAgIGlmIChbXCJoaWRkZW5cIiwgXCJjbGlwXCJdLmluY2x1ZGVzKG92ZXJmbG93KSkge1xuICAgICAgICB0aGlzLmludGVybmFsU3RvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFN0YXJ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBzZXRTY3JvbGwoc2Nyb2xsKSB7XG4gICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7XG4gICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5zY3JvbGxUbyh7IGxlZnQ6IHNjcm9sbCwgYmVoYXZpb3I6IFwiaW5zdGFudFwiIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5zY3JvbGxUbyh7IHRvcDogc2Nyb2xsLCBiZWhhdmlvcjogXCJpbnN0YW50XCIgfSk7XG4gICAgfVxuICB9XG4gIG9uQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG4gICAgY29uc3QgYW5jaG9yID0gcGF0aC5maW5kKFxuICAgICAgKG5vZGUpID0+IG5vZGUgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiAobm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpPy5zdGFydHNXaXRoKFwiI1wiKSB8fCBub2RlLmdldEF0dHJpYnV0ZShcImhyZWZcIik/LnN0YXJ0c1dpdGgoXCIvI1wiKSB8fCBub2RlLmdldEF0dHJpYnV0ZShcImhyZWZcIik/LnN0YXJ0c1dpdGgoXCIuLyNcIikpXG4gICAgKTtcbiAgICBpZiAoYW5jaG9yKSB7XG4gICAgICBjb25zdCBpZCA9IGFuY2hvci5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgdGhpcy5vcHRpb25zLmFuY2hvcnMgPT09IFwib2JqZWN0XCIgJiYgdGhpcy5vcHRpb25zLmFuY2hvcnMgPyB0aGlzLm9wdGlvbnMuYW5jaG9ycyA6IHZvaWQgMDtcbiAgICAgICAgbGV0IHRhcmdldCA9IGAjJHtpZC5zcGxpdChcIiNcIilbMV19YDtcbiAgICAgICAgaWYgKFtcIiNcIiwgXCIvI1wiLCBcIi4vI1wiLCBcIiN0b3BcIiwgXCIvI3RvcFwiLCBcIi4vI3RvcFwiXS5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICB0YXJnZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Nyb2xsVG8odGFyZ2V0LCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIG9uUG9pbnRlckRvd24gPSAoZXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAxKSB7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICB9O1xuICBvblZpcnR1YWxTY3JvbGwgPSAoZGF0YSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwgPT09IFwiZnVuY3Rpb25cIiAmJiB0aGlzLm9wdGlvbnMudmlydHVhbFNjcm9sbChkYXRhKSA9PT0gZmFsc2UpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSwgZXZlbnQgfSA9IGRhdGE7XG4gICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJ2aXJ0dWFsLXNjcm9sbFwiLCB7IGRlbHRhWCwgZGVsdGFZLCBldmVudCB9KTtcbiAgICBpZiAoZXZlbnQuY3RybEtleSkgcmV0dXJuO1xuICAgIGlmIChldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbikgcmV0dXJuO1xuICAgIGNvbnN0IGlzVG91Y2ggPSBldmVudC50eXBlLmluY2x1ZGVzKFwidG91Y2hcIik7XG4gICAgY29uc3QgaXNXaGVlbCA9IGV2ZW50LnR5cGUuaW5jbHVkZXMoXCJ3aGVlbFwiKTtcbiAgICB0aGlzLmlzVG91Y2hpbmcgPSBldmVudC50eXBlID09PSBcInRvdWNoc3RhcnRcIiB8fCBldmVudC50eXBlID09PSBcInRvdWNobW92ZVwiO1xuICAgIGNvbnN0IGlzQ2xpY2tPclRhcCA9IGRlbHRhWCA9PT0gMCAmJiBkZWx0YVkgPT09IDA7XG4gICAgY29uc3QgaXNUYXBUb1N0b3AgPSB0aGlzLm9wdGlvbnMuc3luY1RvdWNoICYmIGlzVG91Y2ggJiYgZXZlbnQudHlwZSA9PT0gXCJ0b3VjaHN0YXJ0XCIgJiYgaXNDbGlja09yVGFwICYmICF0aGlzLmlzU3RvcHBlZCAmJiAhdGhpcy5pc0xvY2tlZDtcbiAgICBpZiAoaXNUYXBUb1N0b3ApIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNVbmtub3duR2VzdHVyZSA9IHRoaXMub3B0aW9ucy5nZXN0dXJlT3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiAmJiBkZWx0YVkgPT09IDAgfHwgdGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgJiYgZGVsdGFYID09PSAwO1xuICAgIGlmIChpc0NsaWNrT3JUYXAgfHwgaXNVbmtub3duR2VzdHVyZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY29tcG9zZWRQYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG4gICAgY29tcG9zZWRQYXRoID0gY29tcG9zZWRQYXRoLnNsaWNlKDAsIGNvbXBvc2VkUGF0aC5pbmRleE9mKHRoaXMucm9vdEVsZW1lbnQpKTtcbiAgICBjb25zdCBwcmV2ZW50ID0gdGhpcy5vcHRpb25zLnByZXZlbnQ7XG4gICAgaWYgKCEhY29tcG9zZWRQYXRoLmZpbmQoXG4gICAgICAobm9kZSkgPT4gbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmICh0eXBlb2YgcHJldmVudCA9PT0gXCJmdW5jdGlvblwiICYmIHByZXZlbnQ/Lihub2RlKSB8fCBub2RlLmhhc0F0dHJpYnV0ZT8uKFwiZGF0YS1sZW5pcy1wcmV2ZW50XCIpIHx8IGlzVG91Y2ggJiYgbm9kZS5oYXNBdHRyaWJ1dGU/LihcImRhdGEtbGVuaXMtcHJldmVudC10b3VjaFwiKSB8fCBpc1doZWVsICYmIG5vZGUuaGFzQXR0cmlidXRlPy4oXCJkYXRhLWxlbmlzLXByZXZlbnQtd2hlZWxcIikgfHwgdGhpcy5vcHRpb25zLmFsbG93TmVzdGVkU2Nyb2xsICYmIHRoaXMuY2hlY2tOZXN0ZWRTY3JvbGwobm9kZSwgeyBkZWx0YVgsIGRlbHRhWSB9KSlcbiAgICApKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzU3RvcHBlZCB8fCB0aGlzLmlzTG9ja2VkKSB7XG4gICAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc1Ntb290aCA9IHRoaXMub3B0aW9ucy5zeW5jVG91Y2ggJiYgaXNUb3VjaCB8fCB0aGlzLm9wdGlvbnMuc21vb3RoV2hlZWwgJiYgaXNXaGVlbDtcbiAgICBpZiAoIWlzU21vb3RoKSB7XG4gICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gXCJuYXRpdmVcIjtcbiAgICAgIHRoaXMuYW5pbWF0ZS5zdG9wKCk7XG4gICAgICBldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkZWx0YSA9IGRlbHRhWTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbiA9PT0gXCJib3RoXCIpIHtcbiAgICAgIGRlbHRhID0gTWF0aC5hYnMoZGVsdGFZKSA+IE1hdGguYWJzKGRlbHRhWCkgPyBkZWx0YVkgOiBkZWx0YVg7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIikge1xuICAgICAgZGVsdGEgPSBkZWx0YVg7XG4gICAgfVxuICAgIGlmICghdGhpcy5vcHRpb25zLm92ZXJzY3JvbGwgfHwgdGhpcy5vcHRpb25zLmluZmluaXRlIHx8IHRoaXMub3B0aW9ucy53cmFwcGVyICE9PSB3aW5kb3cgJiYgdGhpcy5saW1pdCA+IDAgJiYgKHRoaXMuYW5pbWF0ZWRTY3JvbGwgPiAwICYmIHRoaXMuYW5pbWF0ZWRTY3JvbGwgPCB0aGlzLmxpbWl0IHx8IHRoaXMuYW5pbWF0ZWRTY3JvbGwgPT09IDAgJiYgZGVsdGFZID4gMCB8fCB0aGlzLmFuaW1hdGVkU2Nyb2xsID09PSB0aGlzLmxpbWl0ICYmIGRlbHRhWSA8IDApKSB7XG4gICAgICBldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgfVxuICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBjb25zdCBpc1N5bmNUb3VjaCA9IGlzVG91Y2ggJiYgdGhpcy5vcHRpb25zLnN5bmNUb3VjaDtcbiAgICBjb25zdCBpc1RvdWNoRW5kID0gaXNUb3VjaCAmJiBldmVudC50eXBlID09PSBcInRvdWNoZW5kXCI7XG4gICAgY29uc3QgaGFzVG91Y2hJbmVydGlhID0gaXNUb3VjaEVuZDtcbiAgICBpZiAoaGFzVG91Y2hJbmVydGlhKSB7XG4gICAgICBkZWx0YSA9IE1hdGguc2lnbih0aGlzLnZlbG9jaXR5KSAqIE1hdGgucG93KE1hdGguYWJzKHRoaXMudmVsb2NpdHkpLCB0aGlzLm9wdGlvbnMudG91Y2hJbmVydGlhRXhwb25lbnQpO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbFRvKHRoaXMudGFyZ2V0U2Nyb2xsICsgZGVsdGEsIHtcbiAgICAgIHByb2dyYW1tYXRpYzogZmFsc2UsXG4gICAgICAuLi5pc1N5bmNUb3VjaCA/IHtcbiAgICAgICAgbGVycDogaGFzVG91Y2hJbmVydGlhID8gdGhpcy5vcHRpb25zLnN5bmNUb3VjaExlcnAgOiAxXG4gICAgICAgIC8vIGltbWVkaWF0ZTogIWhhc1RvdWNoSW5lcnRpYSxcbiAgICAgIH0gOiB7XG4gICAgICAgIGxlcnA6IHRoaXMub3B0aW9ucy5sZXJwLFxuICAgICAgICBkdXJhdGlvbjogdGhpcy5vcHRpb25zLmR1cmF0aW9uLFxuICAgICAgICBlYXNpbmc6IHRoaXMub3B0aW9ucy5lYXNpbmdcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIEZvcmNlIGxlbmlzIHRvIHJlY2FsY3VsYXRlIHRoZSBkaW1lbnNpb25zXG4gICAqL1xuICByZXNpemUoKSB7XG4gICAgdGhpcy5kaW1lbnNpb25zLnJlc2l6ZSgpO1xuICAgIHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB0aGlzLnRhcmdldFNjcm9sbCA9IHRoaXMuYWN0dWFsU2Nyb2xsO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG4gIGVtaXQoKSB7XG4gICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJzY3JvbGxcIiwgdGhpcyk7XG4gIH1cbiAgb25OYXRpdmVTY3JvbGwgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuX3Jlc2V0VmVsb2NpdHlUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzZXRWZWxvY2l0eVRpbWVvdXQpO1xuICAgICAgdGhpcy5fcmVzZXRWZWxvY2l0eVRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCkge1xuICAgICAgdGhpcy5fcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1Njcm9sbGluZyA9PT0gZmFsc2UgfHwgdGhpcy5pc1Njcm9sbGluZyA9PT0gXCJuYXRpdmVcIikge1xuICAgICAgY29uc3QgbGFzdFNjcm9sbCA9IHRoaXMuYW5pbWF0ZWRTY3JvbGw7XG4gICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdGhpcy50YXJnZXRTY3JvbGwgPSB0aGlzLmFjdHVhbFNjcm9sbDtcbiAgICAgIHRoaXMubGFzdFZlbG9jaXR5ID0gdGhpcy52ZWxvY2l0eTtcbiAgICAgIHRoaXMudmVsb2NpdHkgPSB0aGlzLmFuaW1hdGVkU2Nyb2xsIC0gbGFzdFNjcm9sbDtcbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gTWF0aC5zaWduKFxuICAgICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsIC0gbGFzdFNjcm9sbFxuICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IFwibmF0aXZlXCI7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXQoKTtcbiAgICAgIGlmICh0aGlzLnZlbG9jaXR5ICE9PSAwKSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0VmVsb2NpdHlUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sYXN0VmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5O1xuICAgICAgICAgIHRoaXMudmVsb2NpdHkgPSAwO1xuICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmVtaXQoKTtcbiAgICAgICAgfSwgNDAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJlc2V0KCkge1xuICAgIHRoaXMuaXNMb2NrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hY3R1YWxTY3JvbGw7XG4gICAgdGhpcy5sYXN0VmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5ID0gMDtcbiAgICB0aGlzLmFuaW1hdGUuc3RvcCgpO1xuICB9XG4gIC8qKlxuICAgKiBTdGFydCBsZW5pcyBzY3JvbGwgYWZ0ZXIgaXQgaGFzIGJlZW4gc3RvcHBlZFxuICAgKi9cbiAgc3RhcnQoKSB7XG4gICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1RvZ2dsZSkge1xuICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcIm92ZXJmbG93XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmludGVybmFsU3RhcnQoKTtcbiAgfVxuICBpbnRlcm5hbFN0YXJ0KCkge1xuICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuICAvKipcbiAgICogU3RvcCBsZW5pcyBzY3JvbGxcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgaWYgKHRoaXMuaXNTdG9wcGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSB7XG4gICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwib3ZlcmZsb3dcIiwgXCJjbGlwXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmludGVybmFsU3RvcCgpO1xuICB9XG4gIGludGVybmFsU3RvcCgpIHtcbiAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgZm9yIGxlbmlzXG4gICAqXG4gICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIGluIG1zIGZyb20gYW4gZXh0ZXJuYWwgY2xvY2sgbGlrZSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBvciBUZW1wdXNcbiAgICovXG4gIHJhZiA9ICh0aW1lKSA9PiB7XG4gICAgY29uc3QgZGVsdGFUaW1lID0gdGltZSAtICh0aGlzLnRpbWUgfHwgdGltZSk7XG4gICAgdGhpcy50aW1lID0gdGltZTtcbiAgICB0aGlzLmFuaW1hdGUuYWR2YW5jZShkZWx0YVRpbWUgKiAxZS0zKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9SYWYpIHtcbiAgICAgIHRoaXMuX19yYWZJRCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJhZik7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogU2Nyb2xsIHRvIGEgdGFyZ2V0IHZhbHVlXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB2YWx1ZSB0byBzY3JvbGwgdG9cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBzY3JvbGxcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbGVuaXMuc2Nyb2xsVG8oMTAwLCB7XG4gICAqICAgb2Zmc2V0OiAxMDAsXG4gICAqICAgZHVyYXRpb246IDEsXG4gICAqICAgZWFzaW5nOiAodCkgPT4gMSAtIE1hdGguY29zKCh0ICogTWF0aC5QSSkgLyAyKSxcbiAgICogICBsZXJwOiAwLjEsXG4gICAqICAgb25TdGFydDogKCkgPT4ge1xuICAgKiAgICAgY29uc29sZS5sb2coJ29uU3RhcnQnKVxuICAgKiAgIH0sXG4gICAqICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgKiAgICAgY29uc29sZS5sb2coJ29uQ29tcGxldGUnKVxuICAgKiAgIH0sXG4gICAqIH0pXG4gICAqL1xuICBzY3JvbGxUbyh0YXJnZXQsIHtcbiAgICBvZmZzZXQgPSAwLFxuICAgIGltbWVkaWF0ZSA9IGZhbHNlLFxuICAgIGxvY2sgPSBmYWxzZSxcbiAgICBkdXJhdGlvbiA9IHRoaXMub3B0aW9ucy5kdXJhdGlvbixcbiAgICBlYXNpbmcgPSB0aGlzLm9wdGlvbnMuZWFzaW5nLFxuICAgIGxlcnA6IGxlcnAyID0gdGhpcy5vcHRpb25zLmxlcnAsXG4gICAgb25TdGFydCxcbiAgICBvbkNvbXBsZXRlLFxuICAgIGZvcmNlID0gZmFsc2UsXG4gICAgLy8gc2Nyb2xsIGV2ZW4gaWYgc3RvcHBlZFxuICAgIHByb2dyYW1tYXRpYyA9IHRydWUsXG4gICAgLy8gY2FsbGVkIGZyb20gb3V0c2lkZSBvZiB0aGUgY2xhc3NcbiAgICB1c2VyRGF0YVxuICB9ID0ge30pIHtcbiAgICBpZiAoKHRoaXMuaXNTdG9wcGVkIHx8IHRoaXMuaXNMb2NrZWQpICYmICFmb3JjZSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiICYmIFtcInRvcFwiLCBcImxlZnRcIiwgXCJzdGFydFwiXS5pbmNsdWRlcyh0YXJnZXQpKSB7XG4gICAgICB0YXJnZXQgPSAwO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIiAmJiBbXCJib3R0b21cIiwgXCJyaWdodFwiLCBcImVuZFwiXS5pbmNsdWRlcyh0YXJnZXQpKSB7XG4gICAgICB0YXJnZXQgPSB0aGlzLmxpbWl0O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbm9kZTtcbiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldD8ubm9kZVR5cGUpIHtcbiAgICAgICAgbm9kZSA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMud3JhcHBlciAhPT0gd2luZG93KSB7XG4gICAgICAgICAgY29uc3Qgd3JhcHBlclJlY3QgPSB0aGlzLnJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIG9mZnNldCAtPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHdyYXBwZXJSZWN0LmxlZnQgOiB3cmFwcGVyUmVjdC50b3A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRhcmdldCA9ICh0aGlzLmlzSG9yaXpvbnRhbCA/IHJlY3QubGVmdCA6IHJlY3QudG9wKSArIHRoaXMuYW5pbWF0ZWRTY3JvbGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSBcIm51bWJlclwiKSByZXR1cm47XG4gICAgdGFyZ2V0ICs9IG9mZnNldDtcbiAgICB0YXJnZXQgPSBNYXRoLnJvdW5kKHRhcmdldCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbmZpbml0ZSkge1xuICAgICAgaWYgKHByb2dyYW1tYXRpYykge1xuICAgICAgICB0aGlzLnRhcmdldFNjcm9sbCA9IHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB0aGlzLnNjcm9sbDtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSB0YXJnZXQgLSB0aGlzLmFuaW1hdGVkU2Nyb2xsO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPiB0aGlzLmxpbWl0IC8gMikge1xuICAgICAgICAgIHRhcmdldCA9IHRhcmdldCAtIHRoaXMubGltaXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPCAtdGhpcy5saW1pdCAvIDIpIHtcbiAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQgKyB0aGlzLmxpbWl0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldCA9IGNsYW1wKDAsIHRhcmdldCwgdGhpcy5saW1pdCk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQgPT09IHRoaXMudGFyZ2V0U2Nyb2xsKSB7XG4gICAgICBvblN0YXJ0Py4odGhpcyk7XG4gICAgICBvbkNvbXBsZXRlPy4odGhpcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXNlckRhdGEgPSB1c2VyRGF0YSA/PyB7fTtcbiAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdGhpcy50YXJnZXRTY3JvbGwgPSB0YXJnZXQ7XG4gICAgICB0aGlzLnNldFNjcm9sbCh0aGlzLnNjcm9sbCk7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICB0aGlzLnByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQoKTtcbiAgICAgIHRoaXMuZW1pdCgpO1xuICAgICAgb25Db21wbGV0ZT8uKHRoaXMpO1xuICAgICAgdGhpcy51c2VyRGF0YSA9IHt9O1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaFNjcm9sbGVuZEV2ZW50KCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFwcm9ncmFtbWF0aWMpIHtcbiAgICAgIHRoaXMudGFyZ2V0U2Nyb2xsID0gdGFyZ2V0O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGR1cmF0aW9uID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBlYXNpbmcgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZWFzaW5nID0gZGVmYXVsdEVhc2luZztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlYXNpbmcgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZHVyYXRpb24gIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGR1cmF0aW9uID0gMTtcbiAgICB9XG4gICAgdGhpcy5hbmltYXRlLmZyb21Ubyh0aGlzLmFuaW1hdGVkU2Nyb2xsLCB0YXJnZXQsIHtcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgZWFzaW5nLFxuICAgICAgbGVycDogbGVycDIsXG4gICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICAgIGlmIChsb2NrKSB0aGlzLmlzTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IFwic21vb3RoXCI7XG4gICAgICAgIG9uU3RhcnQ/Lih0aGlzKTtcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZTogKHZhbHVlLCBjb21wbGV0ZWQpID0+IHtcbiAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IFwic21vb3RoXCI7XG4gICAgICAgIHRoaXMubGFzdFZlbG9jaXR5ID0gdGhpcy52ZWxvY2l0eTtcbiAgICAgICAgdGhpcy52ZWxvY2l0eSA9IHZhbHVlIC0gdGhpcy5hbmltYXRlZFNjcm9sbDtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBNYXRoLnNpZ24odGhpcy52ZWxvY2l0eSk7XG4gICAgICAgIHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXRTY3JvbGwodGhpcy5zY3JvbGwpO1xuICAgICAgICBpZiAocHJvZ3JhbW1hdGljKSB7XG4gICAgICAgICAgdGhpcy50YXJnZXRTY3JvbGwgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbXBsZXRlZCkgdGhpcy5lbWl0KCk7XG4gICAgICAgIGlmIChjb21wbGV0ZWQpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgdGhpcy5lbWl0KCk7XG4gICAgICAgICAgb25Db21wbGV0ZT8uKHRoaXMpO1xuICAgICAgICAgIHRoaXMudXNlckRhdGEgPSB7fTtcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaFNjcm9sbGVuZEV2ZW50KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50KCkge1xuICAgIHRoaXMuX3ByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQgPSB0cnVlO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLl9wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50ID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgY2hlY2tOZXN0ZWRTY3JvbGwobm9kZSwgeyBkZWx0YVgsIGRlbHRhWSB9KSB7XG4gICAgY29uc3QgdGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgY2FjaGUgPSBub2RlLl9sZW5pcyA/Pz0ge307XG4gICAgbGV0IGhhc092ZXJmbG93WCwgaGFzT3ZlcmZsb3dZLCBpc1Njcm9sbGFibGVYLCBpc1Njcm9sbGFibGVZLCBzY3JvbGxXaWR0aCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IGdlc3R1cmVPcmllbnRhdGlvbiA9IHRoaXMub3B0aW9ucy5nZXN0dXJlT3JpZW50YXRpb247XG4gICAgaWYgKHRpbWUgLSAoY2FjaGUudGltZSA/PyAwKSA+IDJlMykge1xuICAgICAgY2FjaGUudGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgICBjYWNoZS5jb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZTtcbiAgICAgIGNvbnN0IG92ZXJmbG93WFN0cmluZyA9IGNvbXB1dGVkU3R5bGUub3ZlcmZsb3dYO1xuICAgICAgY29uc3Qgb3ZlcmZsb3dZU3RyaW5nID0gY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG4gICAgICBoYXNPdmVyZmxvd1ggPSBbXCJhdXRvXCIsIFwib3ZlcmxheVwiLCBcInNjcm9sbFwiXS5pbmNsdWRlcyhvdmVyZmxvd1hTdHJpbmcpO1xuICAgICAgaGFzT3ZlcmZsb3dZID0gW1wiYXV0b1wiLCBcIm92ZXJsYXlcIiwgXCJzY3JvbGxcIl0uaW5jbHVkZXMob3ZlcmZsb3dZU3RyaW5nKTtcbiAgICAgIGNhY2hlLmhhc092ZXJmbG93WCA9IGhhc092ZXJmbG93WDtcbiAgICAgIGNhY2hlLmhhc092ZXJmbG93WSA9IGhhc092ZXJmbG93WTtcbiAgICAgIGlmICghaGFzT3ZlcmZsb3dYICYmICFoYXNPdmVyZmxvd1kpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChnZXN0dXJlT3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiAmJiAhaGFzT3ZlcmZsb3dZKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiAmJiAhaGFzT3ZlcmZsb3dYKSByZXR1cm4gZmFsc2U7XG4gICAgICBzY3JvbGxXaWR0aCA9IG5vZGUuc2Nyb2xsV2lkdGg7XG4gICAgICBzY3JvbGxIZWlnaHQgPSBub2RlLnNjcm9sbEhlaWdodDtcbiAgICAgIGNsaWVudFdpZHRoID0gbm9kZS5jbGllbnRXaWR0aDtcbiAgICAgIGNsaWVudEhlaWdodCA9IG5vZGUuY2xpZW50SGVpZ2h0O1xuICAgICAgaXNTY3JvbGxhYmxlWCA9IHNjcm9sbFdpZHRoID4gY2xpZW50V2lkdGg7XG4gICAgICBpc1Njcm9sbGFibGVZID0gc2Nyb2xsSGVpZ2h0ID4gY2xpZW50SGVpZ2h0O1xuICAgICAgY2FjaGUuaXNTY3JvbGxhYmxlWCA9IGlzU2Nyb2xsYWJsZVg7XG4gICAgICBjYWNoZS5pc1Njcm9sbGFibGVZID0gaXNTY3JvbGxhYmxlWTtcbiAgICAgIGNhY2hlLnNjcm9sbFdpZHRoID0gc2Nyb2xsV2lkdGg7XG4gICAgICBjYWNoZS5zY3JvbGxIZWlnaHQgPSBzY3JvbGxIZWlnaHQ7XG4gICAgICBjYWNoZS5jbGllbnRXaWR0aCA9IGNsaWVudFdpZHRoO1xuICAgICAgY2FjaGUuY2xpZW50SGVpZ2h0ID0gY2xpZW50SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpc1Njcm9sbGFibGVYID0gY2FjaGUuaXNTY3JvbGxhYmxlWDtcbiAgICAgIGlzU2Nyb2xsYWJsZVkgPSBjYWNoZS5pc1Njcm9sbGFibGVZO1xuICAgICAgaGFzT3ZlcmZsb3dYID0gY2FjaGUuaGFzT3ZlcmZsb3dYO1xuICAgICAgaGFzT3ZlcmZsb3dZID0gY2FjaGUuaGFzT3ZlcmZsb3dZO1xuICAgICAgc2Nyb2xsV2lkdGggPSBjYWNoZS5zY3JvbGxXaWR0aDtcbiAgICAgIHNjcm9sbEhlaWdodCA9IGNhY2hlLnNjcm9sbEhlaWdodDtcbiAgICAgIGNsaWVudFdpZHRoID0gY2FjaGUuY2xpZW50V2lkdGg7XG4gICAgICBjbGllbnRIZWlnaHQgPSBjYWNoZS5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIGlmICghaGFzT3ZlcmZsb3dYICYmICFoYXNPdmVyZmxvd1kgfHwgIWlzU2Nyb2xsYWJsZVggJiYgIWlzU2Nyb2xsYWJsZVkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGdlc3R1cmVPcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiICYmICghaGFzT3ZlcmZsb3dZIHx8ICFpc1Njcm9sbGFibGVZKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiAmJiAoIWhhc092ZXJmbG93WCB8fCAhaXNTY3JvbGxhYmxlWCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IG9yaWVudGF0aW9uO1xuICAgIGlmIChnZXN0dXJlT3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICBvcmllbnRhdGlvbiA9IFwieFwiO1xuICAgIH0gZWxzZSBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcbiAgICAgIG9yaWVudGF0aW9uID0gXCJ5XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzU2Nyb2xsaW5nWCA9IGRlbHRhWCAhPT0gMDtcbiAgICAgIGNvbnN0IGlzU2Nyb2xsaW5nWSA9IGRlbHRhWSAhPT0gMDtcbiAgICAgIGlmIChpc1Njcm9sbGluZ1ggJiYgaGFzT3ZlcmZsb3dYICYmIGlzU2Nyb2xsYWJsZVgpIHtcbiAgICAgICAgb3JpZW50YXRpb24gPSBcInhcIjtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Njcm9sbGluZ1kgJiYgaGFzT3ZlcmZsb3dZICYmIGlzU2Nyb2xsYWJsZVkpIHtcbiAgICAgICAgb3JpZW50YXRpb24gPSBcInlcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFvcmllbnRhdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzY3JvbGwsIG1heFNjcm9sbCwgZGVsdGEsIGhhc092ZXJmbG93LCBpc1Njcm9sbGFibGU7XG4gICAgaWYgKG9yaWVudGF0aW9uID09PSBcInhcIikge1xuICAgICAgc2Nyb2xsID0gbm9kZS5zY3JvbGxMZWZ0O1xuICAgICAgbWF4U2Nyb2xsID0gc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aDtcbiAgICAgIGRlbHRhID0gZGVsdGFYO1xuICAgICAgaGFzT3ZlcmZsb3cgPSBoYXNPdmVyZmxvd1g7XG4gICAgICBpc1Njcm9sbGFibGUgPSBpc1Njcm9sbGFibGVYO1xuICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT09IFwieVwiKSB7XG4gICAgICBzY3JvbGwgPSBub2RlLnNjcm9sbFRvcDtcbiAgICAgIG1heFNjcm9sbCA9IHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodDtcbiAgICAgIGRlbHRhID0gZGVsdGFZO1xuICAgICAgaGFzT3ZlcmZsb3cgPSBoYXNPdmVyZmxvd1k7XG4gICAgICBpc1Njcm9sbGFibGUgPSBpc1Njcm9sbGFibGVZO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHdpbGxTY3JvbGwgPSBkZWx0YSA+IDAgPyBzY3JvbGwgPCBtYXhTY3JvbGwgOiBzY3JvbGwgPiAwO1xuICAgIHJldHVybiB3aWxsU2Nyb2xsICYmIGhhc092ZXJmbG93ICYmIGlzU2Nyb2xsYWJsZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJvb3QgZWxlbWVudCBvbiB3aGljaCBsZW5pcyBpcyBpbnN0YW5jZWRcbiAgICovXG4gIGdldCByb290RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyYXBwZXIgPT09IHdpbmRvdyA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA6IHRoaXMub3B0aW9ucy53cmFwcGVyO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGltaXQgd2hpY2ggaXMgdGhlIG1heGltdW0gc2Nyb2xsIHZhbHVlXG4gICAqL1xuICBnZXQgbGltaXQoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5fX2V4cGVyaW1lbnRhbF9fbmFpdmVEaW1lbnNpb25zKSB7XG4gICAgICBpZiAodGhpcy5pc0hvcml6b250YWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdEVsZW1lbnQuc2Nyb2xsV2lkdGggLSB0aGlzLnJvb3RFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5yb290RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbnMubGltaXRbdGhpcy5pc0hvcml6b250YWwgPyBcInhcIiA6IFwieVwiXTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBzY3JvbGwgaXMgaG9yaXpvbnRhbFxuICAgKi9cbiAgZ2V0IGlzSG9yaXpvbnRhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIjtcbiAgfVxuICAvKipcbiAgICogVGhlIGFjdHVhbCBzY3JvbGwgdmFsdWVcbiAgICovXG4gIGdldCBhY3R1YWxTY3JvbGwoKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMub3B0aW9ucy53cmFwcGVyO1xuICAgIHJldHVybiB0aGlzLmlzSG9yaXpvbnRhbCA/IHdyYXBwZXIuc2Nyb2xsWCA/PyB3cmFwcGVyLnNjcm9sbExlZnQgOiB3cmFwcGVyLnNjcm9sbFkgPz8gd3JhcHBlci5zY3JvbGxUb3A7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHNjcm9sbCB2YWx1ZVxuICAgKi9cbiAgZ2V0IHNjcm9sbCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmluZmluaXRlID8gbW9kdWxvKHRoaXMuYW5pbWF0ZWRTY3JvbGwsIHRoaXMubGltaXQpIDogdGhpcy5hbmltYXRlZFNjcm9sbDtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb2dyZXNzIG9mIHRoZSBzY3JvbGwgcmVsYXRpdmUgdG8gdGhlIGxpbWl0XG4gICAqL1xuICBnZXQgcHJvZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMubGltaXQgPT09IDAgPyAxIDogdGhpcy5zY3JvbGwgLyB0aGlzLmxpbWl0O1xuICB9XG4gIC8qKlxuICAgKiBDdXJyZW50IHNjcm9sbCBzdGF0ZVxuICAgKi9cbiAgZ2V0IGlzU2Nyb2xsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Njcm9sbGluZztcbiAgfVxuICBzZXQgaXNTY3JvbGxpbmcodmFsdWUpIHtcbiAgICBpZiAodGhpcy5faXNTY3JvbGxpbmcgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9pc1Njcm9sbGluZyA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVDbGFzc05hbWUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrIGlmIGxlbmlzIGlzIHN0b3BwZWRcbiAgICovXG4gIGdldCBpc1N0b3BwZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RvcHBlZDtcbiAgfVxuICBzZXQgaXNTdG9wcGVkKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuX2lzU3RvcHBlZCAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX2lzU3RvcHBlZCA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVDbGFzc05hbWUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrIGlmIGxlbmlzIGlzIGxvY2tlZFxuICAgKi9cbiAgZ2V0IGlzTG9ja2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0xvY2tlZDtcbiAgfVxuICBzZXQgaXNMb2NrZWQodmFsdWUpIHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9pc0xvY2tlZCA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVDbGFzc05hbWUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrIGlmIGxlbmlzIGlzIHNtb290aCBzY3JvbGxpbmdcbiAgICovXG4gIGdldCBpc1Ntb290aCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1Njcm9sbGluZyA9PT0gXCJzbW9vdGhcIjtcbiAgfVxuICAvKipcbiAgICogVGhlIGNsYXNzIG5hbWUgYXBwbGllZCB0byB0aGUgd3JhcHBlciBlbGVtZW50XG4gICAqL1xuICBnZXQgY2xhc3NOYW1lKCkge1xuICAgIGxldCBjbGFzc05hbWUgPSBcImxlbmlzXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSBjbGFzc05hbWUgKz0gXCIgbGVuaXMtYXV0b1RvZ2dsZVwiO1xuICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgY2xhc3NOYW1lICs9IFwiIGxlbmlzLXN0b3BwZWRcIjtcbiAgICBpZiAodGhpcy5pc0xvY2tlZCkgY2xhc3NOYW1lICs9IFwiIGxlbmlzLWxvY2tlZFwiO1xuICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nKSBjbGFzc05hbWUgKz0gXCIgbGVuaXMtc2Nyb2xsaW5nXCI7XG4gICAgaWYgKHRoaXMuaXNTY3JvbGxpbmcgPT09IFwic21vb3RoXCIpIGNsYXNzTmFtZSArPSBcIiBsZW5pcy1zbW9vdGhcIjtcbiAgICByZXR1cm4gY2xhc3NOYW1lO1xuICB9XG4gIHVwZGF0ZUNsYXNzTmFtZSgpIHtcbiAgICB0aGlzLmNsZWFuVXBDbGFzc05hbWUoKTtcbiAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTmFtZSA9IGAke3RoaXMucm9vdEVsZW1lbnQuY2xhc3NOYW1lfSAke3RoaXMuY2xhc3NOYW1lfWAudHJpbSgpO1xuICB9XG4gIGNsZWFuVXBDbGFzc05hbWUoKSB7XG4gICAgdGhpcy5yb290RWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC9sZW5pcygtXFx3Kyk/L2csIFwiXCIpLnRyaW0oKTtcbiAgfVxufTtcbmV4cG9ydCB7XG4gIExlbmlzIGFzIGRlZmF1bHRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZW5pcy5tanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/lenis/dist/lenis.mjs\n");
|
|
|
|
/***/ })
|
|
|
|
};
|
|
; |