@wix/interact 2.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -14
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/react.js +2 -2
- package/dist/cjs/react.js.map +1 -1
- package/dist/cjs/web.js +1 -1
- package/dist/cjs/web.js.map +1 -1
- package/dist/es/index.js +1 -1
- package/dist/es/react.js +2 -2
- package/dist/es/web.js +2 -2
- package/dist/es/web.js.map +1 -1
- package/dist/{index-BnI6W-7u.mjs → index-BfcN_rkn.mjs} +864 -838
- package/dist/index-BfcN_rkn.mjs.map +1 -0
- package/dist/index-HXLBEIjG.js +18 -0
- package/dist/index-HXLBEIjG.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/handlers/constants.d.ts +13 -0
- package/dist/types/handlers/constants.d.ts.map +1 -0
- package/dist/types/handlers/effectHandlers.d.ts +6 -0
- package/dist/types/handlers/effectHandlers.d.ts.map +1 -0
- package/dist/types/handlers/eventTrigger.d.ts +9 -0
- package/dist/types/handlers/eventTrigger.d.ts.map +1 -0
- package/dist/types/handlers/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +10 -0
- package/dist/types/types.d.ts.map +1 -1
- package/docs/README.md +1 -1
- package/package.json +3 -3
- package/dist/index-BnI6W-7u.mjs.map +0 -1
- package/dist/index-emAFXYqb.js +0 -18
- package/dist/index-emAFXYqb.js.map +0 -1
- package/dist/types/handlers/click.d.ts +0 -9
- package/dist/types/handlers/click.d.ts.map +0 -1
- package/dist/types/handlers/hover.d.ts +0 -9
- package/dist/types/handlers/hover.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-HXLBEIjG.js","sources":["../src/core/utilities.ts","../../motion/src/AnimationGroup.ts","../../motion/src/easings.ts","../../motion/src/utils.ts","../../motion/src/CustomAnimation.ts","../../../node_modules/fastdom/fastdom.js","../../motion/src/api/registry.ts","../../motion/src/api/common.ts","../../motion/src/api/webAnimations.ts","../../motion/src/api/prepare.ts","../../motion/src/motion.ts","../src/utils.ts","../src/handlers/utilities.ts","../src/handlers/viewEnter.ts","../../../node_modules/fizban/src/utilities.js","../../../node_modules/fizban/src/view.js","../../../node_modules/fizban/src/controller.js","../../../node_modules/fizban/src/Scroll.js","../src/handlers/viewProgress.ts","../../../node_modules/kuliso/src/utilities.js","../../../node_modules/kuliso/src/scrollend.js","../../../node_modules/kuliso/src/controller.js","../../../node_modules/kuliso/src/Pointer.js","../src/handlers/pointerMove.ts","../src/handlers/animationEnd.ts","../src/handlers/effectHandlers.ts","../src/handlers/eventTrigger.ts","../src/handlers/constants.ts","../src/handlers/index.ts","../src/core/Interact.ts","../src/core/add.ts","../src/core/remove.ts","../src/core/InteractionController.ts","../src/dom/api.ts","../src/core/css.ts"],"sourcesContent":["export function _processKeysForInterpolation(key: string) {\n return [...key.matchAll(/\\[([-\\w]+)]/g)].map(([_, _instanceKey]) => _instanceKey);\n}\n\n// TODO: currently only supports simple one-to-one mapping, e.g. item[0] -> item[0], item[1] -> item[1]\nexport function getInterpolatedKey(template: string, key: string) {\n const keys = _processKeysForInterpolation(key);\n let index = 0;\n return keys.length\n ? template.replace(/\\[]/g, () => {\n const k = keys[index++];\n return k !== undefined ? `[${k}]` : '[]';\n })\n : template;\n}\n","import { AnimationGroupOptions, RangeOffset } from './types';\n\n/**\n * @class AnimationGroup\n *\n * A wrapper object for simulating a GroupEffect and managing multiple animations.\n * See: https://www.w3.org/TR/web-animations-2/#grouping-and-synchronization\n */\nexport class AnimationGroup {\n animations: (Animation & {\n start?: RangeOffset;\n end?: RangeOffset;\n })[];\n options?: AnimationGroupOptions;\n ready: Promise<void>;\n isCSS: boolean;\n\n constructor(animations: Animation[], options?: AnimationGroupOptions) {\n this.animations = animations;\n this.options = options;\n this.ready = options?.measured || Promise.resolve();\n this.isCSS = animations[0] instanceof CSSAnimation;\n }\n\n getProgress() {\n return this.animations[0]?.effect?.getComputedTiming().progress || 0;\n }\n\n async play(callback?: () => void): Promise<void> {\n await this.ready;\n\n for (const animation of this.animations) {\n animation.play();\n }\n\n // TODO: Wait for all animations to be ready, using allSettled to handle rejections gracefully\n // await Promise.allSettled(\n await Promise.all(this.animations.map((animation) => animation.ready));\n\n if (callback) {\n callback();\n }\n }\n\n pause() {\n for (const animation of this.animations) {\n animation.pause();\n }\n }\n\n async reverse(callback?: () => void): Promise<void> {\n await this.ready;\n\n for (const animation of this.animations) {\n animation.reverse();\n }\n\n // TODO: Wait for all animations to be ready, using allSettled to handle rejections gracefully\n // await Promise.allSettled(\n await Promise.all(this.animations.map((animation) => animation.ready));\n\n if (callback) {\n callback();\n }\n }\n\n progress(p: number) {\n for (const animation of this.animations) {\n const { delay, duration, iterations } = animation.effect!.getTiming();\n const time =\n (Number.isFinite(duration) ? (duration as number) : 0) *\n (Number.isFinite(iterations) ? (iterations as number) : 1);\n animation.currentTime = ((delay || 0) + time) * p;\n }\n }\n\n cancel() {\n for (const animation of this.animations) {\n animation.cancel();\n }\n }\n\n setPlaybackRate(rate: number) {\n for (const animation of this.animations) {\n animation.playbackRate = rate;\n }\n }\n\n async onFinish(callback: () => void): Promise<void> {\n try {\n await Promise.all(this.animations.map((animation) => animation.finished));\n\n const a = this.animations[0];\n\n if (a && !this.isCSS) {\n const target = (a.effect as KeyframeEffect)?.target;\n\n if (target) {\n const endEvent = new Event('animationend');\n target.dispatchEvent(endEvent);\n }\n }\n\n callback();\n } catch (_error) {\n console.warn('animation was interrupted - aborting onFinish callback - ', _error);\n }\n }\n\n get finished() {\n return Promise.all(this.animations.map((animation) => animation.finished));\n }\n\n get playState() {\n return this.animations[0]?.playState;\n }\n}\n","/**\n * @file Easing functions as defined by Robert Penner.\n * @example A playground I made https://codepen.io/tombigel/pen/eYLLVRg\n */\n\n/**\n * Linear easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const linear = (t: number) => t;\n\n/**\n * Sine-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const sineIn = (t: number) => 1 - Math.cos((t * Math.PI) / 2);\n\n/**\n * Sine-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const sineOut = (t: number) => Math.sin((t * Math.PI) / 2);\n\n/**\n * Sine-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const sineInOut = (t: number) => -(Math.cos(Math.PI * t) - 1) / 2;\n\n/**\n * Quadratic-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quadIn = (t: number) => t ** 2;\n\n/**\n * Quadratic-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quadOut = (t: number) => 1 - (1 - t) ** 2;\n\n/**\n * Quadratic-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quadInOut = (t: number) => (t < 0.5 ? 2 * t ** 2 : 1 - (-2 * t + 2) ** 2 / 2);\n\n/**\n * Cubic-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const cubicIn = (t: number) => t ** 3;\n\n/**\n * Cubic-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const cubicOut = (t: number) => 1 - (1 - t) ** 3;\n\n/**\n * Cubic-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const cubicInOut = (t: number) => (t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2);\n\n/**\n * Quartic-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quartIn = (t: number) => t ** 4;\n\n/**\n * Quartic-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quartOut = (t: number) => 1 - (1 - t) ** 4;\n\n/**\n * Quartic-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quartInOut = (t: number) => (t < 0.5 ? 8 * t ** 4 : 1 - (-2 * t + 2) ** 4 / 2);\n\n/**\n * Quintic-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quintIn = (t: number) => t ** 5;\n\n/**\n * Quintic-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quintOut = (t: number) => 1 - (1 - t) ** 5;\n\n/**\n * Quintic-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quintInOut = (t: number) => (t < 0.5 ? 16 * t ** 5 : 1 - (-2 * t + 2) ** 5 / 2);\n\n/**\n * Exponential-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const expoIn = (t: number) => (t === 0 ? 0 : 2 ** (10 * t - 10));\n\n/**\n * Exponential-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const expoOut = (t: number) => (t === 1 ? 1 : 1 - 2 ** (-10 * t));\n\n/**\n * Exponential-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const expoInOut = (t: number) =>\n t === 0 ? 0 : t === 1 ? 1 : t < 0.5 ? 2 ** (20 * t - 10) / 2 : (2 - 2 ** (-20 * t + 10)) / 2;\n\n/**\n * Circular-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const circIn = (t: number) => 1 - Math.sqrt(1 - t ** 2);\n\n/**\n * Circular-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const circOut = (t: number) => Math.sqrt(1 - (t - 1) ** 2);\n\n/**\n * Circular-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const circInOut = (t: number) =>\n t < 0.5 ? (1 - Math.sqrt(1 - 4 * t ** 2)) / 2 : (Math.sqrt(-(2 * t - 3) * (2 * t - 1)) + 1) / 2;\n\n/**\n * Back-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const backIn = (t: number) => 2.70158 * t ** 3 - 1.70158 * t ** 2;\n\n/**\n * Back-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const backOut = (t: number) => 1 + 2.70158 * (t - 1) ** 3 + 1.70158 * (t - 1) ** 2;\n\n/**\n * Back-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @param k - The back factor (optional, default is 1.70158 * 1.525).\n * @returns The eased value.\n */\nexport const backInOut = (t: number, k = 1.70158 * 1.525) =>\n t < 0.5\n ? ((2 * t) ** 2 * ((k + 1) * 2 * t - k)) / 2\n : ((2 * t - 2) ** 2 * ((k + 1) * (t * 2 - 2) + k) + 2) / 2;\n\nexport const jsEasings = {\n linear,\n sineIn,\n sineOut,\n sineInOut,\n quadIn,\n quadOut,\n quadInOut,\n cubicIn,\n cubicOut,\n cubicInOut,\n quartIn,\n quartOut,\n quartInOut,\n quintIn,\n quintOut,\n quintInOut,\n expoIn,\n expoOut,\n expoInOut,\n circIn,\n circOut,\n circInOut,\n backIn,\n backOut,\n backInOut,\n};\n\n/**\n * CSS cubic-bezier easings based on PostCSS Easings\n */\nexport const cssEasings = {\n linear: 'linear',\n ease: 'ease',\n easeIn: 'ease-in',\n easeOut: 'ease-out',\n easeInOut: 'ease-in-out',\n sineIn: 'cubic-bezier(0.47, 0, 0.745, 0.715)',\n sineOut: 'cubic-bezier(0.39, 0.575, 0.565, 1)',\n sineInOut: 'cubic-bezier(0.445, 0.05, 0.55, 0.95)',\n quadIn: 'cubic-bezier(0.55, 0.085, 0.68, 0.53)',\n quadOut: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n quadInOut: 'cubic-bezier(0.455, 0.03, 0.515, 0.955)',\n cubicIn: 'cubic-bezier(0.55, 0.055, 0.675, 0.19)',\n cubicOut: 'cubic-bezier(0.215, 0.61, 0.355, 1)',\n cubicInOut: 'cubic-bezier(0.645, 0.045, 0.355, 1)',\n quartIn: 'cubic-bezier(0.895, 0.03, 0.685, 0.22)',\n quartOut: 'cubic-bezier(0.165, 0.84, 0.44, 1)',\n quartInOut: 'cubic-bezier(0.77, 0, 0.175, 1)',\n quintIn: 'cubic-bezier(0.755, 0.05, 0.855, 0.06)',\n quintOut: 'cubic-bezier(0.23, 1, 0.32, 1)',\n quintInOut: 'cubic-bezier(0.86, 0, 0.07, 1)',\n expoIn: 'cubic-bezier(0.95, 0.05, 0.795, 0.035)',\n expoOut: 'cubic-bezier(0.19, 1, 0.22, 1)',\n expoInOut: 'cubic-bezier(1, 0, 0, 1)',\n circIn: 'cubic-bezier(0.6, 0.04, 0.98, 0.335)',\n circOut: 'cubic-bezier(0.075, 0.82, 0.165, 1)',\n circInOut: 'cubic-bezier(0.785, 0.135, 0.15, 0.86)',\n backIn: 'cubic-bezier(0.6, -0.28, 0.735, 0.045)',\n backOut: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',\n backInOut: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n} as const;\n","import { cssEasings, jsEasings } from './easings';\nexport function getCssUnits(unit: 'percentage' | string) {\n return unit === 'percentage' ? '%' : unit || 'px';\n}\n\nexport function getEasing(easing?: keyof typeof cssEasings | string): string {\n return easing ? cssEasings[easing as keyof typeof cssEasings] || easing : cssEasings.linear;\n}\n\nexport function getJsEasing(\n easing?: keyof typeof jsEasings | string,\n): ((t: number) => number) | undefined {\n return easing ? jsEasings[easing as keyof typeof jsEasings] : undefined;\n}\n","/**\n * @class CustomAnimation\n *\n * A wrapper object for Animation that mimics the same interface but implements CustomEffect that runs JS code instead of KeyframeEffect.\n * The class is implemented by holding an inner Animation object instead of inheritance due to some browsers not allowing extension of built-in objects.\n */\nexport class CustomAnimation {\n _animation: Animation;\n customEffect: (progress: number | null) => void;\n progress: number | null;\n _tickCbId: number | null;\n _finishHandler: (_: any) => void;\n\n constructor(\n customEffect: (element: Element | null, progress: number | null) => void,\n target: Element | null,\n effectOptions: KeyframeEffectOptions,\n timingOptions: { timeline?: AnimationTimeline | null },\n ) {\n // overriding composite so that animation is not replaced and removed\n const effect = new KeyframeEffect(target, [], {\n ...effectOptions,\n composite: 'add',\n });\n const { timeline } = timingOptions;\n this._animation = new Animation(effect, timeline);\n\n this._tickCbId = null;\n this.progress = null;\n this.customEffect = (progress: number | null) => customEffect(effect.target, progress);\n\n // stop loop if animation is removed from the DOM after finish (does not fire 'remove' event)\n this._finishHandler = (_: any) => {\n if (\n !(this.effect as KeyframeEffect).target?.getAnimations().find((a) => a === this._animation)\n ) {\n this.cancel();\n }\n };\n this.addEventListener('finish', this._finishHandler);\n this.addEventListener('remove', this._finishHandler);\n }\n\n // private tick method for customEffect loop implementation\n private _tick() {\n try {\n const progress = this.effect?.getComputedTiming().progress ?? null;\n if (progress !== this.progress) {\n this.customEffect?.(progress);\n this.progress = progress;\n }\n this._tickCbId = requestAnimationFrame(() => {\n this._tick();\n });\n } catch (error) {\n this._tickCbId = null;\n console.error(\n `failed to run customEffect! effectId: ${this.id}, error: ${\n error instanceof Error ? error.message : error\n }`,\n );\n }\n }\n\n // Animation timing properties\n get currentTime() {\n return this._animation.currentTime;\n }\n set currentTime(time: CSSNumberish | null) {\n this._animation.currentTime = time;\n }\n get startTime() {\n return this._animation.startTime;\n }\n set startTime(time: CSSNumberish | null) {\n this._animation.startTime = time;\n }\n get playbackRate() {\n return this._animation.playbackRate;\n }\n set playbackRate(speed: number) {\n this._animation.playbackRate = speed;\n }\n\n // Animation basic properties\n get id() {\n return this._animation.id;\n }\n set id(uid: string) {\n this._animation.id = uid;\n }\n get effect() {\n return this._animation.effect;\n }\n set effect(e: AnimationEffect | null) {\n this._animation.effect = e;\n }\n get timeline() {\n return this._animation.timeline;\n }\n set timeline(tl: AnimationTimeline | null) {\n this._animation.timeline = tl;\n }\n\n // Animation readonly state properties\n get finished() {\n return this._animation.finished;\n }\n get pending() {\n return this._animation.pending;\n }\n get playState() {\n return this._animation.playState;\n }\n get ready() {\n return this._animation.ready;\n }\n get replaceState() {\n return this._animation.replaceState;\n }\n\n // Animation event handlers\n get oncancel() {\n return this._animation.oncancel;\n }\n set oncancel(cb: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null) {\n this._animation.oncancel = cb;\n }\n get onfinish() {\n return this._animation.onfinish;\n }\n set onfinish(cb: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null) {\n this._animation.onfinish = cb;\n }\n get onremove() {\n return this._animation.onremove;\n }\n set onremove(cb: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null) {\n this._animation.onremove = cb;\n }\n\n // CustomAnimation overridden methods\n play() {\n this._animation.play();\n cancelAnimationFrame(this._tickCbId!);\n this._tickCbId = requestAnimationFrame(() => this._tick());\n }\n\n pause() {\n this._animation.pause();\n cancelAnimationFrame(this._tickCbId!);\n this._tickCbId = null;\n }\n\n cancel() {\n this.removeEventListener('finish', this._finishHandler);\n this.removeEventListener('remove', this._finishHandler);\n this._animation.cancel();\n // signaling cancelation for customEffect to handle it as desired\n this.customEffect(null);\n cancelAnimationFrame(this._tickCbId!);\n this._tickCbId = null;\n }\n\n commitStyles() {\n console.warn(\n 'CustomEffect animations do not support commitStyles method as they have no style to commit',\n );\n }\n\n // Animation methods without override\n finish() {\n this._animation.finish();\n }\n persist() {\n this._animation.persist();\n }\n reverse() {\n this._animation.reverse();\n }\n updatePlaybackRate(playbackRate: number) {\n this._animation.updatePlaybackRate(playbackRate);\n }\n\n // Animation events API\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) {\n this._animation.addEventListener(type, listener, options);\n }\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) {\n this._animation.removeEventListener(type, listener, options);\n }\n dispatchEvent(event: Event) {\n return this._animation.dispatchEvent(event);\n }\n}\n","!(function(win) {\n\n/**\n * FastDom\n *\n * Eliminates layout thrashing\n * by batching DOM read/write\n * interactions.\n *\n * @author Wilson Page <wilsonpage@me.com>\n * @author Kornel Lesinski <kornel.lesinski@ft.com>\n */\n\n'use strict';\n\n/**\n * Mini logger\n *\n * @return {Function}\n */\nvar debug = 0 ? console.log.bind(console, '[fastdom]') : function() {};\n\n/**\n * Normalized rAF\n *\n * @type {Function}\n */\nvar raf = win.requestAnimationFrame\n || win.webkitRequestAnimationFrame\n || win.mozRequestAnimationFrame\n || win.msRequestAnimationFrame\n || function(cb) { return setTimeout(cb, 16); };\n\n/**\n * Initialize a `FastDom`.\n *\n * @constructor\n */\nfunction FastDom() {\n var self = this;\n self.reads = [];\n self.writes = [];\n self.raf = raf.bind(win); // test hook\n debug('initialized', self);\n}\n\nFastDom.prototype = {\n constructor: FastDom,\n\n /**\n * We run this inside a try catch\n * so that if any jobs error, we\n * are able to recover and continue\n * to flush the batch until it's empty.\n *\n * @param {Array} tasks\n */\n runTasks: function(tasks) {\n debug('run tasks');\n var task; while (task = tasks.shift()) task();\n },\n\n /**\n * Adds a job to the read batch and\n * schedules a new frame if need be.\n *\n * @param {Function} fn\n * @param {Object} ctx the context to be bound to `fn` (optional).\n * @public\n */\n measure: function(fn, ctx) {\n debug('measure');\n var task = !ctx ? fn : fn.bind(ctx);\n this.reads.push(task);\n scheduleFlush(this);\n return task;\n },\n\n /**\n * Adds a job to the\n * write batch and schedules\n * a new frame if need be.\n *\n * @param {Function} fn\n * @param {Object} ctx the context to be bound to `fn` (optional).\n * @public\n */\n mutate: function(fn, ctx) {\n debug('mutate');\n var task = !ctx ? fn : fn.bind(ctx);\n this.writes.push(task);\n scheduleFlush(this);\n return task;\n },\n\n /**\n * Clears a scheduled 'read' or 'write' task.\n *\n * @param {Object} task\n * @return {Boolean} success\n * @public\n */\n clear: function(task) {\n debug('clear', task);\n return remove(this.reads, task) || remove(this.writes, task);\n },\n\n /**\n * Extend this FastDom with some\n * custom functionality.\n *\n * Because fastdom must *always* be a\n * singleton, we're actually extending\n * the fastdom instance. This means tasks\n * scheduled by an extension still enter\n * fastdom's global task queue.\n *\n * The 'super' instance can be accessed\n * from `this.fastdom`.\n *\n * @example\n *\n * var myFastdom = fastdom.extend({\n * initialize: function() {\n * // runs on creation\n * },\n *\n * // override a method\n * measure: function(fn) {\n * // do extra stuff ...\n *\n * // then call the original\n * return this.fastdom.measure(fn);\n * },\n *\n * ...\n * });\n *\n * @param {Object} props properties to mixin\n * @return {FastDom}\n */\n extend: function(props) {\n debug('extend', props);\n if (typeof props != 'object') throw new Error('expected object');\n\n var child = Object.create(this);\n mixin(child, props);\n child.fastdom = this;\n\n // run optional creation hook\n if (child.initialize) child.initialize();\n\n return child;\n },\n\n // override this with a function\n // to prevent Errors in console\n // when tasks throw\n catch: null\n};\n\n/**\n * Schedules a new read/write\n * batch if one isn't pending.\n *\n * @private\n */\nfunction scheduleFlush(fastdom) {\n if (!fastdom.scheduled) {\n fastdom.scheduled = true;\n fastdom.raf(flush.bind(null, fastdom));\n debug('flush scheduled');\n }\n}\n\n/**\n * Runs queued `read` and `write` tasks.\n *\n * Errors are caught and thrown by default.\n * If a `.catch` function has been defined\n * it is called instead.\n *\n * @private\n */\nfunction flush(fastdom) {\n debug('flush');\n\n var writes = fastdom.writes;\n var reads = fastdom.reads;\n var error;\n\n try {\n debug('flushing reads', reads.length);\n fastdom.runTasks(reads);\n debug('flushing writes', writes.length);\n fastdom.runTasks(writes);\n } catch (e) { error = e; }\n\n fastdom.scheduled = false;\n\n // If the batch errored we may still have tasks queued\n if (reads.length || writes.length) scheduleFlush(fastdom);\n\n if (error) {\n debug('task errored', error.message);\n if (fastdom.catch) fastdom.catch(error);\n else throw error;\n }\n}\n\n/**\n * Remove an item from an Array.\n *\n * @param {Array} array\n * @param {*} item\n * @return {Boolean}\n */\nfunction remove(array, item) {\n var index = array.indexOf(item);\n return !!~index && !!array.splice(index, 1);\n}\n\n/**\n * Mixin own properties of source\n * object into the target.\n *\n * @param {Object} target\n * @param {Object} source\n */\nfunction mixin(target, source) {\n for (var key in source) {\n if (source.hasOwnProperty(key)) target[key] = source[key];\n }\n}\n\n// There should never be more than\n// one instance of `FastDom` in an app\nvar exports = win.fastdom = (win.fastdom || new FastDom()); // jshint ignore:line\n\n// Expose to CJS & AMD\nif ((typeof define) == 'function') define(function() { return exports; });\nelse if ((typeof module) == 'object') module.exports = exports;\n\n})( typeof window !== 'undefined' ? window : typeof this != 'undefined' ? this : globalThis);\n","import type { EffectModule } from '../types';\n\nconst registry: Record<string, EffectModule> = {};\n\nexport function registerEffects(effects: Record<string, EffectModule>) {\n Object.assign(registry, effects);\n}\n\nexport function getRegisteredEffect(name: string) {\n if (name in registry) {\n return registry[name];\n } else {\n console.warn(\n `${name} not found in registry. Please make sure to import and register the preset.`,\n );\n return null;\n }\n}\n","import type {\n AnimationData,\n AnimationDataForScrub,\n AnimationOptions,\n MeasureCallback,\n RangeOffset,\n TimeAnimationOptions,\n TriggerVariant,\n UnitLengthPercentage,\n} from '../types';\nimport { getCssUnits, getEasing } from '../utils';\nimport fastdom from 'fastdom';\nimport { getRegisteredEffect } from './registry';\n\nfunction getElement(id: string | null, ownerDocument?: Document): HTMLElement | null {\n return id ? (ownerDocument || document).getElementById(id) : null;\n}\n\nfunction getElementMotionPart(element: Element | null, part: string) {\n if (element?.matches(`[data-motion-part~=\"${part}\"]`)) {\n return element;\n }\n return element?.querySelector(`[data-motion-part~=\"${part}\"]`);\n}\n\nfunction getDirection(effect: AnimationData): KeyframeEffectOptions['direction'] {\n const alternate = effect.alternate ? 'alternate' : '';\n return effect.reversed\n ? (`${alternate ? `${alternate}-` : ''}reverse` as 'reverse' | 'alternate-reverse')\n : alternate || 'normal';\n}\n\nfunction getLength(length: UnitLengthPercentage): string {\n return `${length.value}${getCssUnits(length.unit)}`;\n}\n\nfunction getRange(range: RangeOffset, add: string | undefined, isEnd?: boolean) {\n // according to the CSS spec if the end range is a <length> then it is calculated from the start of the named range\n // our model assumes that <length> in end range is calculated from the end of the named range\n return `${range.name || 'cover'} ${\n isEnd && range.offset!.unit !== 'percentage'\n ? `calc(100% + ${getLength(range.offset!)}${add ? ` + ${add}` : ''})`\n : add\n ? `calc(${getLength(range.offset!)} + ${add})`\n : getLength(range.offset!)\n }`;\n}\n\nfunction getRanges(effect: AnimationDataForScrub) {\n return {\n start: getRange(effect.startOffset!, effect.startOffsetAdd),\n end: getRange(effect.endOffset!, effect.endOffsetAdd, true),\n };\n}\n\nfunction measure(target: HTMLElement | null): MeasureCallback {\n return (fn) => fastdom.measure(() => fn(target));\n}\n\nfunction mutate(target: HTMLElement | null): MeasureCallback {\n return (fn) => fastdom.mutate(() => fn(target));\n}\n\nfunction getNamedEffect(animation: AnimationOptions) {\n if (animation.namedEffect) {\n const effectName = animation.namedEffect.type;\n return typeof effectName === 'string' ? getRegisteredEffect(effectName) : null;\n } else if (animation.keyframeEffect) {\n const effect = (animation_: AnimationOptions) => {\n const { name, keyframes } = animation_.keyframeEffect!;\n\n return [{ ...animation_, name, keyframes }];\n };\n const getNames = (animation_: AnimationOptions) => {\n const { effectId } = animation_;\n const { name } = animation_.keyframeEffect!;\n const uid = name || effectId;\n\n return uid ? [uid] : [];\n };\n return { web: effect, style: effect, getNames };\n } else if (animation.customEffect) {\n return (animation_: AnimationOptions) => [{ ...animation_, keyframes: [] }];\n }\n return null;\n}\n\nfunction getEffectsData(\n animations: AnimationData[],\n trigger?: Partial<TriggerVariant>,\n effectId?: string,\n) {\n // process each AnimationData object into a KeyframeEffect object\n return animations.map((effect, index) => {\n // prepare the KeyframeEffectOptions object\n const effectOptions = {\n fill: effect.fill,\n easing: getEasing(effect.easing),\n iterations: effect.iterations === 0 ? Infinity : effect.iterations || 1,\n composite: effect.composite,\n direction: getDirection(effect),\n } as KeyframeEffectOptions & { rangeStart: string; rangeEnd: string };\n\n // if this is a time-based animation then set the duration and delay as time values\n if (isNotAScrubTrigger(trigger)) {\n effectOptions.duration = effect.duration as number;\n effectOptions.delay = (effect as TimeAnimationOptions).delay || 0;\n } else {\n // if ViewTimeline is supported AND this is a view-progress trigger\n if (window.ViewTimeline && trigger?.trigger === 'view-progress') {\n // set duration to 'auto'\n effectOptions.duration = 'auto';\n } else {\n // if ViewTimeline not supported then put a 100ms value in duration get a progress we can easily relate to\n // we split the duration to 99.99ms and delay of 0.01ms to get the fill-mode effect working\n effectOptions.duration = 99.99;\n effectOptions.delay = 0.01;\n }\n }\n\n return {\n effect,\n options: effectOptions,\n id: effectId && `${effectId}-${index + 1}`,\n part: effect.part,\n };\n });\n}\n\nfunction isNotAScrubTrigger(trigger?: Partial<TriggerVariant>) {\n return !trigger || (trigger.trigger !== 'pointer-move' && trigger.trigger !== 'view-progress');\n}\n\nexport {\n isNotAScrubTrigger,\n getElement,\n getElementMotionPart,\n getNamedEffect,\n getEffectsData,\n measure,\n mutate,\n getDirection,\n getLength,\n getRanges,\n};\n","import type {\n AnimationData,\n AnimationDataForScrub,\n AnimationEffectAPI,\n AnimationOptions,\n MouseAnimationFactory,\n MouseAnimationInstance,\n ScrubAnimationOptions,\n TriggerVariant,\n WebAnimationEffectFactory,\n} from '../types';\nimport { CustomAnimation } from '../CustomAnimation';\nimport { AnimationGroup } from '../AnimationGroup';\nimport {\n getElement,\n getElementMotionPart,\n measure,\n mutate,\n getRanges,\n getNamedEffect,\n getEffectsData,\n isNotAScrubTrigger,\n} from './common';\nimport fastdom from 'fastdom';\n\nfunction getWebAnimationEffect(\n preset: AnimationEffectAPI<any> | WebAnimationEffectFactory<any> | null,\n animation: AnimationOptions,\n target: HTMLElement | string | null,\n trigger?: Partial<TriggerVariant>,\n options?: Record<string, any>,\n): AnimationData[] | MouseAnimationFactory {\n if (preset) {\n // validate duration is a number over 0\n if (isNotAScrubTrigger(trigger)) {\n animation.duration = animation.duration || 1;\n\n if (options?.reducedMotion) {\n if (animation.iterations === 1 || animation.iterations == undefined) {\n animation = { ...animation, duration: 1 };\n } else {\n return [];\n }\n }\n }\n\n let domApi;\n if (target instanceof HTMLElement) {\n domApi = { measure: measure(target), mutate: mutate(target) };\n }\n\n return (preset as AnimationEffectAPI<any>).web\n ? (preset as AnimationEffectAPI<any>).web(animation, domApi, options)\n : (preset as WebAnimationEffectFactory<any>)(animation, domApi, options);\n }\n\n return [];\n}\n\nfunction getWebAnimation(\n target: HTMLElement | string | null,\n animationOptions: AnimationOptions,\n trigger?: Partial<TriggerVariant> & { element?: HTMLElement },\n options?: Record<string, any>,\n ownerDocument?: Document,\n): AnimationGroup | MouseAnimationInstance | null {\n const element = target instanceof HTMLElement ? target : getElement(target, ownerDocument);\n\n if (trigger?.trigger === 'pointer-move' && !animationOptions.keyframeEffect) {\n let effectOptions = animationOptions;\n\n if (animationOptions.customEffect) {\n effectOptions = {\n ...animationOptions,\n namedEffect: { id: '', type: 'CustomMouse' },\n };\n }\n\n // TODO: need to fix the type here, currently lying about the returned type to be WebAnimationEffectFactory instead of MouseAnimationFactoryCreate\n const mouseAnimationPreset = getNamedEffect(\n effectOptions,\n ) as WebAnimationEffectFactory<'scrub'>;\n const mouseAnimationFactory = getWebAnimationEffect(\n mouseAnimationPreset,\n animationOptions,\n element,\n trigger,\n options,\n ) as MouseAnimationFactory;\n\n if (typeof mouseAnimationFactory !== 'function') {\n return null;\n }\n\n return mouseAnimationFactory(element as HTMLElement);\n }\n\n // get the preset for the given animation options\n const namedEffect = getNamedEffect(animationOptions) as AnimationEffectAPI<any> | null;\n\n const animationsData = getWebAnimationEffect(\n namedEffect,\n animationOptions,\n element,\n trigger,\n options,\n ) as AnimationData[];\n\n // Return null if animation data cannot be generated\n if (!animationsData || animationsData.length === 0) {\n return null;\n }\n\n const data = getEffectsData(animationsData, trigger, animationOptions.effectId);\n\n let timeline: typeof window.ViewTimeline | undefined;\n const isViewProgress = trigger?.trigger === 'view-progress';\n\n // if this is a ScrubAnimation with view-progress trigger and the browser supports the ViewTimeline API\n if (isViewProgress && window.ViewTimeline) {\n // generate the timeline object\n // @ts-expect-error\n timeline = new ViewTimeline({\n subject: trigger.element || getElement(trigger.componentId!),\n });\n }\n\n // generate an Animation object for each data object\n const animations = data.map(({ effect, options: effectOptions, id, part }) => {\n const effectTarget = part ? getElementMotionPart(element, part) : element;\n\n const keyframeEffect = new KeyframeEffect(effectTarget || null, [], effectOptions);\n\n // set the keyframes for the KeyframeEffect after measurements and mutations\n fastdom.mutate(() => {\n if ('timing' in effect) {\n keyframeEffect.updateTiming(effect.timing as OptionalEffectTiming);\n }\n\n keyframeEffect.setKeyframes(effect.keyframes);\n });\n\n const timingOptions =\n isViewProgress && timeline ? { timeline: timeline as AnimationTimeline } : {};\n const animation: Animation | CustomAnimation =\n typeof effect.customEffect === 'function'\n ? (new CustomAnimation(\n effect.customEffect,\n effectTarget || null,\n effectOptions,\n timingOptions,\n ) as Animation)\n : new Animation(keyframeEffect, timingOptions.timeline);\n\n // if this is a ScrubAnimation with view-progress trigger and the browser supports the ViewTimeline API\n if (isViewProgress) {\n if (timeline) {\n // set the ranges for the animation after measurements and mutations\n fastdom.mutate(() => {\n const { start, end } = getRanges(effect as AnimationDataForScrub);\n // @ts-expect-error\n animation.rangeStart = start;\n // @ts-expect-error\n animation.rangeEnd = end;\n\n animation.play();\n });\n } else {\n const { startOffset, endOffset } = animationOptions as ScrubAnimationOptions;\n\n // set the ranges for the animation after measurements and mutations\n fastdom.mutate(() => {\n const startOffsetToWrite = (effect as AnimationDataForScrub).startOffset || startOffset;\n const endOffsetToWrite = (effect as AnimationDataForScrub).endOffset || endOffset;\n\n Object.assign(animation, {\n start: {\n name: startOffsetToWrite!.name,\n offset: startOffsetToWrite!.offset?.value,\n add: (effect as AnimationDataForScrub)!.startOffsetAdd,\n },\n end: {\n name: endOffsetToWrite!.name,\n offset: endOffsetToWrite!.offset?.value,\n add: (effect as AnimationDataForScrub)!.endOffsetAdd,\n },\n });\n });\n }\n }\n\n if (id) {\n animation.id = id;\n }\n\n return animation;\n });\n\n // create an AnimationGroup with the generate animations\n return new AnimationGroup(animations, {\n ...animationOptions,\n trigger: { ...(trigger || ({} as Partial<TriggerVariant>)) },\n // make sure the group is ready after all animation targets are measured and mutated\n measured: new Promise((resolve) => fastdom.mutate(resolve)),\n });\n}\n\nexport { getWebAnimation };\n","import type { AnimationEffectAPI, AnimationOptions, TimeAnimationOptions } from '../types';\nimport { getElement, getNamedEffect, measure, mutate } from './common';\nimport fastdom from 'fastdom';\n\nfunction prepareAnimation(\n target: HTMLElement | string | null,\n animation: AnimationOptions,\n callback?: () => void,\n) {\n const preset = getNamedEffect(animation);\n const element = target instanceof HTMLElement ? target : getElement(target);\n\n if (preset && (preset as AnimationEffectAPI<'time'>).prepare && element) {\n const domApi = { measure: measure(element), mutate: mutate(element) };\n\n (preset as AnimationEffectAPI<'time'>).prepare!(animation as TimeAnimationOptions, domApi);\n }\n\n if (callback) {\n fastdom.mutate(callback);\n }\n}\n\nexport { prepareAnimation };\n","import type {\n AnimationOptions,\n ScrubAnimationOptions,\n TriggerVariant,\n MouseAnimationInstance,\n AnimationEffectAPI,\n CustomMouseAnimationInstance,\n ScrubScrollScene,\n ScrubPointerScene,\n PointerMoveAxis,\n} from './types';\nimport { AnimationGroup } from './AnimationGroup';\nimport { getEasing, getJsEasing } from './utils';\nimport { getWebAnimation } from './api/webAnimations';\nimport { getCSSAnimation } from './api/cssAnimations';\nimport { prepareAnimation } from './api/prepare';\nimport { getElement, getNamedEffect } from './api/common';\n\nfunction getElementCSSAnimation(\n target: HTMLElement | string | null,\n animationOptions: AnimationOptions,\n): AnimationGroup | null {\n const namedEffect = getNamedEffect(animationOptions) as AnimationEffectAPI<any> | null;\n\n if (!namedEffect) {\n return null;\n }\n\n if (!namedEffect.style) {\n // if this named effect does not have a style method, attempt to get group of Web Animations\n if (animationOptions.effectId && target) {\n return getElementAnimation(target, animationOptions.effectId);\n }\n\n return null;\n }\n\n const effectNames = namedEffect.getNames(animationOptions);\n const element = typeof target === 'string' ? getElement(target) : target;\n const animations = element?.getAnimations();\n const animationNames =\n animations?.map((anim) => (anim as CSSAnimation).animationName) || ([] as string[]);\n const filteredAnimations: CSSAnimation[] = [];\n\n effectNames.forEach((name) => {\n if (animationNames.includes(name)) {\n filteredAnimations.push(\n animations?.find((anim) => (anim as CSSAnimation).animationName === name) as CSSAnimation,\n );\n }\n });\n\n return filteredAnimations?.length ? new AnimationGroup(filteredAnimations) : null;\n}\n\nfunction getElementAnimation(\n target: HTMLElement | string,\n effectId: string,\n): AnimationGroup | null {\n const element = typeof target === 'string' ? getElement(target) : target;\n // somehow get the right animations\n const animations = element?.getAnimations().filter((anim: Animation | CSSAnimation) => {\n const id = anim.id || (anim as CSSAnimation).animationName;\n // if no id/name just return all animations\n return id ? id.startsWith(effectId) : true;\n });\n\n return animations?.length ? new AnimationGroup(animations) : null;\n}\n\nfunction getScrubScene(\n target: HTMLElement | string | null,\n animationOptions: AnimationOptions,\n trigger: Partial<TriggerVariant> & { element?: HTMLElement },\n sceneOptions: Record<string, any> = {},\n): ScrubScrollScene[] | ScrubPointerScene | ScrubPointerScene[] | null {\n const { disabled, allowActiveEvent, ...rest } = sceneOptions;\n const animation = getWebAnimation(target, animationOptions, trigger, rest);\n\n // Return null if animation could not be created\n if (!animation) {\n return null;\n }\n\n let typeSpecificOptions = {} as Record<string, any>;\n\n if (trigger.trigger === 'view-progress' && !window.ViewTimeline) {\n // TODO(ameerf): consider doing this only for bgscrub to not affect the other scroll effects\n const viewSource = trigger.element || getElement(trigger.componentId!);\n const { ready } = animation as AnimationGroup;\n\n return (animation as AnimationGroup).animations.map((partialAnimation) => {\n return {\n /* we use getters for start and end in order to access the animation's start and end\n only when initializing the scrub scene rather than immediately */\n get start() {\n return partialAnimation.start;\n },\n get end() {\n return partialAnimation.end;\n },\n viewSource,\n ready,\n getProgress() {\n return (animation as AnimationGroup).getProgress();\n },\n effect(__: any, p: number) {\n const { activeDuration } = partialAnimation.effect!.getComputedTiming();\n const { delay } = partialAnimation.effect!.getTiming();\n\n partialAnimation.currentTime = ((delay || 0) + ((activeDuration as number) || 0)) * p;\n },\n disabled,\n destroy() {\n partialAnimation.cancel();\n },\n } as ScrubScrollScene;\n });\n } else if (trigger.trigger === 'pointer-move') {\n const scrubOptions = animationOptions as ScrubAnimationOptions;\n const { centeredToTarget, transitionDuration, transitionEasing } = scrubOptions;\n const axis = (trigger as { axis?: PointerMoveAxis }).axis;\n\n if (scrubOptions.keyframeEffect) {\n const animationGroup = animation as AnimationGroup;\n\n if (animationGroup.animations?.length === 0) {\n return null;\n }\n\n const scene: ScrubPointerScene & { _currentProgress: number } = {\n target: undefined,\n centeredToTarget,\n ready: animationGroup.ready,\n _currentProgress: 0,\n getProgress() {\n return this._currentProgress;\n },\n effect(__: any, p: { x: number; y: number }) {\n const linearProgress = axis === 'x' ? p.x : p.y;\n this._currentProgress = linearProgress;\n animationGroup.progress(linearProgress);\n },\n disabled: disabled ?? false,\n destroy() {\n animationGroup.cancel();\n },\n };\n\n return scene;\n }\n\n typeSpecificOptions = {\n centeredToTarget,\n allowActiveEvent,\n };\n\n if (animationOptions.customEffect && transitionDuration) {\n typeSpecificOptions.transitionDuration = transitionDuration;\n // TODO: refactor js easings\n typeSpecificOptions.transitionEasing = getJsEasing(transitionEasing);\n }\n typeSpecificOptions.target = (animation as MouseAnimationInstance).target;\n }\n\n return {\n ...typeSpecificOptions,\n getProgress() {\n return (animation as AnimationGroup | CustomMouseAnimationInstance).getProgress();\n },\n effect(\n __: any,\n p: number | { x: number; y: number },\n v?: { x: number; y: number },\n active?: boolean,\n ) {\n animation.progress(\n v\n ? {\n // @ts-expect-error spread error on p\n ...p,\n v,\n active,\n }\n : p,\n );\n },\n disabled,\n destroy() {\n animation.cancel();\n },\n } as ScrubPointerScene;\n}\n\nfunction getAnimation(\n target: HTMLElement | string | null,\n animationOptions: AnimationOptions,\n trigger?: Partial<TriggerVariant> & { element?: HTMLElement },\n reducedMotion: boolean = false,\n): AnimationGroup | MouseAnimationInstance | null {\n const animation = getElementCSSAnimation(target, animationOptions);\n\n if (animation) {\n animation.ready = new Promise((resolve) => {\n prepareAnimation(target, animationOptions, resolve);\n });\n\n return animation;\n }\n\n return getWebAnimation(target, animationOptions, trigger, { reducedMotion });\n}\n\nexport {\n getCSSAnimation,\n getWebAnimation,\n getElementCSSAnimation,\n getElementAnimation,\n getScrubScene,\n prepareAnimation,\n getAnimation,\n getEasing,\n};\n\nexport type { AnimationGroup };\n","import { getEasing } from '@wix/motion';\nimport type { Condition, CreateTransitionCSSParams } from './types';\n\n/**\n * Applies a selector condition predicate to a base selector.\n * - If `&` is in the predicate, replace `&` with the base selector\n * - If no `&`, assume `&<predicate>` (append predicate to base selector)\n */\nexport function applySelectorCondition(baseSelector: string, predicate: string): string {\n if (predicate.includes('&')) {\n return predicate.replace(/&/g, baseSelector);\n }\n return `${baseSelector}${predicate}`;\n}\n\nexport function generateId() {\n return 'wi-12343210'.replace(\n /\\d/g,\n (c) =>\n String.fromCharCode(\n (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))) + 97,\n ), // 97 for \"a\"\n );\n}\n\nexport function createTransitionCSS({\n key,\n effectId,\n transition,\n properties,\n childSelector = '> :first-child',\n selectorCondition,\n}: CreateTransitionCSSParams): string[] {\n let transitions: string[] = [];\n\n if (transition?.styleProperties) {\n const { duration, easing, delay } = transition;\n\n if (duration) {\n const hasCustomPropertiesTransition = transition.styleProperties.some((styleProperty) =>\n styleProperty.name.startsWith('--'),\n );\n\n if (hasCustomPropertiesTransition) {\n // If there are custom properties in the transition, we need to fall back to Viewer's legacy implementation\n transitions = [\n `all ${duration}ms ${getEasing(easing || 'ease')}${delay ? ` ${delay}ms` : ''}`,\n 'visibility 0s',\n ];\n } else {\n transitions = transition.styleProperties.map(\n (styleProperty) =>\n `${styleProperty.name} ${duration}ms ${getEasing(\n easing || 'ease',\n )}${delay ? ` ${delay}ms` : ''}`,\n );\n }\n }\n\n properties = transition.styleProperties;\n } else {\n transitions =\n properties\n ?.filter((property) => property.duration)\n .map(\n (property) =>\n `${property.name} ${property.duration}ms ${\n getEasing(property.easing) || 'ease'\n }${property.delay ? ` ${property.delay}ms` : ''}`,\n ) || [];\n }\n\n const styleProperties =\n properties?.map((property) => `${property.name}: ${property.value};`) || [];\n const escapedKey = key.replace(/\"/g, \"'\");\n\n // Build selectors, applying condition if present\n const stateSelector = `:is(:state(${effectId}), :--${effectId}) ${childSelector}`;\n const dataAttrSelector = `[data-interact-effect~=\"${effectId}\"] ${childSelector}`;\n\n const finalStateSelector = selectorCondition\n ? applySelectorCondition(stateSelector, selectorCondition)\n : stateSelector;\n const finalDataAttrSelector = selectorCondition\n ? applySelectorCondition(dataAttrSelector, selectorCondition)\n : dataAttrSelector;\n\n const result = [\n `${finalStateSelector},\n ${finalDataAttrSelector} {\n ${styleProperties.join(`\n `)}\n }`,\n ];\n\n if (transitions.length) {\n const transitionSelector = `[data-interact-key=\"${escapedKey}\"] ${childSelector}`;\n const finalTransitionSelector = selectorCondition\n ? applySelectorCondition(transitionSelector, selectorCondition)\n : transitionSelector;\n\n result.push(`@media (prefers-reduced-motion: no-preference) { ${finalTransitionSelector} {\n transition: ${transitions.join(', ')};\n } }`);\n }\n return result;\n}\n\nexport function getMediaQuery(\n conditionNames: string[] | undefined,\n conditions: Record<string, Condition>,\n) {\n const conditionContent = (conditionNames || [])\n .filter((conditionName) => {\n return conditions[conditionName]?.type === 'media' && conditions[conditionName].predicate;\n })\n .map((conditionName) => {\n return conditions[conditionName].predicate;\n })\n .join(') and (');\n\n const condition = conditionContent && `(${conditionContent})`;\n const mql = condition && window.matchMedia(condition);\n\n return mql;\n}\n\nexport function getSelectorCondition(\n conditionNames: string[] | undefined,\n conditions: Record<string, Condition>,\n): string | undefined {\n for (const name of conditionNames || []) {\n const condition = conditions[name];\n if (condition?.type === 'selector' && condition.predicate) {\n return condition.predicate;\n }\n }\n return;\n}\n","import type {\n TimeEffect,\n ScrubEffect,\n RangeOffset,\n HandlerObject,\n HandlerObjectMap,\n AnimationOptions,\n} from '../types';\n\nconst DEFAULT_RANGE_VALUES = {\n rangeStart: { name: 'cover' as const, offset: { value: 0, unit: 'percentage' as const } },\n rangeEnd: { name: 'cover' as const, offset: { value: 100, unit: 'percentage' as const } },\n};\n\nfunction resolveRangeOffsets(\n rangeStart: RangeOffset | undefined,\n rangeEnd: RangeOffset | undefined,\n): { startOffset: RangeOffset; endOffset: RangeOffset } {\n const startName = rangeStart?.name ?? DEFAULT_RANGE_VALUES.rangeStart.name;\n const endName = rangeEnd?.name ?? rangeStart?.name ?? DEFAULT_RANGE_VALUES.rangeEnd.name;\n\n const startOffset: RangeOffset = {\n name: startName,\n offset: rangeStart?.offset || DEFAULT_RANGE_VALUES.rangeStart.offset,\n };\n\n const endOffset: RangeOffset = {\n name: endName,\n offset: rangeEnd?.offset || DEFAULT_RANGE_VALUES.rangeEnd.offset,\n };\n\n return { startOffset, endOffset };\n}\n\nexport function effectToAnimationOptions(effect: TimeEffect | ScrubEffect) {\n if ('keyframeEffect' in effect && !effect.keyframeEffect.name && 'effectId' in effect) {\n effect.keyframeEffect.name = effect.effectId as string;\n }\n\n if ('duration' in effect) {\n return {\n id: '',\n ...effect,\n } as AnimationOptions<'time'>;\n }\n\n const { rangeStart, rangeEnd, ...rest } = effect;\n const { startOffset, endOffset } = resolveRangeOffsets(rangeStart, rangeEnd);\n\n return {\n id: '',\n startOffset,\n endOffset,\n ...rest,\n } as AnimationOptions<'scrub'>;\n}\n\nexport function addHandlerToMap(\n handlersMap: HandlerObjectMap,\n element: HTMLElement,\n handlerObj: HandlerObject,\n) {\n let handlers = handlersMap.get(element);\n\n if (!handlers) {\n handlers = new Set();\n handlersMap.set(element, handlers);\n }\n\n handlers.add(handlerObj);\n}\n\nexport function removeElementFromHandlerMap(handlerMap: HandlerObjectMap, element: HTMLElement) {\n const handlers = handlerMap.get(element);\n\n handlers?.forEach((handlerObj) => {\n const { source, target, cleanup } = handlerObj;\n cleanup();\n\n const otherKey = source === element ? target : source;\n const otherHandlers = handlerMap.get(otherKey);\n otherHandlers?.delete(handlerObj);\n });\n\n handlerMap.delete(element);\n}\n","import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation } from '@wix/motion';\nimport type { TimeEffect, HandlerObjectMap, ViewEnterParams, InteractOptions } from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\nimport fastdom from 'fastdom';\n\nconst SAFE_OBSERVER_CONFIG: IntersectionObserverInit = {\n root: null,\n rootMargin: '0px 0px -10% 0px',\n threshold: [0],\n};\n\n// Exit observer config for repeat/state types - watches when element is completely out of view\nconst EXIT_OBSERVER_CONFIG: IntersectionObserverInit = {\n root: null,\n rootMargin: '0px',\n threshold: [0],\n};\n\nconst observers: Record<string, IntersectionObserver> = {};\nconst handlerMap = new WeakMap() as HandlerObjectMap;\nconst elementFirstRun = new WeakSet<HTMLElement>();\nconst elementObserverMap = new WeakMap<HTMLElement, IntersectionObserver>();\nlet viewEnterOptions: Partial<ViewEnterParams> = {};\nlet sharedExitObserver: IntersectionObserver | null = null;\n\nfunction setOptions(options: Partial<ViewEnterParams>) {\n viewEnterOptions = options;\n}\n\nfunction invokeHandlers(target: HTMLElement, isIntersecting: boolean) {\n const handlers = handlerMap.get(target);\n handlers?.forEach(({ source, handler }) => {\n if (source === target) {\n handler!(isIntersecting);\n }\n });\n}\n\nfunction getExitObserver() {\n if (sharedExitObserver) {\n return sharedExitObserver;\n }\n\n sharedExitObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const target = entry.target as HTMLElement;\n\n if (!entry.isIntersecting) {\n // Element has completely exited the view\n invokeHandlers(target, false);\n }\n });\n }, EXIT_OBSERVER_CONFIG);\n\n return sharedExitObserver;\n}\n\nfunction getObserver(options: ViewEnterParams, isSafeMode: boolean = false) {\n const key = JSON.stringify({ ...options, isSafeMode });\n\n if (observers[key]) {\n return observers[key];\n }\n\n const config: IntersectionObserverInit = isSafeMode\n ? SAFE_OBSERVER_CONFIG\n : {\n root: null,\n rootMargin: options.inset ? `${options.inset} 0px ${options.inset}` : '0px',\n threshold: options.threshold,\n };\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const target = entry.target as HTMLElement;\n const isFirstRun = !elementFirstRun.has(target);\n\n if (isFirstRun) {\n elementFirstRun.add(target);\n\n if (options.useSafeViewEnter && !entry.isIntersecting) {\n fastdom.measure(() => {\n const sourceHeight = entry.boundingClientRect.height;\n const rootHeight = entry.rootBounds?.height;\n\n if (!rootHeight) {\n return;\n }\n\n const threshold = Array.isArray(options.threshold)\n ? Math.min(...options.threshold)\n : options.threshold;\n\n const needsSafeObserver = threshold && sourceHeight * threshold > rootHeight;\n\n if (needsSafeObserver) {\n fastdom.mutate(() => {\n observer.unobserve(target);\n const safeObserver = getObserver(options, true);\n elementObserverMap.set(target, safeObserver);\n safeObserver.observe(target);\n });\n }\n });\n return;\n }\n }\n\n const type = options.type || 'once';\n\n if (entry.isIntersecting || (type === 'alternate' && !isFirstRun)) {\n // For alternate type, handle exit using same observer as entry\n invokeHandlers(target, entry.isIntersecting);\n\n if (type === 'once') {\n observer.unobserve(entry.target);\n elementFirstRun.delete(target);\n }\n }\n // Note: repeat and state exit handling is done by a separate exit observer\n // that watches when element is completely out of view\n });\n }, config);\n\n observers[key] = observer;\n\n return observer;\n}\n\nfunction addViewEnterHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: TimeEffect,\n options: ViewEnterParams = {},\n { reducedMotion, selectorCondition }: InteractOptions = {},\n) {\n const mergedOptions = { ...viewEnterOptions, ...options };\n const type = mergedOptions.type || 'once';\n const animation = getAnimation(\n target,\n effectToAnimationOptions(effect),\n undefined,\n reducedMotion,\n ) as AnimationGroup | null;\n\n // Early return if animation is null, no observer created\n if (!animation) {\n return;\n }\n\n const observer = getObserver(mergedOptions);\n\n // Persist animation for non-once types to prevent auto-cleanup\n if (type !== 'once') {\n // Use persist() if available (Web Animations API)\n (animation as AnimationGroup & { persist?: () => void }).persist?.();\n }\n\n // Track initial play state for alternate type\n let isInitialPlay = true;\n\n const handler = (isIntersecting?: boolean) => {\n if (selectorCondition && !target.matches(selectorCondition)) return;\n\n if (type === 'once') {\n if (isIntersecting) {\n animation.play(() => {\n const setEnterStart = () => {\n target.dataset.interactEnter = 'start';\n };\n\n if (animation.isCSS) {\n fastdom.mutate(() => {\n // delay for next tick to prevent content flashing\n requestAnimationFrame(setEnterStart);\n });\n\n animation.onFinish(() => {\n fastdom.mutate(() => {\n target.dataset.interactEnter = 'done';\n });\n });\n } else {\n fastdom.mutate(setEnterStart);\n }\n });\n }\n } else if (type === 'alternate') {\n if (isInitialPlay && isIntersecting) {\n isInitialPlay = false;\n animation.play();\n } else if (!isInitialPlay) {\n // On subsequent entry/exit reverse the animation\n animation.reverse();\n }\n } else if (type === 'repeat') {\n if (isIntersecting) {\n // On entry, reset progress to 0 before playing since the exit is a separate observer/range\n animation.progress(0);\n animation.play();\n } else {\n // On exit (completely out of view), pause and reset\n animation.pause();\n animation.progress(0);\n }\n } else if (type === 'state') {\n if (isIntersecting) {\n // Resume or start playing\n animation.play();\n } else {\n // On exit (completely out of view), just pause\n animation.pause();\n }\n }\n };\n\n const cleanup = () => {\n const currentObserver = elementObserverMap.get(source) || observer;\n currentObserver.unobserve(source);\n\n if (type === 'repeat' || type === 'state') {\n // Clean up exit observer if it exists\n const exitObserver = getExitObserver();\n exitObserver.unobserve(source);\n }\n\n animation.cancel();\n elementFirstRun.delete(source);\n elementObserverMap.delete(source);\n };\n const handlerObj = { source, target, handler, cleanup };\n\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n elementObserverMap.set(source, observer);\n observer.observe(source);\n\n // For repeat and state types, set up a separate exit observer\n // that watches when element is completely out of view\n if (type === 'repeat' || type === 'state') {\n const exitObserver = getExitObserver();\n exitObserver.observe(source);\n }\n}\n\nfunction removeViewEnterHandler(element: HTMLElement) {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nfunction reset() {\n sharedExitObserver = null;\n Object.keys(observers).forEach((key) => delete observers[key]);\n}\n\nexport default {\n add: addViewEnterHandler,\n remove: removeViewEnterHandler,\n setOptions,\n reset,\n};\n","/**\n * Returns a new Object with the properties of the first argument\n * assigned to it, and the second argument as its prototype, so\n * its properties are served as defaults.\n *\n * @param {Object} obj properties to assign\n * @param {Object|null} defaults\n * @return {Object}\n */\nfunction defaultTo (obj, defaults) {\n return Object.assign(Object.create(defaults), obj);\n}\n\n/**\n * Interpolate from a to b by the factor t.\n *\n * @param {number} a start point\n * @param {number} b end point\n * @param {number} t interpolation factor\n * @param {number} e minimal possible delta between result and start, and between result and end\n * @return {number}\n */\nfunction lerp (a, b, t, e) {\n let res = a * (1 - t) + b * t;\n\n if (e) {\n const deltaFromStart = res - a;\n if (Math.abs(deltaFromStart) < e) {\n res = a + e * Math.sign(deltaFromStart);\n }\n\n const deltaFromEnd = b - res;\n\n if (Math.abs(deltaFromEnd) < e) {\n return b;\n }\n }\n\n return res;\n}\n\n/**\n * Throttle a function to trigger once per animation frame.\n * Keeps the arguments from last call, even if that call gets ignored.\n *\n * @param {function} fn function to throttle\n * @return {(function(): void)}\n */\nfunction frameThrottle (fn) {\n let throttled = false;\n\n return function () {\n if (!throttled) {\n throttled = true;\n\n window.requestAnimationFrame(() => {\n throttled = false;\n fn();\n });\n }\n };\n}\n\n/**\n * Debounce a function by interval in milliseconds.\n *\n * @param {function} fn\n * @param {number} interval\n * @return {function}\n */\nfunction debounce (fn, interval) {\n let debounced = 0;\n\n return function bounce () {\n if (debounced) {\n window.clearTimeout(debounced);\n }\n\n debounced = window.setTimeout(() => {\n debounced = 0;\n fn();\n }, interval);\n };\n}\n\nexport {\n defaultTo,\n lerp,\n frameThrottle,\n debounce\n};\n","/**\n * parses offsetString of the format calc(<length> + <length>)\n * @param {string|undefined} offsetString\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n */\nfunction parseOffsetCalc(offsetString, absoluteOffsetContext) {\n const match = offsetString.match(/^calc\\s*\\(\\s*(-?\\d+((px)|([lsd]?vh)|([lsd]?vw)))\\s*\\+\\s*(-?\\d+((px)|([lsd]?vh)|([lsd]?vw)))\\s*\\)\\s*$/);\n return transformAbsoluteOffsetToNumber(match[1], absoluteOffsetContext) + transformAbsoluteOffsetToNumber(match[6], absoluteOffsetContext);\n}\n\n/**\n * Convert an absolute offset as string to number of pixels\n *\n * @param {string|undefined} offsetString\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n * @return {number}\n */\nfunction transformAbsoluteOffsetToNumber (offsetString, absoluteOffsetContext) {\n return offsetString\n ? /^-?\\d+px$/.test(offsetString)\n ? parseInt(offsetString)\n : /^-?\\d+[lsd]?vh$/.test(offsetString)\n ? parseInt(offsetString) * absoluteOffsetContext.viewportHeight / 100\n : /^-?\\d+[lsd]?vw$/.test(offsetString)\n ? parseInt(offsetString) * absoluteOffsetContext.viewportWidth / 100\n : /^calc\\s*\\(\\s*-?\\d+((px)|([lsd]?vh)|([lsd]?vw))\\s*\\+\\s*-?\\d+((px)|([lsd]?vh)|([lsd]?vw))\\s*\\)\\s*$/.test(offsetString)\n ? parseOffsetCalc(offsetString, absoluteOffsetContext)\n : parseInt(offsetString) || 0\n : 0;\n}\n\n/**\n * Convert a range into offset in pixels.\n *\n * @param {{name: RangeName, offset: number}} range\n * @param {number} viewportSize\n * @param {{start: number, end: number}} rect\n * @return {number}\n */\nfunction transformRangeToPosition (range, viewportSize, rect) {\n const { name, offset = 0 } = range;\n const { start, end } = rect;\n const height = end - start;\n const percentage = offset / 100;\n\n let startPosition, duration;\n\n if (name === 'entry') {\n startPosition = start - viewportSize;\n duration = Math.min(viewportSize, height);\n }\n else if (name === 'entry-crossing') {\n startPosition = start - viewportSize;\n duration = height;\n }\n else if (name === 'contain') {\n startPosition = Math.min(end - viewportSize, start);\n // it's either VH - height OR height - VH; so it boils down to just the absolute value of that\n duration = Math.abs(viewportSize - height);\n }\n else if (name === 'exit') {\n startPosition = Math.max(start, end - viewportSize);\n duration = Math.min(viewportSize, height);\n }\n else if (name === 'exit-crossing') {\n startPosition = start;\n duration = height;\n }\n else if (name === 'cover') {\n startPosition = start - viewportSize;\n duration = height + viewportSize;\n }\n\n return (startPosition + percentage * duration) | 0;\n}\n\nfunction computeStickinessIntoFullRange(offsetTree, absoluteStartOffset, absoluteEndOffset, viewportSize, isHorizontal) {\n let accumulatedOffset = 0;\n const newAbsoluteRange = {start: absoluteStartOffset, end: absoluteEndOffset}\n\n /*\n * loop from root down to subject\n * check for sticky positioned elements in the tree and add stuck intervals if needed\n */\n offsetTree.forEach((node, index) => {\n accumulatedOffset += node.offset;\n const sticky = node.sticky;\n\n if (sticky) {\n if ('end' in sticky) {\n const parent = offsetTree[index - 1]?.element;\n\n if (parent) {\n const elementSize = (isHorizontal ? node.element.offsetWidth : node.element.offsetHeight) || 0;\n const offsetFromViewEnd = elementSize + sticky.end - viewportSize;\n /*\n * Sticky bottom:\n * starts on the starting edge of element's parent - viewport size + element size + offset from bottom of view\n * ends on the element's offset + offset from bottom of view\n * duration is essentially element's offset\n */\n const stuckStart = accumulatedOffset + offsetFromViewEnd - node.offset;\n // check if stuckStart is before the point of scroll where the timeline starts\n const isBeforeStart = stuckStart < newAbsoluteRange.start;\n // check if stuckStart is inside the timeline's active scroll interval\n const isInsideDuration = !isBeforeStart && stuckStart <= absoluteEndOffset;\n\n let extraOffset = 0;\n if (isBeforeStart || isInsideDuration) {\n extraOffset = node.offset;\n newAbsoluteRange.end += extraOffset;\n }\n\n if (isBeforeStart) {\n newAbsoluteRange.start += extraOffset;\n }\n }\n }\n\n if ('start' in sticky) {\n // stuckStart is the amount needed to scroll to reach the stuck state\n const stuckStart = accumulatedOffset - sticky.start;\n\n // check if stuckStart is before the point of scroll where the timeline starts\n const isBeforeStart = stuckStart < newAbsoluteRange.start;\n // check if stuckStart is inside the timeline's active scroll interval\n const isInsideDuration = !isBeforeStart && stuckStart <= newAbsoluteRange.end;\n\n let extraOffset = 0;\n const parent = offsetTree[index - 1]?.element;\n\n if (parent) {\n if (isBeforeStart || isInsideDuration) {\n const parentSize = (isHorizontal ? parent.offsetWidth : parent.offsetHeight) || 0;\n const elementOffset = node.offset;\n const elementSize = (isHorizontal ? node.element.offsetWidth : node.element.offsetHeight) || 0;\n\n extraOffset = parentSize - (elementOffset + elementSize);\n accumulatedOffset += extraOffset;\n newAbsoluteRange.end += extraOffset;\n }\n\n if (isBeforeStart) {\n newAbsoluteRange.start += extraOffset;\n }\n }\n }\n }\n });\n\n return newAbsoluteRange;\n}\n\n/**\n * Convert scene data in ranges into offsets in pixels.\n *\n * @param {ScrollScene} scene\n * @param {{start: number, end: number}} rect\n * @param {number} viewportSize\n * @param {boolean} isHorizontal\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n * @param {Array<{element: HTMLElement, offset: number, sticky: {start?: number, end?: number}}>} offsetTree\n * @return {ScrollScene}\n */\nfunction transformSceneRangesToOffsets (scene, rect, viewportSize, isHorizontal, absoluteOffsetContext, offsetTree) {\n const { start, end, duration } = scene;\n\n let startOffset = start;\n let endOffset = end;\n let startRange = scene.startRange;\n let endRange = scene.endRange;\n let overrideDuration;\n\n if (typeof duration === 'string') {\n startRange = { name: duration, offset: 0 }\n endRange = { name: duration, offset: 100 }\n\n startOffset = transformRangeToPosition(startRange, viewportSize, rect);\n endOffset = transformRangeToPosition(endRange, viewportSize, rect);\n overrideDuration = endOffset - startOffset;\n\n const newAbsoluteRange = computeStickinessIntoFullRange(offsetTree, startOffset, endOffset, viewportSize, isHorizontal);\n\n startOffset = newAbsoluteRange.start;\n endOffset = newAbsoluteRange.end;\n }\n else {\n if (startRange || start?.name) {\n startRange = startRange || start;\n\n const startAdd = transformAbsoluteOffsetToNumber(startRange.add, absoluteOffsetContext);\n const absoluteStartOffset = transformRangeToPosition({...startRange, offset: 0}, viewportSize, rect);\n const absoluteEndOffset = transformRangeToPosition({...startRange, offset: 100}, viewportSize, rect);\n // we take 0% to 100% of the named range for start, and we compute the position by adding the sticky addition for the given start offset\n const newAbsoluteRange = computeStickinessIntoFullRange(offsetTree, absoluteStartOffset, absoluteEndOffset, viewportSize, isHorizontal);\n\n startOffset = newAbsoluteRange.start + (startRange.offset / 100) * (newAbsoluteRange.end - newAbsoluteRange.start) + startAdd;\n }\n\n if (endRange || end?.name) {\n endRange = endRange || end;\n\n const endAdd = transformAbsoluteOffsetToNumber(endRange.add, absoluteOffsetContext);\n const absoluteStartOffset = transformRangeToPosition({...endRange, offset: 0}, viewportSize, rect);\n const absoluteEndOffset = transformRangeToPosition({...endRange, offset: 100}, viewportSize, rect);\n // we take 0% to 100% of the named range for end, and we compute the position by adding the sticky addition for the given end offset\n const newAbsoluteRange = computeStickinessIntoFullRange(offsetTree, absoluteStartOffset, absoluteEndOffset, viewportSize, isHorizontal);\n\n endOffset = newAbsoluteRange.start + (endRange.offset / 100) * (newAbsoluteRange.end - newAbsoluteRange.start) + endAdd;\n }\n else if (typeof duration === 'number') {\n endOffset = startOffset + duration;\n }\n }\n\n if (!overrideDuration && !duration) {\n overrideDuration = endOffset - startOffset;\n }\n\n return {...scene, start: startOffset, end: endOffset, startRange, endRange, duration: overrideDuration || duration };\n}\n\n/**\n * Check whether the position of an element is sticky.\n *\n * @param {CSSStyleDeclaration} style\n * @return {boolean}\n */\nfunction getIsSticky (style) {\n return style.position === 'sticky';\n}\n\n/**\n * Check whether the position of an element is sticky.\n *\n * @param {CSSStyleDeclaration} style\n * @param {HTMLElement} offsetParent\n * @param {HTMLElement} root\n * @return {boolean}\n */\nfunction getIsFixed (style, offsetParent, root) {\n return style.position === 'fixed' && (!offsetParent || offsetParent === window.document.body || offsetParent === root);\n}\n\n/**\n * Get start offset of an element in scroll direction.\n *\n * @param {CSSStyleDeclaration} style\n * @param {boolean} isHorizontal\n * @return {number}\n */\nfunction getStickyStartOffset (style, isHorizontal) {\n return parseInt(isHorizontal ? style.left : style.top);\n}\n\n/**\n * Get end offset of an element in scroll direction.\n *\n * @param {CSSStyleDeclaration} style\n * @param {boolean} isHorizontal\n * @return {number}\n */\nfunction getStickyEndOffset (style, isHorizontal) {\n return parseInt(isHorizontal ? style.right : style.bottom);\n}\n\n/**\n *\n * @param {HTMLElement} element\n * @param {boolean} isHorizontal\n * @param {boolean} isSticky\n * @return {number}\n */\nfunction getRectStart (element, isHorizontal, isSticky) {\n // TODO: implement support for RTL writing-mode\n if (isSticky) {\n element.style.position = 'static';\n }\n\n const result = (isHorizontal ? element.offsetLeft : element.offsetTop) || 0;\n\n if (isSticky) {\n // assuming the sticky position came from a stylesheet and not set inline\n element.style.position = null;\n }\n\n return result\n}\n\nfunction getStickyData (style, isHorizontal) {\n let sticky;\n const stickyStart = getStickyStartOffset(style, isHorizontal);\n const stickyEnd = getStickyEndOffset(style, isHorizontal);\n const hasStickyStart = !isNaN(stickyStart);\n const hasStickyEnd = !isNaN(stickyEnd);\n\n if (hasStickyStart || hasStickyEnd) {\n sticky = {};\n\n if (hasStickyStart) {\n sticky.start = stickyStart;\n }\n if (hasStickyEnd) {\n sticky.end = stickyEnd;\n }\n }\n\n return sticky;\n}\n\n/**\n * Returns an array of converted scenes' data for grouped scenes (assumes same viewSource) from ranges into offsets in pixels.\n *\n * @param {ScrollScene[]} scenes\n * @param {Window|HTMLElement} root\n * @param {number} viewportSize\n * @param {boolean} isHorizontal\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n * @return {ScrollScene[]}\n */\nexport function getTransformedSceneGroup (scenes, root, viewportSize, isHorizontal, absoluteOffsetContext) {\n const element = scenes[0].viewSource;\n const offsetTree = [];\n let size = (isHorizontal ? element.offsetWidth : element.offsetHeight) || 0;\n let elementLayoutStart = 0;\n let parent = element;\n\n while (parent) {\n const nodeStyle = window.getComputedStyle(parent);\n const isSticky = getIsSticky(nodeStyle);\n const sticky = isSticky ? getStickyData(nodeStyle, isHorizontal) : undefined;\n\n // get the base offset of the source element - before adding sticky intervals\n const offset = getRectStart(parent, isHorizontal, isSticky);\n\n // if we have sticky end (bottom or right) ignore offset for this element because it will stick to its parent's start edge\n if (!sticky || !('end' in sticky)) {\n elementLayoutStart += offset;\n }\n\n offsetTree.push({element: parent, offset, sticky});\n\n parent = parent.offsetParent;\n const isFixed = getIsFixed(nodeStyle, parent, root);\n if (isFixed) {\n break;\n } else if (parent === root) {\n offsetTree.push({element: parent, offset: 0});\n break;\n }\n }\n\n offsetTree.reverse();\n\n const transformedScenes = scenes.map(scene => ({\n ...transformSceneRangesToOffsets(\n scene,\n {start: elementLayoutStart, end: elementLayoutStart + size},\n viewportSize,\n isHorizontal,\n absoluteOffsetContext,\n offsetTree\n ),\n }));\n\n return transformedScenes;\n}\n\n/**\n * Returns a converted scene data from ranges into offsets in pixels.\n *\n * @param {ScrollScene} scene\n * @param {Window|HTMLElement} root\n * @param {number} viewportSize\n * @param {boolean} isHorizontal\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n * @return {ScrollScene}\n */\nexport function getTransformedScene (scene, root, viewportSize, isHorizontal, absoluteOffsetContext) {\n return getTransformedSceneGroup([scene], root, viewportSize, isHorizontal, absoluteOffsetContext)[0];\n}\n\n","import { debounce, defaultTo } from './utilities.js';\nimport { getTransformedSceneGroup } from './view.js';\n\nconst VIEWPORT_RESIZE_INTERVAL = 100;\n\n/**\n * @private\n * @type {scrollConfig}\n */\nconst DEFAULTS = {\n horizontal: false,\n observeViewportEntry: true,\n viewportRootMargin: '7% 7%',\n observeViewportResize: false,\n observeSourcesResize: false,\n observeContentResize: false,\n};\n\n/*\n * Utilities for scroll controller\n */\n\n\n/**\n * Utility for calculating effect progress.\n *\n * @private\n * @param {number} p current scroll position\n * @param {number} start start position\n * @param {number} end end position\n * @param {number} duration duration of effect in scroll pixels\n * @return {number} effect progress, between 0 and 1\n */\nfunction calcProgress (p, start, end, duration) {\n let progress = 0;\n\n if (p >= start && p <= end) {\n progress = duration ? (p - start) / duration : 1;\n }\n else if (p > end) {\n progress = 1;\n }\n\n return progress;\n}\n\n/**\n *\n * @param {Window|HTMLElement} root\n * @param {boolean} isHorizontal\n * @return {number}\n */\nfunction getViewportSize (root, isHorizontal) {\n if (root === window) {\n return isHorizontal\n ? window.document.documentElement.clientWidth\n : window.document.documentElement.clientHeight;\n }\n\n return isHorizontal ? root.clientWidth : root.clientHeight;\n}\n\nfunction getAbsoluteOffsetContext () {\n // TODO: re-calc on viewport resize\n return {\n viewportWidth: window.document.documentElement.clientWidth,\n viewportHeight: window.document.documentElement.clientHeight\n };\n}\n\n/*\n * Scroll controller factory\n */\n\n/**\n * Initialize and return a scroll controller.\n *\n * @private\n * @param {scrollConfig} config\n * @return {{tick: function, destroy: function}}\n */\nexport function getController (config) {\n const _config = defaultTo(config, DEFAULTS);\n const root = _config.root;\n const horizontal = _config.horizontal;\n const scenesByElement = new WeakMap();\n let viewportSize = getViewportSize(root, horizontal);\n\n let lastP;\n let viewportObserver, rangesResizeObserver, viewportResizeHandler, scrollportResizeObserver;\n const rangesToObserve = [];\n const absoluteOffsetContext = getAbsoluteOffsetContext()\n\n /*\n * Prepare scenes data.\n */\n _config.scenes = Object.values(\n // TODO(ameerf): find a polyfill and use groupBy instead of following reduce\n config.scenes.reduce((acc, scene, index) => {\n const key = scene.groupId ? `group-${scene.groupId}` : String(index);\n if (acc[key]) {\n acc[key].push(scene)\n } else {\n acc[key] = [scene];\n }\n return acc;\n },\n {})\n ).flatMap(sceneGroup => {\n if (sceneGroup.every(scene => (scene.viewSource && (typeof scene.duration === 'string' || scene.start?.name)))) {\n sceneGroup = getTransformedSceneGroup(sceneGroup, root, viewportSize, horizontal, absoluteOffsetContext);\n if (_config.observeSourcesResize || _config.observeContentResize) {\n rangesToObserve.push(sceneGroup);\n }\n } else {\n sceneGroup.forEach(scene => {\n if (scene.end == null) {\n scene.end = scene.start + scene.duration;\n }\n if (scene.duration == null) {\n scene.duration = scene.end - scene.start;\n }\n });\n }\n\n return sceneGroup;\n });\n _config.scenes.forEach((scene, index) => {scene.index = index;});\n\n if (rangesToObserve.length) {\n const targetToSceneGroup = new Map();\n\n if (window.ResizeObserver) {\n /*\n * Observe resize of view-timeline subjects.\n */\n rangesResizeObserver = new window.ResizeObserver(function (entries) {\n entries.forEach(entry => {\n const sceneGroup = targetToSceneGroup.get(entry.target);\n // TODO: try to optimize by using `const {blockSize, inlineSize} = entry.borderBoxSize[0]`\n const transformedSceneGroup = getTransformedSceneGroup(sceneGroup, root, viewportSize, horizontal, absoluteOffsetContext);\n transformedSceneGroup.forEach((scene, localIndex) => {_config.scenes[scene.index] = transformedSceneGroup[localIndex];});\n // replace the old object from the cache with the new one\n rangesToObserve.splice(rangesToObserve.indexOf(sceneGroup), 1, transformedSceneGroup);\n });\n });\n\n rangesToObserve.forEach(sceneGroup => {\n rangesResizeObserver.observe(sceneGroup[0].viewSource, {box: 'border-box'});\n targetToSceneGroup.set(sceneGroup[0].viewSource, sceneGroup);\n });\n\n /*\n * Observe resize of content root.\n */\n if (_config.observeContentResize && _config.contentRoot) {\n const contentResizeObserver = new window.ResizeObserver(debounce(() => {\n const newRanges = rangesToObserve.map(sceneGroup => {\n const newSceneGroup = getTransformedSceneGroup(sceneGroup, root, viewportSize, horizontal, absoluteOffsetContext);\n newSceneGroup.forEach((scene, localIndex) => {_config.scenes[scene.index] = newSceneGroup[localIndex];});\n\n return newSceneGroup;\n });\n\n // reset cache\n rangesToObserve.length = 0;\n rangesToObserve.push(...newRanges);\n rangesToObserve.forEach(sceneGroup => {\n targetToSceneGroup.set(sceneGroup[0].viewSource, sceneGroup);\n });\n }, VIEWPORT_RESIZE_INTERVAL));\n\n contentResizeObserver.observe(_config.contentRoot, {box: 'border-box'});\n }\n }\n\n if (_config.observeViewportResize) {\n viewportResizeHandler = debounce(function () {\n viewportSize = getViewportSize(root, horizontal);\n\n const newRanges = rangesToObserve.map(sceneGroup => {\n const newSceneGroup = getTransformedSceneGroup(sceneGroup, root, viewportSize, horizontal, absoluteOffsetContext);\n newSceneGroup.forEach((scene, localIndex) => {_config.scenes[scene.index] = newSceneGroup[localIndex];});\n\n return newSceneGroup;\n });\n\n // reset cache\n rangesToObserve.length = 0;\n rangesToObserve.push(...newRanges);\n rangesToObserve.forEach(sceneGroup => {\n targetToSceneGroup.set(sceneGroup[0].viewSource, sceneGroup);\n });\n }, VIEWPORT_RESIZE_INTERVAL);\n\n if (root === window) {\n window.addEventListener('resize', viewportResizeHandler);\n }\n else if (window.ResizeObserver) {\n scrollportResizeObserver = new window.ResizeObserver(viewportResizeHandler);\n scrollportResizeObserver.observe(root, {box: 'border-box'});\n }\n }\n }\n\n /*\n * Observe entry and exit of scenes into view\n */\n if (_config.observeViewportEntry && window.IntersectionObserver) {\n viewportObserver = new window.IntersectionObserver(function (intersections) {\n intersections.forEach(intersection => {\n (scenesByElement.get(intersection.target) || []).forEach(scene => {\n scene.disabled = !intersection.isIntersecting;\n });\n });\n }, {\n root: root === window ? window.document : root,\n rootMargin: _config.viewportRootMargin,\n threshold: 0\n });\n\n _config.scenes.forEach(scene => {\n if (scene.viewSource) {\n let scenesArray = scenesByElement.get(scene.viewSource);\n\n if (!scenesArray) {\n scenesArray = [];\n scenesByElement.set(scene.viewSource, scenesArray);\n\n viewportObserver.observe(scene.viewSource);\n }\n\n scenesArray.push(scene);\n }\n });\n }\n\n /**\n * Updates progress in all scene effects.\n *\n * @private\n * @param {Object} progress\n * @param {number} progress.p\n * @param {number} progress.vp\n */\n function tick ({p, vp}) {\n p = +p.toFixed(1);\n\n const velocity = +vp.toFixed(4);\n\n // if nothing changed bail out\n if (p === lastP) return;\n\n /*\n * Perform scene progression.\n */\n for (let scene of _config.scenes) {\n // if active\n if (!scene.disabled) {\n const {start, end, duration} = scene;\n // calculate scene's progress\n const progress = calcProgress(p, start, end, duration);\n\n // run effect\n scene.effect(scene, progress, velocity);\n }\n }\n\n // cache last position\n lastP = p;\n }\n\n /**\n * Removes all side effects and deletes all objects.\n */\n function destroy () {\n _config.scenes.forEach(scene => scene.destroy?.());\n\n if (viewportObserver) {\n viewportObserver.disconnect();\n viewportObserver = null;\n }\n\n if (rangesResizeObserver) {\n rangesResizeObserver.disconnect();\n rangesResizeObserver = null;\n }\n\n if (viewportResizeHandler) {\n if (scrollportResizeObserver) {\n scrollportResizeObserver.disconnect();\n scrollportResizeObserver = null;\n }\n else {\n window.removeEventListener('resize', viewportResizeHandler);\n }\n }\n }\n\n /**\n * Scroll controller.\n */\n return {\n tick,\n destroy\n };\n}\n","import { getController } from './controller.js';\nimport { defaultTo, frameThrottle, lerp } from './utilities.js';\n\n/**\n * @private\n */\nconst DEFAULTS = {\n transitionActive: false,\n transitionFriction: 0.9,\n transitionEpsilon: 1,\n velocityActive: false,\n velocityMax: 1\n};\n\n/**\n * @class Scroll\n * @param {scrollConfig} config\n *\n * @example\n * import { Scroll } from 'fizban';\n *\n * const scroll = new Scroll({\n * scenes: [...]\n * });\n * scroll.start();\n */\nexport class Scroll {\n constructor (config = {}) {\n this.config = defaultTo(config, DEFAULTS);\n\n this.progress = {\n p: 0,\n prevP: 0,\n vp: 0\n };\n this.currentProgress = {\n p: 0,\n prevP: 0,\n vp: 0\n };\n\n this._lerpFrameId = 0;\n this.effect = null;\n const isDocumentRoot = (!this.config.root || this.config.root === window.document.body);\n // if no root or root is document.body then use window\n this.config.root = isDocumentRoot ? window : this.config.root;\n this.config.contentRoot = this.config.contentRoot || (isDocumentRoot ? window.document.body : this.config.root.firstElementChild);\n this.config.resetProgress = this.config.resetProgress || this.resetProgress.bind(this);\n\n this._measure = this.config.measure || (() => {\n const root = this.config.root;\n // get current scroll position from window or element\n this.progress.p = this.config.horizontal\n ? root.scrollX || root.scrollLeft || 0\n : root.scrollY || root.scrollTop || 0;\n });\n\n this._trigger = frameThrottle(() => {\n this._measure?.();\n this.tick(true);\n });\n }\n\n /**\n * Setup event and effect, and reset progress and frame.\n */\n start () {\n this.setupEffect();\n this.setupEvent();\n this.resetProgress();\n this.tick();\n }\n\n /**\n * Removes event listener.\n */\n pause () {\n this.removeEvent();\n }\n\n /**\n * Reset progress in the DOM and inner state to given x and y.\n *\n * @param {Object} [scrollPosition]\n * @param {number} [scrollPosition.x]\n * @param {number} [scrollPosition.y]\n */\n resetProgress (scrollPosition = {}) {\n // get current scroll position (support window, element)\n const root = this.config.root;\n const x = scrollPosition.x || scrollPosition.x === 0 ? scrollPosition.x : root.scrollX || root.scrollLeft || 0;\n const y = scrollPosition.y || scrollPosition.y === 0 ? scrollPosition.y : root.scrollY || root.scrollTop || 0;\n const p = this.config.horizontal ? x : y;\n this.progress.p = p;\n this.progress.prevP = p;\n this.progress.vp = 0;\n\n if ( this.config.transitionActive ) {\n this.currentProgress.p = p;\n this.currentProgress.prevP = p;\n this.currentProgress.vp = 0;\n }\n\n if (scrollPosition) {\n this.config.root.scrollTo(x, y);\n }\n }\n\n /**\n * Handle animation frame work.\n *\n * @param {boolean} [clearLerpFrame] whether to cancel an existing lerp frame\n */\n tick (clearLerpFrame) {\n const hasLerp = this.config.transitionActive;\n\n // if transition is active interpolate to next point\n if (hasLerp) {\n this.lerp();\n }\n\n // choose the object we iterate on\n const progress = hasLerp ? this.currentProgress : this.progress;\n\n if (this.config.velocityActive) {\n const dp = progress.p - progress.prevP;\n const factorP = dp < 0 ? -1 : 1;\n progress.vp = Math.min(this.config.velocityMax, Math.abs(dp)) / this.config.velocityMax * factorP;\n }\n\n // update effect\n this.effect.tick(progress);\n\n if (hasLerp && (progress.p !== this.progress.p)) {\n if (clearLerpFrame && this._lerpFrameId) {\n window.cancelAnimationFrame(this._lerpFrameId);\n }\n\n this._lerpFrameId = window.requestAnimationFrame(() => this.tick());\n }\n\n progress.prevP = progress.p;\n }\n\n /**\n * Calculate current progress.\n */\n lerp () {\n this.currentProgress.p = lerp(this.currentProgress.p, this.progress.p, +(1 - this.config.transitionFriction).toFixed(3), this.config.transitionEpsilon);\n }\n\n /**\n * Stop the event and effect, and remove all DOM side-effects.\n */\n destroy () {\n this.pause();\n this.removeEffect();\n }\n\n /**\n * Register to scroll for triggering update.\n */\n setupEvent () {\n this.removeEvent();\n this.config.root.addEventListener('scroll', this._trigger);\n }\n\n /**\n * Remove scroll handler.\n */\n removeEvent () {\n this.config.root.removeEventListener('scroll', this._trigger);\n }\n\n /**\n * Reset registered effect.\n */\n setupEffect () {\n this.removeEffect();\n this.effect = getController(this.config);\n }\n\n /**\n * Remove registered effect.\n */\n removeEffect () {\n this.effect && this.effect.destroy();\n this.effect = null;\n }\n}\n\n/**\n * @typedef {object} scrollConfig\n * @property {ScrollScene[]} scenes list of effect scenes to perform during scroll.\n * @property {boolean} [horizontal] whether to use the horizontal axis. Defaults to `false`.\n * @property {boolean} [transitionActive] whether to animate effect progress.\n * @property {number} [transitionFriction] between 0 to 1, amount of friction effect in the transition. 1 being no movement and 0 as no friction. Defaults to 0.4.\n * @property {boolean} [velocityActive] whether to calculate velocity with progress.\n * @property {number} [velocityMax] max possible value for velocity. Velocity value will be normalized according to this number, so it is kept between 0 and 1. Defaults to 1.\n * @property {boolean} [observeViewportEntry] whether to observe entry/exit of scenes into viewport for disabling/enabling them. Defaults to `true`.\n * @property {boolean} [viewportRootMargin] `rootMargin` option to be used for viewport observation. Defaults to `'7% 7%'`.\n * @property {boolean} [observeViewportResize] whether to observe resize of the layout viewport. Defaults to `false`.\n * @property {boolean} [observeSourcesResize] whether to observe resize of view-timeline source elements. Defaults to `false`.\n * @property {boolean} [observeContentResize] whether to observe resize of content root of the scroll container. Defaults to `false`.\n * @property {Element|Window} [root] the scrollable element, defaults to window.\n * @property {Element} [contentRoot] the root element for the content, defaults to first child of root or body element.\n */\n\n/**\n * @typedef {Object} ScrollScene\n * @desc A configuration object for a scene. Must be provided an effect function, and either a start and end, a start and duration, or a duration as RangeName.\n * @example { effects: (scene, p) => { animation.currentTime = p; }, duration: 'contain' }\n * @property {EffectCallback} effect the effect to perform.\n * @property {number|RangeOffset} start scroll position in pixels where effect starts.\n * @property {number|RangeName} [duration] duration of effect in pixels. Defaults to end - start.\n * @property {number|RangeOffset} [end] scroll position in pixels where effect ends. Defaults to start + duration.\n * @property {boolean} [disabled] whether to perform updates on the scene. Defaults to false.\n * @property {Element} [viewSource] an element to be used for observing intersection with viewport for disabling/enabling the scene, or the source of a ViewTimeline if scene start/end are provided as ranges.\n * @property {function} [destroy] a function clean up the scene when it's controller is destroyed.\n * @property {string} [groupId] a string id for a group of scenes sharing same viewSource and part of the same overall animation\n */\n\n/**\n * @typedef {function(scene: ScrollScene, progress: number, velocity: number): void} EffectCallback\n * @param {ScrollScene} scene\n * @param {number} progress\n * @param {number} velocity\n */\n\n/**\n * @typedef {'entry' | 'contain' | 'exit' | 'cover' | 'entry-crossing' | 'exit-crossing'} RangeName\n */\n\n/**\n * @typedef {Object} RangeOffset\n * @property {RangeName} name\n * @property {number} offset\n * @property {CSSUnitValue} [add]\n */\n\n/**\n * @typedef {Object} CSSUnitValue\n * @property {number} value\n * @property {'px'|'vh'|'vw'} unit\n */\n\n/**\n * @typedef {Object} AbsoluteOffsetContext\n * @property {number} viewportWidth\n * @property {number} viewportHeight\n */\n","import type { AnimationGroup, ScrubScrollScene } from '@wix/motion';\nimport { getWebAnimation, getScrubScene } from '@wix/motion';\nimport { Scroll } from 'fizban';\nimport type { ViewEnterParams, ScrubEffect, HandlerObjectMap, InteractOptions } from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst scrollManagerMap = new WeakMap() as HandlerObjectMap;\nlet scrollOptionsGetter: () => Partial<scrollConfig> = () => ({});\n\nfunction registerOptionsGetter(getter: () => Partial<scrollConfig>) {\n scrollOptionsGetter = getter;\n}\n\nfunction addViewProgressHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: ScrubEffect,\n __: ViewEnterParams,\n { reducedMotion }: InteractOptions,\n): void {\n if (reducedMotion) {\n return;\n }\n\n const triggerParams = {\n trigger: 'view-progress' as const,\n element: source,\n };\n\n const effectOptions = effectToAnimationOptions(effect);\n let cleanup;\n if ('ViewTimeline' in window) {\n // Use ViewTimeline for modern browsers\n const animationGroup = getWebAnimation(target, effectOptions, triggerParams);\n\n if (animationGroup) {\n animationGroup.play();\n\n cleanup = () => {\n (animationGroup as AnimationGroup).ready.then(() => {\n animationGroup.cancel();\n });\n };\n }\n } else {\n const scene = getScrubScene(target, effectOptions, triggerParams);\n\n if (scene) {\n const scenes = Array.isArray(scene) ? scene : [scene];\n const scroll = new Scroll({\n viewSource: source,\n scenes,\n observeViewportEntry: false,\n observeViewportResize: false,\n observeSourcesResize: true,\n root: document.body,\n ...scrollOptionsGetter(),\n });\n\n cleanup = () => {\n scroll.destroy();\n };\n\n Promise.all((scenes as ScrubScrollScene[]).map((s) => s.ready || Promise.resolve())).then(\n () => {\n scroll.start();\n },\n );\n }\n }\n\n if (!cleanup) return;\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(scrollManagerMap, source, handlerObj);\n addHandlerToMap(scrollManagerMap, target, handlerObj);\n}\n\nfunction removeViewProgressHandler(element: HTMLElement): void {\n removeElementFromHandlerMap(scrollManagerMap, element);\n}\n\nexport default {\n add: addViewProgressHandler,\n remove: removeViewProgressHandler,\n registerOptionsGetter,\n};\n","/**\n * Clamps a value between limits.\n *\n * @private\n * @param {number} min lower limit\n * @param {number} max upper limit\n * @param {number} value value to clamp\n * @return {number} clamped value\n *\n * @example\n * const x = clamp(0, 1, 1.5); // returns 1\n */\nfunction clamp (min, max, value) {\n return Math.min(Math.max(min, value), max);\n}\n\n/**\n * Throttle a function to trigger once per animation frame.\n * Keeps the arguments from last call, even if that call gets ignored.\n *\n * @private\n * @param {function} fn function to throttle\n * @return {(function(): number)} a function that will trigger the throttled function on next animation frame,\n * returns the requestAnimationFrame id, so it can be cancelled\n */\nfunction frameThrottle (fn) {\n let throttled = false;\n\n return function () {\n if (!throttled) {\n throttled = true;\n\n return window.requestAnimationFrame(() => {\n throttled = false;\n fn();\n });\n }\n };\n}\n\n/**\n * Returns an object containing the layout properties (left, top, width, and height) of the given element.\n *\n * @private\n * @param {HTMLElement} element\n * @returns {{top: number, left: number, width: number, height: number}}\n */\nfunction getRect (element) {\n let el = element;\n let left = 0;\n let top = 0;\n\n if (el.offsetParent) {\n do {\n left += el.offsetLeft;\n top += el.offsetTop;\n el = el.offsetParent;\n } while (el);\n }\n\n return {\n left,\n top,\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n}\n\n/**\n * @see https://issues.chromium.org/issues/40887601?pli=1\n */\nfunction testPointerOffsetDprBug () {\n const DPR = window.devicePixelRatio;\n let fixRequired = false;\n\n if (DPR === 1) {\n // we can immediately return here, not required to fix\n return false;\n }\n\n document.body.addEventListener('pointerdown', (e) => {\n fixRequired = e.offsetX !== 10;\n }, { once: true });\n\n const event = new PointerEvent('pointerdown', {\n clientX: 10\n });\n\n document.body.dispatchEvent(event);\n\n return fixRequired;\n}\n\nfunction testPointerOffsetScrollBug () {\n return new Promise((resolve) => {\n const startY = window.scrollY;\n let fixRequired = false;\n let currentY;\n\n function sampleOffsetY () {\n document.body.addEventListener('pointerdown', (e) => {\n if (currentY === undefined) {\n currentY = e.offsetY;\n } else {\n // when dispatching on BODY in different scroll it gives the same offsetY value only on WebKit\n fixRequired = e.offsetY === currentY;\n }\n }, { once: true });\n\n const event = new PointerEvent('pointerdown', {\n clientY: 500\n });\n\n document.body.dispatchEvent(event);\n }\n\n function scrollHandler () {\n if (window.scrollY !== startY) {\n window.removeEventListener('scroll', scrollHandler);\n sampleOffsetY();\n resolve(fixRequired);\n }\n }\n\n sampleOffsetY();\n\n window.addEventListener('scroll', scrollHandler);\n\n if (window.scrollY > 0) {\n window.scrollBy(0, -1);\n }\n });\n}\n\n/**\n * @see https://bugs.webkit.org/show_bug.cgi?id=287799\n */\nfunction testScrollOffsetsForWebKitPointerBug (scrollOffsets) {\n testPointerOffsetScrollBug().then((fixRequired) => {\n scrollOffsets.fixRequired = fixRequired;\n\n if (fixRequired) {\n window.addEventListener('scroll', scrollOffsets.scrollHandler);\n scrollOffsets.scrollHandler();\n }\n });\n}\n\nexport {\n getRect,\n clamp,\n frameThrottle,\n testPointerOffsetDprBug,\n testScrollOffsetsForWebKitPointerBug\n};\n","let listeners = 0;\nconst pointers = new Set();\n\nfunction initScrollendPolyfill () {\n const touchStartHandler = e => {\n for (let touch of e.changedTouches) {\n pointers.add(touch.identifier);\n }\n };\n const touchEndHandler = e => {\n for (let touch of e.changedTouches) {\n pointers.delete(touch.identifier);\n }\n };\n // Track if any pointer is active\n document.addEventListener('touchstart', touchStartHandler, {passive: true});\n document.addEventListener('touchend', touchEndHandler, {passive: true});\n\n return function () {\n pointers.clear();\n document.removeEventListener('touchstart', touchStartHandler);\n document.removeEventListener('touchend', touchEndHandler);\n };\n}\n\nexport function addScrollendListener (target, listener) {\n if ('onscrollend' in window) {\n target.addEventListener('scrollend', listener);\n\n return function () {\n target.removeEventListener('scrollend', listener);\n };\n }\n\n let timeout = 0;\n let removeScrollendPolyfill;\n\n if (!listeners) {\n removeScrollendPolyfill = initScrollendPolyfill();\n }\n\n listeners += 1;\n\n function scrollListener (evt) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n if (pointers.size) {\n // if pointer(s) are down, wait longer\n setTimeout(scrollListener, 100);\n }\n else {\n // dispatch\n listener(evt);\n timeout = 0;\n }\n }, 100);\n }\n\n target.addEventListener('scroll', scrollListener);\n\n return function () {\n target.removeEventListener('scroll', scrollListener);\n listeners -= 1;\n\n if (!listeners) {\n removeScrollendPolyfill();\n }\n };\n}\n","import { getRect, clamp } from './utilities.js';\nimport { addScrollendListener } from './scrollend.js';\n\n/**\n * Return new progress for {x, y} for the farthest-side formula (\"cover\").\n *\n * @param {Object} target\n * @param {number} target.left\n * @param {number} target.top\n * @param {number} target.width\n * @param {number} target.height\n * @param {Object} root\n * @param {number} root.width\n * @param {number} root.height\n * @param {{x: number, y: number}} scrollPosition\n * @returns {{x: (x: number) => number, y: (y: number) => number}}\n */\nfunction centerToTargetFactory (target, root, scrollPosition) {\n // we store reference to the arguments and do all calculation on the fly\n // so that target dims, scroll position, and root dims are always up-to-date\n return {\n x (x1) {\n const layerCenterX = target.left - scrollPosition.x + target.width / 2;\n const isXStartFarthest = layerCenterX >= root.width / 2;\n\n const xDuration = (isXStartFarthest ? layerCenterX : root.width - layerCenterX) * 2;\n const x0 = isXStartFarthest ? 0 : layerCenterX - xDuration / 2;\n\n return (x1 - x0) / xDuration;\n },\n y (y1) {\n const layerCenterY = target.top - scrollPosition.y + target.height / 2;\n const isYStartFarthest = layerCenterY >= root.height / 2;\n\n const yDuration = (isYStartFarthest ? layerCenterY : root.height - layerCenterY) * 2;\n const y0 = isYStartFarthest ? 0 : layerCenterY - yDuration / 2;\n\n return (y1 - y0) / yDuration;\n }\n };\n}\n\n/**\n * Updates scroll position on scrollend.\n * Used when root is entire viewport and centeredOnTarget=true.\n */\nfunction scrollendCallback (tick, lastProgress) {\n this.x = window.scrollX;\n this.y = window.scrollY;\n\n requestAnimationFrame(() => tick && tick(lastProgress));\n}\n\n/**\n * Update root rect when root is entire viewport.\n *\n * @param {PointerConfig} config\n */\nfunction windowResize (config) {\n config.rect.width = window.document.documentElement.clientWidth;\n config.rect.height = window.document.documentElement.clientHeight;\n}\n\n/**\n * Observe and update root rect when root is an element.\n *\n * @param {PointerConfig} config\n * @returns {ResizeObserver}\n */\nfunction observeRootResize (config) {\n const observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n config.rect.width = entry.borderBoxSize[0].inlineSize;\n config.rect.height = entry.borderBoxSize[0].blockSize;\n });\n });\n\n observer.observe(config.root, { box: 'border-box' });\n\n return observer;\n}\n\n/**\n * Initialize and return a pointer controller.\n *\n * @private\n * @param {PointerConfig} config\n * @return {{tick: function, destroy: function}}\n */\nexport function getController (config) {\n let hasCenteredToTarget = false;\n let lastProgress = {x: config.rect.width / 2, y: config.rect.height / 2, vx: 0, vy: 0};\n let tick, resizeObserver, windowResizeHandler, scrollendHandler, removeScrollendListener;\n\n const scrollPosition = {x: 0, y: 0};\n\n /*\n * Prepare scenes data.\n */\n config.scenes.forEach((scene) => {\n if (scene.target && scene.centeredToTarget) {\n scene.transform = centerToTargetFactory(getRect(scene.target), config.rect, scrollPosition);\n\n hasCenteredToTarget = true;\n }\n\n if (config.root) {\n resizeObserver = observeRootResize(config);\n }\n else {\n windowResizeHandler = windowResize.bind(null, config);\n window.addEventListener('resize', windowResizeHandler);\n }\n });\n\n /**\n * Updates progress in all scene effects.\n *\n * @private\n * @param {Object} progress\n * @param {number} progress.x\n * @param {number} progress.y\n * @param {number} progress.vx\n * @param {number} progress.vy\n */\n tick = function (progress) {\n for (let scene of config.scenes) {\n if (!scene.disabled) {\n // get scene's progress\n const normalizedX = scene.transform?.x(progress.x) || progress.x / config.rect.width;\n const normalizedY = scene.transform?.y(progress.y) || progress.y / config.rect.height;\n\n const x = +clamp(0, 1, normalizedX).toPrecision(4);\n const y = +clamp(0, 1, normalizedY).toPrecision(4);\n\n const velocity = {x: progress.vx, y: progress.vy};\n\n if (config.allowActiveEvent) {\n progress.active = (normalizedX <= 1 && normalizedY <= 1 && normalizedX >= 0 && normalizedY >= 0);\n }\n\n // run effect\n scene.effect(scene, {x, y}, velocity, progress.active);\n }\n }\n\n Object.assign(lastProgress, progress);\n }\n\n if (hasCenteredToTarget) {\n scrollendHandler = scrollendCallback.bind(scrollPosition, tick, lastProgress)\n removeScrollendListener = addScrollendListener(document, scrollendHandler);\n }\n\n /**\n * Removes all side effects and deletes all objects.\n */\n function destroy () {\n config.scenes.forEach(scene => scene.destroy?.());\n\n removeScrollendListener?.();\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n else {\n window.removeEventListener('resize', windowResizeHandler);\n windowResizeHandler = null;\n }\n\n tick = null;\n lastProgress = null;\n }\n\n /**\n * Mouse controller.\n */\n return {\n tick,\n destroy\n };\n}\n","import { getController } from './controller.js';\nimport { frameThrottle, testPointerOffsetDprBug, testScrollOffsetsForWebKitPointerBug } from './utilities.js';\n\nconst MOVEMENT_RESET_DELAY = 1e3 / 60 * 3; // == 50 (3 frames in 60fps)\nlet shouldFixSynthPointer;\n\nfunction scrollHandler () {\n scrollOffsets.x = window.scrollX;\n scrollOffsets.y = window.scrollY;\n}\nconst scrollOffsets = { x: 0, y: 0, scrollHandler, fixRequired: undefined };\n\n/**\n * @class Pointer\n * @param {PointerConfig} config\n *\n * @example\n * import { Pointer } from 'kuliso';\n *\n * const pointer = new Pointer({\n * scenes: [...]\n * });\n *\n * pointer.start();\n */\nexport class Pointer {\n constructor (config = {}) {\n this.config = { ...config };\n\n this.effect = null;\n this._nextTick = null;\n this._nextTransitionTick = null;\n this._startTime = 0;\n\n let trigger;\n\n if (this.config.transitionDuration) {\n trigger = this.config.noThrottle\n ? () => this.transition()\n : frameThrottle(() => this.transition());\n }\n else {\n trigger = this.config.noThrottle\n ? () => {\n this.tick();\n return null;\n }\n : frameThrottle(() => {\n this.tick();\n });\n }\n\n // in no root then use the viewport's size\n this.config.rect = this.config.root\n ? {\n width: this.config.root.offsetWidth,\n height: this.config.root.offsetHeight\n }\n : {\n width: window.document.documentElement.clientWidth,\n height: window.document.documentElement.clientHeight\n };\n\n\n this.progress = {\n x: this.config.rect.width / 2,\n y: this.config.rect.height / 2,\n vx: 0,\n vy: 0\n };\n this.previousProgress = { ...this.progress };\n this.currentProgress = null;\n\n const _measure = (event) => {\n const newX = this.config.root ? event.offsetX : event.x;\n const newY = this.config.root ? event.offsetY : event.y;\n this.progress.vx = newX - this.progress.x;\n this.progress.vy = newY - this.progress.y;\n this.progress.x = newX;\n this.progress.y = newY;\n this._nextTick = trigger();\n };\n\n this._pointerLeave = () => {\n this.progress.active = false;\n this.progress.vx = 0;\n this.progress.vy = 0;\n this._nextTick = trigger();\n };\n\n this._pointerEnter = () => {\n this.progress.active = true;\n this._nextTick = trigger();\n };\n\n if (this.config.root) {\n shouldFixSynthPointer = typeof shouldFixSynthPointer === 'boolean' ? shouldFixSynthPointer : testPointerOffsetDprBug();\n const DPR = shouldFixSynthPointer ? window.devicePixelRatio : 1;\n\n if (typeof scrollOffsets.fixRequired === 'undefined') {\n testScrollOffsetsForWebKitPointerBug(scrollOffsets);\n }\n\n this._measure = (e) => {\n if (e.target !== this.config.root) {\n const event = new PointerEvent('pointermove', {\n bubbles: true,\n cancelable: true,\n clientX: e.x * DPR + scrollOffsets.x,\n clientY: e.y * DPR + scrollOffsets.y,\n });\n\n e.stopPropagation();\n\n this.config.root.dispatchEvent(event);\n } else {\n _measure(e);\n }\n }\n } else {\n this._measure = _measure;\n }\n }\n\n /**\n * Setup event and effect, and reset progress and frame.\n */\n start () {\n this.setupEffect();\n this.setupEvent();\n }\n\n /**\n * Removes event listener.\n */\n pause () {\n this.removeEvent();\n }\n\n /**\n * Handle animation frame work.\n */\n tick () {\n this.effect.tick(this.progress);\n }\n\n /**\n * Starts a transition from the previous progress to the current progress.\n *\n * @returns {number} the requestAnimationFrame id for the transition tick.\n */\n transition () {\n const duration = this.config.transitionDuration;\n const easing = this.config.transitionEasing || ((p) => p);\n const now = performance.now();\n let resetMovement = false;\n\n const tick = (time) => {\n const p = (time - this._startTime) / duration;\n const t = easing(Math.min(1, p));\n\n if (resetMovement) {\n this.progress.vx = 0;\n this.progress.vy = 0;\n resetMovement = false;\n }\n\n this.currentProgress = Object.entries(this.progress).reduce((acc, [key, value]) => {\n if (key === 'active') {\n acc[key] = value;\n } else {\n acc[key] = this.previousProgress[key] + (value - this.previousProgress[key]) * t;\n }\n return acc;\n }, this.currentProgress || {});\n\n if (p < 1) {\n this._nextTransitionTick = requestAnimationFrame(tick);\n\n // reset movement on next frame\n resetMovement = time - this._startTime > MOVEMENT_RESET_DELAY;\n }\n\n this.effect.tick(this.currentProgress);\n };\n\n if (this._startTime) {\n this._nextTransitionTick && cancelAnimationFrame(this._nextTransitionTick);\n\n Object.assign(this.previousProgress, this.currentProgress);\n\n this._startTime = now;\n\n tick(now);\n } else {\n this._startTime = now;\n }\n\n return this._nextTransitionTick;\n }\n\n /**\n * Stop the event and effect, and remove all DOM side effects.\n */\n destroy () {\n this.pause();\n this.removeEffect();\n this._nextTick && cancelAnimationFrame(this._nextTick);\n this._nextTransitionTick && cancelAnimationFrame(this._nextTransitionTick);\n }\n\n /**\n * Register to pointermove for triggering update.\n */\n setupEvent () {\n this.removeEvent();\n const element = this.config.root || window;\n element.addEventListener('pointermove', this._measure, {passive: true});\n\n if (this.config.eventSource) {\n this.config.eventSource.addEventListener('pointermove', this._measure, {passive: true});\n }\n\n if (this.config.allowActiveEvent) {\n element.addEventListener('pointerleave', this._pointerLeave, {passive: true});\n element.addEventListener('pointerenter', this._pointerEnter, {passive: true});\n\n if (this.config.eventSource) {\n this.config.eventSource.addEventListener('pointerleave', this._pointerLeave, {passive: true});\n this.config.eventSource.addEventListener('pointerenter', this._pointerEnter, {passive: true});\n }\n }\n }\n\n /**\n * Remove pointermove handler.\n */\n removeEvent () {\n const element = this.config.root || window;\n element.removeEventListener('pointermove', this._measure);\n\n if (this.config.eventSource) {\n this.config.eventSource.removeEventListener('pointermove', this._measure);\n }\n\n if (this.config.allowActiveEvent) {\n element.removeEventListener('pointerleave', this._pointerLeave);\n element.removeEventListener('pointerenter', this._pointerEnter);\n\n if (this.config.eventSource) {\n this.config.eventSource.removeEventListener('pointerleave', this._pointerLeave);\n this.config.eventSource.removeEventListener('pointerenter', this._pointerEnter);\n }\n }\n }\n\n /**\n * Reset registered effect.\n */\n setupEffect () {\n this.removeEffect();\n this.effect = getController(this.config);\n }\n\n /**\n * Remove registered effect.\n */\n removeEffect () {\n this.effect && this.effect.destroy();\n this.effect = null;\n }\n}\n\n/**\n * @typedef {object} PointerConfig\n * @property {PointerScene[]} scenes list of effect scenes to perform during pointermove.\n * @property {HTMLElement} [root] element to use as hit area for pointermove events. Defaults to entire viewport.\n * @property {{width: number, height: number}} [rect] created automatically on Pointer construction.\n * @property {boolean} [noThrottle] whether to disable throttling the effect by framerate.\n * @property {number} [transitionDuration] duration of transition effect in milliseconds.\n * @property {function} [transitionEasing] easing function for transition effect.\n * @property {boolean} [allowActiveEvent] whether to track timeline activation events.\n * @property {HTMLElement} [eventSource] an alternative source element to attach event handlers and retarget to root.\n */\n\n/**\n * @typedef {Object} PointerScene\n * @desc A configuration object for a scene. Must be provided an effect function.\n * @example { effects: (scene, p) => { animation.currentTime = p.x; } }\n * @property {PointerEffectCallback} effect the effect to perform.\n * @property {boolean} [centeredToTarget] whether this scene's progress is centered on the target's center.\n * @property {HTMLElement} [target] target element for the effect.\n * @property {boolean} [disabled] whether this scene is disabled.\n * @property {function} [destroy] a function clean up the scene when it's controller is destroyed.\n */\n\n/**\n * @typedef {function(scene: PointerScene, progress: {x: number, y: number}, velocity: {x: number, y: number}): void} PointerEffectCallback\n * @param {PointerScene} scene\n * @param {{x: number, y: number}} progress\n * @param {{x: number, y: number}} velocity\n */\n","import { getScrubScene } from '@wix/motion';\nimport { Pointer } from 'kuliso';\nimport type { PointerMoveParams, ScrubEffect, HandlerObjectMap, InteractOptions } from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst pointerManagerMap = new WeakMap() as HandlerObjectMap;\nlet pointerOptionsGetter: () => Partial<PointerConfig> = () => ({});\n\nfunction registerOptionsGetter(getter: () => Partial<PointerConfig>) {\n pointerOptionsGetter = getter;\n}\n\nfunction addPointerMoveHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: ScrubEffect,\n options: PointerMoveParams = {},\n { reducedMotion }: InteractOptions,\n) {\n if (reducedMotion) {\n return;\n }\n\n const triggerParams = {\n trigger: 'pointer-move' as const,\n element: source,\n axis: options.axis ?? 'y',\n };\n\n const scene = getScrubScene(target, effectToAnimationOptions(effect), triggerParams);\n\n if (scene) {\n const scenes = Array.isArray(scene) ? scene : [scene];\n const pointer = new Pointer({\n root: options.hitArea === 'self' ? source : undefined,\n scenes,\n ...pointerOptionsGetter(),\n });\n const cleanup = () => {\n pointer.destroy();\n };\n\n const handlerObj = { source, target, cleanup };\n\n addHandlerToMap(pointerManagerMap, source, handlerObj);\n addHandlerToMap(pointerManagerMap, target, handlerObj);\n\n Promise.all(\n scenes.map((s) => (s as { ready?: Promise<void> }).ready || Promise.resolve()),\n ).then(() => {\n pointer.start();\n });\n }\n}\n\nfunction removePointerMoveHandler(element: HTMLElement) {\n removeElementFromHandlerMap(pointerManagerMap, element);\n}\n\nexport default {\n add: addPointerMoveHandler,\n remove: removePointerMoveHandler,\n registerOptionsGetter,\n};\n","import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation } from '@wix/motion';\nimport type { AnimationEndParams, TimeEffect, HandlerObjectMap, InteractOptions } from '../types';\nimport {\n effectToAnimationOptions,\n addHandlerToMap,\n removeElementFromHandlerMap,\n} from './utilities';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\nfunction addAnimationEndHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: TimeEffect,\n __: AnimationEndParams,\n { reducedMotion, selectorCondition }: InteractOptions,\n): void {\n const animation = getAnimation(\n target,\n effectToAnimationOptions(effect),\n undefined,\n reducedMotion,\n ) as AnimationGroup | null;\n\n // Early return if animation is null, no handler attached\n if (!animation) {\n return;\n }\n\n const handler = () => {\n if (selectorCondition && !target.matches(selectorCondition)) return;\n animation.play();\n };\n const cleanup = () => {\n animation.cancel();\n source.removeEventListener('animationend', handler);\n };\n\n const handlerObj = { source, target, cleanup };\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n source.addEventListener('animationend', handler);\n}\n\nfunction removeAnimationEndHandler(element: HTMLElement): void {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addAnimationEndHandler,\n remove: removeAnimationEndHandler,\n};\n","import { getAnimation } from '@wix/motion';\nimport type { AnimationGroup } from '@wix/motion';\nimport type {\n TimeEffect,\n TransitionEffect,\n StateParams,\n PointerTriggerParams,\n EffectBase,\n IInteractionController,\n EventTriggerConfigEnterLeave,\n} from '../types';\nimport { effectToAnimationOptions } from './utilities';\nimport fastdom from 'fastdom';\n\nexport function createTimeEffectHandler(\n element: HTMLElement,\n effect: TimeEffect & EffectBase,\n options: PointerTriggerParams,\n reducedMotion: boolean = false,\n selectorCondition?: string,\n enterLeave?: EventTriggerConfigEnterLeave,\n): ((event: Event) => void) | null {\n const animation = getAnimation(\n element,\n effectToAnimationOptions(effect),\n undefined,\n reducedMotion,\n ) as AnimationGroup | null;\n\n if (!animation) {\n return null;\n }\n\n let initialPlay = true;\n const type = options.type || 'alternate';\n\n return (event: Event) => {\n if (selectorCondition && !element.matches(selectorCondition)) return;\n\n const isToggle = !enterLeave;\n const isEnter = enterLeave?.enter?.includes(event.type);\n const isLeave = enterLeave?.leave?.includes(event.type);\n\n if (isEnter || isToggle) {\n if (type === 'alternate' || type === 'state') {\n if (initialPlay) {\n initialPlay = false;\n animation.play();\n } else if (type === 'alternate') {\n animation.reverse();\n } else if (type === 'state') {\n if (animation.playState === 'running') {\n animation.pause();\n } else if (animation.playState !== 'finished') {\n animation.play();\n }\n }\n } else {\n animation.progress(0);\n delete element.dataset.interactEnter;\n if (animation.isCSS) {\n animation.onFinish(() => {\n fastdom.mutate(() => {\n element.dataset.interactEnter = 'done';\n });\n });\n }\n animation.play();\n }\n return;\n }\n\n if (isLeave) {\n if (type === 'alternate') {\n animation.reverse();\n } else if (type === 'repeat') {\n animation.cancel();\n fastdom.mutate(() => {\n delete element.dataset.interactEnter;\n });\n } else if (type === 'state' && animation.playState === 'running') {\n animation.pause();\n }\n }\n };\n}\n\nexport function createTransitionHandler(\n element: HTMLElement,\n targetController: IInteractionController,\n {\n effectId,\n listContainer,\n listItemSelector,\n }: TransitionEffect & EffectBase & { effectId: string },\n options: StateParams,\n selectorCondition?: string,\n enterLeave?: EventTriggerConfigEnterLeave,\n): (event: Event) => void {\n const shouldSetStateOnElement = !!listContainer;\n const method = options.method || 'toggle';\n const isToggle = method === 'toggle';\n\n return (event: Event) => {\n if (selectorCondition && !element.matches(selectorCondition)) return;\n\n const item: HTMLElement | null | undefined = shouldSetStateOnElement\n ? (element.closest(\n `${listContainer} > ${listItemSelector || ''}:has(:scope)`,\n ) as HTMLElement | null)\n : undefined; // undefined when no listContainer so controller delegates to element.toggleEffect\n const isToggleMode = !enterLeave;\n const isEnter = enterLeave?.enter?.includes(event.type);\n const isLeave = enterLeave?.leave?.includes(event.type);\n\n if (isToggleMode) {\n targetController.toggleEffect(effectId, method, item);\n } else {\n if (isEnter) {\n targetController.toggleEffect(effectId, isToggle ? 'add' : method, item);\n }\n if (isLeave && isToggle) {\n targetController.toggleEffect(effectId, 'remove', item);\n }\n }\n };\n}\n","import type {\n TimeEffect,\n TransitionEffect,\n StateParams,\n HandlerObjectMap,\n PointerTriggerParams,\n EffectBase,\n InteractOptions,\n EventTriggerConfig,\n EventTriggerConfigEnterLeave,\n EventTriggerParams,\n} from '../types';\nimport { addHandlerToMap, removeElementFromHandlerMap } from './utilities';\nimport { createTimeEffectHandler, createTransitionHandler } from './effectHandlers';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\ntype EventHandler = (event: Event) => void;\n\nfunction createFocusListener(source: HTMLElement, handler: EventHandler): EventListener {\n return (e: Event) => {\n const ev = e as FocusEvent;\n if (!source.contains(ev.relatedTarget as HTMLElement)) {\n handler(ev);\n }\n };\n}\n\nfunction createClickListener(handler: EventHandler): EventListener {\n return (e: Event) => {\n const ev = e as MouseEvent;\n if ((ev as PointerEvent).pointerType) {\n handler(ev);\n }\n };\n}\n\nfunction createKeydownListener(handler: EventHandler): EventListener {\n return (e: Event) => {\n const ev = e as KeyboardEvent;\n if (ev.code === 'Space') {\n ev.preventDefault();\n handler(ev);\n } else if (ev.code === 'Enter') {\n handler(ev);\n }\n };\n}\n\nconst LISTENER_FACTORY_BY_EVENT_TYPE: Partial<\n Record<string, (source: HTMLElement, handler: EventHandler) => EventListener>\n> = {\n focusin: (source, handler) => createFocusListener(source, handler),\n focusout: (source, handler) => createFocusListener(source, handler),\n click: (_source, handler) => createClickListener(handler),\n keydown: (_source, handler) => createKeydownListener(handler),\n};\n\nfunction getListenerForEventType(\n event: string,\n source: HTMLElement,\n handler: EventHandler,\n): EventListener {\n const factory = LISTENER_FACTORY_BY_EVENT_TYPE[event];\n return factory ? factory(source, handler) : (e: Event) => handler(e);\n}\n\ntype GenericEventConfig = {\n toggle?: string[];\n enter?: string[];\n leave?: string[];\n};\n\nfunction isEnterLeaveConfigShape(\n config: EventTriggerConfig,\n): config is EventTriggerConfigEnterLeave {\n return (\n typeof config === 'object' && !Array.isArray(config) && ('enter' in config || 'leave' in config)\n );\n}\n\nfunction createGenericEventConfig(config: EventTriggerConfig): GenericEventConfig {\n if (typeof config === 'string') {\n return { toggle: [config] };\n }\n if (Array.isArray(config)) {\n return { toggle: [...config] };\n }\n if (isEnterLeaveConfigShape(config)) {\n const enter = config.enter ? [...config.enter] : [];\n const leave = config.leave ? [...config.leave] : [];\n return { enter, leave };\n }\n return {};\n}\n\nfunction isEnterLeaveMode(genericConfig: GenericEventConfig): boolean {\n return !!(genericConfig.enter?.length || genericConfig.leave?.length);\n}\n\nfunction getEnterLeaveConfig(\n genericConfig: GenericEventConfig,\n): EventTriggerConfigEnterLeave | undefined {\n return isEnterLeaveMode(genericConfig)\n ? { enter: genericConfig.enter ?? [], leave: genericConfig.leave ?? [] }\n : undefined;\n}\n\nfunction addEventTriggerHandler(\n source: HTMLElement,\n target: HTMLElement,\n effect: (TimeEffect | TransitionEffect) & EffectBase,\n options: EventTriggerParams,\n { reducedMotion, targetController, selectorCondition }: InteractOptions,\n) {\n const genericConfig = createGenericEventConfig(options.eventConfig);\n const isTransition =\n (effect as TransitionEffect).transition || (effect as TransitionEffect).transitionProperties;\n\n const enterLeave = getEnterLeaveConfig(genericConfig);\n\n let handler: EventHandler | null;\n let once = false;\n\n if (isTransition) {\n handler = createTransitionHandler(\n target,\n targetController!,\n effect as TransitionEffect & EffectBase & { effectId: string },\n options as StateParams,\n selectorCondition,\n enterLeave,\n );\n } else {\n handler = createTimeEffectHandler(\n target,\n effect as TimeEffect & EffectBase,\n options as PointerTriggerParams,\n reducedMotion,\n selectorCondition,\n enterLeave,\n );\n once = (options as PointerTriggerParams).type === 'once';\n }\n\n if (!handler) {\n return;\n }\n\n const resolvedHandler = handler;\n const controller = new AbortController();\n\n function addListener(element: HTMLElement, event: string, options?: AddEventListenerOptions) {\n const fn = getListenerForEventType(event, source, resolvedHandler);\n element.addEventListener(event, fn, { ...options, signal: controller.signal });\n }\n\n const cleanup = () => {\n controller.abort();\n };\n\n const handlerObj = { source, target, cleanup };\n addHandlerToMap(handlerMap, source, handlerObj);\n addHandlerToMap(handlerMap, target, handlerObj);\n\n if (enterLeave) {\n const enter = genericConfig.enter!;\n const leaveEvents = genericConfig.leave!;\n\n enter.forEach((eventType) => {\n if (eventType === 'focusin') {\n source.tabIndex = 0;\n }\n addListener(source, eventType, { passive: true, once });\n });\n const addLeaveListeners = isTransition\n ? (options as StateParams).method === 'toggle'\n : (options as PointerTriggerParams).type !== 'once';\n\n if (addLeaveListeners) {\n leaveEvents.forEach((eventType) => {\n if (eventType === 'focusout') {\n addListener(source, eventType, { once });\n return;\n }\n addListener(source, eventType, { passive: true });\n });\n }\n } else {\n const events = genericConfig.toggle ?? [];\n events.forEach((eventType) => {\n const passive = eventType !== 'keydown';\n const opts = { once, passive };\n addListener(source, eventType, opts);\n });\n }\n}\n\nfunction removeEventTriggerHandler(element: HTMLElement) {\n removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n add: addEventTriggerHandler,\n remove: removeEventTriggerHandler,\n};\n","export const EVENT_TRIGGER_PRESETS = {\n click: ['click'] as const,\n activate: ['click', 'keydown'] as const,\n hover: { enter: ['mouseenter'], leave: ['mouseleave'] } as const,\n interest: {\n enter: ['mouseenter', 'focusin'],\n leave: ['mouseleave', 'focusout'],\n } as const,\n} as const;\n","import type {\n Effect,\n InteractOptions,\n PointerTriggerParams,\n StateParams,\n TriggerHandlerMap,\n TriggerType,\n} from '../types';\nimport viewEnterHandler from './viewEnter';\nimport viewProgressHandler from './viewProgress';\nimport pointerMoveHandler from './pointerMove';\nimport animationEndHandler from './animationEnd';\nimport eventTrigger from './eventTrigger';\nimport { EVENT_TRIGGER_PRESETS } from './constants';\n\nconst a11yTriggerOverrides = {\n click: EVENT_TRIGGER_PRESETS.activate,\n hover: EVENT_TRIGGER_PRESETS.interest,\n} as const;\n\nfunction withEventTriggerConfig(presetKey: keyof typeof EVENT_TRIGGER_PRESETS) {\n const preset = EVENT_TRIGGER_PRESETS[presetKey];\n return (\n source: HTMLElement,\n target: HTMLElement,\n effect: Effect,\n options: StateParams | PointerTriggerParams,\n interactOptions?: InteractOptions,\n ) => {\n const eventConfig =\n interactOptions?.allowA11yTriggers && presetKey in a11yTriggerOverrides\n ? a11yTriggerOverrides[presetKey as keyof typeof a11yTriggerOverrides]\n : preset;\n eventTrigger.add(source, target, effect, { ...options, eventConfig }, interactOptions ?? {});\n };\n}\n\nexport default {\n viewEnter: viewEnterHandler,\n hover: {\n add: withEventTriggerConfig('hover'),\n remove: eventTrigger.remove,\n },\n click: {\n add: withEventTriggerConfig('click'),\n remove: eventTrigger.remove,\n },\n pageVisible: viewEnterHandler,\n animationEnd: animationEndHandler,\n viewProgress: viewProgressHandler,\n pointerMove: pointerMoveHandler,\n activate: {\n add: withEventTriggerConfig('activate'),\n remove: eventTrigger.remove,\n },\n interest: {\n add: withEventTriggerConfig('interest'),\n remove: eventTrigger.remove,\n },\n} as TriggerHandlerMap<TriggerType>;\n","import {\n InteractCache,\n InteractConfig,\n EffectRef,\n Effect,\n Interaction,\n ViewEnterParams,\n ViewEnterHandlerModule,\n IInteractionController,\n IInteractElement,\n} from '../types';\nimport { getInterpolatedKey } from './utilities';\nimport { generateId } from '../utils';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\nimport { registerEffects } from '@wix/motion';\n\nfunction _convertToKeyTemplate(key: string) {\n return key.replace(/\\[([-\\w]+)]/g, '[]');\n}\n\nexport class Interact {\n static defineInteractElement?: () => boolean;\n dataCache: InteractCache;\n addedInteractions: { [interactionId: string]: boolean };\n mediaQueryListeners: Map<\n string,\n {\n mql: MediaQueryList;\n handler: (e: MediaQueryListEvent | MediaQueryList) => void;\n key: string;\n }\n >;\n listInteractionsCache: {\n [listContainer: string]: { [interactionId: string]: boolean };\n };\n controllers: Set<IInteractionController>;\n static forceReducedMotion: boolean = false;\n static allowA11yTriggers: boolean = true;\n static instances: Interact[] = [];\n static controllerCache = new Map<string, IInteractionController>();\n\n constructor() {\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n this.addedInteractions = {};\n this.mediaQueryListeners = new Map();\n this.listInteractionsCache = {};\n this.controllers = new Set();\n }\n\n init(config: InteractConfig, options?: { useCutsomElement?: boolean }): void {\n if (typeof window === 'undefined' || !window.customElements) {\n return;\n }\n\n const useCutsomElement = options?.useCutsomElement ?? !!Interact.defineInteractElement;\n\n this.dataCache = parseConfig(config, useCutsomElement);\n\n const defined = Interact.defineInteractElement?.();\n\n if (useCutsomElement && defined === false) {\n // mostly to recover from React's <StrictMode>, blah...\n document.querySelectorAll('interact-element').forEach((element) => {\n (element as IInteractElement).connect();\n });\n } else {\n // Always try to reconnect elements from cache.\n // This handles cases where elements were added to DOM before the instance was created\n // (e.g., in React where useEffect runs after render), or when an instance is recreated\n // (e.g., in React StrictMode where effects run twice).\n // The connect() method has a guard to skip if already connected.\n Interact.controllerCache.forEach((controller: IInteractionController, key) =>\n controller.connect(key),\n );\n }\n }\n\n destroy(): void {\n for (const controller of this.controllers) {\n controller.disconnect();\n }\n\n // Properly remove all media query listeners before clearing the Map\n // This is critical for React StrictMode where instances are destroyed and recreated,\n // to prevent duplicate listeners from firing with stale instance references\n for (const [, listener] of this.mediaQueryListeners.entries()) {\n listener.mql.removeEventListener('change', listener.handler);\n }\n this.mediaQueryListeners.clear();\n this.addedInteractions = {};\n this.listInteractionsCache = {};\n this.controllers.clear();\n this.dataCache = { effects: {}, conditions: {}, interactions: {} };\n Interact.instances.splice(Interact.instances.indexOf(this), 1);\n }\n\n setController(key: string, controller: IInteractionController) {\n this.controllers.add(controller);\n\n Interact.setController(key, controller);\n }\n\n deleteController(key: string, removeFromCache: boolean = false) {\n const controller = Interact.controllerCache.get(key);\n\n this.clearInteractionStateForKey(key);\n this.clearMediaQueryListenersForKey(key);\n\n if (controller && removeFromCache) {\n this.controllers.delete(controller);\n Interact.deleteController(key);\n }\n }\n\n has(key: string): boolean {\n return !!this.get(key);\n }\n\n get(key: string): InteractCache['interactions'][string] | undefined {\n const processedKey = _convertToKeyTemplate(key);\n return this.dataCache.interactions[processedKey];\n }\n\n clearMediaQueryListenersForKey(key: string): void {\n for (const [id, listener] of this.mediaQueryListeners.entries()) {\n if (listener.key === key) {\n listener.mql.removeEventListener('change', listener.handler);\n this.mediaQueryListeners.delete(id);\n }\n }\n }\n\n clearInteractionStateForKey(key: string): void {\n const interactionIds = this.get(key)?.interactionIds || [];\n\n interactionIds.forEach((interactionId_) => {\n const interactionId = getInterpolatedKey(interactionId_, key);\n delete this.addedInteractions[interactionId];\n });\n }\n\n setupMediaQueryListener(id: string, mql: MediaQueryList, key: string, handler: () => void) {\n if (this.mediaQueryListeners.has(id)) {\n return;\n }\n\n mql.addEventListener('change', handler);\n\n this.mediaQueryListeners.set(id, {\n mql,\n handler,\n key,\n });\n }\n\n static create(config: InteractConfig, options?: { useCutsomElement?: boolean }): Interact {\n const instance = new Interact();\n Interact.instances.push(instance);\n\n instance.init(config, options);\n\n return instance;\n }\n\n static destroy(): void {\n Interact.controllerCache.forEach((controller: IInteractionController) => {\n controller.disconnect();\n });\n Interact.instances.length = 0;\n Interact.controllerCache.clear();\n }\n\n static setup(options: {\n scrollOptionsGetter?: () => Partial<scrollConfig>;\n pointerOptionsGetter?: () => Partial<PointerConfig>;\n viewEnter?: Partial<ViewEnterParams>;\n allowA11yTriggers?: boolean;\n }): void {\n if (options.scrollOptionsGetter) {\n TRIGGER_TO_HANDLER_MODULE_MAP.viewProgress.registerOptionsGetter?.(\n options.scrollOptionsGetter,\n );\n }\n\n if (options.pointerOptionsGetter) {\n TRIGGER_TO_HANDLER_MODULE_MAP.pointerMove.registerOptionsGetter?.(\n options.pointerOptionsGetter,\n );\n }\n\n if (options.viewEnter) {\n (TRIGGER_TO_HANDLER_MODULE_MAP.viewEnter as ViewEnterHandlerModule).setOptions(\n options.viewEnter,\n );\n }\n\n if (options.allowA11yTriggers !== undefined) {\n Interact.allowA11yTriggers = options.allowA11yTriggers;\n }\n }\n\n static getInstance(key: string): Interact | undefined {\n return Interact.instances.find((instance) => instance.has(key));\n }\n\n static getController(key: string | undefined): IInteractionController | undefined {\n return key ? Interact.controllerCache.get(key) : undefined;\n }\n\n static setController(key: string, controller: IInteractionController): void {\n Interact.controllerCache.set(key, controller);\n }\n\n static deleteController(key: string): void {\n Interact.controllerCache.delete(key);\n }\n\n static registerEffects = registerEffects;\n}\n\nlet interactionIdCounter = 0;\n\nexport function getSelector(\n d: Interaction | Effect,\n {\n asCombinator = false,\n addItemFilter = false,\n useFirstChild = false,\n }: { asCombinator?: boolean; addItemFilter?: boolean; useFirstChild?: boolean } = {},\n): string {\n if (d.listContainer) {\n const itemFilter = `${addItemFilter && d.listItemSelector ? ` > ${d.listItemSelector}` : ''}`;\n\n if (d.selector) {\n return `${d.listContainer}${itemFilter} ${d.selector}`;\n }\n\n return `${d.listContainer}${itemFilter || ' > *'}`;\n } else if (d.selector) {\n return d.selector;\n }\n\n // TODO: consider moving :scope to be configurable since it may lead to unexpected results in some cases\n return useFirstChild ? (asCombinator ? '> :first-child' : ':scope > :first-child') : '';\n}\n\n/**\n * Parses the config object and caches interactions, effects, and conditions\n */\nfunction parseConfig(config: InteractConfig, useCutsomElement: boolean = false): InteractCache {\n const conditions = config.conditions || {};\n const interactions: InteractCache['interactions'] = {};\n\n config.interactions?.forEach((interaction_) => {\n const source = interaction_.key;\n const interactionIdx = ++interactionIdCounter;\n const { effects: effects_, ...rest } = interaction_;\n\n if (!source) {\n console.error(`Interaction ${interactionIdx} is missing a key for source element.`);\n return;\n }\n\n if (!interactions[source]) {\n interactions[source] = {\n triggers: [],\n effects: {},\n interactionIds: new Set(),\n selectors: new Set(),\n };\n }\n\n /*\n * Cache interaction trigger by source element\n */\n const effects = Array.from(effects_);\n effects.reverse(); // reverse to ensure the first effect is the one that will be applied first\n const interaction = { ...rest, effects };\n\n interactions[source].triggers.push(interaction);\n interactions[source].selectors.add(\n getSelector(interaction, { useFirstChild: useCutsomElement }),\n );\n\n const listContainer = interaction.listContainer;\n\n effects.forEach((effect) => {\n /*\n * Target cascade order is the first of:\n * -> Config.interactions.effects.effect.key\n * -> Config.effects.effect.key\n * -> Config.interactions.interaction.key\n */\n let target = effect.key;\n\n if (!target && (effect as EffectRef).effectId) {\n const referencedEffect = config.effects[(effect as EffectRef).effectId];\n\n if (referencedEffect) {\n target = referencedEffect.key;\n }\n }\n\n if (!(effect as EffectRef).effectId) {\n (effect as EffectRef).effectId = generateId();\n }\n\n // if no target is specified, use the source element as the target\n target = target || source;\n effect.key = target;\n const effectId = (effect as EffectRef).effectId;\n\n if (listContainer && effect.listContainer) {\n // we do not support having 2 separate lists for same interaction\n if (target !== source || effect.listContainer !== listContainer) {\n return;\n }\n }\n\n const interactionId = `${source}::${target}::${effectId}::${interactionIdx}`;\n effect.interactionId = interactionId;\n interactions[source].interactionIds.add(interactionId);\n\n if (target === source) {\n // if target is the source element, no need to add an interaction to `effects`\n return;\n }\n\n /*\n * Cache interaction effect by target element\n */\n if (!interactions[target]) {\n interactions[target] = {\n triggers: [],\n effects: {\n [interactionId]: [],\n },\n interactionIds: new Set(),\n selectors: new Set(),\n };\n } else if (!interactions[target].effects[interactionId]) {\n interactions[target].effects[interactionId] = [];\n interactions[target].interactionIds.add(interactionId);\n }\n\n interactions[target].effects[interactionId].push({ ...rest, effect });\n interactions[target].selectors.add(getSelector(effect, { useFirstChild: useCutsomElement }));\n });\n });\n\n return {\n effects: config.effects || {},\n conditions,\n interactions,\n };\n}\n","import type {\n Effect,\n TriggerType,\n EffectRef,\n InteractionParamsTypes,\n TransitionEffect,\n Interaction,\n InteractionTrigger,\n CreateTransitionCSSParams,\n IInteractionController,\n} from '../types';\nimport { createTransitionCSS, getMediaQuery, getSelectorCondition } from '../utils';\nimport { getInterpolatedKey } from './utilities';\nimport { Interact, getSelector } from './Interact';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\n\ntype InteractionsToApply = Array<\n [\n string,\n InteractionTrigger,\n Effect,\n HTMLElement | HTMLElement[],\n HTMLElement | HTMLElement[],\n string | undefined,\n boolean,\n ]\n>;\n\nfunction _getElementsFromData(\n data: Interaction | Effect,\n root: HTMLElement,\n useFirstChild: boolean,\n): HTMLElement | HTMLElement[] | null {\n if (data.listContainer) {\n const container = root.querySelector(data.listContainer);\n\n if (!container) {\n console.warn(`Interact: No container found for list container \"${data.listContainer}\"`);\n\n return [];\n }\n\n if (data.selector) {\n return Array.from(container.querySelectorAll(data.selector)) as HTMLElement[];\n }\n\n return Array.from(container.children) as HTMLElement[];\n }\n\n if (data.selector) {\n const elements = root.querySelectorAll(data.selector);\n\n if (elements.length > 0) {\n return Array.from(elements) as HTMLElement[];\n } else {\n console.warn(`Interact: No elements found for selector \"${data.selector}\"`);\n }\n }\n\n return useFirstChild\n ? (root.firstElementChild as HTMLElement | null)\n : (root as HTMLElement | null);\n}\n\nfunction _queryItemElement(data: Interaction | Effect, elements: HTMLElement[]): HTMLElement[] {\n return elements\n .map((element) => {\n return data.selector ? element.querySelector(data.selector) : element;\n })\n .filter(Boolean) as HTMLElement[];\n}\n\nfunction _getInteractionElements(\n interaction: InteractionTrigger,\n effect: Effect,\n source: HTMLElement,\n sourceUseFirstChild: boolean,\n target: HTMLElement,\n targetUseFirstChild: boolean,\n sourceElements?: HTMLElement[],\n targetElements?: HTMLElement[],\n): [HTMLElement | HTMLElement[] | null, HTMLElement | HTMLElement[] | null] {\n return [\n sourceElements\n ? _queryItemElement(interaction, sourceElements)\n : _getElementsFromData(interaction, source, sourceUseFirstChild),\n targetElements\n ? _queryItemElement(effect, targetElements)\n : _getElementsFromData(effect, target, targetUseFirstChild),\n ];\n}\n\nfunction _applyInteraction(\n targetKey: string,\n interaction: InteractionTrigger,\n effect: Effect,\n sourceElements: HTMLElement | HTMLElement[],\n targetElements: HTMLElement | HTMLElement[],\n selectorCondition?: string,\n useFirstChild?: boolean,\n) {\n const isSourceArray = Array.isArray(sourceElements);\n const isTargetArray = Array.isArray(targetElements);\n\n if (isSourceArray) {\n sourceElements.forEach((sourceEl, index) => {\n const targetEl = isTargetArray ? targetElements[index] : targetElements;\n\n if (targetEl) {\n addInteraction(\n targetKey,\n sourceEl,\n interaction.trigger,\n targetEl,\n effect as Effect,\n interaction.params!,\n selectorCondition,\n useFirstChild,\n );\n }\n });\n } else {\n const targets = isTargetArray ? targetElements : [targetElements];\n targets.forEach((targetEl) => {\n addInteraction(\n targetKey,\n sourceElements,\n interaction.trigger,\n targetEl,\n effect as Effect,\n interaction.params!,\n selectorCondition,\n useFirstChild,\n );\n });\n }\n}\n\nfunction _addInteraction(\n sourceKey: string,\n sourceController: IInteractionController,\n instance: Interact,\n interaction: Interaction,\n elements?: HTMLElement[],\n) {\n const interactionVariations: Record<string, boolean> = {};\n\n const interactionsToApply: InteractionsToApply = [];\n\n interaction.effects.forEach((effect) => {\n const effectId = (effect as EffectRef).effectId;\n\n const effectOptions = {\n ...(instance.dataCache.effects[effectId] || {}),\n ...effect,\n effectId,\n };\n const targetKey_ = effectOptions.key;\n\n const interactionId = getInterpolatedKey(effect.interactionId!, sourceKey);\n\n if (interactionVariations[interactionId!]) {\n // Skip this effect if it has already been added\n return;\n }\n\n if (instance.addedInteractions[interactionId!] && !elements) {\n // Skip this interaction if it has already been added\n return;\n }\n\n const mql = getMediaQuery(effectOptions.conditions || [], instance.dataCache.conditions);\n\n if (mql) {\n instance.setupMediaQueryListener(interactionId, mql, sourceKey, () => {\n sourceController.update();\n });\n }\n\n if (!mql || mql.matches) {\n interactionVariations[interactionId!] = true;\n\n const target = targetKey_ && getInterpolatedKey(targetKey_, sourceKey);\n\n let targetController;\n if (target) {\n targetController = Interact.getController(target);\n\n if (!targetController) {\n // Bail out :: no target element in cache\n return;\n }\n\n if (effectOptions.listContainer) {\n targetController.watchChildList(effectOptions.listContainer);\n }\n } else {\n // target is not specified - fallback to same as source\n targetController = sourceController;\n }\n\n const [sourceElements, targetElements] = _getInteractionElements(\n interaction,\n effectOptions,\n sourceController.element,\n sourceController.useFirstChild,\n targetController.element,\n targetController.useFirstChild,\n elements,\n );\n\n if (!sourceElements || !targetElements) {\n return;\n }\n\n instance.addedInteractions[interactionId!] = true;\n\n const key = target || interaction.key;\n const selectorCondition = getSelectorCondition(\n effectOptions.conditions || [],\n instance.dataCache.conditions,\n );\n\n interactionsToApply.push([\n key,\n interaction,\n effectOptions,\n sourceElements,\n targetElements,\n selectorCondition,\n targetController.useFirstChild,\n ]);\n }\n });\n\n // apply the effects in reverse to return to the order specified by the user to ensure order of composition is as defined\n interactionsToApply.reverse().forEach((interaction) => {\n _applyInteraction(...interaction);\n });\n}\n\nfunction addEffectsForTarget(\n targetKey: string,\n targetController: IInteractionController,\n instance: Interact,\n listContainer?: string,\n elements?: HTMLElement[],\n) {\n const effects = instance.get(targetKey)?.effects || {};\n const interactionIds = Object.keys(effects);\n const interactionsToApply: InteractionsToApply = [];\n\n interactionIds.forEach((interactionId_) => {\n const interactionId = getInterpolatedKey(interactionId_, targetKey);\n\n if (instance.addedInteractions[interactionId] && !elements) {\n // Skip this interaction if it has already been added\n return;\n }\n\n const effectVariations = effects[interactionId_];\n\n // use `some` to short-circuit after the first effect that matches the conditions\n effectVariations.some(({ effect, ...interaction }) => {\n const interactionMql = getMediaQuery(\n interaction.conditions || [],\n instance!.dataCache.conditions,\n );\n\n if (interactionMql && !interactionMql.matches) {\n // skip this effect if the interaction's media conditions don't match\n return false;\n }\n\n const effectId = (effect as EffectRef).effectId;\n\n const effectOptions = {\n ...(instance!.dataCache.effects[effectId] || {}),\n ...effect,\n effectId,\n };\n\n if (listContainer && effectOptions.listContainer !== listContainer) {\n // skip this effect if a listContainer was provided and it's not matching this effect.listContainer\n return false;\n }\n\n const mql = getMediaQuery(effectOptions.conditions || [], instance!.dataCache.conditions);\n\n if (mql) {\n instance.setupMediaQueryListener(interactionId, mql, targetKey, () => {\n // For effects on target, we reconcile the target element\n targetController.update();\n });\n }\n\n if (!mql || mql.matches) {\n const sourceKey = interaction.key && getInterpolatedKey(interaction.key, targetKey);\n const sourceController = Interact.getController(sourceKey);\n\n if (!sourceController) {\n // Bail out :: no source or target elements in cache\n return true;\n }\n\n if (effectOptions.listContainer) {\n targetController.watchChildList(effectOptions.listContainer);\n }\n\n const [sourceElements, targetElements] = _getInteractionElements(\n interaction,\n effectOptions,\n sourceController.element,\n sourceController.useFirstChild,\n targetController.element,\n targetController.useFirstChild,\n undefined,\n elements,\n );\n\n if (!sourceElements || !targetElements) {\n // Bail out :: no source or target elements found in DOM\n return true;\n }\n\n instance!.addedInteractions[interactionId] = true;\n\n const selectorCondition = getSelectorCondition(\n effectOptions.conditions || [],\n instance!.dataCache.conditions,\n );\n\n interactionsToApply.push([\n targetKey,\n interaction,\n effectOptions as Effect,\n sourceElements,\n targetElements,\n selectorCondition,\n targetController.useFirstChild,\n ]);\n\n // short-circuit the loop since we have a match\n return true;\n }\n\n return false;\n });\n });\n\n // apply the effects in reverse to return to the order specified by the user to ensure order of composition is as defined\n interactionsToApply.reverse().forEach((interaction) => {\n _applyInteraction(...interaction);\n });\n\n return interactionIds.length > 0;\n}\n\n/**\n * Registers a handler to an event on a given element.\n */\nfunction addInteraction<T extends TriggerType>(\n targetKey: string,\n source: HTMLElement,\n trigger: T,\n target: HTMLElement,\n effect: Effect,\n options: InteractionParamsTypes[T],\n selectorCondition?: string,\n useFirstChild?: boolean,\n): void {\n let targetController;\n\n if (\n (effect as TransitionEffect).transition ||\n (effect as TransitionEffect).transitionProperties\n ) {\n const args: CreateTransitionCSSParams = {\n key: targetKey,\n effectId: (effect as Effect).effectId!,\n transition: (effect as TransitionEffect).transition,\n properties: (effect as TransitionEffect).transitionProperties,\n childSelector: getSelector(effect, {\n asCombinator: true,\n addItemFilter: true,\n useFirstChild,\n }),\n selectorCondition,\n };\n\n targetController = Interact.getController(targetKey);\n if (!targetController) {\n return;\n }\n\n targetController.renderStyle(createTransitionCSS(args));\n }\n\n TRIGGER_TO_HANDLER_MODULE_MAP[trigger]?.add(source, target, effect, options, {\n reducedMotion: Interact.forceReducedMotion,\n targetController,\n selectorCondition,\n allowA11yTriggers: Interact.allowA11yTriggers,\n });\n}\n\n/**\n * Adds all events and effects to an element based on config\n */\nexport function add(controller: IInteractionController): boolean {\n const key = controller.key as string;\n const instance = Interact.getInstance(key);\n\n if (!instance) {\n console.warn(`No instance found for key: ${key}`);\n\n // even if we don't find a matching instance, we still want to cache the element\n Interact.setController(key, controller);\n return false;\n }\n\n const { triggers = [] } = instance?.get(key) || {};\n const hasTriggers = triggers.length > 0;\n\n instance.setController(key, controller);\n\n triggers.forEach((interaction, index) => {\n const mql = getMediaQuery(interaction.conditions, instance!.dataCache.conditions);\n\n if (mql) {\n const interactionId = `${key}::trigger::${index}`;\n instance.setupMediaQueryListener(interactionId, mql, key, () => {\n controller.update();\n });\n }\n\n if (!mql || mql.matches) {\n if (interaction.listContainer) {\n controller.watchChildList(interaction.listContainer);\n }\n\n _addInteraction(key, controller, instance!, interaction);\n }\n });\n\n let hasEffects = false;\n if (instance) {\n hasEffects = addEffectsForTarget(key, controller, instance);\n }\n\n return hasTriggers || hasEffects;\n}\n\nexport function addListItems(\n controller: IInteractionController,\n listContainer: string,\n elements: HTMLElement[],\n) {\n const key = controller.key as string;\n const instance = Interact.getInstance(key);\n\n if (instance) {\n const { triggers = [] } = instance?.get(key) || {};\n\n triggers.forEach((interaction, index) => {\n if (interaction.listContainer !== listContainer) {\n return;\n }\n\n const mql = getMediaQuery(interaction.conditions, instance!.dataCache.conditions);\n\n if (mql) {\n const interactionId = `${key}::listTrigger::${listContainer}::${index}`;\n instance.setupMediaQueryListener(interactionId, mql, key, () => {\n // For list items, reconciling the root might be expensive but safe\n controller.update();\n });\n }\n\n if (!mql || mql.matches) {\n _addInteraction(key, controller, instance!, interaction, elements);\n }\n });\n\n addEffectsForTarget(key, controller, instance, listContainer, elements);\n }\n}\n","import { Interact } from './Interact';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\nimport type { IInteractionController } from '../types';\n\n/**\n * Removes all events and effects from an element based on config\n */\nexport function remove(controller: IInteractionController, removeFromCache: boolean = false): void {\n const key = controller.key as string;\n const instance = Interact.getInstance(key);\n\n if (!instance) {\n return;\n }\n\n const selectors = [...(instance.get(key)?.selectors.values() || [])].filter(Boolean).join(',');\n let elements;\n\n if (selectors) {\n elements = [...controller.element.querySelectorAll(selectors)];\n\n if (!controller.useFirstChild) {\n elements.push(controller.element);\n }\n } else {\n elements = [controller.element];\n }\n\n removeListItems(elements as HTMLElement[]);\n\n // React can't seem to recover in StrictMode since it doesn't invoke ref callback 2nd time\n instance.deleteController(key, removeFromCache);\n}\n\nexport function removeListItems(elements: HTMLElement[]) {\n const modules = Object.values(TRIGGER_TO_HANDLER_MODULE_MAP);\n\n for (const element of elements) {\n for (const module of modules) {\n module.remove(element);\n }\n }\n}\n","import type { IInteractElement, StateParams } from '../types';\nimport { add, addListItems } from './add';\nimport { remove, removeListItems } from './remove';\n\nexport const INTERACT_EFFECT_DATA_ATTR = 'interactEffect';\n\nexport class InteractionController {\n element: HTMLElement;\n key: string | undefined;\n connected: boolean;\n sheet: CSSStyleSheet | null;\n useFirstChild: boolean;\n _observers: WeakMap<HTMLElement, MutationObserver>;\n\n constructor(element: HTMLElement, key?: string, options?: { useFirstChild?: boolean }) {\n this.element = element;\n this.key = key;\n this.connected = false;\n this.sheet = null;\n this._observers = new WeakMap();\n this.useFirstChild = options?.useFirstChild ?? false;\n }\n\n connect(key?: string) {\n if (this.connected) {\n return;\n }\n\n const domKey = this.element.dataset.interactKey;\n\n key = key || this.key || domKey;\n\n if (!key) {\n console.warn('Interact: No key provided');\n return;\n }\n\n if (domKey !== key) {\n if (domKey) {\n console.warn(\n `Interact: Key mismatch between element ${domKey} and parameter ${key}, updating element key`,\n );\n }\n\n this.element.dataset.interactKey = key;\n }\n\n this.key = key;\n\n this.connected = add(this);\n }\n\n disconnect({ removeFromCache = false }: { removeFromCache?: boolean } = {}) {\n const key = this.key || this.element.dataset.interactKey;\n\n if (key) {\n remove(this, removeFromCache);\n }\n\n if (this.sheet) {\n const index = document.adoptedStyleSheets.indexOf(this.sheet);\n document.adoptedStyleSheets.splice(index, 1);\n }\n\n this._observers = new WeakMap();\n this.sheet = null;\n this.connected = false;\n }\n\n update() {\n this.disconnect();\n this.connect();\n }\n\n renderStyle(cssRules: string[]) {\n if (!this.sheet) {\n this.sheet = new CSSStyleSheet();\n void this.sheet.replaceSync(cssRules.join('\\n'));\n\n document.adoptedStyleSheets.push(this.sheet);\n } else {\n let position = this.sheet.cssRules.length;\n\n for (const cssRule of cssRules) {\n try {\n this.sheet.insertRule(cssRule, position);\n position++;\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n\n toggleEffect(\n effectId: string,\n method: StateParams['method'],\n item?: HTMLElement | null,\n isLegacy?: boolean,\n ) {\n if (item === null) {\n return;\n }\n\n if (!isLegacy && (this.element as IInteractElement).toggleEffect) {\n (this.element as IInteractElement).toggleEffect(effectId, method, item);\n return;\n }\n\n const currentEffects = new Set(\n this.element.dataset[INTERACT_EFFECT_DATA_ATTR]?.split(' ') || [],\n );\n\n if (method === 'toggle') {\n if (currentEffects.has(effectId)) {\n currentEffects.delete(effectId);\n } else {\n currentEffects.add(effectId);\n }\n } else if (method === 'add') {\n currentEffects.add(effectId);\n } else if (method === 'remove') {\n currentEffects.delete(effectId);\n } else if (method === 'clear') {\n currentEffects.clear();\n }\n\n (item || this.element).dataset[INTERACT_EFFECT_DATA_ATTR] =\n Array.from(currentEffects).join(' ');\n }\n\n getActiveEffects(): string[] {\n const raw = this.element.dataset[INTERACT_EFFECT_DATA_ATTR] || '';\n const trimmed = raw.trim();\n return trimmed ? trimmed.split(/\\s+/) : [];\n }\n\n watchChildList(listContainer: string): void {\n const list = this.element.querySelector(listContainer);\n\n if (list) {\n // TODO: we can probably improve this and use less observers, this impl. uses one per container element\n let observer = this._observers.get(list as HTMLElement);\n\n if (!observer) {\n observer = new MutationObserver(this._childListChangeHandler.bind(this, listContainer));\n\n this._observers.set(list as HTMLElement, observer);\n\n observer.observe(list as HTMLElement, { childList: true });\n }\n }\n }\n\n _childListChangeHandler(listContainer: string, entries: MutationRecord[]) {\n const key = this.key || this.element.dataset.interactKey;\n const removedElements: HTMLElement[] = [];\n const addedElements: HTMLElement[] = [];\n\n entries.forEach((entry) => {\n entry.removedNodes.forEach((el) => {\n if (el instanceof HTMLElement) {\n removedElements.push(el);\n }\n });\n\n entry.addedNodes.forEach((el) => {\n if (el instanceof HTMLElement) {\n addedElements.push(el);\n }\n });\n });\n\n removeListItems(removedElements);\n\n if (key) {\n addListItems(this, listContainer, addedElements);\n }\n }\n}\n","import { Interact } from '../core/Interact';\nimport { InteractionController } from '../core/InteractionController';\n\nexport function add(element: HTMLElement, key?: string): void {\n const controller = new InteractionController(element, key);\n\n controller.connect();\n}\n\nexport function remove(key: string): void {\n const controller = Interact.getController(key);\n if (!controller) {\n return;\n }\n\n controller.disconnect({ removeFromCache: true });\n}\n","import { getSelectorCondition, applySelectorCondition } from '../utils';\nimport { Effect, InteractConfig, ViewEnterParams } from '../types';\nimport { getSelector } from './Interact';\n\nconst buildSelector = (\n key: string,\n effect: Effect,\n conditionSelector: string | undefined,\n useFirstChild: boolean,\n): string => {\n const escapedKey = key.replace(/\"/g, \"'\");\n\n let baseSelector = `[data-interact-key=\"${escapedKey}\"]`;\n\n const elementSelector = getSelector(effect, { asCombinator: true, useFirstChild });\n\n if (elementSelector) {\n baseSelector = `${baseSelector} ${elementSelector}`;\n }\n\n if (conditionSelector) {\n baseSelector = applySelectorCondition(baseSelector, conditionSelector);\n }\n\n return baseSelector;\n};\n\nexport function generate(_config: InteractConfig, useFirstChild: boolean = false): string {\n const css: string[] = [];\n const processedSelectors = new Set<string>();\n\n _config.interactions.forEach(\n ({\n key: interactionKey,\n selector: interactionSelector,\n listContainer: interactionListContainer,\n listItemSelector: interactionListItemSelector,\n trigger,\n params,\n effects,\n conditions: interactionConditions,\n }) => {\n const isViewEnter = trigger === 'viewEnter';\n if (isViewEnter) {\n const interactionParams = params as ViewEnterParams;\n const isOnce = !interactionParams?.type || interactionParams.type === 'once';\n\n if (isOnce) {\n effects.forEach((effect) => {\n const effectData = effect?.effectId\n ? _config.effects[effect.effectId] || effect\n : effect;\n const {\n key: effectKey,\n selector: effectSelector,\n listContainer: effectListContainer,\n listItemSelector: effectListItemSelector,\n conditions: effectConditions,\n } = effectData;\n\n const sameKey = !effectKey || effectKey === interactionKey;\n if (!sameKey) return;\n\n const sameSelector =\n (!effectSelector && !interactionSelector) || effectSelector === interactionSelector;\n if (!sameSelector) return;\n\n const sameListcontainer =\n (!effectListContainer && !interactionListContainer) ||\n effectListContainer === interactionListContainer;\n if (!sameListcontainer) return;\n\n const sameListItemSelector =\n (!effectListItemSelector && !interactionListItemSelector) ||\n effectListItemSelector === interactionListItemSelector;\n if (!sameListItemSelector) return;\n\n const configConditions = _config.conditions || {};\n const effectConditionSelector = getSelectorCondition(\n effectConditions,\n configConditions,\n );\n const interactionConditionSelector = getSelectorCondition(\n interactionConditions,\n configConditions,\n );\n const sameConditionSelector =\n (!effectConditionSelector && !interactionConditionSelector) ||\n effectConditionSelector === interactionConditionSelector;\n if (!sameConditionSelector) return;\n\n const selector = buildSelector(\n interactionKey,\n effectData,\n interactionConditionSelector,\n useFirstChild,\n );\n\n if (!processedSelectors.has(selector)) {\n processedSelectors.add(selector);\n css.push(`@media (prefers-reduced-motion: no-preference) {\n ${selector}:not([data-interact-enter]) {\n visibility: hidden;\n transform: none;\n translate: none;\n scale: none;\n rotate: none;\n }\n }`);\n }\n });\n }\n }\n },\n );\n\n return css.join('\\n');\n}\n"],"names":["_processKeysForInterpolation","key","_","_instanceKey","getInterpolatedKey","template","keys","index","k","AnimationGroup","animations","options","callback","animation","p","delay","duration","iterations","time","rate","a","target","endEvent","_error","linear","t","sineIn","sineOut","sineInOut","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","quartIn","quartOut","quartInOut","quintIn","quintOut","quintInOut","expoIn","expoOut","expoInOut","circIn","circOut","circInOut","backIn","backOut","backInOut","jsEasings","cssEasings","getCssUnits","unit","getEasing","easing","getJsEasing","CustomAnimation","customEffect","effectOptions","timingOptions","effect","timeline","progress","error","speed","uid","e","tl","cb","playbackRate","type","listener","event","getDefaultExportFromCjs","x","win","debug","raf","FastDom","self","tasks","task","fn","ctx","scheduleFlush","remove","props","child","mixin","fastdom","flush","writes","reads","array","item","source","exports","module","this","registry","registerEffects","effects","getRegisteredEffect","name","getElement","id","ownerDocument","getElementMotionPart","element","part","getDirection","alternate","getLength","length","getRange","range","add","isEnd","getRanges","measure","mutate","getNamedEffect","effectName","animation_","keyframes","effectId","getEffectsData","trigger","isNotAScrubTrigger","getWebAnimationEffect","preset","domApi","getWebAnimation","animationOptions","mouseAnimationPreset","mouseAnimationFactory","namedEffect","animationsData","data","isViewProgress","effectTarget","keyframeEffect","start","end","startOffset","endOffset","startOffsetToWrite","endOffsetToWrite","resolve","prepareAnimation","getElementCSSAnimation","getElementAnimation","effectNames","animationNames","anim","filteredAnimations","getScrubScene","sceneOptions","disabled","allowActiveEvent","rest","typeSpecificOptions","viewSource","ready","partialAnimation","__","activeDuration","scrubOptions","centeredToTarget","transitionDuration","transitionEasing","axis","animationGroup","linearProgress","v","active","getAnimation","reducedMotion","applySelectorCondition","baseSelector","predicate","generateId","c","createTransitionCSS","transition","properties","childSelector","selectorCondition","transitions","styleProperty","property","styleProperties","escapedKey","stateSelector","dataAttrSelector","finalStateSelector","finalDataAttrSelector","result","transitionSelector","finalTransitionSelector","getMediaQuery","conditionNames","conditions","conditionContent","conditionName","condition","getSelectorCondition","DEFAULT_RANGE_VALUES","resolveRangeOffsets","rangeStart","rangeEnd","startName","endName","effectToAnimationOptions","addHandlerToMap","handlersMap","handlerObj","handlers","removeElementFromHandlerMap","handlerMap","cleanup","otherKey","SAFE_OBSERVER_CONFIG","EXIT_OBSERVER_CONFIG","observers","elementFirstRun","elementObserverMap","viewEnterOptions","sharedExitObserver","setOptions","invokeHandlers","isIntersecting","handler","getExitObserver","entries","entry","getObserver","isSafeMode","config","observer","isFirstRun","sourceHeight","rootHeight","threshold","safeObserver","addViewEnterHandler","mergedOptions","isInitialPlay","setEnterStart","removeViewEnterHandler","reset","viewEnterHandler","defaultTo","obj","defaults","lerp","b","res","deltaFromStart","deltaFromEnd","frameThrottle","throttled","debounce","interval","debounced","parseOffsetCalc","offsetString","absoluteOffsetContext","match","transformAbsoluteOffsetToNumber","transformRangeToPosition","viewportSize","rect","offset","height","percentage","startPosition","computeStickinessIntoFullRange","offsetTree","absoluteStartOffset","absoluteEndOffset","isHorizontal","accumulatedOffset","newAbsoluteRange","node","sticky","offsetFromViewEnd","stuckStart","isBeforeStart","isInsideDuration","extraOffset","parent","parentSize","elementOffset","elementSize","transformSceneRangesToOffsets","scene","startRange","endRange","overrideDuration","startAdd","endAdd","getIsSticky","style","getIsFixed","offsetParent","root","getStickyStartOffset","getStickyEndOffset","getRectStart","isSticky","getStickyData","stickyStart","stickyEnd","hasStickyStart","hasStickyEnd","getTransformedSceneGroup","scenes","size","elementLayoutStart","nodeStyle","VIEWPORT_RESIZE_INTERVAL","DEFAULTS","calcProgress","getViewportSize","getAbsoluteOffsetContext","getController","_config","horizontal","scenesByElement","lastP","viewportObserver","rangesResizeObserver","viewportResizeHandler","scrollportResizeObserver","rangesToObserve","acc","sceneGroup","targetToSceneGroup","transformedSceneGroup","localIndex","newRanges","newSceneGroup","intersections","intersection","scenesArray","tick","vp","velocity","destroy","Scroll","isDocumentRoot","scrollPosition","y","clearLerpFrame","hasLerp","dp","factorP","scrollManagerMap","scrollOptionsGetter","registerOptionsGetter","getter","addViewProgressHandler","triggerParams","scroll","s","removeViewProgressHandler","viewProgressHandler","clamp","min","max","value","getRect","el","left","top","testPointerOffsetDprBug","DPR","fixRequired","testPointerOffsetScrollBug","startY","currentY","sampleOffsetY","scrollHandler","testScrollOffsetsForWebKitPointerBug","scrollOffsets","listeners","pointers","initScrollendPolyfill","touchStartHandler","touch","touchEndHandler","addScrollendListener","timeout","removeScrollendPolyfill","scrollListener","evt","centerToTargetFactory","x1","layerCenterX","isXStartFarthest","xDuration","x0","y1","layerCenterY","isYStartFarthest","yDuration","y0","scrollendCallback","lastProgress","windowResize","observeRootResize","hasCenteredToTarget","resizeObserver","windowResizeHandler","scrollendHandler","removeScrollendListener","normalizedX","normalizedY","MOVEMENT_RESET_DELAY","shouldFixSynthPointer","Pointer","_measure","newX","newY","now","resetMovement","pointerManagerMap","pointerOptionsGetter","addPointerMoveHandler","pointer","removePointerMoveHandler","pointerMoveHandler","addAnimationEndHandler","removeAnimationEndHandler","animationEndHandler","createTimeEffectHandler","enterLeave","initialPlay","isToggle","isEnter","isLeave","createTransitionHandler","targetController","listContainer","listItemSelector","shouldSetStateOnElement","method","isToggleMode","createFocusListener","ev","createClickListener","createKeydownListener","LISTENER_FACTORY_BY_EVENT_TYPE","_source","getListenerForEventType","factory","isEnterLeaveConfigShape","createGenericEventConfig","enter","leave","isEnterLeaveMode","genericConfig","getEnterLeaveConfig","addEventTriggerHandler","isTransition","once","resolvedHandler","controller","addListener","leaveEvents","eventType","removeEventTriggerHandler","eventTrigger","EVENT_TRIGGER_PRESETS","a11yTriggerOverrides","withEventTriggerConfig","presetKey","interactOptions","eventConfig","TRIGGER_TO_HANDLER_MODULE_MAP","_convertToKeyTemplate","Interact","useCutsomElement","parseConfig","defined","removeFromCache","processedKey","interactionId_","interactionId","mql","instance","interactionIdCounter","getSelector","d","asCombinator","addItemFilter","useFirstChild","itemFilter","interactions","interaction_","interactionIdx","effects_","interaction","referencedEffect","_getElementsFromData","container","elements","_queryItemElement","_getInteractionElements","sourceUseFirstChild","targetUseFirstChild","sourceElements","targetElements","_applyInteraction","targetKey","isSourceArray","isTargetArray","sourceEl","targetEl","addInteraction","_addInteraction","sourceKey","sourceController","interactionVariations","interactionsToApply","targetKey_","addEffectsForTarget","interactionIds","interactionMql","args","triggers","hasTriggers","hasEffects","addListItems","selectors","removeListItems","modules","INTERACT_EFFECT_DATA_ATTR","InteractionController","domKey","cssRules","position","cssRule","isLegacy","currentEffects","trimmed","list","removedElements","addedElements","buildSelector","conditionSelector","elementSelector","generate","css","processedSelectors","interactionKey","interactionSelector","interactionListContainer","interactionListItemSelector","params","interactionConditions","interactionParams","effectData","effectKey","effectSelector","effectListContainer","effectListItemSelector","effectConditions","configConditions","effectConditionSelector","interactionConditionSelector","selector"],"mappings":"aAAO,SAASA,GAA6BC,EAAa,CACxD,MAAO,CAAC,GAAGA,EAAI,SAAS,cAAc,CAAC,EAAE,IAAI,CAAC,CAACC,EAAGC,CAAY,IAAMA,CAAY,CAClF,CAGO,SAASC,EAAmBC,EAAkBJ,EAAa,CAChE,MAAMK,EAAON,GAA6BC,CAAG,EAC7C,IAAIM,EAAQ,EACZ,OAAOD,EAAK,OACRD,EAAS,QAAQ,OAAQ,IAAM,CAC7B,MAAMG,EAAIF,EAAKC,GAAO,EACtB,OAAOC,IAAM,OAAY,IAAIA,CAAC,IAAM,IACtC,CAAC,EACDH,CACN,CCNO,MAAMI,EAAe,CAC1B,WAIA,QACA,MACA,MAEA,YAAYC,EAAyBC,EAAiC,CACpE,KAAK,WAAaD,EAClB,KAAK,QAAUC,EACf,KAAK,MAAQA,GAAS,UAAY,QAAQ,QAAA,EAC1C,KAAK,MAAQD,EAAW,CAAC,YAAa,YACxC,CAEA,aAAc,CACZ,OAAO,KAAK,WAAW,CAAC,GAAG,QAAQ,kBAAA,EAAoB,UAAY,CACrE,CAEA,MAAM,KAAKE,EAAsC,CAC/C,MAAM,KAAK,MAEX,UAAWC,KAAa,KAAK,WAC3BA,EAAU,KAAA,EAKZ,MAAM,QAAQ,IAAI,KAAK,WAAW,IAAKA,GAAcA,EAAU,KAAK,CAAC,EAEjED,GACFA,EAAA,CAEJ,CAEA,OAAQ,CACN,UAAWC,KAAa,KAAK,WAC3BA,EAAU,MAAA,CAEd,CAEA,MAAM,QAAQD,EAAsC,CAClD,MAAM,KAAK,MAEX,UAAWC,KAAa,KAAK,WAC3BA,EAAU,QAAA,EAKZ,MAAM,QAAQ,IAAI,KAAK,WAAW,IAAKA,GAAcA,EAAU,KAAK,CAAC,EAEjED,GACFA,EAAA,CAEJ,CAEA,SAASE,EAAW,CAClB,UAAWD,KAAa,KAAK,WAAY,CACvC,KAAM,CAAE,MAAAE,EAAO,SAAAC,EAAU,WAAAC,GAAeJ,EAAU,OAAQ,UAAA,EACpDK,GACH,OAAO,SAASF,CAAQ,EAAKA,EAAsB,IACnD,OAAO,SAASC,CAAU,EAAKA,EAAwB,GAC1DJ,EAAU,cAAgBE,GAAS,GAAKG,GAAQJ,CAClD,CACF,CAEA,QAAS,CACP,UAAWD,KAAa,KAAK,WAC3BA,EAAU,OAAA,CAEd,CAEA,gBAAgBM,EAAc,CAC5B,UAAWN,KAAa,KAAK,WAC3BA,EAAU,aAAeM,CAE7B,CAEA,MAAM,SAASP,EAAqC,CAClD,GAAI,CACF,MAAM,QAAQ,IAAI,KAAK,WAAW,IAAKC,GAAcA,EAAU,QAAQ,CAAC,EAExE,MAAMO,EAAI,KAAK,WAAW,CAAC,EAE3B,GAAIA,GAAK,CAAC,KAAK,MAAO,CACpB,MAAMC,EAAUD,EAAE,QAA2B,OAE7C,GAAIC,EAAQ,CACV,MAAMC,EAAW,IAAI,MAAM,cAAc,EACzCD,EAAO,cAAcC,CAAQ,CAC/B,CACF,CAEAV,EAAA,CACF,OAASW,EAAQ,CACf,QAAQ,KAAK,4DAA6DA,CAAM,CAClF,CACF,CAEA,IAAI,UAAW,CACb,OAAO,QAAQ,IAAI,KAAK,WAAW,IAAKV,GAAcA,EAAU,QAAQ,CAAC,CAC3E,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,WAAW,CAAC,GAAG,SAC7B,CACF,CC1GO,MAAMW,GAAUC,GAAcA,EAOxBC,GAAUD,GAAc,EAAI,KAAK,IAAKA,EAAI,KAAK,GAAM,CAAC,EAOtDE,GAAWF,GAAc,KAAK,IAAKA,EAAI,KAAK,GAAM,CAAC,EAOnDG,GAAaH,GAAc,EAAE,KAAK,IAAI,KAAK,GAAKA,CAAC,EAAI,GAAK,EAO1DI,GAAUJ,GAAcA,GAAK,EAO7BK,GAAWL,GAAc,GAAK,EAAIA,IAAM,EAOxCM,GAAaN,GAAeA,EAAI,GAAM,EAAIA,GAAK,EAAI,GAAK,GAAKA,EAAI,IAAM,EAAI,EAO3EO,GAAWP,GAAcA,GAAK,EAO9BQ,GAAYR,GAAc,GAAK,EAAIA,IAAM,EAOzCS,GAAcT,GAAeA,EAAI,GAAM,EAAIA,GAAK,EAAI,GAAK,GAAKA,EAAI,IAAM,EAAI,EAO5EU,GAAWV,GAAcA,GAAK,EAO9BW,GAAYX,GAAc,GAAK,EAAIA,IAAM,EAOzCY,GAAcZ,GAAeA,EAAI,GAAM,EAAIA,GAAK,EAAI,GAAK,GAAKA,EAAI,IAAM,EAAI,EAO5Ea,GAAWb,GAAcA,GAAK,EAO9Bc,GAAYd,GAAc,GAAK,EAAIA,IAAM,EAOzCe,GAAcf,GAAeA,EAAI,GAAM,GAAKA,GAAK,EAAI,GAAK,GAAKA,EAAI,IAAM,EAAI,EAO7EgB,GAAUhB,GAAeA,IAAM,EAAI,EAAI,IAAM,GAAKA,EAAI,IAOtDiB,GAAWjB,GAAeA,IAAM,EAAI,EAAI,EAAI,IAAM,IAAMA,GAOxDkB,GAAalB,GACxBA,IAAM,EAAI,EAAIA,IAAM,EAAI,EAAIA,EAAI,GAAM,IAAM,GAAKA,EAAI,IAAM,GAAK,EAAI,IAAM,IAAMA,EAAI,KAAO,EAOhFmB,GAAUnB,GAAc,EAAI,KAAK,KAAK,EAAIA,GAAK,CAAC,EAOhDoB,GAAWpB,GAAc,KAAK,KAAK,GAAKA,EAAI,IAAM,CAAC,EAOnDqB,GAAarB,GACxBA,EAAI,IAAO,EAAI,KAAK,KAAK,EAAI,EAAIA,GAAK,CAAC,GAAK,GAAK,KAAK,KAAK,EAAE,EAAIA,EAAI,IAAM,EAAIA,EAAI,EAAE,EAAI,GAAK,EAOnFsB,GAAUtB,GAAc,QAAUA,GAAK,EAAI,QAAUA,GAAK,EAO1DuB,GAAWvB,GAAc,EAAI,SAAWA,EAAI,IAAM,EAAI,SAAWA,EAAI,IAAM,EAQ3EwB,GAAY,CAACxB,EAAWjB,EAAI,QAAU,QACjDiB,EAAI,IACE,EAAIA,IAAM,IAAMjB,EAAI,GAAK,EAAIiB,EAAIjB,GAAM,IACvC,EAAIiB,EAAI,IAAM,IAAMjB,EAAI,IAAMiB,EAAI,EAAI,GAAKjB,GAAK,GAAK,EAEhD0C,GAAY,CACvB,OAAA1B,GACA,OAAAE,GACA,QAAAC,GACA,UAAAC,GACA,OAAAC,GACA,QAAAC,GACA,UAAAC,GACA,QAAAC,GACA,SAAAC,GACA,WAAAC,GACA,QAAAC,GACA,SAAAC,GACA,WAAAC,GACA,QAAAC,GACA,SAAAC,GACA,WAAAC,GACA,OAAAC,GACA,QAAAC,GACA,UAAAC,GACA,OAAAC,GACA,QAAAC,GACA,UAAAC,GACA,OAAAC,GACA,QAAAC,GACA,UAAAC,EACF,EAKaE,GAAa,CACxB,OAAQ,SACR,KAAM,OACN,OAAQ,UACR,QAAS,WACT,UAAW,cACX,OAAQ,sCACR,QAAS,sCACT,UAAW,wCACX,OAAQ,wCACR,QAAS,uCACT,UAAW,0CACX,QAAS,yCACT,SAAU,sCACV,WAAY,uCACZ,QAAS,yCACT,SAAU,qCACV,WAAY,kCACZ,QAAS,yCACT,SAAU,iCACV,WAAY,iCACZ,OAAQ,yCACR,QAAS,iCACT,UAAW,2BACX,OAAQ,uCACR,QAAS,sCACT,UAAW,yCACX,OAAQ,yCACR,QAAS,0CACT,UAAW,wCACb,ECtPO,SAASC,GAAYC,EAA6B,CACvD,OAAOA,IAAS,aAAe,IAAMA,GAAQ,IAC/C,CAEO,SAASC,EAAUC,EAAmD,CAC3E,OAAOA,EAASJ,GAAWI,CAAiC,GAAKA,EAASJ,GAAW,MACvF,CAEO,SAASK,GACdD,EACqC,CACrC,OAAOA,EAASL,GAAUK,CAAgC,EAAI,MAChE,CCPO,MAAME,EAAgB,CAC3B,WACA,aACA,SACA,UACA,eAEA,YACEC,EACArC,EACAsC,EACAC,EACA,CAEA,MAAMC,EAAS,IAAI,eAAexC,EAAQ,CAAA,EAAI,CAC5C,GAAGsC,EACH,UAAW,KAAA,CACZ,EACK,CAAE,SAAAG,GAAaF,EACrB,KAAK,WAAa,IAAI,UAAUC,EAAQC,CAAQ,EAEhD,KAAK,UAAY,KACjB,KAAK,SAAW,KAChB,KAAK,aAAgBC,GAA4BL,EAAaG,EAAO,OAAQE,CAAQ,EAGrF,KAAK,eAAkB7D,GAAW,CAE5B,KAAK,OAA0B,QAAQ,cAAA,EAAgB,KAAMkB,GAAMA,IAAM,KAAK,UAAU,GAE1F,KAAK,OAAA,CAET,EACA,KAAK,iBAAiB,SAAU,KAAK,cAAc,EACnD,KAAK,iBAAiB,SAAU,KAAK,cAAc,CACrD,CAGQ,OAAQ,CACd,GAAI,CACF,MAAM2C,EAAW,KAAK,QAAQ,kBAAA,EAAoB,UAAY,KAC1DA,IAAa,KAAK,WACpB,KAAK,eAAeA,CAAQ,EAC5B,KAAK,SAAWA,GAElB,KAAK,UAAY,sBAAsB,IAAM,CAC3C,KAAK,MAAA,CACP,CAAC,CACH,OAASC,EAAO,CACd,KAAK,UAAY,KACjB,QAAQ,MACN,yCAAyC,KAAK,EAAE,YAC9CA,aAAiB,MAAQA,EAAM,QAAUA,CAC3C,EAAA,CAEJ,CACF,CAGA,IAAI,aAAc,CAChB,OAAO,KAAK,WAAW,WACzB,CACA,IAAI,YAAY9C,EAA2B,CACzC,KAAK,WAAW,YAAcA,CAChC,CACA,IAAI,WAAY,CACd,OAAO,KAAK,WAAW,SACzB,CACA,IAAI,UAAUA,EAA2B,CACvC,KAAK,WAAW,UAAYA,CAC9B,CACA,IAAI,cAAe,CACjB,OAAO,KAAK,WAAW,YACzB,CACA,IAAI,aAAa+C,EAAe,CAC9B,KAAK,WAAW,aAAeA,CACjC,CAGA,IAAI,IAAK,CACP,OAAO,KAAK,WAAW,EACzB,CACA,IAAI,GAAGC,EAAa,CAClB,KAAK,WAAW,GAAKA,CACvB,CACA,IAAI,QAAS,CACX,OAAO,KAAK,WAAW,MACzB,CACA,IAAI,OAAOC,EAA2B,CACpC,KAAK,WAAW,OAASA,CAC3B,CACA,IAAI,UAAW,CACb,OAAO,KAAK,WAAW,QACzB,CACA,IAAI,SAASC,EAA8B,CACzC,KAAK,WAAW,SAAWA,CAC7B,CAGA,IAAI,UAAW,CACb,OAAO,KAAK,WAAW,QACzB,CACA,IAAI,SAAU,CACZ,OAAO,KAAK,WAAW,OACzB,CACA,IAAI,WAAY,CACd,OAAO,KAAK,WAAW,SACzB,CACA,IAAI,OAAQ,CACV,OAAO,KAAK,WAAW,KACzB,CACA,IAAI,cAAe,CACjB,OAAO,KAAK,WAAW,YACzB,CAGA,IAAI,UAAW,CACb,OAAO,KAAK,WAAW,QACzB,CACA,IAAI,SAASC,EAAmE,CAC9E,KAAK,WAAW,SAAWA,CAC7B,CACA,IAAI,UAAW,CACb,OAAO,KAAK,WAAW,QACzB,CACA,IAAI,SAASA,EAAmE,CAC9E,KAAK,WAAW,SAAWA,CAC7B,CACA,IAAI,UAAW,CACb,OAAO,KAAK,WAAW,QACzB,CACA,IAAI,SAASA,EAAmE,CAC9E,KAAK,WAAW,SAAWA,CAC7B,CAGA,MAAO,CACL,KAAK,WAAW,KAAA,EAChB,qBAAqB,KAAK,SAAU,EACpC,KAAK,UAAY,sBAAsB,IAAM,KAAK,OAAO,CAC3D,CAEA,OAAQ,CACN,KAAK,WAAW,MAAA,EAChB,qBAAqB,KAAK,SAAU,EACpC,KAAK,UAAY,IACnB,CAEA,QAAS,CACP,KAAK,oBAAoB,SAAU,KAAK,cAAc,EACtD,KAAK,oBAAoB,SAAU,KAAK,cAAc,EACtD,KAAK,WAAW,OAAA,EAEhB,KAAK,aAAa,IAAI,EACtB,qBAAqB,KAAK,SAAU,EACpC,KAAK,UAAY,IACnB,CAEA,cAAe,CACb,QAAQ,KACN,4FAAA,CAEJ,CAGA,QAAS,CACP,KAAK,WAAW,OAAA,CAClB,CACA,SAAU,CACR,KAAK,WAAW,QAAA,CAClB,CACA,SAAU,CACR,KAAK,WAAW,QAAA,CAClB,CACA,mBAAmBC,EAAsB,CACvC,KAAK,WAAW,mBAAmBA,CAAY,CACjD,CAGA,iBACEC,EACAC,EACA7D,EACA,CACA,KAAK,WAAW,iBAAiB4D,EAAMC,EAAU7D,CAAO,CAC1D,CACA,oBACE4D,EACAC,EACA7D,EACA,CACA,KAAK,WAAW,oBAAoB4D,EAAMC,EAAU7D,CAAO,CAC7D,CACA,cAAc8D,EAAc,CAC1B,OAAO,KAAK,WAAW,cAAcA,CAAK,CAC5C,CACF,CAAA,SAAAC,GAAAC,EAAA,uKC1ME,SAASC,EAAK,CAoBhB,IAAIC,EAAqD,UAAW,CAAA,EAOhEC,EAAMF,EAAI,uBACTA,EAAI,6BACJA,EAAI,0BACJA,EAAI,yBACJ,SAASP,EAAI,CAAE,OAAO,WAAWA,EAAI,EAAE,CAAE,EAO9C,SAASU,GAAU,CACjB,IAAIC,EAAO,KACXA,EAAK,MAAQ,CAAA,EACbA,EAAK,OAAS,CAAA,EACdA,EAAK,IAAMF,EAAI,KAAKF,CAAG,CAEzB,CAEAG,EAAQ,UAAY,CAClB,YAAaA,EAUb,SAAU,SAASE,EAAO,CAEd,QAANC,EAAaA,EAAOD,EAAM,MAAK,GAAIC,EAAI,CAC/C,EAUE,QAAS,SAASC,EAAIC,EAAK,CAEzB,IAAIF,EAAQE,EAAWD,EAAG,KAAKC,CAAG,EAAhBD,EAClB,YAAK,MAAM,KAAKD,CAAI,EACpBG,EAAc,IAAI,EACXH,CACX,EAWE,OAAQ,SAASC,EAAIC,EAAK,CAExB,IAAIF,EAAQE,EAAWD,EAAG,KAAKC,CAAG,EAAhBD,EAClB,YAAK,OAAO,KAAKD,CAAI,EACrBG,EAAc,IAAI,EACXH,CACX,EASE,MAAO,SAASA,EAAM,CAEpB,OAAOI,EAAO,KAAK,MAAOJ,CAAI,GAAKI,EAAO,KAAK,OAAQJ,CAAI,CAC/D,EAoCE,OAAQ,SAASK,EAAO,CAEtB,GAAI,OAAOA,GAAS,SAAU,MAAM,IAAI,MAAM,iBAAiB,EAE/D,IAAIC,EAAQ,OAAO,OAAO,IAAI,EAC9B,OAAAC,EAAMD,EAAOD,CAAK,EAClBC,EAAM,QAAU,KAGZA,EAAM,YAAYA,EAAM,WAAU,EAE/BA,CACX,EAKE,MAAO,MAST,SAASH,EAAcK,EAAS,CACzBA,EAAQ,YACXA,EAAQ,UAAY,GACpBA,EAAQ,IAAIC,EAAM,KAAK,KAAMD,CAAO,CAAC,EAGzC,CAWA,SAASC,EAAMD,EAAS,CAGtB,IAAIE,EAASF,EAAQ,OACjBG,EAAQH,EAAQ,MAChB1B,EAEJ,GAAI,CACFa,EAAM,iBAAkBgB,EAAM,MAAM,EACpCH,EAAQ,SAASG,CAAK,EACtBhB,EAAM,kBAAmBe,EAAO,MAAM,EACtCF,EAAQ,SAASE,CAAM,CAC3B,OAAWzB,EAAG,CAAEH,EAAQG,CAAE,CAOxB,GALAuB,EAAQ,UAAY,IAGhBG,EAAM,QAAUD,EAAO,SAAQP,EAAcK,CAAO,EAEpD1B,EAEF,GADAa,EAAM,eAAgBb,EAAM,OAAO,EAC/B0B,EAAQ,MAAOA,EAAQ,MAAM1B,CAAK,MACjC,OAAMA,CAEf,CASA,SAASsB,EAAOQ,EAAOC,EAAM,CAC3B,IAAIxF,EAAQuF,EAAM,QAAQC,CAAI,EAC9B,MAAO,CAAC,CAAC,CAACxF,GAAS,CAAC,CAACuF,EAAM,OAAOvF,EAAO,CAAC,CAC5C,CASA,SAASkF,EAAMpE,EAAQ2E,EAAQ,CAC7B,QAAS/F,KAAO+F,EACVA,EAAO,eAAe/F,CAAG,IAAGoB,EAAOpB,CAAG,EAAI+F,EAAO/F,CAAG,EAE5D,CAIA,IAAIgG,EAAUrB,EAAI,QAAWA,EAAI,SAAW,IAAIG,EAIVmB,UAAiBD,CAEvD,GAAI,OAAO,OAAW,IAAc,OAAS,OAAOE,GAAQ,IAAcA,GAAO,UAAU,6CCjPrFC,GAAyC,CAAA,EAExC,SAASC,GAAgBC,EAAuC,CACrE,OAAO,OAAOF,GAAUE,CAAO,CACjC,CAEO,SAASC,GAAoBC,EAAc,CAChD,OAAIA,KAAQJ,GACHA,GAASI,CAAI,GAEpB,QAAQ,KACN,GAAGA,CAAI,6EAAA,EAEF,KAEX,CCHA,SAASC,EAAWC,EAAmBC,EAA8C,CACnF,OAAOD,EAAuB,SAAU,eAAeA,CAAE,EAAI,IAC/D,CAEA,SAASE,GAAqBC,EAAyBC,EAAc,CACnE,OAAID,GAAS,QAAQ,uBAAuBC,CAAI,IAAI,EAC3CD,EAEFA,GAAS,cAAc,uBAAuBC,CAAI,IAAI,CAC/D,CAEA,SAASC,GAAalD,EAA2D,CAC/E,MAAMmD,EAAYnD,EAAO,UAAY,YAAc,GACnD,OAAOA,EAAO,SACT,GAAGmD,EAAY,GAAGA,CAAS,IAAM,EAAE,UACpCA,GAAa,QACnB,CAEA,SAASC,GAAUC,EAAsC,CACvD,MAAO,GAAGA,EAAO,KAAK,GAAG9D,GAAY8D,EAAO,IAAI,CAAC,EACnD,CAEA,SAASC,GAASC,EAAoBC,EAAyBC,EAAiB,CAG9E,MAAO,GAAGF,EAAM,MAAQ,OAAO,IAC7BE,GAASF,EAAM,OAAQ,OAAS,aAC5B,eAAeH,GAAUG,EAAM,MAAO,CAAC,GAAGC,EAAM,MAAMA,CAAG,GAAK,EAAE,IAChEA,EACE,QAAQJ,GAAUG,EAAM,MAAO,CAAC,MAAMC,CAAG,IACzCJ,GAAUG,EAAM,MAAO,CAC/B,EACF,CAEA,SAASG,GAAU1D,EAA+B,CAChD,MAAO,CACL,MAAOsD,GAAStD,EAAO,YAAcA,EAAO,cAAc,EAC1D,IAAKsD,GAAStD,EAAO,UAAYA,EAAO,aAAc,EAAI,CAAA,CAE9D,CAEA,SAAS2D,GAAQnG,EAA6C,CAC5D,OAAQ8D,GAAOO,EAAQ,QAAQ,IAAMP,EAAG9D,CAAM,CAAC,CACjD,CAEA,SAASoG,GAAOpG,EAA6C,CAC3D,OAAQ8D,GAAOO,EAAQ,OAAO,IAAMP,EAAG9D,CAAM,CAAC,CAChD,CAEA,SAASqG,EAAe7G,EAA6B,CACnD,GAAIA,EAAU,YAAa,CACzB,MAAM8G,EAAa9G,EAAU,YAAY,KACzC,OAAO,OAAO8G,GAAe,SAAWpB,GAAoBoB,CAAU,EAAI,IAC5E,SAAW9G,EAAU,eAAgB,CACnC,MAAMgD,EAAU+D,GAAiC,CAC/C,KAAM,CAAE,KAAApB,EAAM,UAAAqB,CAAA,EAAcD,EAAW,eAEvC,MAAO,CAAC,CAAE,GAAGA,EAAY,KAAApB,EAAM,UAAAqB,EAAW,CAC5C,EAQA,MAAO,CAAE,IAAKhE,EAAQ,MAAOA,EAAQ,SAPnB+D,GAAiC,CACjD,KAAM,CAAE,SAAAE,GAAaF,EACf,CAAE,KAAApB,GAASoB,EAAW,eACtB1D,EAAMsC,GAAQsB,EAEpB,OAAO5D,EAAM,CAACA,CAAG,EAAI,CAAA,CACvB,CACqC,CACvC,SAAWrD,EAAU,aACnB,OAAQ+G,GAAiC,CAAC,CAAE,GAAGA,EAAY,UAAW,CAAA,EAAI,EAE5E,OAAO,IACT,CAEA,SAASG,GACPrH,EACAsH,EACAF,EACA,CAEA,OAAOpH,EAAW,IAAI,CAACmD,EAAQtD,IAAU,CAEvC,MAAMoD,EAAgB,CACpB,KAAME,EAAO,KACb,OAAQP,EAAUO,EAAO,MAAM,EAC/B,WAAYA,EAAO,aAAe,EAAI,IAAWA,EAAO,YAAc,EACtE,UAAWA,EAAO,UAClB,UAAWkD,GAAalD,CAAM,CAAA,EAIhC,OAAIoE,GAAmBD,CAAO,GAC5BrE,EAAc,SAAWE,EAAO,SAChCF,EAAc,MAASE,EAAgC,OAAS,GAG5D,OAAO,cAAgBmE,GAAS,UAAY,gBAE9CrE,EAAc,SAAW,QAIzBA,EAAc,SAAW,MACzBA,EAAc,MAAQ,KAInB,CACL,OAAAE,EACA,QAASF,EACT,GAAImE,GAAY,GAAGA,CAAQ,IAAIvH,EAAQ,CAAC,GACxC,KAAMsD,EAAO,IAAA,CAEjB,CAAC,CACH,CAEA,SAASoE,GAAmBD,EAAmC,CAC7D,MAAO,CAACA,GAAYA,EAAQ,UAAY,gBAAkBA,EAAQ,UAAY,eAChF,CC1GA,SAASE,GACPC,EACAtH,EACAQ,EACA2G,EACArH,EACyC,CACzC,GAAIwH,EAAQ,CAEV,GAAIF,GAAmBD,CAAO,IAC5BnH,EAAU,SAAWA,EAAU,UAAY,EAEvCF,GAAS,eACX,GAAIE,EAAU,aAAe,GAAKA,EAAU,YAAc,KACxDA,EAAY,CAAE,GAAGA,EAAW,SAAU,CAAA,MAEtC,OAAO,CAAA,EAKb,IAAIuH,EACJ,OAAI/G,aAAkB,cACpB+G,EAAS,CAAE,QAASZ,GAAQnG,CAAM,EAAG,OAAQoG,GAAOpG,CAAM,CAAA,GAGpD8G,EAAmC,IACtCA,EAAmC,IAAItH,EAAWuH,EAAQzH,CAAO,EACjEwH,EAA0CtH,EAAWuH,EAAQzH,CAAO,CAC3E,CAEA,MAAO,CAAA,CACT,CAEA,SAAS0H,GACPhH,EACAiH,EACAN,EACArH,EACAgG,EACgD,CAChD,MAAME,EAAUxF,aAAkB,YAAcA,EAASoF,EAAWpF,CAAqB,EAEzF,GAAI2G,GAAS,UAAY,gBAAkB,CAACM,EAAiB,eAAgB,CAC3E,IAAI3E,EAAgB2E,EAEhBA,EAAiB,eACnB3E,EAAgB,CACd,GAAG2E,EACH,YAAa,CAAE,GAAI,GAAI,KAAM,aAAA,CAAc,GAK/C,MAAMC,EAAuBb,EAC3B/D,CAAA,EAEI6E,EAAwBN,GAC5BK,EACAD,EACAzB,EACAmB,EACArH,CAAA,EAGF,OAAI,OAAO6H,GAA0B,WAC5B,KAGFA,EAAsB3B,CAAsB,CACrD,CAGA,MAAM4B,EAAcf,EAAeY,CAAgB,EAE7CI,EAAiBR,GACrBO,EACAH,EACAzB,EACAmB,EACArH,CAAA,EAIF,GAAI,CAAC+H,GAAkBA,EAAe,SAAW,EAC/C,OAAO,KAGT,MAAMC,EAAOZ,GAAeW,EAAgBV,EAASM,EAAiB,QAAQ,EAE9E,IAAIxE,EACJ,MAAM8E,EAAiBZ,GAAS,UAAY,gBAGxCY,GAAkB,OAAO,eAG3B9E,EAAW,IAAI,aAAa,CAC1B,QAASkE,EAAQ,SAAWvB,EAAWuB,EAAQ,WAAY,CAAA,CAC5D,GAIH,MAAMtH,EAAaiI,EAAK,IAAI,CAAC,CAAE,OAAA9E,EAAQ,QAASF,EAAe,GAAA+C,EAAI,KAAAI,KAAW,CAC5E,MAAM+B,EAAe/B,EAAOF,GAAqBC,EAASC,CAAI,EAAID,EAE5DiC,EAAiB,IAAI,eAAeD,GAAgB,KAAM,CAAA,EAAIlF,CAAa,EAGjF+B,EAAQ,OAAO,IAAM,CACf,WAAY7B,GACdiF,EAAe,aAAajF,EAAO,MAA8B,EAGnEiF,EAAe,aAAajF,EAAO,SAAS,CAC9C,CAAC,EAED,MAAMD,EACJgF,GAAkB9E,EAAW,CAAE,SAAAA,CAAA,EAA4C,CAAA,EACvEjD,EACJ,OAAOgD,EAAO,cAAiB,WAC1B,IAAIJ,GACHI,EAAO,aACPgF,GAAgB,KAChBlF,EACAC,CAAA,EAEF,IAAI,UAAUkF,EAAgBlF,EAAc,QAAQ,EAG1D,GAAIgF,EACF,GAAI9E,EAEF4B,EAAQ,OAAO,IAAM,CACnB,KAAM,CAAE,MAAAqD,EAAO,IAAAC,GAAQzB,GAAU1D,CAA+B,EAEhEhD,EAAU,WAAakI,EAEvBlI,EAAU,SAAWmI,EAErBnI,EAAU,KAAA,CACZ,CAAC,MACI,CACL,KAAM,CAAE,YAAAoI,EAAa,UAAAC,CAAA,EAAcZ,EAGnC5C,EAAQ,OAAO,IAAM,CACnB,MAAMyD,EAAsBtF,EAAiC,aAAeoF,EACtEG,EAAoBvF,EAAiC,WAAaqF,EAExE,OAAO,OAAOrI,EAAW,CACvB,MAAO,CACL,KAAMsI,EAAoB,KAC1B,OAAQA,EAAoB,QAAQ,MACpC,IAAMtF,EAAkC,cAAA,EAE1C,IAAK,CACH,KAAMuF,EAAkB,KACxB,OAAQA,EAAkB,QAAQ,MAClC,IAAMvF,EAAkC,YAAA,CAC1C,CACD,CACH,CAAC,CACH,CAGF,OAAI6C,IACF7F,EAAU,GAAK6F,GAGV7F,CACT,CAAC,EAGD,OAAO,IAAIJ,GAAeC,EAAY,CACpC,GAAG4H,EACH,QAAS,CAAE,GAAIN,GAAY,EAAC,EAE5B,SAAU,IAAI,QAASqB,GAAY3D,EAAQ,OAAO2D,CAAO,CAAC,CAAA,CAC3D,CACH,CCzMA,SAASC,GACPjI,EACAR,EACAD,EACA,CACA,MAAMuH,EAAST,EAAe7G,CAAS,EACjCgG,EAAUxF,aAAkB,YAAcA,EAASoF,EAAWpF,CAAM,EAE1E,GAAI8G,GAAWA,EAAsC,SAAWtB,EAAS,CACvE,MAAMuB,EAAS,CAAE,QAASZ,GAAQX,CAAO,EAAG,OAAQY,GAAOZ,CAAO,CAAA,EAEjEsB,EAAsC,QAAStH,EAAmCuH,CAAM,CAC3F,CAEIxH,GACF8E,EAAQ,OAAO9E,CAAQ,CAE3B,CCHA,SAAS2I,GACPlI,EACAiH,EACuB,CACvB,MAAMG,EAAcf,EAAeY,CAAgB,EAEnD,GAAI,CAACG,EACH,OAAO,KAGT,GAAI,CAACA,EAAY,MAEf,OAAIH,EAAiB,UAAYjH,EACxBmI,GAAoBnI,EAAQiH,EAAiB,QAAQ,EAGvD,KAGT,MAAMmB,EAAchB,EAAY,SAASH,CAAgB,EAEnD5H,GADU,OAAOW,GAAW,SAAWoF,EAAWpF,CAAM,EAAIA,IACtC,cAAA,EACtBqI,EACJhJ,GAAY,IAAKiJ,GAAUA,EAAsB,aAAa,GAAM,CAAA,EAChEC,EAAqC,CAAA,EAE3C,OAAAH,EAAY,QAASjD,GAAS,CACxBkD,EAAe,SAASlD,CAAI,GAC9BoD,EAAmB,KACjBlJ,GAAY,KAAMiJ,GAAUA,EAAsB,gBAAkBnD,CAAI,CAAA,CAG9E,CAAC,EAEMoD,GAAoB,OAAS,IAAInJ,GAAemJ,CAAkB,EAAI,IAC/E,CAEA,SAASJ,GACPnI,EACAyG,EACuB,CAGvB,MAAMpH,GAFU,OAAOW,GAAW,SAAWoF,EAAWpF,CAAM,EAAIA,IAEtC,cAAA,EAAgB,OAAQsI,GAAmC,CACrF,MAAMjD,EAAKiD,EAAK,IAAOA,EAAsB,cAE7C,OAAOjD,EAAKA,EAAG,WAAWoB,CAAQ,EAAI,EACxC,CAAC,EAED,OAAOpH,GAAY,OAAS,IAAID,GAAeC,CAAU,EAAI,IAC/D,CAEA,SAASmJ,GACPxI,EACAiH,EACAN,EACA8B,EAAoC,CAAA,EACiC,CACrE,KAAM,CAAE,SAAAC,EAAU,iBAAAC,EAAkB,GAAGC,GAASH,EAC1CjJ,EAAYwH,GAAgBhH,EAAQiH,EAAkBN,EAASiC,CAAI,EAGzE,GAAI,CAACpJ,EACH,OAAO,KAGT,IAAIqJ,EAAsB,CAAA,EAE1B,GAAIlC,EAAQ,UAAY,iBAAmB,CAAC,OAAO,aAAc,CAE/D,MAAMmC,EAAanC,EAAQ,SAAWvB,EAAWuB,EAAQ,WAAY,EAC/D,CAAE,MAAAoC,GAAUvJ,EAElB,OAAQA,EAA6B,WAAW,IAAKwJ,IAC5C,CAGL,IAAI,OAAQ,CACV,OAAOA,EAAiB,KAC1B,EACA,IAAI,KAAM,CACR,OAAOA,EAAiB,GAC1B,EACA,WAAAF,EACA,MAAAC,EACA,aAAc,CACZ,OAAQvJ,EAA6B,YAAA,CACvC,EACA,OAAOyJ,EAASxJ,EAAW,CACzB,KAAM,CAAE,eAAAyJ,CAAA,EAAmBF,EAAiB,OAAQ,kBAAA,EAC9C,CAAE,MAAAtJ,CAAA,EAAUsJ,EAAiB,OAAQ,UAAA,EAE3CA,EAAiB,cAAgBtJ,GAAS,IAAOwJ,GAA6B,IAAMzJ,CACtF,EACA,SAAAiJ,EACA,SAAU,CACRM,EAAiB,OAAA,CACnB,CAAA,EAEH,CACH,SAAWrC,EAAQ,UAAY,eAAgB,CAC7C,MAAMwC,EAAelC,EACf,CAAE,iBAAAmC,EAAkB,mBAAAC,EAAoB,iBAAAC,CAAA,EAAqBH,EAC7DI,EAAQ5C,EAAuC,KAErD,GAAIwC,EAAa,eAAgB,CAC/B,MAAMK,EAAiBhK,EAEvB,OAAIgK,EAAe,YAAY,SAAW,EACjC,KAGuD,CAC9D,OAAQ,OACR,iBAAAJ,EACA,MAAOI,EAAe,MACtB,iBAAkB,EAClB,aAAc,CACZ,OAAO,KAAK,gBACd,EACA,OAAOP,EAASxJ,EAA6B,CAC3C,MAAMgK,EAAiBF,IAAS,IAAM9J,EAAE,EAAIA,EAAE,EAC9C,KAAK,iBAAmBgK,EACxBD,EAAe,SAASC,CAAc,CACxC,EACA,SAAUf,GAAY,GACtB,SAAU,CACRc,EAAe,OAAA,CACjB,CAAA,CAIJ,CAEAX,EAAsB,CACpB,iBAAAO,EACA,iBAAAT,CAAA,EAGE1B,EAAiB,cAAgBoC,IACnCR,EAAoB,mBAAqBQ,EAEzCR,EAAoB,iBAAmB1G,GAAYmH,CAAgB,GAErET,EAAoB,OAAUrJ,EAAqC,MACrE,CAEA,MAAO,CACL,GAAGqJ,EACH,aAAc,CACZ,OAAQrJ,EAA4D,YAAA,CACtE,EACA,OACEyJ,EACAxJ,EACAiK,EACAC,EACA,CACAnK,EAAU,SACRkK,EACI,CAEE,GAAGjK,EACH,EAAAiK,EACA,OAAAC,CAAA,EAEFlK,CAAA,CAER,EACA,SAAAiJ,EACA,SAAU,CACRlJ,EAAU,OAAA,CACZ,CAAA,CAEJ,CAEA,SAASoK,GACP5J,EACAiH,EACAN,EACAkD,EAAyB,GACuB,CAChD,MAAMrK,EAAY0I,GAAuBlI,EAAQiH,CAAgB,EAEjE,OAAIzH,GACFA,EAAU,MAAQ,IAAI,QAASwI,GAAY,CACzCC,GAAiBjI,EAAQiH,EAAkBe,CAAO,CACpD,CAAC,EAEMxI,GAGFwH,GAAgBhH,EAAQiH,EAAkBN,EAAS,CAAE,cAAAkD,EAAe,CAC7E,CC3MO,SAASC,EAAuBC,EAAsBC,EAA2B,CACtF,OAAIA,EAAU,SAAS,GAAG,EACjBA,EAAU,QAAQ,KAAMD,CAAY,EAEtC,GAAGA,CAAY,GAAGC,CAAS,EACpC,CAEO,SAASC,IAAa,CAC3B,MAAO,cAAc,QACnB,MACCC,GACC,OAAO,cACJ,CAACA,EAAK,OAAO,gBAAgB,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC,EAAK,IAAO,CAACA,EAAI,GAAQ,EAAA,CAC7E,CAEN,CAEO,SAASC,GAAoB,CAClC,IAAAvL,EACA,SAAA6H,EACA,WAAA2D,EACA,WAAAC,EACA,cAAAC,EAAgB,iBAChB,kBAAAC,CACF,EAAwC,CACtC,IAAIC,EAAwB,CAAA,EAE5B,GAAIJ,GAAY,gBAAiB,CAC/B,KAAM,CAAE,SAAAzK,EAAU,OAAAuC,EAAQ,MAAAxC,CAAA,EAAU0K,EAEhCzK,IACoCyK,EAAW,gBAAgB,KAAMK,GACrEA,EAAc,KAAK,WAAW,IAAI,CAAA,EAKlCD,EAAc,CACZ,OAAO7K,CAAQ,MAAMsC,EAAUC,GAAU,MAAM,CAAC,GAAGxC,EAAQ,IAAIA,CAAK,KAAO,EAAE,GAC7E,eAAA,EAGF8K,EAAcJ,EAAW,gBAAgB,IACtCK,GACC,GAAGA,EAAc,IAAI,IAAI9K,CAAQ,MAAMsC,EACrCC,GAAU,MAAA,CACX,GAAGxC,EAAQ,IAAIA,CAAK,KAAO,EAAE,EAAA,GAKtC2K,EAAaD,EAAW,eAC1B,MACEI,EACEH,GACI,OAAQK,GAAaA,EAAS,QAAQ,EACvC,IACEA,GACC,GAAGA,EAAS,IAAI,IAAIA,EAAS,QAAQ,MACnCzI,EAAUyI,EAAS,MAAM,GAAK,MAChC,GAAGA,EAAS,MAAQ,IAAIA,EAAS,KAAK,KAAO,EAAE,EAAA,GAC9C,CAAA,EAGX,MAAMC,EACJN,GAAY,IAAKK,GAAa,GAAGA,EAAS,IAAI,KAAKA,EAAS,KAAK,GAAG,GAAK,CAAA,EACrEE,EAAahM,EAAI,QAAQ,KAAM,GAAG,EAGlCiM,EAAgB,cAAcpE,CAAQ,SAASA,CAAQ,KAAK6D,CAAa,GACzEQ,EAAmB,2BAA2BrE,CAAQ,MAAM6D,CAAa,GAEzES,EAAqBR,EACvBT,EAAuBe,EAAeN,CAAiB,EACvDM,EACEG,EAAwBT,EAC1BT,EAAuBgB,EAAkBP,CAAiB,EAC1DO,EAEEG,EAAS,CACb,GAAGF,CAAkB;AAAA,MACnBC,CAAqB;AAAA,QACnBL,EAAgB,KAAK;AAAA,OACtB,CAAC;AAAA,MAAA,EAIN,GAAIH,EAAY,OAAQ,CACtB,MAAMU,EAAqB,uBAAuBN,CAAU,MAAMN,CAAa,GACzEa,EAA0BZ,EAC5BT,EAAuBoB,EAAoBX,CAAiB,EAC5DW,EAEJD,EAAO,KAAK,oDAAoDE,CAAuB;AAAA,oBACvEX,EAAY,KAAK,IAAI,CAAC;AAAA,QAClC,CACN,CACA,OAAOS,CACT,CAEO,SAASG,EACdC,EACAC,EACA,CACA,MAAMC,GAAoBF,GAAkB,CAAA,GACzC,OAAQG,GACAF,EAAWE,CAAa,GAAG,OAAS,SAAWF,EAAWE,CAAa,EAAE,SACjF,EACA,IAAKA,GACGF,EAAWE,CAAa,EAAE,SAClC,EACA,KAAK,SAAS,EAEXC,EAAYF,GAAoB,IAAIA,CAAgB,IAG1D,OAFYE,GAAa,OAAO,WAAWA,CAAS,CAGtD,CAEO,SAASC,EACdL,EACAC,EACoB,CACpB,UAAWnG,KAAQkG,GAAkB,GAAI,CACvC,MAAMI,EAAYH,EAAWnG,CAAI,EACjC,GAAIsG,GAAW,OAAS,YAAcA,EAAU,UAC9C,OAAOA,EAAU,SAErB,CAEF,CCjIA,MAAME,EAAuB,CAC3B,WAAY,CAAE,KAAM,QAAkB,OAAQ,CAAE,MAAO,EAAG,KAAM,aAAsB,EACtF,SAAU,CAAE,KAAM,QAAkB,OAAQ,CAAE,MAAO,IAAK,KAAM,YAAA,CAAsB,CACxF,EAEA,SAASC,GACPC,EACAC,EACsD,CACtD,MAAMC,EAAYF,GAAY,MAAQF,EAAqB,WAAW,KAChEK,EAAUF,GAAU,MAAQD,GAAY,MAAQF,EAAqB,SAAS,KAE9E/D,EAA2B,CAC/B,KAAMmE,EACN,OAAQF,GAAY,QAAUF,EAAqB,WAAW,MAAA,EAG1D9D,EAAyB,CAC7B,KAAMmE,EACN,OAAQF,GAAU,QAAUH,EAAqB,SAAS,MAAA,EAG5D,MAAO,CAAE,YAAA/D,EAAa,UAAAC,CAAA,CACxB,CAEO,SAASoE,EAAyBzJ,EAAkC,CAKzE,GAJI,mBAAoBA,GAAU,CAACA,EAAO,eAAe,MAAQ,aAAcA,IAC7EA,EAAO,eAAe,KAAOA,EAAO,UAGlC,aAAcA,EAChB,MAAO,CACL,GAAI,GACJ,GAAGA,CAAA,EAIP,KAAM,CAAE,WAAAqJ,EAAY,SAAAC,EAAU,GAAGlD,GAASpG,EACpC,CAAE,YAAAoF,EAAa,UAAAC,CAAA,EAAc+D,GAAoBC,EAAYC,CAAQ,EAE3E,MAAO,CACL,GAAI,GACJ,YAAAlE,EACA,UAAAC,EACA,GAAGe,CAAA,CAEP,CAEO,SAASsD,EACdC,EACA3G,EACA4G,EACA,CACA,IAAIC,EAAWF,EAAY,IAAI3G,CAAO,EAEjC6G,IACHA,MAAe,IACfF,EAAY,IAAI3G,EAAS6G,CAAQ,GAGnCA,EAAS,IAAID,CAAU,CACzB,CAEO,SAASE,EAA4BC,EAA8B/G,EAAsB,CAC7E+G,EAAW,IAAI/G,CAAO,GAE7B,QAAS4G,GAAe,CAChC,KAAM,CAAE,OAAAzH,EAAQ,OAAA3E,EAAQ,QAAAwM,CAAA,EAAYJ,EACpCI,EAAA,EAEA,MAAMC,EAAW9H,IAAWa,EAAUxF,EAAS2E,EACzB4H,EAAW,IAAIE,CAAQ,GAC9B,OAAOL,CAAU,CAClC,CAAC,EAEDG,EAAW,OAAO/G,CAAO,CAC3B,CC3EA,MAAMkH,GAAiD,CACrD,KAAM,KACN,WAAY,mBACZ,UAAW,CAAC,CAAC,CACf,EAGMC,GAAiD,CACrD,KAAM,KACN,WAAY,MACZ,UAAW,CAAC,CAAC,CACf,EAEMC,EAAkD,CAAA,EAClDL,MAAiB,QACjBM,MAAsB,QACtBC,MAAyB,QAC/B,IAAIC,GAA6C,CAAA,EAC7CC,EAAkD,KAEtD,SAASC,GAAW3N,EAAmC,CACrDyN,GAAmBzN,CACrB,CAEA,SAAS4N,GAAelN,EAAqBmN,EAAyB,CACnDZ,EAAW,IAAIvM,CAAM,GAC5B,QAAQ,CAAC,CAAE,OAAA2E,EAAQ,QAAAyI,KAAc,CACrCzI,IAAW3E,GACboN,EAASD,CAAc,CAE3B,CAAC,CACH,CAEA,SAASE,IAAkB,CACzB,OAAIL,IAIJA,EAAqB,IAAI,qBAAsBM,GAAY,CACzDA,EAAQ,QAASC,GAAU,CACzB,MAAMvN,EAASuN,EAAM,OAEhBA,EAAM,gBAETL,GAAelN,EAAQ,EAAK,CAEhC,CAAC,CACH,EAAG2M,EAAoB,EAEhBK,EACT,CAEA,SAASQ,GAAYlO,EAA0BmO,EAAsB,GAAO,CAC1E,MAAM7O,EAAM,KAAK,UAAU,CAAE,GAAGU,EAAS,WAAAmO,EAAY,EAErD,GAAIb,EAAUhO,CAAG,EACf,OAAOgO,EAAUhO,CAAG,EAGtB,MAAM8O,EAAmCD,EACrCf,GACA,CACE,KAAM,KACN,WAAYpN,EAAQ,MAAQ,GAAGA,EAAQ,KAAK,QAAQA,EAAQ,KAAK,GAAK,MACtE,UAAWA,EAAQ,SAAA,EAGnBqO,EAAW,IAAI,qBAAsBL,GAAY,CACrDA,EAAQ,QAASC,GAAU,CACzB,MAAMvN,EAASuN,EAAM,OACfK,EAAa,CAACf,EAAgB,IAAI7M,CAAM,EAE9C,GAAI4N,IACFf,EAAgB,IAAI7M,CAAM,EAEtBV,EAAQ,kBAAoB,CAACiO,EAAM,gBAAgB,CACrDlJ,EAAQ,QAAQ,IAAM,CACpB,MAAMwJ,EAAeN,EAAM,mBAAmB,OACxCO,EAAaP,EAAM,YAAY,OAErC,GAAI,CAACO,EACH,OAGF,MAAMC,EAAY,MAAM,QAAQzO,EAAQ,SAAS,EAC7C,KAAK,IAAI,GAAGA,EAAQ,SAAS,EAC7BA,EAAQ,UAEcyO,GAAaF,EAAeE,EAAYD,GAGhEzJ,EAAQ,OAAO,IAAM,CACnBsJ,EAAS,UAAU3N,CAAM,EACzB,MAAMgO,EAAeR,GAAYlO,EAAS,EAAI,EAC9CwN,EAAmB,IAAI9M,EAAQgO,CAAY,EAC3CA,EAAa,QAAQhO,CAAM,CAC7B,CAAC,CAEL,CAAC,EACD,MACF,CAGF,MAAMkD,EAAO5D,EAAQ,MAAQ,QAEzBiO,EAAM,gBAAmBrK,IAAS,aAAe,CAAC0K,KAEpDV,GAAelN,EAAQuN,EAAM,cAAc,EAEvCrK,IAAS,SACXyK,EAAS,UAAUJ,EAAM,MAAM,EAC/BV,EAAgB,OAAO7M,CAAM,GAKnC,CAAC,CACH,EAAG0N,CAAM,EAET,OAAAd,EAAUhO,CAAG,EAAI+O,EAEVA,CACT,CAEA,SAASM,GACPtJ,EACA3E,EACAwC,EACAlD,EAA2B,CAAA,EAC3B,CAAE,cAAAuK,EAAe,kBAAAU,CAAA,EAAuC,GACxD,CACA,MAAM2D,EAAgB,CAAE,GAAGnB,GAAkB,GAAGzN,CAAA,EAC1C4D,EAAOgL,EAAc,MAAQ,OAC7B1O,EAAYoK,GAChB5J,EACAiM,EAAyBzJ,CAAM,EAC/B,OACAqH,CAAA,EAIF,GAAI,CAACrK,EACH,OAGF,MAAMmO,EAAWH,GAAYU,CAAa,EAGtChL,IAAS,QAEV1D,EAAwD,UAAA,EAI3D,IAAI2O,EAAgB,GAuEpB,MAAM/B,EAAa,CAAE,OAAAzH,EAAQ,OAAA3E,EAAQ,QArEpBmN,GAA6B,CACxC5C,GAAqB,CAACvK,EAAO,QAAQuK,CAAiB,IAEtDrH,IAAS,OACPiK,GACF3N,EAAU,KAAK,IAAM,CACnB,MAAM4O,EAAgB,IAAM,CAC1BpO,EAAO,QAAQ,cAAgB,OACjC,EAEIR,EAAU,OACZ6E,EAAQ,OAAO,IAAM,CAEnB,sBAAsB+J,CAAa,CACrC,CAAC,EAED5O,EAAU,SAAS,IAAM,CACvB6E,EAAQ,OAAO,IAAM,CACnBrE,EAAO,QAAQ,cAAgB,MACjC,CAAC,CACH,CAAC,GAEDqE,EAAQ,OAAO+J,CAAa,CAEhC,CAAC,EAEMlL,IAAS,YACdiL,GAAiBhB,GACnBgB,EAAgB,GAChB3O,EAAU,KAAA,GACA2O,GAEV3O,EAAU,QAAA,EAEH0D,IAAS,SACdiK,GAEF3N,EAAU,SAAS,CAAC,EACpBA,EAAU,KAAA,IAGVA,EAAU,MAAA,EACVA,EAAU,SAAS,CAAC,GAEb0D,IAAS,UACdiK,EAEF3N,EAAU,KAAA,EAGVA,EAAU,MAAA,GAGhB,EAgB8C,QAd9B,IAAM,EACIsN,EAAmB,IAAInI,CAAM,GAAKgJ,GAC1C,UAAUhJ,CAAM,GAE5BzB,IAAS,UAAYA,IAAS,UAEXmK,GAAA,EACR,UAAU1I,CAAM,EAG/BnF,EAAU,OAAA,EACVqN,EAAgB,OAAOlI,CAAM,EAC7BmI,EAAmB,OAAOnI,CAAM,CAClC,CAC8C,EAE9CuH,EAAgBK,EAAY5H,EAAQyH,CAAU,EAC9CF,EAAgBK,EAAYvM,EAAQoM,CAAU,EAE9CU,EAAmB,IAAInI,EAAQgJ,CAAQ,EACvCA,EAAS,QAAQhJ,CAAM,GAInBzB,IAAS,UAAYA,IAAS,UACXmK,GAAA,EACR,QAAQ1I,CAAM,CAE/B,CAEA,SAAS0J,GAAuB7I,EAAsB,CACpD8G,EAA4BC,EAAY/G,CAAO,CACjD,CAEA,SAAS8I,IAAQ,CACftB,EAAqB,KACrB,OAAO,KAAKJ,CAAS,EAAE,QAAShO,GAAQ,OAAOgO,EAAUhO,CAAG,CAAC,CAC/D,CAEA,MAAA2P,GAAe,CACb,IAAKN,GACL,OAAQI,GACR,WAAApB,GACA,MAAAqB,EACF,EChQA,SAASE,GAAWC,EAAKC,EAAU,CACjC,OAAO,OAAO,OAAO,OAAO,OAAOA,CAAQ,EAAGD,CAAG,CACnD,CAWA,SAASE,GAAM5O,EAAG6O,EAAGxO,EAAG0C,EAAG,CACzB,IAAI+L,EAAM9O,GAAK,EAAIK,GAAKwO,EAAIxO,EAE5B,GAAI0C,EAAG,CACL,MAAMgM,EAAiBD,EAAM9O,EACzB,KAAK,IAAI+O,CAAc,EAAIhM,IAC7B+L,EAAM9O,EAAI+C,EAAI,KAAK,KAAKgM,CAAc,GAGxC,MAAMC,EAAeH,EAAIC,EAEzB,GAAI,KAAK,IAAIE,CAAY,EAAIjM,EAC3B,OAAO8L,CAEX,CAEA,OAAOC,CACT,CASA,SAASG,GAAelL,EAAI,CAC1B,IAAImL,EAAY,GAEhB,OAAO,UAAY,CACZA,IACHA,EAAY,GAEZ,OAAO,sBAAsB,IAAM,CACjCA,EAAY,GACZnL,EAAE,CACJ,CAAC,EAEL,CACF,CASA,SAASoL,GAAUpL,EAAIqL,EAAU,CAC/B,IAAIC,EAAY,EAEhB,OAAO,UAAmB,CACpBA,GACF,OAAO,aAAaA,CAAS,EAG/BA,EAAY,OAAO,WAAW,IAAM,CAClCA,EAAY,EACZtL,EAAE,CACJ,EAAGqL,CAAQ,CACb,CACF,CC9EA,SAASE,GAAgBC,EAAcC,EAAuB,CAC5D,MAAMC,EAAQF,EAAa,MAAM,sGAAsG,EACvI,OAAOG,EAAgCD,EAAM,CAAC,EAAGD,CAAqB,EAAIE,EAAgCD,EAAM,CAAC,EAAGD,CAAqB,CAC3I,CASA,SAASE,EAAiCH,EAAcC,EAAuB,CAC7E,OAAOD,EACH,YAAY,KAAKA,CAAY,EAC3B,SAASA,CAAY,EACrB,kBAAkB,KAAKA,CAAY,EACjC,SAASA,CAAY,EAAIC,EAAsB,eAAiB,IAChE,kBAAkB,KAAKD,CAAY,EACjC,SAASA,CAAY,EAAIC,EAAsB,cAAgB,IAC/D,mGAAmG,KAAKD,CAAY,EAClHD,GAAgBC,EAAcC,CAAqB,EACnD,SAASD,CAAY,GAAK,EAClC,CACN,CAUA,SAASI,EAA0B3J,EAAO4J,EAAcC,EAAM,CAC5D,KAAM,CAAE,KAAAzK,EAAM,OAAA0K,EAAS,CAAC,EAAK9J,EACvB,CAAE,MAAA2B,EAAO,IAAAC,CAAG,EAAKiI,EACjBE,EAASnI,EAAMD,EACfqI,EAAaF,EAAS,IAE5B,IAAIG,EAAerQ,EAEnB,OAAIwF,IAAS,SACX6K,EAAgBtI,EAAQiI,EACxBhQ,EAAW,KAAK,IAAIgQ,EAAcG,CAAM,GAEjC3K,IAAS,kBAChB6K,EAAgBtI,EAAQiI,EACxBhQ,EAAWmQ,GAEJ3K,IAAS,WAChB6K,EAAgB,KAAK,IAAIrI,EAAMgI,EAAcjI,CAAK,EAElD/H,EAAW,KAAK,IAAIgQ,EAAeG,CAAM,GAElC3K,IAAS,QAChB6K,EAAgB,KAAK,IAAItI,EAAOC,EAAMgI,CAAY,EAClDhQ,EAAW,KAAK,IAAIgQ,EAAcG,CAAM,GAEjC3K,IAAS,iBAChB6K,EAAgBtI,EAChB/H,EAAWmQ,GAEJ3K,IAAS,UAChB6K,EAAgBtI,EAAQiI,EACxBhQ,EAAWmQ,EAASH,GAGdK,EAAgBD,EAAapQ,EAAY,CACnD,CAEA,SAASsQ,GAA+BC,EAAYC,EAAqBC,EAAmBT,EAAcU,EAAc,CACtH,IAAIC,EAAoB,EACxB,MAAMC,EAAmB,CAAC,MAAOJ,EAAqB,IAAKC,CAAiB,EAM5E,OAAAF,EAAW,QAAQ,CAACM,EAAMtR,IAAU,CAClCoR,GAAqBE,EAAK,OAC1B,MAAMC,EAASD,EAAK,OAEpB,GAAIC,EAAQ,CACV,GAAI,QAASA,GACIP,EAAWhR,EAAQ,CAAC,GAAG,QAE1B,CAEV,MAAMwR,IADeL,EAAeG,EAAK,QAAQ,YAAcA,EAAK,QAAQ,eAAiB,GACrDC,EAAO,IAAMd,EAO/CgB,EAAaL,EAAoBI,EAAoBF,EAAK,OAE1DI,EAAgBD,EAAaJ,EAAiB,MAE9CM,EAAmB,CAACD,GAAiBD,GAAcP,EAEzD,IAAIU,EAAc,GACdF,GAAiBC,KACnBC,EAAcN,EAAK,OACnBD,EAAiB,KAAOO,GAGtBF,IACFL,EAAiB,OAASO,EAE9B,CAGF,GAAI,UAAWL,EAAQ,CAErB,MAAME,EAAaL,EAAoBG,EAAO,MAGxCG,EAAgBD,EAAaJ,EAAiB,MAE9CM,EAAmB,CAACD,GAAiBD,GAAcJ,EAAiB,IAE1E,IAAIO,EAAc,EAClB,MAAMC,EAASb,EAAWhR,EAAQ,CAAC,GAAG,QAEtC,GAAI6R,EAAQ,CACV,GAAIH,GAAiBC,EAAkB,CACrC,MAAMG,GAAcX,EAAeU,EAAO,YAAcA,EAAO,eAAiB,EAC1EE,EAAgBT,EAAK,OACrBU,GAAeb,EAAeG,EAAK,QAAQ,YAAcA,EAAK,QAAQ,eAAiB,EAE7FM,EAAcE,GAAcC,EAAgBC,GAC5CZ,GAAqBQ,EACrBP,EAAiB,KAAOO,CAC1B,CAEIF,IACFL,EAAiB,OAASO,EAE9B,CACF,CACF,CACF,CAAC,EAEMP,CACT,CAaA,SAASY,GAA+BC,EAAOxB,EAAMD,EAAcU,EAAcd,EAAuBW,EAAY,CAClH,KAAM,CAAE,MAAAxI,EAAO,IAAAC,EAAK,SAAAhI,CAAQ,EAAKyR,EAEjC,IAAIxJ,EAAcF,EACdG,EAAYF,EACZ0J,EAAaD,EAAM,WACnBE,EAAWF,EAAM,SACjBG,EAEJ,GAAI,OAAO5R,GAAa,SAAU,CAChC0R,EAAa,CAAE,KAAM1R,EAAU,OAAQ,CAAC,EACxC2R,EAAW,CAAE,KAAM3R,EAAU,OAAQ,GAAG,EAExCiI,EAAc8H,EAAyB2B,EAAY1B,EAAcC,CAAI,EACrE/H,EAAY6H,EAAyB4B,EAAU3B,EAAcC,CAAI,EACjE2B,EAAmB1J,EAAYD,EAE/B,MAAM2I,EAAmBN,GAA+BC,EAAYtI,EAAaC,EAAW8H,EAAcU,CAAY,EAEtHzI,EAAc2I,EAAiB,MAC/B1I,EAAY0I,EAAiB,GAC/B,KACK,CACH,GAAIc,GAAc3J,GAAO,KAAM,CAC7B2J,EAAaA,GAAc3J,EAE3B,MAAM8J,EAAW/B,EAAgC4B,EAAW,IAAK9B,CAAqB,EAChFY,EAAsBT,EAAyB,CAAC,GAAG2B,EAAY,OAAQ,CAAC,EAAG1B,EAAcC,CAAI,EAC7FQ,EAAoBV,EAAyB,CAAC,GAAG2B,EAAY,OAAQ,GAAG,EAAG1B,EAAcC,CAAI,EAE7FW,EAAmBN,GAA+BC,EAAYC,EAAqBC,EAAmBT,EAAcU,CAAY,EAEtIzI,EAAc2I,EAAiB,MAASc,EAAW,OAAS,KAAQd,EAAiB,IAAMA,EAAiB,OAASiB,CACvH,CAEA,GAAIF,GAAY3J,GAAK,KAAM,CACzB2J,EAAWA,GAAY3J,EAEvB,MAAM8J,EAAShC,EAAgC6B,EAAS,IAAK/B,CAAqB,EAC5EY,EAAsBT,EAAyB,CAAC,GAAG4B,EAAU,OAAQ,CAAC,EAAG3B,EAAcC,CAAI,EAC3FQ,EAAoBV,EAAyB,CAAC,GAAG4B,EAAU,OAAQ,GAAG,EAAG3B,EAAcC,CAAI,EAE3FW,EAAmBN,GAA+BC,EAAYC,EAAqBC,EAAmBT,EAAcU,CAAY,EAEtIxI,EAAY0I,EAAiB,MAASe,EAAS,OAAS,KAAQf,EAAiB,IAAMA,EAAiB,OAASkB,CACnH,MACS,OAAO9R,GAAa,WAC3BkI,EAAYD,EAAcjI,EAE9B,CAEA,MAAI,CAAC4R,GAAoB,CAAC5R,IACxB4R,EAAmB1J,EAAYD,GAG1B,CAAC,GAAGwJ,EAAO,MAAOxJ,EAAa,IAAKC,EAAW,WAAAwJ,EAAY,SAAAC,EAAU,SAAUC,GAAoB5R,CAAQ,CACpH,CAQA,SAAS+R,GAAaC,EAAO,CAC3B,OAAOA,EAAM,WAAa,QAC5B,CAUA,SAASC,GAAYD,EAAOE,EAAcC,EAAM,CAC9C,OAAOH,EAAM,WAAa,UAAY,CAACE,GAAgBA,IAAiB,OAAO,SAAS,MAAQA,IAAiBC,EACnH,CASA,SAASC,GAAsBJ,EAAOtB,EAAc,CAClD,OAAO,SAASA,EAAesB,EAAM,KAAOA,EAAM,GAAG,CACvD,CASA,SAASK,GAAoBL,EAAOtB,EAAc,CAChD,OAAO,SAASA,EAAesB,EAAM,MAAQA,EAAM,MAAM,CAC3D,CASA,SAASM,GAAczM,EAAS6K,EAAc6B,EAAU,CAElDA,IACF1M,EAAQ,MAAM,SAAW,UAG3B,MAAMyF,GAAUoF,EAAe7K,EAAQ,WAAaA,EAAQ,YAAc,EAE1E,OAAI0M,IAEF1M,EAAQ,MAAM,SAAW,MAGpByF,CACT,CAEA,SAASkH,GAAeR,EAAOtB,EAAc,CAC3C,IAAII,EACJ,MAAM2B,EAAcL,GAAqBJ,EAAOtB,CAAY,EACtDgC,EAAYL,GAAmBL,EAAOtB,CAAY,EAClDiC,EAAiB,CAAC,MAAMF,CAAW,EACnCG,EAAe,CAAC,MAAMF,CAAS,EAErC,OAAIC,GAAkBC,KACpB9B,EAAS,CAAA,EAEL6B,IACF7B,EAAO,MAAQ2B,GAEbG,IACF9B,EAAO,IAAM4B,IAIV5B,CACT,CAYO,SAAS+B,EAA0BC,EAAQX,EAAMnC,EAAcU,EAAcd,EAAuB,CACzG,MAAM/J,EAAUiN,EAAO,CAAC,EAAE,WACpBvC,EAAa,CAAA,EACnB,IAAIwC,GAAQrC,EAAe7K,EAAQ,YAAcA,EAAQ,eAAiB,EACtEmN,EAAqB,EACrB5B,EAASvL,EAEb,KAAOuL,GAAQ,CACb,MAAM6B,EAAY,OAAO,iBAAiB7B,CAAM,EAC1CmB,EAAWR,GAAYkB,CAAS,EAChCnC,EAASyB,EAAWC,GAAcS,EAAWvC,CAAY,EAAI,OAG7DR,EAASoC,GAAalB,EAAQV,EAAc6B,CAAQ,EAW1D,IARI,CAACzB,GAAU,EAAE,QAASA,MACxBkC,GAAsB9C,GAGxBK,EAAW,KAAK,CAAC,QAASa,EAAQ,OAAAlB,EAAQ,OAAAY,CAAM,CAAC,EAEjDM,EAASA,EAAO,aACAa,GAAWgB,EAAW7B,EAAQe,CAAI,EAEhD,MACK,GAAIf,IAAWe,EAAM,CAC1B5B,EAAW,KAAK,CAAC,QAASa,EAAQ,OAAQ,CAAC,CAAC,EAC5C,KACF,CACF,CAEA,OAAAb,EAAW,QAAO,EAEQuC,EAAO,IAAIrB,IAAU,CAC7C,GAAGD,GACDC,EACA,CAAC,MAAOuB,EAAoB,IAAKA,EAAqBD,CAAI,EAC1D/C,EACAU,EACAd,EACAW,CACN,CACA,EAAI,CAGJ,CC3WA,MAAM2C,GAA2B,IAM3BC,GAAW,CACf,WAAY,GACZ,qBAAsB,GACtB,mBAAoB,QACpB,sBAAuB,GACvB,qBAAsB,GACtB,qBAAsB,EACxB,EAiBA,SAASC,GAActT,EAAGiI,EAAOC,EAAKhI,EAAU,CAC9C,IAAI+C,EAAW,EAEf,OAAIjD,GAAKiI,GAASjI,GAAKkI,EACrBjF,EAAW/C,GAAYF,EAAIiI,GAAS/H,EAAW,EAExCF,EAAIkI,IACXjF,EAAW,GAGNA,CACT,CAQA,SAASsQ,GAAiBlB,EAAMzB,EAAc,CAC5C,OAAIyB,IAAS,OACJzB,EACD,OAAO,SAAS,gBAAgB,YAChC,OAAO,SAAS,gBAAgB,aAGjCA,EAAeyB,EAAK,YAAcA,EAAK,YAChD,CAEA,SAASmB,IAA4B,CAEnC,MAAO,CACL,cAAe,OAAO,SAAS,gBAAgB,YAC/C,eAAgB,OAAO,SAAS,gBAAgB,YACpD,CACA,CAaO,SAASC,GAAexF,EAAQ,CACrC,MAAMyF,EAAU3E,GAAUd,EAAQoF,EAAQ,EACpChB,EAAOqB,EAAQ,KACfC,EAAaD,EAAQ,WACrBE,EAAkB,IAAI,QAC5B,IAAI1D,EAAeqD,GAAgBlB,EAAMsB,CAAU,EAE/CE,EACAC,EAAkBC,EAAsBC,EAAuBC,EACnE,MAAMC,EAAkB,CAAA,EAClBpE,EAAwB0D,GAAwB,EAsCtD,GAjCAE,EAAQ,OAAS,OAAO,OAEtBzF,EAAO,OAAO,OAAO,CAACkG,EAAKxC,EAAOlS,IAAU,CAC1C,MAAMN,EAAMwS,EAAM,QAAU,SAASA,EAAM,OAAO,GAAK,OAAOlS,CAAK,EACnE,OAAI0U,EAAIhV,CAAG,EACTgV,EAAIhV,CAAG,EAAE,KAAKwS,CAAK,EAEnBwC,EAAIhV,CAAG,EAAI,CAACwS,CAAK,EAEZwC,CACT,EACA,CAAA,CAAE,CACN,EAAI,QAAQC,IACJA,EAAW,MAAMzC,GAAUA,EAAM,aAAe,OAAOA,EAAM,UAAa,UAAYA,EAAM,OAAO,KAAM,GAC3GyC,EAAarB,EAAyBqB,EAAY/B,EAAMnC,EAAcyD,EAAY7D,CAAqB,GACnG4D,EAAQ,sBAAwBA,EAAQ,uBAC1CQ,EAAgB,KAAKE,CAAU,GAGjCA,EAAW,QAAQzC,GAAS,CACtBA,EAAM,KAAO,OACfA,EAAM,IAAMA,EAAM,MAAQA,EAAM,UAE9BA,EAAM,UAAY,OACpBA,EAAM,SAAWA,EAAM,IAAMA,EAAM,MAEvC,CAAC,EAGIyC,EACR,EACDV,EAAQ,OAAO,QAAQ,CAAC/B,EAAOlS,IAAU,CAACkS,EAAM,MAAQlS,CAAM,CAAC,EAE3DyU,EAAgB,OAAQ,CAC1B,MAAMG,EAAqB,IAAI,IAE3B,OAAO,iBAITN,EAAuB,IAAI,OAAO,eAAe,SAAUlG,EAAS,CAClEA,EAAQ,QAAQC,GAAS,CACvB,MAAMsG,EAAaC,EAAmB,IAAIvG,EAAM,MAAM,EAEhDwG,EAAwBvB,EAAyBqB,EAAY/B,EAAMnC,EAAcyD,EAAY7D,CAAqB,EACxHwE,EAAsB,QAAQ,CAAC3C,EAAO4C,IAAe,CAACb,EAAQ,OAAO/B,EAAM,KAAK,EAAI2C,EAAsBC,CAAU,CAAE,CAAC,EAEvHL,EAAgB,OAAOA,EAAgB,QAAQE,CAAU,EAAG,EAAGE,CAAqB,CACtF,CAAC,CACH,CAAC,EAEDJ,EAAgB,QAAQE,GAAc,CACpCL,EAAqB,QAAQK,EAAW,CAAC,EAAE,WAAY,CAAC,IAAK,YAAY,CAAC,EAC1EC,EAAmB,IAAID,EAAW,CAAC,EAAE,WAAYA,CAAU,CAC7D,CAAC,EAKGV,EAAQ,sBAAwBA,EAAQ,aACZ,IAAI,OAAO,eAAejE,GAAS,IAAM,CACrE,MAAM+E,EAAYN,EAAgB,IAAIE,GAAc,CAClD,MAAMK,EAAgB1B,EAAyBqB,EAAY/B,EAAMnC,EAAcyD,EAAY7D,CAAqB,EAChH,OAAA2E,EAAc,QAAQ,CAAC9C,EAAO4C,IAAe,CAACb,EAAQ,OAAO/B,EAAM,KAAK,EAAI8C,EAAcF,CAAU,CAAE,CAAC,EAEhGE,CACT,CAAC,EAGDP,EAAgB,OAAS,EACzBA,EAAgB,KAAK,GAAGM,CAAS,EACjCN,EAAgB,QAAQE,GAAc,CACpCC,EAAmB,IAAID,EAAW,CAAC,EAAE,WAAYA,CAAU,CAC7D,CAAC,CACH,EAAGhB,EAAwB,CAAC,EAEN,QAAQM,EAAQ,YAAa,CAAC,IAAK,YAAY,CAAC,GAItEA,EAAQ,wBACVM,EAAwBvE,GAAS,UAAY,CAC3CS,EAAeqD,GAAgBlB,EAAMsB,CAAU,EAE/C,MAAMa,EAAYN,EAAgB,IAAIE,GAAc,CAClD,MAAMK,EAAgB1B,EAAyBqB,EAAY/B,EAAMnC,EAAcyD,EAAY7D,CAAqB,EAChH,OAAA2E,EAAc,QAAQ,CAAC9C,EAAO4C,IAAe,CAACb,EAAQ,OAAO/B,EAAM,KAAK,EAAI8C,EAAcF,CAAU,CAAE,CAAC,EAEhGE,CACT,CAAC,EAGDP,EAAgB,OAAS,EACzBA,EAAgB,KAAK,GAAGM,CAAS,EACjCN,EAAgB,QAAQE,GAAc,CACpCC,EAAmB,IAAID,EAAW,CAAC,EAAE,WAAYA,CAAU,CAC7D,CAAC,CACH,EAAGhB,EAAwB,EAEvBf,IAAS,OACX,OAAO,iBAAiB,SAAU2B,CAAqB,EAEhD,OAAO,iBACdC,EAA2B,IAAI,OAAO,eAAeD,CAAqB,EAC1EC,EAAyB,QAAQ5B,EAAM,CAAC,IAAK,YAAY,CAAC,GAGhE,CAKIqB,EAAQ,sBAAwB,OAAO,uBACzCI,EAAmB,IAAI,OAAO,qBAAqB,SAAUY,EAAe,CAC1EA,EAAc,QAAQC,GAAgB,EACnCf,EAAgB,IAAIe,EAAa,MAAM,GAAK,CAAA,GAAI,QAAQhD,GAAS,CAChEA,EAAM,SAAW,CAACgD,EAAa,cACjC,CAAC,CACH,CAAC,CACH,EAAG,CACD,KAAMtC,IAAS,OAAS,OAAO,SAAWA,EAC1C,WAAYqB,EAAQ,mBACpB,UAAW,CACjB,CAAK,EAEDA,EAAQ,OAAO,QAAQ/B,GAAS,CAC9B,GAAIA,EAAM,WAAY,CACpB,IAAIiD,EAAchB,EAAgB,IAAIjC,EAAM,UAAU,EAEjDiD,IACHA,EAAc,CAAA,EACdhB,EAAgB,IAAIjC,EAAM,WAAYiD,CAAW,EAEjDd,EAAiB,QAAQnC,EAAM,UAAU,GAG3CiD,EAAY,KAAKjD,CAAK,CACxB,CACF,CAAC,GAWH,SAASkD,EAAM,CAAC,EAAA7U,EAAG,GAAA8U,CAAE,EAAG,CACtB9U,EAAI,CAACA,EAAE,QAAQ,CAAC,EAEhB,MAAM+U,EAAW,CAACD,EAAG,QAAQ,CAAC,EAG9B,GAAI9U,IAAM6T,EAKV,SAASlC,KAAS+B,EAAQ,OAExB,GAAI,CAAC/B,EAAM,SAAU,CACnB,KAAM,CAAC,MAAA1J,EAAO,IAAAC,EAAK,SAAAhI,CAAQ,EAAIyR,EAEzB1O,EAAWqQ,GAAatT,EAAGiI,EAAOC,EAAKhI,CAAQ,EAGrDyR,EAAM,OAAOA,EAAO1O,EAAU8R,CAAQ,CACxC,CAIFlB,EAAQ7T,EACV,CAKA,SAASgV,GAAW,CAClBtB,EAAQ,OAAO,QAAQ/B,GAASA,EAAM,UAAO,CAAI,EAE7CmC,IACFA,EAAiB,WAAU,EAC3BA,EAAmB,MAGjBC,IACFA,EAAqB,WAAU,EAC/BA,EAAuB,MAGrBC,IACEC,GACFA,EAAyB,WAAU,EACnCA,EAA2B,MAG3B,OAAO,oBAAoB,SAAUD,CAAqB,EAGhE,CAKA,MAAO,CACL,KAAAa,EACA,QAAAG,CACJ,CACA,CC5SA,MAAM3B,GAAW,CACf,iBAAkB,GAClB,mBAAoB,GACpB,kBAAmB,EACnB,eAAgB,GAChB,YAAa,CACf,EAcO,MAAM4B,EAAO,CAClB,YAAahH,EAAS,GAAI,CACxB,KAAK,OAASc,GAAUd,EAAQoF,EAAQ,EAExC,KAAK,SAAW,CACd,EAAG,EACH,MAAO,EACP,GAAI,CACV,EACI,KAAK,gBAAkB,CACrB,EAAG,EACH,MAAO,EACP,GAAI,CACV,EAEI,KAAK,aAAe,EACpB,KAAK,OAAS,KACd,MAAM6B,EAAkB,CAAC,KAAK,OAAO,MAAQ,KAAK,OAAO,OAAS,OAAO,SAAS,KAElF,KAAK,OAAO,KAAOA,EAAiB,OAAS,KAAK,OAAO,KACzD,KAAK,OAAO,YAAc,KAAK,OAAO,cAAgBA,EAAiB,OAAO,SAAS,KAAO,KAAK,OAAO,KAAK,mBAC/G,KAAK,OAAO,cAAgB,KAAK,OAAO,eAAiB,KAAK,cAAc,KAAK,IAAI,EAErF,KAAK,SAAW,KAAK,OAAO,UAAY,IAAM,CAC5C,MAAM7C,EAAO,KAAK,OAAO,KAEzB,KAAK,SAAS,EAAI,KAAK,OAAO,WAC1BA,EAAK,SAAWA,EAAK,YAAc,EACnCA,EAAK,SAAWA,EAAK,WAAa,CACxC,GAEA,KAAK,SAAW9C,GAAc,IAAM,CAClC,KAAK,WAAQ,EACb,KAAK,KAAK,EAAI,CAChB,CAAC,CACH,CAKA,OAAS,CACP,KAAK,YAAW,EAChB,KAAK,WAAU,EACf,KAAK,cAAa,EAClB,KAAK,KAAI,CACX,CAKA,OAAS,CACP,KAAK,YAAW,CAClB,CASA,cAAe4F,EAAiB,GAAI,CAElC,MAAM9C,EAAO,KAAK,OAAO,KACnBxO,EAAIsR,EAAe,GAAKA,EAAe,IAAM,EAAIA,EAAe,EAAI9C,EAAK,SAAWA,EAAK,YAAc,EACvG+C,EAAID,EAAe,GAAKA,EAAe,IAAM,EAAIA,EAAe,EAAI9C,EAAK,SAAWA,EAAK,WAAa,EACtGrS,EAAI,KAAK,OAAO,WAAa6D,EAAIuR,EACvC,KAAK,SAAS,EAAIpV,EAClB,KAAK,SAAS,MAAQA,EACtB,KAAK,SAAS,GAAK,EAEd,KAAK,OAAO,mBACf,KAAK,gBAAgB,EAAIA,EACzB,KAAK,gBAAgB,MAAQA,EAC7B,KAAK,gBAAgB,GAAK,GAGxBmV,GACF,KAAK,OAAO,KAAK,SAAStR,EAAGuR,CAAC,CAElC,CAOA,KAAMC,EAAgB,CACpB,MAAMC,EAAU,KAAK,OAAO,iBAGxBA,GACF,KAAK,KAAI,EAIX,MAAMrS,EAAWqS,EAAU,KAAK,gBAAkB,KAAK,SAEvD,GAAI,KAAK,OAAO,eAAgB,CAC9B,MAAMC,EAAKtS,EAAS,EAAIA,EAAS,MAC3BuS,EAAUD,EAAK,EAAI,GAAK,EAC9BtS,EAAS,GAAK,KAAK,IAAI,KAAK,OAAO,YAAa,KAAK,IAAIsS,CAAE,CAAC,EAAI,KAAK,OAAO,YAAcC,CAC5F,CAGA,KAAK,OAAO,KAAKvS,CAAQ,EAErBqS,GAAYrS,EAAS,IAAM,KAAK,SAAS,IACvCoS,GAAkB,KAAK,cACzB,OAAO,qBAAqB,KAAK,YAAY,EAG/C,KAAK,aAAe,OAAO,sBAAsB,IAAM,KAAK,MAAM,GAGpEpS,EAAS,MAAQA,EAAS,CAC5B,CAKA,MAAQ,CACN,KAAK,gBAAgB,EAAIiM,GAAK,KAAK,gBAAgB,EAAG,KAAK,SAAS,EAAG,EAAE,EAAI,KAAK,OAAO,oBAAoB,QAAQ,CAAC,EAAG,KAAK,OAAO,iBAAiB,CACxJ,CAKA,SAAW,CACT,KAAK,MAAK,EACV,KAAK,aAAY,CACnB,CAKA,YAAc,CACZ,KAAK,YAAW,EAChB,KAAK,OAAO,KAAK,iBAAiB,SAAU,KAAK,QAAQ,CAC3D,CAKA,aAAe,CACb,KAAK,OAAO,KAAK,oBAAoB,SAAU,KAAK,QAAQ,CAC9D,CAKA,aAAe,CACb,KAAK,aAAY,EACjB,KAAK,OAASuE,GAAc,KAAK,MAAM,CACzC,CAKA,cAAgB,CACd,KAAK,QAAU,KAAK,OAAO,QAAO,EAClC,KAAK,OAAS,IAChB,CACF,CCnLA,MAAMgC,OAAuB,QAC7B,IAAIC,GAAmD,KAAO,CAAA,GAE9D,SAASC,GAAsBC,EAAqC,CAClEF,GAAsBE,CACxB,CAEA,SAASC,GACP3Q,EACA3E,EACAwC,EACAyG,EACA,CAAE,cAAAY,GACI,CACN,GAAIA,EACF,OAGF,MAAM0L,EAAgB,CACpB,QAAS,gBACT,QAAS5Q,CAAA,EAGLrC,EAAgB2J,EAAyBzJ,CAAM,EACrD,IAAIgK,EACJ,GAAI,iBAAkB,OAAQ,CAE5B,MAAMhD,EAAiBxC,GAAgBhH,EAAQsC,EAAeiT,CAAa,EAEvE/L,IACFA,EAAe,KAAA,EAEfgD,EAAU,IAAM,CACbhD,EAAkC,MAAM,KAAK,IAAM,CAClDA,EAAe,OAAA,CACjB,CAAC,CACH,EAEJ,KAAO,CACL,MAAM4H,EAAQ5I,GAAcxI,EAAQsC,EAAeiT,CAAa,EAEhE,GAAInE,EAAO,CACT,MAAMqB,EAAS,MAAM,QAAQrB,CAAK,EAAIA,EAAQ,CAACA,CAAK,EAC9CoE,EAAS,IAAId,GAAO,CACxB,WAAY/P,EACZ,OAAA8N,EACA,qBAAsB,GACtB,sBAAuB,GACvB,qBAAsB,GACtB,KAAM,SAAS,KACf,GAAG0C,GAAA,CAAoB,CACxB,EAED3I,EAAU,IAAM,CACdgJ,EAAO,QAAA,CACT,EAEA,QAAQ,IAAK/C,EAA8B,IAAKgD,GAAMA,EAAE,OAAS,QAAQ,QAAA,CAAS,CAAC,EAAE,KACnF,IAAM,CACJD,EAAO,MAAA,CACT,CAAA,CAEJ,CACF,CAEA,GAAI,CAAChJ,EAAS,OAEd,MAAMJ,EAAa,CAAE,OAAAzH,EAAQ,OAAA3E,EAAQ,QAAAwM,CAAA,EAErCN,EAAgBgJ,GAAkBvQ,EAAQyH,CAAU,EACpDF,EAAgBgJ,GAAkBlV,EAAQoM,CAAU,CACtD,CAEA,SAASsJ,GAA0BlQ,EAA4B,CAC7D8G,EAA4B4I,GAAkB1P,CAAO,CACvD,CAEA,MAAAmQ,GAAe,CACb,IAAKL,GACL,OAAQI,GAAA,sBACRN,EACF,EC/EA,SAASQ,GAAOC,EAAKC,EAAKC,EAAO,CAC/B,OAAO,KAAK,IAAI,KAAK,IAAIF,EAAKE,CAAK,EAAGD,CAAG,CAC3C,CAWA,SAAS9G,GAAelL,EAAI,CAC1B,IAAImL,EAAY,GAEhB,OAAO,UAAY,CACjB,GAAI,CAACA,EACH,OAAAA,EAAY,GAEL,OAAO,sBAAsB,IAAM,CACxCA,EAAY,GACZnL,EAAE,CACJ,CAAC,CAEL,CACF,CASA,SAASkS,GAASxQ,EAAS,CACzB,IAAIyQ,EAAKzQ,EACL0Q,EAAO,EACPC,EAAM,EAEV,GAAIF,EAAG,aACL,GACEC,GAAQD,EAAG,WACXE,GAAOF,EAAG,UACVA,EAAKA,EAAG,mBACDA,GAGX,MAAO,CACL,KAAAC,EACA,IAAAC,EACA,MAAO3Q,EAAQ,YACf,OAAQA,EAAQ,YACpB,CACA,CAKA,SAAS4Q,IAA2B,CAClC,MAAMC,EAAM,OAAO,iBACnB,IAAIC,EAAc,GAElB,GAAID,IAAQ,EAEV,MAAO,GAGT,SAAS,KAAK,iBAAiB,cAAgBvT,GAAM,CACnDwT,EAAcxT,EAAE,UAAY,EAC9B,EAAG,CAAE,KAAM,GAAM,EAEjB,MAAMM,EAAQ,IAAI,aAAa,cAAe,CAC5C,QAAS,EACb,CAAG,EAED,gBAAS,KAAK,cAAcA,CAAK,EAE1BkT,CACT,CAEA,SAASC,IAA8B,CACrC,OAAO,IAAI,QAASvO,GAAY,CAC9B,MAAMwO,EAAS,OAAO,QACtB,IAAIF,EAAc,GACdG,EAEJ,SAASC,GAAiB,CACxB,SAAS,KAAK,iBAAiB,cAAgB5T,GAAM,CAC/C2T,IAAa,OACfA,EAAW3T,EAAE,QAGbwT,EAAcxT,EAAE,UAAY2T,CAEhC,EAAG,CAAE,KAAM,GAAM,EAEjB,MAAMrT,EAAQ,IAAI,aAAa,cAAe,CAC5C,QAAS,GACjB,CAAO,EAED,SAAS,KAAK,cAAcA,CAAK,CACnC,CAEA,SAASuT,GAAiB,CACpB,OAAO,UAAYH,IACrB,OAAO,oBAAoB,SAAUG,CAAa,EAClDD,EAAa,EACb1O,EAAQsO,CAAW,EAEvB,CAEAI,EAAa,EAEb,OAAO,iBAAiB,SAAUC,CAAa,EAE3C,OAAO,QAAU,GACnB,OAAO,SAAS,EAAG,EAAE,CAEzB,CAAC,CACH,CAKA,SAASC,GAAsCC,EAAe,CAC5DN,GAA0B,EAAG,KAAMD,GAAgB,CACjDO,EAAc,YAAcP,EAExBA,IACF,OAAO,iBAAiB,SAAUO,EAAc,aAAa,EAC7DA,EAAc,cAAa,EAE/B,CAAC,CACH,CClJA,IAAIC,EAAY,EAChB,MAAMC,EAAW,IAAI,IAErB,SAASC,IAAyB,CAChC,MAAMC,EAAoBnU,GAAK,CAC7B,QAASoU,KAASpU,EAAE,eAClBiU,EAAS,IAAIG,EAAM,UAAU,CAEjC,EACMC,EAAkBrU,GAAK,CAC3B,QAASoU,KAASpU,EAAE,eAClBiU,EAAS,OAAOG,EAAM,UAAU,CAEpC,EAEA,gBAAS,iBAAiB,aAAcD,EAAmB,CAAC,QAAS,EAAI,CAAC,EAC1E,SAAS,iBAAiB,WAAYE,EAAiB,CAAC,QAAS,EAAI,CAAC,EAE/D,UAAY,CACjBJ,EAAS,MAAK,EACd,SAAS,oBAAoB,aAAcE,CAAiB,EAC5D,SAAS,oBAAoB,WAAYE,CAAe,CAC1D,CACF,CAEO,SAASC,GAAsBpX,EAAQmD,EAAU,CACtD,GAAI,gBAAiB,OACnB,OAAAnD,EAAO,iBAAiB,YAAamD,CAAQ,EAEtC,UAAY,CACjBnD,EAAO,oBAAoB,YAAamD,CAAQ,CAClD,EAGF,IAAIkU,EAAU,EACVC,EAECR,IACHQ,EAA0BN,GAAqB,GAGjDF,GAAa,EAEb,SAASS,EAAgBC,EAAK,CAC5B,aAAaH,CAAO,EACpBA,EAAU,WAAW,IAAM,CACrBN,EAAS,KAEX,WAAWQ,EAAgB,GAAG,GAI9BpU,EAASqU,CAAG,EACZH,EAAU,EAEd,EAAG,GAAG,CACR,CAEA,OAAArX,EAAO,iBAAiB,SAAUuX,CAAc,EAEzC,UAAY,CACjBvX,EAAO,oBAAoB,SAAUuX,CAAc,EACnDT,GAAa,EAERA,GACHQ,EAAuB,CAE3B,CACF,CCnDA,SAASG,GAAuBzX,EAAQ8R,EAAM8C,EAAgB,CAG5D,MAAO,CACL,EAAG8C,EAAI,CACL,MAAMC,EAAe3X,EAAO,KAAO4U,EAAe,EAAI5U,EAAO,MAAQ,EAC/D4X,EAAmBD,GAAgB7F,EAAK,MAAQ,EAEhD+F,GAAaD,EAAmBD,EAAe7F,EAAK,MAAQ6F,GAAgB,EAC5EG,EAAKF,EAAmB,EAAID,EAAeE,EAAY,EAE7D,OAAQH,EAAKI,GAAMD,CACrB,EACA,EAAGE,EAAI,CACL,MAAMC,EAAehY,EAAO,IAAM4U,EAAe,EAAI5U,EAAO,OAAS,EAC/DiY,EAAmBD,GAAgBlG,EAAK,OAAS,EAEjDoG,GAAaD,EAAmBD,EAAelG,EAAK,OAASkG,GAAgB,EAC7EG,EAAKF,EAAmB,EAAID,EAAeE,EAAY,EAE7D,OAAQH,EAAKI,GAAMD,CACrB,CACJ,CACA,CAMA,SAASE,GAAmB9D,EAAM+D,EAAc,CAC9C,KAAK,EAAI,OAAO,QAChB,KAAK,EAAI,OAAO,QAEhB,sBAAsB,IAAM/D,GAAQA,EAAK+D,CAAY,CAAC,CACxD,CAOA,SAASC,GAAc5K,EAAQ,CAC7BA,EAAO,KAAK,MAAQ,OAAO,SAAS,gBAAgB,YACpDA,EAAO,KAAK,OAAS,OAAO,SAAS,gBAAgB,YACvD,CAQA,SAAS6K,GAAmB7K,EAAQ,CAClC,MAAMC,EAAW,IAAI,eAAgBL,GAAY,CAC/CA,EAAQ,QAASC,GAAU,CACzBG,EAAO,KAAK,MAAQH,EAAM,cAAc,CAAC,EAAE,WAC3CG,EAAO,KAAK,OAASH,EAAM,cAAc,CAAC,EAAE,SAC9C,CAAC,CACH,CAAC,EAED,OAAAI,EAAS,QAAQD,EAAO,KAAM,CAAE,IAAK,aAAc,EAE5CC,CACT,CASO,SAASuF,GAAexF,EAAQ,CACrC,IAAI8K,EAAsB,GACtBH,EAAe,CAAC,EAAG3K,EAAO,KAAK,MAAQ,EAAG,EAAGA,EAAO,KAAK,OAAS,EAAG,GAAI,EAAG,GAAI,CAAC,EACjF4G,EAAMmE,EAAgBC,EAAqBC,EAAkBC,EAEjE,MAAMhE,EAAiB,CAAC,EAAG,EAAG,EAAG,CAAC,EAKlClH,EAAO,OAAO,QAAS0D,GAAU,CAC3BA,EAAM,QAAUA,EAAM,mBACxBA,EAAM,UAAYqG,GAAsBzB,GAAQ5E,EAAM,MAAM,EAAG1D,EAAO,KAAMkH,CAAc,EAE1F4D,EAAsB,IAGpB9K,EAAO,KACT+K,EAAiBF,GAAkB7K,CAAM,GAGzCgL,EAAsBJ,GAAa,KAAK,KAAM5K,CAAM,EACpD,OAAO,iBAAiB,SAAUgL,CAAmB,EAEzD,CAAC,EAYDpE,EAAO,SAAU5R,EAAU,CACzB,QAAS0O,KAAS1D,EAAO,OACvB,GAAI,CAAC0D,EAAM,SAAU,CAEnB,MAAMyH,EAAczH,EAAM,WAAW,EAAE1O,EAAS,CAAC,GAAKA,EAAS,EAAIgL,EAAO,KAAK,MACzEoL,EAAc1H,EAAM,WAAW,EAAE1O,EAAS,CAAC,GAAKA,EAAS,EAAIgL,EAAO,KAAK,OAEzEpK,EAAI,CAACsS,GAAM,EAAG,EAAGiD,CAAW,EAAE,YAAY,CAAC,EAC3ChE,EAAI,CAACe,GAAM,EAAG,EAAGkD,CAAW,EAAE,YAAY,CAAC,EAE3CtE,EAAW,CAAC,EAAG9R,EAAS,GAAI,EAAGA,EAAS,EAAE,EAE5CgL,EAAO,mBACThL,EAAS,OAAUmW,GAAe,GAAKC,GAAe,GAAKD,GAAe,GAAKC,GAAe,GAIhG1H,EAAM,OAAOA,EAAO,CAAC,EAAA9N,EAAG,EAAAuR,CAAC,EAAGL,EAAU9R,EAAS,MAAM,CACvD,CAGF,OAAO,OAAO2V,EAAc3V,CAAQ,CACtC,EAEI8V,IACFG,EAAmBP,GAAkB,KAAKxD,EAAgBN,EAAM+D,CAAY,EAC5EO,EAA0BxB,GAAqB,SAAUuB,CAAgB,GAM3E,SAASlE,GAAW,CAClB/G,EAAO,OAAO,QAAQ0D,GAASA,EAAM,UAAO,CAAI,EAEhDwH,IAAuB,EAEnBH,GACFA,EAAe,WAAU,EACzBA,EAAiB,OAGjB,OAAO,oBAAoB,SAAUC,CAAmB,EACxDA,EAAsB,MAGxBpE,EAAO,KACP+D,EAAe,IACjB,CAKA,MAAO,CACL,KAAA/D,EACA,QAAAG,CACJ,CACA,CCnLA,MAAMsE,GAAuB,IAAM,GAAK,EACxC,IAAIC,EAEJ,SAASrC,IAAiB,CACxBE,EAAc,EAAI,OAAO,QACzBA,EAAc,EAAI,OAAO,OAC3B,CACA,MAAMA,EAAgB,CAAE,EAAG,EAAG,EAAG,EAAG,cAAAF,GAAe,YAAa,MAAS,EAelE,MAAMsC,EAAQ,CACnB,YAAavL,EAAS,GAAI,CACxB,KAAK,OAAS,CAAE,GAAGA,CAAM,EAEzB,KAAK,OAAS,KACd,KAAK,UAAY,KACjB,KAAK,oBAAsB,KAC3B,KAAK,WAAa,EAElB,IAAI/G,EAEA,KAAK,OAAO,mBACdA,EAAU,KAAK,OAAO,WAClB,IAAM,KAAK,WAAU,EACrBqI,GAAc,IAAM,KAAK,YAAY,EAGzCrI,EAAU,KAAK,OAAO,WAClB,KACA,KAAK,KAAI,EACF,MAEPqI,GAAc,IAAM,CACpB,KAAK,KAAI,CACX,CAAC,EAIL,KAAK,OAAO,KAAO,KAAK,OAAO,KAC3B,CACA,MAAO,KAAK,OAAO,KAAK,YACxB,OAAQ,KAAK,OAAO,KAAK,YACjC,EACQ,CACA,MAAO,OAAO,SAAS,gBAAgB,YACvC,OAAQ,OAAO,SAAS,gBAAgB,YAChD,EAGI,KAAK,SAAW,CACd,EAAG,KAAK,OAAO,KAAK,MAAQ,EAC5B,EAAG,KAAK,OAAO,KAAK,OAAS,EAC7B,GAAI,EACJ,GAAI,CACV,EACI,KAAK,iBAAmB,CAAE,GAAG,KAAK,QAAQ,EAC1C,KAAK,gBAAkB,KAEvB,MAAMkK,EAAY9V,GAAU,CAC1B,MAAM+V,EAAO,KAAK,OAAO,KAAO/V,EAAM,QAAUA,EAAM,EAChDgW,EAAO,KAAK,OAAO,KAAOhW,EAAM,QAAUA,EAAM,EACtD,KAAK,SAAS,GAAK+V,EAAO,KAAK,SAAS,EACxC,KAAK,SAAS,GAAKC,EAAO,KAAK,SAAS,EACxC,KAAK,SAAS,EAAID,EAClB,KAAK,SAAS,EAAIC,EAClB,KAAK,UAAYzS,EAAO,CAC1B,EAcA,GAZA,KAAK,cAAgB,IAAM,CACvB,KAAK,SAAS,OAAS,GACvB,KAAK,SAAS,GAAK,EACnB,KAAK,SAAS,GAAK,EACnB,KAAK,UAAYA,EAAO,CAC5B,EAEA,KAAK,cAAgB,IAAM,CACzB,KAAK,SAAS,OAAS,GACvB,KAAK,UAAYA,EAAO,CAC1B,EAEI,KAAK,OAAO,KAAM,CACpBqS,EAAwB,OAAOA,GAA0B,UAAYA,EAAwB5C,GAAuB,EACpH,MAAMC,EAAM2C,EAAwB,OAAO,iBAAmB,EAE1D,OAAOnC,EAAc,YAAgB,KACvCD,GAAqCC,CAAa,EAGpD,KAAK,SAAY/T,GAAM,CACrB,GAAIA,EAAE,SAAW,KAAK,OAAO,KAAM,CACjC,MAAMM,EAAQ,IAAI,aAAa,cAAe,CAC5C,QAAS,GACT,WAAY,GACZ,QAASN,EAAE,EAAIuT,EAAMQ,EAAc,EACnC,QAAS/T,EAAE,EAAIuT,EAAMQ,EAAc,CAC/C,CAAW,EAED/T,EAAE,gBAAe,EAEjB,KAAK,OAAO,KAAK,cAAcM,CAAK,CACtC,MACE8V,EAASpW,CAAC,CAEd,CACF,MACE,KAAK,SAAWoW,CAEpB,CAKA,OAAS,CACP,KAAK,YAAW,EAChB,KAAK,WAAU,CACjB,CAKA,OAAS,CACP,KAAK,YAAW,CAClB,CAKA,MAAQ,CACN,KAAK,OAAO,KAAK,KAAK,QAAQ,CAChC,CAOA,YAAc,CACZ,MAAMvZ,EAAW,KAAK,OAAO,mBACvBuC,EAAS,KAAK,OAAO,mBAAsBzC,GAAMA,GACjD4Z,EAAM,YAAY,IAAG,EAC3B,IAAIC,EAAgB,GAEpB,MAAMhF,EAAQzU,GAAS,CACrB,MAAMJ,GAAKI,EAAO,KAAK,YAAcF,EAC/BS,EAAI8B,EAAO,KAAK,IAAI,EAAGzC,CAAC,CAAC,EAE3B6Z,IACF,KAAK,SAAS,GAAK,EACnB,KAAK,SAAS,GAAK,EACnBA,EAAgB,IAGlB,KAAK,gBAAkB,OAAO,QAAQ,KAAK,QAAQ,EAAE,OAAO,CAAC1F,EAAK,CAAChV,EAAKmX,CAAK,KACvEnX,IAAQ,SACVgV,EAAIhV,CAAG,EAAImX,EAEXnC,EAAIhV,CAAG,EAAI,KAAK,iBAAiBA,CAAG,GAAKmX,EAAQ,KAAK,iBAAiBnX,CAAG,GAAKwB,EAE1EwT,GACN,KAAK,iBAAmB,EAAE,EAEzBnU,EAAI,IACN,KAAK,oBAAsB,sBAAsB6U,CAAI,EAGrDgF,EAAgBzZ,EAAO,KAAK,WAAakZ,IAG3C,KAAK,OAAO,KAAK,KAAK,eAAe,CACvC,EAEA,OAAI,KAAK,YACP,KAAK,qBAAuB,qBAAqB,KAAK,mBAAmB,EAEzE,OAAO,OAAO,KAAK,iBAAkB,KAAK,eAAe,EAEzD,KAAK,WAAaM,EAElB/E,EAAK+E,CAAG,GAER,KAAK,WAAaA,EAGb,KAAK,mBACd,CAKA,SAAW,CACT,KAAK,MAAK,EACV,KAAK,aAAY,EACjB,KAAK,WAAa,qBAAqB,KAAK,SAAS,EACrD,KAAK,qBAAuB,qBAAqB,KAAK,mBAAmB,CAC3E,CAKA,YAAc,CACZ,KAAK,YAAW,EAChB,MAAM7T,EAAU,KAAK,OAAO,MAAQ,OACpCA,EAAQ,iBAAiB,cAAe,KAAK,SAAU,CAAC,QAAS,EAAI,CAAC,EAElE,KAAK,OAAO,aACd,KAAK,OAAO,YAAY,iBAAiB,cAAe,KAAK,SAAU,CAAC,QAAS,EAAI,CAAC,EAGpF,KAAK,OAAO,mBACdA,EAAQ,iBAAiB,eAAgB,KAAK,cAAe,CAAC,QAAS,EAAI,CAAC,EAC5EA,EAAQ,iBAAiB,eAAgB,KAAK,cAAe,CAAC,QAAS,EAAI,CAAC,EAExE,KAAK,OAAO,cACd,KAAK,OAAO,YAAY,iBAAiB,eAAgB,KAAK,cAAe,CAAC,QAAS,EAAI,CAAC,EAC5F,KAAK,OAAO,YAAY,iBAAiB,eAAgB,KAAK,cAAe,CAAC,QAAS,EAAI,CAAC,GAGlG,CAKA,aAAe,CACb,MAAMA,EAAU,KAAK,OAAO,MAAQ,OACpCA,EAAQ,oBAAoB,cAAe,KAAK,QAAQ,EAEpD,KAAK,OAAO,aACd,KAAK,OAAO,YAAY,oBAAoB,cAAe,KAAK,QAAQ,EAGtE,KAAK,OAAO,mBACdA,EAAQ,oBAAoB,eAAgB,KAAK,aAAa,EAC9DA,EAAQ,oBAAoB,eAAgB,KAAK,aAAa,EAE1D,KAAK,OAAO,cACd,KAAK,OAAO,YAAY,oBAAoB,eAAgB,KAAK,aAAa,EAC9E,KAAK,OAAO,YAAY,oBAAoB,eAAgB,KAAK,aAAa,GAGpF,CAKA,aAAe,CACb,KAAK,aAAY,EACjB,KAAK,OAAS0N,GAAc,KAAK,MAAM,CACzC,CAKA,cAAgB,CACd,KAAK,QAAU,KAAK,OAAO,QAAO,EAClC,KAAK,OAAS,IAChB,CACF,CCtQA,MAAMqG,OAAwB,QAC9B,IAAIC,GAAqD,KAAO,CAAA,GAEhE,SAASpE,GAAsBC,EAAsC,CACnEmE,GAAuBnE,CACzB,CAEA,SAASoE,GACP9U,EACA3E,EACAwC,EACAlD,EAA6B,CAAA,EAC7B,CAAE,cAAAuK,GACF,CACA,GAAIA,EACF,OAGF,MAAM0L,EAAgB,CACpB,QAAS,eACT,QAAS5Q,EACT,KAAMrF,EAAQ,MAAQ,GAAA,EAGlB8R,EAAQ5I,GAAcxI,EAAQiM,EAAyBzJ,CAAM,EAAG+S,CAAa,EAEnF,GAAInE,EAAO,CACT,MAAMqB,EAAS,MAAM,QAAQrB,CAAK,EAAIA,EAAQ,CAACA,CAAK,EAC9CsI,EAAU,IAAIT,GAAQ,CAC1B,KAAM3Z,EAAQ,UAAY,OAASqF,EAAS,OAC5C,OAAA8N,EACA,GAAG+G,GAAA,CAAqB,CACzB,EAKKpN,EAAa,CAAE,OAAAzH,EAAQ,OAAA3E,EAAQ,QAJrB,IAAM,CACpB0Z,EAAQ,QAAA,CACV,CAEqC,EAErCxN,EAAgBqN,GAAmB5U,EAAQyH,CAAU,EACrDF,EAAgBqN,GAAmBvZ,EAAQoM,CAAU,EAErD,QAAQ,IACNqG,EAAO,IAAKgD,GAAOA,EAAgC,OAAS,QAAQ,SAAS,CAAA,EAC7E,KAAK,IAAM,CACXiE,EAAQ,MAAA,CACV,CAAC,CACH,CACF,CAEA,SAASC,GAAyBnU,EAAsB,CACtD8G,EAA4BiN,GAAmB/T,CAAO,CACxD,CAEA,MAAAoU,GAAe,CACb,IAAKH,GACL,OAAQE,GACR,sBAAAvE,EACF,EC1DM7I,OAAiB,QAEvB,SAASsN,GACPlV,EACA3E,EACAwC,EACAyG,EACA,CAAE,cAAAY,EAAe,kBAAAU,GACX,CACN,MAAM/K,EAAYoK,GAChB5J,EACAiM,EAAyBzJ,CAAM,EAC/B,OACAqH,CAAA,EAIF,GAAI,CAACrK,EACH,OAGF,MAAM4N,EAAU,IAAM,CAChB7C,GAAqB,CAACvK,EAAO,QAAQuK,CAAiB,GAC1D/K,EAAU,KAAA,CACZ,EAMM4M,EAAa,CAAE,OAAAzH,EAAQ,OAAA3E,EAAQ,QALrB,IAAM,CACpBR,EAAU,OAAA,EACVmF,EAAO,oBAAoB,eAAgByI,CAAO,CACpD,CAEqC,EACrClB,EAAgBK,GAAY5H,EAAQyH,CAAU,EAC9CF,EAAgBK,GAAYvM,EAAQoM,CAAU,EAE9CzH,EAAO,iBAAiB,eAAgByI,CAAO,CACjD,CAEA,SAAS0M,GAA0BtU,EAA4B,CAC7D8G,EAA4BC,GAAY/G,CAAO,CACjD,CAEA,MAAAuU,GAAe,CACb,IAAKF,GACL,OAAQC,EACV,ECvCO,SAASE,GACdxU,EACAhD,EACAlD,EACAuK,EAAyB,GACzBU,EACA0P,EACiC,CACjC,MAAMza,EAAYoK,GAChBpE,EACAyG,EAAyBzJ,CAAM,EAC/B,OACAqH,CAAA,EAGF,GAAI,CAACrK,EACH,OAAO,KAGT,IAAI0a,EAAc,GAClB,MAAMhX,EAAO5D,EAAQ,MAAQ,YAE7B,OAAQ8D,GAAiB,CACvB,GAAImH,GAAqB,CAAC/E,EAAQ,QAAQ+E,CAAiB,EAAG,OAE9D,MAAM4P,EAAW,CAACF,EACZG,EAAUH,GAAY,OAAO,SAAS7W,EAAM,IAAI,EAChDiX,EAAUJ,GAAY,OAAO,SAAS7W,EAAM,IAAI,EAEtD,GAAIgX,GAAWD,EAAU,CACnBjX,IAAS,aAAeA,IAAS,QAC/BgX,GACFA,EAAc,GACd1a,EAAU,KAAA,GACD0D,IAAS,YAClB1D,EAAU,QAAA,EACD0D,IAAS,UACd1D,EAAU,YAAc,UAC1BA,EAAU,MAAA,EACDA,EAAU,YAAc,YACjCA,EAAU,KAAA,IAIdA,EAAU,SAAS,CAAC,EACpB,OAAOgG,EAAQ,QAAQ,cACnBhG,EAAU,OACZA,EAAU,SAAS,IAAM,CACvB6E,EAAQ,OAAO,IAAM,CACnBmB,EAAQ,QAAQ,cAAgB,MAClC,CAAC,CACH,CAAC,EAEHhG,EAAU,KAAA,GAEZ,MACF,CAEI6a,IACEnX,IAAS,YACX1D,EAAU,QAAA,EACD0D,IAAS,UAClB1D,EAAU,OAAA,EACV6E,EAAQ,OAAO,IAAM,CACnB,OAAOmB,EAAQ,QAAQ,aACzB,CAAC,GACQtC,IAAS,SAAW1D,EAAU,YAAc,WACrDA,EAAU,MAAA,EAGhB,CACF,CAEO,SAAS8a,GACd9U,EACA+U,EACA,CACE,SAAA9T,EACA,cAAA+T,EACA,iBAAAC,CACF,EACAnb,EACAiL,EACA0P,EACwB,CACxB,MAAMS,EAA0B,CAAC,CAACF,EAC5BG,EAASrb,EAAQ,QAAU,SAC3B6a,EAAWQ,IAAW,SAE5B,OAAQvX,GAAiB,CACvB,GAAImH,GAAqB,CAAC/E,EAAQ,QAAQ+E,CAAiB,EAAG,OAE9D,MAAM7F,EAAuCgW,EACxClV,EAAQ,QACP,GAAGgV,CAAa,MAAMC,GAAoB,EAAE,cAAA,EAE9C,OACEG,EAAe,CAACX,EAChBG,EAAUH,GAAY,OAAO,SAAS7W,EAAM,IAAI,EAChDiX,EAAUJ,GAAY,OAAO,SAAS7W,EAAM,IAAI,EAElDwX,EACFL,EAAiB,aAAa9T,EAAUkU,EAAQjW,CAAI,GAEhD0V,GACFG,EAAiB,aAAa9T,EAAU0T,EAAW,MAAQQ,EAAQjW,CAAI,EAErE2V,GAAWF,GACbI,EAAiB,aAAa9T,EAAU,SAAU/B,CAAI,EAG5D,CACF,CC/GA,MAAM6H,OAAiB,QAIvB,SAASsO,GAAoBlW,EAAqByI,EAAsC,CACtF,OAAQtK,GAAa,CACnB,MAAMgY,EAAKhY,EACN6B,EAAO,SAASmW,EAAG,aAA4B,GAClD1N,EAAQ0N,CAAE,CAEd,CACF,CAEA,SAASC,GAAoB3N,EAAsC,CACjE,OAAQtK,GAAa,CACnB,MAAMgY,EAAKhY,EACNgY,EAAoB,aACvB1N,EAAQ0N,CAAE,CAEd,CACF,CAEA,SAASE,GAAsB5N,EAAsC,CACnE,OAAQtK,GAAa,CACnB,MAAMgY,EAAKhY,EACPgY,EAAG,OAAS,SACdA,EAAG,eAAA,EACH1N,EAAQ0N,CAAE,GACDA,EAAG,OAAS,SACrB1N,EAAQ0N,CAAE,CAEd,CACF,CAEA,MAAMG,GAEF,CACF,QAAS,CAACtW,EAAQyI,IAAYyN,GAAoBlW,EAAQyI,CAAO,EACjE,SAAU,CAACzI,EAAQyI,IAAYyN,GAAoBlW,EAAQyI,CAAO,EAClE,MAAO,CAAC8N,EAAS9N,IAAY2N,GAAoB3N,CAAO,EACxD,QAAS,CAAC8N,EAAS9N,IAAY4N,GAAsB5N,CAAO,CAC9D,EAEA,SAAS+N,GACP/X,EACAuB,EACAyI,EACe,CACf,MAAMgO,EAAUH,GAA+B7X,CAAK,EACpD,OAAOgY,EAAUA,EAAQzW,EAAQyI,CAAO,EAAKtK,GAAasK,EAAQtK,CAAC,CACrE,CAQA,SAASuY,GACP3N,EACwC,CACxC,OACE,OAAOA,GAAW,UAAY,CAAC,MAAM,QAAQA,CAAM,IAAM,UAAWA,GAAU,UAAWA,EAE7F,CAEA,SAAS4N,GAAyB5N,EAAgD,CAChF,GAAI,OAAOA,GAAW,SACpB,MAAO,CAAE,OAAQ,CAACA,CAAM,CAAA,EAE1B,GAAI,MAAM,QAAQA,CAAM,EACtB,MAAO,CAAE,OAAQ,CAAC,GAAGA,CAAM,CAAA,EAE7B,GAAI2N,GAAwB3N,CAAM,EAAG,CACnC,MAAM6N,EAAQ7N,EAAO,MAAQ,CAAC,GAAGA,EAAO,KAAK,EAAI,CAAA,EAC3C8N,EAAQ9N,EAAO,MAAQ,CAAC,GAAGA,EAAO,KAAK,EAAI,CAAA,EACjD,MAAO,CAAE,MAAA6N,EAAO,MAAAC,CAAA,CAClB,CACA,MAAO,CAAA,CACT,CAEA,SAASC,GAAiBC,EAA4C,CACpE,MAAO,CAAC,EAAEA,EAAc,OAAO,QAAUA,EAAc,OAAO,OAChE,CAEA,SAASC,GACPD,EAC0C,CAC1C,OAAOD,GAAiBC,CAAa,EACjC,CAAE,MAAOA,EAAc,OAAS,CAAA,EAAI,MAAOA,EAAc,OAAS,CAAA,GAClE,MACN,CAEA,SAASE,GACPjX,EACA3E,EACAwC,EACAlD,EACA,CAAE,cAAAuK,EAAe,iBAAA0Q,EAAkB,kBAAAhQ,GACnC,CACA,MAAMmR,EAAgBJ,GAAyBhc,EAAQ,WAAW,EAC5Duc,EACHrZ,EAA4B,YAAeA,EAA4B,qBAEpEyX,EAAa0B,GAAoBD,CAAa,EAEpD,IAAItO,EACA0O,EAAO,GAuBX,GArBID,EACFzO,EAAUkN,GACRta,EACAua,EACA/X,EACAlD,EACAiL,EACA0P,CAAA,GAGF7M,EAAU4M,GACRha,EACAwC,EACAlD,EACAuK,EACAU,EACA0P,CAAA,EAEF6B,EAAQxc,EAAiC,OAAS,QAGhD,CAAC8N,EACH,OAGF,MAAM2O,EAAkB3O,EAClB4O,EAAa,IAAI,gBAEvB,SAASC,EAAYzW,EAAsBpC,EAAe9D,EAAmC,CAC3F,MAAMwE,EAAKqX,GAAwB/X,EAAOuB,EAAQoX,CAAe,EACjEvW,EAAQ,iBAAiBpC,EAAOU,EAAI,CAAE,GAAGxE,EAAS,OAAQ0c,EAAW,OAAQ,CAC/E,CAMA,MAAM5P,EAAa,CAAE,OAAAzH,EAAQ,OAAA3E,EAAQ,QAJrB,IAAM,CACpBgc,EAAW,MAAA,CACb,CAEqC,EAIrC,GAHA9P,EAAgBK,GAAY5H,EAAQyH,CAAU,EAC9CF,EAAgBK,GAAYvM,EAAQoM,CAAU,EAE1C6N,EAAY,CACd,MAAMsB,EAAQG,EAAc,MACtBQ,EAAcR,EAAc,MAElCH,EAAM,QAASY,GAAc,CACvBA,IAAc,YAChBxX,EAAO,SAAW,GAEpBsX,EAAYtX,EAAQwX,EAAW,CAAE,QAAS,GAAM,KAAAL,EAAM,CACxD,CAAC,GACyBD,EACrBvc,EAAwB,SAAW,SACnCA,EAAiC,OAAS,SAG7C4c,EAAY,QAASC,GAAc,CACjC,GAAIA,IAAc,WAAY,CAC5BF,EAAYtX,EAAQwX,EAAW,CAAE,KAAAL,CAAA,CAAM,EACvC,MACF,CACAG,EAAYtX,EAAQwX,EAAW,CAAE,QAAS,GAAM,CAClD,CAAC,CAEL,MACiBT,EAAc,QAAU,CAAA,GAChC,QAASS,GAAc,CAG5BF,EAAYtX,EAAQwX,EADP,CAAE,KAAAL,EAAM,QADLK,IAAc,SACT,CACc,CACrC,CAAC,CAEL,CAEA,SAASC,GAA0B5W,EAAsB,CACvD8G,EAA4BC,GAAY/G,CAAO,CACjD,CAEA,MAAA6W,EAAe,CACb,IAAKT,GACL,OAAQQ,EACV,EC7MaE,GAAwB,CACnC,MAAO,CAAC,OAAO,EACf,SAAU,CAAC,QAAS,SAAS,EAC7B,MAAO,CAAE,MAAO,CAAC,YAAY,EAAG,MAAO,CAAC,YAAY,CAAA,EACpD,SAAU,CACR,MAAO,CAAC,aAAc,SAAS,EAC/B,MAAO,CAAC,aAAc,UAAU,CAAA,CAEpC,ECOMC,GAAuB,CAC3B,MAAOD,GAAsB,SAC7B,MAAOA,GAAsB,QAC/B,EAEA,SAASE,EAAuBC,EAA+C,CAC7E,MAAM3V,EAASwV,GAAsBG,CAAS,EAC9C,MAAO,CACL9X,EACA3E,EACAwC,EACAlD,EACAod,IACG,CACH,MAAMC,EACJD,GAAiB,mBAAqBD,KAAaF,GAC/CA,GAAqBE,CAA8C,EACnE3V,EACNuV,EAAa,IAAI1X,EAAQ3E,EAAQwC,EAAQ,CAAE,GAAGlD,EAAS,YAAAqd,CAAA,EAAeD,GAAmB,EAAE,CAC7F,CACF,CAEA,MAAAE,EAAe,CACb,UAAWrO,GACX,MAAO,CACL,IAAKiO,EAAuB,OAAO,EACnC,OAAQH,EAAa,MAAA,EAEvB,MAAO,CACL,IAAKG,EAAuB,OAAO,EACnC,OAAQH,EAAa,MAAA,EAEvB,YAAa9N,GACb,aAAcwL,GACd,aAAcpE,GACd,YAAaiE,GACb,SAAU,CACR,IAAK4C,EAAuB,UAAU,EACtC,OAAQH,EAAa,MAAA,EAEvB,SAAU,CACR,IAAKG,EAAuB,UAAU,EACtC,OAAQH,EAAa,MAAA,CAEzB,EC3CA,SAASQ,GAAsBje,EAAa,CAC1C,OAAOA,EAAI,QAAQ,eAAgB,IAAI,CACzC,CAEO,MAAMke,CAAS,CACpB,OAAO,sBACP,UACA,kBACA,oBAQA,sBAGA,YACA,OAAO,mBAA8B,GACrC,OAAO,kBAA6B,GACpC,OAAO,UAAwB,CAAA,EAC/B,OAAO,gBAAkB,IAAI,IAE7B,aAAc,CACZ,KAAK,UAAY,CAAE,QAAS,CAAA,EAAI,WAAY,CAAA,EAAI,aAAc,EAAC,EAC/D,KAAK,kBAAoB,CAAA,EACzB,KAAK,wBAA0B,IAC/B,KAAK,sBAAwB,CAAA,EAC7B,KAAK,gBAAkB,GACzB,CAEA,KAAKpP,EAAwBpO,EAAgD,CAC3E,GAAI,OAAO,OAAW,KAAe,CAAC,OAAO,eAC3C,OAGF,MAAMyd,EAAmBzd,GAAS,kBAAoB,CAAC,CAACwd,EAAS,sBAEjE,KAAK,UAAYE,GAAYtP,EAAQqP,CAAgB,EAErD,MAAME,EAAUH,EAAS,wBAAA,EAErBC,GAAoBE,IAAY,GAElC,SAAS,iBAAiB,kBAAkB,EAAE,QAASzX,GAAY,CAChEA,EAA6B,QAAA,CAChC,CAAC,EAODsX,EAAS,gBAAgB,QAAQ,CAACd,EAAoCpd,IACpEod,EAAW,QAAQpd,CAAG,CAAA,CAG5B,CAEA,SAAgB,CACd,UAAWod,KAAc,KAAK,YAC5BA,EAAW,WAAA,EAMb,SAAW,CAAA,CAAG7Y,CAAQ,IAAK,KAAK,oBAAoB,UAClDA,EAAS,IAAI,oBAAoB,SAAUA,EAAS,OAAO,EAE7D,KAAK,oBAAoB,MAAA,EACzB,KAAK,kBAAoB,CAAA,EACzB,KAAK,sBAAwB,CAAA,EAC7B,KAAK,YAAY,MAAA,EACjB,KAAK,UAAY,CAAE,QAAS,CAAA,EAAI,WAAY,CAAA,EAAI,aAAc,EAAC,EAC/D2Z,EAAS,UAAU,OAAOA,EAAS,UAAU,QAAQ,IAAI,EAAG,CAAC,CAC/D,CAEA,cAAcle,EAAaod,EAAoC,CAC7D,KAAK,YAAY,IAAIA,CAAU,EAE/Bc,EAAS,cAAcle,EAAKod,CAAU,CACxC,CAEA,iBAAiBpd,EAAase,EAA2B,GAAO,CAC9D,MAAMlB,EAAac,EAAS,gBAAgB,IAAIle,CAAG,EAEnD,KAAK,4BAA4BA,CAAG,EACpC,KAAK,+BAA+BA,CAAG,EAEnCod,GAAckB,IAChB,KAAK,YAAY,OAAOlB,CAAU,EAClCc,EAAS,iBAAiBle,CAAG,EAEjC,CAEA,IAAIA,EAAsB,CACxB,MAAO,CAAC,CAAC,KAAK,IAAIA,CAAG,CACvB,CAEA,IAAIA,EAAgE,CAClE,MAAMue,EAAeN,GAAsBje,CAAG,EAC9C,OAAO,KAAK,UAAU,aAAaue,CAAY,CACjD,CAEA,+BAA+Bve,EAAmB,CAChD,SAAW,CAACyG,EAAIlC,CAAQ,IAAK,KAAK,oBAAoB,UAChDA,EAAS,MAAQvE,IACnBuE,EAAS,IAAI,oBAAoB,SAAUA,EAAS,OAAO,EAC3D,KAAK,oBAAoB,OAAOkC,CAAE,EAGxC,CAEA,4BAA4BzG,EAAmB,EACtB,KAAK,IAAIA,CAAG,GAAG,gBAAkB,CAAA,GAEzC,QAASwe,GAAmB,CACzC,MAAMC,EAAgBte,EAAmBqe,EAAgBxe,CAAG,EAC5D,OAAO,KAAK,kBAAkBye,CAAa,CAC7C,CAAC,CACH,CAEA,wBAAwBhY,EAAYiY,EAAqB1e,EAAawO,EAAqB,CACrF,KAAK,oBAAoB,IAAI/H,CAAE,IAInCiY,EAAI,iBAAiB,SAAUlQ,CAAO,EAEtC,KAAK,oBAAoB,IAAI/H,EAAI,CAC/B,IAAAiY,EACA,QAAAlQ,EACA,IAAAxO,CAAA,CACD,EACH,CAEA,OAAO,OAAO8O,EAAwBpO,EAAoD,CACxF,MAAMie,EAAW,IAAIT,EACrB,OAAAA,EAAS,UAAU,KAAKS,CAAQ,EAEhCA,EAAS,KAAK7P,EAAQpO,CAAO,EAEtBie,CACT,CAEA,OAAO,SAAgB,CACrBT,EAAS,gBAAgB,QAASd,GAAuC,CACvEA,EAAW,WAAA,CACb,CAAC,EACDc,EAAS,UAAU,OAAS,EAC5BA,EAAS,gBAAgB,MAAA,CAC3B,CAEA,OAAO,MAAMxd,EAKJ,CACHA,EAAQ,qBACVsd,EAA8B,aAAa,wBACzCtd,EAAQ,mBAAA,EAIRA,EAAQ,sBACVsd,EAA8B,YAAY,wBACxCtd,EAAQ,oBAAA,EAIRA,EAAQ,WACTsd,EAA8B,UAAqC,WAClEtd,EAAQ,SAAA,EAIRA,EAAQ,oBAAsB,SAChCwd,EAAS,kBAAoBxd,EAAQ,kBAEzC,CAEA,OAAO,YAAYV,EAAmC,CACpD,OAAOke,EAAS,UAAU,KAAMS,GAAaA,EAAS,IAAI3e,CAAG,CAAC,CAChE,CAEA,OAAO,cAAcA,EAA6D,CAChF,OAAOA,EAAMke,EAAS,gBAAgB,IAAIle,CAAG,EAAI,MACnD,CAEA,OAAO,cAAcA,EAAaod,EAA0C,CAC1Ec,EAAS,gBAAgB,IAAIle,EAAKod,CAAU,CAC9C,CAEA,OAAO,iBAAiBpd,EAAmB,CACzCke,EAAS,gBAAgB,OAAOle,CAAG,CACrC,CAEA,OAAO,gBAAkBoG,EAC3B,CAEA,IAAIwY,GAAuB,EAEpB,SAASC,EACdC,EACA,CACE,aAAAC,EAAe,GACf,cAAAC,EAAgB,GAChB,cAAAC,EAAgB,EAClB,EAAkF,GAC1E,CACR,GAAIH,EAAE,cAAe,CACnB,MAAMI,EAAa,GAAGF,GAAiBF,EAAE,iBAAmB,MAAMA,EAAE,gBAAgB,GAAK,EAAE,GAE3F,OAAIA,EAAE,SACG,GAAGA,EAAE,aAAa,GAAGI,CAAU,IAAIJ,EAAE,QAAQ,GAG/C,GAAGA,EAAE,aAAa,GAAGI,GAAc,MAAM,EAClD,SAAWJ,EAAE,SACX,OAAOA,EAAE,SAIX,OAAOG,EAAiBF,EAAe,iBAAmB,wBAA2B,EACvF,CAKA,SAASX,GAAYtP,EAAwBqP,EAA4B,GAAsB,CAC7F,MAAMzR,EAAaoC,EAAO,YAAc,CAAA,EAClCqQ,EAA8C,CAAA,EAEpD,OAAArQ,EAAO,cAAc,QAASsQ,GAAiB,CAC7C,MAAMrZ,EAASqZ,EAAa,IACtBC,EAAiB,EAAET,GACnB,CAAE,QAASU,EAAU,GAAGtV,GAASoV,EAEvC,GAAI,CAACrZ,EAAQ,CACX,QAAQ,MAAM,eAAesZ,CAAc,uCAAuC,EAClF,MACF,CAEKF,EAAapZ,CAAM,IACtBoZ,EAAapZ,CAAM,EAAI,CACrB,SAAU,CAAA,EACV,QAAS,CAAA,EACT,mBAAoB,IACpB,cAAe,GAAI,GAOvB,MAAMM,EAAU,MAAM,KAAKiZ,CAAQ,EACnCjZ,EAAQ,QAAA,EACR,MAAMkZ,EAAc,CAAE,GAAGvV,EAAM,QAAA3D,CAAA,EAE/B8Y,EAAapZ,CAAM,EAAE,SAAS,KAAKwZ,CAAW,EAC9CJ,EAAapZ,CAAM,EAAE,UAAU,IAC7B8Y,EAAYU,EAAa,CAAE,cAAepB,EAAkB,CAAA,EAG9D,MAAMvC,EAAgB2D,EAAY,cAElClZ,EAAQ,QAASzC,GAAW,CAO1B,IAAIxC,EAASwC,EAAO,IAEpB,GAAI,CAACxC,GAAWwC,EAAqB,SAAU,CAC7C,MAAM4b,EAAmB1Q,EAAO,QAASlL,EAAqB,QAAQ,EAElE4b,IACFpe,EAASoe,EAAiB,IAE9B,CAEM5b,EAAqB,WACxBA,EAAqB,SAAWyH,GAAA,GAInCjK,EAASA,GAAU2E,EACnBnC,EAAO,IAAMxC,EACb,MAAMyG,EAAYjE,EAAqB,SAEvC,GAAIgY,GAAiBhY,EAAO,gBAEtBxC,IAAW2E,GAAUnC,EAAO,gBAAkBgY,GAChD,OAIJ,MAAM6C,EAAgB,GAAG1Y,CAAM,KAAK3E,CAAM,KAAKyG,CAAQ,KAAKwX,CAAc,GAC1Ezb,EAAO,cAAgB6a,EACvBU,EAAapZ,CAAM,EAAE,eAAe,IAAI0Y,CAAa,EAEjDrd,IAAW2E,IAQVoZ,EAAa/d,CAAM,EASZ+d,EAAa/d,CAAM,EAAE,QAAQqd,CAAa,IACpDU,EAAa/d,CAAM,EAAE,QAAQqd,CAAa,EAAI,CAAA,EAC9CU,EAAa/d,CAAM,EAAE,eAAe,IAAIqd,CAAa,GAVrDU,EAAa/d,CAAM,EAAI,CACrB,SAAU,CAAA,EACV,QAAS,CACP,CAACqd,CAAa,EAAG,CAAA,CAAC,EAEpB,mBAAoB,IACpB,cAAe,GAAI,EAOvBU,EAAa/d,CAAM,EAAE,QAAQqd,CAAa,EAAE,KAAK,CAAE,GAAGzU,EAAM,OAAApG,EAAQ,EACpEub,EAAa/d,CAAM,EAAE,UAAU,IAAIyd,EAAYjb,EAAQ,CAAE,cAAeua,CAAA,CAAkB,CAAC,EAC7F,CAAC,CACH,CAAC,EAEM,CACL,QAASrP,EAAO,SAAW,CAAA,EAC3B,WAAApC,EACA,aAAAyS,CAAA,CAEJ,CCvUA,SAASM,GACP/W,EACAwK,EACA+L,EACoC,CACpC,GAAIvW,EAAK,cAAe,CACtB,MAAMgX,EAAYxM,EAAK,cAAcxK,EAAK,aAAa,EAEvD,OAAKgX,EAMDhX,EAAK,SACA,MAAM,KAAKgX,EAAU,iBAAiBhX,EAAK,QAAQ,CAAC,EAGtD,MAAM,KAAKgX,EAAU,QAAQ,GATlC,QAAQ,KAAK,oDAAoDhX,EAAK,aAAa,GAAG,EAE/E,CAAA,EAQX,CAEA,GAAIA,EAAK,SAAU,CACjB,MAAMiX,EAAWzM,EAAK,iBAAiBxK,EAAK,QAAQ,EAEpD,GAAIiX,EAAS,OAAS,EACpB,OAAO,MAAM,KAAKA,CAAQ,EAE1B,QAAQ,KAAK,6CAA6CjX,EAAK,QAAQ,GAAG,CAE9E,CAEA,OAAOuW,EACF/L,EAAK,kBACLA,CACP,CAEA,SAAS0M,GAAkBlX,EAA4BiX,EAAwC,CAC7F,OAAOA,EACJ,IAAK/Y,GACG8B,EAAK,SAAW9B,EAAQ,cAAc8B,EAAK,QAAQ,EAAI9B,CAC/D,EACA,OAAO,OAAO,CACnB,CAEA,SAASiZ,GACPN,EACA3b,EACAmC,EACA+Z,EACA1e,EACA2e,EACAC,EACAC,EAC0E,CAC1E,MAAO,CACLD,EACIJ,GAAkBL,EAAaS,CAAc,EAC7CP,GAAqBF,EAAaxZ,EAAQ+Z,CAAmB,EACjEG,EACIL,GAAkBhc,EAAQqc,CAAc,EACxCR,GAAqB7b,EAAQxC,EAAQ2e,CAAmB,CAAA,CAEhE,CAEA,SAASG,GACPC,EACAZ,EACA3b,EACAoc,EACAC,EACAtU,EACAsT,EACA,CACA,MAAMmB,EAAgB,MAAM,QAAQJ,CAAc,EAC5CK,EAAgB,MAAM,QAAQJ,CAAc,EAE9CG,EACFJ,EAAe,QAAQ,CAACM,EAAUhgB,IAAU,CAC1C,MAAMigB,EAAWF,EAAgBJ,EAAe3f,CAAK,EAAI2f,EAErDM,GACFC,GACEL,EACAG,EACAf,EAAY,QACZgB,EACA3c,EACA2b,EAAY,OACZ5T,EACAsT,CAAA,CAGN,CAAC,GAEeoB,EAAgBJ,EAAiB,CAACA,CAAc,GACxD,QAASM,GAAa,CAC5BC,GACEL,EACAH,EACAT,EAAY,QACZgB,EACA3c,EACA2b,EAAY,OACZ5T,EACAsT,CAAA,CAEJ,CAAC,CAEL,CAEA,SAASwB,GACPC,EACAC,EACAhC,EACAY,EACAI,EACA,CACA,MAAMiB,EAAiD,CAAA,EAEjDC,EAA2C,CAAA,EAEjDtB,EAAY,QAAQ,QAAS3b,GAAW,CACtC,MAAMiE,EAAYjE,EAAqB,SAEjCF,EAAgB,CACpB,GAAIib,EAAS,UAAU,QAAQ9W,CAAQ,GAAK,CAAA,EAC5C,GAAGjE,EACH,SAAAiE,CAAA,EAEIiZ,EAAapd,EAAc,IAE3B+a,EAAgBte,EAAmByD,EAAO,cAAgB8c,CAAS,EAOzE,GALIE,EAAsBnC,CAAc,GAKpCE,EAAS,kBAAkBF,CAAc,GAAK,CAACkB,EAEjD,OAGF,MAAMjB,EAAMlS,EAAc9I,EAAc,YAAc,CAAA,EAAIib,EAAS,UAAU,UAAU,EAQvF,GANID,GACFC,EAAS,wBAAwBF,EAAeC,EAAKgC,EAAW,IAAM,CACpEC,EAAiB,OAAA,CACnB,CAAC,EAGC,CAACjC,GAAOA,EAAI,QAAS,CACvBkC,EAAsBnC,CAAc,EAAI,GAExC,MAAMrd,EAAS0f,GAAc3gB,EAAmB2gB,EAAYJ,CAAS,EAErE,IAAI/E,EACJ,GAAIva,EAAQ,CAGV,GAFAua,EAAmBuC,EAAS,cAAc9c,CAAM,EAE5C,CAACua,EAEH,OAGEjY,EAAc,eAChBiY,EAAiB,eAAejY,EAAc,aAAa,CAE/D,MAEEiY,EAAmBgF,EAGrB,KAAM,CAACX,EAAgBC,CAAc,EAAIJ,GACvCN,EACA7b,EACAid,EAAiB,QACjBA,EAAiB,cACjBhF,EAAiB,QACjBA,EAAiB,cACjBgE,CAAA,EAGF,GAAI,CAACK,GAAkB,CAACC,EACtB,OAGFtB,EAAS,kBAAkBF,CAAc,EAAI,GAE7C,MAAMze,EAAMoB,GAAUme,EAAY,IAC5B5T,EAAoBmB,EACxBpJ,EAAc,YAAc,CAAA,EAC5Bib,EAAS,UAAU,UAAA,EAGrBkC,EAAoB,KAAK,CACvB7gB,EACAuf,EACA7b,EACAsc,EACAC,EACAtU,EACAgQ,EAAiB,aAAA,CAClB,CACH,CACF,CAAC,EAGDkF,EAAoB,QAAA,EAAU,QAAStB,GAAgB,CACrDW,GAAkB,GAAGX,CAAW,CAClC,CAAC,CACH,CAEA,SAASwB,GACPZ,EACAxE,EACAgD,EACA/C,EACA+D,EACA,CACA,MAAMtZ,EAAUsY,EAAS,IAAIwB,CAAS,GAAG,SAAW,CAAA,EAC9Ca,EAAiB,OAAO,KAAK3a,CAAO,EACpCwa,EAA2C,CAAA,EAEjD,OAAAG,EAAe,QAASxC,GAAmB,CACzC,MAAMC,EAAgBte,EAAmBqe,EAAgB2B,CAAS,EAElE,GAAIxB,EAAS,kBAAkBF,CAAa,GAAK,CAACkB,EAEhD,OAGuBtZ,EAAQmY,CAAc,EAG9B,KAAK,CAAC,CAAE,OAAA5a,EAAQ,GAAG2b,KAAkB,CACpD,MAAM0B,EAAiBzU,EACrB+S,EAAY,YAAc,CAAA,EAC1BZ,EAAU,UAAU,UAAA,EAGtB,GAAIsC,GAAkB,CAACA,EAAe,QAEpC,MAAO,GAGT,MAAMpZ,EAAYjE,EAAqB,SAEjCF,EAAgB,CACpB,GAAIib,EAAU,UAAU,QAAQ9W,CAAQ,GAAK,CAAA,EAC7C,GAAGjE,EACH,SAAAiE,CAAA,EAGF,GAAI+T,GAAiBlY,EAAc,gBAAkBkY,EAEnD,MAAO,GAGT,MAAM8C,EAAMlS,EAAc9I,EAAc,YAAc,CAAA,EAAIib,EAAU,UAAU,UAAU,EASxF,GAPID,GACFC,EAAS,wBAAwBF,EAAeC,EAAKyB,EAAW,IAAM,CAEpExE,EAAiB,OAAA,CACnB,CAAC,EAGC,CAAC+C,GAAOA,EAAI,QAAS,CACvB,MAAMgC,EAAYnB,EAAY,KAAOpf,EAAmBof,EAAY,IAAKY,CAAS,EAC5EQ,EAAmBzC,EAAS,cAAcwC,CAAS,EAEzD,GAAI,CAACC,EAEH,MAAO,GAGLjd,EAAc,eAChBiY,EAAiB,eAAejY,EAAc,aAAa,EAG7D,KAAM,CAACsc,EAAgBC,CAAc,EAAIJ,GACvCN,EACA7b,EACAid,EAAiB,QACjBA,EAAiB,cACjBhF,EAAiB,QACjBA,EAAiB,cACjB,OACAgE,CAAA,EAGF,GAAI,CAACK,GAAkB,CAACC,EAEtB,MAAO,GAGTtB,EAAU,kBAAkBF,CAAa,EAAI,GAE7C,MAAM9S,EAAoBmB,EACxBpJ,EAAc,YAAc,CAAA,EAC5Bib,EAAU,UAAU,UAAA,EAGtB,OAAAkC,EAAoB,KAAK,CACvBV,EACAZ,EACA7b,EACAsc,EACAC,EACAtU,EACAgQ,EAAiB,aAAA,CAClB,EAGM,EACT,CAEA,MAAO,EACT,CAAC,CACH,CAAC,EAGDkF,EAAoB,QAAA,EAAU,QAAStB,GAAgB,CACrDW,GAAkB,GAAGX,CAAW,CAClC,CAAC,EAEMyB,EAAe,OAAS,CACjC,CAKA,SAASR,GACPL,EACApa,EACAgC,EACA3G,EACAwC,EACAlD,EACAiL,EACAsT,EACM,CACN,IAAItD,EAEJ,GACG/X,EAA4B,YAC5BA,EAA4B,qBAC7B,CACA,MAAMsd,EAAkC,CACtC,IAAKf,EACL,SAAWvc,EAAkB,SAC7B,WAAaA,EAA4B,WACzC,WAAaA,EAA4B,qBACzC,cAAeib,EAAYjb,EAAQ,CACjC,aAAc,GACd,cAAe,GACf,cAAAqb,CAAA,CACD,EACD,kBAAAtT,CAAA,EAIF,GADAgQ,EAAmBuC,EAAS,cAAciC,CAAS,EAC/C,CAACxE,EACH,OAGFA,EAAiB,YAAYpQ,GAAoB2V,CAAI,CAAC,CACxD,CAEAlD,EAA8BjW,CAAO,GAAG,IAAIhC,EAAQ3E,EAAQwC,EAAQlD,EAAS,CAC3E,cAAewd,EAAS,mBACxB,iBAAAvC,EACA,kBAAAhQ,EACA,kBAAmBuS,EAAS,iBAAA,CAC7B,CACH,CAKO,SAAS9W,GAAIgW,EAA6C,CAC/D,MAAMpd,EAAMod,EAAW,IACjBuB,EAAWT,EAAS,YAAYle,CAAG,EAEzC,GAAI,CAAC2e,EACH,eAAQ,KAAK,8BAA8B3e,CAAG,EAAE,EAGhDke,EAAS,cAAcle,EAAKod,CAAU,EAC/B,GAGT,KAAM,CAAE,SAAA+D,EAAW,EAAC,EAAMxC,GAAU,IAAI3e,CAAG,GAAK,CAAA,EAC1CohB,EAAcD,EAAS,OAAS,EAEtCxC,EAAS,cAAc3e,EAAKod,CAAU,EAEtC+D,EAAS,QAAQ,CAAC5B,EAAajf,IAAU,CACvC,MAAMoe,EAAMlS,EAAc+S,EAAY,WAAYZ,EAAU,UAAU,UAAU,EAEhF,GAAID,EAAK,CACP,MAAMD,EAAgB,GAAGze,CAAG,cAAcM,CAAK,GAC/Cqe,EAAS,wBAAwBF,EAAeC,EAAK1e,EAAK,IAAM,CAC9Dod,EAAW,OAAA,CACb,CAAC,CACH,EAEI,CAACsB,GAAOA,EAAI,WACVa,EAAY,eACdnC,EAAW,eAAemC,EAAY,aAAa,EAGrDkB,GAAgBzgB,EAAKod,EAAYuB,EAAWY,CAAW,EAE3D,CAAC,EAED,IAAI8B,EAAa,GACjB,OAAI1C,IACF0C,EAAaN,GAAoB/gB,EAAKod,EAAYuB,CAAQ,GAGrDyC,GAAeC,CACxB,CAEO,SAASC,GACdlE,EACAxB,EACA+D,EACA,CACA,MAAM3f,EAAMod,EAAW,IACjBuB,EAAWT,EAAS,YAAYle,CAAG,EAEzC,GAAI2e,EAAU,CACZ,KAAM,CAAE,SAAAwC,EAAW,EAAC,EAAMxC,GAAU,IAAI3e,CAAG,GAAK,CAAA,EAEhDmhB,EAAS,QAAQ,CAAC5B,EAAajf,IAAU,CACvC,GAAIif,EAAY,gBAAkB3D,EAChC,OAGF,MAAM8C,EAAMlS,EAAc+S,EAAY,WAAYZ,EAAU,UAAU,UAAU,EAEhF,GAAID,EAAK,CACP,MAAMD,EAAgB,GAAGze,CAAG,kBAAkB4b,CAAa,KAAKtb,CAAK,GACrEqe,EAAS,wBAAwBF,EAAeC,EAAK1e,EAAK,IAAM,CAE9Dod,EAAW,OAAA,CACb,CAAC,CACH,EAEI,CAACsB,GAAOA,EAAI,UACd+B,GAAgBzgB,EAAKod,EAAYuB,EAAWY,EAAaI,CAAQ,CAErE,CAAC,EAEDoB,GAAoB/gB,EAAKod,EAAYuB,EAAU/C,EAAe+D,CAAQ,CACxE,CACF,CC/dO,SAASta,GAAO+X,EAAoCkB,EAA2B,GAAa,CACjG,MAAMte,EAAMod,EAAW,IACjBuB,EAAWT,EAAS,YAAYle,CAAG,EAEzC,GAAI,CAAC2e,EACH,OAGF,MAAM4C,EAAY,CAAC,GAAI5C,EAAS,IAAI3e,CAAG,GAAG,UAAU,OAAA,GAAY,CAAA,CAAG,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC7F,IAAI2f,EAEA4B,GACF5B,EAAW,CAAC,GAAGvC,EAAW,QAAQ,iBAAiBmE,CAAS,CAAC,EAExDnE,EAAW,eACduC,EAAS,KAAKvC,EAAW,OAAO,GAGlCuC,EAAW,CAACvC,EAAW,OAAO,EAGhCoE,GAAgB7B,CAAyB,EAGzChB,EAAS,iBAAiB3e,EAAKse,CAAe,CAChD,CAEO,SAASkD,GAAgB7B,EAAyB,CACvD,MAAM8B,EAAU,OAAO,OAAOzD,CAA6B,EAE3D,UAAWpX,KAAW+Y,EACpB,UAAW1Z,KAAUwb,EACnBxb,EAAO,OAAOW,CAAO,CAG3B,CCtCO,MAAM8a,GAA4B,iBAElC,MAAMC,EAAsB,CACjC,QACA,IACA,UACA,MACA,cACA,WAEA,YAAY/a,EAAsB5G,EAAcU,EAAuC,CACrF,KAAK,QAAUkG,EACf,KAAK,IAAM5G,EACX,KAAK,UAAY,GACjB,KAAK,MAAQ,KACb,KAAK,eAAiB,QACtB,KAAK,cAAgBU,GAAS,eAAiB,EACjD,CAEA,QAAQV,EAAc,CACpB,GAAI,KAAK,UACP,OAGF,MAAM4hB,EAAS,KAAK,QAAQ,QAAQ,YAIpC,GAFA5hB,EAAMA,GAAO,KAAK,KAAO4hB,EAErB,CAAC5hB,EAAK,CACR,QAAQ,KAAK,2BAA2B,EACxC,MACF,CAEI4hB,IAAW5hB,IACT4hB,GACF,QAAQ,KACN,0CAA0CA,CAAM,kBAAkB5hB,CAAG,wBAAA,EAIzE,KAAK,QAAQ,QAAQ,YAAcA,GAGrC,KAAK,IAAMA,EAEX,KAAK,UAAYoH,GAAI,IAAI,CAC3B,CAEA,WAAW,CAAE,gBAAAkX,EAAkB,EAAA,EAAyC,CAAA,EAAI,CAO1E,IANY,KAAK,KAAO,KAAK,QAAQ,QAAQ,cAG3CjZ,GAAO,KAAMiZ,CAAe,EAG1B,KAAK,MAAO,CACd,MAAMhe,EAAQ,SAAS,mBAAmB,QAAQ,KAAK,KAAK,EAC5D,SAAS,mBAAmB,OAAOA,EAAO,CAAC,CAC7C,CAEA,KAAK,eAAiB,QACtB,KAAK,MAAQ,KACb,KAAK,UAAY,EACnB,CAEA,QAAS,CACP,KAAK,WAAA,EACL,KAAK,QAAA,CACP,CAEA,YAAYuhB,EAAoB,CAC9B,GAAI,CAAC,KAAK,MACR,KAAK,MAAQ,IAAI,cACZ,KAAK,MAAM,YAAYA,EAAS,KAAK;AAAA,CAAI,CAAC,EAE/C,SAAS,mBAAmB,KAAK,KAAK,KAAK,MACtC,CACL,IAAIC,EAAW,KAAK,MAAM,SAAS,OAEnC,UAAWC,KAAWF,EACpB,GAAI,CACF,KAAK,MAAM,WAAWE,EAASD,CAAQ,EACvCA,GACF,OAAS5d,EAAG,CACV,QAAQ,MAAMA,CAAC,CACjB,CAEJ,CACF,CAEA,aACE2D,EACAkU,EACAjW,EACAkc,EACA,CACA,GAAIlc,IAAS,KACX,OAGF,GAAI,CAACkc,GAAa,KAAK,QAA6B,aAAc,CAC/D,KAAK,QAA6B,aAAana,EAAUkU,EAAQjW,CAAI,EACtE,MACF,CAEA,MAAMmc,EAAiB,IAAI,IACzB,KAAK,QAAQ,QAAQP,EAAyB,GAAG,MAAM,GAAG,GAAK,CAAA,CAAC,EAG9D3F,IAAW,SACTkG,EAAe,IAAIpa,CAAQ,EAC7Boa,EAAe,OAAOpa,CAAQ,EAE9Boa,EAAe,IAAIpa,CAAQ,EAEpBkU,IAAW,MACpBkG,EAAe,IAAIpa,CAAQ,EAClBkU,IAAW,SACpBkG,EAAe,OAAOpa,CAAQ,EACrBkU,IAAW,SACpBkG,EAAe,MAAA,GAGhBnc,GAAQ,KAAK,SAAS,QAAQ4b,EAAyB,EACtD,MAAM,KAAKO,CAAc,EAAE,KAAK,GAAG,CACvC,CAEA,kBAA6B,CAE3B,MAAMC,GADM,KAAK,QAAQ,QAAQR,EAAyB,GAAK,IAC3C,KAAA,EACpB,OAAOQ,EAAUA,EAAQ,MAAM,KAAK,EAAI,CAAA,CAC1C,CAEA,eAAetG,EAA6B,CAC1C,MAAMuG,EAAO,KAAK,QAAQ,cAAcvG,CAAa,EAErD,GAAIuG,EAAM,CAER,IAAIpT,EAAW,KAAK,WAAW,IAAIoT,CAAmB,EAEjDpT,IACHA,EAAW,IAAI,iBAAiB,KAAK,wBAAwB,KAAK,KAAM6M,CAAa,CAAC,EAEtF,KAAK,WAAW,IAAIuG,EAAqBpT,CAAQ,EAEjDA,EAAS,QAAQoT,EAAqB,CAAE,UAAW,GAAM,EAE7D,CACF,CAEA,wBAAwBvG,EAAuBlN,EAA2B,CACxE,MAAM1O,EAAM,KAAK,KAAO,KAAK,QAAQ,QAAQ,YACvCoiB,EAAiC,CAAA,EACjCC,EAA+B,CAAA,EAErC3T,EAAQ,QAASC,GAAU,CACzBA,EAAM,aAAa,QAAS0I,GAAO,CAC7BA,aAAc,aAChB+K,EAAgB,KAAK/K,CAAE,CAE3B,CAAC,EAED1I,EAAM,WAAW,QAAS0I,GAAO,CAC3BA,aAAc,aAChBgL,EAAc,KAAKhL,CAAE,CAEzB,CAAC,CACH,CAAC,EAEDmK,GAAgBY,CAAe,EAE3BpiB,GACFshB,GAAa,KAAM1F,EAAeyG,CAAa,CAEnD,CACF,CChLO,SAASjb,GAAIR,EAAsB5G,EAAoB,CACzC,IAAI2hB,GAAsB/a,EAAS5G,CAAG,EAE9C,QAAA,CACb,CAEO,SAASqF,GAAOrF,EAAmB,CACxC,MAAMod,EAAac,EAAS,cAAcle,CAAG,EACxCod,GAILA,EAAW,WAAW,CAAE,gBAAiB,EAAA,CAAM,CACjD,CCZA,MAAMkF,GAAgB,CACpBtiB,EACA4D,EACA2e,EACAtD,IACW,CAGX,IAAI9T,EAAe,uBAFAnL,EAAI,QAAQ,KAAM,GAAG,CAEY,KAEpD,MAAMwiB,EAAkB3D,EAAYjb,EAAQ,CAAE,aAAc,GAAM,cAAAqb,EAAe,EAEjF,OAAIuD,IACFrX,EAAe,GAAGA,CAAY,IAAIqX,CAAe,IAG/CD,IACFpX,EAAeD,EAAuBC,EAAcoX,CAAiB,GAGhEpX,CACT,EAEO,SAASsX,GAASlO,EAAyB0K,EAAyB,GAAe,CACxF,MAAMyD,EAAgB,CAAA,EAChBC,MAAyB,IAE/B,OAAApO,EAAQ,aAAa,QACnB,CAAC,CACC,IAAKqO,EACL,SAAUC,EACV,cAAeC,EACf,iBAAkBC,EAClB,QAAAhb,EACA,OAAAib,EACA,QAAA3c,EACA,WAAY4c,CAAA,IACR,CAEJ,GADoBlb,IAAY,YACf,CACf,MAAMmb,EAAoBF,GACX,CAACE,GAAmB,MAAQA,EAAkB,OAAS,SAGpE7c,EAAQ,QAASzC,GAAW,CAC1B,MAAMuf,EAAavf,GAAQ,UACvB2Q,EAAQ,QAAQ3Q,EAAO,QAAQ,GAAKA,EAElC,CACJ,IAAKwf,EACL,SAAUC,EACV,cAAeC,EACf,iBAAkBC,EAClB,WAAYC,CAAA,EACVL,EAiBJ,GAdI,EADY,CAACC,GAAaA,IAAcR,IAKxC,EADD,CAACS,GAAkB,CAACR,GAAwBQ,IAAmBR,IAM9D,EAFD,CAACS,GAAuB,CAACR,GAC1BQ,IAAwBR,IAMtB,EAFD,CAACS,GAA0B,CAACR,GAC7BQ,IAA2BR,GACF,OAE3B,MAAMU,GAAmBlP,EAAQ,YAAc,CAAA,EACzCmP,GAA0B5W,EAC9B0W,EACAC,EAAA,EAEIE,GAA+B7W,EACnCmW,EACAQ,EAAA,EAKF,GAAI,EAFD,CAACC,IAA2B,CAACC,IAC9BD,KAA4BC,IACF,OAE5B,MAAMC,GAAWtB,GACfM,EACAO,EACAQ,GACA1E,CAAA,EAGG0D,EAAmB,IAAIiB,EAAQ,IAClCjB,EAAmB,IAAIiB,EAAQ,EAC/BlB,EAAI,KAAK;AAAA,gBACPkB,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAOV,EAEJ,CAAC,CAEL,CACF,CAAA,EAGKlB,EAAI,KAAK;AAAA,CAAI,CACtB,CAAA,QAAA,EAAAf,GAAA,QAAA,EAAAzD,EAAA,QAAA,EAAA9W,GAAA,QAAA,EAAAqb,GAAA,QAAA,EAAApd","x_google_ignoreList":[5,14,15,16,17,19,20,21,22]}
|