@canvas-commons/core 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/lib/index.d.ts +4875 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +7667 -0
- package/lib/index.js.map +1 -0
- package/package.json +53 -0
- package/project.d.ts +29 -0
- package/shaders/common.glsl +15 -0
- package/shaders/fragment.glsl +8 -0
- package/tsconfig.project.json +15 -0
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["Handler","experimentalFeatures","DefaultPlugin","includeWithoutPreprocessor","experimentalFeatures","infiniteLoop","reusedGenerator"],"sources":["../src/events/EventDispatcherBase.ts","../src/events/AsyncEventDispatcher.ts","../src/events/EventDispatcher.ts","../src/events/FlagDispatcher.ts","../src/events/ValueDispatcher.ts","../src/meta/MetaField.ts","../src/meta/ObjectMetaField.ts","../src/meta/BoolMetaField.ts","../src/utils/useScene.ts","../src/utils/DetailedError.ts","../src/utils/useThread.ts","../src/utils/beginSlide.ts","../src/utils/capitalize.ts","../src/utils/createRef.ts","../src/utils/createRefArray.ts","../src/utils/createRefMap.ts","../src/utils/debug.ts","../src/utils/deprecate.ts","../src/utils/errorToLog.ts","../src/utils/__logs__/experimental-features.ts","../src/utils/ExperimentalError.ts","../src/plugin/makePlugin.ts","../src/plugin/DefaultPlugin.ts","../src/app/Logger.ts","../src/app/presets.ts","../src/app/ProjectMetadata.ts","../src/app/SettingsMetadata.ts","../src/app/bootstrap.ts","../src/app/ImageExporter.ts","../src/app/PlaybackManager.ts","../src/app/PlaybackStatus.ts","../src/media/AudioData.ts","../src/media/AudioManager.ts","../src/media/AudioManagerPool.ts","../src/media/AudioResourceManager.ts","../src/media/loadImage.ts","../src/scenes/timeEvents/EditableTimeEvents.ts","../src/scenes/timeEvents/ReadOnlyTimeEvents.ts","../src/app/__logs__/include-without-preprocessor.ts","../src/app/SharedWebGLContext.ts","../src/app/Player.ts","../src/app/Stage.ts","../src/app/Presenter.ts","../src/app/Project.ts","../src/app/TimeEstimator.ts","../src/app/Renderer.ts","../src/utils/experimentalLog.ts","../src/utils/getContext.ts","../src/utils/math.ts","../src/utils/proxyUtils.ts","../src/utils/range.ts","../src/utils/Semaphore.ts","../src/utils/useContext.ts","../src/utils/useDuration.ts","../src/utils/usePlayback.ts","../src/decorators/decorate.ts","../src/decorators/lazy.ts","../src/decorators/threadable.ts","../src/threading/cancel.ts","../src/threading/join.ts","../src/threading/names.ts","../src/threading/spawn.ts","../src/flow/all.ts","../src/flow/any.ts","../src/flow/chain.ts","../src/flow/scheduling.ts","../src/flow/delay.ts","../src/flow/every.ts","../src/flow/__logs__/infinite-loop.ts","../src/flow/loop.ts","../src/flow/loopFor.ts","../src/flow/loopUntil.ts","../src/flow/noop.ts","../src/flow/run.ts","../src/flow/sequence.ts","../src/threading/ThreadGenerator.ts","../src/threading/__logs__/reused-generator.ts","../src/threading/Thread.ts","../src/threading/threads.ts","../src/scenes/Scene.ts","../src/scenes/LifecycleEvents.ts","../src/scenes/Random.ts","../src/scenes/SceneState.ts","../src/scenes/Shaders.ts","../src/scenes/Slides.ts","../src/scenes/Sounds.ts","../src/scenes/Variables.ts","../src/scenes/GeneratorScene.ts","../src/scenes/Inspectable.ts","../src/scenes/SceneMetadata.ts","../src/scenes/Threadable.ts","../src/utils/useRandom.ts","../src/utils/useTime.ts","../src/tweening/interpolationFunctions.ts","../src/tweening/spring.ts","../src/tweening/timingFunctions.ts","../src/tweening/tween.ts","../src/signals/DependencyContext.ts","../src/signals/symbols.ts","../src/signals/utils.ts","../src/signals/SignalContext.ts","../src/signals/CompoundSignalContext.ts","../src/signals/ComputedContext.ts","../src/signals/createComputed.ts","../src/signals/createComputedAsync.ts","../src/signals/DeferredEffectContext.ts","../src/signals/createDeferredEffect.ts","../src/signals/EffectContext.ts","../src/signals/createEffect.ts","../src/signals/createSignal.ts","../src/signals/Vector2SignalContext.ts","../src/types/Spacing.ts","../src/types/Type.ts","../src/types/Matrix2D.ts","../src/types/Origin.ts","../src/types/Vector.ts","../src/types/BBox.ts","../src/types/Color.ts","../src/types/Matrix.ts","../src/meta/ColorMetaField.ts","../src/meta/EnumMetaField.ts","../src/meta/ExporterMetaFile.ts","../src/meta/MetaFile.ts","../src/meta/NumberMetaField.ts","../src/meta/RangeMetaField.ts","../src/meta/StringMetaField.ts","../src/meta/Vector2MetaField.ts","../src/transitions/useTransition.ts","../src/transitions/fadeTransition.ts","../src/transitions/slideTransition.ts","../src/transitions/waitTransition.ts","../src/transitions/zoomInTransition.ts","../src/transitions/zoomOutTransition.ts"],"sourcesContent":["export interface EventHandler<T> {\n (value: T): any;\n}\n\n/**\n * A base for dispatching {@link Subscribable}s.\n *\n * @typeParam TValue - The type of the argument passed to subscribers.\n * @typeParam THandler - The type of the callback function.\n */\nexport abstract class EventDispatcherBase<\n TValue,\n THandler extends EventHandler<TValue> = EventHandler<TValue>,\n> {\n public readonly subscribable: Subscribable<TValue, THandler> =\n new Subscribable(this);\n\n private subscribers = new Set<THandler>();\n\n /**\n * {@inheritDoc Subscribable.subscribe}\n */\n public subscribe(handler: THandler) {\n this.subscribers.add(handler);\n return () => this.unsubscribe(handler);\n }\n\n /**\n * {@inheritDoc Subscribable.unsubscribe}\n */\n public unsubscribe(handler: THandler) {\n this.subscribers.delete(handler);\n }\n\n /**\n * Unsubscribe all subscribers from the event.\n */\n public clear() {\n this.subscribers.clear();\n }\n\n protected notifySubscribers(value: TValue): ReturnType<THandler>[] {\n return [...this.subscribers].map(handler => handler(value));\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link EventDispatcherBase}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n *\n * @typeParam TValue - The type of the argument passed to subscribers.\n * @typeParam THandler - The type of the callback function.\n */\nexport class Subscribable<\n TValue,\n THandler extends EventHandler<TValue> = EventHandler<TValue>,\n> {\n public constructor(\n protected dispatcher: EventDispatcherBase<TValue, THandler>,\n ) {}\n\n /**\n * Subscribe to the event.\n *\n * @param handler - The handler to invoke when the event occurs.\n *\n * @returns A callback function that cancels the subscription.\n */\n public subscribe(handler: THandler) {\n return this.dispatcher.subscribe(handler);\n }\n\n /**\n * Unsubscribe from the event.\n *\n * @param handler - The handler to unsubscribe.\n */\n public unsubscribe(handler: THandler) {\n this.dispatcher.unsubscribe(handler);\n }\n}\n","import {EventDispatcherBase, Subscribable} from './EventDispatcherBase';\n\nexport interface AsyncEventHandler<T> {\n (value: T): Promise<void>;\n}\n\n/**\n * Dispatches an asynchronous {@link SubscribableEvent}.\n *\n * @remarks\n * The {@link dispatch} method returns a promise that resolves when all the\n * handlers resolve.\n *\n * @example\n * ```ts\n * class Example {\n * // expose the event to external classes\n * public get onValueChanged {\n * return this.value.subscribable;\n * }\n * // create a private dispatcher\n * private value = new AsyncEventDispatcher<number>();\n *\n * private async dispatchExample() {\n * // dispatching returns a Promise.\n * await this.value.dispatch(0);\n * }\n * }\n * ```\n *\n * @typeParam T - The type of the argument passed to subscribers.\n */\nexport class AsyncEventDispatcher<T> extends EventDispatcherBase<\n T,\n AsyncEventHandler<T>\n> {\n public async dispatch(value: T): Promise<void> {\n await Promise.all(this.notifySubscribers(value));\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link AsyncEventDispatcher}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n *\n * @typeParam T - The type of the argument passed to subscribers.\n */\nexport type SubscribableAsyncEvent<T> = Subscribable<T, AsyncEventHandler<T>>;\n","import {EventDispatcherBase, Subscribable} from './EventDispatcherBase';\n\n/**\n * Dispatches a {@link SubscribableEvent}.\n *\n * @example\n * ```ts\n * class Example {\n * // expose the event to external classes\n * public get onValueChanged {\n * return this.value.subscribable;\n * }\n * // create a private dispatcher\n * private value = new EventDispatcher<number>();\n *\n * private dispatchExample() {\n * // dispatching will notify all subscribers.\n * this.value.dispatch(0);\n * }\n * }\n * ```\n *\n * @typeParam T - The type of the value argument to subscribers.\n */\nexport class EventDispatcher<T> extends EventDispatcherBase<T> {\n public dispatch(value: T) {\n this.notifySubscribers(value);\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link EventDispatcher}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n *\n * @typeParam T - The type of the argument passed to subscribers.\n */\nexport type SubscribableEvent<T> = Subscribable<T>;\n","import {\n EventDispatcherBase,\n EventHandler,\n Subscribable,\n} from './EventDispatcherBase';\n\n/**\n * Dispatches a {@link SubscribableFlagEvent}.\n *\n * @remarks\n * Subscribers are notified only when the flag is set.\n * Subsequent calls to {@link raise} don't trigger anything.\n * Any handlers added while the flag is raised are immediately invoked.\n *\n * Resetting the flag doesn't notify the subscribers, but raising it again does.\n *\n * @example\n * ```ts\n * class Example {\n * // expose the event to external classes\n * public get onChanged {\n * return this.flag.subscribable;\n * }\n * // create a private dispatcher\n * private flag = new FlagDispatcher();\n *\n * private dispatchExample() {\n * // setting the flag will notify all subscribers\n * this.flag.raise();\n * }\n * }\n * ```\n */\nexport class FlagDispatcher extends EventDispatcherBase<void> {\n private value = false;\n\n /**\n * Notify all current and future subscribers.\n */\n public raise() {\n if (!this.value) {\n this.value = true;\n this.notifySubscribers();\n }\n }\n\n /**\n * Stop notifying future subscribers.\n */\n public reset() {\n this.value = false;\n }\n\n /**\n * Are subscribers being notified?\n */\n public isRaised() {\n return this.value;\n }\n\n public subscribe(handler: EventHandler<void>) {\n const unsubscribe = super.subscribe(handler);\n if (this.value) {\n handler();\n }\n return unsubscribe;\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link FlagDispatcher}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n */\nexport type SubscribableFlagEvent = Subscribable<void>;\n","import {\n EventDispatcherBase,\n EventHandler,\n Subscribable,\n} from './EventDispatcherBase';\n\n/**\n * Dispatches a {@link SubscribableValueEvent}\n *\n * @remarks\n * Changing the value stored by a value dispatcher will immediately notify all\n * its subscribers.\n *\n * @example\n * ```ts\n * class Example {\n * // expose the event to external classes\n * public get onValueChanged {\n * return this.value.subscribable;\n * }\n * // create a private dispatcher\n * private value = new ValueDispatcher(0);\n *\n * private changingValueExample() {\n * // changing the value will notify all subscribers.\n * this.value.current = 7;\n * }\n * }\n * ```\n *\n * @typeParam T - The type of the value passed to subscribers.\n */\nexport class ValueDispatcher<T> extends EventDispatcherBase<T> {\n public readonly subscribable: SubscribableValueEvent<T> =\n new SubscribableValueEvent(this);\n\n /**\n * {@inheritDoc SubscribableValueEvent.current}\n */\n public get current() {\n return this.value;\n }\n\n /**\n * Set the current value of this dispatcher.\n *\n * @remarks\n * Setting the value will immediately notify all subscribers.\n *\n * @param value - The new value.\n */\n public set current(value: T) {\n this.value = value;\n this.notifySubscribers(value);\n }\n\n /**\n * @param value - The initial value.\n */\n public constructor(private value: T) {\n super();\n }\n\n /**\n * {@inheritDoc SubscribableValueEvent.subscribe}\n */\n public subscribe(handler: EventHandler<T>, dispatchImmediately = true) {\n const unsubscribe = super.subscribe(handler);\n if (dispatchImmediately) {\n handler(this.value);\n }\n return unsubscribe;\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link ValueDispatcher}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n *\n * @typeParam T - The type of the value passed to subscribers.\n */\nexport class SubscribableValueEvent<T> extends Subscribable<\n T,\n EventHandler<T>\n> {\n /**\n * Get the most recent value of this dispatcher.\n */\n public get current() {\n return (<ValueDispatcher<T>>this.dispatcher).current;\n }\n\n /**\n * Subscribe to the event.\n *\n * Subscribing will immediately invoke the handler with the most recent value.\n *\n * @param handler - The handler to invoke when the event occurs.\n * @param dispatchImmediately - Whether the handler should be immediately\n * invoked with the most recent value.\n *\n * @returns Callback function that cancels the subscription.\n */\n public subscribe(\n handler: EventHandler<T>,\n dispatchImmediately = true,\n ): () => void {\n return (<ValueDispatcher<T>>this.dispatcher).subscribe(\n handler,\n dispatchImmediately,\n );\n }\n}\n","import {ValueDispatcher} from '../events';\n\n/**\n * Represents an entry in the meta file.\n *\n * @typeParam TSerializedValue - The type used to store this field in the meta\n * file.\n * @typeParam TValue - The runtime type of this field.\n */\nexport class MetaField<\n TSerializedValue,\n TValue extends TSerializedValue = TSerializedValue,\n> {\n /**\n * The type of this field used by the editor to display the correct input.\n */\n public readonly type: any = undefined;\n public spacing = false;\n public description = '';\n\n /**\n * Triggered when the data of this field changes.\n *\n * @eventProperty\n */\n public get onChanged() {\n return this.value.subscribable;\n }\n\n protected readonly value: ValueDispatcher<TValue>;\n\n /**\n * Triggered when the field becomes disabled or enabled.\n *\n * @eventProperty\n */\n public get onDisabled() {\n return this.disabled.subscribable;\n }\n\n protected readonly disabled = new ValueDispatcher(false);\n\n /**\n * @param name - The name of this field displayed in the editor.\n * @param initial - The initial value of this field.\n */\n public constructor(\n public readonly name: string,\n public readonly initial: TValue,\n ) {\n this.value = new ValueDispatcher(initial);\n }\n\n /**\n * Get the current value.\n */\n public get(): TValue {\n return this.value.current;\n }\n\n /**\n * Set the current value.\n *\n * @param value - The new value.\n */\n public set(value: TSerializedValue) {\n this.value.current = this.parse(value);\n }\n\n /**\n * Convert a serialized value into a runtime type.\n *\n * @param value - The serialized value.\n */\n public parse(value: TSerializedValue): TValue {\n return value as TValue;\n }\n\n /**\n * Serialize the value of this field.\n */\n public serialize(): TSerializedValue {\n return this.value.current;\n }\n\n /**\n * Create a clone of this field.\n */\n public clone(): this {\n return new (<any>this.constructor)(this.name, this.get());\n }\n\n /**\n * Disable or enable the field in the editor.\n *\n * @param value - Whether the field should be disabled.\n */\n public disable(value = true): this {\n this.disabled.current = value;\n return this;\n }\n\n /**\n * Add or remove spacing at the beginning of this field.\n *\n * @param value - Whether to include the spacing.\n */\n public space(value = true): this {\n this.spacing = value;\n return this;\n }\n\n /**\n * Set the description of this field.\n *\n * @param description - The description.\n */\n public describe(description: string): this {\n this.description = description;\n return this;\n }\n}\n","import {ValueDispatcher} from '../events';\nimport {MetaField} from './MetaField';\n\nexport type ValueOf<T extends Record<string, any>> = {\n [K in keyof T]: T[K] extends MetaField<any, infer P> ? P : never;\n};\n\ntype TransformationOf<\n TObject extends Record<string, any>,\n TKey extends CallableKeys<MetaField<any>>,\n> = {\n [K in keyof TObject]: TObject[K] extends MetaField<infer A, infer B>\n ? ReturnType<MetaField<A, B>[TKey]>\n : never;\n};\n\ntype CallableKeys<T> = {\n [K in keyof T]: T[K] extends () => void ? K : never;\n}[keyof T];\n\nclass ObjectMetaFieldInternal<\n T extends Record<string, MetaField<any>>,\n> extends MetaField<ValueOf<T>> {\n public readonly type = Object;\n\n /**\n * Triggered when the nested fields change.\n *\n * @eventProperty\n */\n public get onFieldsChanged() {\n return this.event.subscribable;\n }\n\n protected ignoreChange = false;\n protected customFields: Record<string, unknown> = {};\n protected readonly fields: Map<string, MetaField<unknown>>;\n protected readonly event: ValueDispatcher<MetaField<unknown>[]>;\n\n public constructor(name: string, fields: T) {\n const map = new Map(Object.entries(fields));\n super(\n name,\n Object.fromEntries(\n Array.from(map, ([name, field]) => [name, field.get()]),\n ) as ValueOf<T>,\n );\n\n this.event = new ValueDispatcher([...map.values()]);\n this.fields = map;\n for (const [key, field] of this.fields) {\n Object.defineProperty(this, key, {value: field});\n field.onChanged.subscribe(this.handleChange);\n }\n }\n\n public override set(value: Partial<ValueOf<T>>) {\n this.ignoreChange = true;\n for (const [key, fieldValue] of Object.entries(value)) {\n const field = this.fields.get(key);\n if (field) {\n field.set(fieldValue);\n } else {\n this.customFields[key] = fieldValue;\n }\n }\n this.ignoreChange = false;\n this.handleChange();\n }\n\n public override serialize(): ValueOf<T> {\n return {\n ...this.transform('serialize'),\n ...this.customFields,\n };\n }\n\n public override clone(): this {\n const cloned = new (<any>this.constructor)(\n this.name,\n this.transform('clone'),\n );\n cloned.set(structuredClone(this.customFields));\n\n return cloned;\n }\n\n protected handleChange = () => {\n if (this.ignoreChange) return;\n this.value.current = {\n ...this.transform('get'),\n ...this.customFields,\n };\n };\n\n protected transform<TKey extends CallableKeys<MetaField<any>>>(\n fn: TKey,\n ): TransformationOf<T, TKey> {\n const transformed = Object.fromEntries(\n Array.from(this.fields, ([name, field]) => [name, field[fn]()]),\n ) as TransformationOf<T, TKey>;\n\n return transformed;\n }\n}\n\n/**\n * Represents an object with nested meta-fields.\n */\nexport type ObjectMetaField<T extends Record<string, MetaField<any>>> =\n ObjectMetaFieldInternal<T> & T;\n\n/**\n * Represents an object with nested meta-fields.\n */\nexport const ObjectMetaField = ObjectMetaFieldInternal as {\n new <T extends Record<string, MetaField<any>>>(\n name: string,\n data: T,\n ): ObjectMetaField<T>;\n};\n","import {MetaField} from './MetaField';\n\n/**\n * Represents a boolean value stored in a meta file.\n */\nexport class BoolMetaField extends MetaField<any, boolean> {\n public readonly type = Boolean;\n\n public parse(value: any): boolean {\n return !!value;\n }\n}\n","import type {Scene} from '../scenes';\n\nconst SceneStack: Scene[] = [];\n\n/**\n * Get a reference to the current scene.\n */\nexport function useScene(): Scene {\n const scene = SceneStack.at(-1);\n if (!scene) {\n throw new Error('The scene is not available in the current context.');\n }\n return scene;\n}\n\nexport function startScene(scene: Scene) {\n SceneStack.push(scene);\n}\n\nexport function endScene(scene: Scene) {\n if (SceneStack.pop() !== scene) {\n throw new Error('startScene/endScene were called out of order.');\n }\n}\n\nexport function useLogger() {\n return SceneStack.at(-1)?.logger ?? console;\n}\n\n/**\n * Mark the current scene as ready to transition out.\n *\n * @remarks\n * Usually used together with transitions. When a scene is marked as finished,\n * the transition will start but the scene generator will continue running.\n */\nexport function finishScene() {\n useScene().enterCanTransitionOut();\n}\n","import type {LogPayload} from '../app';\n\ntype DetailedErrorProps = Pick<\n LogPayload,\n 'message' | 'remarks' | 'object' | 'durationMs' | 'inspect'\n>;\n\nexport class DetailedError extends Error {\n /**\n * {@inheritDoc app.LogPayload.message}\n */\n public readonly remarks?: string;\n /**\n * {@inheritDoc app.LogPayload.object}\n */\n public readonly object?: any;\n /**\n * {@inheritDoc app.LogPayload.durationMs}\n */\n public readonly durationMs?: number;\n /**\n * {@inheritDoc app.LogPayload.inspect}\n */\n public readonly inspect?: string;\n\n public constructor(message: string, remarks?: string);\n public constructor(props: DetailedErrorProps);\n public constructor(props: string | DetailedErrorProps, remarks?: string) {\n if (typeof props === 'string') {\n super(props);\n this.remarks = remarks;\n } else {\n super(props.message);\n this.remarks = props.remarks;\n this.object = props.object;\n this.durationMs = props.durationMs;\n this.inspect = props.inspect;\n }\n }\n}\n","import type {Thread} from '../threading';\nimport {DetailedError} from './DetailedError';\n\nconst ThreadStack: Thread[] = [];\n\n/**\n * Get a reference to the current thread.\n */\nexport function useThread(): Thread {\n const thread = ThreadStack.at(-1);\n if (!thread) {\n throw new DetailedError(\n 'The thread is not available in the current context.',\n `\\`useThread()\\` can only be called from within generator functions.\n It's not available during rendering.`,\n );\n }\n return thread;\n}\n\nexport function startThread(thread: Thread) {\n ThreadStack.push(thread);\n}\n\nexport function endThread(thread: Thread) {\n if (ThreadStack.pop() !== thread) {\n throw new Error('startThread/endThread was called out of order.');\n }\n}\n","import type {ThreadGenerator} from '../threading';\nimport {useScene} from './useScene';\nimport {useThread} from './useThread';\n\nexport function* beginSlide(name: string): ThreadGenerator {\n const {slides} = useScene();\n const thread = useThread();\n slides.register(name, thread.fixed);\n yield;\n\n while (slides.shouldWait(name)) {\n yield;\n }\n}\n","export function capitalize<T extends string>(value: T): Capitalize<T> {\n return <Capitalize<T>>(value[0].toUpperCase() + value.slice(1));\n}\n","export interface ReferenceReceiver<T> {\n (reference: T): void;\n}\n\nexport interface Reference<T> extends ReferenceReceiver<T> {\n (): T;\n}\n\nexport function createRef<T>(): Reference<T> {\n let value: T;\n const ref = (newValue?: T) => {\n if (newValue !== undefined) {\n value = newValue;\n } else {\n return value;\n }\n };\n\n return ref as Reference<T>;\n}\n\nexport function makeRef<TObject, TKey extends keyof TObject>(\n object: TObject,\n key: TKey,\n): ReferenceReceiver<TObject[TKey]> {\n return newValue => {\n object[key] = newValue;\n };\n}\n\nexport type RefsProperty<TValue> = TValue extends (config: {\n refs?: infer TReference;\n}) => void\n ? TReference\n : never;\n\nexport function makeRefs<\n T extends (config: {refs?: any}) => void,\n>(): RefsProperty<T> {\n return {} as RefsProperty<T>;\n}\n","import {Reference} from './createRef';\n\ntype ProxyTarget<T> = {\n (): void;\n array: T[];\n};\n\nexport type ReferenceArray<T> = T[] & Reference<T>;\n\n/**\n * Create an array of references.\n *\n * @remarks\n * The returned object is both an array and a reference that can be passed\n * directly to the `ref` property of a node.\n *\n * @example\n * ```tsx\n * const labels = createRefArray<Txt>();\n *\n * view.add(['A', 'B'].map(text => <Txt ref={labels}>{text}</Txt>));\n * view.add(<Txt ref={labels}>C</Txt>);\n *\n * // accessing the references individually:\n * yield* labels[0].text('A changes', 0.3);\n * yield* labels[1].text('B changes', 0.3);\n * yield* labels[2].text('C changes', 0.3);\n *\n * // accessing all references at once:\n * yield* all(...labels.map(label => label.fill('white', 0.3)));\n * ```\n */\nexport function createRefArray<T>(): ReferenceArray<T> {\n const target = function () {\n // do nothing\n } as ProxyTarget<T>;\n target.array = [];\n return new Proxy(target, Handler) as unknown as ReferenceArray<T>;\n}\n\nconst Handler: ProxyHandler<ProxyTarget<any>> = {\n apply(target, _, argArray) {\n if (argArray.length === 0) {\n return target.array[0];\n }\n\n target.array.push(...argArray);\n },\n\n get(target, property, receiver) {\n const value = Reflect.get(target.array, property, receiver);\n if (typeof value === 'function') {\n return value.bind(target.array);\n }\n\n return value;\n },\n\n set(target, property, value, receiver) {\n return Reflect.set(target.array, property, value, receiver);\n },\n};\n","import {createRef, Reference} from './createRef';\n\nexport type ReferenceMap<T> = Map<string, Reference<T>> &\n Record<string, Reference<T>> & {\n /**\n * Maps the references in this group to a new array.\n *\n * @param callback - The function to transform each reference.\n *\n * @returns An array of the transformed references.\n */\n mapRefs<TValue>(callback: (value: T, index: number) => TValue): TValue[];\n };\n\n/**\n * Create a group of references.\n *\n * @remarks\n * The returned object lets you easily create multiple references to the same\n * type without initializing them individually.\n *\n * You can retrieve references by accessing the object's properties. If the\n * reference for a given property does not exist, it will be created\n * automatically.\n *\n * @example\n * ```tsx\n * const labels = createRefMap<Txt>();\n *\n * view.add(\n * <>\n * <Txt ref={labels.a}>A</Txt>\n * <Txt ref={labels.b}>B</Txt>\n * <Txt ref={labels.c}>C</Txt>\n * </>,\n * );\n *\n * // accessing the references individually:\n * yield* labels.a().text('A changes', 0.3);\n * yield* labels.b().text('B changes', 0.3);\n * yield* labels.c().text('C changes', 0.3);\n *\n * // checking if the given reference exists:\n * if ('d' in labels) {\n * yield* labels.d().text('D changes', 0.3);\n * }\n *\n * // accessing all references at once:\n * yield* all(...labels.mapRefs(label => label.fill('white', 0.3)));\n * ```\n */\nexport function createRefMap<T>(): ReferenceMap<T> {\n const group = new Map<string, Reference<T>>();\n group.entries();\n return new Proxy(group, Handler) as ReferenceMap<T>;\n}\n\nconst Handler: ProxyHandler<Map<string, Reference<any>>> = {\n get(target, property) {\n if (Reflect.has(target, property)) {\n return Reflect.get(target, property);\n }\n\n if (property === 'mapRefs') {\n return function <TValue>(\n callback: (value: any, index: number) => TValue,\n ): TValue[] {\n const result: TValue[] = [];\n for (const value of target.values()) {\n result.push(callback(value(), result.length));\n }\n return result;\n };\n }\n\n if (typeof property === 'string') {\n let value = target.get(property);\n if (!value) {\n value = createRef();\n target.set(property, value);\n }\n return value;\n }\n },\n\n has(target, property) {\n if (Reflect.has(target, property)) {\n return true;\n }\n\n if (typeof property === 'string') {\n return target.has(property);\n }\n\n return false;\n },\n};\n","import {LogPayload} from '../app';\nimport {useLogger} from './useScene';\n\nfunction stringify(value: any): string {\n switch (typeof value) {\n case 'string':\n // Prevent strings from getting quoted again\n return value;\n case 'undefined':\n // Prevent `undefined` from being turned into `null`\n return 'undefined';\n default:\n // Prevent `NaN` from being turned into `null`\n if (Number.isNaN(value)) {\n return 'NaN';\n }\n return JSON.stringify(value);\n }\n}\n\n/**\n * Logs a debug message with an arbitrary payload.\n *\n * @remarks\n * This method is a shortcut for calling `useLogger().debug()` which allows\n * you to more easily log non-string values as well.\n *\n * @example\n * ```ts\n * export default makeScene2D(function* (view) {\n * const circle = createRef<Circle>();\n *\n * view.add(\n * <Circle ref={circle} width={320} height={320} fill={'lightseagreen'} />,\n * );\n *\n * debug(circle().position());\n * });\n * ```\n *\n * @param payload - The payload to log\n */\nexport function debug(payload: any) {\n const result: LogPayload = {message: stringify(payload)};\n\n if (payload && typeof payload === 'object') {\n result.object = payload;\n }\n\n useLogger().debug(result);\n}\n","import {useLogger} from './useScene';\n\n/**\n * Mark the given function as deprecated.\n *\n * @param fn - The function to deprecate.\n * @param message - The log message.\n * @param remarks - The optional log remarks.\n */\nexport function deprecate<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n message: string,\n remarks?: string,\n): (...args: TArgs) => TReturn {\n return function (this: any, ...args) {\n useLogger().warn({message, remarks, stack: new Error().stack});\n return fn.apply(this, args);\n };\n}\n","import type {LogPayload} from '../app';\n\nexport function errorToLog(error: any): LogPayload {\n return {\n message: error.message,\n stack: error.stack,\n remarks: error.remarks,\n };\n}\n","export default `This feature requires enabling the \\`experimentalFeatures\\` flag in your project\nconfiguration:\n\n\\`\\`\\`ts\nexport default makeProject({\n experimentalFeatures: true,\n // ...\n});\n\\`\\`\\`\n\n[Learn more](https://canvascommons.io/docs/experimental) about experimental\nfeatures.\n`;\n","import type {LogPayload} from '../app';\nimport {DetailedError} from './DetailedError';\nimport experimentalFeatures from './__logs__/experimental-features';\n\ntype ExperimentalErrorProps = Pick<\n LogPayload,\n 'message' | 'remarks' | 'object' | 'durationMs' | 'inspect'\n>;\n\nexport class ExperimentalError extends DetailedError {\n public constructor(message: string, remarks?: string);\n public constructor(props: ExperimentalErrorProps);\n public constructor(props: string | ExperimentalErrorProps, remarks?: string) {\n if (typeof props === 'string') {\n super({\n message: props,\n remarks: (remarks ?? '') + experimentalFeatures,\n });\n } else {\n super({\n ...props,\n remarks: (props.remarks ?? '') + experimentalFeatures,\n });\n }\n }\n}\n","import type {Plugin} from './Plugin';\n\n/**\n * A helper function for exporting Canvas Commons plugins.\n *\n * @param plugin - The plugin configuration.\n *\n * @example\n * ```ts\n * export default makePlugin({\n * name: 'my-custom-plugin',\n * });\n * ```\n */\nexport function makePlugin(plugin: Plugin | (() => Plugin)): () => Plugin {\n return typeof plugin === 'function' ? plugin : () => plugin;\n}\n","import {ImageExporter} from '../app';\nimport {makePlugin} from './makePlugin';\n\n/**\n * The default plugin included in every Canvas Commons project.\n *\n * @internal\n */\nexport default makePlugin({\n name: '@canvas-commons/core/default',\n exporters() {\n return [ImageExporter];\n },\n});\n","import {EventDispatcher} from '../events';\n\nexport enum LogLevel {\n Error = 'error',\n Warn = 'warn',\n Info = 'info',\n Http = 'http',\n Verbose = 'verbose',\n Debug = 'debug',\n Silly = 'silly',\n}\n\n/**\n * Represents an individual log entry.\n *\n * @remarks\n * When displayed in the editor, the log entry will have the following format:\n * ```\n * inspect node ┐\n * ┌ expand more duration ┐ │\n * ▼ ▼ ▼\n * ┌────────────────────────────────────────────┐\n * │ ▶ message 300 ms (+) │\n * ├────────────────────────────────────────────┤\n * │ remarks │\n * │ object │\n * │ stacktrace │\n * └────────────────────────────────────────────┘\n * ```\n */\nexport interface LogPayload {\n /**\n * The log level.\n */\n level?: LogLevel;\n\n /**\n * The main message of the log.\n *\n * @remarks\n * Always visible.\n */\n message: string;\n\n /**\n * Additional information about the log.\n *\n * @remarks\n * Visible only when the log is expanded.\n */\n remarks?: string;\n\n /**\n * An object that will be serialized as JSON and displayed under the message.\n *\n * @remarks\n * Visible only when the log is expanded.\n */\n object?: any;\n\n /**\n * The stack trace of the log.\n *\n * @remarks\n * Visible only when the log is expanded.\n * The current stack trace can be obtained using `new Error().stack`.\n * Both Chromium and Firefox stack traces are supported.\n */\n stack?: string;\n\n /**\n * An optional duration in milliseconds.\n *\n * @remarks\n * Can be used to display any duration related to the log.\n * The value is always visible next to the message.\n */\n durationMs?: number;\n\n /**\n * An optional key used to inspect a related object.\n *\n * @remarks\n * This will be used together with the {@link scenes.Inspectable} interface to\n * display additional information about the inspected object.\n * When specified, the log will have an \"inspect\" button that will open the\n * \"Properties\" tab and select the inspected object.\n */\n inspect?: string;\n\n /**\n * Any additional information that the log may contain.\n */\n [K: string]: any;\n}\n\nexport class Logger {\n /**\n * Triggered when a new message is logged.\n */\n public get onLogged() {\n return this.logged.subscribable;\n }\n private readonly logged = new EventDispatcher<LogPayload>();\n public readonly history: LogPayload[] = [];\n\n private profilers: Record<string, number> = {};\n\n public log(payload: LogPayload) {\n this.logged.dispatch(payload);\n this.history.push(payload);\n }\n\n public error(payload: string | LogPayload) {\n this.logLevel(LogLevel.Error, payload);\n }\n\n public warn(payload: string | LogPayload) {\n this.logLevel(LogLevel.Warn, payload);\n }\n\n public info(payload: string | LogPayload) {\n this.logLevel(LogLevel.Info, payload);\n }\n\n public http(payload: string | LogPayload) {\n this.logLevel(LogLevel.Http, payload);\n }\n\n public verbose(payload: string | LogPayload) {\n this.logLevel(LogLevel.Verbose, payload);\n }\n\n public debug(payload: string | LogPayload) {\n this.logLevel(LogLevel.Debug, payload);\n }\n\n public silly(payload: string | LogPayload) {\n this.logLevel(LogLevel.Silly, payload);\n }\n\n protected logLevel(level: LogLevel, payload: string | LogPayload) {\n const result = typeof payload === 'string' ? {message: payload} : payload;\n result.level = level;\n this.log(result);\n }\n\n public profile(id: string, payload?: LogPayload) {\n const time = performance.now();\n if (this.profilers[id]) {\n const timeEnd = this.profilers[id];\n delete this.profilers[id];\n\n const result = payload ?? {message: id};\n result.level ??= LogLevel.Debug;\n result.durationMs = time - timeEnd;\n this.log(result);\n\n return;\n }\n\n this.profilers[id] = time;\n }\n}\n","import {MetaOption} from '../meta';\nimport {CanvasColorSpace, CanvasOutputMimeType} from '../types';\n\nexport const Scales: MetaOption<number>[] = [\n {value: 0.25, text: '0.25x (Quarter)'},\n {value: 0.5, text: `0.5x (Half)`},\n {value: 1, text: `1.0x (Full)`},\n {value: 2, text: `2.0x (Double)`},\n];\n\nexport const ColorSpaces: MetaOption<CanvasColorSpace>[] = [\n {value: 'srgb', text: 'sRGB'},\n {value: 'display-p3', text: 'DCI-P3'},\n];\n\nexport const FileTypes: MetaOption<CanvasOutputMimeType>[] = [\n {value: 'image/png', text: 'png'},\n {value: 'image/jpeg', text: 'jpeg'},\n {value: 'image/webp', text: 'webp'},\n];\n\nexport const FrameRates: MetaOption<number>[] = [\n {value: 30, text: '30 FPS'},\n {value: 60, text: '60 FPS'},\n];\n","import {\n ColorMetaField,\n EnumMetaField,\n ExporterMetaField,\n MetaField,\n NumberMetaField,\n ObjectMetaField,\n RangeMetaField,\n Vector2MetaField,\n} from '../meta';\nimport {CanvasColorSpace, Color, Vector2} from '../types';\nimport {ColorSpaces, FrameRates, Scales} from './presets';\nimport type {Project} from './Project';\n\nfunction createProjectMetadata(project: Project) {\n const meta = {\n version: new MetaField('version', 1),\n shared: new ObjectMetaField('General', {\n background: new ColorMetaField('background', null),\n range: new RangeMetaField('range', [0, Infinity]),\n size: new Vector2MetaField('resolution', new Vector2(1920, 1080)),\n audioOffset: new NumberMetaField('audio offset', 0)\n .setPrecision(4)\n .setStep(0.1),\n }),\n preview: new ObjectMetaField('Preview', {\n fps: new NumberMetaField('frame rate', 30)\n .setPresets(FrameRates)\n .setRange(1),\n resolutionScale: new EnumMetaField('scale', Scales, 1),\n }),\n rendering: new ObjectMetaField('Rendering', {\n fps: new NumberMetaField('frame rate', 60)\n .setPresets(FrameRates)\n .setRange(1),\n resolutionScale: new EnumMetaField('scale', Scales, 1),\n colorSpace: new EnumMetaField('color space', ColorSpaces),\n exporter: new ExporterMetaField('exporter', project),\n }),\n };\n\n meta.shared.audioOffset.disable(!project.audio);\n\n return meta;\n}\n\nexport class ProjectMetadata extends ObjectMetaField<\n ReturnType<typeof createProjectMetadata>\n> {\n public constructor(project: Project) {\n super('project', createProjectMetadata(project));\n }\n\n public getFullPreviewSettings(): {\n fps: number;\n resolutionScale: number;\n background: Color | null;\n range: [number, number];\n size: Vector2;\n audioOffset: number;\n } {\n return {\n ...this.shared.get(),\n ...this.preview.get(),\n };\n }\n\n public getFullRenderingSettings(): {\n fps: number;\n resolutionScale: number;\n colorSpace: CanvasColorSpace;\n background: Color | null;\n range: [number, number];\n size: Vector2;\n audioOffset: number;\n exporter: {\n name: string;\n options: unknown;\n };\n } {\n return {\n ...this.shared.get(),\n ...this.rendering.get(),\n };\n }\n}\n","import {\n BoolMetaField,\n ColorMetaField,\n MetaField,\n ObjectMetaField,\n Vector2MetaField,\n} from '../meta';\nimport {Color, Vector2} from '../types';\n\n/**\n * Create a runtime representation of the settings metadata.\n */\nexport function createSettingsMetadata() {\n return new ObjectMetaField('Application Settings', {\n version: new MetaField('version', 1),\n appearance: new ObjectMetaField('Appearance', {\n color: new ColorMetaField('accent color', new Color('#33a6ff')).describe(\n 'The accent color for the user interface. (Leave empty to use the default color)',\n ),\n font: new BoolMetaField('legacy font', false).describe(\n \"Use the 'JetBrains Mono' font for the user interface.\",\n ),\n coordinates: new BoolMetaField('coordinates', true).describe(\n 'Display mouse coordinates within the preview window.',\n ),\n }),\n defaults: new ObjectMetaField('Defaults', {\n background: new ColorMetaField('background', null).describe(\n 'The default background color used in new projects.',\n ),\n size: new Vector2MetaField(\n 'resolution',\n new Vector2(1920, 1080),\n ).describe('The default resolution used in new projects.'),\n }),\n });\n}\n\n/**\n * A runtime representation of the settings metadata.\n */\nexport type SettingsMetadata = ReturnType<typeof createSettingsMetadata>;\n","import {MetaFile} from '../meta';\nimport {Plugin} from '../plugin';\nimport DefaultPlugin from '../plugin/DefaultPlugin';\nimport {Logger} from './Logger';\nimport {Project, ProjectSettings, Versions} from './Project';\nimport {ProjectMetadata} from './ProjectMetadata';\nimport {createSettingsMetadata} from './SettingsMetadata';\n\n/**\n * Bootstrap a project.\n *\n * @param name - The name of the project.\n * @param versions - Package versions.\n * @param plugins - Loaded plugins.\n * @param config - Project settings.\n * @param metaFile - The project meta file.\n * @param settingsFile - The settings meta file.\n * @param logger - An optional logger instance.\n * @param pluginResolutions - Mapping from the plugin name to the plugin instance.\n *\n * @internal\n */\nexport function bootstrap(\n name: string,\n versions: Versions,\n plugins: PluginLike[],\n config: ProjectSettings,\n metaFile: MetaFile<any>,\n settingsFile: MetaFile<any>,\n logger = config.logger ?? new Logger(),\n pluginResolutions: Map<string, Plugin> = new Map<string, Plugin>(),\n): Project {\n const settings = createSettingsMetadata();\n settingsFile.attach(settings);\n\n function resolvePlugin(plugin: PluginLike): Plugin | undefined {\n if (typeof plugin !== 'string') return plugin;\n\n return pluginResolutions.get(plugin);\n }\n\n function resolvePluginList(plugins: PluginLike[] | undefined): Plugin[] {\n return plugins?.map(resolvePlugin)?.filter(isDefined) ?? [];\n }\n\n const allPlugins = [\n DefaultPlugin(),\n ...resolvePluginList(consolidatePluginList(config, plugins)),\n ];\n\n const pluginSet = new Set<string>();\n const includedPlugins: Plugin[] = [];\n let resolvedConfig = config;\n\n for (const plugin of allPlugins) {\n if (!plugin || pluginSet.has(plugin.name)) {\n continue;\n }\n\n pluginSet.add(plugin.name);\n includedPlugins.push(plugin);\n\n resolvedConfig = {\n ...resolvedConfig,\n ...(plugin.settings?.(resolvedConfig) ?? {}),\n };\n }\n\n const project = {\n name,\n ...config,\n plugins: includedPlugins,\n versions,\n settings,\n logger,\n } as Project;\n\n project.meta = new ProjectMetadata(project);\n project.meta.shared.set(settings.defaults.get());\n project.experimentalFeatures ??= false;\n metaFile.attach(project.meta);\n\n includedPlugins.forEach(plugin => plugin.project?.(project));\n\n return project;\n}\n\n/**\n * Bootstrap a project together with all editor plugins.\n *\n * @param name - The name of the project.\n * @param versions - Package versions.\n * @param plugins - Loaded plugins.\n * @param config - Project settings.\n * @param metaFile - The project meta file.\n * @param settingsFile - The settings meta file.\n *\n * @internal\n */\nexport async function editorBootstrap(\n name: string,\n versions: Versions,\n plugins: PluginLike[],\n config: ProjectSettings,\n metaFile: MetaFile<any>,\n settingsFile: MetaFile<any>,\n): Promise<Project> {\n const logger = config.logger ?? new Logger();\n const pluginResolutions = new Map<string, Plugin>();\n\n const allPlugins = consolidatePluginList(config, plugins);\n await loadPluginList(allPlugins, logger, pluginResolutions);\n\n return bootstrap(\n name,\n versions,\n plugins,\n config,\n metaFile,\n settingsFile,\n logger,\n pluginResolutions,\n );\n}\n\nasync function loadPluginList(\n plugins: PluginLike[] | undefined,\n logger: Logger,\n resolutions: Map<string, Plugin>,\n) {\n if (!plugins) return;\n\n await Promise.all(\n plugins.map(async plugin => {\n if (typeof plugin !== 'string') return;\n\n const loadedPlugin = await loadPlugin(plugin, logger);\n if (!loadedPlugin) return;\n resolutions.set(plugin, loadedPlugin);\n }),\n );\n}\n\nasync function loadPlugin(\n plugin: string,\n logger: Logger,\n): Promise<Plugin | null> {\n try {\n let url = `/@id/${plugin}`;\n const version = new URL(import.meta.url).searchParams.get('v');\n if (version) {\n url += `?v=${version}`;\n }\n return (await import(/* @vite-ignore */ url)).default() as Plugin;\n } catch (e: any) {\n console.error(e);\n logger.error({\n message: `Failed to load plugin \"${plugin}\": ${e.message}.`,\n stack: e.stack,\n remarks: e.remarks,\n });\n return null;\n }\n}\n\nfunction consolidatePluginList(\n config: ProjectSettings,\n plugins: PluginLike[],\n): PluginLike[] {\n const fullList = [\n config.plugins,\n config.scenes.flatMap(scene => scene.plugins ?? []),\n plugins,\n ];\n return fullList.flatMap(list => list ?? []);\n}\n\nfunction isDefined<T>(value: T | undefined): value is T {\n return value !== undefined;\n}\n\ntype PluginLike = Plugin | string;\n","import {EventDispatcher} from '../events';\nimport {\n BoolMetaField,\n EnumMetaField,\n NumberMetaField,\n ObjectMetaField,\n ValueOf,\n} from '../meta';\nimport {clamp} from '../tweening';\nimport {CanvasOutputMimeType} from '../types';\nimport type {Exporter} from './Exporter';\nimport type {Logger} from './Logger';\nimport type {Project} from './Project';\nimport type {RendererSettings} from './Renderer';\nimport {FileTypes} from './presets';\n\nconst EXPORT_FRAME_LIMIT = 256;\nconst EXPORT_RETRY_DELAY = 1000;\n\ntype ImageExporterOptions = ValueOf<ReturnType<typeof ImageExporter.meta>>;\n\ninterface ServerResponse {\n frame: number;\n}\n\n/**\n * Image sequence exporter.\n *\n * @internal\n */\nexport class ImageExporter implements Exporter {\n public static readonly id = '@canvas-commons/core/image-sequence';\n public static readonly displayName = 'Image sequence';\n\n public static meta() {\n const meta = new ObjectMetaField(this.name, {\n fileType: new EnumMetaField('file type', FileTypes),\n quality: new NumberMetaField('quality', 100)\n .setRange(0, 100)\n .describe('A number between 0 and 100 indicating the image quality.'),\n groupByScene: new BoolMetaField('group by scene', false).describe(\n 'Group exported images by scene. When checked, separates the sequence into subdirectories for each scene in the project.',\n ),\n });\n\n meta.fileType.onChanged.subscribe(value => {\n meta.quality.disable(value === 'image/png');\n });\n\n return meta;\n }\n\n public static async create(\n project: Project,\n settings: RendererSettings,\n ): Promise<ImageExporter> {\n return new ImageExporter(project.logger, settings);\n }\n\n private static readonly response = new EventDispatcher<ServerResponse>();\n\n static {\n if (import.meta.hot) {\n import.meta.hot.on('canvas-commons:export-ack', response => {\n this.response.dispatch(response);\n });\n }\n }\n\n private readonly frameLookup = new Set<number>();\n private readonly projectName: string;\n private readonly quality: number;\n private readonly fileType: CanvasOutputMimeType;\n private readonly groupByScene: boolean;\n\n public constructor(\n private readonly logger: Logger,\n private readonly settings: RendererSettings,\n ) {\n const options = settings.exporter.options as ImageExporterOptions;\n this.projectName = settings.name;\n this.quality = clamp(0, 1, options.quality / 100);\n this.fileType = options.fileType;\n this.groupByScene = options.groupByScene;\n }\n\n public async start() {\n ImageExporter.response.subscribe(this.handleResponse);\n }\n\n public async handleFrame(\n canvas: HTMLCanvasElement,\n frame: number,\n sceneFrame: number,\n sceneName: string,\n signal: AbortSignal,\n ) {\n if (this.frameLookup.has(frame)) {\n this.logger.warn(`Frame no. ${frame} is already being exported.`);\n return;\n }\n if (import.meta.hot) {\n while (this.frameLookup.size > EXPORT_FRAME_LIMIT) {\n await new Promise(resolve => setTimeout(resolve, EXPORT_RETRY_DELAY));\n if (signal.aborted) {\n return;\n }\n }\n\n this.frameLookup.add(frame);\n import.meta.hot!.send('canvas-commons:export', {\n frame,\n data: canvas.toDataURL(this.fileType, this.quality),\n mimeType: this.fileType,\n subDirectories: this.groupByScene\n ? [this.projectName, sceneName]\n : [this.projectName],\n name: (this.groupByScene ? sceneFrame : frame)\n .toString()\n .padStart(6, '0'),\n });\n }\n }\n\n public async stop() {\n while (this.frameLookup.size > 0) {\n await new Promise(resolve => setTimeout(resolve, EXPORT_RETRY_DELAY));\n }\n ImageExporter.response.unsubscribe(this.handleResponse);\n }\n\n private handleResponse = ({frame}: ServerResponse) => {\n this.frameLookup.delete(frame);\n };\n}\n","import {ValueDispatcher} from '../events';\nimport type {Scene, SceneDescriptionReload, Slide} from '../scenes';\n\nexport enum PlaybackState {\n Playing,\n Rendering,\n Paused,\n Presenting,\n}\n\n/**\n * A general class for managing a sequence of scenes.\n *\n * @remarks\n * This class provides primitive operations that can be executed on a scene\n * sequence, such as {@link progress} or {@link seek}.\n *\n * @internal\n */\nexport class PlaybackManager {\n /**\n * Triggered when the active scene changes.\n *\n * @eventProperty\n */\n public get onSceneChanged() {\n if (this.currentSceneReference === null) {\n throw new Error('PlaybackManager has not been properly initialized');\n }\n return this.currentSceneReference.subscribable;\n }\n\n /**\n * Triggered when the scenes get recalculated.\n *\n * @remarks\n * This event indicates that the timing of at least one scene has changed.\n *\n * @eventProperty\n */\n public get onScenesRecalculated() {\n return this.scenes.subscribable;\n }\n\n public frame = 0;\n public speed = 1;\n public fps = 30;\n public duration = 0;\n public finished = false;\n public slides: Slide[] = [];\n\n public previousScene: Scene | null = null;\n public state = PlaybackState.Paused;\n\n public get currentScene(): Scene {\n if (this.currentSceneReference === null) {\n throw new Error('PlaybackManager has not been properly initialized');\n }\n return this.currentSceneReference.current;\n }\n\n public set currentScene(scene: Scene) {\n if (!scene) {\n throw new Error('Invalid scene.');\n }\n this.currentSceneReference ??= new ValueDispatcher<Scene>(scene);\n this.currentSceneReference.current = scene;\n }\n\n private currentSceneReference: ValueDispatcher<Scene> | null = null;\n private scenes = new ValueDispatcher<Scene[]>([]);\n\n public setup(scenes: Scene[]) {\n this.scenes.current = scenes;\n this.currentScene = scenes[0];\n }\n\n public async progress() {\n this.finished = await this.next();\n return this.finished;\n }\n\n public async seek(frame: number): Promise<boolean> {\n if (\n frame <= this.frame ||\n (this.currentScene.isCached() && this.currentScene.lastFrame < frame)\n ) {\n const scene = this.findBestScene(frame);\n if (scene !== this.currentScene) {\n this.previousScene = null;\n this.currentScene = scene;\n\n this.frame = this.currentScene.firstFrame;\n await this.currentScene.reset();\n } else if (this.frame >= frame) {\n this.previousScene = null;\n this.frame = this.currentScene.firstFrame;\n await this.currentScene.reset();\n }\n }\n\n this.finished = false;\n while (this.frame < frame && !this.finished) {\n this.finished = await this.next();\n }\n\n return this.finished;\n }\n\n public async goBack() {\n let target = this.currentScene.slides.getCurrent();\n if (target && this.currentScene.slides.isWaiting()) {\n const index = this.slides.indexOf(target);\n target = this.slides[index - 1];\n }\n\n await this.seekSlide(target);\n }\n\n public async goForward() {\n const current = this.currentScene.slides.getCurrent();\n const index = this.slides.indexOf(current!);\n await this.seekSlide(this.slides[index + 1]);\n }\n\n public async goTo(slideId: string) {\n await this.seekSlide(this.slides.find(slide => slide.id === slideId));\n }\n\n private async seekSlide(slide: Slide | null = null) {\n if (!slide) return;\n const {id, scene} = slide;\n\n if (this.currentScene !== scene || this.currentScene.slides.didHappen(id)) {\n this.previousScene = null;\n this.currentScene = scene;\n this.frame = this.currentScene.firstFrame;\n this.currentScene.slides.setTarget(id);\n await this.currentScene.reset();\n }\n\n this.finished = false;\n this.currentScene.slides.setTarget(id);\n while (!this.currentScene.slides.isWaitingFor(id) && !this.finished) {\n this.finished = await this.next();\n }\n this.currentScene.slides.setTarget(null);\n\n return this.finished;\n }\n\n public async reset() {\n this.previousScene = null;\n this.currentScene = this.scenes.current[0];\n this.frame = 0;\n this.finished = false;\n await this.currentScene.reset();\n }\n\n public reload(description?: SceneDescriptionReload<never>) {\n this.scenes.current.forEach(scene => scene.reload(description));\n }\n\n public async recalculate() {\n this.previousScene = null;\n this.slides = [];\n\n const speed = this.speed;\n this.frame = 0;\n this.speed = 1;\n\n const scenes: Scene[] = [];\n try {\n for (const scene of this.scenes.current) {\n await scene.recalculate(frame => {\n this.frame = frame;\n });\n this.slides.push(...scene.slides.onChanged.current);\n scenes.push(scene);\n }\n } finally {\n this.speed = speed;\n }\n\n this.scenes.current = scenes;\n this.duration = this.frame;\n }\n\n private async next(): Promise<boolean> {\n if (this.previousScene) {\n await this.previousScene.next();\n if (this.currentScene.isFinished()) {\n this.previousScene = null;\n }\n }\n\n this.frame += this.speed;\n\n if (this.currentScene.isFinished()) {\n return true;\n }\n\n await this.currentScene.next();\n if (this.previousScene && this.currentScene.isAfterTransitionIn()) {\n this.previousScene = null;\n }\n\n if (this.currentScene.canTransitionOut()) {\n this.previousScene = this.currentScene;\n const nextScene = this.getNextScene(this.previousScene);\n if (nextScene) {\n this.currentScene = nextScene;\n await this.currentScene.reset(this.previousScene);\n }\n if (!nextScene || this.currentScene.isAfterTransitionIn()) {\n this.previousScene = null;\n }\n }\n\n return this.currentScene.isFinished();\n }\n\n private findBestScene(frame: number): Scene {\n let lastScene = this.scenes.current[0];\n for (const scene of this.scenes.current) {\n if (!scene.isCached() || scene.lastFrame > frame) {\n return frame > scene.firstFrame + scene.transitionDuration\n ? scene\n : lastScene;\n }\n lastScene = scene;\n }\n\n return lastScene;\n }\n\n private getNextScene(scene?: Scene): Scene | null {\n const scenes = this.scenes.current;\n if (!scene) {\n return scenes[0];\n }\n\n const index = scenes.findIndex(s => s === scene);\n if (index < 0) {\n return null;\n }\n return scenes[index + 1] ?? null;\n }\n}\n","import {PlaybackManager, PlaybackState} from './PlaybackManager';\n\n/**\n * A read-only representation of the playback.\n */\nexport class PlaybackStatus {\n public constructor(private readonly playback: PlaybackManager) {}\n\n /**\n * Convert seconds to frames using the current framerate.\n *\n * @param seconds - The seconds to convert.\n */\n public secondsToFrames(seconds: number) {\n return Math.ceil(seconds * this.playback.fps);\n }\n\n /**\n * Convert frames to seconds using the current framerate.\n *\n * @param frames - The frames to convert.\n */\n public framesToSeconds(frames: number) {\n return frames / this.playback.fps;\n }\n\n public get time(): number {\n return this.framesToSeconds(this.playback.frame);\n }\n\n public get frame(): number {\n return this.playback.frame;\n }\n\n public get speed(): number {\n return this.playback.speed;\n }\n\n public get fps(): number {\n return this.playback.fps;\n }\n\n public get state(): PlaybackState {\n return this.playback.state;\n }\n\n /**\n * The time passed since the last frame in seconds.\n */\n public get deltaTime(): number {\n return this.framesToSeconds(1) * this.speed;\n }\n}\n","export interface AudioData {\n /**\n * An array of minimum and maximum waveform data points, interleaved.\n * Each value is in range of -1 to 1.\n */\n peaks: number[];\n /**\n * The amount of samples taken.\n */\n length: number;\n /**\n * The absolute biggest value from the peaks array.\n */\n absoluteMax: number;\n /**\n * Samples per seconds.\n */\n sampleRate: number;\n /**\n * The duration of the audio in seconds.\n */\n duration: number;\n}\n\nexport const EMPTY_AUDIO_DATA: AudioData = {\n peaks: [],\n length: 0,\n absoluteMax: 0,\n sampleRate: 0,\n duration: 0,\n};\n","import {Logger} from '../app';\nimport {Sound} from '../scenes';\nimport {useLogger} from '../utils';\n\nexport class AudioManager {\n private readonly audioElement: HTMLAudioElement = new Audio();\n private source: string | null = null;\n private error = false;\n private offset = 0;\n private start?: number;\n private duration?: number;\n private gainNode?: GainNode;\n private sourceNode?: MediaElementAudioSourceNode;\n\n public constructor(\n private readonly logger: Logger,\n private readonly context: AudioContext,\n ) {\n if (import.meta.hot) {\n import.meta.hot.on('canvas-commons:assets', ({urls}) => {\n if (this.source && urls.includes(this.source)) {\n this.setSource(this.source);\n }\n });\n }\n }\n\n public setSound(sound: Sound) {\n this.setOffset(sound.offset);\n this.setTrim(sound.start, sound.end);\n this.setSource(sound.audio);\n\n if (this.gainNode === undefined) {\n this.sourceNode = this.context.createMediaElementSource(\n this.audioElement,\n );\n this.gainNode = this.context.createGain();\n this.sourceNode.connect(this.gainNode);\n this.gainNode.connect(this.context.destination);\n }\n\n this.gainNode.gain.value = Math.pow(10, (sound.gain ?? 0) / 10);\n this.setPlaybackRate(sound.realPlaybackRate, true);\n }\n\n public getTime() {\n return this.toAbsoluteTime(this.audioElement.currentTime);\n }\n\n public setTime(value: number) {\n this.audioElement.currentTime = this.toRelativeTime(value);\n }\n\n public setTrim(start?: number, end?: number) {\n this.start = start;\n if (end !== undefined) {\n this.duration = end - (start ?? 0);\n } else {\n this.duration = undefined;\n }\n }\n\n public setOffset(value: number) {\n this.offset = value;\n }\n\n public setPlaybackRate(value: number, pitchShift: boolean = false) {\n this.audioElement.playbackRate = value;\n this.audioElement.preservesPitch = !pitchShift;\n }\n\n public setMuted(isMuted: boolean) {\n this.audioElement.muted = isMuted;\n }\n\n public setVolume(volume: number) {\n this.audioElement.volume = volume;\n }\n\n public getSource() {\n return this.source;\n }\n\n public setSource(src: string) {\n this.source = src;\n this.audioElement.src = src;\n }\n\n public isInRange(time: number) {\n return (\n time >= this.offset &&\n time <\n this.offset +\n (this.duration ??\n this.audioElement.duration * this.audioElement.playbackRate)\n );\n }\n\n public toRelativeTime(time: number) {\n return (\n Math.max(0, time - this.offset) * this.audioElement.playbackRate +\n (this.start ?? 0)\n );\n }\n\n public toAbsoluteTime(time: number) {\n return (\n (time - (this.start ?? 0)) / this.audioElement.playbackRate + this.offset\n );\n }\n\n public isReady() {\n return this.source && !this.error;\n }\n\n /**\n * Pause/resume the audio.\n *\n * @param isPaused - Whether the audio should be paused or resumed.\n *\n * @returns `true` if the audio successfully started playing.\n */\n public async setPaused(isPaused: boolean): Promise<boolean> {\n if (this.source && this.audioElement.paused !== isPaused) {\n if (isPaused) {\n this.audioElement.pause();\n } else if (this.audioElement.currentTime < this.audioElement.duration) {\n try {\n await this.audioElement.play();\n this.error = false;\n return true;\n } catch (e: any) {\n if (!this.error) {\n useLogger().error(e);\n }\n this.error = true;\n }\n }\n }\n\n return false;\n }\n\n public dispose() {\n this.audioElement.pause();\n this.audioElement.src = '';\n this.audioElement.load();\n this.gainNode?.disconnect();\n this.sourceNode?.disconnect();\n\n this.sourceNode = undefined;\n this.gainNode = undefined;\n }\n}\n","import {Logger} from '../app';\nimport {Sound} from '../scenes';\nimport {AudioManager} from './AudioManager';\nimport {AudioResourceManager} from './AudioResourceManager';\n\nexport class AudioManagerPool {\n private readonly context = new AudioContext();\n\n private pool: AudioManager[] = [];\n private managers: Map<Sound, AudioManager> = new Map();\n private sounds: Sound[] = [];\n\n private muted: boolean = true;\n private volume: number = 1;\n private paused: boolean = true;\n\n public constructor(\n private readonly logger: Logger,\n private readonly audioResources: AudioResourceManager,\n ) {}\n\n public async setupPool(sounds: Sound[]) {\n for (const manager of this.pool) {\n manager.dispose();\n }\n this.pool = [];\n for (const manager of this.managers.values()) {\n manager.dispose();\n }\n this.managers.clear();\n this.sounds = sounds;\n }\n\n public setMuted(muted: boolean) {\n this.muted = muted;\n this.managers.forEach(manager => manager.setMuted(muted));\n }\n\n public setVolume(volume: number) {\n this.volume = volume;\n this.managers.forEach(manager => manager.setVolume(volume));\n }\n\n public setTime(time: number) {\n this.managers.forEach(manager => manager.setTime(time));\n }\n\n public async setPaused(paused: boolean) {\n this.paused = paused;\n await Promise.all(\n Array.from(this.managers.values()).map(manager =>\n manager.setPaused(paused),\n ),\n );\n }\n\n private isInRange(sound: Sound, time: number) {\n const duration = this.audioResources.peekDuration(sound.audio);\n const audioStart = sound.start ?? 0;\n const audioEnd = Math.min(duration, sound.end ?? Infinity);\n const audioDuration = (audioEnd - audioStart) / sound.realPlaybackRate;\n\n return time >= sound.offset && time < sound.offset + audioDuration;\n }\n\n public prepare(time: number) {\n for (const sound of this.sounds) {\n if (this.isInRange(sound, time)) {\n let manager = this.managers.get(sound);\n if (manager) continue;\n\n // sound is starting\n manager = this.pool.pop() ?? this.spawn();\n manager.setSound(sound);\n manager.setMuted(this.muted);\n manager.setVolume(this.volume);\n manager.setTime(time);\n manager.setPaused(this.paused);\n this.managers.set(sound, manager);\n } else {\n const manager = this.managers.get(sound);\n if (!manager) continue;\n\n // sound has ended\n manager.setPaused(true);\n this.pool.push(manager);\n this.managers.delete(sound);\n }\n }\n }\n\n public spawn() {\n return new AudioManager(this.logger, this.context);\n }\n\n public resume() {\n if (this.context.state === 'suspended') {\n this.context.resume();\n }\n }\n}\n","import {Logger} from '../app';\nimport {ValueDispatcher} from '../events';\nimport {AudioData, EMPTY_AUDIO_DATA} from './AudioData';\n\nexport class AudioResourceManager {\n private readonly context = new AudioContext();\n private readonly lookup = new Map<string, AudioResource>();\n\n public constructor(private readonly logger: Logger) {\n if (import.meta.hot) {\n import.meta.hot.on('canvas-commons:assets', ({urls}) => {\n for (const url of urls) {\n const manager = this.lookup.get(url);\n manager?.reload();\n }\n });\n }\n }\n\n public peekDuration(source: string): number {\n return this.get(source).onData.current.duration;\n }\n\n public get(source: string): AudioResource {\n let manager = this.lookup.get(source);\n if (!manager) {\n manager = new AudioResource(this.logger, source, this.context);\n this.lookup.set(source, manager);\n }\n\n return manager;\n }\n}\n\nexport class AudioResource {\n public get onData() {\n return this.data.subscribable;\n }\n private readonly data = new ValueDispatcher<AudioData>(EMPTY_AUDIO_DATA);\n private abort: AbortController | null = null;\n\n public constructor(\n private readonly logger: Logger,\n private readonly source: string,\n private readonly context: AudioContext,\n ) {\n this.reload();\n }\n\n public async reload() {\n this.abort?.abort();\n const abort = new AbortController();\n this.abort = abort;\n const data = await this.loadData(abort.signal);\n if (!abort.signal.aborted) {\n this.data.current = data ?? EMPTY_AUDIO_DATA;\n }\n }\n\n private async loadData(signal: AbortSignal): Promise<AudioData | void> {\n let response: Response;\n try {\n response = await fetch(this.source, {signal});\n } catch (e: any) {\n if (e.name !== 'AbortError') {\n this.logger.error(e);\n }\n return;\n }\n\n const rawBuffer = await response.arrayBuffer();\n if (signal.aborted) {\n return;\n }\n\n let audioBuffer: AudioBuffer;\n try {\n audioBuffer = await this.decodeAudioData(rawBuffer);\n } catch (e) {\n return;\n }\n\n if (signal.aborted) {\n return;\n }\n\n const sampleSize = 256;\n const samples = ~~(audioBuffer.length / sampleSize);\n\n const peaks = [];\n let absoluteMax = 0;\n for (\n let channelId = 0;\n channelId < audioBuffer.numberOfChannels;\n channelId++\n ) {\n const channel = audioBuffer.getChannelData(channelId);\n for (let i = 0; i < samples; i++) {\n const start = ~~(i * sampleSize);\n const end = ~~(start + sampleSize);\n\n let min = channel[start];\n let max = min;\n\n for (let j = start; j < end; j++) {\n const value = channel[j];\n if (value > max) {\n max = value;\n }\n if (value < min) {\n min = value;\n }\n }\n\n if (channelId === 0 || max > peaks[i * 2]) {\n peaks[i * 2] = max;\n }\n if (channelId === 0 || min < peaks[i * 2 + 1]) {\n peaks[i * 2 + 1] = min;\n }\n\n if (max > absoluteMax) {\n absoluteMax = max;\n }\n if (Math.abs(min) > absoluteMax) {\n absoluteMax = Math.abs(min);\n }\n }\n }\n\n return {\n peaks,\n absoluteMax,\n length: samples,\n sampleRate: (audioBuffer.sampleRate / sampleSize) * 2,\n duration: audioBuffer.duration,\n };\n }\n\n private decodeAudioData(buffer: ArrayBuffer): Promise<AudioBuffer> {\n return new Promise<AudioBuffer>((resolve, reject) =>\n this.context.decodeAudioData(buffer, resolve, reject).catch(reject),\n );\n }\n}\n","import {getContext} from '../utils';\n\nlet Canvas: HTMLCanvasElement;\nlet Context: CanvasRenderingContext2D;\n\nexport type ImageDataSource = CanvasImageSource & {\n width: number;\n height: number;\n};\n\nexport function loadImage(source: string): Promise<HTMLImageElement> {\n const image = new Image();\n image.src = source;\n return new Promise((resolve, reject) => {\n if (image.complete) {\n resolve(image);\n } else {\n image.onload = () => resolve(image);\n image.onerror = reject;\n }\n });\n}\n\nexport function loadAnimation(sources: string[]): Promise<HTMLImageElement[]> {\n return Promise.all(sources.map(loadImage));\n}\n\nexport function getImageData(image: ImageDataSource) {\n Canvas ??= document.createElement('canvas');\n Context ??= getContext({willReadFrequently: true}, Canvas);\n\n Canvas.width = image.width;\n Canvas.height = image.height;\n Context.clearRect(0, 0, image.width, image.height);\n Context.drawImage(image, 0, 0);\n\n return Context.getImageData(0, 0, image.width, image.height);\n}\n","import {ValueDispatcher} from '../../events';\nimport type {Scene} from '../Scene';\nimport type {SerializedTimeEvent} from './SerializedTimeEvent';\nimport type {TimeEvent} from './TimeEvent';\nimport type {TimeEvents} from './TimeEvents';\n\n/**\n * Manages time events during editing.\n */\nexport class EditableTimeEvents implements TimeEvents {\n public get onChanged() {\n return this.events.subscribable;\n }\n private readonly events = new ValueDispatcher<TimeEvent[]>([]);\n\n private registeredEvents = new Map<string, TimeEvent>();\n private lookup = new Map<string, TimeEvent>();\n private collisionLookup = new Set<string>();\n private previousReference: SerializedTimeEvent[] = [];\n private didEventsChange = false;\n private preserveTiming = true;\n\n public constructor(private readonly scene: Scene) {\n this.previousReference = scene.meta.timeEvents.get();\n this.load(this.previousReference);\n\n scene.onReloaded.subscribe(this.handleReload);\n scene.onRecalculated.subscribe(this.handleRecalculated);\n scene.onReset.subscribe(this.handleReset);\n scene.meta.timeEvents.onChanged.subscribe(this.handleMetaChanged, false);\n }\n\n public set(name: string, offset: number, preserve = true) {\n let event = this.lookup.get(name);\n if (!event || event.offset === offset) {\n return;\n }\n this.preserveTiming = preserve;\n event = {\n ...event,\n targetTime: event.initialTime + offset,\n offset,\n };\n this.lookup.set(name, event);\n this.registeredEvents.set(name, event);\n this.events.current = [...this.registeredEvents.values()];\n this.didEventsChange = true;\n this.scene.reload();\n }\n\n public register(name: string, initialTime: number): number {\n if (this.collisionLookup.has(name)) {\n this.scene.logger.error({\n message: `name \"${name}\" has already been used for another event name.`,\n stack: new Error().stack,\n });\n return 0;\n }\n\n this.collisionLookup.add(name);\n let event = this.lookup.get(name);\n if (!event) {\n this.didEventsChange = true;\n event = {\n name,\n initialTime,\n targetTime: initialTime,\n offset: 0,\n stack: new Error().stack,\n };\n this.lookup.set(name, event);\n } else {\n let changed = false;\n const newEvent = {...event};\n\n const stack = new Error().stack;\n if (newEvent.stack !== stack) {\n newEvent.stack = stack;\n changed = true;\n }\n\n if (newEvent.initialTime !== initialTime) {\n newEvent.initialTime = initialTime;\n changed = true;\n }\n\n const offset = Math.max(0, newEvent.targetTime - newEvent.initialTime);\n if (this.preserveTiming && newEvent.offset !== offset) {\n newEvent.offset = offset;\n changed = true;\n }\n\n const target = newEvent.initialTime + newEvent.offset;\n if (!this.preserveTiming && newEvent.targetTime !== target) {\n this.didEventsChange = true;\n newEvent.targetTime = target;\n changed = true;\n }\n\n if (changed) {\n event = newEvent;\n this.lookup.set(name, event);\n }\n }\n\n this.registeredEvents.set(name, event);\n\n return event.offset;\n }\n\n /**\n * Called when the parent scene gets reloaded.\n */\n private handleReload = () => {\n this.registeredEvents.clear();\n this.collisionLookup.clear();\n };\n\n /**\n * Called when the parent scene gets recalculated.\n */\n private handleRecalculated = () => {\n this.preserveTiming = true;\n this.events.current = [...this.registeredEvents.values()];\n\n if (\n this.didEventsChange ||\n (this.previousReference?.length ?? 0) !== this.events.current.length\n ) {\n this.didEventsChange = false;\n this.previousReference = [...this.registeredEvents.values()].map(\n event => ({\n name: event.name,\n targetTime: event.targetTime,\n }),\n );\n this.scene.meta.timeEvents.set(this.previousReference);\n }\n };\n\n private handleReset = () => {\n this.collisionLookup.clear();\n };\n\n /**\n * Called when the meta of the parent scene changes.\n */\n private handleMetaChanged = (data: SerializedTimeEvent[]) => {\n // Ignore the event if `timeEvents` hasn't changed.\n // This may happen when another part of metadata has changed triggering\n // this event.\n if (data === this.previousReference) return;\n this.previousReference = data;\n this.load(data);\n this.scene.reload();\n };\n\n private load(events: SerializedTimeEvent[]) {\n for (const event of events) {\n if (typeof event.name !== 'string') {\n continue;\n }\n\n const previous = this.lookup.get(event.name) ?? {\n name: event.name,\n initialTime: 0,\n offset: 0,\n };\n\n this.lookup.set(event.name, {\n ...previous,\n targetTime: event.targetTime ?? 0,\n });\n }\n }\n}\n","import {ValueDispatcher} from '../../events';\nimport type {Scene} from '../Scene';\nimport type {TimeEvent} from './TimeEvent';\nimport type {TimeEvents} from './TimeEvents';\n\n/**\n * Manages time events during rendering and presentation.\n */\nexport class ReadOnlyTimeEvents implements TimeEvents {\n public get onChanged() {\n return this.events.subscribable;\n }\n private readonly events = new ValueDispatcher<TimeEvent[]>([]);\n private lookup = new Map<string, number>();\n\n public constructor(private readonly scene: Scene) {\n scene.onReloaded.subscribe(this.handleReload);\n }\n\n public set() {\n // do nothing\n }\n\n public register(name: string, initialTime: number): number {\n let duration = this.lookup.get(name);\n if (duration === undefined) {\n const event = this.scene.meta.timeEvents\n .get()\n .find(event => event.name === name);\n duration = event ? event.targetTime - initialTime : 0;\n this.lookup.set(name, duration);\n }\n\n return duration;\n }\n\n /**\n * Called when the parent scene gets reloaded.\n */\n private handleReload = () => {\n this.lookup.clear();\n };\n}\n","export default `The \\`#include\\` directive requires the use of a preprocessor.\n\nMake sure to import the shader from a file:\n\n\\`\\`\\`ts\nimport shader from './shader.glsl';\n\\`\\`\\`\n\nDo **NOT** use the raw loader:\n\n\\`\\`\\`ts\nimport shader from './shader.glsl?raw';\n\\`\\`\\`\n\nDo **NOT** use \\`#include\\` in an inline string:\n\n\\`\\`\\`ts\nconst shader = \\`\\\\\n#include \"example.glsl\"\n\\`;\n\\`\\`\\`\n\n[Learn more](https://canvascommons.io/docs/shaders) about working with shaders.\n`;\n","import {Logger} from './Logger';\nimport includeWithoutPreprocessor from './__logs__/include-without-preprocessor';\n\nconst SOURCE_URL_REGEX = /^\\/\\/# sourceURL=(.*)$/gm;\nconst INFO_LOG_REGEX = /ERROR: \\d+:(\\d+): (.*)/g;\nconst INFO_TOKEN_REGEX = /^'([^']+)'/;\n\n/**\n * @internal\n */\nexport interface WebGLContextOwner {\n setup(gl: WebGL2RenderingContext): void;\n teardown(gl: WebGL2RenderingContext): void;\n}\n\ninterface WebGLProgramData {\n program: WebGLProgram;\n fragment: WebGLShader;\n vertex: WebGLShader;\n}\n\nexport class SharedWebGLContext {\n private gl: WebGL2RenderingContext | null = null;\n private currentOwner: WebGLContextOwner | null = null;\n private readonly programLookup = new Map<string, WebGLProgramData>();\n\n public constructor(private readonly logger: Logger) {}\n\n public borrow(owner: WebGLContextOwner): WebGL2RenderingContext {\n if (this.currentOwner === owner) {\n return this.gl!;\n }\n\n this.currentOwner?.teardown(this.gl!);\n this.currentOwner = owner;\n this.currentOwner.setup(this.getGL());\n return this.gl!;\n }\n\n /**\n * Dispose the WebGL context to free up resources.\n */\n public dispose() {\n if (!this.gl) {\n return;\n }\n\n this.currentOwner?.teardown(this.gl);\n this.currentOwner = null;\n\n this.gl.useProgram(null);\n for (const {program, fragment, vertex} of this.programLookup.values()) {\n this.gl.deleteProgram(program);\n this.gl.deleteShader(fragment);\n this.gl.deleteShader(vertex);\n }\n\n this.programLookup.clear();\n this.gl.getExtension('WEBGL_lose_context')?.loseContext();\n (this.gl.canvas as HTMLCanvasElement).remove();\n this.gl = null;\n }\n\n public getProgram(fragment: string, vertex: string): WebGLProgram | null {\n const key = `${fragment}#${vertex}`;\n if (this.programLookup.has(key)) {\n return this.programLookup.get(key)!.program;\n }\n\n const gl = this.getGL();\n const fragmentShader = this.getShader(gl.FRAGMENT_SHADER, fragment);\n const vertexShader = this.getShader(gl.VERTEX_SHADER, vertex);\n if (!fragmentShader || !vertexShader) {\n return null;\n }\n\n const program = gl.createProgram()!;\n gl.attachShader(program, fragmentShader);\n gl.attachShader(program, vertexShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n this.logger.error({\n message: 'Failed to initialize the shader program.',\n remarks: gl.getProgramInfoLog(program) ?? undefined,\n stack: new Error().stack,\n });\n gl.deleteProgram(program);\n return null;\n }\n\n this.programLookup.set(key, {\n program,\n fragment: fragmentShader,\n vertex: vertexShader,\n });\n\n return program;\n }\n\n private getShader(type: GLenum, source: string): WebGLShader | null {\n const gl = this.getGL();\n const shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader);\n logGlslError(this.logger, log, source);\n gl.deleteShader(shader);\n return null;\n }\n\n return shader;\n }\n\n private getGL(): WebGL2RenderingContext {\n if (this.gl) {\n return this.gl;\n }\n\n this.gl = document.createElement('canvas').getContext('webgl2', {\n depth: false,\n premultipliedAlpha: false,\n stencil: false,\n powerPreference: 'high-performance',\n });\n if (!this.gl) {\n throw new Error('Failed to initialize WebGL.');\n }\n\n /* NOTE: Temporary debugging code\n const canvas = this.gl.canvas as HTMLCanvasElement;\n document.body.append(canvas);\n canvas.style.position = 'absolute';\n canvas.style.top = '16px';\n canvas.style.right = '16px';\n canvas.style.width = '300px';\n canvas.style.borderRadius = '4px';\n canvas.style.border = '1px solid #ccc';\n canvas.style.backgroundColor = '#141414';\n canvas.style.zIndex = '1000';\n */\n\n return this.gl;\n }\n}\n\nfunction logGlslError(logger: Logger, log: string | null, source: string) {\n let sourceUrl: string | null = null;\n\n SOURCE_URL_REGEX.lastIndex = 0;\n const sourceMatch = SOURCE_URL_REGEX.exec(source);\n if (sourceMatch) {\n const url = new URL(sourceMatch[1], window.location.origin);\n url.searchParams.set('t', Date.now().toString());\n sourceUrl = url.toString();\n }\n\n if (!log) {\n logger.error({\n message: `Unknown shader compilation error.`,\n stack: fakeStackTrace(sourceUrl, 1, 0),\n });\n return null;\n }\n\n let logged = false;\n let result;\n while ((result = INFO_LOG_REGEX.exec(log))) {\n const [, line, message] = result;\n let column = 0;\n const match = message.match(INFO_TOKEN_REGEX);\n if (match) {\n const tokenLine = source.split('\\n')[parseInt(line)! - 1];\n const index = tokenLine.indexOf(match[1]!);\n if (index !== -1) {\n column = index;\n }\n\n if (match[1] === 'include') {\n const line = source\n .split('\\n')\n .find(line => line.startsWith('#include'));\n if (line) {\n logged = true;\n logger.error({\n message: `Shader compilation error: ${message}`,\n remarks: includeWithoutPreprocessor,\n });\n break;\n }\n }\n }\n\n logged = true;\n logger.error({\n message: `Shader compilation error: ${message}`,\n stack: fakeStackTrace(sourceUrl, line, column),\n });\n }\n\n if (!logged) {\n logger.error({\n message: `Shader compilation error: ${log}`,\n stack: fakeStackTrace(sourceUrl, 1, 0),\n });\n }\n}\n\nfunction fakeStackTrace(\n file: string | null,\n line: string | number,\n column: string | number,\n): string | undefined {\n if (!file) {\n return undefined;\n }\n\n return navigator.userAgent.toLowerCase().includes('chrome')\n ? ` at (${file}:${line}:${column})`\n : `@${file}:${line}:${column}`;\n}\n","import {\n AsyncEventDispatcher,\n EventDispatcher,\n ValueDispatcher,\n} from '../events';\nimport {AudioManager, AudioManagerPool, AudioResourceManager} from '../media';\nimport {Scene, Sound} from '../scenes';\nimport {EditableTimeEvents} from '../scenes/timeEvents';\nimport {clamp} from '../tweening';\nimport {Vector2} from '../types';\nimport {Semaphore} from '../utils';\nimport {Logger} from './Logger';\nimport {PlaybackManager, PlaybackState} from './PlaybackManager';\nimport {PlaybackStatus} from './PlaybackStatus';\nimport {Project} from './Project';\nimport {SharedWebGLContext} from './SharedWebGLContext';\n\nexport interface PlayerState extends Record<string, unknown> {\n paused: boolean;\n loop: boolean;\n muted: boolean;\n volume: number;\n speed: number;\n}\n\nexport interface PlayerSettings {\n range: [number, number];\n fps: number;\n size: Vector2;\n audioOffset: number;\n resolutionScale: number;\n}\n\nconst MAX_AUDIO_DESYNC = 1 / 50;\n\n/**\n * The player logic used by the editor and embeddable player.\n *\n * @remarks\n * This class builds on top of the `PlaybackManager` to provide a simple\n * interface similar to other media players. It plays through the animation\n * using a real-time update loop and optionally synchronises it with audio.\n */\nexport class Player {\n /**\n * Triggered during each iteration of the update loop when the frame is ready\n * to be rendered.\n *\n * @remarks\n * Player does not perform any rendering on its own. For the animation to be\n * visible, another class must subscribe to this event and perform the\n * rendering itself. {@link Stage} can be used to display the animation.\n *\n * @eventProperty\n */\n public get onRender() {\n return this.render.subscribable;\n }\n private readonly render = new AsyncEventDispatcher<void>();\n\n public get onStateChanged() {\n return this.playerState.subscribable;\n }\n private readonly playerState: ValueDispatcher<PlayerState>;\n\n public get onFrameChanged() {\n return this.frame.subscribable;\n }\n private readonly frame = new ValueDispatcher(0);\n\n public get onDurationChanged() {\n return this.duration.subscribable;\n }\n private readonly duration = new ValueDispatcher(0);\n\n /**\n * Triggered right after recalculation finishes.\n *\n * @remarks\n * Can be used to provide visual feedback.\n *\n * @eventProperty\n */\n public get onRecalculated() {\n return this.recalculated.subscribable;\n }\n private readonly recalculated = new EventDispatcher<void>();\n\n public readonly playback: PlaybackManager;\n public readonly status: PlaybackStatus;\n public readonly audio: AudioManager;\n public readonly audioPool: AudioManagerPool;\n public readonly audioResources: AudioResourceManager;\n public readonly logger: Logger;\n private readonly sharedWebGLContext: SharedWebGLContext;\n\n private readonly lock = new Semaphore();\n private startTime = 0;\n private endTime = Infinity;\n private requestId: number | null = null;\n private renderTime = 0;\n private requestedSeek = -1;\n private requestedRender = false;\n private requestedRecalculation = true;\n private size: Vector2;\n private resolutionScale: number;\n private active = false;\n\n private get startFrame() {\n return Math.min(\n this.playback.duration,\n this.status.secondsToFrames(this.startTime),\n );\n }\n\n private get endFrame() {\n return Math.min(\n this.playback.duration,\n this.status.secondsToFrames(this.endTime),\n );\n }\n\n private get finished() {\n return this.playback.finished || this.playback.frame >= this.endFrame;\n }\n\n public constructor(\n private project: Project,\n private settings: Partial<PlayerSettings> = {},\n private initialState: Partial<PlayerState> = {},\n private initialFrame = -1,\n ) {\n this.playerState = new ValueDispatcher<PlayerState>({\n loop: true,\n muted: true,\n volume: 1,\n speed: 1,\n ...initialState,\n paused: true,\n });\n\n this.sharedWebGLContext = new SharedWebGLContext(this.project.logger);\n this.requestedSeek = initialFrame;\n this.logger = this.project.logger;\n this.playback = new PlaybackManager();\n this.status = new PlaybackStatus(this.playback);\n this.audioResources = new AudioResourceManager(this.logger);\n this.audioPool = new AudioManagerPool(this.logger, this.audioResources);\n this.audio = this.audioPool.spawn();\n this.size = settings.size ?? new Vector2(1920, 1080);\n this.resolutionScale = settings.resolutionScale ?? 1;\n this.startTime = settings.range?.[0] ?? 0;\n this.endTime = settings.range?.[1] ?? Infinity;\n this.playback.fps = settings.fps ?? 60;\n this.audio.setOffset(settings.audioOffset ?? 0);\n\n if (project.audio) {\n this.audio.setSource(project.audio);\n }\n\n const scenes: Scene[] = [];\n for (const description of project.scenes) {\n const scene = new description.klass({\n ...description,\n playback: this.status,\n logger: this.project.logger,\n size: this.size,\n resolutionScale: this.resolutionScale,\n timeEventsClass: EditableTimeEvents,\n sharedWebGLContext: this.sharedWebGLContext,\n experimentalFeatures: project.experimentalFeatures,\n });\n description.onReplaced?.subscribe(description => {\n scene.reload(description);\n }, false);\n scene.onReloaded.subscribe(() => this.requestRecalculation());\n scene.variables.updateSignals(project.variables ?? {});\n scenes.push(scene);\n }\n this.playback.setup(scenes);\n this.activate();\n }\n\n public async configure(settings: PlayerSettings) {\n await this.lock.acquire();\n let frame = this.playback.frame;\n let recalculate = false;\n this.startTime = settings.range[0];\n this.endTime = settings.range[1];\n const newFps = Math.max(1, settings.fps);\n if (this.playback.fps !== newFps) {\n const ratio = newFps / this.playback.fps;\n this.playback.fps = newFps;\n frame = Math.floor(frame * ratio);\n recalculate = true;\n }\n if (\n !settings.size.exactlyEquals(this.size) ||\n settings.resolutionScale !== this.resolutionScale\n ) {\n this.size = settings.size;\n this.resolutionScale = settings.resolutionScale;\n this.playback.reload({\n size: this.size,\n resolutionScale: this.resolutionScale,\n });\n }\n if (settings.audioOffset !== undefined) {\n this.audio.setOffset(settings.audioOffset);\n }\n\n this.lock.release();\n if (recalculate) {\n this.playback.reload();\n this.frame.current = frame;\n this.requestRecalculation();\n this.requestedSeek = frame;\n }\n }\n\n /**\n * Whether the given frame is inside the animation range.\n *\n * @param frame - The frame to check.\n */\n public isInRange(frame: number): boolean {\n return frame >= 0 && frame <= this.playback.duration;\n }\n\n /**\n * Whether the given frame is inside the user-defined range.\n *\n * @param frame - The frame to check.\n */\n public isInUserRange(frame: number): boolean {\n return frame >= this.startFrame && frame <= this.endFrame;\n }\n\n public requestSeek(value: number): void {\n this.requestedSeek = this.clampRange(value);\n }\n\n public requestPreviousFrame(): void {\n this.requestedSeek = this.frame.current - this.playback.speed;\n }\n\n public requestNextFrame(): void {\n this.requestedSeek = this.frame.current + this.playback.speed;\n }\n\n public requestReset(): void {\n this.requestedSeek = 0;\n }\n\n public requestRender(): void {\n this.requestedRender = true;\n }\n\n public toggleLoop(value = !this.playerState.current.loop) {\n if (value !== this.playerState.current.loop) {\n this.playerState.current = {\n ...this.playerState.current,\n loop: value,\n };\n }\n }\n\n public togglePlayback(\n value: boolean = this.playerState.current.paused,\n ): void {\n // Ensure the AudioContext is resumed by user interaction.\n this.audioPool.resume();\n\n if (value === this.playerState.current.paused) {\n this.playerState.current = {\n ...this.playerState.current,\n paused: !value,\n };\n\n // hitting play after the animation has finished should reset the\n // playback, even if looping is disabled.\n if (\n value &&\n !this.playerState.current.loop &&\n this.playback.frame === this.playback.duration\n ) {\n this.requestReset();\n }\n }\n }\n\n public toggleAudio(value: boolean = this.playerState.current.muted): void {\n if (value === this.playerState.current.muted) {\n this.playerState.current = {\n ...this.playerState.current,\n muted: !value,\n };\n }\n }\n\n public setAudioVolume(value: number): void {\n const clampedValue = clamp(0, 1, value);\n if (clampedValue !== this.playerState.current.volume) {\n this.playerState.current = {\n ...this.playerState.current,\n volume: clampedValue,\n };\n }\n }\n\n public addAudioVolume(value: number): void {\n this.setAudioVolume(this.playerState.current.volume + value);\n }\n\n public setSpeed(value: number) {\n if (value !== this.playerState.current.speed) {\n this.playback.speed = value;\n this.playback.reload();\n this.playerState.current = {\n ...this.playerState.current,\n speed: value,\n };\n this.requestRecalculation();\n }\n }\n\n public setVariables(variables: Record<string, unknown>) {\n for (const scene of this.playback.onScenesRecalculated.current) {\n scene.variables.updateSignals(variables);\n }\n }\n\n /**\n * Activate the player.\n *\n * @remarks\n * A player needs to be active in order for the update loop to run. Each\n * player is active by default.\n */\n public activate() {\n this.active = true;\n this.request();\n }\n\n /**\n * Deactivate the player.\n *\n * @remarks\n * Deactivating the player prevents its update loop from running. This should\n * be done before disposing the player, to prevent it from running in the\n * background.\n *\n * Just pausing the player does not stop the loop.\n */\n public deactivate() {\n this.active = false;\n this.sharedWebGLContext.dispose();\n if (this.requestId !== null) {\n cancelAnimationFrame(this.requestId);\n this.requestId = null;\n }\n }\n\n private requestRecalculation() {\n this.requestedRecalculation = true;\n this.request();\n }\n\n private async prepare(): Promise<\n PlayerState & {seek: number; render: boolean}\n > {\n const state = {\n ...this.playerState.current,\n seek: this.requestedSeek,\n render: this.requestedRender,\n };\n this.requestedSeek = -1;\n this.requestedRender = false;\n\n // Recalculate the project if necessary\n if (this.requestedRecalculation) {\n if (state.seek < 0) {\n state.seek = this.playback.frame;\n }\n try {\n await this.playback.recalculate();\n this.duration.current = this.playback.frame;\n\n const sounds: Sound[] = [];\n for (const scene of this.playback.onScenesRecalculated.current) {\n sounds.push(...scene.sounds.getSounds());\n }\n await this.audioPool.setupPool(sounds);\n\n this.recalculated.dispatch();\n } catch (e) {\n this.requestSeek(state.seek);\n throw e;\n } finally {\n this.requestedRecalculation = false;\n }\n }\n\n // Pause if reached the end or the range is 0\n // Seek to the beginning for non-empty scenes\n if (\n (!state.loop && this.finished && !state.paused && state.seek < 0) ||\n this.endFrame === this.startFrame\n ) {\n this.togglePlayback(false);\n state.paused = true;\n state.seek =\n this.endFrame === this.startFrame ? state.seek : this.startFrame;\n }\n\n // Seek to the beginning if looping is enabled\n if (\n state.loop &&\n (state.seek > this.endFrame || (this.finished && !state.paused)) &&\n this.startFrame !== this.endTime\n ) {\n state.seek = this.startFrame;\n }\n\n // Pause / play sounds.\n this.audioPool.prepare(this.status.time);\n await this.audioPool.setPaused(state.paused || this.finished);\n this.audioPool.setMuted(state.muted);\n this.audioPool.setVolume(state.volume);\n\n // Pause / play audio.\n const audioPaused =\n state.paused || this.finished || !this.audio.isInRange(this.status.time);\n if (await this.audio.setPaused(audioPaused)) {\n this.syncAudio(-3);\n }\n this.audio.setMuted(state.muted);\n this.audio.setVolume(state.volume);\n\n return state;\n }\n\n private async run() {\n const state = await this.prepare();\n const previousState = this.playback.state;\n this.playback.state = state.paused\n ? PlaybackState.Paused\n : PlaybackState.Playing;\n\n // Seek to the given frame\n if (state.seek >= 0 || !this.isInUserRange(this.status.frame)) {\n const seekFrame = state.seek < 0 ? this.status.frame : state.seek;\n const clampedFrame = this.clampRange(seekFrame);\n this.logger.profile('seek time');\n await this.playback.seek(clampedFrame);\n this.logger.profile('seek time');\n this.syncAudio(-3);\n }\n // Do nothing if paused or is ahead of the audio.\n else if (\n state.paused ||\n (state.speed === 1 &&\n this.audio.isReady() &&\n this.audio.isInRange(this.status.time) &&\n this.audio.getTime() < this.status.time)\n ) {\n if (\n state.render ||\n (state.paused && previousState !== PlaybackState.Paused)\n ) {\n await this.render.dispatch();\n }\n\n // Sync the audio if the animation is too far ahead.\n if (\n !state.paused &&\n this.status.time > this.audio.getTime() + MAX_AUDIO_DESYNC\n ) {\n this.syncAudio();\n }\n\n this.request();\n return;\n }\n // Seek to synchronize animation with audio.\n else if (\n this.audio.isReady() &&\n state.speed === 1 &&\n this.audio.isInRange(this.status.time) &&\n this.status.framesToSeconds(this.playback.frame + 1) <\n this.audio.getTime() - MAX_AUDIO_DESYNC\n ) {\n const seekFrame = this.status.secondsToFrames(this.audio.getTime());\n await this.playback.seek(seekFrame);\n }\n // Simply move forward one frame\n else if (this.status.frame < this.endFrame) {\n await this.playback.progress();\n\n if (state.speed !== 1) {\n this.syncAudio();\n }\n }\n\n // Pause if a new slide has just started.\n if (!state.paused && this.playback.currentScene.slides.isWaiting()) {\n this.togglePlayback(false);\n state.paused = true;\n }\n\n // Draw the project\n await this.render.dispatch();\n this.frame.current = this.playback.frame;\n\n this.request();\n }\n\n private request() {\n if (!this.active) return;\n\n this.requestId ??= requestAnimationFrame(async time => {\n this.requestId = null;\n if (time - this.renderTime >= 1000 / (this.status.fps + 5)) {\n this.renderTime = time;\n await this.lock.acquire();\n try {\n await this.run();\n } catch (e: any) {\n this.logger.error(e);\n }\n this.lock.release();\n } else {\n this.request();\n }\n });\n }\n\n public clampRange(frame: number): number {\n return clamp(this.startFrame, this.endFrame, frame);\n }\n\n private syncAudio(frameOffset = 0) {\n const time = this.status.framesToSeconds(this.playback.frame + frameOffset);\n this.audio.setTime(time);\n\n this.audioPool.prepare(time);\n this.audioPool.setTime(time);\n }\n}\n","import {Scene} from '../scenes';\nimport {unwrap} from '../signals';\nimport type {Color} from '../types';\nimport {CanvasColorSpace, Vector2} from '../types';\nimport {getContext} from '../utils';\n\nexport interface StageSettings {\n size: Vector2;\n resolutionScale: number;\n colorSpace: CanvasColorSpace;\n background: Color | string | null;\n}\n\n/**\n * Manages canvases on which an animation can be displayed.\n */\nexport class Stage {\n // TODO Consider adding pooling for canvases.\n\n private background: string | null = null;\n private resolutionScale = 1;\n private colorSpace: CanvasColorSpace = 'srgb';\n private size = Vector2.zero;\n\n public readonly finalBuffer: HTMLCanvasElement;\n private readonly currentBuffer: HTMLCanvasElement;\n private readonly previousBuffer: HTMLCanvasElement;\n\n public context: CanvasRenderingContext2D;\n private currentContext: CanvasRenderingContext2D;\n private previousContext: CanvasRenderingContext2D;\n\n private get canvasSize() {\n return this.size.scale(this.resolutionScale);\n }\n\n public constructor() {\n this.finalBuffer = document.createElement('canvas');\n this.currentBuffer = document.createElement('canvas');\n this.previousBuffer = document.createElement('canvas');\n\n const colorSpace = this.colorSpace;\n this.context = getContext(\n {colorSpace, willReadFrequently: true},\n this.finalBuffer,\n );\n this.currentContext = getContext({colorSpace}, this.currentBuffer);\n this.previousContext = getContext({colorSpace}, this.previousBuffer);\n }\n\n public configure({\n colorSpace = this.colorSpace,\n size = this.size,\n resolutionScale = this.resolutionScale,\n background = this.background,\n }: Partial<StageSettings>) {\n if (colorSpace !== this.colorSpace) {\n this.colorSpace = colorSpace;\n this.context = getContext({colorSpace}, this.finalBuffer);\n this.currentContext = getContext({colorSpace}, this.currentBuffer);\n this.previousContext = getContext({colorSpace}, this.previousBuffer);\n }\n\n if (\n !size.exactlyEquals(this.size) ||\n resolutionScale !== this.resolutionScale\n ) {\n this.resolutionScale = resolutionScale;\n this.size = size;\n this.resizeCanvas(this.context);\n this.resizeCanvas(this.currentContext);\n this.resizeCanvas(this.previousContext);\n }\n\n this.background =\n typeof background === 'string'\n ? background\n : (background?.serialize() ?? null);\n }\n\n public async render(currentScene: Scene, previousScene: Scene | null) {\n const previousOnTop = previousScene\n ? unwrap(currentScene.previousOnTop)\n : false;\n\n if (previousScene) {\n await previousScene.render(this.previousContext);\n }\n\n await currentScene.render(this.currentContext);\n\n const size = this.canvasSize;\n this.context.clearRect(0, 0, size.width, size.height);\n if (this.background) {\n this.context.save();\n this.context.fillStyle = this.background;\n this.context.fillRect(0, 0, size.width, size.height);\n this.context.restore();\n }\n\n if (previousScene && !previousOnTop) {\n this.context.drawImage(this.previousBuffer, 0, 0);\n }\n this.context.drawImage(this.currentBuffer, 0, 0);\n if (previousOnTop) {\n this.context.drawImage(this.previousBuffer, 0, 0);\n }\n }\n\n public resizeCanvas(context: CanvasRenderingContext2D) {\n const size = this.canvasSize;\n context.canvas.width = size.width;\n context.canvas.height = size.height;\n }\n}\n","import {ValueDispatcher} from '../events';\nimport type {Scene, Slide} from '../scenes';\nimport {ReadOnlyTimeEvents} from '../scenes/timeEvents';\nimport {Vector2} from '../types';\nimport {Semaphore} from '../utils';\nimport type {Logger} from './Logger';\nimport {PlaybackManager, PlaybackState} from './PlaybackManager';\nimport {PlaybackStatus} from './PlaybackStatus';\nimport type {Project} from './Project';\nimport {SharedWebGLContext} from './SharedWebGLContext';\nimport {Stage, StageSettings} from './Stage';\n\nexport interface PresenterSettings extends StageSettings {\n name: string;\n fps: number;\n slide: string | null;\n}\n\nexport interface PresenterInfo extends Record<string, unknown> {\n currentSlideId: string | null;\n nextSlideId: string | null;\n hasNext: boolean;\n hasPrevious: boolean;\n isWaiting: boolean;\n count: number;\n index: number | null;\n}\n\nexport enum PresenterState {\n Initial,\n Working,\n Aborting,\n}\n\nconst NextSlide = Symbol('@canvas-commons/core/app/NextSlide');\nconst PreviousSlide = Symbol('@canvas-commons/core/app/PreviousSlide');\n\nexport class Presenter {\n public get onStateChanged() {\n return this.state.subscribable;\n }\n private readonly state = new ValueDispatcher(PresenterState.Initial);\n\n public get onInfoChanged() {\n return this.info.subscribable;\n }\n private readonly info = new ValueDispatcher<PresenterInfo>({\n currentSlideId: null,\n nextSlideId: null,\n hasNext: false,\n hasPrevious: false,\n isWaiting: false,\n index: null,\n count: 0,\n });\n\n public get onSlidesChanged() {\n return this.slides.subscribable;\n }\n private readonly slides = new ValueDispatcher<Slide[]>([]);\n\n public readonly stage = new Stage();\n\n private readonly lock = new Semaphore();\n public readonly playback: PlaybackManager;\n private readonly status: PlaybackStatus;\n private readonly logger: Logger;\n private readonly sharedWebGLContext: SharedWebGLContext;\n private abortController: AbortController | null = null;\n private renderTime = 0;\n private requestId: number | null = null;\n private requestedResume = false;\n private requestedSlide:\n | string\n | typeof NextSlide\n | typeof PreviousSlide\n | null = null;\n\n public constructor(private project: Project) {\n this.logger = project.logger;\n this.playback = new PlaybackManager();\n this.status = new PlaybackStatus(this.playback);\n this.sharedWebGLContext = new SharedWebGLContext(this.logger);\n const scenes: Scene[] = [];\n for (const description of project.scenes) {\n const scene = new description.klass({\n ...description,\n meta: description.meta.clone(),\n logger: this.logger,\n playback: this.status,\n size: new Vector2(1920, 1080),\n resolutionScale: 1,\n timeEventsClass: ReadOnlyTimeEvents,\n sharedWebGLContext: this.sharedWebGLContext,\n experimentalFeatures: project.experimentalFeatures,\n });\n scenes.push(scene);\n }\n this.playback.setup(scenes);\n }\n\n /**\n * Present the animation.\n *\n * @param settings - The presentation settings.\n */\n public async present(settings: PresenterSettings) {\n if (this.state.current !== PresenterState.Initial) return;\n await this.lock.acquire();\n this.state.current = PresenterState.Working;\n try {\n this.abortController = new AbortController();\n await this.run(settings, this.abortController.signal);\n } catch (e: any) {\n this.project.logger.error(e);\n }\n\n this.sharedWebGLContext.dispose();\n this.state.current = PresenterState.Initial;\n this.lock.release();\n }\n\n /**\n * Abort the ongoing presentation process.\n */\n public abort() {\n if (this.state.current === PresenterState.Initial) return;\n this.abortController?.abort();\n this.state.current = PresenterState.Aborting;\n }\n\n /**\n * Resume the presentation if waiting for the next slide.\n */\n public resume() {\n this.requestedResume = true;\n }\n\n public requestFirstSlide() {\n const first = this.playback.slides[0];\n if (first) {\n this.requestedSlide = first.id;\n }\n }\n\n public requestLastSlide() {\n const last = this.playback.slides.at(-1);\n if (last) {\n this.requestedSlide = last.id;\n }\n }\n\n public requestPreviousSlide() {\n this.requestedSlide = PreviousSlide;\n }\n\n public requestNextSlide() {\n this.requestedSlide = NextSlide;\n }\n\n public requestSlide(id: string) {\n this.requestedSlide = id;\n }\n\n private async run(settings: PresenterSettings, signal: AbortSignal) {\n this.stage.configure(settings);\n this.playback.fps = settings.fps;\n\n await this.reloadScenes(settings);\n if (signal.aborted) return;\n this.playback.state = PlaybackState.Playing;\n await this.playback.recalculate();\n if (signal.aborted) return;\n this.slides.current = this.playback.slides;\n this.playback.state = PlaybackState.Presenting;\n await this.playback.reset();\n if (signal.aborted) return;\n\n if (settings.slide) {\n await this.playback.goTo(settings.slide);\n if (signal.aborted) return;\n }\n\n await new Promise(resolve => {\n signal.addEventListener('abort', resolve);\n this.request();\n });\n }\n\n private async reloadScenes(settings: PresenterSettings) {\n for (let i = 0; i < this.project.scenes.length; i++) {\n const description = this.project.scenes[i];\n const scene = this.playback.onScenesRecalculated.current[i];\n scene.reload({\n config: description.onReplaced.current.config,\n size: settings.size,\n resolutionScale: settings.resolutionScale,\n });\n scene.meta.set(description.meta.get());\n scene.variables.updateSignals(this.project.variables ?? {});\n }\n }\n\n private async loop() {\n const slide = this.requestedSlide;\n const resume = this.requestedResume;\n this.requestedResume = false;\n this.requestedSlide = null;\n\n // Resume the presentation\n if (resume) {\n this.playback.currentScene.slides.resume();\n }\n\n // Seek to the given slide\n if (slide !== null) {\n this.logger.profile('slide time');\n this.playback.state = PlaybackState.Playing;\n if (slide === PreviousSlide) {\n await this.playback.goBack();\n } else if (slide === NextSlide) {\n await this.playback.goForward();\n } else {\n await this.playback.goTo(slide);\n }\n this.logger.profile('slide time');\n }\n\n // Move forward one frame\n else if (!this.playback.finished) {\n this.playback.state = PlaybackState.Presenting;\n await this.playback.progress();\n }\n\n // Draw the project\n await this.stage.render(\n this.playback.currentScene,\n this.playback.previousScene,\n );\n\n if (!this.abortController?.signal.aborted) {\n this.updateInfo();\n this.request();\n }\n }\n\n private request() {\n if (this.abortController?.signal.aborted) {\n return;\n }\n\n this.requestId ??= requestAnimationFrame(async time => {\n this.requestId = null;\n if (time - this.renderTime >= 1000 / (this.status.fps + 5)) {\n this.renderTime = time;\n try {\n await this.loop();\n } catch (e: any) {\n this.logger.error(e);\n this.abortController?.abort();\n }\n } else {\n this.request();\n }\n });\n }\n\n private updateInfo() {\n const slides = this.playback.currentScene.slides;\n const currentSlide = slides.getCurrent() ?? null;\n const index = this.playback.slides.indexOf(currentSlide!);\n\n const info: PresenterInfo = {\n currentSlideId: currentSlide?.id ?? null,\n nextSlideId: this.playback.slides[index + 1]?.id ?? null,\n hasNext: index !== null && index < this.playback.slides.length - 1,\n hasPrevious: index !== null && index > 0,\n isWaiting: slides.isWaiting(),\n count: this.playback.slides.length,\n index,\n };\n\n for (const [key, value] of Object.entries(info)) {\n if (this.info.current[key] !== value) {\n this.info.current = info;\n break;\n }\n }\n }\n}\n","import type {Plugin} from '../plugin';\nimport {FullSceneDescription} from '../scenes';\nimport {Logger} from './Logger';\nimport type {ProjectMetadata} from './ProjectMetadata';\nimport {SettingsMetadata} from './SettingsMetadata';\n\nexport interface ProjectSettings {\n /**\n * The name of the project.\n */\n name?: string;\n\n /**\n * A list of scene descriptions that make up the project.\n *\n * @remarks\n * A full scene description can be obtained by loading a scene module with a\n * `?scene` query parameter.\n *\n * @example\n * ```ts\n * import exampleScene from './example?scene';\n *\n * export default makeProject({\n * scenes: [exampleScene],\n * });\n * ```\n */\n scenes: FullSceneDescription[];\n\n /**\n * A list of plugins to include in the project.\n *\n * @remarks\n * When a string is provided, the plugin will be imported dynamically using\n * the string as the module specifier. This is the preferred way to include\n * editor plugins because it makes sure that the plugin's source code gets\n * excluded from the production build.\n */\n plugins?: (Plugin | string)[];\n\n /**\n * A custom logger instance to use.\n */\n logger?: Logger;\n\n /**\n * An url for the audio track to play alongside the animation.\n *\n * @see https://canvascommons.io/docs/media#audio\n */\n audio?: string;\n\n /**\n * @deprecated Configure the offset in the Video Settings tab of th editor.\n */\n audioOffset?: number;\n\n /**\n * Default values for project variables.\n *\n * @see https://canvascommons.io/docs/project-variables\n */\n variables?: Record<string, unknown>;\n\n /**\n * Enable experimental features.\n *\n * @see https://canvascommons.io/docs/experimental\n *\n * @experimental\n */\n experimentalFeatures?: boolean;\n}\n\nexport interface Versions {\n core: string;\n two: string | null;\n ui: string | null;\n vitePlugin: string | null;\n}\n\nexport interface Project {\n name: string;\n scenes: FullSceneDescription[];\n plugins: Plugin[];\n logger: Logger;\n meta: ProjectMetadata;\n settings: SettingsMetadata;\n audio?: string;\n variables?: Record<string, unknown>;\n versions: Versions;\n experimentalFeatures: boolean;\n}\n\nexport function makeProject(settings: ProjectSettings) {\n return settings;\n}\n","import {ValueDispatcher} from '../events';\nimport {clamp} from '../tweening';\n\n/**\n * An estimate of the time remaining until the process is finished.\n */\nexport interface TimeEstimate {\n /**\n * The completion percentage ranging from `0` to `1`.\n */\n completion: number;\n /**\n * The time passed since the beginning of the process in milliseconds.\n */\n elapsed: number;\n /**\n * The estimated time remaining until the process is finished in milliseconds.\n */\n eta: number;\n}\n\n/**\n * Calculates the estimated time remaining until a process is finished.\n */\nexport class TimeEstimator {\n public get onCompletionChanged() {\n return this.completion.subscribable;\n }\n private readonly completion = new ValueDispatcher(0);\n private startTimestamp = 0;\n private lastUpdateTimestamp = 0;\n private nextCompletion = 0;\n\n /**\n * Get the current time estimate.\n *\n * @param timestamp - The timestamp to calculate the estimate against.\n * Defaults to `performance.now()`.\n */\n public estimate(timestamp = performance.now()): TimeEstimate {\n const elapsed = timestamp - this.startTimestamp;\n const completion = this.completion.current;\n\n let eta = Infinity;\n if (completion >= 1) {\n eta = 0;\n } else if (completion > 0) {\n const lastUpdateDuration = this.lastUpdateTimestamp - this.startTimestamp;\n eta = lastUpdateDuration / completion - elapsed;\n eta = Math.max(0, eta);\n } else if (this.nextCompletion > 0) {\n eta = elapsed / this.nextCompletion - elapsed;\n }\n\n return {completion, elapsed, eta};\n }\n\n /**\n * Update the completion percentage.\n *\n * @param completion - The completion percentage ranging from `0` to `1`.\n * @param timestamp - A timestamp at which the process was updated.\n * Defaults to `performance.now()`.\n */\n public update(completion: number, timestamp = performance.now()) {\n this.completion.current = clamp(0, 1, completion);\n this.lastUpdateTimestamp = timestamp;\n }\n\n /**\n * Reset the estimator.\n *\n * @param nextCompletion - If known, the completion percentage of the next\n * update.\n * @param timestamp - A timestamp at which the process started.\n * Defaults to `performance.now()`.\n */\n public reset(nextCompletion = 0, timestamp = performance.now()) {\n this.startTimestamp = timestamp;\n this.lastUpdateTimestamp = timestamp;\n this.completion.current = 0;\n this.nextCompletion = nextCompletion;\n }\n}\n","import {EventDispatcher, ValueDispatcher} from '../events';\nimport type {Scene, Sound} from '../scenes';\nimport {ReadOnlyTimeEvents} from '../scenes/timeEvents';\nimport {clampRemap} from '../tweening';\nimport {Vector2} from '../types';\nimport {Semaphore} from '../utils';\nimport type {Exporter} from './Exporter';\nimport {PlaybackManager, PlaybackState} from './PlaybackManager';\nimport {PlaybackStatus} from './PlaybackStatus';\nimport type {Project} from './Project';\nimport {SharedWebGLContext} from './SharedWebGLContext';\nimport {Stage, StageSettings} from './Stage';\nimport {TimeEstimator} from './TimeEstimator';\n\nexport interface RendererSettings extends StageSettings {\n name: string;\n range: [number, number];\n fps: number;\n exporter: {\n name: string;\n options: unknown;\n };\n}\n\nexport enum RendererState {\n Initial,\n Working,\n Aborting,\n}\n\nexport enum RendererResult {\n Success,\n Error,\n Aborted,\n}\n\n/**\n * The rendering logic used by the editor to export animations.\n *\n * @remarks\n * This class uses the `PlaybackManager` to render animations. In contrast to a\n * player, a renderer does not use an update loop. It plays through the\n * animation as fast as it can, occasionally pausing to keep the UI responsive.\n *\n * The actual exporting is outsourced to an {@link Exporter}.\n */\nexport class Renderer {\n public get onStateChanged() {\n return this.state.subscribable;\n }\n private readonly state = new ValueDispatcher(RendererState.Initial);\n\n public get onFinished() {\n return this.finished.subscribable;\n }\n private readonly finished = new EventDispatcher<RendererResult>();\n\n public get onFrameChanged() {\n return this.frame.subscribable;\n }\n private readonly frame = new ValueDispatcher(0);\n\n public readonly stage = new Stage();\n public readonly estimator = new TimeEstimator();\n\n private readonly lock = new Semaphore();\n private readonly playback: PlaybackManager;\n private readonly status: PlaybackStatus;\n private readonly sharedWebGLContext: SharedWebGLContext;\n private exporter: Exporter | null = null;\n private abortController: AbortController | null = null;\n\n public constructor(private project: Project) {\n this.playback = new PlaybackManager();\n this.status = new PlaybackStatus(this.playback);\n this.sharedWebGLContext = new SharedWebGLContext(this.project.logger);\n const scenes: Scene[] = [];\n for (const description of project.scenes) {\n const scene = new description.klass({\n ...description,\n meta: description.meta.clone(),\n logger: this.project.logger,\n playback: this.status,\n size: new Vector2(1920, 1080),\n resolutionScale: 1,\n timeEventsClass: ReadOnlyTimeEvents,\n sharedWebGLContext: this.sharedWebGLContext,\n experimentalFeatures: project.experimentalFeatures,\n });\n scenes.push(scene);\n }\n this.playback.setup(scenes);\n }\n\n /**\n * Render the animation using the provided settings.\n *\n * @param settings - The rendering settings.\n */\n public async render(settings: RendererSettings) {\n if (this.state.current !== RendererState.Initial) return;\n await this.lock.acquire();\n this.estimator.reset();\n this.state.current = RendererState.Working;\n let result: RendererResult;\n try {\n this.abortController = new AbortController();\n result = await this.run(settings, this.abortController.signal);\n } catch (e: any) {\n this.project.logger.error(e);\n result = RendererResult.Error;\n if (this.exporter) {\n try {\n await this.exporter.stop?.(result);\n } catch (_) {\n // do nothing\n }\n this.exporter = null;\n }\n }\n\n this.estimator.update(1);\n this.state.current = RendererState.Initial;\n this.finished.dispatch(result);\n this.sharedWebGLContext.dispose();\n this.lock.release();\n }\n\n /**\n * Abort the ongoing render process.\n */\n public abort() {\n if (this.state.current !== RendererState.Working) return;\n this.abortController?.abort();\n this.state.current = RendererState.Aborting;\n }\n\n /**\n * Export an individual frame.\n *\n * @remarks\n * This method always uses the default `ImageExporter`.\n *\n * @param settings - The rendering settings.\n * @param time - The timestamp to export.\n */\n public async renderFrame(settings: RendererSettings, time: number) {\n await this.lock.acquire();\n\n try {\n const frame = this.status.secondsToFrames(time);\n this.stage.configure(settings);\n this.playback.fps = settings.fps;\n this.playback.state = PlaybackState.Rendering;\n\n await this.reloadScenes(settings);\n await this.playback.reset();\n await this.playback.seek(frame);\n await this.stage.render(\n this.playback.currentScene!,\n this.playback.previousScene,\n );\n\n if (import.meta.hot) {\n import.meta.hot.send('canvas-commons:export', {\n frame,\n name: frame.toString().padStart(6, '0'),\n data: this.stage.finalBuffer.toDataURL('image/png'),\n mimeType: 'image/png',\n subDirectories: ['still', this.project.name],\n });\n }\n } catch (e: any) {\n this.project.logger.error(e);\n }\n\n this.lock.release();\n }\n\n private async run(\n settings: RendererSettings,\n signal: AbortSignal,\n ): Promise<RendererResult> {\n const exporterClass = this.project.meta.rendering.exporter.exporters.find(\n exporter => exporter.id === settings.exporter.name,\n );\n if (!exporterClass) {\n this.project.logger.error(\n `Could not find the \"${settings.exporter.name}\" exporter.`,\n );\n return RendererResult.Error;\n }\n\n this.exporter = await exporterClass.create(this.project, settings);\n if (this.exporter.configuration) {\n settings = {\n ...settings,\n ...((await this.exporter.configuration()) ?? {}),\n };\n }\n this.stage.configure(settings);\n this.playback.fps = settings.fps;\n this.playback.state = PlaybackState.Rendering;\n const from = this.status.secondsToFrames(settings.range[0]);\n this.frame.current = from;\n\n await this.reloadScenes(settings);\n await this.playback.recalculate();\n if (signal.aborted) return RendererResult.Aborted;\n\n const sounds = this.collectSounds();\n await this.playback.reset();\n if (signal.aborted) return RendererResult.Aborted;\n\n const to = Math.min(\n this.playback.duration,\n this.status.secondsToFrames(settings.range[1]),\n );\n await this.playback.seek(from);\n if (signal.aborted) return RendererResult.Aborted;\n\n await this.exporter.start?.(sounds, to - from);\n let lastRefresh = performance.now();\n let result = RendererResult.Success;\n try {\n this.estimator.reset(1 / (to - from));\n await this.exportFrame(signal);\n this.estimator.update(clampRemap(from, to, 0, 1, this.playback.frame));\n\n if (signal.aborted) {\n result = RendererResult.Aborted;\n } else {\n let finished = false;\n while (!finished) {\n await this.playback.progress();\n await this.exportFrame(signal);\n this.estimator.update(\n clampRemap(from, to, 0, 1, this.playback.frame),\n );\n if (performance.now() - lastRefresh > 1 / 30) {\n lastRefresh = performance.now();\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n if (this.playback.finished || this.playback.frame >= to) {\n finished = true;\n }\n if (signal.aborted) {\n result = RendererResult.Aborted;\n finished = true;\n }\n }\n }\n } catch (e: any) {\n this.project.logger.error(e);\n result = RendererResult.Error;\n }\n\n await this.exporter.stop?.(result);\n this.exporter = null;\n return result;\n }\n\n private async reloadScenes(settings: RendererSettings) {\n for (let i = 0; i < this.project.scenes.length; i++) {\n const description = this.project.scenes[i];\n const scene = this.playback.onScenesRecalculated.current[i];\n scene.reload({\n config: description.onReplaced.current.config,\n size: settings.size,\n resolutionScale: settings.resolutionScale,\n });\n scene.meta.set(description.meta.get());\n scene.variables.updateSignals(this.project.variables ?? {});\n }\n }\n\n private collectSounds() {\n const sounds: Sound[] = [];\n for (const scene of this.playback.onScenesRecalculated.current) {\n sounds.push(...scene.sounds.getSounds());\n }\n return sounds;\n }\n\n private async exportFrame(signal: AbortSignal) {\n this.frame.current = this.playback.frame;\n await this.stage.render(\n this.playback.currentScene!,\n this.playback.previousScene,\n );\n\n const sceneFrame =\n this.playback.frame - this.playback.currentScene.firstFrame;\n await this.exporter!.handleFrame(\n this.stage.finalBuffer,\n this.playback.frame,\n sceneFrame,\n this.playback.currentScene.name,\n signal,\n this.stage.context,\n );\n }\n}\n","import {LogLevel, LogPayload} from '../app';\nimport experimentalFeatures from './__logs__/experimental-features';\n\nexport function experimentalLog(message: string, remarks?: string): LogPayload {\n return {\n level: LogLevel.Error,\n message,\n remarks: (remarks ?? '') + experimentalFeatures,\n };\n}\n","export function getContext(\n options?: CanvasRenderingContext2DSettings,\n canvas: HTMLCanvasElement = document.createElement('canvas'),\n): CanvasRenderingContext2D {\n const context = canvas.getContext('2d', options);\n if (!context) {\n throw new Error('Could not create a 2D context.');\n }\n return context;\n}\n","/**\n * A constant for converting radians to degrees\n *\n * @example\n * const degrees = 0.6 * RAD2DEG;\n */\nexport const RAD2DEG = 180 / Math.PI;\n\n/**\n * A constant for converting degrees to radians\n *\n * @example\n * const radians = 30 * DEG2RAD;\n */\nexport const DEG2RAD = Math.PI / 180;\n","/**\n * Utility to redirect remote sources via Proxy\n *\n * This utility is used to rewrite a request to be routed through\n * the Proxy instead.\n */\n\nimport {useLogger} from './useScene';\n\n/**\n * Route the given url through a local proxy.\n *\n * @example\n * This rewrites a remote url like `https://via.placeholder.com/300.png/09f/fff`\n * into a URI-Component-Encoded string like\n * `/cors-proxy/https%3A%2F%2Fvia.placeholder.com%2F300.png%2F09f%2Ffff`\n */\nexport function viaProxy(url: string) {\n if (!isProxyEnabled()) {\n // Proxy is disabled, so we just pass as-is.\n return url;\n }\n\n if (url.startsWith('/cors-proxy/')) {\n // Already proxied, return as-is\n return url;\n }\n\n // window.location.hostname is being passed here to ensure that\n // this does not throw an Error for same-origin requests\n // e.g. /some/image -> localhost:9000/some/image\n const selfUrl = new URL(window.location.toString());\n // inside a try-catch in case the URL cannot be understood\n try {\n const expandedUrl = new URL(url, selfUrl);\n if (!expandedUrl.protocol.startsWith('http')) {\n // this is probably some embedded image (e.g. image/png;base64).\n // don't touch and pass as is\n return url;\n }\n if (selfUrl.host === expandedUrl.host) {\n // This is a request to a \"local\" resource.\n // No need to rewrite\n return url;\n }\n\n // Check if the host matches the Allow List.\n // if not, no rewrite takes place.\n // will fail in the Editor if the\n // remote host does not accept anonymous\n if (!isInsideAllowList(expandedUrl.host)) {\n return url;\n }\n } catch (_) {\n // in case of error just silently pass as-is\n return url;\n }\n\n // Everything else is a \"remote\" resource and requires a rewrite.\n return `/cors-proxy/${encodeURIComponent(url)}`;\n}\n\n/**\n * Check the provided host is allowed to be routed\n * to the Proxy.\n */\nfunction isInsideAllowList(host: string) {\n const allowList = getAllowList();\n if (allowList.length === 0) {\n // Allow List defaults to allow all if empty\n return true;\n }\n for (const entry of allowList) {\n if (entry.toLowerCase().trim() === host) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if the proxy is enabled via the plugin by checking\n * for `import.meta.env.VITE_MC_PROXY_ENABLED`\n *\n * @remarks The value can either be 'true' of 'false'\n * (as strings) if present, or be undefined if not run\n * from a vite context or run without the MC Plugin.\n */\nexport function isProxyEnabled() {\n if (import.meta.env) {\n return import.meta.env.VITE_MC_PROXY_ENABLED === 'true';\n }\n return false;\n}\n\n/**\n * Cached value so getAllowList does not\n * try to parse the Env var on every call,\n * spamming the console in the process\n */\nlet AllowListCache: string[] | undefined = undefined;\n/**\n * Return the list of allowed hosts\n * from the Plugin Config\n */\nfunction getAllowList() {\n // Condition should get optimized away for Prod\n if (import.meta.env.VITEST !== 'true') {\n if (AllowListCache) {\n return [...AllowListCache];\n }\n }\n\n // Inline function gets immediately invoked\n // and the result stored in getAllowListCache.\n // The cached value is used on subsequent requests.\n const result = (function () {\n if (!isProxyEnabled() || !import.meta.env) {\n return [];\n }\n\n // This value is encoded as a JSON String.\n const valueJson = import.meta.env.VITE_MC_PROXY_ALLOW_LIST ?? '[]';\n const parsedJson = JSON.parse(valueJson);\n // Do an additional check that only strings are present,\n // create a warning and ignore the value\n if (!Array.isArray(parsedJson)) {\n useLogger().error(\n 'Parsed Allow List expected to be an Array, but is ' +\n typeof parsedJson,\n );\n }\n const validatedEntries = [];\n for (const entry of parsedJson) {\n if (typeof entry !== 'string') {\n useLogger().warn(\n 'Unexpected Value in Allow List: ' +\n entry +\n '. Expected a String. Skipping.',\n );\n continue;\n }\n validatedEntries.push(entry);\n }\n return validatedEntries;\n })();\n AllowListCache = result;\n return [...AllowListCache];\n}\n","/**\n * Create an array containing a range of numbers.\n *\n * @example\n * ```ts\n * const array1 = range(3); // [0, 1, 2]\n * const array2 = range(-3); // [0, -1, -2]\n * ```\n *\n * @param length - The length of the array.\n */\nexport function range(length: number): number[];\n/**\n * Create an array containing a range of numbers.\n *\n * @example\n * ```ts\n * const array1 = range(3, 7); // [3, 4, 5, 6]\n * const array2 = range(7, 3); // [7, 6, 5, 4]\n * ```\n *\n * @param from - The start of the range.\n * @param to - The end of the range. `to` itself is not included in the result.\n */\nexport function range(from: number, to: number): number[];\n/**\n * Create an array containing a range of numbers.\n *\n * @example\n * ```ts\n * const array1 = range(1, 2, 0.25); // [1, 1.25, 1.5, 1.75]\n * const array2 = range(2, 1, -0.25); // [2, 1.75, 1.5, 1.25]\n * ```\n *\n * @param from - The start of the range.\n * @param to - The end of the range. `to` itself is not included in the result.\n * @param step - The value by which to increment or decrement.\n */\nexport function range(from: number, to: number, step: number): number[];\nexport function range(first: number, second?: number, step?: number): number[] {\n let from = 0;\n let to = first;\n if (second !== undefined) {\n from = first;\n to = second;\n }\n\n step = step === undefined ? (from < to ? 1 : -1) : step;\n\n const array = [];\n let length = Math.max(Math.ceil((to - from) / step), 0);\n let index = 0;\n\n while (length--) {\n array[index++] = from;\n from += step;\n }\n\n return array;\n}\n","/**\n * A simple semaphore implementation with a capacity of 1.\n *\n * @internal\n */\nexport class Semaphore {\n private resolveCurrent: (() => void) | null = null;\n private current: Promise<void> | null = null;\n\n public async acquire() {\n while (this.current) {\n await this.current;\n }\n this.current = new Promise(resolve => {\n this.resolveCurrent = resolve;\n });\n }\n\n public release() {\n this.current = null;\n this.resolveCurrent?.();\n this.resolveCurrent = null;\n }\n}\n","import {useScene} from './useScene';\n\n/**\n * Provide a function to access the Context2D before the scene is rendered.\n *\n * @param callback - The function that will be provided the context before render.\n */\nexport function useContext(\n callback: (ctx: CanvasRenderingContext2D) => void,\n): () => void {\n return useScene().lifecycleEvents.onBeginRender.subscribe(callback);\n}\n\n/**\n * Provide a function to access the Context2D after the scene is rendered.\n *\n * @param callback - The function that will be provided the context after render.\n */\nexport function useContextAfter(\n callback: (ctx: CanvasRenderingContext2D) => void,\n): () => void {\n return useScene().lifecycleEvents.onFinishRender.subscribe(callback);\n}\n","import {useScene} from './useScene';\nimport {useThread} from './useThread';\n\n/**\n * Register a time event and get its duration in seconds.\n *\n * @remarks\n * This can be used to better specify when an animation should start\n * as well as how long this animation should take\n *\n * @example\n * ```ts\n * export default makeScene2D(function* (view) {\n * const circle = createRef<Circle>();\n *\n * view.add(\n * <Circle ref={circle} width={320} height={320} fill={'lightseagreen'} />,\n * );\n *\n * yield* circle().scale(2, useDuration('circleGrow'));\n * });\n * ```\n *\n * @param name - The name of the event.\n *\n * @returns The duration of the event in seconds.\n */\nexport function useDuration(name: string): number {\n const scene = useScene();\n const thread = useThread();\n return scene.timeEvents.register(name, thread.time());\n}\n","import {PlaybackStatus} from '../app';\n\nconst PlaybackStack: PlaybackStatus[] = [];\n\n/**\n * Get a reference to the playback status.\n */\nexport function usePlayback() {\n const playback = PlaybackStack.at(-1);\n if (!playback) {\n throw new Error('The playback is not available in the current context.');\n }\n return playback;\n}\n\nexport function startPlayback(playback: PlaybackStatus) {\n PlaybackStack.push(playback);\n}\n\nexport function endPlayback(playback: PlaybackStatus) {\n if (PlaybackStack.pop() !== playback) {\n throw new Error('startPlayback/endPlayback were called out of order.');\n }\n}\n","export function decorate(fn: Callback, ...decorators: MethodDecorator[]) {\n const target = {[fn.name]: fn};\n const descriptor = Object.getOwnPropertyDescriptor(target, fn.name);\n if (descriptor) {\n for (let i = decorators.length - 1; i >= 0; i--) {\n decorators[i](target, fn.name, descriptor);\n }\n }\n}\n","const UNINITIALIZED = Symbol.for(\n '@canvas-commons/core/decorators/UNINITIALIZED',\n);\n\n/**\n * Create a lazy decorator.\n *\n * @remarks\n * A property marked as lazy will not be initialized until it's requested for\n * the first time. Lazy properties are read-only.\n *\n * Must be used for any static properties that require the DOM API to be\n * initialized.\n *\n * @param factory - A function that returns the value of this property.\n */\nexport function lazy(factory: () => unknown): PropertyDecorator {\n return (target, propertyKey) => {\n let value: unknown = UNINITIALIZED;\n Object.defineProperty(target, propertyKey, {\n get(): any {\n if (value === UNINITIALIZED) {\n value = factory.call(this);\n }\n return value;\n },\n });\n };\n}\n","export function threadable(customName?: string): MethodDecorator {\n return function (\n _: unknown,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ) {\n descriptor.value.prototype.name = customName ?? propertyKey;\n descriptor.value.prototype.threadable = true;\n };\n}\n","import {useThread} from '../utils';\nimport {ThreadGenerator} from './ThreadGenerator';\n\n/**\n * Cancel all listed tasks.\n *\n * Example:\n * ```ts\n * const task = yield generatorFunction();\n *\n * // do something concurrently\n *\n * yield* cancel(task);\n * ```\n *\n * @param tasks - A list of tasks to cancel.\n */\nexport function cancel(...tasks: ThreadGenerator[]) {\n const thread = useThread();\n for (const task of tasks) {\n const child = thread.children.find(thread => thread.runner === task);\n if (child && !child.canceled) {\n child.cancel();\n child.time(thread.time());\n }\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport {useThread} from '../utils';\nimport {Thread} from './Thread';\nimport {ThreadGenerator} from './ThreadGenerator';\n\ndecorate(join, threadable());\n/**\n * Pause the current generator until all listed tasks are finished.\n *\n * @example\n * ```ts\n * const task = yield generatorFunction();\n *\n * // do something concurrently\n *\n * yield* join(task);\n * ```\n *\n * @param tasks - A list of tasks to join.\n */\nexport function join(...tasks: ThreadGenerator[]): ThreadGenerator;\n/**\n * Pause the current generator until listed tasks are finished.\n *\n * @example\n * ```ts\n * const taskA = yield generatorFunctionA();\n * const taskB = yield generatorFunctionB();\n *\n * // do something concurrently\n *\n * // await any of the tasks\n * yield* join(false, taskA, taskB);\n * ```\n *\n * @param all - Whether we should wait for all tasks or for at least one.\n * @param tasks - A list of tasks to join.\n */\nexport function join(\n all: boolean,\n ...tasks: ThreadGenerator[]\n): ThreadGenerator;\nexport function* join(\n first: ThreadGenerator | boolean,\n ...tasks: ThreadGenerator[]\n): ThreadGenerator {\n let all = true;\n if (typeof first === 'boolean') {\n all = first;\n } else {\n tasks.push(first);\n }\n\n const parent = useThread();\n const threads = <Thread[]>(\n tasks\n .map(task => parent.children.find(thread => thread.runner === task))\n .filter(thread => thread)\n );\n\n const startTime = parent.time();\n let childTime;\n if (all) {\n while (threads.find(thread => !thread.canceled)) {\n yield;\n }\n childTime = Math.max(...threads.map(thread => thread.time()));\n } else {\n while (!threads.find(thread => thread.canceled)) {\n yield;\n }\n const canceled = threads.filter(thread => thread.canceled);\n childTime = Math.min(...canceled.map(thread => thread.time()));\n }\n\n parent.time(Math.max(startTime, childTime));\n}\n","export function setTaskName(task: Generator, source: Generator | string): void {\n const prototype = Object.getPrototypeOf(task);\n if (!prototype.threadable) {\n prototype.threadable = true;\n prototype.name = typeof source === 'string' ? source : getTaskName(source);\n }\n}\n\nexport function getTaskName(task: Generator): string {\n return Object.getPrototypeOf(task).name ?? null;\n}\n","import {useThread} from '../utils';\nimport {ThreadGenerator} from './ThreadGenerator';\n\n/**\n * Run the given task concurrently.\n *\n * @example\n * Using an existing task:\n * ```ts\n * spawn(rect().opacity(1, 1));\n * ```\n * Using a generator function:\n * ```ts\n * spawn(function* () {\n * yield* rect().opacity(1, 1);\n * yield* waitFor('click');\n * yield* rect().opacity(0, 1);\n * });\n * ```\n * Await the spawned task:\n * ```ts\n * const task = spawn(rect().opacity(1, 1));\n * // do some other things\n * yield* join(task); // await the task\n * ```\n *\n * @param task - Either a generator function or a task to run.\n */\nexport function spawn(\n task: ThreadGenerator | (() => ThreadGenerator),\n): ThreadGenerator {\n return useThread().root.spawn(task);\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator, join} from '../threading';\n\ndecorate(all, threadable());\n/**\n * Run all tasks concurrently and wait for all of them to finish.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield* all(\n * rect.fill('#ff0000', 2),\n * rect.opacity(1, 1),\n * );\n * // current time: 2s\n * ```\n *\n * @param tasks - A list of tasks to run.\n */\nexport function* all(...tasks: ThreadGenerator[]): ThreadGenerator {\n for (const task of tasks) {\n yield task;\n }\n yield* join(...tasks);\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator, join} from '../threading';\n\ndecorate(any, threadable());\n/**\n * Run all tasks concurrently and wait for any of them to finish.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield* any(\n * rect.fill('#ff0000', 2),\n * rect.opacity(1, 1),\n * );\n * // current time: 1s\n * ```\n *\n * @param tasks - A list of tasks to run.\n */\nexport function* any(...tasks: ThreadGenerator[]): ThreadGenerator {\n for (const task of tasks) {\n yield task;\n }\n yield* join(false, ...tasks);\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator, isThreadGenerator} from '../threading';\n\ndecorate(chain, threadable());\n/**\n * Run tasks one after another.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield* chain(\n * rect.fill('#ff0000', 2),\n * rect.opacity(1, 1),\n * );\n * // current time: 3s\n * ```\n *\n * Note that the same animation can be written as:\n * ```ts\n * yield* rect.fill('#ff0000', 2),\n * yield* rect.opacity(1, 1),\n * ```\n *\n * The reason `chain` exists is to make it easier to pass it to other flow\n * functions. For example:\n * ```ts\n * yield* all(\n * rect.radius(20, 3),\n * chain(\n * rect.fill('#ff0000', 2),\n * rect.opacity(1, 1),\n * ),\n * );\n * ```\n *\n * @param tasks - A list of tasks to run.\n */\nexport function* chain(\n ...tasks: (ThreadGenerator | Callback)[]\n): ThreadGenerator {\n for (const generator of tasks) {\n if (isThreadGenerator(generator)) {\n yield* generator;\n } else {\n generator();\n }\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator} from '../threading';\nimport {useDuration, usePlayback, useThread} from '../utils';\n\ndecorate(waitUntil, threadable());\n/**\n * Wait until the given time event.\n *\n * @remarks\n * Time events are displayed on the timeline and can be edited to adjust the\n * delay. By default, an event happens immediately - without any delay.\n *\n * @example\n * ```ts\n * yield waitUntil('event');\n * ```\n *\n * @param event - The name of the time event.\n * @param after - An optional task to be run after the function completes.\n */\nexport function* waitUntil(\n event: string,\n after?: ThreadGenerator,\n): ThreadGenerator {\n yield* waitFor(useDuration(event));\n\n if (after) {\n yield* after;\n }\n}\n\ndecorate(waitFor, threadable());\n/**\n * Wait for the given amount of time.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield waitFor(2);\n * // current time: 2s\n * yield waitFor(3);\n * // current time: 5s\n * ```\n *\n * @param seconds - The relative time in seconds.\n * @param after - An optional task to be run after the function completes.\n */\nexport function* waitFor(\n seconds = 0,\n after?: ThreadGenerator,\n): ThreadGenerator {\n const thread = useThread();\n const step = usePlayback().framesToSeconds(1);\n\n const targetTime = thread.time() + seconds;\n // subtracting the step is not necessary, but it keeps the thread time ahead\n // of the project time.\n while (targetTime - step > thread.fixed) {\n yield;\n }\n thread.time(targetTime);\n\n if (after) {\n yield* after;\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator, isThreadGenerator} from '../threading';\nimport {waitFor} from './scheduling';\n\ndecorate(delay, threadable());\n/**\n * Run the given generator or callback after a specific amount of time.\n *\n * @example\n * ```ts\n * yield* delay(1, rect.fill('#ff0000', 2));\n * ```\n *\n * Note that the same animation can be written as:\n * ```ts\n * yield* waitFor(1),\n * yield* rect.fill('#ff0000', 2),\n * ```\n *\n * The reason `delay` exists is to make it easier to pass it to other flow\n * functions. For example:\n * ```ts\n * yield* all(\n * rect.opacity(1, 3),\n * delay(1, rect.fill('#ff0000', 2));\n * );\n * ```\n *\n * @param time - The delay in seconds\n * @param task - The task or callback to run after the delay.\n */\nexport function* delay(\n time: number,\n task: ThreadGenerator | Callback,\n): ThreadGenerator {\n yield* waitFor(time);\n if (isThreadGenerator(task)) {\n yield* task;\n } else {\n task();\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator} from '../threading';\nimport {usePlayback} from '../utils';\n\nexport interface EveryCallback {\n /**\n * A callback called by {@link EveryTimer} every N seconds.\n *\n * @param tick - The amount of times the timer has ticked.\n */\n (tick: number): void;\n}\n\nexport interface EveryTimer {\n /**\n * The generator responsible for running this timer.\n */\n runner: ThreadGenerator;\n setInterval(value: number): void;\n setCallback(value: EveryCallback): void;\n\n /**\n * Wait until the timer ticks.\n */\n sync(): ThreadGenerator;\n}\n\n/**\n * Call the given callback every N seconds.\n *\n * @example\n * ```ts\n * const timer = every(2, time => console.log(time));\n * yield timer.runner;\n *\n * // current time: 0s\n * yield* waitFor(5);\n * // current time: 5s\n * yield* timer.sync();\n * // current time: 6s\n * ```\n *\n * @param interval - The interval between subsequent calls.\n * @param callback - The callback to be called.\n */\nexport function every(interval: number, callback: EveryCallback): EveryTimer {\n let changed = false;\n decorate(everyRunner, threadable('every'));\n function* everyRunner(): ThreadGenerator {\n const project = usePlayback();\n let acc = 0;\n let tick = 0;\n callback(tick);\n changed = true;\n\n while (true) {\n if (acc >= project.secondsToFrames(interval)) {\n acc = 0;\n tick++;\n callback(tick);\n changed = true;\n } else {\n changed = false;\n }\n acc++;\n yield;\n }\n }\n\n return {\n runner: everyRunner(),\n setInterval(value) {\n interval = value;\n changed = false;\n },\n setCallback(value) {\n callback = value;\n changed = false;\n },\n *sync() {\n while (!changed) {\n yield;\n }\n },\n };\n}\n","export default `Make sure to use \\`yield\\` or \\`spawn()\\` to execute the loop concurrently in a\nseparate thread:\n\n\\`\\`\\`ts wrong\n// prettier-ignore\nyield* loop(() => rect().opacity(0).opacity(1, 1));\n\\`\\`\\`\n\n\\`\\`\\`ts correct\nyield loop(() => rect().opacity(0).opacity(1, 1));\n// or\nspawn(loop(() => rect().opacity(0).opacity(1, 1)));\n\\`\\`\\`\n\nIf you want to execute the loop a finite number of times, specify the iteration\ncount as the first argument:\n\n\\`\\`\\`ts\n// prettier-ignore\nyield* loop(10, () => rect().opacity(0).opacity(1, 1));\n// ^ iteration count\n\\`\\`\\`\n`;\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator} from '../threading';\nimport {useLogger, useThread} from '../utils';\nimport infiniteLoop from './__logs__/infinite-loop';\n\nexport interface LoopCallback {\n /**\n * A callback called by {@link loop} during each iteration.\n *\n * @param i - The current iteration index.\n */\n (i: number): ThreadGenerator | void;\n}\n\ndecorate(loop, threadable());\n\n/**\n * Run the given generator in a loop.\n *\n * @remarks\n * Each iteration waits until the previous one is completed.\n * Because this loop never finishes it cannot be used in the main thread.\n * Instead, use `yield` or {@link threading.spawn} to run the loop concurrently.\n *\n * @example\n * Rotate the `rect` indefinitely:\n * ```ts\n * yield loop(\n * () => rect.rotation(0).rotation(360, 2, linear),\n * );\n * ```\n *\n * @param factory - A function creating the generator to run. Because generators\n * can't be reset, a new generator is created on each\n * iteration.\n */\nexport function loop(factory: LoopCallback): ThreadGenerator;\n/**\n * Run the given generator N times.\n *\n * @remarks\n * Each iteration waits until the previous one is completed.\n *\n * @example\n * ```ts\n * const colors = [\n * '#ff6470',\n * '#ffc66d',\n * '#68abdf',\n * '#99c47a',\n * ];\n *\n * yield* loop(\n * colors.length,\n * i => rect.fill(colors[i], 2),\n * );\n * ```\n *\n * @param iterations - The number of iterations.\n * @param factory - A function creating the generator to run. Because generators\n * can't be reset, a new generator is created on each\n * iteration.\n */\nexport function loop(\n iterations: number,\n factory: LoopCallback,\n): ThreadGenerator;\nexport function* loop(\n iterations: LoopCallback | number,\n factory?: LoopCallback,\n): ThreadGenerator {\n if (typeof iterations !== 'number') {\n factory = iterations;\n iterations = Infinity;\n }\n\n if (iterations === Infinity && useThread().parent === null) {\n useLogger().error({\n message: 'Tried to execute an infinite loop in the main thread.',\n remarks: infiniteLoop,\n stack: new Error().stack,\n });\n return;\n }\n\n for (let i = 0; i < iterations; i++) {\n const generator = factory!(i);\n if (generator) {\n yield* generator;\n } else {\n yield;\n }\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator} from '../threading';\nimport {usePlayback, useThread} from '../utils';\nimport {LoopCallback} from './loop';\n\ndecorate(loopFor, threadable());\n/**\n * Run a generator in a loop for the given amount of time.\n *\n * @remarks\n * Generators are executed completely before the next iteration starts.\n * An iteration is allowed to finish even when the time is up. This means that\n * the actual duration of the loop may be longer than the given duration.\n *\n * @example\n * ```ts\n * yield* loopFor(\n * 3,\n * () => circle().position.x(-10, 0.1).to(10, 0.1)\n * );\n * ```\n *\n * @param seconds - The duration in seconds.\n * @param factory - A function creating the generator to run. Because generators\n * can't be reset, a new generator is created on each\n * iteration.\n */\nexport function* loopFor(\n seconds: number,\n factory: LoopCallback,\n): ThreadGenerator {\n const thread = useThread();\n const step = usePlayback().framesToSeconds(1);\n const targetTime = thread.time() + seconds;\n\n let iteration = 0;\n while (targetTime - step > thread.fixed) {\n const generator = factory(iteration);\n if (generator) {\n yield* generator;\n } else {\n yield;\n }\n iteration += 1;\n }\n thread.time(targetTime);\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator} from '../threading';\nimport {useDuration} from '../utils';\nimport {LoopCallback} from './loop';\nimport {loopFor} from './loopFor';\n\ndecorate(loopUntil, threadable());\n/**\n * Run a generator in a loop until the given time event.\n *\n * @remarks\n * Generators are executed completely before the next iteration starts.\n * An iteration is allowed to finish even when the time is up. This means that\n * the actual duration of the loop may be longer than the given duration.\n *\n * @example\n * ```ts\n * yield* loopUntil(\n * 'Stop Looping',\n * () => circle().position.x(-10, 0.1).to(10, 0.1)\n * );\n * ```\n *\n * @param event - The event.\n * @param factory - A function creating the generator to run. Because generators\n * can't be reset, a new generator is created on each\n * iteration.\n */\nexport function* loopUntil(\n event: string,\n factory: LoopCallback,\n): ThreadGenerator {\n yield* loopFor(useDuration(event), factory);\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator} from '../threading';\n\ndecorate(noop, threadable());\n/**\n * Do nothing.\n */\nexport function* noop(): ThreadGenerator {\n // do nothing\n}\n","import {setTaskName, ThreadGenerator} from '../threading';\n/**\n * Turn the given generator function into a task.\n *\n * @remarks\n * If you want to immediately run the generator in its own thread, you can use\n * {@link threading.spawn} instead. This function is useful when you want to\n * pass the created task to other flow functions.\n *\n * @example\n * ```ts\n * yield* all(\n * run(function* () {\n * // do things\n * }),\n * rect.opacity(1, 1),\n * );\n * ```\n *\n * @param runner - A generator function or a factory that creates the generator.\n */\n\nexport function run(runner: () => ThreadGenerator): ThreadGenerator;\n/**\n * Turn the given generator function into a task.\n *\n * @remarks\n * If you want to immediately run the generator in its own thread, you can use\n * {@link threading.spawn} instead. This function is useful when you want to\n * pass the created task to other flow functions.\n *\n * @example\n * ```ts\n * yield* all(\n * run(function* () {\n * // do things\n * }),\n * rect.opacity(1, 1),\n * );\n * ```\n *\n * @param runner - A generator function or a factory that creates the generator.\n * @param name - An optional name used when displaying this generator in the UI.\n */\nexport function run(\n name: string,\n runner: () => ThreadGenerator,\n): ThreadGenerator;\nexport function run(\n firstArg: (() => ThreadGenerator) | string,\n runner?: () => ThreadGenerator,\n): ThreadGenerator {\n let task;\n if (typeof firstArg === 'string') {\n task = runner!();\n setTaskName(task, firstArg);\n } else {\n task = firstArg();\n setTaskName(task, task);\n }\n\n return task;\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator, join} from '../threading';\nimport {waitFor} from './scheduling';\n\ndecorate(sequence, threadable());\n/**\n * Start all tasks one after another with a constant delay between.\n *\n * @remarks\n * The function doesn't wait until the previous task in the sequence has\n * finished. Once the delay has passed, the next task will start even if\n * the previous is still running.\n *\n * @example\n * ```ts\n * yield* sequence(\n * 0.1,\n * ...rects.map(rect => rect.x(100, 1))\n * );\n * ```\n *\n * @param delay - The delay between each of the tasks.\n * @param tasks - A list of tasks to be run in a sequence.\n */\nexport function* sequence(\n delay: number,\n ...tasks: ThreadGenerator[]\n): ThreadGenerator {\n for (const task of tasks) {\n yield task;\n yield* waitFor(delay);\n }\n\n yield* join(...tasks);\n}\n","import {Thread} from './Thread';\n\nexport interface Promisable<T> {\n toPromise(): Promise<T>;\n}\n\nexport function isPromisable(value: any): value is Promisable<any> {\n return (\n value &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'toPromise' in value\n );\n}\n\n/**\n * The main generator type produced by all generator functions in Canvas Commons.\n *\n * @example\n * Yielded values can be used to control the flow of animation:\n *\n * Progress to the next frame:\n * ```ts\n * yield;\n * ```\n *\n * Run another generator synchronously:\n * ```ts\n * yield* generatorFunction();\n * ```\n *\n * Run another generator concurrently:\n * ```ts\n * const task = yield generatorFunction();\n * ```\n *\n * Await a Promise:\n * ```ts\n * const result = yield asyncFunction();\n * ```\n */\nexport type ThreadGenerator = Generator<\n ThreadGenerator | Promise<any> | Promisable<any> | void,\n void,\n Thread | any\n>;\n\n/**\n * Check if the given value is a {@link ThreadGenerator}.\n *\n * @param value - A possible thread {@link ThreadGenerator}.\n */\nexport function isThreadGenerator(value: unknown): value is ThreadGenerator {\n return (\n value !== null &&\n typeof value === 'object' &&\n Symbol.iterator in value &&\n 'next' in value\n );\n}\n","export default `This usually happens when you mistakenly reuse a generator that is already\nrunning.\n\nFor example, using \\`yield\\` here will run the opacity generator concurrently and\nstore it in the \\`task\\` variable (in case you want to cancel or await it later):\n\n\\`\\`\\`ts\nconst task = yield rect().opacity(1, 1);\n\\`\\`\\`\n\nTrying to \\`yield\\` this task again will cause the current error:\n\n\\`\\`\\`ts\nyield task;\n\\`\\`\\`\n\nPassing it to other flow functions will also cause the error:\n\n\\`\\`\\`ts\n// prettier-ignore\nyield* all(task);\n\\`\\`\\`\n\nTry to investigate your code looking for \\`yield\\` statements whose return value\nis reused in this way. Here's an example of a common mistake:\n\n\\`\\`\\`ts wrong\n// prettier-ignore\nyield* all(\n yield rect().opacity(1, 1),\n yield rect().x(200, 1),\n);\n\\`\\`\\`\n\n\\`\\`\\`ts correct\n// prettier-ignore\nyield* all(\n rect().opacity(1, 1),\n rect().x(200, 1),\n);\n\\`\\`\\`\n`;\n","import {EventDispatcher} from '../events';\nimport {noop} from '../flow';\nimport {createSignal} from '../signals';\nimport {endThread, startThread, useLogger} from '../utils';\nimport {ThreadGenerator, isThreadGenerator} from './ThreadGenerator';\nimport reusedGenerator from './__logs__/reused-generator';\nimport {getTaskName, setTaskName} from './names';\n\n/**\n * A class representing an individual thread.\n *\n * @remarks\n * Thread is a wrapper for a generator that can be executed concurrently.\n *\n * Aside from the main thread, all threads need to have a parent.\n * If a parent finishes execution, all of its child threads are terminated.\n */\nexport class Thread {\n public get onDeferred() {\n return this.deferred.subscribable;\n }\n private deferred = new EventDispatcher<void>();\n\n public children: Thread[] = [];\n /**\n * The next value to be passed to the wrapped generator.\n */\n public value: unknown;\n\n /**\n * The current time of this thread.\n *\n * @remarks\n * Used by {@link flow.waitFor} and other time-based functions to properly\n * support durations shorter than one frame.\n */\n public readonly time = createSignal(0);\n\n /**\n * The fixed time of this thread.\n *\n * @remarks\n * Fixed time is a multiple of the frame duration. It can be used to account\n * for the difference between this thread's {@link time} and the time of the\n * current animation frame.\n */\n public get fixed() {\n return this.fixedTime;\n }\n\n /**\n * Check if this thread or any of its ancestors has been canceled.\n */\n public get canceled(): boolean {\n return this.isCanceled || (this.parent?.canceled ?? false);\n }\n\n public get paused(): boolean {\n return this.isPaused || (this.parent?.paused ?? false);\n }\n\n public get root(): Thread {\n return this.parent?.root ?? this;\n }\n\n public parent: Thread | null = null;\n private isCanceled = false;\n private isPaused = false;\n private fixedTime = 0;\n private queue: ThreadGenerator[] = [];\n\n public constructor(\n /**\n * The generator wrapped by this thread.\n */\n public readonly runner: ThreadGenerator & {task?: Thread},\n ) {\n if (this.runner.task) {\n useLogger().error({\n message: `The generator \"${getTaskName(\n this.runner,\n )}\" is already being executed by another thread.`,\n remarks: reusedGenerator,\n });\n this.runner = noop();\n }\n this.runner.task = this;\n }\n\n /**\n * Progress the wrapped generator once.\n */\n public next() {\n if (this.paused) {\n return {\n value: null,\n done: false,\n };\n }\n\n startThread(this);\n const result = this.runner.next(this.value);\n endThread(this);\n this.value = null;\n return result;\n }\n\n /**\n * Prepare the thread for the next update cycle.\n *\n * @param dt - The delta time of the next cycle.\n */\n public update(dt: number) {\n if (!this.paused) {\n this.time(this.time() + dt);\n this.fixedTime += dt;\n }\n this.children = this.children.filter(child => !child.canceled);\n }\n\n public spawn(\n child: ThreadGenerator | (() => ThreadGenerator),\n ): ThreadGenerator {\n if (!isThreadGenerator(child)) {\n child = child();\n }\n this.queue.push(child);\n return child;\n }\n\n public add(child: Thread) {\n child.parent = this;\n child.isCanceled = false;\n child.time(this.time());\n child.fixedTime = this.fixedTime;\n this.children.push(child);\n\n setTaskName(child.runner, `unknown ${this.children.length}`);\n }\n\n public drain(callback: (task: ThreadGenerator) => void) {\n this.queue.forEach(callback);\n this.queue = [];\n }\n\n public cancel() {\n this.deferred.clear();\n this.runner.return();\n this.isCanceled = true;\n this.parent = null;\n this.drain(task => task.return());\n }\n\n public pause(value: boolean) {\n this.isPaused = value;\n }\n\n public runDeferred() {\n startThread(this);\n this.deferred.dispatch();\n endThread(this);\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport {usePlayback} from '../utils';\nimport {Thread} from './Thread';\nimport {ThreadGenerator, isThreadGenerator} from './ThreadGenerator';\nimport {setTaskName} from './names';\n\n/**\n * Check if the given value is a [Promise][promise].\n *\n * @param value - A possible [Promise][promise].\n *\n * [promise]: https://developer.mozilla.org/en-US/docs/web/javascript/reference/global_objects/promise\n */\nexport function isPromise(value: any): value is Promise<any> {\n return typeof value?.then === 'function';\n}\n\n/**\n * A generator function or a normal function that returns a generator.\n */\nexport interface ThreadsFactory {\n (): ThreadGenerator;\n}\n\nexport interface ThreadsCallback {\n (root: Thread): void;\n}\n\ndecorate(threads, threadable());\n/**\n * Create a context in which generators can be run concurrently.\n *\n * @remarks\n * From the perspective of the external generator, `threads` is executed\n * synchronously. By default, each scene generator is wrapped in its own\n * `threads` generator.\n *\n * @example\n * ```ts\n * // first\n *\n * yield* threads(function* () {\n * const task = yield generatorFunction();\n * // second\n * }); // <- `task` will be terminated here because the scope\n * // of this `threads` generator has ended\n *\n * // third\n * ```\n *\n * @param factory - A function that returns the generator to run.\n * @param callback - Called whenever threads are created, canceled or finished.\n * Used for debugging purposes.\n */\nexport function* threads(\n factory: ThreadsFactory,\n callback?: ThreadsCallback,\n): ThreadGenerator {\n const playback = usePlayback();\n const root = factory();\n setTaskName(root, 'root');\n const rootThread = new Thread(root);\n callback?.(rootThread);\n\n let threads: Thread[] = [rootThread];\n while (threads.length > 0) {\n const newThreads = [];\n const queue = [...threads];\n const dt = playback.deltaTime;\n\n while (queue.length > 0) {\n const thread = queue.pop();\n if (!thread || thread.canceled) {\n continue;\n }\n\n const result = thread.next();\n if (result.done) {\n thread.cancel();\n continue;\n }\n\n if (isThreadGenerator(result.value)) {\n const child = new Thread(result.value);\n thread.value = result.value;\n thread.add(child);\n\n queue.push(thread);\n queue.push(child);\n } else if (result.value) {\n thread.value = yield result.value;\n queue.push(thread);\n } else {\n thread.update(dt);\n thread.drain(task => {\n const child = new Thread(task);\n thread.add(child);\n newThreads.unshift(child);\n });\n\n newThreads.unshift(thread);\n }\n }\n\n threads = [];\n for (const thread of newThreads) {\n if (!thread.canceled) {\n threads.push(thread);\n thread.runDeferred();\n }\n }\n\n if (threads.length > 0) yield;\n }\n}\n","import type {Logger, PlaybackStatus, SharedWebGLContext} from '../app';\nimport type {\n SubscribableEvent,\n SubscribableValueEvent,\n ValueDispatcher,\n} from '../events';\nimport type {Plugin} from '../plugin';\nimport type {SignalValue} from '../signals';\nimport type {Vector2} from '../types';\nimport type {LifecycleEvents} from './LifecycleEvents';\nimport type {Random} from './Random';\nimport type {SceneMetadata} from './SceneMetadata';\nimport type {Shaders} from './Shaders';\nimport type {Slides} from './Slides';\nimport type {Sounds} from './Sounds';\nimport type {Variables} from './Variables';\nimport type {TimeEvents} from './timeEvents';\n\n/**\n * The constructor used when creating new scenes.\n *\n * @remarks\n * Each class implementing the {@link Scene} interface should have a matching\n * constructor.\n *\n * @typeParam T - The type of the configuration object. This object will be\n * passed to the constructor from\n * {@link SceneDescription.config}.\n */\nexport interface SceneConstructor<T> {\n new (description: FullSceneDescription<T>): Scene;\n}\n\n/**\n * Describes a scene exposed by scene files.\n *\n * @typeParam T - The type of the configuration object.\n */\nexport interface SceneDescription<T = unknown> {\n /**\n * The class used to instantiate the scene.\n */\n klass: SceneConstructor<T>;\n /**\n * Configuration object.\n */\n config: T;\n /**\n * The stack trace at the moment of creation.\n */\n stack?: string;\n /**\n * A list of plugins to include in the project.\n */\n plugins?: (Plugin | string)[];\n meta: SceneMetadata;\n}\n\n/**\n * Describes a complete scene together with the meta file.\n *\n * @typeParam T - The type of the configuration object.\n */\nexport interface FullSceneDescription<T = unknown> extends SceneDescription<T> {\n name: string;\n size: Vector2;\n resolutionScale: number;\n variables: Variables;\n playback: PlaybackStatus;\n logger: Logger;\n onReplaced: ValueDispatcher<FullSceneDescription<T>>;\n timeEventsClass: new (scene: Scene) => TimeEvents;\n sharedWebGLContext: SharedWebGLContext;\n experimentalFeatures?: boolean;\n}\n\n/**\n * A part of the {@link SceneDescription} that can be updated during reload.\n *\n * @typeParam T - The type of the configuration object.\n */\nexport interface SceneDescriptionReload<T = unknown> {\n size?: Vector2;\n resolutionScale?: number;\n config?: T;\n stack?: string;\n}\n\nexport type DescriptionOf<TScene> =\n TScene extends Scene<infer TConfig> ? SceneDescription<TConfig> : never;\n\n/**\n * Describes cached information about the timing of a scene.\n */\nexport interface CachedSceneData {\n firstFrame: number;\n lastFrame: number;\n transitionDuration: number;\n duration: number;\n}\n\n/**\n * Signifies the various stages of a {@link Scene}'s render lifecycle.\n */\nexport enum SceneRenderEvent {\n /**\n * Occurs before the render starts when the Scene transitions are applied.\n */\n BeforeRender,\n /**\n * Occurs at the beginning of a render when the Scene's\n * {@link utils.useContext} handlers are applied.\n */\n BeginRender,\n /**\n * Occurs at the end of a render when the Scene's\n * {@link utils.useContextAfter} handlers are applied.\n */\n FinishRender,\n /**\n * Occurs after a render ends.\n */\n AfterRender,\n}\n\n/**\n * The main interface for scenes.\n *\n * @remarks\n * Any class implementing this interface should have a constructor matching\n * {@link SceneConstructor}.\n *\n * @typeParam T - The type of the configuration object.\n */\nexport interface Scene<T = unknown> {\n /**\n * Name of the scene.\n *\n * @remarks\n * Will be passed as the second argument to the constructor.\n */\n readonly name: string;\n /**\n * Reference to the project.\n */\n readonly playback: PlaybackStatus;\n readonly timeEvents: TimeEvents;\n /**\n * @experimental\n */\n readonly shaders: Shaders;\n readonly slides: Slides;\n readonly sounds: Sounds;\n readonly logger: Logger;\n readonly variables: Variables;\n readonly random: Random;\n readonly meta: SceneMetadata;\n creationStack?: string;\n\n /**\n * The frame at which this scene starts.\n */\n get firstFrame(): number;\n\n /**\n * Scene transition duration in frames.\n */\n get transitionDuration(): number;\n\n /**\n * The frame at which this scene ends.\n */\n get lastFrame(): number;\n\n /**\n * Triggered when the cached data changes.\n *\n * @eventProperty\n */\n get onCacheChanged(): SubscribableValueEvent<CachedSceneData>;\n\n /**\n * Triggered when the scene is reloaded.\n *\n * @eventProperty\n */\n get onReloaded(): SubscribableEvent<void>;\n\n /**\n * Triggered after scene is recalculated.\n *\n * @eventProperty\n */\n get onRecalculated(): SubscribableEvent<void>;\n\n /**\n * The {@link scenes.LifecycleEvents} of this scene.\n */\n get lifecycleEvents(): LifecycleEvents;\n\n /**\n * The {@link scenes.LifecycleEvents} of this scene.\n *\n * @deprecated Use {@link lifecycleEvents} instead.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n get LifecycleEvents(): LifecycleEvents;\n\n /**\n * Triggered at various stages of the render lifecycle with an event title and a Context2D.\n *\n * @eventProperty\n */\n get onRenderLifecycle(): SubscribableEvent<\n [SceneRenderEvent, CanvasRenderingContext2D]\n >;\n\n /**\n * Triggered when the scene is reset.\n *\n * @eventProperty\n */\n get onReset(): SubscribableEvent<void>;\n\n /**\n * The scene directly before this scene, or null if omitted for performance.\n */\n get previous(): Scene | null;\n\n /**\n * Whether experimental features are enabled.\n */\n get experimentalFeatures(): boolean;\n\n /**\n * Render the scene onto a canvas.\n *\n * @param context - The context to used when rendering.\n */\n render(context: CanvasRenderingContext2D): Promise<void>;\n\n /**\n * Reload the scene.\n *\n * @remarks\n * This method is called whenever something related to this scene has changed:\n * time events, source code, metadata, etc.\n *\n * Should trigger {@link onReloaded}.\n *\n * @param description - If present, an updated version of the description.\n */\n reload(description?: SceneDescriptionReload<T>): void;\n\n /**\n * Recalculate the scene.\n *\n * @remarks\n * The task of this method is to calculate new timings stored in the cache.\n * When this method is invoked, `this.project.frame` is set to the frame at\n * which this scene should start ({@link firstFrame}).\n *\n * At the end of execution, this method should set `this.project.frame` to the\n * frame at which this scene ends ({@link lastFrame}).\n *\n * Should trigger {@link onRecalculated}.\n */\n recalculate(setFrame: (frame: number) => void): Promise<void>;\n\n /**\n * Progress this scene one frame forward.\n */\n next(): Promise<void>;\n\n /**\n * Reset this scene to its initial state.\n *\n * @param previous - If present, the previous scene.\n */\n reset(previous?: Scene): Promise<void>;\n\n /**\n * Get the size of this scene.\n *\n * @remarks\n * Usually returns `this.project.getSize()`.\n */\n getSize(): Vector2;\n\n /**\n * Get the real size of this scene.\n *\n * @remarks\n * Returns the size of the scene multiplied by the resolution scale.\n * This is the actual size of the canvas onto which the scene is rendered.\n */\n getRealSize(): Vector2;\n\n /**\n * Is this scene in the {@link SceneState.AfterTransitionIn} state?\n */\n isAfterTransitionIn(): boolean;\n\n /**\n * Is this scene in the {@link SceneState.CanTransitionOut} state?\n */\n canTransitionOut(): boolean;\n\n /**\n * Is this scene in the {@link SceneState.Finished} state?\n */\n isFinished(): boolean;\n\n /**\n * Enter the {@link SceneState.Initial} state.\n */\n enterInitial(): void;\n\n /**\n * Enter the {@link SceneState.AfterTransitionIn} state.\n */\n enterAfterTransitionIn(): void;\n\n /**\n * Enter the {@link SceneState.CanTransitionOut} state.\n */\n enterCanTransitionOut(): void;\n\n /**\n * Is this scene cached?\n *\n * @remarks\n * Used only by {@link GeneratorScene}. Seeking through a project that\n * contains at least one uncached scene will log a warning to the console.\n *\n * Should always return `true`.\n */\n isCached(): boolean;\n\n /**\n * Should this scene be rendered below the previous scene during a transition?\n */\n previousOnTop: SignalValue<boolean>;\n}\n","import {EventDispatcher} from '../events';\nimport {Scene, SceneRenderEvent} from './Scene';\n\n/**\n * Lifecycle events for {@link Scene} that are cleared on every reset.\n */\nexport class LifecycleEvents {\n public get onBeforeRender() {\n return this.beforeRender.subscribable;\n }\n protected readonly beforeRender =\n new EventDispatcher<CanvasRenderingContext2D>();\n\n public get onBeginRender() {\n return this.beginRender.subscribable;\n }\n protected readonly beginRender =\n new EventDispatcher<CanvasRenderingContext2D>();\n\n public get onFinishRender() {\n return this.finishRender.subscribable;\n }\n protected readonly finishRender =\n new EventDispatcher<CanvasRenderingContext2D>();\n\n public get onAfterRender() {\n return this.afterRender.subscribable;\n }\n protected readonly afterRender =\n new EventDispatcher<CanvasRenderingContext2D>();\n\n public constructor(private readonly scene: Scene) {\n this.scene.onRenderLifecycle.subscribe(([event, ctx]) => {\n switch (event) {\n case SceneRenderEvent.BeforeRender:\n return this.beforeRender.dispatch(ctx);\n case SceneRenderEvent.BeginRender:\n return this.beginRender.dispatch(ctx);\n case SceneRenderEvent.FinishRender:\n return this.finishRender.dispatch(ctx);\n case SceneRenderEvent.AfterRender:\n return this.afterRender.dispatch(ctx);\n }\n });\n this.scene.onReset.subscribe(() => {\n this.beforeRender.clear();\n this.beginRender.clear();\n this.finishRender.clear();\n this.afterRender.clear();\n });\n }\n}\n","import {map} from '../tweening';\nimport {range} from '../utils';\n\n/**\n * A random number generator based on\n * {@link https://gist.github.com/tommyettinger/46a874533244883189143505d203312c | Mulberry32}.\n */\nexport class Random {\n /**\n * Previously generated Gaussian random number.\n *\n * @remarks\n * This is an optimization.\n * Since {@link gauss} generates a pair of independent Gaussian random\n * numbers, it returns one immediately and stores the other for the next call\n * to {@link gauss}.\n */\n private nextGauss: number | null = null;\n\n public constructor(private state: number) {}\n\n /**\n * @internal\n */\n public static createSeed() {\n return Math.floor(Math.random() * 4294967296);\n }\n\n /**\n * Get the next random float in the given range.\n *\n * @param from - The start of the range.\n * @param to - The end of the range.\n */\n public nextFloat(from = 0, to = 1) {\n return map(from, to, this.next());\n }\n\n /**\n * Get the next random integer in the given range.\n *\n * @param from - The start of the range.\n * @param to - The end of the range. Exclusive.\n */\n public nextInt(from = 0, to = 4294967296) {\n let value = Math.floor(map(from, to, this.next()));\n if (value === to) {\n value = from;\n }\n\n return value;\n }\n\n /**\n * Get a random float from a gaussian distribution.\n * @param mean - The mean of the distribution.\n * @param stdev - The standard deviation of the distribution.\n */\n public gauss(mean = 0, stdev = 1): number {\n let z = this.nextGauss;\n this.nextGauss = null;\n if (z === null) {\n const x2pi = this.next() * 2 * Math.PI;\n const g2rad = Math.sqrt(-2 * Math.log(1 - this.next()));\n z = Math.cos(x2pi) * g2rad;\n this.nextGauss = Math.sin(x2pi) * g2rad;\n }\n return mean + z * stdev;\n }\n\n /**\n * Get an array filled with random floats in the given range.\n *\n * @param size - The size of the array.\n * @param from - The start of the range.\n * @param to - The end of the range.\n */\n public floatArray(size: number, from = 0, to = 1): number[] {\n return range(size).map(() => this.nextFloat(from, to));\n }\n\n /**\n Get an array filled with random integers in the given range.\n *\n * @param size - The size of the array.\n * @param from - The start of the range.\n * @param to - The end of the range. Exclusive.\n */\n public intArray(size: number, from = 0, to = 4294967296): number[] {\n return range(size).map(() => this.nextInt(from, to));\n }\n\n /**\n * Create a new independent generator.\n */\n public spawn() {\n return new Random(this.nextInt());\n }\n\n private next() {\n this.state |= 0;\n this.state = (this.state + 0x6d2b79f5) | 0;\n let t = Math.imul(this.state ^ (this.state >>> 15), 1 | this.state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n}\n","/**\n * Describes the state of a scene.\n */\nexport enum SceneState {\n /**\n * The scene has just been created/reset.\n */\n Initial,\n\n /**\n * The scene has finished transitioning in.\n *\n * @remarks\n * Informs the Project that the previous scene is no longer necessary and can\n * be disposed of.\n */\n AfterTransitionIn,\n\n /**\n * The scene is ready to transition out.\n *\n * @remarks\n * Informs the project that the next scene can begin.\n * The {@link Scene.next} method will still be invoked until the next scene\n * enters {@link AfterTransitionIn}.\n */\n CanTransitionOut,\n\n /**\n * The scene has finished.\n *\n * @remarks\n * Invoking {@link Scene.next} won't have any effect.\n */\n Finished,\n}\n","import {SharedWebGLContext, WebGLContextOwner} from '../app/SharedWebGLContext';\nimport {Scene} from './Scene';\n\n/**\n * @internal\n */\nexport const UNIFORM_RESOLUTION = 'resolution';\n/**\n * @internal\n */\nexport const UNIFORM_DESTINATION_TEXTURE = 'destinationTexture';\n/**\n * @internal\n */\nexport const UNIFORM_SOURCE_TEXTURE = 'sourceTexture';\n/**\n * @internal\n */\nexport const UNIFORM_TIME = 'time';\n/**\n * @internal\n */\nexport const UNIFORM_DELTA_TIME = 'deltaTime';\n/**\n * @internal\n */\nexport const UNIFORM_FRAMERATE = 'framerate';\n/**\n * @internal\n */\nexport const UNIFORM_FRAME = 'frame';\n/**\n * @internal\n */\nexport const UNIFORM_SOURCE_MATRIX = 'sourceMatrix';\n/**\n * @internal\n */\nexport const UNIFORM_DESTINATION_MATRIX = 'destinationMatrix';\n\n// language=glsl\nconst FragmentShader = `\\\n#version 300 es\n\nin vec2 position;\n\nout vec2 screenUV;\nout vec2 sourceUV;\nout vec2 destinationUV;\n\nuniform mat4 sourceMatrix;\nuniform mat4 destinationMatrix;\n\nvoid main() {\n vec2 position_source = position * 0.5 + 0.5;\n vec4 position_screen = sourceMatrix * vec4(position_source, 0, 1);\n\n screenUV = position_screen.xy;\n sourceUV = position_source;\n destinationUV = (destinationMatrix * position_screen).xy;\n\n gl_Position = (position_screen - 0.5) * 2.0;\n}\n`;\n\n/**\n * @internal\n */\nexport class Shaders implements WebGLContextOwner {\n private gl: WebGL2RenderingContext | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private sourceTexture: WebGLTexture | null = null;\n private destinationTexture: WebGLTexture | null = null;\n private positionLocation = 0;\n private readonly quadPositions = new Float32Array([\n -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0,\n ]);\n\n public constructor(\n private readonly scene: Scene,\n private readonly sharedContext: SharedWebGLContext,\n ) {\n scene.onReloaded.subscribe(this.handleReload);\n }\n\n public setup(gl: WebGL2RenderingContext): void {\n this.gl = gl;\n this.updateViewport();\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.quadPositions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(this.positionLocation, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(this.positionLocation);\n\n this.sourceTexture = gl.createTexture();\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n this.destinationTexture = gl.createTexture();\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, this.destinationTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n\n public teardown(gl: WebGL2RenderingContext): void {\n gl.deleteBuffer(this.positionBuffer);\n gl.disableVertexAttribArray(this.positionLocation);\n gl.deleteTexture(this.sourceTexture);\n gl.deleteTexture(this.destinationTexture);\n this.positionBuffer = null;\n this.sourceTexture = null;\n this.destinationTexture = null;\n this.gl = null;\n }\n\n private handleReload = () => {\n if (this.gl) {\n this.updateViewport();\n }\n };\n\n private updateViewport() {\n if (this.gl) {\n const size = this.scene.getRealSize();\n this.gl.canvas.width = size.width;\n this.gl.canvas.height = size.height;\n this.gl.viewport(0, 0, size.width, size.height);\n }\n }\n\n public getGL() {\n return this.gl ?? this.sharedContext.borrow(this);\n }\n\n public getProgram(fragment: string) {\n const program = this.sharedContext.getProgram(fragment, FragmentShader);\n if (!program) {\n return null;\n }\n\n const size = this.scene.getRealSize();\n const gl = this.getGL();\n gl.useProgram(program);\n gl.uniform1i(gl.getUniformLocation(program, UNIFORM_SOURCE_TEXTURE), 0);\n gl.uniform1i(\n gl.getUniformLocation(program, UNIFORM_DESTINATION_TEXTURE),\n 1,\n );\n gl.uniform2f(\n gl.getUniformLocation(program, UNIFORM_RESOLUTION),\n size.x,\n size.y,\n );\n gl.uniform1f(\n gl.getUniformLocation(program, UNIFORM_DELTA_TIME),\n this.scene.playback.deltaTime,\n );\n gl.uniform1f(\n gl.getUniformLocation(program, UNIFORM_FRAMERATE),\n this.scene.playback.fps,\n );\n\n return program;\n }\n\n public copyTextures(destination: TexImageSource, source: TexImageSource) {\n this.copyTexture(source, this.sourceTexture!);\n this.copyTexture(destination, this.destinationTexture!);\n }\n\n public clear() {\n const gl = this.getGL();\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n\n public render() {\n const gl = this.getGL();\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n private copyTexture(source: TexImageSource, texture: WebGLTexture) {\n const gl = this.getGL();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n gl.generateMipmap(gl.TEXTURE_2D);\n }\n}\n","import {PlaybackState} from '../app/PlaybackManager';\nimport {ValueDispatcher} from '../events';\nimport type {Scene} from './Scene';\n\nexport interface Slide {\n id: string;\n name: string;\n time: number;\n scene: Scene;\n stack?: string;\n}\n\nexport class Slides {\n public get onChanged() {\n return this.slides.subscribable;\n }\n private readonly slides = new ValueDispatcher<Slide[]>([]);\n\n private readonly lookup = new Map<string, Slide>();\n private readonly collisionLookup = new Set<string>();\n private current: Slide | null = null;\n private canResume = false;\n private waitsForId: string | null = null;\n private targetId: string | null = null;\n\n public constructor(private readonly scene: Scene) {\n this.scene.onReloaded.subscribe(this.handleReload);\n this.scene.onReset.subscribe(this.handleReset);\n this.scene.onRecalculated.subscribe(this.handleRecalculated);\n }\n\n public setTarget(target: string | null) {\n this.targetId = target;\n }\n\n public resume() {\n this.canResume = true;\n }\n\n public isWaitingFor(slide: string) {\n return this.waitsForId === slide;\n }\n\n public isWaiting() {\n return this.waitsForId !== null;\n }\n\n public didHappen(slide: string) {\n if (this.current === null) {\n return false;\n }\n\n for (const key of this.lookup.keys()) {\n if (key === slide) {\n return true;\n }\n if (key === this.current?.id) {\n return false;\n }\n }\n\n return false;\n }\n\n public getCurrent() {\n return this.current;\n }\n\n public register(name: string, initialTime: number) {\n if (this.waitsForId !== null) {\n throw new Error(\n `The animation already waits for a slide: ${this.waitsForId}.`,\n );\n }\n\n const id = this.toId(name);\n if (this.scene.playback.state !== PlaybackState.Presenting) {\n if (!this.lookup.has(id)) {\n this.lookup.set(id, {\n id,\n name,\n time: initialTime,\n scene: this.scene,\n stack: new Error().stack,\n });\n }\n\n if (this.collisionLookup.has(name)) {\n this.scene.logger.warn({\n message: `A slide named \"${name}\" already exists.`,\n stack: new Error().stack,\n });\n } else {\n this.collisionLookup.add(name);\n }\n }\n\n this.waitsForId = id;\n this.current = this.lookup.get(id) ?? null;\n this.canResume = false;\n }\n\n public shouldWait(name: string): boolean {\n const id = this.toId(name);\n if (this.waitsForId !== id) {\n throw new Error(\n `The animation waits for a different slide: ${this.waitsForId}.`,\n );\n }\n const data = this.lookup.get(id);\n if (!data) {\n throw new Error(`Could not find the \"${name}\" slide.`);\n }\n\n let canResume = this.canResume;\n if (this.scene.playback.state !== PlaybackState.Presenting) {\n canResume = id !== this.targetId;\n }\n\n if (canResume) {\n this.waitsForId = null;\n }\n return !canResume;\n }\n\n private handleReload = () => {\n this.lookup.clear();\n this.collisionLookup.clear();\n this.current = null;\n this.waitsForId = null;\n this.targetId = null;\n };\n\n private handleReset = () => {\n this.collisionLookup.clear();\n this.current = null;\n this.waitsForId = null;\n };\n\n private handleRecalculated = () => {\n this.slides.current = [...this.lookup.values()];\n };\n\n private toId(name: string) {\n return `${this.scene.name}:${name}`;\n }\n}\n","import {ValueDispatcher} from '../events';\nimport {useScene} from '../utils';\nimport type {Scene} from './Scene';\n\nexport interface SoundSettings {\n audio: string;\n start?: number;\n end?: number;\n gain?: number;\n detune?: number;\n playbackRate?: number;\n}\n\nexport interface Sound extends SoundSettings {\n offset: number;\n realPlaybackRate: number;\n}\n\nexport class SoundBuilder {\n private settings: SoundSettings;\n\n /**\n * {@inheritDoc sound}\n */\n public constructor(audio: string | SoundBuilder) {\n if (audio instanceof SoundBuilder) {\n this.settings = {...audio.settings};\n } else {\n this.settings = {audio};\n }\n }\n\n /**\n * Trim the audio file to a specific portion of it.\n *\n * @param start - The offset in seconds to play from.\n * @param end - The offset in seconds to play to.\n */\n public trim(start?: number, end?: number): this {\n this.settings.start = start;\n this.settings.end = end;\n return this;\n }\n\n /**\n * Set the amplification of the played sound.\n *\n * @param db - The gain in dB.\n */\n public gain(db: number): this {\n this.settings.gain = db;\n return this;\n }\n\n /**\n * Pitch shift the played sound.\n *\n * @remarks\n * This also affects the duration of the sound.\n *\n * @param cents - The pitch shift in cents.\n */\n public detune(cents: number): this {\n this.settings.detune = cents;\n return this;\n }\n\n /**\n * Change the playback rate of the sound.\n *\n * @remarks\n * This also affects the perceived pitch of the sound.\n *\n * @param rate - The new playback rate. Must be greater than 0.\n */\n public playbackRate(rate: number): this {\n this.settings.playbackRate = rate > 0 ? rate : 1;\n return this;\n }\n\n /**\n * Play the configured sound at the current frame.\n *\n * @param offset - An offset in seconds from the current frame. Defaults to 0.\n */\n public play(offset?: number) {\n useScene().sounds.add(this.settings, offset);\n }\n}\n\n/**\n * Begin configuring a sound to be played back.\n */\nexport function sound(audio: string | SoundBuilder) {\n return new SoundBuilder(audio);\n}\n\nexport class Sounds {\n public get onChanged() {\n return this.sounds.subscribable;\n }\n private readonly sounds = new ValueDispatcher<Sound[]>([]);\n private registeredSounds: Sound[] = [];\n\n public constructor(private readonly scene: Scene) {\n this.scene.onReset.subscribe(this.reset);\n this.scene.onReloaded.subscribe(this.reset);\n this.scene.onRecalculated.subscribe(this.handleRecalculated);\n }\n\n public add(settings: SoundSettings, offset?: number) {\n const playbackTime = this.scene.playback.time + (offset ?? 0);\n\n this.registeredSounds.push({\n offset: playbackTime,\n realPlaybackRate:\n Math.pow(2, (settings.detune ?? 0) / 1200) *\n (settings.playbackRate ?? 1),\n ...settings,\n });\n }\n\n public getSounds(): readonly Sound[] {\n return this.registeredSounds;\n }\n\n private handleRecalculated = () => {\n this.sounds.current = [...this.registeredSounds];\n };\n\n private reset = () => {\n this.registeredSounds = [];\n };\n}\n","import {createSignal, SimpleSignal} from '../signals';\nimport type {Scene} from './Scene';\n\nexport class Variables {\n private signals: {[key: string]: SimpleSignal<any>} = {};\n private variables: Record<string, unknown> = {};\n\n public constructor(private readonly scene: Scene) {\n scene.onReset.subscribe(this.handleReset);\n }\n\n /**\n * Get variable signal if exists or create signal if not\n *\n * @param name - The name of the variable.\n * @param initial - The initial value of the variable. It will be used if the\n * variable was not configured from the outside.\n */\n public get<T>(name: string, initial: T): () => T {\n this.signals[name] ??= createSignal(this.variables[name] ?? initial);\n return () => this.signals[name]();\n }\n\n /**\n * Update all signals with new project variable values.\n */\n public updateSignals(variables: Record<string, unknown>) {\n this.variables = variables;\n Object.keys(variables).map(variableName => {\n if (variableName in this.signals) {\n this.signals[variableName](variables[variableName]);\n }\n });\n }\n\n /**\n * Reset all stored signals.\n */\n public handleReset = () => {\n this.signals = {};\n };\n}\n","import {Logger, PlaybackStatus} from '../app';\nimport {decorate, threadable} from '../decorators';\nimport {EventDispatcher, ValueDispatcher} from '../events';\nimport {DependencyContext, SignalValue} from '../signals';\nimport {\n Thread,\n ThreadGenerator,\n isPromisable,\n isPromise,\n threads,\n} from '../threading';\nimport {Vector2} from '../types';\nimport {endPlayback, endScene, startPlayback, startScene} from '../utils';\nimport {LifecycleEvents} from './LifecycleEvents';\nimport {Random} from './Random';\nimport {\n CachedSceneData,\n FullSceneDescription,\n Scene,\n SceneDescriptionReload,\n SceneRenderEvent,\n} from './Scene';\nimport {SceneMetadata} from './SceneMetadata';\nimport {SceneState} from './SceneState';\nimport {Shaders} from './Shaders';\nimport {Slides} from './Slides';\nimport {Sounds} from './Sounds';\nimport {Threadable} from './Threadable';\nimport {Variables} from './Variables';\nimport {TimeEvents} from './timeEvents';\n\nexport interface ThreadGeneratorFactory<T> {\n (view: T): ThreadGenerator;\n}\n\n/**\n * The default implementation of the {@link Scene} interface.\n *\n * Uses generators to control the animation.\n */\nexport abstract class GeneratorScene<T>\n implements Scene<ThreadGeneratorFactory<T>>, Threadable\n{\n public readonly name: string;\n public readonly playback: PlaybackStatus;\n public readonly logger: Logger;\n public readonly meta: SceneMetadata;\n public readonly timeEvents: TimeEvents;\n public readonly shaders: Shaders;\n public readonly slides: Slides;\n public readonly sounds: Sounds;\n public readonly variables: Variables;\n public random: Random;\n public creationStack?: string;\n public previousOnTop: SignalValue<boolean>;\n\n public get firstFrame() {\n return this.cache.current.firstFrame;\n }\n\n public get transitionDuration() {\n return this.cache.current.transitionDuration;\n }\n\n public get lastFrame() {\n return this.firstFrame + this.cache.current.duration;\n }\n\n public get onCacheChanged() {\n return this.cache.subscribable;\n }\n private readonly cache = new ValueDispatcher<CachedSceneData>({\n firstFrame: 0,\n transitionDuration: 0,\n duration: 0,\n lastFrame: 0,\n });\n\n public get onReloaded() {\n return this.reloaded.subscribable;\n }\n private readonly reloaded = new EventDispatcher<void>();\n\n public get onRecalculated() {\n return this.recalculated.subscribable;\n }\n private readonly recalculated = new EventDispatcher<void>();\n\n public get onThreadChanged() {\n return this.thread.subscribable;\n }\n private readonly thread = new ValueDispatcher<Thread | null>(null);\n\n public get onRenderLifecycle() {\n return this.renderLifecycle.subscribable;\n }\n protected readonly renderLifecycle = new EventDispatcher<\n [SceneRenderEvent, CanvasRenderingContext2D]\n >();\n\n public get onReset() {\n return this.afterReset.subscribable;\n }\n private readonly afterReset = new EventDispatcher<void>();\n\n public readonly lifecycleEvents: LifecycleEvents = new LifecycleEvents(this);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public get LifecycleEvents() {\n this.logger.warn(\n 'LifecycleEvents is deprecated. Use lifecycleEvents instead.',\n );\n return this.lifecycleEvents;\n }\n\n public get previous() {\n return this.previousScene;\n }\n\n public readonly experimentalFeatures: boolean;\n\n protected resolutionScale: number;\n private runnerFactory: ThreadGeneratorFactory<T>;\n private previousScene: Scene | null = null;\n private runner: ThreadGenerator | null = null;\n private state: SceneState = SceneState.Initial;\n private cached = false;\n private counters: Record<string, number> = {};\n private size: Vector2;\n\n public constructor(\n description: FullSceneDescription<ThreadGeneratorFactory<T>>,\n ) {\n this.name = description.name;\n this.size = description.size;\n this.resolutionScale = description.resolutionScale;\n this.logger = description.logger;\n this.playback = description.playback;\n this.meta = description.meta;\n this.runnerFactory = description.config;\n this.creationStack = description.stack;\n this.experimentalFeatures = description.experimentalFeatures ?? false;\n\n decorate(this.runnerFactory, threadable(this.name));\n this.timeEvents = new description.timeEventsClass(this);\n this.variables = new Variables(this);\n this.shaders = new Shaders(this, description.sharedWebGLContext);\n this.slides = new Slides(this);\n this.sounds = new Sounds(this);\n\n this.random = new Random(this.meta.seed.get());\n this.previousOnTop = false;\n }\n\n public abstract getView(): T;\n\n /**\n * Update the view.\n *\n * Invoked after each step of the main generator.\n * Can be used for calculating layout.\n *\n * Can modify the state of the view.\n */\n public update() {\n // do nothing\n }\n\n public async render(context: CanvasRenderingContext2D): Promise<void> {\n let iterations = 0;\n do {\n iterations++;\n await DependencyContext.consumePromises();\n context.save();\n context.clearRect(0, 0, context.canvas.width, context.canvas.height);\n this.execute(() => this.draw(context));\n context.restore();\n } while (DependencyContext.hasPromises() && iterations < 10);\n\n if (iterations > 1) {\n this.logger.debug(`render iterations: ${iterations}`);\n }\n }\n\n protected abstract draw(context: CanvasRenderingContext2D): void;\n\n public reload({\n config,\n size,\n stack,\n resolutionScale,\n }: SceneDescriptionReload<ThreadGeneratorFactory<T>> = {}) {\n if (config) {\n this.runnerFactory = config;\n }\n if (size) {\n this.size = size;\n }\n if (resolutionScale) {\n this.resolutionScale = resolutionScale;\n }\n if (stack) {\n this.creationStack = stack;\n }\n this.cached = false;\n this.reloaded.dispatch();\n }\n\n public async recalculate(setFrame: (frame: number) => void) {\n const cached = this.cache.current;\n cached.firstFrame = this.playback.frame;\n cached.lastFrame = cached.firstFrame + cached.duration;\n\n if (this.isCached()) {\n setFrame(cached.lastFrame);\n this.cache.current = {...cached};\n return;\n }\n\n cached.transitionDuration = -1;\n await this.reset();\n while (!this.canTransitionOut()) {\n if (\n cached.transitionDuration < 0 &&\n this.state === SceneState.AfterTransitionIn\n ) {\n cached.transitionDuration = this.playback.frame - cached.firstFrame;\n }\n setFrame(this.playback.frame + 1);\n await this.next();\n }\n\n if (cached.transitionDuration === -1) {\n cached.transitionDuration = 0;\n }\n\n cached.lastFrame = this.playback.frame;\n cached.duration = cached.lastFrame - cached.firstFrame;\n // Prevent the page from becoming unresponsive.\n await new Promise(resolve => setTimeout(resolve, 0));\n this.cached = true;\n this.cache.current = {...cached};\n this.recalculated.dispatch();\n }\n\n public async next() {\n if (!this.runner) {\n return;\n }\n\n let result = this.execute(() => this.runner!.next());\n this.update();\n while (result.value) {\n if (isPromisable(result.value)) {\n const value = await result.value.toPromise();\n result = this.execute(() => this.runner!.next(value));\n } else if (isPromise(result.value)) {\n const value = await result.value;\n result = this.execute(() => this.runner!.next(value));\n } else {\n this.logger.warn({\n message: 'Invalid value yielded by the scene.',\n object: result.value,\n });\n result = this.execute(() => this.runner!.next(result.value));\n }\n this.update();\n }\n\n if (DependencyContext.hasPromises()) {\n const promises = await DependencyContext.consumePromises();\n this.logger.error({\n message:\n 'Tried to access an asynchronous property before the node was ready. ' +\n 'Make sure to yield the node before accessing the property.',\n stack: promises[0].stack,\n inspect: promises[0].owner?.key ?? undefined,\n });\n }\n\n if (result.done) {\n this.state = SceneState.Finished;\n }\n }\n\n public async reset(previousScene: Scene | null = null) {\n this.counters = {};\n this.previousScene = previousScene;\n this.previousOnTop = false;\n this.random = new Random(this.meta.seed.get());\n this.runner = threads(\n () => this.runnerFactory(this.getView()),\n thread => {\n this.thread.current = thread;\n },\n );\n this.state = SceneState.AfterTransitionIn;\n this.afterReset.dispatch();\n await this.next();\n }\n\n public getSize(): Vector2 {\n return this.size;\n }\n\n public getRealSize(): Vector2 {\n return this.size.mul(this.resolutionScale);\n }\n\n public isAfterTransitionIn(): boolean {\n return this.state === SceneState.AfterTransitionIn;\n }\n\n public canTransitionOut(): boolean {\n return (\n this.state === SceneState.CanTransitionOut ||\n this.state === SceneState.Finished\n );\n }\n\n public isFinished(): boolean {\n return this.state === SceneState.Finished;\n }\n\n public enterInitial() {\n if (this.state === SceneState.AfterTransitionIn) {\n this.state = SceneState.Initial;\n } else {\n this.logger.warn(\n `Scene ${this.name} entered initial in an unexpected state: ${this.state}`,\n );\n }\n }\n\n public enterAfterTransitionIn() {\n if (this.state === SceneState.Initial) {\n this.state = SceneState.AfterTransitionIn;\n } else {\n this.logger.warn(\n `Scene ${this.name} transitioned in an unexpected state: ${this.state}`,\n );\n }\n }\n\n public enterCanTransitionOut() {\n if (\n this.state === SceneState.AfterTransitionIn ||\n this.state === SceneState.Initial // only on recalculate\n ) {\n this.state = SceneState.CanTransitionOut;\n } else {\n this.logger.warn(\n `Scene ${this.name} was marked as finished in an unexpected state: ${this.state}`,\n );\n }\n }\n\n public isCached() {\n return this.cached;\n }\n\n /**\n * Invoke the given callback in the context of this scene.\n *\n * @remarks\n * This method makes sure that the context of this scene is globally available\n * during the execution of the callback.\n *\n * @param callback - The callback to invoke.\n */\n protected execute<T>(callback: () => T): T {\n let result: T;\n startScene(this);\n startPlayback(this.playback);\n try {\n result = callback();\n } finally {\n endPlayback(this.playback);\n endScene(this);\n }\n\n return result;\n }\n}\n","import {Vector2} from '../types/Vector';\n\n/**\n * Represents an element to inspect.\n *\n * @remarks\n * The type is not important because the UI does not interact with it.\n * It serves as a key that will be passed back to an Inspectable scene to\n * receive more information about said element.\n */\nexport type InspectedElement = unknown;\n\n/**\n * Represents attributes of an inspected element.\n */\nexport type InspectedAttributes = {\n stack?: string;\n [K: string]: any;\n};\n\n/**\n * Scenes can implement this interface to make their components\n * inspectable through the UI.\n */\nexport interface Inspectable {\n /**\n * Get a possible element to inspect at a given position.\n *\n * @param x - The x coordinate.\n * @param y - The y coordinate.\n */\n inspectPosition(x: number, y: number): InspectedElement | null;\n\n /**\n * Check if the inspected element is still valid.\n *\n * @remarks\n * If a scene destroys and recreates its components upon every reset, the\n * reference may no longer be valid. Even though the component is still\n * present. This method should check that and return a new reference.\n *\n * @param element - The element to validate.\n */\n validateInspection(element: InspectedElement | null): InspectedElement | null;\n\n /**\n * Return the attributes of the inspected element.\n *\n * @remarks\n * This information will be displayed in the \"Properties\" panel.\n *\n * @param element - The element to inspect.\n */\n inspectAttributes(element: InspectedElement): InspectedAttributes | null;\n\n /**\n * Draw an overlay for the inspected element.\n *\n * @remarks\n * This method can be used to overlay additional information about an\n * element on top of the animation.\n *\n * @param element - The element for which to draw an overlay.\n * @param matrix - A local-to-screen matrix.\n * @param context - The context to draw with.\n */\n drawOverlay(\n element: InspectedElement,\n matrix: DOMMatrix,\n context: CanvasRenderingContext2D,\n ): void;\n\n /**\n * Transform the absolute mouse coordinates into the scene's coordinate system.\n *\n * @param x - The x coordinate.\n * @param y - The y coordinate.\n */\n transformMousePosition(x: number, y: number): Vector2 | null;\n}\n\nexport function isInspectable(value: any): value is Inspectable {\n return value && typeof value === 'object' && 'validateInspection' in value;\n}\n","import {MetaField, ObjectMetaField} from '../meta';\nimport {Random} from './Random';\nimport {SerializedTimeEvent} from './timeEvents';\n\n/**\n * Create a runtime representation of the scene metadata.\n */\nexport function createSceneMetadata() {\n return new ObjectMetaField('scene', {\n version: new MetaField('version', 1),\n timeEvents: new MetaField<SerializedTimeEvent[]>('time events', []),\n seed: new MetaField('seed', Random.createSeed()),\n });\n}\n\n/**\n * A runtime representation of the scene metadata.\n */\nexport type SceneMetadata = ReturnType<typeof createSceneMetadata>;\n","import {SubscribableValueEvent} from '../events';\nimport {Thread} from '../threading';\n\n/**\n * Scenes can implement this interface to display their thread hierarchy in the\n * UI.\n *\n * @remarks\n * This interface is only useful when a scene uses thread generators to run.\n */\nexport interface Threadable {\n /**\n * Triggered when the main thread changes.\n *\n * @eventProperty\n */\n get onThreadChanged(): SubscribableValueEvent<Thread | null>;\n}\n\nexport function isThreadable(value: any): value is Threadable {\n return value && typeof value === 'object' && 'onThreadChanged' in value;\n}\n","import {Random} from '../scenes';\nimport {useScene} from './useScene';\n\n/**\n * Get the random number generator for the current scene.\n **/\nexport function useRandom(): Random;\n/**\n * Get the random number generator for the given seed.\n *\n * @param seed - The seed for the generator.\n * @param fixed - Whether the seed should be fixed. Fixed seeds remain\n * the same even when the main scene seed changes.\n */\nexport function useRandom(seed: number, fixed?: boolean): Random;\nexport function useRandom(seed?: number, fixed = true): Random {\n return typeof seed === 'number'\n ? new Random(fixed ? seed : seed + useScene().meta.seed.get())\n : useScene().random;\n}\n","import {useThread} from './useThread';\n\n/**\n * Get the real time since the start of the animation.\n *\n * @remarks\n * The returned value accounts for offsets caused by functions such as\n * {@link flow.waitFor}.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield* waitFor(0.02);\n *\n * // current time: 0.016(6)s\n * // real time: 0.02s\n * const realTime = useTime();\n * ```\n */\nexport function useTime() {\n return useThread().time();\n}\n","import {Vector2} from '../types';\nimport {useLogger} from '../utils';\n\nexport interface InterpolationFunction<T, TRest extends any[] = any[]> {\n (from: T, to: T, value: number, ...args: TRest): T;\n}\n\nexport function textLerp(fromString: string, toString: string, value: number) {\n const from = [...fromString];\n const to = [...toString];\n\n // left to right\n if (to.length >= from.length) {\n const current = Math.floor(to.length * value);\n const currentLength = Math.floor(map(from.length - 1, to.length, value));\n let text = '';\n for (let i = 0; i < to.length; i++) {\n if (i < current) {\n text += to[i];\n } else if (from[i] || i <= currentLength) {\n text += from[i] ?? to[i];\n }\n }\n\n return text;\n }\n // right to left\n else {\n const current = Math.round(from.length * (1 - value));\n const currentLength = Math.floor(map(from.length + 1, to.length, value));\n const text = [];\n for (let i = from.length - 1; i >= 0; i--) {\n if (i < current) {\n text.unshift(from[i]);\n } else if (to[i] || i < currentLength) {\n text.unshift(to[i] ?? from[i]);\n }\n }\n\n return text.join('');\n }\n}\n\n/**\n * Interpolate between any two Records, including objects and Maps, even with\n * mismatched keys.\n *\n * @remarks\n * Any old key that is missing in `to` will be removed immediately once value is\n * not 0. Any new key that is missing in `from` will be added once value reaches\n * 1.\n *\n * @param from - The input to favor when value is 0.\n * @param to - The input to favor when value is 1.\n * @param value - On a scale between 0 and 1, how closely to favor from vs to.\n *\n * @returns A value matching the structure of from and to.\n */\nexport function deepLerp<\n TFrom extends Record<any, unknown>,\n TTo extends Record<any, unknown>,\n>(from: TFrom, to: TTo, value: number): TFrom | TTo;\nexport function deepLerp<\n TFrom extends Record<any, unknown>,\n TTo extends Record<any, unknown>,\n>(from: TFrom, to: TTo, value: number, suppressWarnings: boolean): TFrom | TTo;\n/**\n * Interpolate between any two values, including objects, arrays, and Maps.\n *\n * @param from - The input to favor when value is 0.\n * @param to - The input to favor when value is 1.\n * @param value - On a scale between 0 and 1, how closely to favor from vs to.\n *\n * @returns A value matching the structure of from and to.\n */\nexport function deepLerp<T>(from: T, to: T, value: number): T;\nexport function deepLerp<T>(\n from: T,\n to: T,\n value: number,\n suppressWarnings: boolean,\n): T;\nexport function deepLerp(\n from: any,\n to: any,\n value: number,\n suppressWarnings = false,\n): any {\n if (value === 0) return from;\n if (value === 1) return to;\n\n if (from == null || to == null) {\n if (!suppressWarnings) {\n useLogger().warn(\n `Attempting to lerp ${from} -> ${to} may result in unexpected behavior.`,\n );\n }\n return undefined;\n }\n\n if (typeof from === 'number' && typeof to === 'number') {\n return map(from, to, value);\n }\n\n if (typeof from === 'string' && typeof to === 'string') {\n return textLerp(from, to, value);\n }\n\n if (typeof from === 'boolean' && typeof to === 'boolean') {\n return value < 0.5 ? from : to;\n }\n\n if ('lerp' in from) {\n return from.lerp(to, value);\n }\n\n if (from && to && typeof from === 'object' && typeof to === 'object') {\n if (Array.isArray(from) && Array.isArray(to)) {\n if (from.length === to.length) {\n return from.map((f, i) => deepLerp(f, to[i], value));\n }\n } else {\n let toObject = false;\n if (!(from instanceof Map) && !(to instanceof Map)) {\n toObject = true;\n from = new Map(Object.entries(from));\n to = new Map(Object.entries(to));\n }\n\n if (from instanceof Map && to instanceof Map) {\n const result = new Map();\n for (const key of new Set([...from.keys(), ...to.keys()])) {\n const inter = deepLerp(from.get(key), to.get(key), value, true);\n if (inter !== undefined) result.set(key, inter);\n }\n return toObject ? Object.fromEntries(result) : result;\n }\n }\n }\n\n // fallback with an immediate jump to the new value\n return to;\n}\n\nexport function boolLerp<T>(from: T, to: T, value: number): T {\n return value < 0.5 ? from : to;\n}\n\nexport function map(from: number, to: number, value: number) {\n return from + (to - from) * value;\n}\n\nexport function remap(\n fromIn: number,\n toIn: number,\n fromOut: number,\n toOut: number,\n value: number,\n) {\n return fromOut + ((value - fromIn) * (toOut - fromOut)) / (toIn - fromIn);\n}\n\nexport function clamp(min: number, max: number, value: number) {\n return value < min ? min : value > max ? max : value;\n}\n\nexport function clampRemap(\n fromIn: number,\n toIn: number,\n fromOut: number,\n toOut: number,\n value: number,\n) {\n const remappedValue = remap(fromIn, toIn, fromOut, toOut, value);\n if (fromOut > toOut) [fromOut, toOut] = [toOut, fromOut];\n\n return clamp(fromOut, toOut, remappedValue);\n}\n\nexport function arcLerp(\n value: number,\n reverse: boolean,\n ratio: number,\n): Vector2 {\n let flip = reverse;\n if (ratio > 1) {\n ratio = 1 / ratio;\n } else {\n flip = !flip;\n }\n\n const normalized = flip\n ? Math.acos(clamp(-1, 1, 1 - value))\n : Math.asin(value);\n const radians = map(normalized, map(0, Math.PI / 2, value), ratio);\n\n let xValue = Math.sin(radians);\n let yValue = 1 - Math.cos(radians);\n if (reverse) {\n [xValue, yValue] = [yValue, xValue];\n }\n\n return new Vector2(xValue, yValue);\n}\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator} from '../threading';\nimport {useLogger, useThread} from '../utils';\n\ntype ProgressFunction = (value: number, time: number) => void;\n\ndecorate(spring, threadable());\nexport function spring(\n spring: Spring | null,\n from: number,\n to: number,\n settleTolerance: number,\n onProgress: ProgressFunction,\n onEnd?: ProgressFunction,\n): ThreadGenerator;\n\nexport function spring(\n spring: Spring | null,\n from: number,\n to: number,\n onProgress: ProgressFunction,\n onEnd?: ProgressFunction,\n): ThreadGenerator;\n\nexport function* spring(\n spring: Spring | null,\n from: number,\n to: number,\n settleToleranceOrOnProgress: number | ProgressFunction,\n onProgressOrOnEnd?: ProgressFunction,\n onEnd?: ProgressFunction,\n): ThreadGenerator {\n const settleTolerance =\n typeof settleToleranceOrOnProgress === 'number'\n ? settleToleranceOrOnProgress\n : 0.001;\n\n onEnd =\n typeof settleToleranceOrOnProgress === 'number' ? onEnd : onProgressOrOnEnd;\n\n const onProgress: ProgressFunction = (value: number, time: number) => {\n if (typeof settleToleranceOrOnProgress === 'function') {\n settleToleranceOrOnProgress(value, time);\n } else if (typeof onProgressOrOnEnd === 'function') {\n onProgressOrOnEnd(value, time);\n }\n };\n\n spring = spring ?? {\n mass: 0.05,\n stiffness: 10,\n damping: 0.5,\n };\n\n if (spring.mass <= 0) {\n useLogger().error(new Error('Spring mass must be greater than 0.'));\n return;\n }\n if (spring.stiffness < 0) {\n useLogger().error(\n new Error('Spring stiffness must be greater or equal to 0.'),\n );\n return;\n }\n if (spring.damping < 0) {\n useLogger().error(\n new Error('Spring damping must be greater or equal to 0.'),\n );\n return;\n }\n\n const thread = useThread();\n\n let position = from;\n let velocity = spring.initialVelocity ?? 0;\n\n const update = (dt: number) => {\n if (spring === null) {\n return;\n }\n const positionDelta = position - to;\n\n // Using hooks law: F=-kx; with k being the spring constant and x the offset\n // to the settling position\n const force = -spring.stiffness * positionDelta - spring.damping * velocity;\n\n // Update the velocity based on the given timestep\n velocity += (force / spring.mass) * dt;\n\n position += velocity * dt;\n };\n\n // Set simulation constant framerate\n const simulationFrames = 120;\n\n // Calculate a timestep based on on the simulation framerate\n const timeStep = 1 / simulationFrames;\n\n onProgress(from, 0);\n\n const startTime = thread.time();\n let simulationTime = startTime;\n\n let settled = false;\n while (!settled) {\n while (simulationTime < thread.fixed) {\n const difference = thread.fixed - simulationTime;\n\n if (timeStep > difference) {\n update(difference);\n simulationTime = thread.fixed;\n } else {\n update(timeStep);\n simulationTime += timeStep;\n }\n\n // Perform the check during every iteration:\n if (\n Math.abs(to - position) < settleTolerance &&\n Math.abs(velocity) < settleTolerance\n ) {\n // Set the thread time to simulation time:\n thread.time(simulationTime);\n settled = true;\n // Break out when settled\n break;\n }\n }\n\n // Only yield if we haven't settled yet.\n if (!settled) {\n onProgress(position, thread.fixed - startTime);\n yield;\n }\n }\n\n onProgress(to, thread.fixed - startTime);\n onEnd?.(to, thread.fixed - startTime);\n}\n\nexport interface Spring {\n mass: number;\n stiffness: number;\n damping: number;\n initialVelocity?: number;\n}\n\nexport function makeSpring(\n mass: number,\n stiffness: number,\n damping: number,\n initialVelocity?: number,\n): Spring {\n return {\n mass,\n stiffness,\n damping,\n initialVelocity,\n };\n}\n\nexport const BeatSpring: Spring = makeSpring(0.13, 5.7, 1.2, 10.0);\nexport const PlopSpring: Spring = makeSpring(0.2, 20.0, 0.68, 0.0);\nexport const BounceSpring: Spring = makeSpring(0.08, 4.75, 0.05, 0.0);\nexport const SwingSpring: Spring = makeSpring(0.39, 19.85, 2.82, 0.0);\nexport const JumpSpring: Spring = makeSpring(0.04, 10.0, 0.7, 8.0);\nexport const StrikeSpring: Spring = makeSpring(0.03, 20.0, 0.9, 4.8);\nexport const SmoothSpring: Spring = makeSpring(0.16, 15.35, 1.88, 0.0);\n","import {map, remap} from './interpolationFunctions';\n\nexport interface TimingFunction {\n (value: number, from?: number, to?: number): number;\n}\n\n/*\n * All easing implementations taken from https://easings.net/\n */\n\n// Sine\nexport function sin(value: number, from = 0, to = 1) {\n return remap(-1, 1, from, to, Math.sin(value));\n}\n\nexport function easeInSine(value: number, from = 0, to = 1): number {\n value = 1 - Math.cos((value * Math.PI) / 2);\n\n return map(from, to, value);\n}\n\nexport function easeOutSine(value: number, from = 0, to = 1): number {\n value = Math.sin((value * Math.PI) / 2);\n\n return map(from, to, value);\n}\n\nexport function easeInOutSine(value: number, from = 0, to = 1): number {\n value = -(Math.cos(Math.PI * value) - 1) / 2;\n\n return map(from, to, value);\n}\n\n// Quadratic\nexport function easeInQuad(value: number, from = 0, to = 1): number {\n value = value * value;\n\n return map(from, to, value);\n}\n\nexport function easeOutQuad(value: number, from = 0, to = 1): number {\n value = 1 - Math.pow(1 - value, 2);\n\n return map(from, to, value);\n}\n\nexport function easeInOutQuad(value: number, from = 0, to = 1) {\n value = value < 0.5 ? 2 * value * value : 1 - Math.pow(-2 * value + 2, 2) / 2;\n\n return map(from, to, value);\n}\n\n// Cubic\nexport function easeInCubic(value: number, from = 0, to = 1): number {\n value = value * value * value;\n\n return map(from, to, value);\n}\n\nexport function easeOutCubic(value: number, from = 0, to = 1): number {\n value = 1 - Math.pow(1 - value, 3);\n\n return map(from, to, value);\n}\n\nexport function easeInOutCubic(value: number, from = 0, to = 1) {\n value =\n value < 0.5\n ? 4 * value * value * value\n : 1 - Math.pow(-2 * value + 2, 3) / 2;\n\n return map(from, to, value);\n}\n\n// Quartic\nexport function easeInQuart(value: number, from = 0, to = 1): number {\n value = value * value * value * value;\n\n return map(from, to, value);\n}\n\nexport function easeOutQuart(value: number, from = 0, to = 1): number {\n value = 1 - Math.pow(1 - value, 4);\n\n return map(from, to, value);\n}\n\nexport function easeInOutQuart(value: number, from = 0, to = 1) {\n value =\n value < 0.5\n ? 8 * value * value * value * value\n : 1 - Math.pow(-2 * value + 2, 4) / 2;\n\n return map(from, to, value);\n}\n\n// Quintic\nexport function easeInQuint(value: number, from = 0, to = 1): number {\n value = value * value * value * value * value;\n\n return map(from, to, value);\n}\n\nexport function easeOutQuint(value: number, from = 0, to = 1): number {\n value = 1 - Math.pow(1 - value, 5);\n\n return map(from, to, value);\n}\n\nexport function easeInOutQuint(value: number, from = 0, to = 1) {\n value =\n value < 0.5\n ? 16 * value * value * value * value * value\n : 1 - Math.pow(-2 * value + 2, 5) / 2;\n\n return map(from, to, value);\n}\n\n// Exponential\nexport function easeInExpo(value: number, from = 0, to = 1) {\n value = value === 0 ? 0 : Math.pow(2, 10 * value - 10);\n\n return map(from, to, value);\n}\n\nexport function easeOutExpo(value: number, from = 0, to = 1) {\n value = value === 1 ? 1 : 1 - Math.pow(2, -10 * value);\n\n return map(from, to, value);\n}\n\nexport function easeInOutExpo(value: number, from = 0, to = 1) {\n value =\n value === 0\n ? 0\n : value === 1\n ? 1\n : value < 0.5\n ? Math.pow(2, 20 * value - 10) / 2\n : (2 - Math.pow(2, -20 * value + 10)) / 2;\n\n return map(from, to, value);\n}\n\n// Circular\nexport function easeInCirc(value: number, from = 0, to = 1) {\n value = 1 - Math.sqrt(1 - Math.pow(value, 2));\n\n return map(from, to, value);\n}\n\nexport function easeOutCirc(value: number, from = 0, to = 1) {\n value = Math.sqrt(1 - Math.pow(value - 1, 2));\n\n return map(from, to, value);\n}\n\nexport function easeInOutCirc(value: number, from = 0, to = 1) {\n value =\n value < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * value, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * value + 2, 2)) + 1) / 2;\n\n return map(from, to, value);\n}\n\n// Back\nexport function createEaseInBack(s = 1.70158): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value = (s + 1) * value * value * value - s * value * value;\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseOutBack(s = 1.70158): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value = 1 + (s + 1) * Math.pow(value - 1, 3) + s * Math.pow(value - 1, 2);\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseInOutBack(s = 1.70158, v = 1.525): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value =\n value < 0.5\n ? (Math.pow(2 * value, 2) * ((s * v + 1) * 2 * value - s * v)) / 2\n : (Math.pow(2 * value - 2, 2) *\n ((s * v + 1) * (value * 2 - 2) + s * v) +\n 2) /\n 2;\n\n return map(from, to, value);\n };\n}\n\n// Elastic\nexport function createEaseInElastic(s = 2.094395): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value =\n value === 0\n ? 0\n : value === 1\n ? 1\n : -Math.pow(2, 10 * value - 10) * Math.sin((value * 10 - 10.75) * s);\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseOutElastic(s = 2.094395): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value =\n value === 0\n ? 0\n : value === 1\n ? 1\n : Math.pow(2, -10 * value) * Math.sin((value * 10 - 0.75) * s) + 1;\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseInOutElastic(s = 1.39626): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value =\n value === 0\n ? 0\n : value === 1\n ? 1\n : value < 0.5\n ? -(\n Math.pow(2, 20 * value - 10) *\n Math.sin((20 * value - 11.125) * s)\n ) / 2\n : (Math.pow(2, -20 * value + 10) *\n Math.sin((20 * value - 11.125) * s)) /\n 2 +\n 1;\n\n return map(from, to, value);\n };\n}\n\n// Bounce\nexport function createEaseInBounce(n = 7.5625, d = 2.75): TimingFunction {\n const easeOutBounce = createEaseOutBounce(n, d);\n\n return (value: number, from = 0, to = 1) => {\n return 1 - easeOutBounce(1 - value, from, to);\n };\n}\n\nexport function createEaseOutBounce(n = 7.5625, d = 2.75): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n if (value < 1 / d) {\n value = n * value * value;\n } else if (value < 2 / d) {\n value = n * (value -= 1.505 / d) * value + 0.75;\n } else if (value < 2.5 / d) {\n value = n * (value -= 2.25 / d) * value + 0.9375;\n } else {\n value = n * (value -= 2.625 / d) * value + 0.984375;\n }\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseInOutBounce(n = 7.5625, d = 2.75): TimingFunction {\n const easeOutBounce = createEaseOutBounce(n, d);\n\n return (value: number, from = 0, to = 1) => {\n return value < 0.5\n ? (1 - easeOutBounce(1 - 2 * value, from, to)) / 2\n : (1 + easeOutBounce(2 * value - 1, from, to)) / 2;\n };\n}\n\n// Linear\nexport function linear(value: number, from = 0, to = 1) {\n return map(from, to, value);\n}\n\n// Cosine\nexport function cos(value: number, from = 0, to = 1) {\n return remap(-1, 1, from, to, Math.cos(value));\n}\n\n// Sensible defaults for functions with parameters that can be user defined\nexport const easeInBack: TimingFunction = createEaseInBack();\nexport const easeOutBack: TimingFunction = createEaseOutBack();\nexport const easeInOutBack: TimingFunction = createEaseInOutBack();\n\nexport const easeInBounce: TimingFunction = createEaseInBounce();\nexport const easeOutBounce: TimingFunction = createEaseOutBounce();\nexport const easeInOutBounce: TimingFunction = createEaseInOutBounce();\n\nexport const easeInElastic: TimingFunction = createEaseInElastic();\nexport const easeOutElastic: TimingFunction = createEaseOutElastic();\nexport const easeInOutElastic: TimingFunction = createEaseInOutElastic();\n","import {decorate, threadable} from '../decorators';\nimport {ThreadGenerator} from '../threading';\nimport {useThread} from '../utils';\n\ndecorate(tween, threadable());\nexport function* tween(\n seconds: number,\n onProgress: (value: number, time: number) => void,\n onEnd?: (value: number, time: number) => void,\n): ThreadGenerator {\n const thread = useThread();\n\n const startTime = thread.time();\n const endTime = thread.time() + seconds;\n\n onProgress(0, 0);\n while (endTime > thread.fixed) {\n const time = thread.fixed - startTime;\n const value = time / seconds;\n if (time > 0) {\n onProgress(value, time);\n }\n yield;\n }\n thread.time(endTime);\n\n onProgress(1, seconds);\n onEnd?.(1, seconds);\n}\n","import {FlagDispatcher, Subscribable} from '../events';\nimport {Promisable} from '../threading';\nimport {DetailedError} from '../utils';\n\nexport interface PromiseHandle<T> {\n promise: Promise<T>;\n value: T;\n stack?: string;\n owner?: any;\n}\n\nexport class DependencyContext<TOwner = void> implements Promisable<\n DependencyContext<TOwner>\n> {\n protected static collectionSet = new Set<DependencyContext<any>>();\n protected static collectionStack: DependencyContext<any>[] = [];\n protected static promises: PromiseHandle<any>[] = [];\n\n public static collectPromise<T>(promise: Promise<T>): PromiseHandle<T | null>;\n public static collectPromise<T>(\n promise: Promise<T>,\n initialValue: T,\n ): PromiseHandle<T>;\n public static collectPromise<T>(\n promise: Promise<T>,\n initialValue: T | null = null,\n ): PromiseHandle<T | null> {\n const handle: PromiseHandle<T | null> = {\n promise,\n value: initialValue,\n stack: new Error().stack,\n };\n\n const context = this.collectionStack.at(-1);\n if (context) {\n handle.owner = context.owner;\n }\n promise.then(value => {\n handle.value = value;\n context?.markDirty();\n });\n\n this.promises.push(handle);\n return handle;\n }\n\n public static hasPromises() {\n return this.promises.length > 0;\n }\n\n public static async consumePromises() {\n const promises = [...this.promises];\n await Promise.all(promises.map(handle => handle.promise));\n this.promises = this.promises.filter(v => !promises.includes(v));\n return promises;\n }\n\n protected readonly invokable: any;\n\n protected dependencies = new Set<Subscribable<void>>();\n protected event = new FlagDispatcher();\n protected markDirty = () => this.event.raise();\n\n public constructor(protected owner: TOwner) {\n this.invokable = this.invoke.bind(this);\n\n Object.defineProperty(this.invokable, 'context', {\n value: this,\n });\n\n Object.defineProperty(this.invokable, 'toPromise', {\n value: this.toPromise.bind(this),\n });\n }\n\n protected invoke() {\n // do nothing\n }\n\n protected startCollecting() {\n if (DependencyContext.collectionSet.has(this)) {\n throw new DetailedError(\n 'A circular dependency occurred between signals.',\n `This can happen when signals reference each other in a loop.\n Try using the attached stack trace to locate said loop.`,\n );\n }\n\n DependencyContext.collectionSet.add(this);\n DependencyContext.collectionStack.push(this);\n }\n\n protected finishCollecting() {\n DependencyContext.collectionSet.delete(this);\n if (DependencyContext.collectionStack.pop() !== this) {\n throw new Error('collectStart/collectEnd was called out of order.');\n }\n }\n\n protected clearDependencies() {\n this.dependencies.forEach(dep => dep.unsubscribe(this.markDirty));\n this.dependencies.clear();\n }\n\n protected collect() {\n const signal = DependencyContext.collectionStack.at(-1);\n if (signal) {\n signal.dependencies.add(this.event.subscribable);\n this.event.subscribe(signal.markDirty);\n }\n }\n\n public dispose() {\n this.clearDependencies();\n this.event.clear();\n this.owner = null as TOwner;\n }\n\n public async toPromise(): Promise<this> {\n do {\n await DependencyContext.consumePromises();\n this.invokable();\n } while (DependencyContext.hasPromises());\n return this.invokable;\n }\n}\n","export const DEFAULT = Symbol.for('@canvas-commons/core/signals/default');\n","import {SignalValue} from './types';\n\nexport function isReactive<T>(value: SignalValue<T>): value is () => T {\n return typeof value === 'function';\n}\n\nexport function modify<TFrom, TTo>(\n value: SignalValue<TFrom>,\n modification: (value: TFrom) => TTo,\n): SignalValue<TTo> {\n return isReactive(value) ? () => modification(value()) : modification(value);\n}\n\nexport function unwrap<T>(value: SignalValue<T>): T {\n return isReactive(value) ? value() : value;\n}\n","import {run, waitFor} from '../flow';\nimport {ThreadGenerator} from '../threading';\nimport {\n InterpolationFunction,\n TimingFunction,\n easeInOutCubic,\n tween,\n} from '../tweening';\nimport {errorToLog, useLogger} from '../utils';\nimport {DependencyContext} from './DependencyContext';\nimport {DEFAULT} from './symbols';\nimport {\n SignalExtensions,\n SignalGenerator,\n SignalGetter,\n SignalSetter,\n SignalTween,\n SignalValue,\n} from './types';\nimport {isReactive, unwrap} from './utils';\n\nexport type SimpleSignal<TValue, TReturn = void> = Signal<\n TValue,\n TValue,\n TReturn\n>;\n\nexport interface Signal<\n TSetterValue,\n TValue extends TSetterValue,\n TOwner = void,\n TContext = SignalContext<TSetterValue, TValue, TOwner>,\n>\n extends\n SignalSetter<TSetterValue, TOwner>,\n SignalGetter<TValue>,\n SignalTween<TSetterValue, TValue> {\n /**\n * {@inheritDoc SignalContext.reset}\n */\n reset(): TOwner;\n\n /**\n * {@inheritDoc SignalContext.save}\n */\n save(): TOwner;\n\n /**\n * {@inheritDoc SignalContext.isInitial}\n */\n isInitial(): boolean;\n\n context: TContext;\n}\n\nexport class SignalContext<\n TSetterValue,\n TValue extends TSetterValue = TSetterValue,\n TOwner = void,\n> extends DependencyContext<TOwner> {\n protected extensions: SignalExtensions<TSetterValue, TValue>;\n protected current: SignalValue<TSetterValue> | undefined;\n protected last: TValue | undefined;\n protected tweening = false;\n\n public constructor(\n private initial: SignalValue<TSetterValue> | undefined,\n private readonly interpolation: InterpolationFunction<TValue>,\n owner: TOwner = <TOwner>(<unknown>undefined),\n protected parser: (value: TSetterValue) => TValue = value => <TValue>value,\n extensions: Partial<SignalExtensions<TSetterValue, TValue>> = {},\n ) {\n super(owner);\n\n Object.defineProperty(this.invokable, 'reset', {\n value: this.reset.bind(this),\n });\n Object.defineProperty(this.invokable, 'save', {\n value: this.save.bind(this),\n });\n Object.defineProperty(this.invokable, 'isInitial', {\n value: this.isInitial.bind(this),\n });\n\n if (this.initial !== undefined) {\n this.current = this.initial;\n this.markDirty();\n\n if (!isReactive(this.initial)) {\n this.last = this.parse(this.initial);\n }\n }\n\n this.extensions = {\n getter: this.getter.bind(this),\n setter: this.setter.bind(this),\n tweener: this.tweener.bind(this),\n ...extensions,\n };\n }\n\n public toSignal(): Signal<TSetterValue, TValue, TOwner> {\n return this.invokable;\n }\n\n public parse(value: TSetterValue): TValue {\n return this.parser(value);\n }\n\n public set(value: SignalValue<TSetterValue> | typeof DEFAULT): TOwner {\n this.extensions.setter(value);\n return this.owner;\n }\n\n public setter(value: SignalValue<TSetterValue> | typeof DEFAULT): TOwner {\n if (value === DEFAULT) {\n value = this.initial!;\n }\n\n if (this.current === value) {\n return this.owner;\n }\n\n this.current = value;\n this.clearDependencies();\n\n if (!isReactive(value)) {\n this.last = this.parse(value);\n }\n\n this.markDirty();\n return this.owner;\n }\n\n public get(): TValue {\n return this.extensions.getter();\n }\n\n public getter(): TValue {\n if (this.event.isRaised() && isReactive(this.current)) {\n this.clearDependencies();\n this.startCollecting();\n try {\n this.last = this.parse(this.current());\n } catch (e: any) {\n useLogger().error({\n ...errorToLog(e),\n inspect: (<any>this.owner)?.key,\n });\n }\n this.finishCollecting();\n }\n this.event.reset();\n this.collect();\n\n return this.last!;\n }\n\n protected override invoke(\n value?: SignalValue<TSetterValue> | typeof DEFAULT,\n duration?: number,\n timingFunction: TimingFunction = easeInOutCubic,\n interpolationFunction: InterpolationFunction<TValue> = this.interpolation,\n ) {\n if (value === undefined) {\n return this.get();\n }\n\n if (duration === undefined) {\n return this.set(value);\n }\n\n const queue = this.createQueue(timingFunction, interpolationFunction);\n return queue.to(value, duration);\n }\n\n protected createQueue(\n defaultTimingFunction: TimingFunction,\n defaultInterpolationFunction: InterpolationFunction<TValue>,\n ) {\n const initial = this.get();\n const queue: ThreadGenerator[] = [];\n\n const task = run('animation chain', function* animate() {\n while (queue.length > 0) {\n yield* queue.shift()!;\n }\n }) as SignalGenerator<TSetterValue, TValue>;\n\n task.to = (\n value: SignalValue<TSetterValue> | typeof DEFAULT,\n duration: number,\n timingFunction = defaultTimingFunction,\n interpolationFunction = defaultInterpolationFunction,\n ) => {\n defaultTimingFunction = timingFunction;\n defaultInterpolationFunction = interpolationFunction;\n queue.push(\n this.tween(value, duration, timingFunction, interpolationFunction),\n );\n return task;\n };\n\n task.back = (\n time: number,\n timingFunction = defaultTimingFunction,\n interpolationFunction = defaultInterpolationFunction,\n ) => {\n defaultTimingFunction = timingFunction;\n defaultInterpolationFunction = interpolationFunction;\n queue.push(\n this.tween(\n initial,\n time,\n defaultTimingFunction,\n defaultInterpolationFunction,\n ),\n );\n return task;\n };\n\n task.wait = (duration: number) => {\n queue.push(waitFor(duration));\n return task;\n };\n\n task.run = (generator: ThreadGenerator) => {\n queue.push(generator);\n return task;\n };\n\n task.do = (callback: () => void) => {\n queue.push(\n run(function* () {\n callback();\n }),\n );\n return task;\n };\n\n return task;\n }\n\n protected *tween(\n value: SignalValue<TSetterValue> | typeof DEFAULT,\n duration: number,\n timingFunction: TimingFunction,\n interpolationFunction: InterpolationFunction<TValue>,\n ): ThreadGenerator {\n if (value === DEFAULT) {\n value = this.initial!;\n }\n\n this.tweening = true;\n yield* this.extensions.tweener(\n value,\n duration,\n timingFunction,\n interpolationFunction,\n );\n this.set(value);\n this.tweening = false;\n }\n\n public *tweener(\n value: SignalValue<TSetterValue>,\n duration: number,\n timingFunction: TimingFunction,\n interpolationFunction: InterpolationFunction<TValue>,\n ): ThreadGenerator {\n const from = this.get();\n yield* tween(duration, v => {\n this.set(\n interpolationFunction(\n from,\n this.parse(unwrap(value)),\n timingFunction(v),\n ),\n );\n });\n }\n\n public override dispose() {\n super.dispose();\n this.initial = undefined;\n this.current = undefined;\n this.last = undefined;\n }\n\n /**\n * Reset the signal to its initial value (if one has been set).\n *\n * @example\n * ```ts\n * const signal = createSignal(7);\n *\n * signal.reset();\n * // same as:\n * signal(7);\n * ```\n */\n public reset() {\n if (this.initial !== undefined) {\n this.set(this.initial);\n }\n return this.owner;\n }\n\n /**\n * Compute the current value of the signal and immediately set it.\n *\n * @remarks\n * This method can be used to stop the signal from updating while keeping its\n * current value.\n *\n * @example\n * ```ts\n * signal.save();\n * // same as:\n * signal(signal());\n * ```\n */\n public save() {\n return this.set(this.get());\n }\n\n /**\n * Check if the signal is currently using its initial value.\n *\n * @example\n * ```ts\n *\n * const signal = createSignal(0);\n * signal.isInitial(); // true\n *\n * signal(5);\n * signal.isInitial(); // false\n *\n * signal(DEFAULT);\n * signal.isInitial(); // true\n * ```\n */\n public isInitial() {\n this.collect();\n return this.current === this.initial;\n }\n\n /**\n * Get the initial value of this signal.\n */\n public getInitial() {\n return this.initial;\n }\n\n /**\n * Get the raw value of this signal.\n *\n * @remarks\n * If the signal was provided with a factory function, the function itself\n * will be returned, without invoking it.\n *\n * This method can be used to create copies of signals.\n *\n * @example\n * ```ts\n * const a = createSignal(2);\n * const b = createSignal(() => a);\n * // b() == 2\n *\n * const bClone = createSignal(b.raw());\n * // bClone() == 2\n *\n * a(4);\n * // b() == 4\n * // bClone() == 4\n * ```\n */\n public raw() {\n return this.current;\n }\n\n /**\n * Is the signal undergoing a tween?\n */\n public isTweening() {\n return this.tweening;\n }\n}\n","import {InterpolationFunction, map} from '../tweening';\nimport {Signal, SignalContext} from './SignalContext';\nimport {SignalExtensions, SignalValue} from './types';\nimport {isReactive, modify} from './utils';\n\nexport type CompoundSignal<\n TSetterValue,\n TValue extends TSetterValue,\n TKeys extends keyof TValue = keyof TValue,\n TOwner = void,\n TContext = CompoundSignalContext<TSetterValue, TValue, TKeys, TOwner>,\n> = Signal<TSetterValue, TValue, TOwner, TContext> & {\n [K in TKeys]: Signal<\n TValue[K],\n TValue[K],\n TOwner extends void\n ? CompoundSignal<TSetterValue, TValue, TKeys, TOwner, TContext>\n : TOwner\n >;\n};\n\nexport class CompoundSignalContext<\n TSetterValue,\n TValue extends TSetterValue,\n TKeys extends keyof TValue = keyof TValue,\n TOwner = void,\n> extends SignalContext<TSetterValue, TValue, TOwner> {\n public readonly signals: [keyof TValue, Signal<any, any, TOwner>][] = [];\n\n public constructor(\n private readonly entries: (\n | TKeys\n | [keyof TValue, Signal<any, any, TOwner>]\n )[],\n parser: (value: TSetterValue) => TValue,\n initial: SignalValue<TSetterValue>,\n interpolation: InterpolationFunction<TValue>,\n owner: TOwner = <TOwner>(<unknown>undefined),\n extensions: Partial<SignalExtensions<TSetterValue, TValue>> = {},\n ) {\n super(undefined, interpolation, owner, parser, extensions);\n this.parser = parser;\n\n for (const entry of entries) {\n let key: keyof TValue;\n let signal: Signal<any, any, TOwner>;\n if (Array.isArray(entry)) {\n [key, signal] = entry;\n (signal.context as any).owner ??= this;\n } else {\n key = entry;\n signal = new SignalContext(\n modify(initial, value => parser(value)[entry]),\n <any>map,\n owner ?? this.invokable,\n ).toSignal();\n }\n this.signals.push([key, signal]);\n Object.defineProperty(this.invokable, key, {value: signal});\n }\n }\n\n public override toSignal(): CompoundSignal<\n TSetterValue,\n TValue,\n TKeys,\n TOwner\n > {\n return this.invokable;\n }\n\n public override parse(value: TSetterValue): TValue {\n return this.parser(value);\n }\n\n public override getter(): TValue {\n return this.parse(\n <TSetterValue>(\n Object.fromEntries(\n this.signals.map(([key, property]) => [key, property()]),\n )\n ),\n );\n }\n\n public override setter(value: SignalValue<TValue>): TOwner {\n if (isReactive(value)) {\n for (const [key, property] of this.signals) {\n property(() => this.parser(value())[key]);\n }\n } else {\n const parsed = this.parse(value);\n for (const [key, property] of this.signals) {\n property(parsed[key]);\n }\n }\n\n return this.owner;\n }\n\n public override reset(): TOwner {\n for (const [, signal] of this.signals) {\n signal.reset();\n }\n return this.owner;\n }\n\n public override save(): TOwner {\n for (const [, signal] of this.signals) {\n signal.save();\n }\n return this.owner;\n }\n\n public override isInitial(): boolean {\n for (const [, signal] of this.signals) {\n if (!signal.isInitial()) {\n return false;\n }\n }\n return true;\n }\n\n public override raw() {\n return Object.fromEntries(\n this.signals.map(([key, property]) => [key, property.context.raw()]),\n ) as TSetterValue;\n }\n}\n","import {errorToLog, useLogger} from '../utils';\nimport {DependencyContext} from './DependencyContext';\n\nexport interface Computed<TValue> {\n (...args: any[]): TValue;\n context: ComputedContext<TValue>;\n}\n\nexport class ComputedContext<TValue> extends DependencyContext<any> {\n private last: TValue | undefined;\n\n public constructor(\n private readonly factory: (...args: any[]) => TValue,\n owner?: any,\n ) {\n super(owner);\n this.markDirty();\n }\n\n public toSignal(): Computed<TValue> {\n return this.invokable;\n }\n\n public override dispose() {\n super.dispose();\n this.last = undefined;\n }\n\n protected override invoke(...args: any[]): TValue {\n if (this.event.isRaised()) {\n this.clearDependencies();\n this.startCollecting();\n try {\n this.last = this.factory(...args);\n } catch (e: any) {\n useLogger().error({\n ...errorToLog(e),\n inspect: this.owner?.key,\n });\n }\n this.finishCollecting();\n }\n this.event.reset();\n this.collect();\n\n return this.last!;\n }\n}\n","import {Computed, ComputedContext} from '../signals';\n\nexport function createComputed<TValue>(\n factory: (...args: any[]) => TValue,\n owner?: any,\n): Computed<TValue> {\n return new ComputedContext<TValue>(factory, owner).toSignal();\n}\n","import {\n Computed,\n ComputedContext,\n createSignal,\n PromiseHandle,\n} from '../signals';\nimport {createComputed} from './createComputed';\n\nexport function createComputedAsync<T>(\n factory: () => Promise<T>,\n): Computed<T | null>;\nexport function createComputedAsync<T>(\n factory: () => Promise<T>,\n initial: T,\n): Computed<T>;\nexport function createComputedAsync<T>(\n factory: () => Promise<T>,\n initial: T | null = null,\n): Computed<T | null> {\n let handle: PromiseHandle<T | null>;\n const signal = createSignal(factory);\n return createComputed(() => {\n const promise = signal();\n if (!handle || handle.promise !== promise) {\n handle = ComputedContext.collectPromise(\n promise,\n handle?.value ?? initial,\n );\n }\n\n return handle.value;\n });\n}\n","import {useThread} from '../utils';\nimport {DependencyContext} from './DependencyContext';\n\nexport class DeferredEffectContext extends DependencyContext {\n private readonly unsubscribe;\n public constructor(private readonly callback: () => void) {\n super();\n this.unsubscribe = useThread().onDeferred.subscribe(this.update);\n this.markDirty();\n }\n\n private update = () => {\n if (this.event.isRaised()) {\n this.clearDependencies();\n this.startCollecting();\n this.callback();\n this.finishCollecting();\n this.event.reset();\n }\n };\n\n public dispose() {\n super.dispose();\n this.unsubscribe();\n }\n}\n","import {DeferredEffectContext} from './DeferredEffectContext';\n\n/**\n * Invoke the callback at the end of each frame if any of its dependencies\n * changed.\n *\n * @param callback - The callback to invoke.\n */\nexport function createDeferredEffect(callback: () => void): () => void {\n const context = new DeferredEffectContext(callback);\n return () => context.dispose();\n}\n","import {DependencyContext} from './DependencyContext';\n\nexport class EffectContext extends DependencyContext {\n public constructor(private readonly callback: () => void) {\n super();\n this.event.subscribe(this.update);\n this.markDirty();\n }\n\n private update = () => {\n this.clearDependencies();\n this.startCollecting();\n this.callback();\n this.finishCollecting();\n this.event.reset();\n };\n}\n","import {EffectContext} from './EffectContext';\n\n/**\n * Invoke the callback immediately after any of its dependencies change.\n *\n * @param callback - The callback to invoke.\n */\nexport function createEffect(callback: () => void): () => void {\n const context = new EffectContext(callback);\n return () => context.dispose();\n}\n","import {SignalContext, SignalValue, SimpleSignal} from '../signals';\nimport {InterpolationFunction, deepLerp} from '../tweening';\n\nexport function createSignal<TValue, TOwner = void>(\n initial?: SignalValue<TValue>,\n interpolation: InterpolationFunction<TValue> = deepLerp,\n owner?: TOwner,\n): SimpleSignal<TValue, TOwner> {\n return new SignalContext<TValue, TValue, TOwner>(\n initial,\n interpolation,\n owner,\n ).toSignal();\n}\n","import {InterpolationFunction, TimingFunction} from '../tweening';\nimport {PossibleVector2, Vector2} from '../types';\nimport {CompoundSignal, CompoundSignalContext} from './CompoundSignalContext';\nimport {Signal} from './SignalContext';\nimport {SignalExtensions, SignalGenerator, SignalValue} from './types';\n\nexport interface Vector2Edit<TOwner> {\n (callback: (current: Vector2) => SignalValue<PossibleVector2>): TOwner;\n (\n callback: (current: Vector2) => SignalValue<PossibleVector2>,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n}\n\nexport interface Vector2Operation<TOwner> {\n (value: PossibleVector2): TOwner;\n (\n value: PossibleVector2,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n}\n\nexport interface Vector2SignalHelpers<TOwner> {\n edit: Vector2Edit<TOwner>;\n mul: Vector2Operation<TOwner>;\n div: Vector2Operation<TOwner>;\n add: Vector2Operation<TOwner>;\n sub: Vector2Operation<TOwner>;\n dot: Vector2Operation<TOwner>;\n cross: Vector2Operation<TOwner>;\n mod: Vector2Operation<TOwner>;\n}\n\nexport type Vector2Signal<\n TOwner = void,\n TContext = Vector2SignalContext<TOwner>,\n> = CompoundSignal<PossibleVector2, Vector2, 'x' | 'y', TOwner, TContext> &\n Vector2SignalHelpers<TOwner>;\n\nexport class Vector2SignalContext<TOwner = void>\n extends CompoundSignalContext<PossibleVector2, Vector2, 'x' | 'y', TOwner>\n implements Vector2SignalHelpers<TOwner>\n{\n public constructor(\n entries: ('x' | 'y' | [keyof Vector2, Signal<any, any, TOwner>])[],\n parser: (value: PossibleVector2) => Vector2,\n initial: SignalValue<PossibleVector2>,\n interpolation: InterpolationFunction<Vector2>,\n owner: TOwner = <TOwner>(<unknown>undefined),\n extensions: Partial<SignalExtensions<PossibleVector2, Vector2>> = {},\n ) {\n super(entries, parser, initial, interpolation, owner, extensions);\n\n Object.defineProperty(this.invokable, 'edit', {\n value: this.edit.bind(this),\n });\n\n Object.defineProperty(this.invokable, 'mul', {\n value: this.mul.bind(this),\n });\n\n Object.defineProperty(this.invokable, 'div', {\n value: this.div.bind(this),\n });\n\n Object.defineProperty(this.invokable, 'add', {\n value: this.add.bind(this),\n });\n\n Object.defineProperty(this.invokable, 'sub', {\n value: this.sub.bind(this),\n });\n\n Object.defineProperty(this.invokable, 'dot', {\n value: this.dot.bind(this),\n });\n\n Object.defineProperty(this.invokable, 'cross', {\n value: this.cross.bind(this),\n });\n\n Object.defineProperty(this.invokable, 'mod', {\n value: this.mod.bind(this),\n });\n }\n\n public override toSignal(): Vector2Signal<TOwner> {\n return this.invokable;\n }\n\n public edit(\n callback: (current: Vector2) => SignalValue<PossibleVector2>,\n ): TOwner;\n public edit(\n callback: (current: Vector2) => SignalValue<PossibleVector2>,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n public edit(\n callback: (current: Vector2) => SignalValue<PossibleVector2>,\n duration?: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2> | TOwner {\n const newValue = callback(this.get());\n return this.invoke(\n newValue,\n duration,\n timingFunction,\n interpolationFunction,\n ) as SignalGenerator<PossibleVector2, Vector2> | TOwner;\n }\n\n public mul(value: PossibleVector2): TOwner;\n public mul(\n value: PossibleVector2,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n public mul(\n value: PossibleVector2,\n duration?: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2> | TOwner {\n const callback = (current: Vector2) => current.mul(value);\n if (duration === undefined) return this.edit(callback);\n return this.edit(callback, duration, timingFunction, interpolationFunction);\n }\n\n public div(value: PossibleVector2): TOwner;\n public div(\n value: PossibleVector2,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n public div(\n value: PossibleVector2,\n duration?: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2> | TOwner {\n const callback = (current: Vector2) => current.div(value);\n if (duration === undefined) return this.edit(callback);\n return this.edit(callback, duration, timingFunction, interpolationFunction);\n }\n\n public add(value: PossibleVector2): TOwner;\n public add(\n value: PossibleVector2,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n public add(\n value: PossibleVector2,\n duration?: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2> | TOwner {\n const callback = (current: Vector2) => current.add(value);\n if (duration === undefined) return this.edit(callback);\n return this.edit(callback, duration, timingFunction, interpolationFunction);\n }\n\n public sub(value: PossibleVector2): TOwner;\n public sub(\n value: PossibleVector2,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n public sub(\n value: PossibleVector2,\n duration?: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2> | TOwner {\n const callback = (current: Vector2) => current.sub(value);\n if (duration === undefined) return this.edit(callback);\n return this.edit(callback, duration, timingFunction, interpolationFunction);\n }\n\n public dot(value: PossibleVector2): TOwner;\n public dot(\n value: PossibleVector2,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n public dot(\n value: PossibleVector2,\n duration?: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2> | TOwner {\n const callback = (current: Vector2) => current.dot(value);\n if (duration === undefined) return this.edit(callback);\n return this.edit(callback, duration, timingFunction, interpolationFunction);\n }\n\n public cross(value: PossibleVector2): TOwner;\n public cross(\n value: PossibleVector2,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n public cross(\n value: PossibleVector2,\n duration?: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2> | TOwner {\n const callback = (current: Vector2) => current.cross(value);\n if (duration === undefined) return this.edit(callback);\n return this.edit(callback, duration, timingFunction, interpolationFunction);\n }\n\n public mod(value: PossibleVector2): TOwner;\n public mod(\n value: PossibleVector2,\n duration: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2>;\n public mod(\n value: PossibleVector2,\n duration?: number,\n timingFunction?: TimingFunction,\n interpolationFunction?: InterpolationFunction<Vector2>,\n ): SignalGenerator<PossibleVector2, Vector2> | TOwner {\n const callback = (current: Vector2) => current.mod(value);\n if (duration === undefined) return this.edit(callback);\n return this.edit(callback, duration, timingFunction, interpolationFunction);\n }\n}\n","import {CompoundSignal, CompoundSignalContext, SignalValue} from '../signals';\nimport {InterpolationFunction, map} from '../tweening';\nimport {Type, WebGLConvertible} from './Type';\n\nexport type SerializedSpacing = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n};\n\nexport type PossibleSpacing =\n | SerializedSpacing\n | number\n | [number, number]\n | [number, number, number]\n | [number, number, number, number]\n | undefined;\n\nexport type SpacingSignal<T> = CompoundSignal<\n PossibleSpacing,\n Spacing,\n 'top' | 'right' | 'bottom' | 'left',\n T\n>;\n\nexport class Spacing implements Type, WebGLConvertible {\n public static readonly symbol = Symbol.for(\n '@canvas-commons/core/types/Spacing',\n );\n\n public top = 0;\n public right = 0;\n public bottom = 0;\n public left = 0;\n\n public static createSignal(\n initial?: SignalValue<PossibleSpacing>,\n interpolation: InterpolationFunction<Spacing> = Spacing.lerp,\n ): SpacingSignal<void> {\n return new CompoundSignalContext(\n ['top', 'right', 'bottom', 'left'],\n (value: PossibleSpacing) => new Spacing(value),\n initial,\n interpolation,\n ).toSignal();\n }\n\n public static lerp(from: Spacing, to: Spacing, value: number): Spacing {\n return new Spacing(\n map(from.top, to.top, value),\n map(from.right, to.right, value),\n map(from.bottom, to.bottom, value),\n map(from.left, to.left, value),\n );\n }\n\n public get x(): number {\n return this.left + this.right;\n }\n\n public get y(): number {\n return this.top + this.bottom;\n }\n\n public constructor();\n public constructor(from: PossibleSpacing);\n public constructor(all: number);\n public constructor(vertical: number, horizontal: number);\n public constructor(top: number, horizontal: number, bottom: number);\n public constructor(top: number, right: number, bottom: number, left: number);\n public constructor(\n one: PossibleSpacing = 0,\n two?: number,\n three?: number,\n four?: number,\n ) {\n if (one === undefined || one === null) {\n return;\n }\n\n if (Array.isArray(one)) {\n four = one[3];\n three = one[2];\n two = one[1];\n one = one[0];\n }\n\n if (typeof one === 'number') {\n this.top = one;\n this.right = two !== undefined ? two : one;\n this.bottom = three !== undefined ? three : one;\n this.left = four !== undefined ? four : two !== undefined ? two : one;\n return;\n }\n\n this.top = one.top;\n this.right = one.right;\n this.bottom = one.bottom;\n this.left = one.left;\n }\n\n public lerp(to: Spacing, value: number) {\n return Spacing.lerp(this, to, value);\n }\n\n public scale(value: number): Spacing {\n return new Spacing(\n this.top * value,\n this.right * value,\n this.bottom * value,\n this.left * value,\n );\n }\n\n public addScalar(value: number): Spacing {\n return new Spacing(\n this.top + value,\n this.right + value,\n this.bottom + value,\n this.left + value,\n );\n }\n\n public toSymbol(): symbol {\n return Spacing.symbol;\n }\n\n public toString() {\n return `Spacing(${this.top}, ${this.right}, ${this.bottom}, ${this.left})`;\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniform4f(location, this.top, this.right, this.bottom, this.left);\n }\n\n public serialize(): SerializedSpacing {\n return {\n top: this.top,\n right: this.right,\n bottom: this.bottom,\n left: this.left,\n };\n }\n}\n","export const EPSILON = 0.000001;\n\nexport interface Type {\n toSymbol(): symbol;\n}\n\nexport interface WebGLConvertible {\n toUniform(gl: WebGL2RenderingContext, location: WebGLUniformLocation): void;\n}\n\nexport function isType(value: any): value is Type {\n return value && typeof value === 'object' && 'toSymbol' in value;\n}\n","import {DEG2RAD} from '../utils';\nimport {EPSILON, Type, WebGLConvertible} from './Type';\nimport {PossibleVector2, Vector2} from './Vector';\n\nexport type PossibleMatrix2D =\n | Matrix2D\n | DOMMatrix\n | [number, number, number, number, number, number]\n | [PossibleVector2, PossibleVector2, PossibleVector2]\n | undefined;\n\n/**\n * A specialized 2x3 Matrix representing a 2D transformation.\n *\n * A Matrix2D contains six elements defined as\n * [a, b,\n * c, d,\n * tx, ty]\n *\n * This is a shortcut for a 3x3 matrix of the form\n * [a, b, 0,\n * c, d, 0\n * tx, ty, 1]\n *\n * Note that because a Matrix2D ignores the z-values of each component vectors,\n * it does not satisfy all properties of a \"real\" 3x3 matrix.\n *\n * - A Matrix2D has no transpose\n * - A(B + C) = AB + AC does not hold for a Matrix2D\n * - (rA)^-1 = r^-1 A^-1, r != 0 does not hold for a Matrix2D\n * - r(AB) = (rA)B = A(rB) does not hold for a Matrix2D\n */\nexport class Matrix2D implements Type, WebGLConvertible {\n public static readonly symbol = Symbol.for(\n '@canvas-commons/core/types/Matrix2D',\n );\n\n public readonly values: Float32Array = new Float32Array(6);\n public static readonly identity: Matrix2D = new Matrix2D(1, 0, 0, 1, 0, 0);\n public static readonly zero: Matrix2D = new Matrix2D(0, 0, 0, 0, 0, 0);\n\n public static fromRotation(angle: number): Matrix2D {\n return Matrix2D.identity.rotate(angle);\n }\n\n public static fromTranslation(translation: PossibleVector2): Matrix2D {\n return Matrix2D.identity.translate(new Vector2(translation));\n }\n\n public static fromScaling(scale: PossibleVector2): Matrix2D {\n return Matrix2D.identity.scale(new Vector2(scale));\n }\n\n public get x(): Vector2 {\n return new Vector2(this.values[0], this.values[1]);\n }\n\n public get y(): Vector2 {\n return new Vector2(this.values[2], this.values[3]);\n }\n\n public get scaleX(): number {\n return this.values[0];\n }\n\n public set scaleX(value: number) {\n this.values[0] = this.x.normalized.scale(value).x;\n }\n\n public get skewX(): number {\n return this.values[1];\n }\n\n public set skewX(value: number) {\n this.values[1] = value;\n }\n\n public get scaleY(): number {\n return this.values[3];\n }\n\n public set scaleY(value: number) {\n this.values[3] = this.y.normalized.scale(value).y;\n }\n\n public get skewY(): number {\n return this.values[2];\n }\n\n public set skewY(value: number) {\n this.values[2] = value;\n }\n\n public get translateX(): number {\n return this.values[4];\n }\n\n public set translateX(value: number) {\n this.values[4] = value;\n }\n\n public get translateY(): number {\n return this.values[5];\n }\n\n public set translateY(value: number) {\n this.values[5] = value;\n }\n\n public get rotation(): number {\n return Vector2.degrees(this.values[0], this.values[1]);\n }\n\n public set rotation(angle: number) {\n const result = this.rotate(angle - this.rotation);\n\n this.values[0] = result.values[0];\n this.values[1] = result.values[1];\n this.values[2] = result.values[2];\n this.values[3] = result.values[3];\n }\n\n public get translation(): Vector2 {\n return new Vector2(this.values[4], this.values[5]);\n }\n\n public set translation(translation: PossibleVector2) {\n const vec = new Vector2(translation);\n this.values[4] = vec.x;\n this.values[5] = vec.y;\n }\n\n public get scaling(): Vector2 {\n return new Vector2(this.values[0], this.values[3]);\n }\n\n public set scaling(value: PossibleVector2) {\n const scale = new Vector2(value);\n\n const x = new Vector2(this.values[0], this.values[1]).normalized;\n const y = new Vector2(this.values[2], this.values[3]).normalized;\n\n this.values[0] = x.x * scale.x;\n this.values[1] = x.y * scale.y;\n this.values[2] = y.x * scale.x;\n this.values[3] = y.y * scale.y;\n }\n\n /**\n * Get the inverse of the matrix.\n *\n * @remarks\n * If the matrix is not invertible, i.e. its determinant is `0`, this will\n * return `null`, instead.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const inverse = matrix.inverse;\n * // => Matrix2D(\n * // [-2, 1],\n * // [1.5, -0.5],\n * // [1, -2],\n * // )\n * ```\n */\n public get inverse(): Matrix2D | null {\n const aa = this.values[0],\n ab = this.values[1],\n ac = this.values[2],\n ad = this.values[3];\n const atx = this.values[4],\n aty = this.values[5];\n\n let det = aa * ad - ab * ac;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n\n return new Matrix2D(\n ad * det,\n -ab * det,\n -ac * det,\n aa * det,\n (ac * aty - ad * atx) * det,\n (ab * atx - aa * aty) * det,\n );\n }\n\n /**\n * Get the determinant of the matrix.\n */\n public get determinant(): number {\n return this.values[0] * this.values[3] - this.values[1] * this.values[2];\n }\n\n public get domMatrix(): DOMMatrix {\n return new DOMMatrix([\n this.values[0],\n this.values[1],\n this.values[2],\n this.values[3],\n this.values[4],\n this.values[5],\n ]);\n }\n\n public constructor();\n public constructor(matrix: PossibleMatrix2D);\n public constructor(\n x: PossibleVector2,\n y: PossibleVector2,\n z: PossibleVector2,\n );\n public constructor(\n a: number,\n b: number,\n c: number,\n d: number,\n tx: number,\n ty: number,\n );\n public constructor(\n a?: PossibleMatrix2D | PossibleVector2,\n b?: PossibleVector2,\n c?: PossibleVector2,\n d?: number,\n tx?: number,\n ty?: number,\n ) {\n if (arguments.length === 0) {\n this.values = new Float32Array([1, 0, 0, 1, 0, 0]);\n return;\n }\n\n if (arguments.length === 6) {\n this.values[0] = a as number;\n this.values[1] = b as number;\n this.values[2] = c as number;\n this.values[3] = d as number;\n this.values[4] = tx as number;\n this.values[5] = ty as number;\n return;\n }\n\n if (a instanceof DOMMatrix) {\n this.values[0] = a.m11;\n this.values[1] = a.m12;\n this.values[2] = a.m21;\n this.values[3] = a.m22;\n this.values[4] = a.m41;\n this.values[5] = a.m42;\n return;\n }\n\n if (a instanceof Matrix2D) {\n this.values = a.values;\n return;\n }\n\n if (Array.isArray(a)) {\n if (a.length === 2) {\n this.values[0] = a[0];\n this.values[1] = a[1];\n this.values[2] = (b as number[])[0];\n this.values[3] = (b as number[])[1];\n this.values[4] = (c as number[])[0];\n this.values[5] = (c as number[])[1];\n return;\n }\n\n if (a.length === 3) {\n const x = new Vector2(a[0]);\n const y = new Vector2(a[1]);\n const z = new Vector2(a[2]);\n this.values[0] = x.x;\n this.values[1] = x.y;\n this.values[2] = y.x;\n this.values[3] = y.y;\n this.values[4] = z.x;\n this.values[5] = z.y;\n return;\n }\n\n this.values[0] = a[0];\n this.values[1] = a[1];\n this.values[2] = a[2];\n this.values[3] = a[3];\n this.values[4] = a[4];\n this.values[5] = a[5];\n return;\n }\n\n const x = new Vector2(a as PossibleVector2);\n const y = new Vector2(b);\n const z = new Vector2(c);\n this.values[0] = x.x;\n this.values[1] = x.y;\n this.values[2] = y.x;\n this.values[3] = y.y;\n this.values[4] = z.x;\n this.values[5] = z.y;\n }\n\n /**\n * Get the nth component vector of the matrix. Only defined for 0, 1, and 2.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 0],\n * [0, 0],\n * [1, 0],\n * );\n *\n * const x = matrix.column(0);\n * // Vector2(1, 0)\n *\n * const y = matrix.column(1);\n * // Vector2(0, 0)\n *\n * const z = matrix.column(1);\n * // Vector2(1, 0)\n * ```\n *\n * @param index - The index of the component vector to retrieve.\n */\n public column(index: number): Vector2 {\n return new Vector2(this.values[index * 2], this.values[index * 2 + 1]);\n }\n\n /**\n * Returns the nth row of the matrix. Only defined for 0 and 1.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 0],\n * [0, 0],\n * [1, 0],\n * );\n *\n * const firstRow = matrix.column(0);\n * // [1, 0, 1]\n *\n * const secondRow = matrix.column(1);\n * // [0, 0, 0]\n * ```\n *\n * @param index - The index of the row to retrieve.\n */\n public row(index: number): [number, number, number] {\n return [this.values[index], this.values[index + 2], this.values[index + 4]];\n }\n\n /**\n * Returns the matrix product of this matrix with the provided matrix.\n *\n * @remarks\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const a = new Matrix2D(\n * [1, 2],\n * [0, 1],\n * [1, 1],\n * );\n * const b = new Matrix2D(\n * [2, 1],\n * [1, 1],\n * [1, 1],\n * );\n *\n * const result = a.mul(b);\n * // => Matrix2D(\n * // [2, 5],\n * // [1, 3],\n * // [2, 4],\n * // )\n * ```\n *\n * @param other - The matrix to multiply with\n */\n public mul(other: Matrix2D): Matrix2D {\n const a0 = this.values[0],\n a1 = this.values[1],\n a2 = this.values[2],\n a3 = this.values[3],\n a4 = this.values[4],\n a5 = this.values[5];\n const b0 = other.values[0],\n b1 = other.values[1],\n b2 = other.values[2],\n b3 = other.values[3],\n b4 = other.values[4],\n b5 = other.values[5];\n\n return new Matrix2D(\n a0 * b0 + a2 * b1,\n a1 * b0 + a3 * b1,\n a0 * b2 + a2 * b3,\n a1 * b2 + a3 * b3,\n a0 * b4 + a2 * b5 + a4,\n a1 * b4 + a3 * b5 + a5,\n );\n }\n\n /**\n * Rotate the matrix by the provided angle. By default, the angle is\n * provided in degrees.\n *\n * @remarks\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const a = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const result = a.rotate(90);\n * // => Matrix2D(\n * // [3, 4],\n * // [-1, -2],\n * // [5, 6],\n * // )\n *\n * // Provide the angle in radians\n * const result = a.rotate(Math.PI * 0.5, true);\n * // => Matrix2D(\n * // [3, 4],\n * // [-1, -2],\n * // [5, 6],\n * // )\n * ```\n *\n * @param angle - The angle by which to rotate the matrix.\n * @param degrees - Whether the angle is provided in degrees.\n */\n public rotate(angle: number, degrees = true): Matrix2D {\n if (degrees) {\n angle *= DEG2RAD;\n }\n\n const a0 = this.values[0],\n a1 = this.values[1],\n a2 = this.values[2],\n a3 = this.values[3],\n a4 = this.values[4],\n a5 = this.values[5];\n const s = Math.sin(angle);\n const c = Math.cos(angle);\n\n return new Matrix2D(\n a0 * c + a2 * s,\n a1 * c + a3 * s,\n a0 * -s + a2 * c,\n a1 * -s + a3 * c,\n a4,\n a5,\n );\n }\n\n /**\n * Scale the x and y component vectors of the matrix.\n *\n * @remarks\n * If `vec` is provided as a vector, the x and y component vectors of the\n * matrix will be scaled by the x and y parts of the vector, respectively.\n *\n * If `vec` is provided as a scalar, the x and y component vectors will be\n * scaled uniformly by this factor.\n *\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const result1 = matrix.scale([2, 3]);\n * // => new Matrix2D(\n * // [2, 4],\n * // [9, 12],\n * // [5, 6],\n * // )\n *\n * const result2 = matrix.scale(2);\n * // => new Matrix2D(\n * // [2, 4],\n * // [6, 8],\n * // [5, 6],\n * // )\n * ```\n *\n * @param vec - The factor by which to scale the matrix\n */\n public scale(vec: PossibleVector2): Matrix2D {\n const v = new Vector2(vec);\n\n return new Matrix2D(\n this.values[0] * v.x,\n this.values[1] * v.x,\n this.values[2] * v.y,\n this.values[3] * v.y,\n this.values[4],\n this.values[5],\n );\n }\n\n /**\n * Multiply each value of the matrix by a scalar.\n *\n * * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const result1 = matrix.mulScalar(2);\n * // => new Matrix2D(\n * // [2, 4],\n * // [6, 8],\n * // [10, 12],\n * // )\n * ```\n *\n * @param s - The value by which to scale each term\n */\n public mulScalar(s: number): Matrix2D {\n return new Matrix2D(\n this.values[0] * s,\n this.values[1] * s,\n this.values[2] * s,\n this.values[3] * s,\n this.values[4] * s,\n this.values[5] * s,\n );\n }\n\n /**\n * Translate the matrix by the dimensions of the provided vector.\n *\n * @remarks\n * If `vec` is provided as a scalar, matrix will be translated uniformly\n * by this factor.\n *\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const result1 = matrix.translate([2, 3]);\n * // => new Matrix2D(\n * // [1, 2],\n * // [3, 4],\n * // [16, 22],\n * // )\n *\n * const result2 = matrix.translate(2);\n * // => new Matrix2D(\n * // [1, 2],\n * // [3, 4],\n * // [13, 18],\n * // )\n * ```\n *\n * @param vec - The vector by which to translate the matrix\n */\n public translate(vec: PossibleVector2): Matrix2D {\n const v = new Vector2(vec);\n\n return new Matrix2D(\n this.values[0],\n this.values[1],\n this.values[2],\n this.values[3],\n this.values[0] * v.x + this.values[2] * v.y + this.values[4],\n this.values[1] * v.x + this.values[3] * v.y + this.values[5],\n );\n }\n\n /**\n * Add the provided matrix to this matrix.\n *\n * @remarks\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const a = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n * const a = new Matrix2D(\n * [7, 8],\n * [9, 10],\n * [11, 12],\n * );\n *\n * const result = a.add(b);\n * // => Matrix2D(\n * // [8, 10],\n * // [12, 14],\n * // [16, 18],\n * // )\n * ```\n *\n * @param other - The matrix to add\n */\n public add(other: Matrix2D): Matrix2D {\n return new Matrix2D(\n this.values[0] + other.values[0],\n this.values[1] + other.values[1],\n this.values[2] + other.values[2],\n this.values[3] + other.values[3],\n this.values[4] + other.values[4],\n this.values[5] + other.values[5],\n );\n }\n\n /**\n * Subtract the provided matrix from this matrix.\n *\n * @remarks\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const a = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n * const a = new Matrix2D(\n * [7, 8],\n * [9, 10],\n * [11, 12],\n * );\n *\n * const result = a.sub(b);\n * // => Matrix2D(\n * // [-6, -6],\n * // [-6, -6],\n * // [-6, -6],\n * // )\n * ```\n *\n * @param other - The matrix to subract\n */\n public sub(other: Matrix2D): Matrix2D {\n return new Matrix2D(\n this.values[0] - other.values[0],\n this.values[1] - other.values[1],\n this.values[2] - other.values[2],\n this.values[3] - other.values[3],\n this.values[4] - other.values[4],\n this.values[5] - other.values[5],\n );\n }\n\n public toSymbol(): symbol {\n return Matrix2D.symbol;\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniformMatrix3fv(location, false, [\n this.values[0],\n this.values[1],\n 0,\n this.values[2],\n this.values[3],\n 0,\n this.values[4],\n this.values[5],\n 1,\n ]);\n }\n\n public equals(other: Matrix2D, threshold: number = EPSILON): boolean {\n return (\n Math.abs(this.values[0] - other.values[0]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[1] - other.values[1]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[2] - other.values[2]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[3] - other.values[3]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[4] - other.values[4]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[5] - other.values[5]) <= threshold + Number.EPSILON\n );\n }\n\n public exactlyEquals(other: Matrix2D): boolean {\n return (\n this.values[0] === other.values[0] &&\n this.values[1] === other.values[1] &&\n this.values[2] === other.values[2] &&\n this.values[3] === other.values[3] &&\n this.values[4] === other.values[4] &&\n this.values[5] === other.values[5]\n );\n }\n}\n","import {Vector2} from './Vector';\n\nexport enum Center {\n Vertical = 1,\n Horizontal = 2,\n}\n\nexport enum Direction {\n Top = 4,\n Bottom = 8,\n Left = 16,\n Right = 32,\n}\n\nexport enum Origin {\n Middle = 3,\n Top = 5,\n Bottom = 9,\n Left = 18,\n Right = 34,\n TopLeft = 20,\n TopRight = 36,\n BottomLeft = 24,\n BottomRight = 40,\n}\n\nexport function flipOrigin(origin: Direction, axis?: Center): Direction;\nexport function flipOrigin(origin: Origin, axis?: Center): Origin;\nexport function flipOrigin(\n origin: Origin | Direction,\n axis: Center = Center.Horizontal | Center.Vertical,\n): Origin | Direction {\n if (axis & Center.Vertical) {\n if (origin & Direction.Top) {\n origin = (origin & ~Direction.Top) | Direction.Bottom;\n } else if (origin & Direction.Bottom) {\n origin = (origin & ~Direction.Bottom) | Direction.Top;\n }\n }\n\n if (axis & Center.Horizontal) {\n if (origin & Direction.Left) {\n origin = (origin & ~Direction.Left) | Direction.Right;\n } else if (origin & Direction.Right) {\n origin = (origin & ~Direction.Right) | Direction.Left;\n }\n }\n\n return origin;\n}\n\n/**\n * Convert the given origin to a vector representing its offset.\n *\n * @example\n * ```ts\n * const bottomRight = originToOffset(Origin.TopRight);\n * // bottomRight = {x: 1, y: -1}\n * ```\n *\n * @param origin - The origin to convert.\n */\nexport function originToOffset(origin: Origin | Direction): Vector2 {\n if (origin === Origin.Middle) {\n return Vector2.zero;\n }\n\n let x = 0;\n if (origin & Direction.Left) {\n x = -1;\n } else if (origin & Direction.Right) {\n x = 1;\n }\n\n let y = 0;\n if (origin & Direction.Top) {\n y = -1;\n } else if (origin & Direction.Bottom) {\n y = 1;\n }\n\n return new Vector2(x, y);\n}\n","import {\n Signal,\n SignalValue,\n Vector2Signal,\n Vector2SignalContext,\n} from '../signals';\nimport {arcLerp} from '../tweening';\nimport {\n InterpolationFunction,\n clamp,\n map,\n} from '../tweening/interpolationFunctions';\nimport {DEG2RAD, RAD2DEG} from '../utils';\nimport {Matrix2D, PossibleMatrix2D} from './Matrix2D';\nimport {Direction, Origin} from './Origin';\nimport {EPSILON, Type, WebGLConvertible} from './Type';\n\nexport type SerializedVector2<T = number> = {\n x: T;\n y: T;\n};\n\nexport type PossibleVector2<T = number> =\n | SerializedVector2<T>\n | {width: T; height: T}\n | T\n | [T, T]\n | undefined;\n\nexport type SimpleVector2Signal<T> = Signal<PossibleVector2, Vector2, T>;\n\n/**\n * Represents a two-dimensional vector.\n */\nexport class Vector2 implements Type, WebGLConvertible {\n public static readonly symbol = Symbol.for(\n '@canvas-commons/core/types/Vector2',\n );\n\n public static readonly zero = new Vector2();\n public static readonly one = new Vector2(1, 1);\n public static readonly right = new Vector2(1, 0);\n public static readonly left = new Vector2(-1, 0);\n public static readonly up = new Vector2(0, 1);\n public static readonly down = new Vector2(0, -1);\n\n /**\n * A constant equal to `Vector2(0, -1)`\n */\n public static readonly top = new Vector2(0, -1);\n /**\n * A constant equal to `Vector2(0, 1)`\n */\n public static readonly bottom = new Vector2(0, 1);\n /**\n * A constant equal to `Vector2(-1, -1)`\n */\n public static readonly topLeft = new Vector2(-1, -1);\n /**\n * A constant equal to `Vector2(1, -1)`\n */\n public static readonly topRight = new Vector2(1, -1);\n /**\n * A constant equal to `Vector2(-1, 1)`\n */\n public static readonly bottomLeft = new Vector2(-1, 1);\n /**\n * A constant equal to `Vector2(1, 1)`\n */\n public static readonly bottomRight = new Vector2(1, 1);\n\n public x = 0;\n public y = 0;\n\n public static createSignal(\n initial?: SignalValue<PossibleVector2>,\n interpolation: InterpolationFunction<Vector2> = Vector2.lerp,\n owner?: any,\n ): Vector2Signal<void> {\n return new Vector2SignalContext(\n ['x', 'y'],\n (value: PossibleVector2) => new Vector2(value),\n initial,\n interpolation,\n owner,\n ).toSignal();\n }\n\n public static lerp(from: Vector2, to: Vector2, value: number | Vector2) {\n let valueX;\n let valueY;\n\n if (typeof value === 'number') {\n valueX = valueY = value;\n } else {\n valueX = value.x;\n valueY = value.y;\n }\n\n return new Vector2(map(from.x, to.x, valueX), map(from.y, to.y, valueY));\n }\n\n public static arcLerp(\n from: Vector2,\n to: Vector2,\n value: number,\n reverse = false,\n ratio?: number,\n ) {\n ratio ??= from.sub(to).ctg;\n return Vector2.lerp(from, to, arcLerp(value, reverse, ratio));\n }\n\n public static createArcLerp(reverse?: boolean, ratio?: number) {\n return (from: Vector2, to: Vector2, value: number) =>\n Vector2.arcLerp(from, to, value, reverse, ratio);\n }\n\n /**\n * Interpolates between two vectors on the polar plane by interpolating\n * the angles and magnitudes of the vectors individually.\n *\n * @param from - The starting vector.\n * @param to - The target vector.\n * @param value - The t-value of the interpolation.\n * @param counterclockwise - Whether the vector should get rotated\n * counterclockwise. Defaults to `false`.\n * @param origin - The center of rotation. Defaults to the origin.\n *\n * @remarks\n * This function is useful when used in conjunction with {@link rotate} to\n * animate an object's position on a circular arc (see examples).\n *\n * @example\n * Animating an object in a circle around the origin\n * ```tsx\n * circle().position(\n * circle().position().rotate(180),\n * 1,\n * easeInOutCubic,\n * Vector2.polarLerp\n * );\n * ```\n * @example\n * Rotating an object around the point `[-200, 100]`\n * ```ts\n * circle().position(\n * circle().position().rotate(180, [-200, 100]),\n * 1,\n * easeInOutCubic,\n * Vector2.createPolarLerp(false, [-200, 100]),\n * );\n * ```\n * @example\n * Rotating an object counterclockwise around the origin\n * ```ts\n * circle().position(\n * circle().position().rotate(180),\n * 1,\n * easeInOutCubic,\n * Vector2.createPolarLerp(true),\n * );\n * ```\n */\n public static polarLerp(\n from: Vector2,\n to: Vector2,\n value: number,\n counterclockwise = false,\n origin = Vector2.zero,\n ) {\n from = from.sub(origin);\n to = to.sub(origin);\n\n const fromAngle = from.degrees;\n let toAngle = to.degrees;\n const isCounterclockwise = fromAngle > toAngle;\n\n if (isCounterclockwise !== counterclockwise) {\n toAngle = toAngle + (counterclockwise ? -360 : 360);\n }\n\n const angle = map(fromAngle, toAngle, value) * DEG2RAD;\n const magnitude = map(from.magnitude, to.magnitude, value);\n\n return new Vector2(\n magnitude * Math.cos(angle) + origin.x,\n magnitude * Math.sin(angle) + origin.y,\n );\n }\n\n /**\n * Helper function to create a {@link Vector2.polarLerp} interpolation\n * function with additional parameters.\n *\n * @param counterclockwise - Whether the point should get rotated\n * counterclockwise.\n * @param center - The center of rotation. Defaults to the origin.\n */\n public static createPolarLerp(\n counterclockwise = false,\n center: PossibleVector2 = Vector2.zero,\n ) {\n return (from: Vector2, to: Vector2, value: number) =>\n Vector2.polarLerp(from, to, value, counterclockwise, new Vector2(center));\n }\n\n public static fromOrigin(origin: Origin | Direction) {\n const position = new Vector2();\n\n if (origin === Origin.Middle) {\n return position;\n }\n\n if (origin & Direction.Left) {\n position.x = -1;\n } else if (origin & Direction.Right) {\n position.x = 1;\n }\n\n if (origin & Direction.Top) {\n position.y = -1;\n } else if (origin & Direction.Bottom) {\n position.y = 1;\n }\n\n return position;\n }\n\n public static fromScalar(value: number): Vector2 {\n return new Vector2(value, value);\n }\n\n public static fromRadians(radians: number) {\n return new Vector2(Math.cos(radians), Math.sin(radians));\n }\n\n public static fromDegrees(degrees: number) {\n return Vector2.fromRadians(degrees * DEG2RAD);\n }\n\n /**\n * Return the angle in radians between the vector described by x and y and the\n * positive x-axis.\n *\n * @param x - The x component of the vector.\n * @param y - The y component of the vector.\n */\n public static radians(x: number, y: number) {\n return Math.atan2(y, x);\n }\n\n /**\n * Return the angle in degrees between the vector described by x and y and the\n * positive x-axis.\n *\n * @param x - The x component of the vector.\n * @param y - The y component of the vector.\n *\n * @remarks\n * The returned angle will be between -180 and 180 degrees.\n */\n public static degrees(x: number, y: number) {\n return Vector2.radians(x, y) * RAD2DEG;\n }\n\n public static magnitude(x: number, y: number) {\n return Math.sqrt(x * x + y * y);\n }\n\n public static squaredMagnitude(x: number, y: number) {\n return x * x + y * y;\n }\n\n public static angleBetween(u: Vector2, v: Vector2) {\n return (\n Math.acos(clamp(-1, 1, u.dot(v) / (u.magnitude * v.magnitude))) *\n (u.cross(v) >= 0 ? 1 : -1)\n );\n }\n\n public get width(): number {\n return this.x;\n }\n\n public set width(value: number) {\n this.x = value;\n }\n\n public get height(): number {\n return this.y;\n }\n\n public set height(value: number) {\n this.y = value;\n }\n\n public get magnitude(): number {\n return Vector2.magnitude(this.x, this.y);\n }\n\n public get squaredMagnitude(): number {\n return Vector2.squaredMagnitude(this.x, this.y);\n }\n\n public get normalized(): Vector2 {\n return this.scale(1 / Vector2.magnitude(this.x, this.y));\n }\n\n public get safe(): Vector2 {\n return new Vector2(isNaN(this.x) ? 0 : this.x, isNaN(this.y) ? 0 : this.y);\n }\n\n public get flipped(): Vector2 {\n return new Vector2(-this.x, -this.y);\n }\n\n public get floored(): Vector2 {\n return new Vector2(Math.floor(this.x), Math.floor(this.y));\n }\n\n public get rounded(): Vector2 {\n return new Vector2(Math.round(this.x), Math.round(this.y));\n }\n\n public get ceiled(): Vector2 {\n return new Vector2(Math.ceil(this.x), Math.ceil(this.y));\n }\n\n public get perpendicular(): Vector2 {\n return new Vector2(this.y, -this.x);\n }\n\n /**\n * Return the angle in radians between the vector and the positive x-axis.\n */\n public get radians() {\n return Vector2.radians(this.x, this.y);\n }\n\n /**\n * Return the angle in degrees between the vector and the positive x-axis.\n *\n * @remarks\n * The returned angle will be between -180 and 180 degrees.\n */\n public get degrees() {\n return Vector2.degrees(this.x, this.y);\n }\n\n public get ctg(): number {\n return this.x / this.y;\n }\n\n public constructor();\n public constructor(from: PossibleVector2);\n public constructor(x: number, y: number);\n\n public constructor(one?: PossibleVector2 | number, two?: number) {\n if (one === undefined || one === null) {\n return;\n }\n\n if (typeof one !== 'object') {\n this.x = one;\n this.y = two ?? one;\n return;\n }\n\n if (Array.isArray(one)) {\n this.x = one[0];\n this.y = one[1];\n return;\n }\n\n if ('width' in one) {\n this.x = one.width;\n this.y = one.height;\n return;\n }\n\n this.x = one.x;\n this.y = one.y;\n }\n\n public lerp(to: Vector2, value: Vector2 | number) {\n return Vector2.lerp(this, to, value);\n }\n\n public getOriginOffset(origin: Origin | Direction) {\n const offset = Vector2.fromOrigin(origin);\n offset.x *= this.x / 2;\n offset.y *= this.y / 2;\n\n return offset;\n }\n\n public scale(value: number) {\n return new Vector2(this.x * value, this.y * value);\n }\n\n public transformAsPoint(matrix: PossibleMatrix2D) {\n const m = new Matrix2D(matrix);\n\n return new Vector2(\n this.x * m.scaleX + this.y * m.skewY + m.translateX,\n this.x * m.skewX + this.y * m.scaleY + m.translateY,\n );\n }\n\n public transform(matrix: PossibleMatrix2D) {\n const m = new Matrix2D(matrix);\n\n return new Vector2(\n this.x * m.scaleX + this.y * m.skewY,\n this.x * m.skewX + this.y * m.scaleY,\n );\n }\n\n public mul(possibleVector: PossibleVector2) {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x * vector.x, this.y * vector.y);\n }\n\n public div(possibleVector: PossibleVector2) {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x / vector.x, this.y / vector.y);\n }\n\n public add(possibleVector: PossibleVector2) {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x + vector.x, this.y + vector.y);\n }\n\n public sub(possibleVector: PossibleVector2) {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x - vector.x, this.y - vector.y);\n }\n\n public dot(possibleVector: PossibleVector2): number {\n const vector = new Vector2(possibleVector);\n return this.x * vector.x + this.y * vector.y;\n }\n\n public cross(possibleVector: PossibleVector2): number {\n const vector = new Vector2(possibleVector);\n return this.x * vector.y - this.y * vector.x;\n }\n\n public mod(possibleVector: PossibleVector2): Vector2 {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x % vector.x, this.y % vector.y);\n }\n\n /**\n * Rotate the vector around a point by the provided angle.\n *\n * @param angle - The angle by which to rotate in degrees.\n * @param center - The center of rotation. Defaults to the origin.\n */\n public rotate(\n angle: number,\n center: PossibleVector2 = Vector2.zero,\n ): Vector2 {\n const originVector = new Vector2(center);\n\n const matrix = Matrix2D.fromTranslation(originVector)\n .rotate(angle)\n .translate(originVector.flipped);\n\n return this.transformAsPoint(matrix);\n }\n\n public addX(value: number) {\n return new Vector2(this.x + value, this.y);\n }\n\n public addY(value: number) {\n return new Vector2(this.x, this.y + value);\n }\n\n /**\n * Transform the components of the vector.\n *\n * @example\n * Raise the components to the power of 2.\n * ```ts\n * const vector = new Vector2(2, 3);\n * const result = vector.transform(value => value ** 2);\n * ```\n *\n * @param callback - A callback to apply to each component.\n */\n public map(callback: (value: number, index: number) => number) {\n return new Vector2(callback(this.x, 0), callback(this.y, 1));\n }\n\n public toSymbol(): symbol {\n return Vector2.symbol;\n }\n\n public toString() {\n return `Vector2(${this.x}, ${this.y})`;\n }\n\n public toArray(): [number, number] {\n return [this.x, this.y];\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniform2f(location, this.x, this.y);\n }\n\n public serialize(): SerializedVector2 {\n return {x: this.x, y: this.y};\n }\n\n /**\n * Check if two vectors are exactly equal to each other.\n *\n * @remarks\n * If you need to compensate for floating point inaccuracies, use the\n * {@link equals} method, instead.\n *\n * @param other - The vector to compare.\n */\n public exactlyEquals(other: Vector2): boolean {\n return this.x === other.x && this.y === other.y;\n }\n\n /**\n * Check if two vectors are equal to each other.\n *\n * @remarks\n * This method allows passing an allowed error margin when comparing vectors\n * to compensate for floating point inaccuracies. To check if two vectors are\n * exactly equal, use the {@link exactlyEquals} method, instead.\n *\n * @param other - The vector to compare.\n * @param threshold - The allowed error threshold when comparing the vectors.\n */\n public equals(other: Vector2, threshold = EPSILON): boolean {\n return (\n Math.abs(this.x - other.x) <= threshold + Number.EPSILON &&\n Math.abs(this.y - other.y) <= threshold + Number.EPSILON\n );\n }\n\n public *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n }\n}\n","import {CompoundSignal, CompoundSignalContext, SignalValue} from '../signals';\nimport {InterpolationFunction, arcLerp, map} from '../tweening';\nimport {PossibleMatrix2D} from './Matrix2D';\nimport {PossibleSpacing, Spacing} from './Spacing';\nimport {Type, WebGLConvertible} from './Type';\nimport {PossibleVector2, Vector2} from './Vector';\n\nexport type SerializedBBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type PossibleBBox =\n | SerializedBBox\n | [number, number, number, number]\n | Vector2\n | undefined;\n\nexport type RectSignal<T> = CompoundSignal<\n PossibleBBox,\n BBox,\n 'x' | 'y' | 'width' | 'height',\n T\n>;\n\nexport class BBox implements Type, WebGLConvertible {\n public static readonly symbol = Symbol.for('@canvas-commons/core/types/Rect');\n\n public x = 0;\n public y = 0;\n public width = 0;\n public height = 0;\n\n public static createSignal(\n initial?: SignalValue<PossibleBBox>,\n interpolation: InterpolationFunction<BBox> = BBox.lerp,\n ): RectSignal<void> {\n return new CompoundSignalContext(\n ['x', 'y', 'width', 'height'],\n (value: PossibleBBox) => new BBox(value),\n initial,\n interpolation,\n ).toSignal();\n }\n\n public static lerp(\n from: BBox,\n to: BBox,\n value: number | Vector2 | BBox,\n ): BBox {\n let valueX;\n let valueY;\n let valueWidth;\n let valueHeight;\n if (typeof value === 'number') {\n valueX = valueY = valueWidth = valueHeight = value;\n } else if (value instanceof Vector2) {\n valueX = valueWidth = value.x;\n valueY = valueHeight = value.y;\n } else {\n valueX = value.x;\n valueY = value.y;\n valueWidth = value.width;\n valueHeight = value.height;\n }\n\n return new BBox(\n map(from.x, to.x, valueX),\n map(from.y, to.y, valueY),\n map(from.width, to.width, valueWidth),\n map(from.height, to.height, valueHeight),\n );\n }\n\n public static arcLerp(\n from: BBox,\n to: BBox,\n value: number,\n reverse = false,\n ratio?: number,\n ) {\n ratio ??=\n (from.position.sub(to.position).ctg + from.size.sub(to.size).ctg) / 2;\n\n return BBox.lerp(from, to, arcLerp(value, reverse, ratio));\n }\n\n public static fromSizeCentered(size: Vector2): BBox {\n return new BBox(-size.width / 2, -size.height / 2, size.width, size.height);\n }\n\n public static fromPoints(...points: Vector2[]): BBox {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const point of points) {\n if (point.x > maxX) {\n maxX = point.x;\n }\n if (point.x < minX) {\n minX = point.x;\n }\n if (point.y > maxY) {\n maxY = point.y;\n }\n if (point.y < minY) {\n minY = point.y;\n }\n }\n\n return new BBox(minX, minY, maxX - minX, maxY - minY);\n }\n\n public static fromBBoxes(...boxes: BBox[]): BBox {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const box of boxes) {\n const right = box.x + box.width;\n if (right > maxX) {\n maxX = right;\n }\n if (box.x < minX) {\n minX = box.x;\n }\n const bottom = box.y + box.height;\n if (bottom > maxY) {\n maxY = bottom;\n }\n if (box.y < minY) {\n minY = box.y;\n }\n }\n\n return new BBox(minX, minY, maxX - minX, maxY - minY);\n }\n\n public lerp(to: BBox, value: number | Vector2 | BBox) {\n return BBox.lerp(this, to, value);\n }\n\n public get position() {\n return new Vector2(this.x, this.y);\n }\n\n public set position(value: Vector2) {\n this.x = value.x;\n this.y = value.y;\n }\n\n public get size() {\n return new Vector2(this.width, this.height);\n }\n\n public get center() {\n return new Vector2(this.x + this.width / 2, this.y + this.height / 2);\n }\n\n public get left() {\n return this.x;\n }\n\n public set left(value: number) {\n this.width += this.x - value;\n this.x = value;\n }\n\n public get right() {\n return this.x + this.width;\n }\n\n public set right(value: number) {\n this.width = value - this.x;\n }\n\n public get top() {\n return this.y;\n }\n\n public set top(value: number) {\n this.height += this.y - value;\n this.y = value;\n }\n\n public get bottom() {\n return this.y + this.height;\n }\n\n public set bottom(value: number) {\n this.height = value - this.y;\n }\n\n public get topLeft(): Vector2 {\n return this.position;\n }\n\n public get topRight(): Vector2 {\n return new Vector2(this.x + this.width, this.y);\n }\n\n public get bottomLeft(): Vector2 {\n return new Vector2(this.x, this.y + this.height);\n }\n\n public get bottomRight(): Vector2 {\n return new Vector2(this.x + this.width, this.y + this.height);\n }\n\n public get corners(): [Vector2, Vector2, Vector2, Vector2] {\n return [this.topLeft, this.topRight, this.bottomRight, this.bottomLeft];\n }\n\n public get pixelPerfect() {\n return new BBox(\n Math.floor(this.x),\n Math.floor(this.y),\n Math.ceil(this.width + 1),\n Math.ceil(this.height + 1),\n );\n }\n\n public constructor();\n public constructor(from: PossibleBBox);\n public constructor(position: Vector2, size: Vector2);\n public constructor(x: number, y?: number, width?: number, height?: number);\n public constructor(\n one?: PossibleBBox | number,\n two: Vector2 | number = 0,\n three = 0,\n four = 0,\n ) {\n if (one === undefined || one === null) {\n return;\n }\n\n if (typeof one === 'number') {\n this.x = one;\n this.y = <number>two;\n this.width = three;\n this.height = four;\n return;\n }\n\n if (one instanceof Vector2) {\n this.x = one.x;\n this.y = one.y;\n\n if (two instanceof Vector2) {\n this.width = two.x;\n this.height = two.y;\n }\n\n return;\n }\n\n if (Array.isArray(one)) {\n this.x = one[0];\n this.y = one[1];\n this.width = one[2];\n this.height = one[3];\n return;\n }\n\n this.x = one.x;\n this.y = one.y;\n this.width = one.width;\n this.height = one.height;\n }\n\n public transform(matrix: PossibleMatrix2D): BBox {\n return new BBox(\n this.position.transformAsPoint(matrix),\n this.size.transform(matrix),\n );\n }\n\n public transformCorners(matrix: PossibleMatrix2D) {\n return this.corners.map(corner => corner.transformAsPoint(matrix));\n }\n\n /**\n * Translate the bounding box by the given vector.\n *\n * @param vector - The vector to translate the bounding box by.\n */\n public translate(vector: PossibleVector2): BBox {\n const translation = new Vector2(vector);\n return new BBox(\n this.x + translation.x,\n this.y + translation.y,\n this.width,\n this.height,\n );\n }\n\n /**\n * Expand the bounding box to accommodate the given spacing.\n *\n * @param value - The value to expand the bounding box by.\n */\n public expand(value: PossibleSpacing) {\n const spacing = new Spacing(value);\n const result = new BBox(this);\n result.left -= spacing.left;\n result.top -= spacing.top;\n result.right += spacing.right;\n result.bottom += spacing.bottom;\n\n return result;\n }\n\n /**\n * {@inheritDoc expand}\n *\n * @deprecated Use {@link expand} instead.\n */\n public addSpacing(value: PossibleSpacing) {\n return this.expand(value);\n }\n\n public includes(point: Vector2): boolean {\n return (\n point.x >= this.x &&\n point.x <= this.x + this.width &&\n point.y >= this.y &&\n point.y <= this.y + this.height\n );\n }\n\n public intersects(other: BBox): boolean {\n return (\n this.left < other.right &&\n this.right > other.left &&\n this.top < other.bottom &&\n this.bottom > other.top\n );\n }\n\n public intersection(other: BBox): BBox {\n const bbox = new BBox();\n\n if (this.intersects(other)) {\n bbox.left = Math.max(this.left, other.left);\n bbox.top = Math.max(this.top, other.top);\n bbox.right = Math.min(this.right, other.right);\n bbox.bottom = Math.min(this.bottom, other.bottom);\n }\n\n return bbox;\n }\n\n public union(other: BBox): BBox {\n const bbox = new BBox();\n\n bbox.left = Math.min(this.left, other.left);\n bbox.top = Math.min(this.top, other.top);\n bbox.right = Math.max(this.right, other.right);\n bbox.bottom = Math.max(this.bottom, other.bottom);\n\n return bbox;\n }\n\n public toSymbol(): symbol {\n return BBox.symbol;\n }\n\n public toString(): string {\n return `BBox(${this.x}, ${this.y}, ${this.width}, ${this.height})`;\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniform4f(location, this.x, this.y, this.width, this.height);\n }\n\n public serialize(): SerializedBBox {\n return {x: this.x, y: this.y, width: this.width, height: this.height};\n }\n}\n","import chroma from 'chroma-js';\nimport {Signal, SignalContext, SignalValue} from '../signals';\nimport type {InterpolationFunction} from '../tweening';\nimport type {Type, WebGLConvertible} from './Type';\n\nexport type SerializedColor = string;\n\nexport type PossibleColor =\n | SerializedColor\n | number\n | Color\n | {r: number; g: number; b: number; a: number};\n\nexport type ColorSignal<T> = Signal<PossibleColor, Color, T>;\n\nexport type ColorSpace =\n | 'rgb'\n | 'hsl'\n | 'hsv'\n | 'hsi'\n | 'lab'\n | 'oklab'\n | 'lch'\n | 'oklch'\n | 'hcl'\n | 'lrgb';\n\n/**\n * Represents a color.\n *\n * @remarks\n * Wraps {@link https://gka.github.io/chroma.js/ | chroma.js} internally,\n * providing color creation, conversion, and interpolation.\n */\nexport class Color implements Type, WebGLConvertible {\n public static readonly symbol = Symbol.for(\n '@canvas-commons/core/types/Color',\n );\n\n private inner: chroma.Color;\n\n public constructor(input: PossibleColor) {\n if (input instanceof Color) {\n this.inner = input.inner;\n return;\n }\n\n if (typeof input === 'object' && input !== null && 'r' in input) {\n this.inner = chroma.rgb(input.r, input.g, input.b, input.a);\n return;\n }\n\n this.inner = chroma(input);\n }\n\n private static fromChroma(inner: chroma.Color): Color {\n const color = new Color(0);\n color.inner = inner;\n return color;\n }\n\n public static lerp(\n from: Color | string | null,\n to: Color | string | null,\n value: number,\n colorSpace: ColorSpace = 'lch',\n ): Color {\n const fromColor =\n from === null ? null : typeof from === 'string' ? new Color(from) : from;\n const toColor =\n to === null ? null : typeof to === 'string' ? new Color(to) : to;\n\n const resolvedFrom =\n fromColor ?? toColor?.alpha(0) ?? new Color('rgba(0, 0, 0, 0)');\n const resolvedTo =\n toColor ?? fromColor?.alpha(0) ?? new Color('rgba(0, 0, 0, 0)');\n\n return Color.fromChroma(\n chroma.mix(resolvedFrom.inner, resolvedTo.inner, value, colorSpace),\n );\n }\n\n public static createLerp(\n colorSpace: ColorSpace,\n ): InterpolationFunction<Color> {\n return (\n from: Color | string | null,\n to: Color | string | null,\n value: number,\n ) => Color.lerp(from, to, value, colorSpace);\n }\n\n public static createSignal(\n initial?: SignalValue<PossibleColor>,\n interpolation: InterpolationFunction<Color> = Color.lerp,\n ): ColorSignal<void> {\n return new SignalContext(\n initial,\n interpolation,\n undefined,\n (value: PossibleColor) => new Color(value),\n ).toSignal();\n }\n\n public static fromHsv(h: number, s: number, v: number, a?: number): Color {\n const inner = chroma.hsv(h, s, v);\n if (a !== undefined) {\n return Color.fromChroma(inner.alpha(a));\n }\n return Color.fromChroma(inner);\n }\n\n public static isValid(input: string): boolean {\n return chroma.valid(input);\n }\n\n public hex(mode?: 'auto' | 'rgb' | 'rgba'): string {\n return this.inner.hex(mode);\n }\n\n public css(mode?: 'hsl'): string {\n return this.inner.css(mode);\n }\n\n public gl(): [number, number, number, number] {\n return this.inner.gl();\n }\n\n public alpha(): number;\n public alpha(value: number): Color;\n public alpha(value?: number): number | Color {\n if (value === undefined) {\n return this.inner.alpha();\n }\n return Color.fromChroma(this.inner.alpha(value));\n }\n\n public name(): string {\n return this.inner.name();\n }\n\n public rgb(round = true): [number, number, number] {\n return this.inner.rgb(round);\n }\n\n public rgba(round = true): [number, number, number, number] {\n return this.inner.rgba(round);\n }\n\n public hsl(): [number, number, number] {\n return this.inner.hsl();\n }\n\n public hsv(): [number, number, number] {\n return this.inner.hsv();\n }\n\n public hsi(): [number, number, number] {\n return this.inner.hsi();\n }\n\n public lab(): [number, number, number] {\n return this.inner.lab();\n }\n\n public lch(): [number, number, number] {\n return this.inner.lch();\n }\n\n public hcl(): [number, number, number] {\n return this.inner.hcl();\n }\n\n public oklab(): [number, number, number] {\n return this.inner.oklab();\n }\n\n public oklch(): [number, number, number] {\n return this.inner.oklch();\n }\n\n public num(): number {\n return this.inner.num();\n }\n\n public temperature(): number {\n return this.inner.temperature();\n }\n\n public clipped(): boolean {\n return this.inner.clipped();\n }\n\n public darken(amount?: number): Color {\n return Color.fromChroma(this.inner.darken(amount));\n }\n\n public brighten(amount?: number): Color {\n return Color.fromChroma(this.inner.brighten(amount));\n }\n\n public saturate(amount?: number): Color {\n return Color.fromChroma(this.inner.saturate(amount));\n }\n\n public desaturate(amount?: number): Color {\n return Color.fromChroma(this.inner.desaturate(amount));\n }\n\n public mix(\n color: Color | string,\n ratio?: number,\n colorSpace?: chroma.ColorFormat,\n ): Color {\n const other = typeof color === 'string' ? new Color(color) : color;\n return Color.fromChroma(this.inner.mix(other.inner, ratio, colorSpace));\n }\n\n public shade(ratio?: number, mode?: chroma.InterpolationMode): Color {\n return Color.fromChroma(this.inner.shade(ratio, mode));\n }\n\n public tint(ratio?: number, mode?: chroma.InterpolationMode): Color {\n return Color.fromChroma(this.inner.tint(ratio, mode));\n }\n\n public luminance(): number;\n public luminance(value: number, mode?: chroma.InterpolationMode): Color;\n public luminance(\n value?: number,\n mode?: chroma.InterpolationMode,\n ): number | Color {\n if (value === undefined) {\n return this.inner.luminance();\n }\n return Color.fromChroma(this.inner.luminance(value, mode));\n }\n\n public set(channel: string, value: string | number): Color {\n return Color.fromChroma(this.inner.set(channel, value));\n }\n\n public get(modechan: string): number {\n return this.inner.get(modechan);\n }\n\n public serialize(): SerializedColor {\n return this.css();\n }\n\n public toSymbol(): symbol {\n return Color.symbol;\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniform4fv(location, this.gl());\n }\n\n public lerp(to: Color, value: number, colorSpace?: ColorSpace): Color {\n return Color.lerp(this, to, value, colorSpace);\n }\n\n public toString(): string {\n return this.css();\n }\n}\n","import {Vector2} from './Vector';\n\nexport function transformAngle(angle: number, matrix: DOMMatrix) {\n return Vector2.fromDegrees(angle).transform(matrix).degrees;\n}\n\nexport function transformScalar(scalar: number, matrix: DOMMatrix) {\n return Vector2.magnitude(matrix.m11, matrix.m12) * scalar;\n}\n","import {Color, PossibleColor} from '../types';\nimport {MetaField} from './MetaField';\n\n/**\n * Represents a color stored in a meta file.\n */\nexport class ColorMetaField extends MetaField<\n PossibleColor | null,\n Color | null\n> {\n public readonly type = Color.symbol;\n\n public override parse(value: PossibleColor | null): Color | null {\n return value === null ? null : new Color(value);\n }\n\n public override serialize(): PossibleColor | null {\n return this.value.current?.serialize() ?? null;\n }\n}\n","import {MetaField} from './MetaField';\nimport {MetaOption} from './MetaOption';\n\n/**\n * Represents an enum value stored in a meta file.\n */\nexport class EnumMetaField<T> extends MetaField<T> {\n public static readonly symbol = Symbol.for(\n '@canvas-commons/core/meta/EnumMetaField',\n );\n public readonly type = EnumMetaField.symbol;\n\n public constructor(\n name: string,\n public readonly options: MetaOption<T>[],\n initial: T = options[0]?.value,\n ) {\n super(name, initial);\n }\n\n public set(value: T) {\n super.set(this.getOption(value)?.value);\n }\n\n public parse(value: T): T {\n return this.getOption(value)?.value;\n }\n\n public getOption(value: T): MetaOption<T> {\n return (\n this.options.find(option => option.value === value) ?? this.options[0]\n );\n }\n}\n","import type {ExporterClass, Project} from '../app';\nimport {ValueDispatcher} from '../events';\nimport {EnumMetaField} from './EnumMetaField';\nimport {MetaField} from './MetaField';\n\n/**\n * Represents the exporter configuration.\n */\nexport class ExporterMetaField extends MetaField<{\n name: string;\n options: unknown;\n}> {\n public readonly type = Object;\n\n /**\n * Triggered when the nested fields change.\n *\n * @eventProperty\n */\n public get onFieldsChanged() {\n return this.fields.subscribable;\n }\n private readonly fields: ValueDispatcher<MetaField<any>[]>;\n\n public get options(): MetaField<any> | undefined {\n return this.optionFields[this.current];\n }\n\n private readonly exporterField: EnumMetaField<string>;\n private readonly optionFields: MetaField<unknown>[];\n public readonly exporters: ExporterClass[];\n\n public constructor(\n name: string,\n project: Project,\n private current = 0,\n ) {\n const exporters = project.plugins.flatMap(\n plugin => plugin.exporters?.(project) ?? [],\n );\n const optionFields = exporters.map(exporter => exporter.meta(project));\n const exporterField = new EnumMetaField(\n 'exporter',\n exporters.map(exporter => ({\n value: exporter.id,\n text: exporter.displayName,\n })),\n exporters[current]?.id,\n );\n\n super(name, {\n name: exporterField.get(),\n options: optionFields[current]?.get(),\n });\n\n this.exporters = exporters;\n this.exporterField = exporterField;\n this.exporterField.onChanged.subscribe(this.handleChange, false);\n this.exporterField.disable(optionFields.length < 2).space();\n this.optionFields = optionFields;\n this.fields = new ValueDispatcher([this.exporterField as MetaField<any>]);\n\n if (this.options) {\n this.options.onChanged.subscribe(this.handleChange, false);\n this.fields.current = [this.exporterField, this.options];\n }\n }\n\n public set(value: {name: string; options: any}) {\n this.exporterField.set(value.name);\n this.options?.set(value.options ?? {});\n }\n\n public serialize(): {name: string; options: any} {\n return {\n name: this.exporterField.serialize(),\n options: this.options?.serialize() ?? null,\n };\n }\n\n public clone(): this {\n return new (<any>this.constructor)(this.name, this.exporters, this.current);\n }\n\n private handleChange = () => {\n const value = this.exporterField.get();\n const index = Math.max(\n this.exporters.findIndex(exporter => exporter.id === value),\n 0,\n );\n\n if (this.current !== index) {\n this.options?.onChanged.unsubscribe(this.handleChange);\n this.current = index;\n this.options?.onChanged.subscribe(this.handleChange, false);\n this.fields.current = this.options\n ? [this.exporterField, this.options]\n : [this.exporterField];\n }\n\n this.value.current = {\n name: this.exporterField.get(),\n options: this.options?.get() ?? null,\n };\n };\n}\n","import {Semaphore, useLogger} from '../utils';\nimport type {MetaField} from './MetaField';\n\n/**\n * Represents the meta file of a given entity.\n *\n * @remarks\n * This class is used exclusively by our Vite plugin as a bridge between\n * physical files and their runtime representation.\n *\n * @typeParam T - The type of the data stored in the meta file.\n *\n * @internal\n */\nexport class MetaFile<T> {\n private readonly lock = new Semaphore();\n private ignoreChange = false;\n private cache: T | null = null;\n private metaField: MetaField<T> | null = null;\n\n public constructor(\n private readonly name: string,\n private source: string | false = false,\n ) {}\n\n public attach(field: MetaField<T>) {\n if (this.metaField) return;\n this.metaField = field;\n if (this.cache) {\n this.metaField.set(this.cache);\n }\n this.metaField?.onChanged.subscribe(this.handleChanged);\n }\n\n protected handleChanged = async () => {\n if (import.meta.hot && this.metaField && !this.ignoreChange) {\n const data = this.metaField.serialize();\n await this.lock.acquire();\n try {\n // TODO Consider debouncing saving the meta file.\n await this.saveData(data);\n } catch (e: any) {\n useLogger().error(e);\n }\n this.lock.release();\n }\n };\n\n private async saveData(data: T) {\n if (this.source === false) {\n return;\n }\n\n if (!this.source) {\n throw new Error(`The meta file for ${this.name} is missing.`);\n }\n\n if (MetaFile.sourceLookup[this.source]) {\n throw new Error(`Metadata for ${this.name} is already being updated`);\n }\n\n const source = this.source;\n await new Promise<void>((resolve, reject) => {\n setTimeout(() => {\n delete MetaFile.sourceLookup[source];\n reject(`Connection timeout when updating metadata for ${this.name}`);\n }, 1000);\n MetaFile.sourceLookup[source] = () => {\n delete MetaFile.sourceLookup[source];\n resolve();\n };\n import.meta.hot!.send('canvas-commons:meta', {\n source,\n data,\n });\n });\n }\n\n /**\n * Load new metadata from a file.\n *\n * @remarks\n * This method is called during hot module replacement.\n *\n * @param data - New metadata.\n */\n public loadData(data: T) {\n this.ignoreChange = true;\n this.cache = data;\n this.metaField?.set(data);\n this.ignoreChange = false;\n }\n\n private static sourceLookup: Record<string, Callback> = {};\n\n static {\n if (import.meta.hot) {\n import.meta.hot.on('canvas-commons:meta-ack', ({source}) => {\n this.sourceLookup[source]?.();\n });\n }\n }\n}\n","import {clamp} from '../tweening';\nimport {MetaField} from './MetaField';\nimport {MetaOption} from './MetaOption';\n\n/**\n * Represents a number stored in a meta file.\n */\nexport class NumberMetaField extends MetaField<any, number> {\n public readonly type = Number;\n protected presets: MetaOption<number>[] = [];\n protected min = -Infinity;\n protected max = Infinity;\n protected precision = 0;\n protected step = 1;\n\n public parse(value: any): number {\n let parsed = parseFloat(value);\n if (isNaN(parsed)) {\n parsed = this.initial;\n }\n\n return clamp(this.min, this.max, parsed);\n }\n\n public getPresets() {\n return this.presets;\n }\n\n public setPresets(options: MetaOption<number>[]): this {\n this.presets = options;\n return this;\n }\n\n public setRange(min?: number, max?: number): this {\n this.min = min ?? -Infinity;\n this.max = max ?? Infinity;\n return this;\n }\n\n public getMin(): number {\n return this.min ?? -Infinity;\n }\n\n public getMax(): number {\n return this.max ?? Infinity;\n }\n\n public setPrecision(precision: number): this {\n this.precision = clamp(0, 100, precision);\n return this;\n }\n\n public getPrecision(): number {\n return this.precision;\n }\n\n public setStep(step: number): this {\n this.step = step;\n return this;\n }\n\n public getStep(): number {\n return this.step;\n }\n}\n","import {clamp} from '../tweening';\nimport {EPSILON} from '../types';\nimport {MetaField} from './MetaField';\n\n/**\n * Represents a range stored in a meta file.\n *\n * @remarks\n * Range is an array with two elements denoting the beginning and end of a\n * range, respectively.\n */\nexport class RangeMetaField extends MetaField<\n [number, number | null],\n [number, number]\n> {\n public static readonly symbol = Symbol.for(\n '@canvas-commons/core/meta/RangeMetaField',\n );\n public readonly type = RangeMetaField.symbol;\n\n public override parse(value: [number, number | null]): [number, number] {\n return this.parseRange(Infinity, value[0], value[1] ?? Infinity);\n }\n\n /**\n * Convert the given range from frames to seconds and update this field.\n *\n * @remarks\n * This helper method applies additional validation to the range, preventing\n * it from overflowing the timeline.\n *\n * @param startFrame - The beginning of the range.\n * @param endFrame - The end of the range.\n * @param duration - The current duration in frames.\n * @param fps - The current framerate.\n */\n public update(\n startFrame: number,\n endFrame: number,\n duration: number,\n fps: number,\n ) {\n this.value.current = this.parseRange(\n duration / fps - EPSILON,\n startFrame / fps - EPSILON,\n endFrame / fps - EPSILON,\n );\n }\n\n protected parseRange(\n duration: number,\n startFrame: number = this.value.current[0],\n endFrame: number = this.value.current[1],\n ): [number, number] {\n startFrame = clamp(0, duration, startFrame);\n endFrame = clamp(0, duration, endFrame ?? Infinity);\n\n if (startFrame > endFrame) {\n [startFrame, endFrame] = [endFrame, startFrame];\n }\n\n if (endFrame >= duration) {\n endFrame = Infinity;\n }\n\n return [startFrame, endFrame];\n }\n}\n","import {MetaField} from './MetaField';\nimport {MetaOption} from './MetaOption';\n\n/**\n * Represents a string stored in a meta file.\n */\nexport class StringMetaField<T extends string = string> extends MetaField<T> {\n public readonly type = String;\n protected presets: MetaOption<T>[] = [];\n\n public getPresets() {\n return this.presets;\n }\n\n public setPresets(options: MetaOption<T>[]): this {\n this.presets = options;\n return this;\n }\n}\n","import {PossibleVector2, Vector2} from '../types';\nimport {MetaField} from './MetaField';\n\n/**\n * Represents a two-dimensional vector stored in a meta file.\n */\nexport class Vector2MetaField extends MetaField<PossibleVector2, Vector2> {\n public readonly type = Vector2.symbol;\n\n public override parse(value: PossibleVector2): Vector2 {\n return new Vector2(value);\n }\n\n public override serialize(): PossibleVector2 {\n return this.value.current.serialize();\n }\n}\n","import {SignalValue} from '../signals/types';\nimport {useScene} from '../utils';\n\n/**\n * Transition to the current scene by altering the Context2D before scenes are rendered.\n *\n * @param current - The callback to use before the current scene is rendered.\n * @param previous - The callback to use before the previous scene is rendered.\n * @param previousOnTop - Whether the previous scene should be rendered on top.\n */\nexport function useTransition(\n current: (ctx: CanvasRenderingContext2D) => void,\n previous?: (ctx: CanvasRenderingContext2D) => void,\n previousOnTop?: SignalValue<boolean>,\n) {\n if (previous == null) {\n previous = () => {\n // do nothing\n };\n }\n\n const scene = useScene();\n const prior = scene.previous;\n scene.previousOnTop = previousOnTop ?? false;\n\n const unsubPrev = prior?.lifecycleEvents.onBeforeRender.subscribe(previous);\n const unsubNext = scene.lifecycleEvents.onBeforeRender.subscribe(current);\n\n scene.enterInitial();\n\n return () => {\n scene.enterAfterTransitionIn();\n unsubPrev?.();\n unsubNext();\n };\n}\n","import {createSignal} from '../signals';\nimport {ThreadGenerator} from '../threading';\nimport {useTransition} from './useTransition';\n\n/**\n * Perform a transition that fades between the scenes.\n *\n * @param duration - The duration of the transition.\n */\nexport function* fadeTransition(duration = 0.6): ThreadGenerator {\n const progress = createSignal(0);\n const endTransition = useTransition(ctx => {\n ctx.globalAlpha = progress();\n });\n\n yield* progress(1, duration);\n endTransition();\n}\n","import {all} from '../flow';\nimport {ThreadGenerator} from '../threading';\nimport {Direction, Origin, Vector2} from '../types';\nimport {useScene} from '../utils';\nimport {useTransition} from './useTransition';\n\n/**\n * Perform a transition that slides the scene in the given direction.\n *\n * @param direction - The direction in which to slide.\n * @param duration - The duration of the transition.\n */\nexport function slideTransition(\n direction: Direction,\n duration?: number,\n): ThreadGenerator;\n/**\n * Perform a transition that slides the scene towards the given origin.\n *\n * @param origin - The origin towards which to slide.\n * @param duration - The duration of the transition.\n */\nexport function slideTransition(\n origin: Origin,\n duration?: number,\n): ThreadGenerator;\nexport function* slideTransition(\n direction: Direction | Origin = Direction.Top,\n duration = 0.6,\n): ThreadGenerator {\n const size = useScene().getRealSize();\n const position = size.getOriginOffset(direction).scale(2);\n const previousPosition = Vector2.createSignal();\n const currentPosition = Vector2.createSignal(position);\n const endTransition = useTransition(\n ctx => ctx.translate(currentPosition.x(), currentPosition.y()),\n ctx => ctx.translate(previousPosition.x(), previousPosition.y()),\n );\n\n yield* all(\n previousPosition(position.scale(-1), duration),\n currentPosition(Vector2.zero, duration),\n );\n endTransition();\n}\n","import {waitFor} from '../flow';\nimport {SignalValue} from '../signals';\nimport {ThreadGenerator} from '../threading';\nimport {useTransition} from './useTransition';\n\n/**\n * Perform a transition that doesn't do anything.\n *\n * @remarks\n * This is useful when you want to achieve a transition effect by animating\n * objects in the scenes. It will overlay the scenes on top of each other for\n * the duration of the transition.\n *\n * @param duration - The duration of the transition.\n * @param previousOnTop - Whether the previous scene should be rendered on top.\n */\nexport function* waitTransition(\n duration = 0.6,\n previousOnTop: SignalValue<boolean> = true,\n): ThreadGenerator {\n const endTransition = useTransition(\n () => {\n // do nothing\n },\n undefined,\n previousOnTop,\n );\n\n yield* waitFor(duration);\n endTransition();\n}\n","import {all} from '../flow';\nimport {createSignal} from '../signals';\nimport {ThreadGenerator} from '../threading';\nimport {clampRemap, easeInOutCubic, linear} from '../tweening';\nimport {BBox, Vector2} from '../types';\nimport {useScene} from '../utils';\nimport {useTransition} from './useTransition';\n\n/**\n * Perform a transition that zooms in on a given area of the scene.\n *\n * @param area - The area on which to zoom in.\n * @param duration - The duration of the transition.\n */\nexport function* zoomInTransition(area: BBox, duration = 0.6): ThreadGenerator {\n const scale = useScene().getRealSize().div(area.size);\n\n const currentPosition = Vector2.createSignal(area.position);\n const currentScale = Vector2.createSignal(Vector2.one.div(scale));\n const previousPosition = Vector2.createSignal(0);\n const previousScale = Vector2.createSignal(1);\n const alpha = createSignal(0);\n\n const endTransition = useTransition(\n ctx => {\n ctx.globalAlpha = clampRemap(0.1, 0.5, 0, 1, alpha());\n ctx.translate(currentPosition.x(), currentPosition.y());\n ctx.scale(currentScale.x(), currentScale.y());\n },\n ctx => {\n ctx.globalAlpha = clampRemap(0.5, 0.9, 1, 0, alpha());\n ctx.translate(previousPosition.x(), previousPosition.y());\n ctx.scale(previousScale.x(), previousScale.y());\n },\n );\n\n const timing = (v: number) => easeInOutCubic(v * v);\n yield* all(\n currentPosition(Vector2.zero, duration, timing),\n previousPosition(area.position.flipped.mul(scale), duration, timing),\n currentScale(1, duration, timing),\n previousScale(scale, duration, timing),\n alpha(1, duration, linear),\n );\n\n endTransition();\n}\n","import {all} from '../flow';\nimport {createSignal} from '../signals';\nimport {ThreadGenerator} from '../threading';\nimport {clampRemap, easeInOutCubic, linear} from '../tweening';\nimport {BBox, Vector2} from '../types';\nimport {useScene} from '../utils';\nimport {useTransition} from './useTransition';\n\n/**\n * Perform a transition that zooms out from a given area of the scene.\n *\n * @param area - The area from which to zoom out.\n * @param duration - The duration of the transition.\n */\nexport function* zoomOutTransition(\n area: BBox,\n duration = 0.6,\n): ThreadGenerator {\n const scale = useScene().getRealSize().div(area.size);\n\n const currentPosition = Vector2.createSignal(\n area.position.flipped.mul(scale),\n );\n const currentScale = Vector2.createSignal(scale);\n const previousPosition = Vector2.createSignal(0);\n const previousScale = Vector2.createSignal(1);\n const alpha = createSignal(0);\n\n const endTransition = useTransition(\n ctx => {\n ctx.globalAlpha = clampRemap(0.1, 0.5, 0, 1, alpha());\n ctx.translate(currentPosition.x(), currentPosition.y());\n ctx.scale(currentScale.x(), currentScale.y());\n },\n ctx => {\n ctx.globalAlpha = clampRemap(0.5, 0.9, 1, 0, alpha());\n ctx.translate(previousPosition.x(), previousPosition.y());\n ctx.scale(previousScale.x(), previousScale.y());\n },\n );\n\n const timing = (v: number) => easeInOutCubic(Math.sqrt(v));\n yield* all(\n currentPosition(Vector2.zero, duration, timing),\n previousPosition(area.position, duration, timing),\n currentScale(1, duration, timing),\n previousScale(Vector2.one.div(scale), duration, timing),\n alpha(1, duration, linear),\n );\n\n endTransition();\n}\n"],"mappings":";;;;;;;;AAUA,IAAsB,sBAAtB,MAGE;CACA,eACE,IAAI,aAAa,IAAI;CAEvB,8BAAsB,IAAI,IAAc;;;;CAKxC,UAAiB,SAAmB;EAClC,KAAK,YAAY,IAAI,OAAO;EAC5B,aAAa,KAAK,YAAY,OAAO;CACvC;;;;CAKA,YAAmB,SAAmB;EACpC,KAAK,YAAY,OAAO,OAAO;CACjC;;;;CAKA,QAAe;EACb,KAAK,YAAY,MAAM;CACzB;CAEA,kBAA4B,OAAuC;EACjE,OAAO,CAAC,GAAG,KAAK,WAAW,EAAE,KAAI,YAAW,QAAQ,KAAK,CAAC;CAC5D;AACF;;;;;;;;;;;AAYA,IAAa,eAAb,MAGE;CAEY;CADZ,YACE,YACA;EADU,KAAA,aAAA;CACT;;;;;;;;CASH,UAAiB,SAAmB;EAClC,OAAO,KAAK,WAAW,UAAU,OAAO;CAC1C;;;;;;CAOA,YAAmB,SAAmB;EACpC,KAAK,WAAW,YAAY,OAAO;CACrC;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnDA,IAAa,uBAAb,cAA6C,oBAG3C;CACA,MAAa,SAAS,OAAyB;EAC7C,MAAM,QAAQ,IAAI,KAAK,kBAAkB,KAAK,CAAC;CACjD;AACF;;;;;;;;;;;;;;;;;;;;;;;;;ACfA,IAAa,kBAAb,cAAwC,oBAAuB;CAC7D,SAAgB,OAAU;EACxB,KAAK,kBAAkB,KAAK;CAC9B;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACKA,IAAa,iBAAb,cAAoC,oBAA0B;CAC5D,QAAgB;;;;CAKhB,QAAe;EACb,IAAI,CAAC,KAAK,OAAO;GACf,KAAK,QAAQ;GACb,KAAK,kBAAkB;EACzB;CACF;;;;CAKA,QAAe;EACb,KAAK,QAAQ;CACf;;;;CAKA,WAAkB;EAChB,OAAO,KAAK;CACd;CAEA,UAAiB,SAA6B;EAC5C,MAAM,cAAc,MAAM,UAAU,OAAO;EAC3C,IAAI,KAAK,OACP,QAAQ;EAEV,OAAO;CACT;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnCA,IAAa,kBAAb,cAAwC,oBAAuB;CA2BlC;CA1B3B,eACE,IAAI,uBAAuB,IAAI;;;;CAKjC,IAAW,UAAU;EACnB,OAAO,KAAK;CACd;;;;;;;;;CAUA,IAAW,QAAQ,OAAU;EAC3B,KAAK,QAAQ;EACb,KAAK,kBAAkB,KAAK;CAC9B;;;;CAKA,YAAmB,OAAkB;EACnC,MAAM;EADmB,KAAA,QAAA;CAE3B;;;;CAKA,UAAiB,SAA0B,sBAAsB,MAAM;EACrE,MAAM,cAAc,MAAM,UAAU,OAAO;EAC3C,IAAI,qBACF,QAAQ,KAAK,KAAK;EAEpB,OAAO;CACT;AACF;;;;;;;;;;AAWA,IAAa,yBAAb,cAA+C,aAG7C;;;;CAIA,IAAW,UAAU;EACnB,OAA4B,KAAK,WAAY;CAC/C;;;;;;;;;;;;CAaA,UACE,SACA,sBAAsB,MACV;EACZ,OAA4B,KAAK,WAAY,UAC3C,SACA,mBACF;CACF;AACF;;;;;;;;;;AC1GA,IAAa,YAAb,MAGE;CAmCkB;CACA;;;;CAhClB,OAA4B,KAAA;CAC5B,UAAiB;CACjB,cAAqB;;;;;;CAOrB,IAAW,YAAY;EACrB,OAAO,KAAK,MAAM;CACpB;CAEA;;;;;;CAOA,IAAW,aAAa;EACtB,OAAO,KAAK,SAAS;CACvB;CAEA,WAA8B,IAAI,gBAAgB,KAAK;;;;;CAMvD,YACE,MACA,SACA;EAFgB,KAAA,OAAA;EACA,KAAA,UAAA;EAEhB,KAAK,QAAQ,IAAI,gBAAgB,OAAO;CAC1C;;;;CAKA,MAAqB;EACnB,OAAO,KAAK,MAAM;CACpB;;;;;;CAOA,IAAW,OAAyB;EAClC,KAAK,MAAM,UAAU,KAAK,MAAM,KAAK;CACvC;;;;;;CAOA,MAAa,OAAiC;EAC5C,OAAO;CACT;;;;CAKA,YAAqC;EACnC,OAAO,KAAK,MAAM;CACpB;;;;CAKA,QAAqB;EACnB,OAAO,IAAU,KAAK,YAAa,KAAK,MAAM,KAAK,IAAI,CAAC;CAC1D;;;;;;CAOA,QAAe,QAAQ,MAAY;EACjC,KAAK,SAAS,UAAU;EACxB,OAAO;CACT;;;;;;CAOA,MAAa,QAAQ,MAAY;EAC/B,KAAK,UAAU;EACf,OAAO;CACT;;;;;;CAOA,SAAgB,aAA2B;EACzC,KAAK,cAAc;EACnB,OAAO;CACT;AACF;;;ACrGA,IAAM,0BAAN,cAEU,UAAsB;CAC9B,OAAuB;;;;;;CAOvB,IAAW,kBAAkB;EAC3B,OAAO,KAAK,MAAM;CACpB;CAEA,eAAyB;CACzB,eAAkD,CAAC;CACnD;CACA;CAEA,YAAmB,MAAc,QAAW;EAC1C,MAAM,MAAM,IAAI,IAAI,OAAO,QAAQ,MAAM,CAAC;EAC1C,MACE,MACA,OAAO,YACL,MAAM,KAAK,MAAM,CAAC,MAAM,WAAW,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,CACxD,CACF;EAEA,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC;EAClD,KAAK,SAAS;EACd,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,QAAQ;GACtC,OAAO,eAAe,MAAM,KAAK,EAAC,OAAO,MAAK,CAAC;GAC/C,MAAM,UAAU,UAAU,KAAK,YAAY;EAC7C;CACF;CAEA,IAAoB,OAA4B;EAC9C,KAAK,eAAe;EACpB,KAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,KAAK,GAAG;GACrD,MAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;GACjC,IAAI,OACF,MAAM,IAAI,UAAU;QAEpB,KAAK,aAAa,OAAO;EAE7B;EACA,KAAK,eAAe;EACpB,KAAK,aAAa;CACpB;CAEA,YAAwC;EACtC,OAAO;GACL,GAAG,KAAK,UAAU,WAAW;GAC7B,GAAG,KAAK;EACV;CACF;CAEA,QAA8B;EAC5B,MAAM,SAAS,IAAU,KAAK,YAC5B,KAAK,MACL,KAAK,UAAU,OAAO,CACxB;EACA,OAAO,IAAI,gBAAgB,KAAK,YAAY,CAAC;EAE7C,OAAO;CACT;CAEA,qBAA+B;EAC7B,IAAI,KAAK,cAAc;EACvB,KAAK,MAAM,UAAU;GACnB,GAAG,KAAK,UAAU,KAAK;GACvB,GAAG,KAAK;EACV;CACF;CAEA,UACE,IAC2B;EAK3B,OAJoB,OAAO,YACzB,MAAM,KAAK,KAAK,SAAS,CAAC,MAAM,WAAW,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,CAG/C;CACnB;AACF;;;;AAWA,MAAa,kBAAkB;;;;;;AC9G/B,IAAa,gBAAb,cAAmC,UAAwB;CACzD,OAAuB;CAEvB,MAAa,OAAqB;EAChC,OAAO,CAAC,CAAC;CACX;AACF;;;ACTA,MAAM,aAAsB,CAAC;;;;AAK7B,SAAgB,WAAkB;CAChC,MAAM,QAAQ,WAAW,GAAG,EAAE;CAC9B,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,oDAAoD;CAEtE,OAAO;AACT;AAEA,SAAgB,WAAW,OAAc;CACvC,WAAW,KAAK,KAAK;AACvB;AAEA,SAAgB,SAAS,OAAc;CACrC,IAAI,WAAW,IAAI,MAAM,OACvB,MAAM,IAAI,MAAM,+CAA+C;AAEnE;AAEA,SAAgB,YAAY;CAC1B,OAAO,WAAW,GAAG,EAAE,GAAG,UAAU;AACtC;;;;;;;;AASA,SAAgB,cAAc;CAC5B,SAAS,EAAE,sBAAsB;AACnC;;;AC/BA,IAAa,gBAAb,cAAmC,MAAM;;;;CAIvC;;;;CAIA;;;;CAIA;;;;CAIA;CAIA,YAAmB,OAAoC,SAAkB;EACvE,IAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,KAAK;GACX,KAAK,UAAU;EACjB,OAAO;GACL,MAAM,MAAM,OAAO;GACnB,KAAK,UAAU,MAAM;GACrB,KAAK,SAAS,MAAM;GACpB,KAAK,aAAa,MAAM;GACxB,KAAK,UAAU,MAAM;EACvB;CACF;AACF;;;ACpCA,MAAM,cAAwB,CAAC;;;;AAK/B,SAAgB,YAAoB;CAClC,MAAM,SAAS,YAAY,GAAG,EAAE;CAChC,IAAI,CAAC,QACH,MAAM,IAAI,cACR,uDACA;2CAEF;CAEF,OAAO;AACT;AAEA,SAAgB,YAAY,QAAgB;CAC1C,YAAY,KAAK,MAAM;AACzB;AAEA,SAAgB,UAAU,QAAgB;CACxC,IAAI,YAAY,IAAI,MAAM,QACxB,MAAM,IAAI,MAAM,gDAAgD;AAEpE;;;ACxBA,UAAiB,WAAW,MAA+B;CACzD,MAAM,EAAC,WAAU,SAAS;CAC1B,MAAM,SAAS,UAAU;CACzB,OAAO,SAAS,MAAM,OAAO,KAAK;CAClC;CAEA,OAAO,OAAO,WAAW,IAAI,GAC3B;AAEJ;;;ACbA,SAAgB,WAA6B,OAAyB;CACpE,OAAuB,MAAM,GAAG,YAAY,IAAI,MAAM,MAAM,CAAC;AAC/D;;;ACMA,SAAgB,YAA6B;CAC3C,IAAI;CACJ,MAAM,OAAO,aAAiB;EAC5B,IAAI,aAAa,KAAA,GACf,QAAQ;OAER,OAAO;CAEX;CAEA,OAAO;AACT;AAEA,SAAgB,QACd,QACA,KACkC;CAClC,QAAO,aAAY;EACjB,OAAO,OAAO;CAChB;AACF;AAQA,SAAgB,WAEK;CACnB,OAAO,CAAC;AACV;;;;;;;;;;;;;;;;;;;;;;;;;;ACRA,SAAgB,iBAAuC;CACrD,MAAM,SAAS,WAAY,CAE3B;CACA,OAAO,QAAQ,CAAC;CAChB,OAAO,IAAI,MAAM,QAAQA,SAAO;AAClC;AAEA,MAAMA,YAA0C;CAC9C,MAAM,QAAQ,GAAG,UAAU;EACzB,IAAI,SAAS,WAAW,GACtB,OAAO,OAAO,MAAM;EAGtB,OAAO,MAAM,KAAK,GAAG,QAAQ;CAC/B;CAEA,IAAI,QAAQ,UAAU,UAAU;EAC9B,MAAM,QAAQ,QAAQ,IAAI,OAAO,OAAO,UAAU,QAAQ;EAC1D,IAAI,OAAO,UAAU,YACnB,OAAO,MAAM,KAAK,OAAO,KAAK;EAGhC,OAAO;CACT;CAEA,IAAI,QAAQ,UAAU,OAAO,UAAU;EACrC,OAAO,QAAQ,IAAI,OAAO,OAAO,UAAU,OAAO,QAAQ;CAC5D;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACVA,SAAgB,eAAmC;CACjD,MAAM,wBAAQ,IAAI,IAA0B;CAC5C,MAAM,QAAQ;CACd,OAAO,IAAI,MAAM,OAAO,OAAO;AACjC;AAEA,MAAM,UAAqD;CACzD,IAAI,QAAQ,UAAU;EACpB,IAAI,QAAQ,IAAI,QAAQ,QAAQ,GAC9B,OAAO,QAAQ,IAAI,QAAQ,QAAQ;EAGrC,IAAI,aAAa,WACf,OAAO,SACL,UACU;GACV,MAAM,SAAmB,CAAC;GAC1B,KAAK,MAAM,SAAS,OAAO,OAAO,GAChC,OAAO,KAAK,SAAS,MAAM,GAAG,OAAO,MAAM,CAAC;GAE9C,OAAO;EACT;EAGF,IAAI,OAAO,aAAa,UAAU;GAChC,IAAI,QAAQ,OAAO,IAAI,QAAQ;GAC/B,IAAI,CAAC,OAAO;IACV,QAAQ,UAAU;IAClB,OAAO,IAAI,UAAU,KAAK;GAC5B;GACA,OAAO;EACT;CACF;CAEA,IAAI,QAAQ,UAAU;EACpB,IAAI,QAAQ,IAAI,QAAQ,QAAQ,GAC9B,OAAO;EAGT,IAAI,OAAO,aAAa,UACtB,OAAO,OAAO,IAAI,QAAQ;EAG5B,OAAO;CACT;AACF;;;AC7FA,SAAS,UAAU,OAAoB;CACrC,QAAQ,OAAO,OAAf;EACE,KAAK,UAEH,OAAO;EACT,KAAK,aAEH,OAAO;EACT;GAEE,IAAI,OAAO,MAAM,KAAK,GACpB,OAAO;GAET,OAAO,KAAK,UAAU,KAAK;CAC/B;AACF;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAgB,MAAM,SAAc;CAClC,MAAM,SAAqB,EAAC,SAAS,UAAU,OAAO,EAAC;CAEvD,IAAI,WAAW,OAAO,YAAY,UAChC,OAAO,SAAS;CAGlB,UAAU,EAAE,MAAM,MAAM;AAC1B;;;;;;;;;;ACzCA,SAAgB,UACd,IACA,SACA,SAC6B;CAC7B,OAAO,SAAqB,GAAG,MAAM;EACnC,UAAU,EAAE,KAAK;GAAC;GAAS;GAAS,wBAAO,IAAI,MAAM,GAAE;EAAK,CAAC;EAC7D,OAAO,GAAG,MAAM,MAAM,IAAI;CAC5B;AACF;;;AChBA,SAAgB,WAAW,OAAwB;CACjD,OAAO;EACL,SAAS,MAAM;EACf,OAAO,MAAM;EACb,SAAS,MAAM;CACjB;AACF;;;ACRA,IAAA,gCAAe;;;;;;;;;;;;;;;ACSf,IAAa,oBAAb,cAAuC,cAAc;CAGnD,YAAmB,OAAwC,SAAkB;EAC3E,IAAI,OAAO,UAAU,UACnB,MAAM;GACJ,SAAS;GACT,UAAU,WAAW,MAAMC;EAC7B,CAAC;OAED,MAAM;GACJ,GAAG;GACH,UAAU,MAAM,WAAW,MAAMA;EACnC,CAAC;CAEL;AACF;;;;;;;;;;;;;;;ACXA,SAAgB,WAAW,QAA+C;CACxE,OAAO,OAAO,WAAW,aAAa,eAAe;AACvD;;;;;;;;ACRA,IAAA,wBAAe,WAAW;CACxB,MAAM;CACN,YAAY;EACV,OAAO,CAAC,aAAa;CACvB;AACF,CAAC;;;ACXD,IAAY,WAAL,yBAAA,UAAA;CACL,SAAA,WAAA;CACA,SAAA,UAAA;CACA,SAAA,UAAA;CACA,SAAA,UAAA;CACA,SAAA,aAAA;CACA,SAAA,WAAA;CACA,SAAA,WAAA;;AACF,EAAA,CAAA,CAAA;AAsFA,IAAa,SAAb,MAAoB;;;;CAIlB,IAAW,WAAW;EACpB,OAAO,KAAK,OAAO;CACrB;CACA,SAA0B,IAAI,gBAA4B;CAC1D,UAAwC,CAAC;CAEzC,YAA4C,CAAC;CAE7C,IAAW,SAAqB;EAC9B,KAAK,OAAO,SAAS,OAAO;EAC5B,KAAK,QAAQ,KAAK,OAAO;CAC3B;CAEA,MAAa,SAA8B;EACzC,KAAK,SAAA,SAAyB,OAAO;CACvC;CAEA,KAAY,SAA8B;EACxC,KAAK,SAAA,QAAwB,OAAO;CACtC;CAEA,KAAY,SAA8B;EACxC,KAAK,SAAA,QAAwB,OAAO;CACtC;CAEA,KAAY,SAA8B;EACxC,KAAK,SAAA,QAAwB,OAAO;CACtC;CAEA,QAAe,SAA8B;EAC3C,KAAK,SAAA,WAA2B,OAAO;CACzC;CAEA,MAAa,SAA8B;EACzC,KAAK,SAAA,SAAyB,OAAO;CACvC;CAEA,MAAa,SAA8B;EACzC,KAAK,SAAA,SAAyB,OAAO;CACvC;CAEA,SAAmB,OAAiB,SAA8B;EAChE,MAAM,SAAS,OAAO,YAAY,WAAW,EAAC,SAAS,QAAO,IAAI;EAClE,OAAO,QAAQ;EACf,KAAK,IAAI,MAAM;CACjB;CAEA,QAAe,IAAY,SAAsB;EAC/C,MAAM,OAAO,YAAY,IAAI;EAC7B,IAAI,KAAK,UAAU,KAAK;GACtB,MAAM,UAAU,KAAK,UAAU;GAC/B,OAAO,KAAK,UAAU;GAEtB,MAAM,SAAS,WAAW,EAAC,SAAS,GAAE;GACtC,OAAO,UAAA;GACP,OAAO,aAAa,OAAO;GAC3B,KAAK,IAAI,MAAM;GAEf;EACF;EAEA,KAAK,UAAU,MAAM;CACvB;AACF;;;AChKA,MAAa,SAA+B;CAC1C;EAAC,OAAO;EAAM,MAAM;CAAiB;CACrC;EAAC,OAAO;EAAK,MAAM;CAAa;CAChC;EAAC,OAAO;EAAG,MAAM;CAAa;CAC9B;EAAC,OAAO;EAAG,MAAM;CAAe;AAClC;AAEA,MAAa,cAA8C,CACzD;CAAC,OAAO;CAAQ,MAAM;AAAM,GAC5B;CAAC,OAAO;CAAc,MAAM;AAAQ,CACtC;AAEA,MAAa,YAAgD;CAC3D;EAAC,OAAO;EAAa,MAAM;CAAK;CAChC;EAAC,OAAO;EAAc,MAAM;CAAM;CAClC;EAAC,OAAO;EAAc,MAAM;CAAM;AACpC;AAEA,MAAa,aAAmC,CAC9C;CAAC,OAAO;CAAI,MAAM;AAAQ,GAC1B;CAAC,OAAO;CAAI,MAAM;AAAQ,CAC5B;;;ACVA,SAAS,sBAAsB,SAAkB;CAC/C,MAAM,OAAO;EACX,SAAS,IAAI,UAAU,WAAW,CAAC;EACnC,QAAQ,IAAI,gBAAgB,WAAW;GACrC,YAAY,IAAI,eAAe,cAAc,IAAI;GACjD,OAAO,IAAI,eAAe,SAAS,CAAC,GAAG,QAAQ,CAAC;GAChD,MAAM,IAAI,iBAAiB,cAAc,IAAI,QAAQ,MAAM,IAAI,CAAC;GAChE,aAAa,IAAI,gBAAgB,gBAAgB,CAAC,EAC/C,aAAa,CAAC,EACd,QAAQ,EAAG;EAChB,CAAC;EACD,SAAS,IAAI,gBAAgB,WAAW;GACtC,KAAK,IAAI,gBAAgB,cAAc,EAAE,EACtC,WAAW,UAAU,EACrB,SAAS,CAAC;GACb,iBAAiB,IAAI,cAAc,SAAS,QAAQ,CAAC;EACvD,CAAC;EACD,WAAW,IAAI,gBAAgB,aAAa;GAC1C,KAAK,IAAI,gBAAgB,cAAc,EAAE,EACtC,WAAW,UAAU,EACrB,SAAS,CAAC;GACb,iBAAiB,IAAI,cAAc,SAAS,QAAQ,CAAC;GACrD,YAAY,IAAI,cAAc,eAAe,WAAW;GACxD,UAAU,IAAI,kBAAkB,YAAY,OAAO;EACrD,CAAC;CACH;CAEA,KAAK,OAAO,YAAY,QAAQ,CAAC,QAAQ,KAAK;CAE9C,OAAO;AACT;AAEA,IAAa,kBAAb,cAAqC,gBAEnC;CACA,YAAmB,SAAkB;EACnC,MAAM,WAAW,sBAAsB,OAAO,CAAC;CACjD;CAEA,yBAOE;EACA,OAAO;GACL,GAAG,KAAK,OAAO,IAAI;GACnB,GAAG,KAAK,QAAQ,IAAI;EACtB;CACF;CAEA,2BAYE;EACA,OAAO;GACL,GAAG,KAAK,OAAO,IAAI;GACnB,GAAG,KAAK,UAAU,IAAI;EACxB;CACF;AACF;;;;;;ACzEA,SAAgB,yBAAyB;CACvC,OAAO,IAAI,gBAAgB,wBAAwB;EACjD,SAAS,IAAI,UAAU,WAAW,CAAC;EACnC,YAAY,IAAI,gBAAgB,cAAc;GAC5C,OAAO,IAAI,eAAe,gBAAgB,IAAI,MAAM,SAAS,CAAC,EAAE,SAC9D,iFACF;GACA,MAAM,IAAI,cAAc,eAAe,KAAK,EAAE,SAC5C,uDACF;GACA,aAAa,IAAI,cAAc,eAAe,IAAI,EAAE,SAClD,sDACF;EACF,CAAC;EACD,UAAU,IAAI,gBAAgB,YAAY;GACxC,YAAY,IAAI,eAAe,cAAc,IAAI,EAAE,SACjD,oDACF;GACA,MAAM,IAAI,iBACR,cACA,IAAI,QAAQ,MAAM,IAAI,CACxB,EAAE,SAAS,8CAA8C;EAC3D,CAAC;CACH,CAAC;AACH;;;;;;;;;;;;;;;;;ACdA,SAAgB,UACd,MACA,UACA,SACA,QACA,UACA,cACA,SAAS,OAAO,UAAU,IAAI,OAAO,GACrC,oCAAyC,IAAI,IAAoB,GACxD;CACT,MAAM,WAAW,uBAAuB;CACxC,aAAa,OAAO,QAAQ;CAE5B,SAAS,cAAc,QAAwC;EAC7D,IAAI,OAAO,WAAW,UAAU,OAAO;EAEvC,OAAO,kBAAkB,IAAI,MAAM;CACrC;CAEA,SAAS,kBAAkB,SAA6C;EACtE,OAAO,SAAS,IAAI,aAAa,GAAG,OAAO,SAAS,KAAK,CAAC;CAC5D;CAEA,MAAM,aAAa,CACjBC,sBAAc,GACd,GAAG,kBAAkB,sBAAsB,QAAQ,OAAO,CAAC,CAC7D;CAEA,MAAM,4BAAY,IAAI,IAAY;CAClC,MAAM,kBAA4B,CAAC;CACnC,IAAI,iBAAiB;CAErB,KAAK,MAAM,UAAU,YAAY;EAC/B,IAAI,CAAC,UAAU,UAAU,IAAI,OAAO,IAAI,GACtC;EAGF,UAAU,IAAI,OAAO,IAAI;EACzB,gBAAgB,KAAK,MAAM;EAE3B,iBAAiB;GACf,GAAG;GACH,GAAI,OAAO,WAAW,cAAc,KAAK,CAAC;EAC5C;CACF;CAEA,MAAM,UAAU;EACd;EACA,GAAG;EACH,SAAS;EACT;EACA;EACA;CACF;CAEA,QAAQ,OAAO,IAAI,gBAAgB,OAAO;CAC1C,QAAQ,KAAK,OAAO,IAAI,SAAS,SAAS,IAAI,CAAC;CAC/C,QAAQ,yBAAyB;CACjC,SAAS,OAAO,QAAQ,IAAI;CAE5B,gBAAgB,SAAQ,WAAU,OAAO,UAAU,OAAO,CAAC;CAE3D,OAAO;AACT;;;;;;;;;;;;;AAcA,eAAsB,gBACpB,MACA,UACA,SACA,QACA,UACA,cACkB;CAClB,MAAM,SAAS,OAAO,UAAU,IAAI,OAAO;CAC3C,MAAM,oCAAoB,IAAI,IAAoB;CAGlD,MAAM,eADa,sBAAsB,QAAQ,OACnB,GAAG,QAAQ,iBAAiB;CAE1D,OAAO,UACL,MACA,UACA,SACA,QACA,UACA,cACA,QACA,iBACF;AACF;AAEA,eAAe,eACb,SACA,QACA,aACA;CACA,IAAI,CAAC,SAAS;CAEd,MAAM,QAAQ,IACZ,QAAQ,IAAI,OAAM,WAAU;EAC1B,IAAI,OAAO,WAAW,UAAU;EAEhC,MAAM,eAAe,MAAM,WAAW,QAAQ,MAAM;EACpD,IAAI,CAAC,cAAc;EACnB,YAAY,IAAI,QAAQ,YAAY;CACtC,CAAC,CACH;AACF;AAEA,eAAe,WACb,QACA,QACwB;CACxB,IAAI;EACF,IAAI,MAAM,QAAQ;EAClB,MAAM,UAAU,IAAI,IAAI,OAAO,KAAK,GAAG,EAAE,aAAa,IAAI,GAAG;EAC7D,IAAI,SACF,OAAO,MAAM;EAEf,QAAQ,MAAM;;GAA0B;GAAM,QAAQ;CACxD,SAAS,GAAQ;EACf,QAAQ,MAAM,CAAC;EACf,OAAO,MAAM;GACX,SAAS,0BAA0B,OAAO,KAAK,EAAE,QAAQ;GACzD,OAAO,EAAE;GACT,SAAS,EAAE;EACb,CAAC;EACD,OAAO;CACT;AACF;AAEA,SAAS,sBACP,QACA,SACc;CAMd,OAAO;EAJL,OAAO;EACP,OAAO,OAAO,SAAQ,UAAS,MAAM,WAAW,CAAC,CAAC;EAClD;CAEY,EAAE,SAAQ,SAAQ,QAAQ,CAAC,CAAC;AAC5C;AAEA,SAAS,UAAa,OAAkC;CACtD,OAAO,UAAU,KAAA;AACnB;;;ACnKA,MAAM,qBAAqB;AAC3B,MAAM,qBAAqB;;;;;;AAa3B,IAAa,gBAAb,MAAa,cAAkC;CA8C1B;CACA;CA9CnB,OAAuB,KAAK;CAC5B,OAAuB,cAAc;CAErC,OAAc,OAAO;EACnB,MAAM,OAAO,IAAI,gBAAgB,KAAK,MAAM;GAC1C,UAAU,IAAI,cAAc,aAAa,SAAS;GAClD,SAAS,IAAI,gBAAgB,WAAW,GAAG,EACxC,SAAS,GAAG,GAAG,EACf,SAAS,0DAA0D;GACtE,cAAc,IAAI,cAAc,kBAAkB,KAAK,EAAE,SACvD,yHACF;EACF,CAAC;EAED,KAAK,SAAS,UAAU,WAAU,UAAS;GACzC,KAAK,QAAQ,QAAQ,UAAU,WAAW;EAC5C,CAAC;EAED,OAAO;CACT;CAEA,aAAoB,OAClB,SACA,UACwB;EACxB,OAAO,IAAI,cAAc,QAAQ,QAAQ,QAAQ;CACnD;CAEA,OAAwB,WAAW,IAAI,gBAAgC;CAEvE;EACE,IAAI,OAAO,KAAK,KACd,OAAO,KAAK,IAAI,GAAG,8BAA6B,aAAY;GAC1D,KAAK,SAAS,SAAS,QAAQ;EACjC,CAAC;CAEL;CAEA,8BAA+B,IAAI,IAAY;CAC/C;CACA;CACA;CACA;CAEA,YACE,QACA,UACA;EAFiB,KAAA,SAAA;EACA,KAAA,WAAA;EAEjB,MAAM,UAAU,SAAS,SAAS;EAClC,KAAK,cAAc,SAAS;EAC5B,KAAK,UAAU,MAAM,GAAG,GAAG,QAAQ,UAAU,GAAG;EAChD,KAAK,WAAW,QAAQ;EACxB,KAAK,eAAe,QAAQ;CAC9B;CAEA,MAAa,QAAQ;EACnB,cAAc,SAAS,UAAU,KAAK,cAAc;CACtD;CAEA,MAAa,YACX,QACA,OACA,YACA,WACA,QACA;EACA,IAAI,KAAK,YAAY,IAAI,KAAK,GAAG;GAC/B,KAAK,OAAO,KAAK,aAAa,MAAM,4BAA4B;GAChE;EACF;EACA,IAAI,OAAO,KAAK,KAAK;GACnB,OAAO,KAAK,YAAY,OAAO,oBAAoB;IACjD,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,kBAAkB,CAAC;IACpE,IAAI,OAAO,SACT;GAEJ;GAEA,KAAK,YAAY,IAAI,KAAK;GAC1B,OAAO,KAAK,IAAK,KAAK,yBAAyB;IAC7C;IACA,MAAM,OAAO,UAAU,KAAK,UAAU,KAAK,OAAO;IAClD,UAAU,KAAK;IACf,gBAAgB,KAAK,eACjB,CAAC,KAAK,aAAa,SAAS,IAC5B,CAAC,KAAK,WAAW;IACrB,OAAO,KAAK,eAAe,aAAa,OACrC,SAAS,EACT,SAAS,GAAG,GAAG;GACpB,CAAC;EACH;CACF;CAEA,MAAa,OAAO;EAClB,OAAO,KAAK,YAAY,OAAO,GAC7B,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,kBAAkB,CAAC;EAEtE,cAAc,SAAS,YAAY,KAAK,cAAc;CACxD;CAEA,kBAA0B,EAAC,YAA2B;EACpD,KAAK,YAAY,OAAO,KAAK;CAC/B;AACF;;;ACnIA,IAAY,gBAAL,yBAAA,eAAA;CACL,cAAA,cAAA,aAAA,KAAA;CACA,cAAA,cAAA,eAAA,KAAA;CACA,cAAA,cAAA,YAAA,KAAA;CACA,cAAA,cAAA,gBAAA,KAAA;;AACF,EAAA,CAAA,CAAA;;;;;;;;;;AAWA,IAAa,kBAAb,MAA6B;;;;;;CAM3B,IAAW,iBAAiB;EAC1B,IAAI,KAAK,0BAA0B,MACjC,MAAM,IAAI,MAAM,mDAAmD;EAErE,OAAO,KAAK,sBAAsB;CACpC;;;;;;;;;CAUA,IAAW,uBAAuB;EAChC,OAAO,KAAK,OAAO;CACrB;CAEA,QAAe;CACf,QAAe;CACf,MAAa;CACb,WAAkB;CAClB,WAAkB;CAClB,SAAyB,CAAC;CAE1B,gBAAqC;CACrC,QAAO;CAEP,IAAW,eAAsB;EAC/B,IAAI,KAAK,0BAA0B,MACjC,MAAM,IAAI,MAAM,mDAAmD;EAErE,OAAO,KAAK,sBAAsB;CACpC;CAEA,IAAW,aAAa,OAAc;EACpC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,gBAAgB;EAElC,KAAK,0BAA0B,IAAI,gBAAuB,KAAK;EAC/D,KAAK,sBAAsB,UAAU;CACvC;CAEA,wBAA+D;CAC/D,SAAiB,IAAI,gBAAyB,CAAC,CAAC;CAEhD,MAAa,QAAiB;EAC5B,KAAK,OAAO,UAAU;EACtB,KAAK,eAAe,OAAO;CAC7B;CAEA,MAAa,WAAW;EACtB,KAAK,WAAW,MAAM,KAAK,KAAK;EAChC,OAAO,KAAK;CACd;CAEA,MAAa,KAAK,OAAiC;EACjD,IACE,SAAS,KAAK,SACb,KAAK,aAAa,SAAS,KAAK,KAAK,aAAa,YAAY,OAC/D;GACA,MAAM,QAAQ,KAAK,cAAc,KAAK;GACtC,IAAI,UAAU,KAAK,cAAc;IAC/B,KAAK,gBAAgB;IACrB,KAAK,eAAe;IAEpB,KAAK,QAAQ,KAAK,aAAa;IAC/B,MAAM,KAAK,aAAa,MAAM;GAChC,OAAO,IAAI,KAAK,SAAS,OAAO;IAC9B,KAAK,gBAAgB;IACrB,KAAK,QAAQ,KAAK,aAAa;IAC/B,MAAM,KAAK,aAAa,MAAM;GAChC;EACF;EAEA,KAAK,WAAW;EAChB,OAAO,KAAK,QAAQ,SAAS,CAAC,KAAK,UACjC,KAAK,WAAW,MAAM,KAAK,KAAK;EAGlC,OAAO,KAAK;CACd;CAEA,MAAa,SAAS;EACpB,IAAI,SAAS,KAAK,aAAa,OAAO,WAAW;EACjD,IAAI,UAAU,KAAK,aAAa,OAAO,UAAU,GAAG;GAClD,MAAM,QAAQ,KAAK,OAAO,QAAQ,MAAM;GACxC,SAAS,KAAK,OAAO,QAAQ;EAC/B;EAEA,MAAM,KAAK,UAAU,MAAM;CAC7B;CAEA,MAAa,YAAY;EACvB,MAAM,UAAU,KAAK,aAAa,OAAO,WAAW;EACpD,MAAM,QAAQ,KAAK,OAAO,QAAQ,OAAQ;EAC1C,MAAM,KAAK,UAAU,KAAK,OAAO,QAAQ,EAAE;CAC7C;CAEA,MAAa,KAAK,SAAiB;EACjC,MAAM,KAAK,UAAU,KAAK,OAAO,MAAK,UAAS,MAAM,OAAO,OAAO,CAAC;CACtE;CAEA,MAAc,UAAU,QAAsB,MAAM;EAClD,IAAI,CAAC,OAAO;EACZ,MAAM,EAAC,IAAI,UAAS;EAEpB,IAAI,KAAK,iBAAiB,SAAS,KAAK,aAAa,OAAO,UAAU,EAAE,GAAG;GACzE,KAAK,gBAAgB;GACrB,KAAK,eAAe;GACpB,KAAK,QAAQ,KAAK,aAAa;GAC/B,KAAK,aAAa,OAAO,UAAU,EAAE;GACrC,MAAM,KAAK,aAAa,MAAM;EAChC;EAEA,KAAK,WAAW;EAChB,KAAK,aAAa,OAAO,UAAU,EAAE;EACrC,OAAO,CAAC,KAAK,aAAa,OAAO,aAAa,EAAE,KAAK,CAAC,KAAK,UACzD,KAAK,WAAW,MAAM,KAAK,KAAK;EAElC,KAAK,aAAa,OAAO,UAAU,IAAI;EAEvC,OAAO,KAAK;CACd;CAEA,MAAa,QAAQ;EACnB,KAAK,gBAAgB;EACrB,KAAK,eAAe,KAAK,OAAO,QAAQ;EACxC,KAAK,QAAQ;EACb,KAAK,WAAW;EAChB,MAAM,KAAK,aAAa,MAAM;CAChC;CAEA,OAAc,aAA6C;EACzD,KAAK,OAAO,QAAQ,SAAQ,UAAS,MAAM,OAAO,WAAW,CAAC;CAChE;CAEA,MAAa,cAAc;EACzB,KAAK,gBAAgB;EACrB,KAAK,SAAS,CAAC;EAEf,MAAM,QAAQ,KAAK;EACnB,KAAK,QAAQ;EACb,KAAK,QAAQ;EAEb,MAAM,SAAkB,CAAC;EACzB,IAAI;GACF,KAAK,MAAM,SAAS,KAAK,OAAO,SAAS;IACvC,MAAM,MAAM,aAAY,UAAS;KAC/B,KAAK,QAAQ;IACf,CAAC;IACD,KAAK,OAAO,KAAK,GAAG,MAAM,OAAO,UAAU,OAAO;IAClD,OAAO,KAAK,KAAK;GACnB;EACF,UAAU;GACR,KAAK,QAAQ;EACf;EAEA,KAAK,OAAO,UAAU;EACtB,KAAK,WAAW,KAAK;CACvB;CAEA,MAAc,OAAyB;EACrC,IAAI,KAAK,eAAe;GACtB,MAAM,KAAK,cAAc,KAAK;GAC9B,IAAI,KAAK,aAAa,WAAW,GAC/B,KAAK,gBAAgB;EAEzB;EAEA,KAAK,SAAS,KAAK;EAEnB,IAAI,KAAK,aAAa,WAAW,GAC/B,OAAO;EAGT,MAAM,KAAK,aAAa,KAAK;EAC7B,IAAI,KAAK,iBAAiB,KAAK,aAAa,oBAAoB,GAC9D,KAAK,gBAAgB;EAGvB,IAAI,KAAK,aAAa,iBAAiB,GAAG;GACxC,KAAK,gBAAgB,KAAK;GAC1B,MAAM,YAAY,KAAK,aAAa,KAAK,aAAa;GACtD,IAAI,WAAW;IACb,KAAK,eAAe;IACpB,MAAM,KAAK,aAAa,MAAM,KAAK,aAAa;GAClD;GACA,IAAI,CAAC,aAAa,KAAK,aAAa,oBAAoB,GACtD,KAAK,gBAAgB;EAEzB;EAEA,OAAO,KAAK,aAAa,WAAW;CACtC;CAEA,cAAsB,OAAsB;EAC1C,IAAI,YAAY,KAAK,OAAO,QAAQ;EACpC,KAAK,MAAM,SAAS,KAAK,OAAO,SAAS;GACvC,IAAI,CAAC,MAAM,SAAS,KAAK,MAAM,YAAY,OACzC,OAAO,QAAQ,MAAM,aAAa,MAAM,qBACpC,QACA;GAEN,YAAY;EACd;EAEA,OAAO;CACT;CAEA,aAAqB,OAA6B;EAChD,MAAM,SAAS,KAAK,OAAO;EAC3B,IAAI,CAAC,OACH,OAAO,OAAO;EAGhB,MAAM,QAAQ,OAAO,WAAU,MAAK,MAAM,KAAK;EAC/C,IAAI,QAAQ,GACV,OAAO;EAET,OAAO,OAAO,QAAQ,MAAM;CAC9B;AACF;;;;;;ACnPA,IAAa,iBAAb,MAA4B;CACU;CAApC,YAAmB,UAA4C;EAA3B,KAAA,WAAA;CAA4B;;;;;;CAOhE,gBAAuB,SAAiB;EACtC,OAAO,KAAK,KAAK,UAAU,KAAK,SAAS,GAAG;CAC9C;;;;;;CAOA,gBAAuB,QAAgB;EACrC,OAAO,SAAS,KAAK,SAAS;CAChC;CAEA,IAAW,OAAe;EACxB,OAAO,KAAK,gBAAgB,KAAK,SAAS,KAAK;CACjD;CAEA,IAAW,QAAgB;EACzB,OAAO,KAAK,SAAS;CACvB;CAEA,IAAW,QAAgB;EACzB,OAAO,KAAK,SAAS;CACvB;CAEA,IAAW,MAAc;EACvB,OAAO,KAAK,SAAS;CACvB;CAEA,IAAW,QAAuB;EAChC,OAAO,KAAK,SAAS;CACvB;;;;CAKA,IAAW,YAAoB;EAC7B,OAAO,KAAK,gBAAgB,CAAC,IAAI,KAAK;CACxC;AACF;;;AC5BA,MAAa,mBAA8B;CACzC,OAAO,CAAC;CACR,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,UAAU;AACZ;;;AC1BA,IAAa,eAAb,MAA0B;CAWL;CACA;CAXnB,eAAkD,IAAI,MAAM;CAC5D,SAAgC;CAChC,QAAgB;CAChB,SAAiB;CACjB;CACA;CACA;CACA;CAEA,YACE,QACA,SACA;EAFiB,KAAA,SAAA;EACA,KAAA,UAAA;EAEjB,IAAI,OAAO,KAAK,KACd,OAAO,KAAK,IAAI,GAAG,0BAA0B,EAAC,WAAU;GACtD,IAAI,KAAK,UAAU,KAAK,SAAS,KAAK,MAAM,GAC1C,KAAK,UAAU,KAAK,MAAM;EAE9B,CAAC;CAEL;CAEA,SAAgB,OAAc;EAC5B,KAAK,UAAU,MAAM,MAAM;EAC3B,KAAK,QAAQ,MAAM,OAAO,MAAM,GAAG;EACnC,KAAK,UAAU,MAAM,KAAK;EAE1B,IAAI,KAAK,aAAa,KAAA,GAAW;GAC/B,KAAK,aAAa,KAAK,QAAQ,yBAC7B,KAAK,YACP;GACA,KAAK,WAAW,KAAK,QAAQ,WAAW;GACxC,KAAK,WAAW,QAAQ,KAAK,QAAQ;GACrC,KAAK,SAAS,QAAQ,KAAK,QAAQ,WAAW;EAChD;EAEA,KAAK,SAAS,KAAK,QAAQ,KAAK,IAAI,KAAK,MAAM,QAAQ,KAAK,EAAE;EAC9D,KAAK,gBAAgB,MAAM,kBAAkB,IAAI;CACnD;CAEA,UAAiB;EACf,OAAO,KAAK,eAAe,KAAK,aAAa,WAAW;CAC1D;CAEA,QAAe,OAAe;EAC5B,KAAK,aAAa,cAAc,KAAK,eAAe,KAAK;CAC3D;CAEA,QAAe,OAAgB,KAAc;EAC3C,KAAK,QAAQ;EACb,IAAI,QAAQ,KAAA,GACV,KAAK,WAAW,OAAO,SAAS;OAEhC,KAAK,WAAW,KAAA;CAEpB;CAEA,UAAiB,OAAe;EAC9B,KAAK,SAAS;CAChB;CAEA,gBAAuB,OAAe,aAAsB,OAAO;EACjE,KAAK,aAAa,eAAe;EACjC,KAAK,aAAa,iBAAiB,CAAC;CACtC;CAEA,SAAgB,SAAkB;EAChC,KAAK,aAAa,QAAQ;CAC5B;CAEA,UAAiB,QAAgB;EAC/B,KAAK,aAAa,SAAS;CAC7B;CAEA,YAAmB;EACjB,OAAO,KAAK;CACd;CAEA,UAAiB,KAAa;EAC5B,KAAK,SAAS;EACd,KAAK,aAAa,MAAM;CAC1B;CAEA,UAAiB,MAAc;EAC7B,OACE,QAAQ,KAAK,UACb,OACE,KAAK,UACF,KAAK,YACJ,KAAK,aAAa,WAAW,KAAK,aAAa;CAEzD;CAEA,eAAsB,MAAc;EAClC,OACE,KAAK,IAAI,GAAG,OAAO,KAAK,MAAM,IAAI,KAAK,aAAa,gBACnD,KAAK,SAAS;CAEnB;CAEA,eAAsB,MAAc;EAClC,QACG,QAAQ,KAAK,SAAS,MAAM,KAAK,aAAa,eAAe,KAAK;CAEvE;CAEA,UAAiB;EACf,OAAO,KAAK,UAAU,CAAC,KAAK;CAC9B;;;;;;;;CASA,MAAa,UAAU,UAAqC;EAC1D,IAAI,KAAK,UAAU,KAAK,aAAa,WAAW;OAC1C,UACF,KAAK,aAAa,MAAM;QACnB,IAAI,KAAK,aAAa,cAAc,KAAK,aAAa,UAC3D,IAAI;IACF,MAAM,KAAK,aAAa,KAAK;IAC7B,KAAK,QAAQ;IACb,OAAO;GACT,SAAS,GAAQ;IACf,IAAI,CAAC,KAAK,OACR,UAAU,EAAE,MAAM,CAAC;IAErB,KAAK,QAAQ;GACf;;EAIJ,OAAO;CACT;CAEA,UAAiB;EACf,KAAK,aAAa,MAAM;EACxB,KAAK,aAAa,MAAM;EACxB,KAAK,aAAa,KAAK;EACvB,KAAK,UAAU,WAAW;EAC1B,KAAK,YAAY,WAAW;EAE5B,KAAK,aAAa,KAAA;EAClB,KAAK,WAAW,KAAA;CAClB;AACF;;;ACpJA,IAAa,mBAAb,MAA8B;CAYT;CACA;CAZnB,UAA2B,IAAI,aAAa;CAE5C,OAA+B,CAAC;CAChC,2BAA6C,IAAI,IAAI;CACrD,SAA0B,CAAC;CAE3B,QAAyB;CACzB,SAAyB;CACzB,SAA0B;CAE1B,YACE,QACA,gBACA;EAFiB,KAAA,SAAA;EACA,KAAA,iBAAA;CAChB;CAEH,MAAa,UAAU,QAAiB;EACtC,KAAK,MAAM,WAAW,KAAK,MACzB,QAAQ,QAAQ;EAElB,KAAK,OAAO,CAAC;EACb,KAAK,MAAM,WAAW,KAAK,SAAS,OAAO,GACzC,QAAQ,QAAQ;EAElB,KAAK,SAAS,MAAM;EACpB,KAAK,SAAS;CAChB;CAEA,SAAgB,OAAgB;EAC9B,KAAK,QAAQ;EACb,KAAK,SAAS,SAAQ,YAAW,QAAQ,SAAS,KAAK,CAAC;CAC1D;CAEA,UAAiB,QAAgB;EAC/B,KAAK,SAAS;EACd,KAAK,SAAS,SAAQ,YAAW,QAAQ,UAAU,MAAM,CAAC;CAC5D;CAEA,QAAe,MAAc;EAC3B,KAAK,SAAS,SAAQ,YAAW,QAAQ,QAAQ,IAAI,CAAC;CACxD;CAEA,MAAa,UAAU,QAAiB;EACtC,KAAK,SAAS;EACd,MAAM,QAAQ,IACZ,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC,EAAE,KAAI,YACrC,QAAQ,UAAU,MAAM,CAC1B,CACF;CACF;CAEA,UAAkB,OAAc,MAAc;EAC5C,MAAM,WAAW,KAAK,eAAe,aAAa,MAAM,KAAK;EAC7D,MAAM,aAAa,MAAM,SAAS;EAElC,MAAM,iBADW,KAAK,IAAI,UAAU,MAAM,OAAO,QACnB,IAAI,cAAc,MAAM;EAEtD,OAAO,QAAQ,MAAM,UAAU,OAAO,MAAM,SAAS;CACvD;CAEA,QAAe,MAAc;EAC3B,KAAK,MAAM,SAAS,KAAK,QACvB,IAAI,KAAK,UAAU,OAAO,IAAI,GAAG;GAC/B,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK;GACrC,IAAI,SAAS;GAGb,UAAU,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM;GACxC,QAAQ,SAAS,KAAK;GACtB,QAAQ,SAAS,KAAK,KAAK;GAC3B,QAAQ,UAAU,KAAK,MAAM;GAC7B,QAAQ,QAAQ,IAAI;GACpB,QAAQ,UAAU,KAAK,MAAM;GAC7B,KAAK,SAAS,IAAI,OAAO,OAAO;EAClC,OAAO;GACL,MAAM,UAAU,KAAK,SAAS,IAAI,KAAK;GACvC,IAAI,CAAC,SAAS;GAGd,QAAQ,UAAU,IAAI;GACtB,KAAK,KAAK,KAAK,OAAO;GACtB,KAAK,SAAS,OAAO,KAAK;EAC5B;CAEJ;CAEA,QAAe;EACb,OAAO,IAAI,aAAa,KAAK,QAAQ,KAAK,OAAO;CACnD;CAEA,SAAgB;EACd,IAAI,KAAK,QAAQ,UAAU,aACzB,KAAK,QAAQ,OAAO;CAExB;AACF;;;AChGA,IAAa,uBAAb,MAAkC;CAII;CAHpC,UAA2B,IAAI,aAAa;CAC5C,yBAA0B,IAAI,IAA2B;CAEzD,YAAmB,QAAiC;EAAhB,KAAA,SAAA;EAClC,IAAI,OAAO,KAAK,KACd,OAAO,KAAK,IAAI,GAAG,0BAA0B,EAAC,WAAU;GACtD,KAAK,MAAM,OAAO,MAEhB,KADqB,OAAO,IAAI,GAC1B,GAAG,OAAO;EAEpB,CAAC;CAEL;CAEA,aAAoB,QAAwB;EAC1C,OAAO,KAAK,IAAI,MAAM,EAAE,OAAO,QAAQ;CACzC;CAEA,IAAW,QAA+B;EACxC,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM;EACpC,IAAI,CAAC,SAAS;GACZ,UAAU,IAAI,cAAc,KAAK,QAAQ,QAAQ,KAAK,OAAO;GAC7D,KAAK,OAAO,IAAI,QAAQ,OAAO;EACjC;EAEA,OAAO;CACT;AACF;AAEA,IAAa,gBAAb,MAA2B;CAQN;CACA;CACA;CATnB,IAAW,SAAS;EAClB,OAAO,KAAK,KAAK;CACnB;CACA,OAAwB,IAAI,gBAA2B,gBAAgB;CACvE,QAAwC;CAExC,YACE,QACA,QACA,SACA;EAHiB,KAAA,SAAA;EACA,KAAA,SAAA;EACA,KAAA,UAAA;EAEjB,KAAK,OAAO;CACd;CAEA,MAAa,SAAS;EACpB,KAAK,OAAO,MAAM;EAClB,MAAM,QAAQ,IAAI,gBAAgB;EAClC,KAAK,QAAQ;EACb,MAAM,OAAO,MAAM,KAAK,SAAS,MAAM,MAAM;EAC7C,IAAI,CAAC,MAAM,OAAO,SAChB,KAAK,KAAK,UAAU,QAAQ;CAEhC;CAEA,MAAc,SAAS,QAAgD;EACrE,IAAI;EACJ,IAAI;GACF,WAAW,MAAM,MAAM,KAAK,QAAQ,EAAC,OAAM,CAAC;EAC9C,SAAS,GAAQ;GACf,IAAI,EAAE,SAAS,cACb,KAAK,OAAO,MAAM,CAAC;GAErB;EACF;EAEA,MAAM,YAAY,MAAM,SAAS,YAAY;EAC7C,IAAI,OAAO,SACT;EAGF,IAAI;EACJ,IAAI;GACF,cAAc,MAAM,KAAK,gBAAgB,SAAS;EACpD,SAAS,GAAG;GACV;EACF;EAEA,IAAI,OAAO,SACT;EAGF,MAAM,aAAa;EACnB,MAAM,UAAU,CAAC,EAAE,YAAY,SAAS;EAExC,MAAM,QAAQ,CAAC;EACf,IAAI,cAAc;EAClB,KACE,IAAI,YAAY,GAChB,YAAY,YAAY,kBACxB,aACA;GACA,MAAM,UAAU,YAAY,eAAe,SAAS;GACpD,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,KAAK;IAChC,MAAM,QAAQ,CAAC,EAAE,IAAI;IACrB,MAAM,MAAM,CAAC,EAAE,QAAQ;IAEvB,IAAI,MAAM,QAAQ;IAClB,IAAI,MAAM;IAEV,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK;KAChC,MAAM,QAAQ,QAAQ;KACtB,IAAI,QAAQ,KACV,MAAM;KAER,IAAI,QAAQ,KACV,MAAM;IAEV;IAEA,IAAI,cAAc,KAAK,MAAM,MAAM,IAAI,IACrC,MAAM,IAAI,KAAK;IAEjB,IAAI,cAAc,KAAK,MAAM,MAAM,IAAI,IAAI,IACzC,MAAM,IAAI,IAAI,KAAK;IAGrB,IAAI,MAAM,aACR,cAAc;IAEhB,IAAI,KAAK,IAAI,GAAG,IAAI,aAClB,cAAc,KAAK,IAAI,GAAG;GAE9B;EACF;EAEA,OAAO;GACL;GACA;GACA,QAAQ;GACR,YAAa,YAAY,aAAa,aAAc;GACpD,UAAU,YAAY;EACxB;CACF;CAEA,gBAAwB,QAA2C;EACjE,OAAO,IAAI,SAAsB,SAAS,WACxC,KAAK,QAAQ,gBAAgB,QAAQ,SAAS,MAAM,EAAE,MAAM,MAAM,CACpE;CACF;AACF;;;AC9IA,IAAI;AACJ,IAAI;AAOJ,SAAgB,UAAU,QAA2C;CACnE,MAAM,QAAQ,IAAI,MAAM;CACxB,MAAM,MAAM;CACZ,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,MAAM,UACR,QAAQ,KAAK;OACR;GACL,MAAM,eAAe,QAAQ,KAAK;GAClC,MAAM,UAAU;EAClB;CACF,CAAC;AACH;AAEA,SAAgB,cAAc,SAAgD;CAC5E,OAAO,QAAQ,IAAI,QAAQ,IAAI,SAAS,CAAC;AAC3C;AAEA,SAAgB,aAAa,OAAwB;CACnD,WAAW,SAAS,cAAc,QAAQ;CAC1C,YAAY,WAAW,EAAC,oBAAoB,KAAI,GAAG,MAAM;CAEzD,OAAO,QAAQ,MAAM;CACrB,OAAO,SAAS,MAAM;CACtB,QAAQ,UAAU,GAAG,GAAG,MAAM,OAAO,MAAM,MAAM;CACjD,QAAQ,UAAU,OAAO,GAAG,CAAC;CAE7B,OAAO,QAAQ,aAAa,GAAG,GAAG,MAAM,OAAO,MAAM,MAAM;AAC7D;;;;;;AC5BA,IAAa,qBAAb,MAAsD;CAahB;CAZpC,IAAW,YAAY;EACrB,OAAO,KAAK,OAAO;CACrB;CACA,SAA0B,IAAI,gBAA6B,CAAC,CAAC;CAE7D,mCAA2B,IAAI,IAAuB;CACtD,yBAAiB,IAAI,IAAuB;CAC5C,kCAA0B,IAAI,IAAY;CAC1C,oBAAmD,CAAC;CACpD,kBAA0B;CAC1B,iBAAyB;CAEzB,YAAmB,OAA+B;EAAd,KAAA,QAAA;EAClC,KAAK,oBAAoB,MAAM,KAAK,WAAW,IAAI;EACnD,KAAK,KAAK,KAAK,iBAAiB;EAEhC,MAAM,WAAW,UAAU,KAAK,YAAY;EAC5C,MAAM,eAAe,UAAU,KAAK,kBAAkB;EACtD,MAAM,QAAQ,UAAU,KAAK,WAAW;EACxC,MAAM,KAAK,WAAW,UAAU,UAAU,KAAK,mBAAmB,KAAK;CACzE;CAEA,IAAW,MAAc,QAAgB,WAAW,MAAM;EACxD,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI;EAChC,IAAI,CAAC,SAAS,MAAM,WAAW,QAC7B;EAEF,KAAK,iBAAiB;EACtB,QAAQ;GACN,GAAG;GACH,YAAY,MAAM,cAAc;GAChC;EACF;EACA,KAAK,OAAO,IAAI,MAAM,KAAK;EAC3B,KAAK,iBAAiB,IAAI,MAAM,KAAK;EACrC,KAAK,OAAO,UAAU,CAAC,GAAG,KAAK,iBAAiB,OAAO,CAAC;EACxD,KAAK,kBAAkB;EACvB,KAAK,MAAM,OAAO;CACpB;CAEA,SAAgB,MAAc,aAA6B;EACzD,IAAI,KAAK,gBAAgB,IAAI,IAAI,GAAG;GAClC,KAAK,MAAM,OAAO,MAAM;IACtB,SAAS,SAAS,KAAK;IACvB,wBAAO,IAAI,MAAM,GAAE;GACrB,CAAC;GACD,OAAO;EACT;EAEA,KAAK,gBAAgB,IAAI,IAAI;EAC7B,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI;EAChC,IAAI,CAAC,OAAO;GACV,KAAK,kBAAkB;GACvB,QAAQ;IACN;IACA;IACA,YAAY;IACZ,QAAQ;IACR,wBAAO,IAAI,MAAM,GAAE;GACrB;GACA,KAAK,OAAO,IAAI,MAAM,KAAK;EAC7B,OAAO;GACL,IAAI,UAAU;GACd,MAAM,WAAW,EAAC,GAAG,MAAK;GAE1B,MAAM,yBAAQ,IAAI,MAAM,GAAE;GAC1B,IAAI,SAAS,UAAU,OAAO;IAC5B,SAAS,QAAQ;IACjB,UAAU;GACZ;GAEA,IAAI,SAAS,gBAAgB,aAAa;IACxC,SAAS,cAAc;IACvB,UAAU;GACZ;GAEA,MAAM,SAAS,KAAK,IAAI,GAAG,SAAS,aAAa,SAAS,WAAW;GACrE,IAAI,KAAK,kBAAkB,SAAS,WAAW,QAAQ;IACrD,SAAS,SAAS;IAClB,UAAU;GACZ;GAEA,MAAM,SAAS,SAAS,cAAc,SAAS;GAC/C,IAAI,CAAC,KAAK,kBAAkB,SAAS,eAAe,QAAQ;IAC1D,KAAK,kBAAkB;IACvB,SAAS,aAAa;IACtB,UAAU;GACZ;GAEA,IAAI,SAAS;IACX,QAAQ;IACR,KAAK,OAAO,IAAI,MAAM,KAAK;GAC7B;EACF;EAEA,KAAK,iBAAiB,IAAI,MAAM,KAAK;EAErC,OAAO,MAAM;CACf;;;;CAKA,qBAA6B;EAC3B,KAAK,iBAAiB,MAAM;EAC5B,KAAK,gBAAgB,MAAM;CAC7B;;;;CAKA,2BAAmC;EACjC,KAAK,iBAAiB;EACtB,KAAK,OAAO,UAAU,CAAC,GAAG,KAAK,iBAAiB,OAAO,CAAC;EAExD,IACE,KAAK,oBACJ,KAAK,mBAAmB,UAAU,OAAO,KAAK,OAAO,QAAQ,QAC9D;GACA,KAAK,kBAAkB;GACvB,KAAK,oBAAoB,CAAC,GAAG,KAAK,iBAAiB,OAAO,CAAC,EAAE,KAC3D,WAAU;IACR,MAAM,MAAM;IACZ,YAAY,MAAM;GACpB,EACF;GACA,KAAK,MAAM,KAAK,WAAW,IAAI,KAAK,iBAAiB;EACvD;CACF;CAEA,oBAA4B;EAC1B,KAAK,gBAAgB,MAAM;CAC7B;;;;CAKA,qBAA6B,SAAgC;EAI3D,IAAI,SAAS,KAAK,mBAAmB;EACrC,KAAK,oBAAoB;EACzB,KAAK,KAAK,IAAI;EACd,KAAK,MAAM,OAAO;CACpB;CAEA,KAAa,QAA+B;EAC1C,KAAK,MAAM,SAAS,QAAQ;GAC1B,IAAI,OAAO,MAAM,SAAS,UACxB;GAGF,MAAM,WAAW,KAAK,OAAO,IAAI,MAAM,IAAI,KAAK;IAC9C,MAAM,MAAM;IACZ,aAAa;IACb,QAAQ;GACV;GAEA,KAAK,OAAO,IAAI,MAAM,MAAM;IAC1B,GAAG;IACH,YAAY,MAAM,cAAc;GAClC,CAAC;EACH;CACF;AACF;;;;;;ACvKA,IAAa,qBAAb,MAAsD;CAOhB;CANpC,IAAW,YAAY;EACrB,OAAO,KAAK,OAAO;CACrB;CACA,SAA0B,IAAI,gBAA6B,CAAC,CAAC;CAC7D,yBAAiB,IAAI,IAAoB;CAEzC,YAAmB,OAA+B;EAAd,KAAA,QAAA;EAClC,MAAM,WAAW,UAAU,KAAK,YAAY;CAC9C;CAEA,MAAa,CAEb;CAEA,SAAgB,MAAc,aAA6B;EACzD,IAAI,WAAW,KAAK,OAAO,IAAI,IAAI;EACnC,IAAI,aAAa,KAAA,GAAW;GAC1B,MAAM,QAAQ,KAAK,MAAM,KAAK,WAC3B,IAAI,EACJ,MAAK,UAAS,MAAM,SAAS,IAAI;GACpC,WAAW,QAAQ,MAAM,aAAa,cAAc;GACpD,KAAK,OAAO,IAAI,MAAM,QAAQ;EAChC;EAEA,OAAO;CACT;;;;CAKA,qBAA6B;EAC3B,KAAK,OAAO,MAAM;CACpB;AACF;;;AC1CA,IAAA,uCAAe;;;;;;;;;;;;;;;;;;;;;;;;;;ACGf,MAAM,mBAAmB;AACzB,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AAgBzB,IAAa,qBAAb,MAAgC;CAKM;CAJpC,KAA4C;CAC5C,eAAiD;CACjD,gCAAiC,IAAI,IAA8B;CAEnE,YAAmB,QAAiC;EAAhB,KAAA,SAAA;CAAiB;CAErD,OAAc,OAAkD;EAC9D,IAAI,KAAK,iBAAiB,OACxB,OAAO,KAAK;EAGd,KAAK,cAAc,SAAS,KAAK,EAAG;EACpC,KAAK,eAAe;EACpB,KAAK,aAAa,MAAM,KAAK,MAAM,CAAC;EACpC,OAAO,KAAK;CACd;;;;CAKA,UAAiB;EACf,IAAI,CAAC,KAAK,IACR;EAGF,KAAK,cAAc,SAAS,KAAK,EAAE;EACnC,KAAK,eAAe;EAEpB,KAAK,GAAG,WAAW,IAAI;EACvB,KAAK,MAAM,EAAC,SAAS,UAAU,YAAW,KAAK,cAAc,OAAO,GAAG;GACrE,KAAK,GAAG,cAAc,OAAO;GAC7B,KAAK,GAAG,aAAa,QAAQ;GAC7B,KAAK,GAAG,aAAa,MAAM;EAC7B;EAEA,KAAK,cAAc,MAAM;EACzB,KAAK,GAAG,aAAa,oBAAoB,GAAG,YAAY;EACxD,KAAM,GAAG,OAA6B,OAAO;EAC7C,KAAK,KAAK;CACZ;CAEA,WAAkB,UAAkB,QAAqC;EACvE,MAAM,MAAM,GAAG,SAAS,GAAG;EAC3B,IAAI,KAAK,cAAc,IAAI,GAAG,GAC5B,OAAO,KAAK,cAAc,IAAI,GAAG,EAAG;EAGtC,MAAM,KAAK,KAAK,MAAM;EACtB,MAAM,iBAAiB,KAAK,UAAU,GAAG,iBAAiB,QAAQ;EAClE,MAAM,eAAe,KAAK,UAAU,GAAG,eAAe,MAAM;EAC5D,IAAI,CAAC,kBAAkB,CAAC,cACtB,OAAO;EAGT,MAAM,UAAU,GAAG,cAAc;EACjC,GAAG,aAAa,SAAS,cAAc;EACvC,GAAG,aAAa,SAAS,YAAY;EACrC,GAAG,YAAY,OAAO;EAEtB,IAAI,CAAC,GAAG,oBAAoB,SAAS,GAAG,WAAW,GAAG;GACpD,KAAK,OAAO,MAAM;IAChB,SAAS;IACT,SAAS,GAAG,kBAAkB,OAAO,KAAK,KAAA;IAC1C,wBAAO,IAAI,MAAM,GAAE;GACrB,CAAC;GACD,GAAG,cAAc,OAAO;GACxB,OAAO;EACT;EAEA,KAAK,cAAc,IAAI,KAAK;GAC1B;GACA,UAAU;GACV,QAAQ;EACV,CAAC;EAED,OAAO;CACT;CAEA,UAAkB,MAAc,QAAoC;EAClE,MAAM,KAAK,KAAK,MAAM;EACtB,MAAM,SAAS,GAAG,aAAa,IAAI;EACnC,GAAG,aAAa,QAAQ,MAAM;EAC9B,GAAG,cAAc,MAAM;EACvB,IAAI,CAAC,GAAG,mBAAmB,QAAQ,GAAG,cAAc,GAAG;GACrD,MAAM,MAAM,GAAG,iBAAiB,MAAM;GACtC,aAAa,KAAK,QAAQ,KAAK,MAAM;GACrC,GAAG,aAAa,MAAM;GACtB,OAAO;EACT;EAEA,OAAO;CACT;CAEA,QAAwC;EACtC,IAAI,KAAK,IACP,OAAO,KAAK;EAGd,KAAK,KAAK,SAAS,cAAc,QAAQ,EAAE,WAAW,UAAU;GAC9D,OAAO;GACP,oBAAoB;GACpB,SAAS;GACT,iBAAiB;EACnB,CAAC;EACD,IAAI,CAAC,KAAK,IACR,MAAM,IAAI,MAAM,6BAA6B;EAgB/C,OAAO,KAAK;CACd;AACF;AAEA,SAAS,aAAa,QAAgB,KAAoB,QAAgB;CACxE,IAAI,YAA2B;CAE/B,iBAAiB,YAAY;CAC7B,MAAM,cAAc,iBAAiB,KAAK,MAAM;CAChD,IAAI,aAAa;EACf,MAAM,MAAM,IAAI,IAAI,YAAY,IAAI,OAAO,SAAS,MAAM;EAC1D,IAAI,aAAa,IAAI,KAAK,KAAK,IAAI,EAAE,SAAS,CAAC;EAC/C,YAAY,IAAI,SAAS;CAC3B;CAEA,IAAI,CAAC,KAAK;EACR,OAAO,MAAM;GACX,SAAS;GACT,OAAO,eAAe,WAAW,GAAG,CAAC;EACvC,CAAC;EACD,OAAO;CACT;CAEA,IAAI,SAAS;CACb,IAAI;CACJ,OAAQ,SAAS,eAAe,KAAK,GAAG,GAAI;EAC1C,MAAM,GAAG,MAAM,WAAW;EAC1B,IAAI,SAAS;EACb,MAAM,QAAQ,QAAQ,MAAM,gBAAgB;EAC5C,IAAI,OAAO;GAET,MAAM,QADY,OAAO,MAAM,IAAI,EAAE,SAAS,IAAI,IAAK,GAC/B,QAAQ,MAAM,EAAG;GACzC,IAAI,UAAU,IACZ,SAAS;GAGX,IAAI,MAAM,OAAO;QACF,OACV,MAAM,IAAI,EACV,MAAK,SAAQ,KAAK,WAAW,UAAU,CACnC,GAAG;KACR,SAAS;KACT,OAAO,MAAM;MACX,SAAS,6BAA6B;MACtC,SAASC;KACX,CAAC;KACD;IACF;;EAEJ;EAEA,SAAS;EACT,OAAO,MAAM;GACX,SAAS,6BAA6B;GACtC,OAAO,eAAe,WAAW,MAAM,MAAM;EAC/C,CAAC;CACH;CAEA,IAAI,CAAC,QACH,OAAO,MAAM;EACX,SAAS,6BAA6B;EACtC,OAAO,eAAe,WAAW,GAAG,CAAC;CACvC,CAAC;AAEL;AAEA,SAAS,eACP,MACA,MACA,QACoB;CACpB,IAAI,CAAC,MACH;CAGF,OAAO,UAAU,UAAU,YAAY,EAAE,SAAS,QAAQ,IACtD,SAAS,KAAK,GAAG,KAAK,GAAG,OAAO,KAChC,IAAI,KAAK,GAAG,KAAK,GAAG;AAC1B;;;AC5LA,MAAM,mBAAmB,IAAI;;;;;;;;;AAU7B,IAAa,SAAb,MAAoB;CAoFR;CACA;CACA;CACA;;;;;;;;;;;;CA3EV,IAAW,WAAW;EACpB,OAAO,KAAK,OAAO;CACrB;CACA,SAA0B,IAAI,qBAA2B;CAEzD,IAAW,iBAAiB;EAC1B,OAAO,KAAK,YAAY;CAC1B;CACA;CAEA,IAAW,iBAAiB;EAC1B,OAAO,KAAK,MAAM;CACpB;CACA,QAAyB,IAAI,gBAAgB,CAAC;CAE9C,IAAW,oBAAoB;EAC7B,OAAO,KAAK,SAAS;CACvB;CACA,WAA4B,IAAI,gBAAgB,CAAC;;;;;;;;;CAUjD,IAAW,iBAAiB;EAC1B,OAAO,KAAK,aAAa;CAC3B;CACA,eAAgC,IAAI,gBAAsB;CAE1D;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,OAAwB,IAAI,UAAU;CACtC,YAAoB;CACpB,UAAkB;CAClB,YAAmC;CACnC,aAAqB;CACrB,gBAAwB;CACxB,kBAA0B;CAC1B,yBAAiC;CACjC;CACA;CACA,SAAiB;CAEjB,IAAY,aAAa;EACvB,OAAO,KAAK,IACV,KAAK,SAAS,UACd,KAAK,OAAO,gBAAgB,KAAK,SAAS,CAC5C;CACF;CAEA,IAAY,WAAW;EACrB,OAAO,KAAK,IACV,KAAK,SAAS,UACd,KAAK,OAAO,gBAAgB,KAAK,OAAO,CAC1C;CACF;CAEA,IAAY,WAAW;EACrB,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,SAAS,KAAK;CAC/D;CAEA,YACE,SACA,WAA4C,CAAC,GAC7C,eAA6C,CAAC,GAC9C,eAAuB,IACvB;EAJQ,KAAA,UAAA;EACA,KAAA,WAAA;EACA,KAAA,eAAA;EACA,KAAA,eAAA;EAER,KAAK,cAAc,IAAI,gBAA6B;GAClD,MAAM;GACN,OAAO;GACP,QAAQ;GACR,OAAO;GACP,GAAG;GACH,QAAQ;EACV,CAAC;EAED,KAAK,qBAAqB,IAAI,mBAAmB,KAAK,QAAQ,MAAM;EACpE,KAAK,gBAAgB;EACrB,KAAK,SAAS,KAAK,QAAQ;EAC3B,KAAK,WAAW,IAAI,gBAAgB;EACpC,KAAK,SAAS,IAAI,eAAe,KAAK,QAAQ;EAC9C,KAAK,iBAAiB,IAAI,qBAAqB,KAAK,MAAM;EAC1D,KAAK,YAAY,IAAI,iBAAiB,KAAK,QAAQ,KAAK,cAAc;EACtE,KAAK,QAAQ,KAAK,UAAU,MAAM;EAClC,KAAK,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM,IAAI;EACnD,KAAK,kBAAkB,SAAS,mBAAmB;EACnD,KAAK,YAAY,SAAS,QAAQ,MAAM;EACxC,KAAK,UAAU,SAAS,QAAQ,MAAM;EACtC,KAAK,SAAS,MAAM,SAAS,OAAO;EACpC,KAAK,MAAM,UAAU,SAAS,eAAe,CAAC;EAE9C,IAAI,QAAQ,OACV,KAAK,MAAM,UAAU,QAAQ,KAAK;EAGpC,MAAM,SAAkB,CAAC;EACzB,KAAK,MAAM,eAAe,QAAQ,QAAQ;GACxC,MAAM,QAAQ,IAAI,YAAY,MAAM;IAClC,GAAG;IACH,UAAU,KAAK;IACf,QAAQ,KAAK,QAAQ;IACrB,MAAM,KAAK;IACX,iBAAiB,KAAK;IACtB,iBAAiB;IACjB,oBAAoB,KAAK;IACzB,sBAAsB,QAAQ;GAChC,CAAC;GACD,YAAY,YAAY,WAAU,gBAAe;IAC/C,MAAM,OAAO,WAAW;GAC1B,GAAG,KAAK;GACR,MAAM,WAAW,gBAAgB,KAAK,qBAAqB,CAAC;GAC5D,MAAM,UAAU,cAAc,QAAQ,aAAa,CAAC,CAAC;GACrD,OAAO,KAAK,KAAK;EACnB;EACA,KAAK,SAAS,MAAM,MAAM;EAC1B,KAAK,SAAS;CAChB;CAEA,MAAa,UAAU,UAA0B;EAC/C,MAAM,KAAK,KAAK,QAAQ;EACxB,IAAI,QAAQ,KAAK,SAAS;EAC1B,IAAI,cAAc;EAClB,KAAK,YAAY,SAAS,MAAM;EAChC,KAAK,UAAU,SAAS,MAAM;EAC9B,MAAM,SAAS,KAAK,IAAI,GAAG,SAAS,GAAG;EACvC,IAAI,KAAK,SAAS,QAAQ,QAAQ;GAChC,MAAM,QAAQ,SAAS,KAAK,SAAS;GACrC,KAAK,SAAS,MAAM;GACpB,QAAQ,KAAK,MAAM,QAAQ,KAAK;GAChC,cAAc;EAChB;EACA,IACE,CAAC,SAAS,KAAK,cAAc,KAAK,IAAI,KACtC,SAAS,oBAAoB,KAAK,iBAClC;GACA,KAAK,OAAO,SAAS;GACrB,KAAK,kBAAkB,SAAS;GAChC,KAAK,SAAS,OAAO;IACnB,MAAM,KAAK;IACX,iBAAiB,KAAK;GACxB,CAAC;EACH;EACA,IAAI,SAAS,gBAAgB,KAAA,GAC3B,KAAK,MAAM,UAAU,SAAS,WAAW;EAG3C,KAAK,KAAK,QAAQ;EAClB,IAAI,aAAa;GACf,KAAK,SAAS,OAAO;GACrB,KAAK,MAAM,UAAU;GACrB,KAAK,qBAAqB;GAC1B,KAAK,gBAAgB;EACvB;CACF;;;;;;CAOA,UAAiB,OAAwB;EACvC,OAAO,SAAS,KAAK,SAAS,KAAK,SAAS;CAC9C;;;;;;CAOA,cAAqB,OAAwB;EAC3C,OAAO,SAAS,KAAK,cAAc,SAAS,KAAK;CACnD;CAEA,YAAmB,OAAqB;EACtC,KAAK,gBAAgB,KAAK,WAAW,KAAK;CAC5C;CAEA,uBAAoC;EAClC,KAAK,gBAAgB,KAAK,MAAM,UAAU,KAAK,SAAS;CAC1D;CAEA,mBAAgC;EAC9B,KAAK,gBAAgB,KAAK,MAAM,UAAU,KAAK,SAAS;CAC1D;CAEA,eAA4B;EAC1B,KAAK,gBAAgB;CACvB;CAEA,gBAA6B;EAC3B,KAAK,kBAAkB;CACzB;CAEA,WAAkB,QAAQ,CAAC,KAAK,YAAY,QAAQ,MAAM;EACxD,IAAI,UAAU,KAAK,YAAY,QAAQ,MACrC,KAAK,YAAY,UAAU;GACzB,GAAG,KAAK,YAAY;GACpB,MAAM;EACR;CAEJ;CAEA,eACE,QAAiB,KAAK,YAAY,QAAQ,QACpC;EAEN,KAAK,UAAU,OAAO;EAEtB,IAAI,UAAU,KAAK,YAAY,QAAQ,QAAQ;GAC7C,KAAK,YAAY,UAAU;IACzB,GAAG,KAAK,YAAY;IACpB,QAAQ,CAAC;GACX;GAIA,IACE,SACA,CAAC,KAAK,YAAY,QAAQ,QAC1B,KAAK,SAAS,UAAU,KAAK,SAAS,UAEtC,KAAK,aAAa;EAEtB;CACF;CAEA,YAAmB,QAAiB,KAAK,YAAY,QAAQ,OAAa;EACxE,IAAI,UAAU,KAAK,YAAY,QAAQ,OACrC,KAAK,YAAY,UAAU;GACzB,GAAG,KAAK,YAAY;GACpB,OAAO,CAAC;EACV;CAEJ;CAEA,eAAsB,OAAqB;EACzC,MAAM,eAAe,MAAM,GAAG,GAAG,KAAK;EACtC,IAAI,iBAAiB,KAAK,YAAY,QAAQ,QAC5C,KAAK,YAAY,UAAU;GACzB,GAAG,KAAK,YAAY;GACpB,QAAQ;EACV;CAEJ;CAEA,eAAsB,OAAqB;EACzC,KAAK,eAAe,KAAK,YAAY,QAAQ,SAAS,KAAK;CAC7D;CAEA,SAAgB,OAAe;EAC7B,IAAI,UAAU,KAAK,YAAY,QAAQ,OAAO;GAC5C,KAAK,SAAS,QAAQ;GACtB,KAAK,SAAS,OAAO;GACrB,KAAK,YAAY,UAAU;IACzB,GAAG,KAAK,YAAY;IACpB,OAAO;GACT;GACA,KAAK,qBAAqB;EAC5B;CACF;CAEA,aAAoB,WAAoC;EACtD,KAAK,MAAM,SAAS,KAAK,SAAS,qBAAqB,SACrD,MAAM,UAAU,cAAc,SAAS;CAE3C;;;;;;;;CASA,WAAkB;EAChB,KAAK,SAAS;EACd,KAAK,QAAQ;CACf;;;;;;;;;;;CAYA,aAAoB;EAClB,KAAK,SAAS;EACd,KAAK,mBAAmB,QAAQ;EAChC,IAAI,KAAK,cAAc,MAAM;GAC3B,qBAAqB,KAAK,SAAS;GACnC,KAAK,YAAY;EACnB;CACF;CAEA,uBAA+B;EAC7B,KAAK,yBAAyB;EAC9B,KAAK,QAAQ;CACf;CAEA,MAAc,UAEZ;EACA,MAAM,QAAQ;GACZ,GAAG,KAAK,YAAY;GACpB,MAAM,KAAK;GACX,QAAQ,KAAK;EACf;EACA,KAAK,gBAAgB;EACrB,KAAK,kBAAkB;EAGvB,IAAI,KAAK,wBAAwB;GAC/B,IAAI,MAAM,OAAO,GACf,MAAM,OAAO,KAAK,SAAS;GAE7B,IAAI;IACF,MAAM,KAAK,SAAS,YAAY;IAChC,KAAK,SAAS,UAAU,KAAK,SAAS;IAEtC,MAAM,SAAkB,CAAC;IACzB,KAAK,MAAM,SAAS,KAAK,SAAS,qBAAqB,SACrD,OAAO,KAAK,GAAG,MAAM,OAAO,UAAU,CAAC;IAEzC,MAAM,KAAK,UAAU,UAAU,MAAM;IAErC,KAAK,aAAa,SAAS;GAC7B,SAAS,GAAG;IACV,KAAK,YAAY,MAAM,IAAI;IAC3B,MAAM;GACR,UAAU;IACR,KAAK,yBAAyB;GAChC;EACF;EAIA,IACG,CAAC,MAAM,QAAQ,KAAK,YAAY,CAAC,MAAM,UAAU,MAAM,OAAO,KAC/D,KAAK,aAAa,KAAK,YACvB;GACA,KAAK,eAAe,KAAK;GACzB,MAAM,SAAS;GACf,MAAM,OACJ,KAAK,aAAa,KAAK,aAAa,MAAM,OAAO,KAAK;EAC1D;EAGA,IACE,MAAM,SACL,MAAM,OAAO,KAAK,YAAa,KAAK,YAAY,CAAC,MAAM,WACxD,KAAK,eAAe,KAAK,SAEzB,MAAM,OAAO,KAAK;EAIpB,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI;EACvC,MAAM,KAAK,UAAU,UAAU,MAAM,UAAU,KAAK,QAAQ;EAC5D,KAAK,UAAU,SAAS,MAAM,KAAK;EACnC,KAAK,UAAU,UAAU,MAAM,MAAM;EAGrC,MAAM,cACJ,MAAM,UAAU,KAAK,YAAY,CAAC,KAAK,MAAM,UAAU,KAAK,OAAO,IAAI;EACzE,IAAI,MAAM,KAAK,MAAM,UAAU,WAAW,GACxC,KAAK,UAAU,EAAE;EAEnB,KAAK,MAAM,SAAS,MAAM,KAAK;EAC/B,KAAK,MAAM,UAAU,MAAM,MAAM;EAEjC,OAAO;CACT;CAEA,MAAc,MAAM;EAClB,MAAM,QAAQ,MAAM,KAAK,QAAQ;EACjC,MAAM,gBAAgB,KAAK,SAAS;EACpC,KAAK,SAAS,QAAQ,MAAM,SAAA,IAAA;EAK5B,IAAI,MAAM,QAAQ,KAAK,CAAC,KAAK,cAAc,KAAK,OAAO,KAAK,GAAG;GAC7D,MAAM,YAAY,MAAM,OAAO,IAAI,KAAK,OAAO,QAAQ,MAAM;GAC7D,MAAM,eAAe,KAAK,WAAW,SAAS;GAC9C,KAAK,OAAO,QAAQ,WAAW;GAC/B,MAAM,KAAK,SAAS,KAAK,YAAY;GACrC,KAAK,OAAO,QAAQ,WAAW;GAC/B,KAAK,UAAU,EAAE;EACnB,OAEK,IACH,MAAM,UACL,MAAM,UAAU,KACf,KAAK,MAAM,QAAQ,KACnB,KAAK,MAAM,UAAU,KAAK,OAAO,IAAI,KACrC,KAAK,MAAM,QAAQ,IAAI,KAAK,OAAO,MACrC;GACA,IACE,MAAM,UACL,MAAM,UAAU,kBAAA,GAEjB,MAAM,KAAK,OAAO,SAAS;GAI7B,IACE,CAAC,MAAM,UACP,KAAK,OAAO,OAAO,KAAK,MAAM,QAAQ,IAAI,kBAE1C,KAAK,UAAU;GAGjB,KAAK,QAAQ;GACb;EACF,OAEK,IACH,KAAK,MAAM,QAAQ,KACnB,MAAM,UAAU,KAChB,KAAK,MAAM,UAAU,KAAK,OAAO,IAAI,KACrC,KAAK,OAAO,gBAAgB,KAAK,SAAS,QAAQ,CAAC,IACjD,KAAK,MAAM,QAAQ,IAAI,kBACzB;GACA,MAAM,YAAY,KAAK,OAAO,gBAAgB,KAAK,MAAM,QAAQ,CAAC;GAClE,MAAM,KAAK,SAAS,KAAK,SAAS;EACpC,OAEK,IAAI,KAAK,OAAO,QAAQ,KAAK,UAAU;GAC1C,MAAM,KAAK,SAAS,SAAS;GAE7B,IAAI,MAAM,UAAU,GAClB,KAAK,UAAU;EAEnB;EAGA,IAAI,CAAC,MAAM,UAAU,KAAK,SAAS,aAAa,OAAO,UAAU,GAAG;GAClE,KAAK,eAAe,KAAK;GACzB,MAAM,SAAS;EACjB;EAGA,MAAM,KAAK,OAAO,SAAS;EAC3B,KAAK,MAAM,UAAU,KAAK,SAAS;EAEnC,KAAK,QAAQ;CACf;CAEA,UAAkB;EAChB,IAAI,CAAC,KAAK,QAAQ;EAElB,KAAK,cAAc,sBAAsB,OAAM,SAAQ;GACrD,KAAK,YAAY;GACjB,IAAI,OAAO,KAAK,cAAc,OAAQ,KAAK,OAAO,MAAM,IAAI;IAC1D,KAAK,aAAa;IAClB,MAAM,KAAK,KAAK,QAAQ;IACxB,IAAI;KACF,MAAM,KAAK,IAAI;IACjB,SAAS,GAAQ;KACf,KAAK,OAAO,MAAM,CAAC;IACrB;IACA,KAAK,KAAK,QAAQ;GACpB,OACE,KAAK,QAAQ;EAEjB,CAAC;CACH;CAEA,WAAkB,OAAuB;EACvC,OAAO,MAAM,KAAK,YAAY,KAAK,UAAU,KAAK;CACpD;CAEA,UAAkB,cAAc,GAAG;EACjC,MAAM,OAAO,KAAK,OAAO,gBAAgB,KAAK,SAAS,QAAQ,WAAW;EAC1E,KAAK,MAAM,QAAQ,IAAI;EAEvB,KAAK,UAAU,QAAQ,IAAI;EAC3B,KAAK,UAAU,QAAQ,IAAI;CAC7B;AACF;;;;;;ACphBA,IAAa,QAAb,MAAmB;CAGjB,aAAoC;CACpC,kBAA0B;CAC1B,aAAuC;CACvC,OAAe,QAAQ;CAEvB;CACA;CACA;CAEA;CACA;CACA;CAEA,IAAY,aAAa;EACvB,OAAO,KAAK,KAAK,MAAM,KAAK,eAAe;CAC7C;CAEA,cAAqB;EACnB,KAAK,cAAc,SAAS,cAAc,QAAQ;EAClD,KAAK,gBAAgB,SAAS,cAAc,QAAQ;EACpD,KAAK,iBAAiB,SAAS,cAAc,QAAQ;EAErD,MAAM,aAAa,KAAK;EACxB,KAAK,UAAU,WACb;GAAC;GAAY,oBAAoB;EAAI,GACrC,KAAK,WACP;EACA,KAAK,iBAAiB,WAAW,EAAC,WAAU,GAAG,KAAK,aAAa;EACjE,KAAK,kBAAkB,WAAW,EAAC,WAAU,GAAG,KAAK,cAAc;CACrE;CAEA,UAAiB,EACf,aAAa,KAAK,YAClB,OAAO,KAAK,MACZ,kBAAkB,KAAK,iBACvB,aAAa,KAAK,cACO;EACzB,IAAI,eAAe,KAAK,YAAY;GAClC,KAAK,aAAa;GAClB,KAAK,UAAU,WAAW,EAAC,WAAU,GAAG,KAAK,WAAW;GACxD,KAAK,iBAAiB,WAAW,EAAC,WAAU,GAAG,KAAK,aAAa;GACjE,KAAK,kBAAkB,WAAW,EAAC,WAAU,GAAG,KAAK,cAAc;EACrE;EAEA,IACE,CAAC,KAAK,cAAc,KAAK,IAAI,KAC7B,oBAAoB,KAAK,iBACzB;GACA,KAAK,kBAAkB;GACvB,KAAK,OAAO;GACZ,KAAK,aAAa,KAAK,OAAO;GAC9B,KAAK,aAAa,KAAK,cAAc;GACrC,KAAK,aAAa,KAAK,eAAe;EACxC;EAEA,KAAK,aACH,OAAO,eAAe,WAClB,aACC,YAAY,UAAU,KAAK;CACpC;CAEA,MAAa,OAAO,cAAqB,eAA6B;EACpE,MAAM,gBAAgB,gBAClB,OAAO,aAAa,aAAa,IACjC;EAEJ,IAAI,eACF,MAAM,cAAc,OAAO,KAAK,eAAe;EAGjD,MAAM,aAAa,OAAO,KAAK,cAAc;EAE7C,MAAM,OAAO,KAAK;EAClB,KAAK,QAAQ,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;EACpD,IAAI,KAAK,YAAY;GACnB,KAAK,QAAQ,KAAK;GAClB,KAAK,QAAQ,YAAY,KAAK;GAC9B,KAAK,QAAQ,SAAS,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;GACnD,KAAK,QAAQ,QAAQ;EACvB;EAEA,IAAI,iBAAiB,CAAC,eACpB,KAAK,QAAQ,UAAU,KAAK,gBAAgB,GAAG,CAAC;EAElD,KAAK,QAAQ,UAAU,KAAK,eAAe,GAAG,CAAC;EAC/C,IAAI,eACF,KAAK,QAAQ,UAAU,KAAK,gBAAgB,GAAG,CAAC;CAEpD;CAEA,aAAoB,SAAmC;EACrD,MAAM,OAAO,KAAK;EAClB,QAAQ,OAAO,QAAQ,KAAK;EAC5B,QAAQ,OAAO,SAAS,KAAK;CAC/B;AACF;;;ACtFA,IAAY,iBAAL,yBAAA,gBAAA;CACL,eAAA,eAAA,aAAA,KAAA;CACA,eAAA,eAAA,aAAA,KAAA;CACA,eAAA,eAAA,cAAA,KAAA;;AACF,EAAA,CAAA,CAAA;AAEA,MAAM,YAAY,OAAO,oCAAoC;AAC7D,MAAM,gBAAgB,OAAO,wCAAwC;AAErE,IAAa,YAAb,MAAuB;CAyCM;CAxC3B,IAAW,iBAAiB;EAC1B,OAAO,KAAK,MAAM;CACpB;CACA,QAAyB,IAAI,gBAAA,CAAsC;CAEnE,IAAW,gBAAgB;EACzB,OAAO,KAAK,KAAK;CACnB;CACA,OAAwB,IAAI,gBAA+B;EACzD,gBAAgB;EAChB,aAAa;EACb,SAAS;EACT,aAAa;EACb,WAAW;EACX,OAAO;EACP,OAAO;CACT,CAAC;CAED,IAAW,kBAAkB;EAC3B,OAAO,KAAK,OAAO;CACrB;CACA,SAA0B,IAAI,gBAAyB,CAAC,CAAC;CAEzD,QAAwB,IAAI,MAAM;CAElC,OAAwB,IAAI,UAAU;CACtC;CACA;CACA;CACA;CACA,kBAAkD;CAClD,aAAqB;CACrB,YAAmC;CACnC,kBAA0B;CAC1B,iBAIW;CAEX,YAAmB,SAA0B;EAAlB,KAAA,UAAA;EACzB,KAAK,SAAS,QAAQ;EACtB,KAAK,WAAW,IAAI,gBAAgB;EACpC,KAAK,SAAS,IAAI,eAAe,KAAK,QAAQ;EAC9C,KAAK,qBAAqB,IAAI,mBAAmB,KAAK,MAAM;EAC5D,MAAM,SAAkB,CAAC;EACzB,KAAK,MAAM,eAAe,QAAQ,QAAQ;GACxC,MAAM,QAAQ,IAAI,YAAY,MAAM;IAClC,GAAG;IACH,MAAM,YAAY,KAAK,MAAM;IAC7B,QAAQ,KAAK;IACb,UAAU,KAAK;IACf,MAAM,IAAI,QAAQ,MAAM,IAAI;IAC5B,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB,KAAK;IACzB,sBAAsB,QAAQ;GAChC,CAAC;GACD,OAAO,KAAK,KAAK;EACnB;EACA,KAAK,SAAS,MAAM,MAAM;CAC5B;;;;;;CAOA,MAAa,QAAQ,UAA6B;EAChD,IAAI,KAAK,MAAM,YAAA,GAAoC;EACnD,MAAM,KAAK,KAAK,QAAQ;EACxB,KAAK,MAAM,UAAA;EACX,IAAI;GACF,KAAK,kBAAkB,IAAI,gBAAgB;GAC3C,MAAM,KAAK,IAAI,UAAU,KAAK,gBAAgB,MAAM;EACtD,SAAS,GAAQ;GACf,KAAK,QAAQ,OAAO,MAAM,CAAC;EAC7B;EAEA,KAAK,mBAAmB,QAAQ;EAChC,KAAK,MAAM,UAAA;EACX,KAAK,KAAK,QAAQ;CACpB;;;;CAKA,QAAe;EACb,IAAI,KAAK,MAAM,YAAA,GAAoC;EACnD,KAAK,iBAAiB,MAAM;EAC5B,KAAK,MAAM,UAAA;CACb;;;;CAKA,SAAgB;EACd,KAAK,kBAAkB;CACzB;CAEA,oBAA2B;EACzB,MAAM,QAAQ,KAAK,SAAS,OAAO;EACnC,IAAI,OACF,KAAK,iBAAiB,MAAM;CAEhC;CAEA,mBAA0B;EACxB,MAAM,OAAO,KAAK,SAAS,OAAO,GAAG,EAAE;EACvC,IAAI,MACF,KAAK,iBAAiB,KAAK;CAE/B;CAEA,uBAA8B;EAC5B,KAAK,iBAAiB;CACxB;CAEA,mBAA0B;EACxB,KAAK,iBAAiB;CACxB;CAEA,aAAoB,IAAY;EAC9B,KAAK,iBAAiB;CACxB;CAEA,MAAc,IAAI,UAA6B,QAAqB;EAClE,KAAK,MAAM,UAAU,QAAQ;EAC7B,KAAK,SAAS,MAAM,SAAS;EAE7B,MAAM,KAAK,aAAa,QAAQ;EAChC,IAAI,OAAO,SAAS;EACpB,KAAK,SAAS,QAAA;EACd,MAAM,KAAK,SAAS,YAAY;EAChC,IAAI,OAAO,SAAS;EACpB,KAAK,OAAO,UAAU,KAAK,SAAS;EACpC,KAAK,SAAS,QAAA;EACd,MAAM,KAAK,SAAS,MAAM;EAC1B,IAAI,OAAO,SAAS;EAEpB,IAAI,SAAS,OAAO;GAClB,MAAM,KAAK,SAAS,KAAK,SAAS,KAAK;GACvC,IAAI,OAAO,SAAS;EACtB;EAEA,MAAM,IAAI,SAAQ,YAAW;GAC3B,OAAO,iBAAiB,SAAS,OAAO;GACxC,KAAK,QAAQ;EACf,CAAC;CACH;CAEA,MAAc,aAAa,UAA6B;EACtD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK;GACnD,MAAM,cAAc,KAAK,QAAQ,OAAO;GACxC,MAAM,QAAQ,KAAK,SAAS,qBAAqB,QAAQ;GACzD,MAAM,OAAO;IACX,QAAQ,YAAY,WAAW,QAAQ;IACvC,MAAM,SAAS;IACf,iBAAiB,SAAS;GAC5B,CAAC;GACD,MAAM,KAAK,IAAI,YAAY,KAAK,IAAI,CAAC;GACrC,MAAM,UAAU,cAAc,KAAK,QAAQ,aAAa,CAAC,CAAC;EAC5D;CACF;CAEA,MAAc,OAAO;EACnB,MAAM,QAAQ,KAAK;EACnB,MAAM,SAAS,KAAK;EACpB,KAAK,kBAAkB;EACvB,KAAK,iBAAiB;EAGtB,IAAI,QACF,KAAK,SAAS,aAAa,OAAO,OAAO;EAI3C,IAAI,UAAU,MAAM;GAClB,KAAK,OAAO,QAAQ,YAAY;GAChC,KAAK,SAAS,QAAA;GACd,IAAI,UAAU,eACZ,MAAM,KAAK,SAAS,OAAO;QACtB,IAAI,UAAU,WACnB,MAAM,KAAK,SAAS,UAAU;QAE9B,MAAM,KAAK,SAAS,KAAK,KAAK;GAEhC,KAAK,OAAO,QAAQ,YAAY;EAClC,OAGK,IAAI,CAAC,KAAK,SAAS,UAAU;GAChC,KAAK,SAAS,QAAA;GACd,MAAM,KAAK,SAAS,SAAS;EAC/B;EAGA,MAAM,KAAK,MAAM,OACf,KAAK,SAAS,cACd,KAAK,SAAS,aAChB;EAEA,IAAI,CAAC,KAAK,iBAAiB,OAAO,SAAS;GACzC,KAAK,WAAW;GAChB,KAAK,QAAQ;EACf;CACF;CAEA,UAAkB;EAChB,IAAI,KAAK,iBAAiB,OAAO,SAC/B;EAGF,KAAK,cAAc,sBAAsB,OAAM,SAAQ;GACrD,KAAK,YAAY;GACjB,IAAI,OAAO,KAAK,cAAc,OAAQ,KAAK,OAAO,MAAM,IAAI;IAC1D,KAAK,aAAa;IAClB,IAAI;KACF,MAAM,KAAK,KAAK;IAClB,SAAS,GAAQ;KACf,KAAK,OAAO,MAAM,CAAC;KACnB,KAAK,iBAAiB,MAAM;IAC9B;GACF,OACE,KAAK,QAAQ;EAEjB,CAAC;CACH;CAEA,aAAqB;EACnB,MAAM,SAAS,KAAK,SAAS,aAAa;EAC1C,MAAM,eAAe,OAAO,WAAW,KAAK;EAC5C,MAAM,QAAQ,KAAK,SAAS,OAAO,QAAQ,YAAa;EAExD,MAAM,OAAsB;GAC1B,gBAAgB,cAAc,MAAM;GACpC,aAAa,KAAK,SAAS,OAAO,QAAQ,IAAI,MAAM;GACpD,SAAS,UAAU,QAAQ,QAAQ,KAAK,SAAS,OAAO,SAAS;GACjE,aAAa,UAAU,QAAQ,QAAQ;GACvC,WAAW,OAAO,UAAU;GAC5B,OAAO,KAAK,SAAS,OAAO;GAC5B;EACF;EAEA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,GAC5C,IAAI,KAAK,KAAK,QAAQ,SAAS,OAAO;GACpC,KAAK,KAAK,UAAU;GACpB;EACF;CAEJ;AACF;;;AClMA,SAAgB,YAAY,UAA2B;CACrD,OAAO;AACT;;;;;;ACzEA,IAAa,gBAAb,MAA2B;CACzB,IAAW,sBAAsB;EAC/B,OAAO,KAAK,WAAW;CACzB;CACA,aAA8B,IAAI,gBAAgB,CAAC;CACnD,iBAAyB;CACzB,sBAA8B;CAC9B,iBAAyB;;;;;;;CAQzB,SAAgB,YAAY,YAAY,IAAI,GAAiB;EAC3D,MAAM,UAAU,YAAY,KAAK;EACjC,MAAM,aAAa,KAAK,WAAW;EAEnC,IAAI,MAAM;EACV,IAAI,cAAc,GAChB,MAAM;OACD,IAAI,aAAa,GAAG;GAEzB,OAD2B,KAAK,sBAAsB,KAAK,kBAChC,aAAa;GACxC,MAAM,KAAK,IAAI,GAAG,GAAG;EACvB,OAAO,IAAI,KAAK,iBAAiB,GAC/B,MAAM,UAAU,KAAK,iBAAiB;EAGxC,OAAO;GAAC;GAAY;GAAS;EAAG;CAClC;;;;;;;;CASA,OAAc,YAAoB,YAAY,YAAY,IAAI,GAAG;EAC/D,KAAK,WAAW,UAAU,MAAM,GAAG,GAAG,UAAU;EAChD,KAAK,sBAAsB;CAC7B;;;;;;;;;CAUA,MAAa,iBAAiB,GAAG,YAAY,YAAY,IAAI,GAAG;EAC9D,KAAK,iBAAiB;EACtB,KAAK,sBAAsB;EAC3B,KAAK,WAAW,UAAU;EAC1B,KAAK,iBAAiB;CACxB;AACF;;;AC3DA,IAAY,gBAAL,yBAAA,eAAA;CACL,cAAA,cAAA,aAAA,KAAA;CACA,cAAA,cAAA,aAAA,KAAA;CACA,cAAA,cAAA,cAAA,KAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAY,iBAAL,yBAAA,gBAAA;CACL,eAAA,eAAA,aAAA,KAAA;CACA,eAAA,eAAA,WAAA,KAAA;CACA,eAAA,eAAA,aAAA,KAAA;;AACF,EAAA,CAAA,CAAA;;;;;;;;;;;AAYA,IAAa,WAAb,MAAsB;CA0BO;CAzB3B,IAAW,iBAAiB;EAC1B,OAAO,KAAK,MAAM;CACpB;CACA,QAAyB,IAAI,gBAAA,CAAqC;CAElE,IAAW,aAAa;EACtB,OAAO,KAAK,SAAS;CACvB;CACA,WAA4B,IAAI,gBAAgC;CAEhE,IAAW,iBAAiB;EAC1B,OAAO,KAAK,MAAM;CACpB;CACA,QAAyB,IAAI,gBAAgB,CAAC;CAE9C,QAAwB,IAAI,MAAM;CAClC,YAA4B,IAAI,cAAc;CAE9C,OAAwB,IAAI,UAAU;CACtC;CACA;CACA;CACA,WAAoC;CACpC,kBAAkD;CAElD,YAAmB,SAA0B;EAAlB,KAAA,UAAA;EACzB,KAAK,WAAW,IAAI,gBAAgB;EACpC,KAAK,SAAS,IAAI,eAAe,KAAK,QAAQ;EAC9C,KAAK,qBAAqB,IAAI,mBAAmB,KAAK,QAAQ,MAAM;EACpE,MAAM,SAAkB,CAAC;EACzB,KAAK,MAAM,eAAe,QAAQ,QAAQ;GACxC,MAAM,QAAQ,IAAI,YAAY,MAAM;IAClC,GAAG;IACH,MAAM,YAAY,KAAK,MAAM;IAC7B,QAAQ,KAAK,QAAQ;IACrB,UAAU,KAAK;IACf,MAAM,IAAI,QAAQ,MAAM,IAAI;IAC5B,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB,KAAK;IACzB,sBAAsB,QAAQ;GAChC,CAAC;GACD,OAAO,KAAK,KAAK;EACnB;EACA,KAAK,SAAS,MAAM,MAAM;CAC5B;;;;;;CAOA,MAAa,OAAO,UAA4B;EAC9C,IAAI,KAAK,MAAM,YAAA,GAAmC;EAClD,MAAM,KAAK,KAAK,QAAQ;EACxB,KAAK,UAAU,MAAM;EACrB,KAAK,MAAM,UAAA;EACX,IAAI;EACJ,IAAI;GACF,KAAK,kBAAkB,IAAI,gBAAgB;GAC3C,SAAS,MAAM,KAAK,IAAI,UAAU,KAAK,gBAAgB,MAAM;EAC/D,SAAS,GAAQ;GACf,KAAK,QAAQ,OAAO,MAAM,CAAC;GAC3B,SAAA;GACA,IAAI,KAAK,UAAU;IACjB,IAAI;KACF,MAAM,KAAK,SAAS,OAAO,MAAM;IACnC,SAAS,GAAG,CAEZ;IACA,KAAK,WAAW;GAClB;EACF;EAEA,KAAK,UAAU,OAAO,CAAC;EACvB,KAAK,MAAM,UAAA;EACX,KAAK,SAAS,SAAS,MAAM;EAC7B,KAAK,mBAAmB,QAAQ;EAChC,KAAK,KAAK,QAAQ;CACpB;;;;CAKA,QAAe;EACb,IAAI,KAAK,MAAM,YAAA,GAAmC;EAClD,KAAK,iBAAiB,MAAM;EAC5B,KAAK,MAAM,UAAA;CACb;;;;;;;;;;CAWA,MAAa,YAAY,UAA4B,MAAc;EACjE,MAAM,KAAK,KAAK,QAAQ;EAExB,IAAI;GACF,MAAM,QAAQ,KAAK,OAAO,gBAAgB,IAAI;GAC9C,KAAK,MAAM,UAAU,QAAQ;GAC7B,KAAK,SAAS,MAAM,SAAS;GAC7B,KAAK,SAAS,QAAA;GAEd,MAAM,KAAK,aAAa,QAAQ;GAChC,MAAM,KAAK,SAAS,MAAM;GAC1B,MAAM,KAAK,SAAS,KAAK,KAAK;GAC9B,MAAM,KAAK,MAAM,OACf,KAAK,SAAS,cACd,KAAK,SAAS,aAChB;GAEA,IAAI,OAAO,KAAK,KACd,OAAO,KAAK,IAAI,KAAK,yBAAyB;IAC5C;IACA,MAAM,MAAM,SAAS,EAAE,SAAS,GAAG,GAAG;IACtC,MAAM,KAAK,MAAM,YAAY,UAAU,WAAW;IAClD,UAAU;IACV,gBAAgB,CAAC,SAAS,KAAK,QAAQ,IAAI;GAC7C,CAAC;EAEL,SAAS,GAAQ;GACf,KAAK,QAAQ,OAAO,MAAM,CAAC;EAC7B;EAEA,KAAK,KAAK,QAAQ;CACpB;CAEA,MAAc,IACZ,UACA,QACyB;EACzB,MAAM,gBAAgB,KAAK,QAAQ,KAAK,UAAU,SAAS,UAAU,MACnE,aAAY,SAAS,OAAO,SAAS,SAAS,IAChD;EACA,IAAI,CAAC,eAAe;GAClB,KAAK,QAAQ,OAAO,MAClB,uBAAuB,SAAS,SAAS,KAAK,YAChD;GACA,OAAA;EACF;EAEA,KAAK,WAAW,MAAM,cAAc,OAAO,KAAK,SAAS,QAAQ;EACjE,IAAI,KAAK,SAAS,eAChB,WAAW;GACT,GAAG;GACH,GAAK,MAAM,KAAK,SAAS,cAAc,KAAM,CAAC;EAChD;EAEF,KAAK,MAAM,UAAU,QAAQ;EAC7B,KAAK,SAAS,MAAM,SAAS;EAC7B,KAAK,SAAS,QAAA;EACd,MAAM,OAAO,KAAK,OAAO,gBAAgB,SAAS,MAAM,EAAE;EAC1D,KAAK,MAAM,UAAU;EAErB,MAAM,KAAK,aAAa,QAAQ;EAChC,MAAM,KAAK,SAAS,YAAY;EAChC,IAAI,OAAO,SAAS,OAAA;EAEpB,MAAM,SAAS,KAAK,cAAc;EAClC,MAAM,KAAK,SAAS,MAAM;EAC1B,IAAI,OAAO,SAAS,OAAA;EAEpB,MAAM,KAAK,KAAK,IACd,KAAK,SAAS,UACd,KAAK,OAAO,gBAAgB,SAAS,MAAM,EAAE,CAC/C;EACA,MAAM,KAAK,SAAS,KAAK,IAAI;EAC7B,IAAI,OAAO,SAAS,OAAA;EAEpB,MAAM,KAAK,SAAS,QAAQ,QAAQ,KAAK,IAAI;EAC7C,IAAI,cAAc,YAAY,IAAI;EAClC,IAAI,SAAA;EACJ,IAAI;GACF,KAAK,UAAU,MAAM,KAAK,KAAK,KAAK;GACpC,MAAM,KAAK,YAAY,MAAM;GAC7B,KAAK,UAAU,OAAO,WAAW,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,KAAK,CAAC;GAErE,IAAI,OAAO,SACT,SAAA;QACK;IACL,IAAI,WAAW;IACf,OAAO,CAAC,UAAU;KAChB,MAAM,KAAK,SAAS,SAAS;KAC7B,MAAM,KAAK,YAAY,MAAM;KAC7B,KAAK,UAAU,OACb,WAAW,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,KAAK,CAChD;KACA,IAAI,YAAY,IAAI,IAAI,cAAc,IAAI,IAAI;MAC5C,cAAc,YAAY,IAAI;MAC9B,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,CAAC,CAAC;KACrD;KACA,IAAI,KAAK,SAAS,YAAY,KAAK,SAAS,SAAS,IACnD,WAAW;KAEb,IAAI,OAAO,SAAS;MAClB,SAAA;MACA,WAAW;KACb;IACF;GACF;EACF,SAAS,GAAQ;GACf,KAAK,QAAQ,OAAO,MAAM,CAAC;GAC3B,SAAA;EACF;EAEA,MAAM,KAAK,SAAS,OAAO,MAAM;EACjC,KAAK,WAAW;EAChB,OAAO;CACT;CAEA,MAAc,aAAa,UAA4B;EACrD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK;GACnD,MAAM,cAAc,KAAK,QAAQ,OAAO;GACxC,MAAM,QAAQ,KAAK,SAAS,qBAAqB,QAAQ;GACzD,MAAM,OAAO;IACX,QAAQ,YAAY,WAAW,QAAQ;IACvC,MAAM,SAAS;IACf,iBAAiB,SAAS;GAC5B,CAAC;GACD,MAAM,KAAK,IAAI,YAAY,KAAK,IAAI,CAAC;GACrC,MAAM,UAAU,cAAc,KAAK,QAAQ,aAAa,CAAC,CAAC;EAC5D;CACF;CAEA,gBAAwB;EACtB,MAAM,SAAkB,CAAC;EACzB,KAAK,MAAM,SAAS,KAAK,SAAS,qBAAqB,SACrD,OAAO,KAAK,GAAG,MAAM,OAAO,UAAU,CAAC;EAEzC,OAAO;CACT;CAEA,MAAc,YAAY,QAAqB;EAC7C,KAAK,MAAM,UAAU,KAAK,SAAS;EACnC,MAAM,KAAK,MAAM,OACf,KAAK,SAAS,cACd,KAAK,SAAS,aAChB;EAEA,MAAM,aACJ,KAAK,SAAS,QAAQ,KAAK,SAAS,aAAa;EACnD,MAAM,KAAK,SAAU,YACnB,KAAK,MAAM,aACX,KAAK,SAAS,OACd,YACA,KAAK,SAAS,aAAa,MAC3B,QACA,KAAK,MAAM,OACb;CACF;AACF;;;AC3SA,SAAgB,gBAAgB,SAAiB,SAA8B;CAC7E,OAAO;EACL,OAAA;EACA;EACA,UAAU,WAAW,MAAMC;CAC7B;AACF;;;ACTA,SAAgB,WACd,SACA,SAA4B,SAAS,cAAc,QAAQ,GACjC;CAC1B,MAAM,UAAU,OAAO,WAAW,MAAM,OAAO;CAC/C,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,gCAAgC;CAElD,OAAO;AACT;;;;;;;;;ACHA,MAAa,UAAU,MAAM,KAAK;;;;;;;AAQlC,MAAa,UAAU,KAAK,KAAK;;;;;;;;;;;;;;;;;ACGjC,SAAgB,SAAS,KAAa;CACpC,IAAI,CAAC,eAAe,GAElB,OAAO;CAGT,IAAI,IAAI,WAAW,cAAc,GAE/B,OAAO;CAMT,MAAM,UAAU,IAAI,IAAI,OAAO,SAAS,SAAS,CAAC;CAElD,IAAI;EACF,MAAM,cAAc,IAAI,IAAI,KAAK,OAAO;EACxC,IAAI,CAAC,YAAY,SAAS,WAAW,MAAM,GAGzC,OAAO;EAET,IAAI,QAAQ,SAAS,YAAY,MAG/B,OAAO;EAOT,IAAI,CAAC,kBAAkB,YAAY,IAAI,GACrC,OAAO;CAEX,SAAS,GAAG;EAEV,OAAO;CACT;CAGA,OAAO,eAAe,mBAAmB,GAAG;AAC9C;;;;;AAMA,SAAS,kBAAkB,MAAc;CACvC,MAAM,YAAY,aAAa;CAC/B,IAAI,UAAU,WAAW,GAEvB,OAAO;CAET,KAAK,MAAM,SAAS,WAClB,IAAI,MAAM,YAAY,EAAE,KAAK,MAAM,MACjC,OAAO;CAGX,OAAO;AACT;;;;;;;;;AAUA,SAAgB,iBAAiB;CAC/B,IAAI,OAAO,KAAK,KACd,OAAO,OAAO,KAAK,IAAI,0BAA0B;CAEnD,OAAO;AACT;;;;;;AAOA,IAAI,iBAAuC,KAAA;;;;;AAK3C,SAAS,eAAe;CAEtB,IAAI,OAAO,KAAK,IAAI,WAAW;MACzB,gBACF,OAAO,CAAC,GAAG,cAAc;CAAA;CAqC7B,kBA9BgB,WAAY;EAC1B,IAAI,CAAC,eAAe,KAAK,CAAC,OAAO,KAAK,KACpC,OAAO,CAAC;EAIV,MAAM,YAAY,OAAO,KAAK,IAAI,4BAA4B;EAC9D,MAAM,aAAa,KAAK,MAAM,SAAS;EAGvC,IAAI,CAAC,MAAM,QAAQ,UAAU,GAC3B,UAAU,EAAE,MACV,uDACE,OAAO,UACX;EAEF,MAAM,mBAAmB,CAAC;EAC1B,KAAK,MAAM,SAAS,YAAY;GAC9B,IAAI,OAAO,UAAU,UAAU;IAC7B,UAAU,EAAE,KACV,qCACE,QACA,gCACJ;IACA;GACF;GACA,iBAAiB,KAAK,KAAK;EAC7B;EACA,OAAO;CACT,GACsB;CACtB,OAAO,CAAC,GAAG,cAAc;AAC3B;;;AC7GA,SAAgB,MAAM,OAAe,QAAiB,MAAyB;CAC7E,IAAI,OAAO;CACX,IAAI,KAAK;CACT,IAAI,WAAW,KAAA,GAAW;EACxB,OAAO;EACP,KAAK;CACP;CAEA,OAAO,SAAS,KAAA,IAAa,OAAO,KAAK,IAAI,KAAM;CAEnD,MAAM,QAAQ,CAAC;CACf,IAAI,SAAS,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC;CACtD,IAAI,QAAQ;CAEZ,OAAO,UAAU;EACf,MAAM,WAAW;EACjB,QAAQ;CACV;CAEA,OAAO;AACT;;;;;;;;ACtDA,IAAa,YAAb,MAAuB;CACrB,iBAA8C;CAC9C,UAAwC;CAExC,MAAa,UAAU;EACrB,OAAO,KAAK,SACV,MAAM,KAAK;EAEb,KAAK,UAAU,IAAI,SAAQ,YAAW;GACpC,KAAK,iBAAiB;EACxB,CAAC;CACH;CAEA,UAAiB;EACf,KAAK,UAAU;EACf,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;CACxB;AACF;;;;;;;;AChBA,SAAgB,WACd,UACY;CACZ,OAAO,SAAS,EAAE,gBAAgB,cAAc,UAAU,QAAQ;AACpE;;;;;;AAOA,SAAgB,gBACd,UACY;CACZ,OAAO,SAAS,EAAE,gBAAgB,eAAe,UAAU,QAAQ;AACrE;;;;;;;;;;;;;;;;;;;;;;;;;;;ACKA,SAAgB,YAAY,MAAsB;CAChD,MAAM,QAAQ,SAAS;CACvB,MAAM,SAAS,UAAU;CACzB,OAAO,MAAM,WAAW,SAAS,MAAM,OAAO,KAAK,CAAC;AACtD;;;AC7BA,MAAM,gBAAkC,CAAC;;;;AAKzC,SAAgB,cAAc;CAC5B,MAAM,WAAW,cAAc,GAAG,EAAE;CACpC,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,uDAAuD;CAEzE,OAAO;AACT;AAEA,SAAgB,cAAc,UAA0B;CACtD,cAAc,KAAK,QAAQ;AAC7B;AAEA,SAAgB,YAAY,UAA0B;CACpD,IAAI,cAAc,IAAI,MAAM,UAC1B,MAAM,IAAI,MAAM,qDAAqD;AAEzE;;;ACvBA,SAAgB,SAAS,IAAc,GAAG,YAA+B;CACvE,MAAM,SAAS,GAAE,GAAG,OAAO,GAAE;CAC7B,MAAM,aAAa,OAAO,yBAAyB,QAAQ,GAAG,IAAI;CAClE,IAAI,YACF,KAAK,IAAI,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,KAC1C,WAAW,GAAG,QAAQ,GAAG,MAAM,UAAU;AAG/C;;;ACRA,MAAM,gBAAgB,OAAO,IAC3B,+CACF;;;;;;;;;;;;;AAcA,SAAgB,KAAK,SAA2C;CAC9D,QAAQ,QAAQ,gBAAgB;EAC9B,IAAI,QAAiB;EACrB,OAAO,eAAe,QAAQ,aAAa,EACzC,MAAW;GACT,IAAI,UAAU,eACZ,QAAQ,QAAQ,KAAK,IAAI;GAE3B,OAAO;EACT,EACF,CAAC;CACH;AACF;;;AC5BA,SAAgB,WAAW,YAAsC;CAC/D,OAAO,SACL,GACA,aACA,YACA;EACA,WAAW,MAAM,UAAU,OAAO,cAAc;EAChD,WAAW,MAAM,UAAU,aAAa;CAC1C;AACF;;;;;;;;;;;;;;;;;ACQA,SAAgB,OAAO,GAAG,OAA0B;CAClD,MAAM,SAAS,UAAU;CACzB,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,OAAO,SAAS,MAAK,WAAU,OAAO,WAAW,IAAI;EACnE,IAAI,SAAS,CAAC,MAAM,UAAU;GAC5B,MAAM,OAAO;GACb,MAAM,KAAK,OAAO,KAAK,CAAC;EAC1B;CACF;AACF;;;ACrBA,SAAS,MAAM,WAAW,CAAC;AAqC3B,UAAiB,KACf,OACA,GAAG,OACc;CACjB,IAAI,MAAM;CACV,IAAI,OAAO,UAAU,WACnB,MAAM;MAEN,MAAM,KAAK,KAAK;CAGlB,MAAM,SAAS,UAAU;CACzB,MAAM,UACJ,MACG,KAAI,SAAQ,OAAO,SAAS,MAAK,WAAU,OAAO,WAAW,IAAI,CAAC,EAClE,QAAO,WAAU,MAAM;CAG5B,MAAM,YAAY,OAAO,KAAK;CAC9B,IAAI;CACJ,IAAI,KAAK;EACP,OAAO,QAAQ,MAAK,WAAU,CAAC,OAAO,QAAQ,GAC5C;EAEF,YAAY,KAAK,IAAI,GAAG,QAAQ,KAAI,WAAU,OAAO,KAAK,CAAC,CAAC;CAC9D,OAAO;EACL,OAAO,CAAC,QAAQ,MAAK,WAAU,OAAO,QAAQ,GAC5C;EAEF,MAAM,WAAW,QAAQ,QAAO,WAAU,OAAO,QAAQ;EACzD,YAAY,KAAK,IAAI,GAAG,SAAS,KAAI,WAAU,OAAO,KAAK,CAAC,CAAC;CAC/D;CAEA,OAAO,KAAK,KAAK,IAAI,WAAW,SAAS,CAAC;AAC5C;;;AC5EA,SAAgB,YAAY,MAAiB,QAAkC;CAC7E,MAAM,YAAY,OAAO,eAAe,IAAI;CAC5C,IAAI,CAAC,UAAU,YAAY;EACzB,UAAU,aAAa;EACvB,UAAU,OAAO,OAAO,WAAW,WAAW,SAAS,YAAY,MAAM;CAC3E;AACF;AAEA,SAAgB,YAAY,MAAyB;CACnD,OAAO,OAAO,eAAe,IAAI,EAAE,QAAQ;AAC7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkBA,SAAgB,MACd,MACiB;CACjB,OAAO,UAAU,EAAE,KAAK,MAAM,IAAI;AACpC;;;AC7BA,SAAS,KAAK,WAAW,CAAC;;;;;;;;;;;;;;;;AAgB1B,UAAiB,IAAI,GAAG,OAA2C;CACjE,KAAK,MAAM,QAAQ,OACjB,MAAM;CAER,OAAO,KAAK,GAAG,KAAK;AACtB;;;ACrBA,SAAS,KAAK,WAAW,CAAC;;;;;;;;;;;;;;;;AAgB1B,UAAiB,IAAI,GAAG,OAA2C;CACjE,KAAK,MAAM,QAAQ,OACjB,MAAM;CAER,OAAO,KAAK,OAAO,GAAG,KAAK;AAC7B;;;ACrBA,SAAS,OAAO,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkC5B,UAAiB,MACf,GAAG,OACc;CACjB,KAAK,MAAM,aAAa,OACtB,IAAI,kBAAkB,SAAS,GAC7B,OAAO;MAEP,UAAU;AAGhB;;;AC3CA,SAAS,WAAW,WAAW,CAAC;;;;;;;;;;;;;;;;AAgBhC,UAAiB,UACf,OACA,OACiB;CACjB,OAAO,QAAQ,YAAY,KAAK,CAAC;CAEjC,IAAI,OACF,OAAO;AAEX;AAEA,SAAS,SAAS,WAAW,CAAC;;;;;;;;;;;;;;;;AAgB9B,UAAiB,QACf,UAAU,GACV,OACiB;CACjB,MAAM,SAAS,UAAU;CACzB,MAAM,OAAO,YAAY,EAAE,gBAAgB,CAAC;CAE5C,MAAM,aAAa,OAAO,KAAK,IAAI;CAGnC,OAAO,aAAa,OAAO,OAAO,OAChC;CAEF,OAAO,KAAK,UAAU;CAEtB,IAAI,OACF,OAAO;AAEX;;;AC7DA,SAAS,OAAO,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2B5B,UAAiB,MACf,MACA,MACiB;CACjB,OAAO,QAAQ,IAAI;CACnB,IAAI,kBAAkB,IAAI,GACxB,OAAO;MAEP,KAAK;AAET;;;;;;;;;;;;;;;;;;;;;ACIA,SAAgB,MAAM,UAAkB,UAAqC;CAC3E,IAAI,UAAU;CACd,SAAS,aAAa,WAAW,OAAO,CAAC;CACzC,UAAU,cAA+B;EACvC,MAAM,UAAU,YAAY;EAC5B,IAAI,MAAM;EACV,IAAI,OAAO;EACX,SAAS,IAAI;EACb,UAAU;EAEV,OAAO,MAAM;GACX,IAAI,OAAO,QAAQ,gBAAgB,QAAQ,GAAG;IAC5C,MAAM;IACN;IACA,SAAS,IAAI;IACb,UAAU;GACZ,OACE,UAAU;GAEZ;GACA;EACF;CACF;CAEA,OAAO;EACL,QAAQ,YAAY;EACpB,YAAY,OAAO;GACjB,WAAW;GACX,UAAU;EACZ;EACA,YAAY,OAAO;GACjB,WAAW;GACX,UAAU;EACZ;EACA,CAAC,OAAO;GACN,OAAO,CAAC,SACN;EAEJ;CACF;AACF;;;ACrFA,IAAA,wBAAe;;;;;;;;;;;;;;;;;;;;;;;;;ACcf,SAAS,MAAM,WAAW,CAAC;AAqD3B,UAAiB,KACf,YACA,SACiB;CACjB,IAAI,OAAO,eAAe,UAAU;EAClC,UAAU;EACV,aAAa;CACf;CAEA,IAAI,eAAe,YAAY,UAAU,EAAE,WAAW,MAAM;EAC1D,UAAU,EAAE,MAAM;GAChB,SAAS;GACT,SAASC;GACT,wBAAO,IAAI,MAAM,GAAE;EACrB,CAAC;EACD;CACF;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;EACnC,MAAM,YAAY,QAAS,CAAC;EAC5B,IAAI,WACF,OAAO;OAEP;CAEJ;AACF;;;ACxFA,SAAS,SAAS,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsB9B,UAAiB,QACf,SACA,SACiB;CACjB,MAAM,SAAS,UAAU;CACzB,MAAM,OAAO,YAAY,EAAE,gBAAgB,CAAC;CAC5C,MAAM,aAAa,OAAO,KAAK,IAAI;CAEnC,IAAI,YAAY;CAChB,OAAO,aAAa,OAAO,OAAO,OAAO;EACvC,MAAM,YAAY,QAAQ,SAAS;EACnC,IAAI,WACF,OAAO;OAEP;EAEF,aAAa;CACf;CACA,OAAO,KAAK,UAAU;AACxB;;;ACxCA,SAAS,WAAW,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsBhC,UAAiB,UACf,OACA,SACiB;CACjB,OAAO,QAAQ,YAAY,KAAK,GAAG,OAAO;AAC5C;;;AC9BA,SAAS,MAAM,WAAW,CAAC;;;;AAI3B,UAAiB,OAAwB,CAEzC;;;ACuCA,SAAgB,IACd,UACA,QACiB;CACjB,IAAI;CACJ,IAAI,OAAO,aAAa,UAAU;EAChC,OAAO,OAAQ;EACf,YAAY,MAAM,QAAQ;CAC5B,OAAO;EACL,OAAO,SAAS;EAChB,YAAY,MAAM,IAAI;CACxB;CAEA,OAAO;AACT;;;AC1DA,SAAS,UAAU,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;AAoB/B,UAAiB,SACf,OACA,GAAG,OACc;CACjB,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM;EACN,OAAO,QAAQ,KAAK;CACtB;CAEA,OAAO,KAAK,GAAG,KAAK;AACtB;;;AC5BA,SAAgB,aAAa,OAAsC;CACjE,OACE,UACC,OAAO,UAAU,YAAY,OAAO,UAAU,eAC/C,eAAe;AAEnB;;;;;;AAuCA,SAAgB,kBAAkB,OAA0C;CAC1E,OACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,YAAY,SACnB,UAAU;AAEd;;;AC1DA,IAAA,2BAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACiBf,IAAa,SAAb,MAAoB;CA0DA;CAzDlB,IAAW,aAAa;EACtB,OAAO,KAAK,SAAS;CACvB;CACA,WAAmB,IAAI,gBAAsB;CAE7C,WAA4B,CAAC;;;;CAI7B;;;;;;;;CASA,OAAuB,aAAa,CAAC;;;;;;;;;CAUrC,IAAW,QAAQ;EACjB,OAAO,KAAK;CACd;;;;CAKA,IAAW,WAAoB;EAC7B,OAAO,KAAK,eAAe,KAAK,QAAQ,YAAY;CACtD;CAEA,IAAW,SAAkB;EAC3B,OAAO,KAAK,aAAa,KAAK,QAAQ,UAAU;CAClD;CAEA,IAAW,OAAe;EACxB,OAAO,KAAK,QAAQ,QAAQ;CAC9B;CAEA,SAA+B;CAC/B,aAAqB;CACrB,WAAmB;CACnB,YAAoB;CACpB,QAAmC,CAAC;CAEpC,YAIE,QACA;EADgB,KAAA,SAAA;EAEhB,IAAI,KAAK,OAAO,MAAM;GACpB,UAAU,EAAE,MAAM;IAChB,SAAS,kBAAkB,YACzB,KAAK,MACP,EAAE;IACF,SAASC;GACX,CAAC;GACD,KAAK,SAAS,qBAAK;EACrB;EACA,KAAK,OAAO,OAAO;CACrB;;;;CAKA,OAAc;EACZ,IAAI,KAAK,QACP,OAAO;GACL,OAAO;GACP,MAAM;EACR;EAGF,YAAY,IAAI;EAChB,MAAM,SAAS,KAAK,OAAO,KAAK,KAAK,KAAK;EAC1C,UAAU,IAAI;EACd,KAAK,QAAQ;EACb,OAAO;CACT;;;;;;CAOA,OAAc,IAAY;EACxB,IAAI,CAAC,KAAK,QAAQ;GAChB,KAAK,KAAK,KAAK,KAAK,IAAI,EAAE;GAC1B,KAAK,aAAa;EACpB;EACA,KAAK,WAAW,KAAK,SAAS,QAAO,UAAS,CAAC,MAAM,QAAQ;CAC/D;CAEA,MACE,OACiB;EACjB,IAAI,CAAC,kBAAkB,KAAK,GAC1B,QAAQ,MAAM;EAEhB,KAAK,MAAM,KAAK,KAAK;EACrB,OAAO;CACT;CAEA,IAAW,OAAe;EACxB,MAAM,SAAS;EACf,MAAM,aAAa;EACnB,MAAM,KAAK,KAAK,KAAK,CAAC;EACtB,MAAM,YAAY,KAAK;EACvB,KAAK,SAAS,KAAK,KAAK;EAExB,YAAY,MAAM,QAAQ,WAAW,KAAK,SAAS,QAAQ;CAC7D;CAEA,MAAa,UAA2C;EACtD,KAAK,MAAM,QAAQ,QAAQ;EAC3B,KAAK,QAAQ,CAAC;CAChB;CAEA,SAAgB;EACd,KAAK,SAAS,MAAM;EACpB,KAAK,OAAO,OAAO;EACnB,KAAK,aAAa;EAClB,KAAK,SAAS;EACd,KAAK,OAAM,SAAQ,KAAK,OAAO,CAAC;CAClC;CAEA,MAAa,OAAgB;EAC3B,KAAK,WAAW;CAClB;CAEA,cAAqB;EACnB,YAAY,IAAI;EAChB,KAAK,SAAS,SAAS;EACvB,UAAU,IAAI;CAChB;AACF;;;;;;;;;;ACrJA,SAAgB,UAAU,OAAmC;CAC3D,OAAO,OAAO,OAAO,SAAS;AAChC;AAaA,SAAS,SAAS,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AA0B9B,UAAiB,QACf,SACA,UACiB;CACjB,MAAM,WAAW,YAAY;CAC7B,MAAM,OAAO,QAAQ;CACrB,YAAY,MAAM,MAAM;CACxB,MAAM,aAAa,IAAI,OAAO,IAAI;CAClC,WAAW,UAAU;CAErB,IAAI,UAAoB,CAAC,UAAU;CACnC,OAAO,QAAQ,SAAS,GAAG;EACzB,MAAM,aAAa,CAAC;EACpB,MAAM,QAAQ,CAAC,GAAG,OAAO;EACzB,MAAM,KAAK,SAAS;EAEpB,OAAO,MAAM,SAAS,GAAG;GACvB,MAAM,SAAS,MAAM,IAAI;GACzB,IAAI,CAAC,UAAU,OAAO,UACpB;GAGF,MAAM,SAAS,OAAO,KAAK;GAC3B,IAAI,OAAO,MAAM;IACf,OAAO,OAAO;IACd;GACF;GAEA,IAAI,kBAAkB,OAAO,KAAK,GAAG;IACnC,MAAM,QAAQ,IAAI,OAAO,OAAO,KAAK;IACrC,OAAO,QAAQ,OAAO;IACtB,OAAO,IAAI,KAAK;IAEhB,MAAM,KAAK,MAAM;IACjB,MAAM,KAAK,KAAK;GAClB,OAAO,IAAI,OAAO,OAAO;IACvB,OAAO,QAAQ,MAAM,OAAO;IAC5B,MAAM,KAAK,MAAM;GACnB,OAAO;IACL,OAAO,OAAO,EAAE;IAChB,OAAO,OAAM,SAAQ;KACnB,MAAM,QAAQ,IAAI,OAAO,IAAI;KAC7B,OAAO,IAAI,KAAK;KAChB,WAAW,QAAQ,KAAK;IAC1B,CAAC;IAED,WAAW,QAAQ,MAAM;GAC3B;EACF;EAEA,UAAU,CAAC;EACX,KAAK,MAAM,UAAU,YACnB,IAAI,CAAC,OAAO,UAAU;GACpB,QAAQ,KAAK,MAAM;GACnB,OAAO,YAAY;EACrB;EAGF,IAAI,QAAQ,SAAS,GAAG;CAC1B;AACF;;;;;;ACVA,IAAY,mBAAL,yBAAA,kBAAA;;;;CAIL,iBAAA,iBAAA,kBAAA,KAAA;;;;;CAKA,iBAAA,iBAAA,iBAAA,KAAA;;;;;CAKA,iBAAA,iBAAA,kBAAA,KAAA;;;;CAIA,iBAAA,iBAAA,iBAAA,KAAA;;AACF,EAAA,CAAA,CAAA;;;;;;ACrHA,IAAa,kBAAb,MAA6B;CAyBS;CAxBpC,IAAW,iBAAiB;EAC1B,OAAO,KAAK,aAAa;CAC3B;CACA,eACE,IAAI,gBAA0C;CAEhD,IAAW,gBAAgB;EACzB,OAAO,KAAK,YAAY;CAC1B;CACA,cACE,IAAI,gBAA0C;CAEhD,IAAW,iBAAiB;EAC1B,OAAO,KAAK,aAAa;CAC3B;CACA,eACE,IAAI,gBAA0C;CAEhD,IAAW,gBAAgB;EACzB,OAAO,KAAK,YAAY;CAC1B;CACA,cACE,IAAI,gBAA0C;CAEhD,YAAmB,OAA+B;EAAd,KAAA,QAAA;EAClC,KAAK,MAAM,kBAAkB,WAAW,CAAC,OAAO,SAAS;GACvD,QAAQ,OAAR;IACE,KAAA,GACE,OAAO,KAAK,aAAa,SAAS,GAAG;IACvC,KAAA,GACE,OAAO,KAAK,YAAY,SAAS,GAAG;IACtC,KAAA,GACE,OAAO,KAAK,aAAa,SAAS,GAAG;IACvC,KAAA,GACE,OAAO,KAAK,YAAY,SAAS,GAAG;GACxC;EACF,CAAC;EACD,KAAK,MAAM,QAAQ,gBAAgB;GACjC,KAAK,aAAa,MAAM;GACxB,KAAK,YAAY,MAAM;GACvB,KAAK,aAAa,MAAM;GACxB,KAAK,YAAY,MAAM;EACzB,CAAC;CACH;AACF;;;;;;;AC5CA,IAAa,SAAb,MAAa,OAAO;CAYS;;;;;;;;;;CAF3B,YAAmC;CAEnC,YAAmB,OAAuB;EAAf,KAAA,QAAA;CAAgB;;;;CAK3C,OAAc,aAAa;EACzB,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,UAAU;CAC9C;;;;;;;CAQA,UAAiB,OAAO,GAAG,KAAK,GAAG;EACjC,OAAO,IAAI,MAAM,IAAI,KAAK,KAAK,CAAC;CAClC;;;;;;;CAQA,QAAe,OAAO,GAAG,KAAK,YAAY;EACxC,IAAI,QAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,KAAK,KAAK,CAAC,CAAC;EACjD,IAAI,UAAU,IACZ,QAAQ;EAGV,OAAO;CACT;;;;;;CAOA,MAAa,OAAO,GAAG,QAAQ,GAAW;EACxC,IAAI,IAAI,KAAK;EACb,KAAK,YAAY;EACjB,IAAI,MAAM,MAAM;GACd,MAAM,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK;GACpC,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;GACtD,IAAI,KAAK,IAAI,IAAI,IAAI;GACrB,KAAK,YAAY,KAAK,IAAI,IAAI,IAAI;EACpC;EACA,OAAO,OAAO,IAAI;CACpB;;;;;;;;CASA,WAAkB,MAAc,OAAO,GAAG,KAAK,GAAa;EAC1D,OAAO,MAAM,IAAI,EAAE,UAAU,KAAK,UAAU,MAAM,EAAE,CAAC;CACvD;;;;;;;;CASA,SAAgB,MAAc,OAAO,GAAG,KAAK,YAAsB;EACjE,OAAO,MAAM,IAAI,EAAE,UAAU,KAAK,QAAQ,MAAM,EAAE,CAAC;CACrD;;;;CAKA,QAAe;EACb,OAAO,IAAI,OAAO,KAAK,QAAQ,CAAC;CAClC;CAEA,OAAe;EACb,KAAK,SAAS;EACd,KAAK,QAAS,KAAK,QAAQ,aAAc;EACzC,IAAI,IAAI,KAAK,KAAK,KAAK,QAAS,KAAK,UAAU,IAAK,IAAI,KAAK,KAAK;EAClE,IAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,KAAK,CAAC,IAAK;EAC7C,SAAS,IAAK,MAAM,QAAS,KAAK;CACpC;AACF;;;;;;ACvGA,IAAY,aAAL,yBAAA,YAAA;;;;CAIL,WAAA,WAAA,aAAA,KAAA;;;;;;;;CASA,WAAA,WAAA,uBAAA,KAAA;;;;;;;;;CAUA,WAAA,WAAA,sBAAA,KAAA;;;;;;;CAQA,WAAA,WAAA,cAAA,KAAA;;AACF,EAAA,CAAA,CAAA;;;;;;AC7BA,MAAa,qBAAqB;;;;AAIlC,MAAa,8BAA8B;;;;AAI3C,MAAa,yBAAyB;;;;AAItC,MAAa,eAAe;;;;AAI5B,MAAa,qBAAqB;;;;AAIlC,MAAa,oBAAoB;;;;AAIjC,MAAa,gBAAgB;;;;AAI7B,MAAa,wBAAwB;;;;AAIrC,MAAa,6BAA6B;AAG1C,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BvB,IAAa,UAAb,MAAkD;CAW7B;CACA;CAXnB,KAA4C;CAC5C,iBAA6C;CAC7C,gBAA6C;CAC7C,qBAAkD;CAClD,mBAA2B;CAC3B,gBAAiC,IAAI,aAAa;EAChD;EAAM;EAAK;EAAM;EAAM;EAAK;EAAK;EAAK;CACxC,CAAC;CAED,YACE,OACA,eACA;EAFiB,KAAA,QAAA;EACA,KAAA,gBAAA;EAEjB,MAAM,WAAW,UAAU,KAAK,YAAY;CAC9C;CAEA,MAAa,IAAkC;EAC7C,KAAK,KAAK;EACV,KAAK,eAAe;EACpB,KAAK,iBAAiB,GAAG,aAAa;EACtC,GAAG,WAAW,GAAG,cAAc,KAAK,cAAc;EAClD,GAAG,WAAW,GAAG,cAAc,KAAK,eAAe,GAAG,WAAW;EACjE,GAAG,oBAAoB,KAAK,kBAAkB,GAAG,GAAG,OAAO,OAAO,GAAG,CAAC;EACtE,GAAG,wBAAwB,KAAK,gBAAgB;EAEhD,KAAK,gBAAgB,GAAG,cAAc;EACtC,GAAG,cAAc,GAAG,QAAQ;EAC5B,GAAG,YAAY,GAAG,YAAY,KAAK,aAAa;EAChD,GAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;EACnE,GAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;EAEnE,KAAK,qBAAqB,GAAG,cAAc;EAC3C,GAAG,cAAc,GAAG,QAAQ;EAC5B,GAAG,YAAY,GAAG,YAAY,KAAK,kBAAkB;EACrD,GAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;EACnE,GAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;CACrE;CAEA,SAAgB,IAAkC;EAChD,GAAG,aAAa,KAAK,cAAc;EACnC,GAAG,yBAAyB,KAAK,gBAAgB;EACjD,GAAG,cAAc,KAAK,aAAa;EACnC,GAAG,cAAc,KAAK,kBAAkB;EACxC,KAAK,iBAAiB;EACtB,KAAK,gBAAgB;EACrB,KAAK,qBAAqB;EAC1B,KAAK,KAAK;CACZ;CAEA,qBAA6B;EAC3B,IAAI,KAAK,IACP,KAAK,eAAe;CAExB;CAEA,iBAAyB;EACvB,IAAI,KAAK,IAAI;GACX,MAAM,OAAO,KAAK,MAAM,YAAY;GACpC,KAAK,GAAG,OAAO,QAAQ,KAAK;GAC5B,KAAK,GAAG,OAAO,SAAS,KAAK;GAC7B,KAAK,GAAG,SAAS,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;EAChD;CACF;CAEA,QAAe;EACb,OAAO,KAAK,MAAM,KAAK,cAAc,OAAO,IAAI;CAClD;CAEA,WAAkB,UAAkB;EAClC,MAAM,UAAU,KAAK,cAAc,WAAW,UAAU,cAAc;EACtE,IAAI,CAAC,SACH,OAAO;EAGT,MAAM,OAAO,KAAK,MAAM,YAAY;EACpC,MAAM,KAAK,KAAK,MAAM;EACtB,GAAG,WAAW,OAAO;EACrB,GAAG,UAAU,GAAG,mBAAmB,SAAS,sBAAsB,GAAG,CAAC;EACtE,GAAG,UACD,GAAG,mBAAmB,SAAS,2BAA2B,GAC1D,CACF;EACA,GAAG,UACD,GAAG,mBAAmB,SAAS,kBAAkB,GACjD,KAAK,GACL,KAAK,CACP;EACA,GAAG,UACD,GAAG,mBAAmB,SAAS,kBAAkB,GACjD,KAAK,MAAM,SAAS,SACtB;EACA,GAAG,UACD,GAAG,mBAAmB,SAAS,iBAAiB,GAChD,KAAK,MAAM,SAAS,GACtB;EAEA,OAAO;CACT;CAEA,aAAoB,aAA6B,QAAwB;EACvE,KAAK,YAAY,QAAQ,KAAK,aAAc;EAC5C,KAAK,YAAY,aAAa,KAAK,kBAAmB;CACxD;CAEA,QAAe;EACb,MAAM,KAAK,KAAK,MAAM;EACtB,GAAG,WAAW,GAAG,GAAG,GAAG,CAAC;EACxB,GAAG,MAAM,GAAG,gBAAgB;CAC9B;CAEA,SAAgB;EACd,MAAM,KAAK,KAAK,MAAM;EACtB,GAAG,WAAW,GAAG,gBAAgB,GAAG,CAAC;CACvC;CAEA,YAAoB,QAAwB,SAAuB;EACjE,MAAM,KAAK,KAAK,MAAM;EACtB,GAAG,YAAY,GAAG,YAAY,OAAO;EACrC,GAAG,WAAW,GAAG,YAAY,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,MAAM;EAC1E,GAAG,eAAe,GAAG,UAAU;CACjC;AACF;;;AClLA,IAAa,SAAb,MAAoB;CAakB;CAZpC,IAAW,YAAY;EACrB,OAAO,KAAK,OAAO;CACrB;CACA,SAA0B,IAAI,gBAAyB,CAAC,CAAC;CAEzD,yBAA0B,IAAI,IAAmB;CACjD,kCAAmC,IAAI,IAAY;CACnD,UAAgC;CAChC,YAAoB;CACpB,aAAoC;CACpC,WAAkC;CAElC,YAAmB,OAA+B;EAAd,KAAA,QAAA;EAClC,KAAK,MAAM,WAAW,UAAU,KAAK,YAAY;EACjD,KAAK,MAAM,QAAQ,UAAU,KAAK,WAAW;EAC7C,KAAK,MAAM,eAAe,UAAU,KAAK,kBAAkB;CAC7D;CAEA,UAAiB,QAAuB;EACtC,KAAK,WAAW;CAClB;CAEA,SAAgB;EACd,KAAK,YAAY;CACnB;CAEA,aAAoB,OAAe;EACjC,OAAO,KAAK,eAAe;CAC7B;CAEA,YAAmB;EACjB,OAAO,KAAK,eAAe;CAC7B;CAEA,UAAiB,OAAe;EAC9B,IAAI,KAAK,YAAY,MACnB,OAAO;EAGT,KAAK,MAAM,OAAO,KAAK,OAAO,KAAK,GAAG;GACpC,IAAI,QAAQ,OACV,OAAO;GAET,IAAI,QAAQ,KAAK,SAAS,IACxB,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,aAAoB;EAClB,OAAO,KAAK;CACd;CAEA,SAAgB,MAAc,aAAqB;EACjD,IAAI,KAAK,eAAe,MACtB,MAAM,IAAI,MACR,4CAA4C,KAAK,WAAW,EAC9D;EAGF,MAAM,KAAK,KAAK,KAAK,IAAI;EACzB,IAAI,KAAK,MAAM,SAAS,UAAA,GAAoC;GAC1D,IAAI,CAAC,KAAK,OAAO,IAAI,EAAE,GACrB,KAAK,OAAO,IAAI,IAAI;IAClB;IACA;IACA,MAAM;IACN,OAAO,KAAK;IACZ,wBAAO,IAAI,MAAM,GAAE;GACrB,CAAC;GAGH,IAAI,KAAK,gBAAgB,IAAI,IAAI,GAC/B,KAAK,MAAM,OAAO,KAAK;IACrB,SAAS,kBAAkB,KAAK;IAChC,wBAAO,IAAI,MAAM,GAAE;GACrB,CAAC;QAED,KAAK,gBAAgB,IAAI,IAAI;EAEjC;EAEA,KAAK,aAAa;EAClB,KAAK,UAAU,KAAK,OAAO,IAAI,EAAE,KAAK;EACtC,KAAK,YAAY;CACnB;CAEA,WAAkB,MAAuB;EACvC,MAAM,KAAK,KAAK,KAAK,IAAI;EACzB,IAAI,KAAK,eAAe,IACtB,MAAM,IAAI,MACR,8CAA8C,KAAK,WAAW,EAChE;EAGF,IAAI,CADS,KAAK,OAAO,IAAI,EACrB,GACN,MAAM,IAAI,MAAM,uBAAuB,KAAK,SAAS;EAGvD,IAAI,YAAY,KAAK;EACrB,IAAI,KAAK,MAAM,SAAS,UAAA,GACtB,YAAY,OAAO,KAAK;EAG1B,IAAI,WACF,KAAK,aAAa;EAEpB,OAAO,CAAC;CACV;CAEA,qBAA6B;EAC3B,KAAK,OAAO,MAAM;EAClB,KAAK,gBAAgB,MAAM;EAC3B,KAAK,UAAU;EACf,KAAK,aAAa;EAClB,KAAK,WAAW;CAClB;CAEA,oBAA4B;EAC1B,KAAK,gBAAgB,MAAM;EAC3B,KAAK,UAAU;EACf,KAAK,aAAa;CACpB;CAEA,2BAAmC;EACjC,KAAK,OAAO,UAAU,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC;CAChD;CAEA,KAAa,MAAc;EACzB,OAAO,GAAG,KAAK,MAAM,KAAK,GAAG;CAC/B;AACF;;;AChIA,IAAa,eAAb,MAAa,aAAa;CACxB;;;;CAKA,YAAmB,OAA8B;EAC/C,IAAI,iBAAiB,cACnB,KAAK,WAAW,EAAC,GAAG,MAAM,SAAQ;OAElC,KAAK,WAAW,EAAC,MAAK;CAE1B;;;;;;;CAQA,KAAY,OAAgB,KAAoB;EAC9C,KAAK,SAAS,QAAQ;EACtB,KAAK,SAAS,MAAM;EACpB,OAAO;CACT;;;;;;CAOA,KAAY,IAAkB;EAC5B,KAAK,SAAS,OAAO;EACrB,OAAO;CACT;;;;;;;;;CAUA,OAAc,OAAqB;EACjC,KAAK,SAAS,SAAS;EACvB,OAAO;CACT;;;;;;;;;CAUA,aAAoB,MAAoB;EACtC,KAAK,SAAS,eAAe,OAAO,IAAI,OAAO;EAC/C,OAAO;CACT;;;;;;CAOA,KAAY,QAAiB;EAC3B,SAAS,EAAE,OAAO,IAAI,KAAK,UAAU,MAAM;CAC7C;AACF;;;;AAKA,SAAgB,MAAM,OAA8B;CAClD,OAAO,IAAI,aAAa,KAAK;AAC/B;AAEA,IAAa,SAAb,MAAoB;CAOkB;CANpC,IAAW,YAAY;EACrB,OAAO,KAAK,OAAO;CACrB;CACA,SAA0B,IAAI,gBAAyB,CAAC,CAAC;CACzD,mBAAoC,CAAC;CAErC,YAAmB,OAA+B;EAAd,KAAA,QAAA;EAClC,KAAK,MAAM,QAAQ,UAAU,KAAK,KAAK;EACvC,KAAK,MAAM,WAAW,UAAU,KAAK,KAAK;EAC1C,KAAK,MAAM,eAAe,UAAU,KAAK,kBAAkB;CAC7D;CAEA,IAAW,UAAyB,QAAiB;EACnD,MAAM,eAAe,KAAK,MAAM,SAAS,QAAQ,UAAU;EAE3D,KAAK,iBAAiB,KAAK;GACzB,QAAQ;GACR,kBACE,KAAK,IAAI,IAAI,SAAS,UAAU,KAAK,IAAI,KACxC,SAAS,gBAAgB;GAC5B,GAAG;EACL,CAAC;CACH;CAEA,YAAqC;EACnC,OAAO,KAAK;CACd;CAEA,2BAAmC;EACjC,KAAK,OAAO,UAAU,CAAC,GAAG,KAAK,gBAAgB;CACjD;CAEA,cAAsB;EACpB,KAAK,mBAAmB,CAAC;CAC3B;AACF;;;AClIA,IAAa,YAAb,MAAuB;CAIe;CAHpC,UAAsD,CAAC;CACvD,YAA6C,CAAC;CAE9C,YAAmB,OAA+B;EAAd,KAAA,QAAA;EAClC,MAAM,QAAQ,UAAU,KAAK,WAAW;CAC1C;;;;;;;;CASA,IAAc,MAAc,SAAqB;EAC/C,KAAK,QAAQ,UAAU,aAAa,KAAK,UAAU,SAAS,OAAO;EACnE,aAAa,KAAK,QAAQ,MAAM;CAClC;;;;CAKA,cAAqB,WAAoC;EACvD,KAAK,YAAY;EACjB,OAAO,KAAK,SAAS,EAAE,KAAI,iBAAgB;GACzC,IAAI,gBAAgB,KAAK,SACvB,KAAK,QAAQ,cAAc,UAAU,aAAa;EAEtD,CAAC;CACH;;;;CAKA,oBAA2B;EACzB,KAAK,UAAU,CAAC;CAClB;AACF;;;;;;;;ACDA,IAAsB,iBAAtB,MAEA;CACE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,IAAW,aAAa;EACtB,OAAO,KAAK,MAAM,QAAQ;CAC5B;CAEA,IAAW,qBAAqB;EAC9B,OAAO,KAAK,MAAM,QAAQ;CAC5B;CAEA,IAAW,YAAY;EACrB,OAAO,KAAK,aAAa,KAAK,MAAM,QAAQ;CAC9C;CAEA,IAAW,iBAAiB;EAC1B,OAAO,KAAK,MAAM;CACpB;CACA,QAAyB,IAAI,gBAAiC;EAC5D,YAAY;EACZ,oBAAoB;EACpB,UAAU;EACV,WAAW;CACb,CAAC;CAED,IAAW,aAAa;EACtB,OAAO,KAAK,SAAS;CACvB;CACA,WAA4B,IAAI,gBAAsB;CAEtD,IAAW,iBAAiB;EAC1B,OAAO,KAAK,aAAa;CAC3B;CACA,eAAgC,IAAI,gBAAsB;CAE1D,IAAW,kBAAkB;EAC3B,OAAO,KAAK,OAAO;CACrB;CACA,SAA0B,IAAI,gBAA+B,IAAI;CAEjE,IAAW,oBAAoB;EAC7B,OAAO,KAAK,gBAAgB;CAC9B;CACA,kBAAqC,IAAI,gBAEvC;CAEF,IAAW,UAAU;EACnB,OAAO,KAAK,WAAW;CACzB;CACA,aAA8B,IAAI,gBAAsB;CAExD,kBAAmD,IAAI,gBAAgB,IAAI;CAE3E,IAAW,kBAAkB;EAC3B,KAAK,OAAO,KACV,6DACF;EACA,OAAO,KAAK;CACd;CAEA,IAAW,WAAW;EACpB,OAAO,KAAK;CACd;CAEA;CAEA;CACA;CACA,gBAAsC;CACtC,SAAyC;CACzC,QAAQ;CACR,SAAiB;CACjB,WAA2C,CAAC;CAC5C;CAEA,YACE,aACA;EACA,KAAK,OAAO,YAAY;EACxB,KAAK,OAAO,YAAY;EACxB,KAAK,kBAAkB,YAAY;EACnC,KAAK,SAAS,YAAY;EAC1B,KAAK,WAAW,YAAY;EAC5B,KAAK,OAAO,YAAY;EACxB,KAAK,gBAAgB,YAAY;EACjC,KAAK,gBAAgB,YAAY;EACjC,KAAK,uBAAuB,YAAY,wBAAwB;EAEhE,SAAS,KAAK,eAAe,WAAW,KAAK,IAAI,CAAC;EAClD,KAAK,aAAa,IAAI,YAAY,gBAAgB,IAAI;EACtD,KAAK,YAAY,IAAI,UAAU,IAAI;EACnC,KAAK,UAAU,IAAI,QAAQ,MAAM,YAAY,kBAAkB;EAC/D,KAAK,SAAS,IAAI,OAAO,IAAI;EAC7B,KAAK,SAAS,IAAI,OAAO,IAAI;EAE7B,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,KAAK,IAAI,CAAC;EAC7C,KAAK,gBAAgB;CACvB;;;;;;;;;CAYA,SAAgB,CAEhB;CAEA,MAAa,OAAO,SAAkD;EACpE,IAAI,aAAa;EACjB,GAAG;GACD;GACA,MAAM,kBAAkB,gBAAgB;GACxC,QAAQ,KAAK;GACb,QAAQ,UAAU,GAAG,GAAG,QAAQ,OAAO,OAAO,QAAQ,OAAO,MAAM;GACnE,KAAK,cAAc,KAAK,KAAK,OAAO,CAAC;GACrC,QAAQ,QAAQ;EAClB,SAAS,kBAAkB,YAAY,KAAK,aAAa;EAEzD,IAAI,aAAa,GACf,KAAK,OAAO,MAAM,sBAAsB,YAAY;CAExD;CAIA,OAAc,EACZ,QACA,MACA,OACA,oBACqD,CAAC,GAAG;EACzD,IAAI,QACF,KAAK,gBAAgB;EAEvB,IAAI,MACF,KAAK,OAAO;EAEd,IAAI,iBACF,KAAK,kBAAkB;EAEzB,IAAI,OACF,KAAK,gBAAgB;EAEvB,KAAK,SAAS;EACd,KAAK,SAAS,SAAS;CACzB;CAEA,MAAa,YAAY,UAAmC;EAC1D,MAAM,SAAS,KAAK,MAAM;EAC1B,OAAO,aAAa,KAAK,SAAS;EAClC,OAAO,YAAY,OAAO,aAAa,OAAO;EAE9C,IAAI,KAAK,SAAS,GAAG;GACnB,SAAS,OAAO,SAAS;GACzB,KAAK,MAAM,UAAU,EAAC,GAAG,OAAM;GAC/B;EACF;EAEA,OAAO,qBAAqB;EAC5B,MAAM,KAAK,MAAM;EACjB,OAAO,CAAC,KAAK,iBAAiB,GAAG;GAC/B,IACE,OAAO,qBAAqB,KAC5B,KAAK,UAAA,GAEL,OAAO,qBAAqB,KAAK,SAAS,QAAQ,OAAO;GAE3D,SAAS,KAAK,SAAS,QAAQ,CAAC;GAChC,MAAM,KAAK,KAAK;EAClB;EAEA,IAAI,OAAO,uBAAuB,IAChC,OAAO,qBAAqB;EAG9B,OAAO,YAAY,KAAK,SAAS;EACjC,OAAO,WAAW,OAAO,YAAY,OAAO;EAE5C,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,CAAC,CAAC;EACnD,KAAK,SAAS;EACd,KAAK,MAAM,UAAU,EAAC,GAAG,OAAM;EAC/B,KAAK,aAAa,SAAS;CAC7B;CAEA,MAAa,OAAO;EAClB,IAAI,CAAC,KAAK,QACR;EAGF,IAAI,SAAS,KAAK,cAAc,KAAK,OAAQ,KAAK,CAAC;EACnD,KAAK,OAAO;EACZ,OAAO,OAAO,OAAO;GACnB,IAAI,aAAa,OAAO,KAAK,GAAG;IAC9B,MAAM,QAAQ,MAAM,OAAO,MAAM,UAAU;IAC3C,SAAS,KAAK,cAAc,KAAK,OAAQ,KAAK,KAAK,CAAC;GACtD,OAAO,IAAI,UAAU,OAAO,KAAK,GAAG;IAClC,MAAM,QAAQ,MAAM,OAAO;IAC3B,SAAS,KAAK,cAAc,KAAK,OAAQ,KAAK,KAAK,CAAC;GACtD,OAAO;IACL,KAAK,OAAO,KAAK;KACf,SAAS;KACT,QAAQ,OAAO;IACjB,CAAC;IACD,SAAS,KAAK,cAAc,KAAK,OAAQ,KAAK,OAAO,KAAK,CAAC;GAC7D;GACA,KAAK,OAAO;EACd;EAEA,IAAI,kBAAkB,YAAY,GAAG;GACnC,MAAM,WAAW,MAAM,kBAAkB,gBAAgB;GACzD,KAAK,OAAO,MAAM;IAChB,SACE;IAEF,OAAO,SAAS,GAAG;IACnB,SAAS,SAAS,GAAG,OAAO,OAAO,KAAA;GACrC,CAAC;EACH;EAEA,IAAI,OAAO,MACT,KAAK,QAAA;CAET;CAEA,MAAa,MAAM,gBAA8B,MAAM;EACrD,KAAK,WAAW,CAAC;EACjB,KAAK,gBAAgB;EACrB,KAAK,gBAAgB;EACrB,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,KAAK,IAAI,CAAC;EAC7C,KAAK,SAAS,cACN,KAAK,cAAc,KAAK,QAAQ,CAAC,IACvC,WAAU;GACR,KAAK,OAAO,UAAU;EACxB,CACF;EACA,KAAK,QAAA;EACL,KAAK,WAAW,SAAS;EACzB,MAAM,KAAK,KAAK;CAClB;CAEA,UAA0B;EACxB,OAAO,KAAK;CACd;CAEA,cAA8B;EAC5B,OAAO,KAAK,KAAK,IAAI,KAAK,eAAe;CAC3C;CAEA,sBAAsC;EACpC,OAAO,KAAK,UAAA;CACd;CAEA,mBAAmC;EACjC,OACE,KAAK,UAAA,KACL,KAAK,UAAA;CAET;CAEA,aAA6B;EAC3B,OAAO,KAAK,UAAA;CACd;CAEA,eAAsB;EACpB,IAAI,KAAK,UAAA,GACP,KAAK,QAAA;OAEL,KAAK,OAAO,KACV,SAAS,KAAK,KAAK,2CAA2C,KAAK,OACrE;CAEJ;CAEA,yBAAgC;EAC9B,IAAI,KAAK,UAAA,GACP,KAAK,QAAA;OAEL,KAAK,OAAO,KACV,SAAS,KAAK,KAAK,wCAAwC,KAAK,OAClE;CAEJ;CAEA,wBAA+B;EAC7B,IACE,KAAK,UAAA,KACL,KAAK,UAAA,GAEL,KAAK,QAAA;OAEL,KAAK,OAAO,KACV,SAAS,KAAK,KAAK,kDAAkD,KAAK,OAC5E;CAEJ;CAEA,WAAkB;EAChB,OAAO,KAAK;CACd;;;;;;;;;;CAWA,QAAqB,UAAsB;EACzC,IAAI;EACJ,WAAW,IAAI;EACf,cAAc,KAAK,QAAQ;EAC3B,IAAI;GACF,SAAS,SAAS;EACpB,UAAU;GACR,YAAY,KAAK,QAAQ;GACzB,SAAS,IAAI;EACf;EAEA,OAAO;CACT;AACF;;;AC7SA,SAAgB,cAAc,OAAkC;CAC9D,OAAO,SAAS,OAAO,UAAU,YAAY,wBAAwB;AACvE;;;;;;AC5EA,SAAgB,sBAAsB;CACpC,OAAO,IAAI,gBAAgB,SAAS;EAClC,SAAS,IAAI,UAAU,WAAW,CAAC;EACnC,YAAY,IAAI,UAAiC,eAAe,CAAC,CAAC;EAClE,MAAM,IAAI,UAAU,QAAQ,OAAO,WAAW,CAAC;CACjD,CAAC;AACH;;;ACMA,SAAgB,aAAa,OAAiC;CAC5D,OAAO,SAAS,OAAO,UAAU,YAAY,qBAAqB;AACpE;;;ACNA,SAAgB,UAAU,MAAe,QAAQ,MAAc;CAC7D,OAAO,OAAO,SAAS,WACnB,IAAI,OAAO,QAAQ,OAAO,OAAO,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC,IAC3D,SAAS,EAAE;AACjB;;;;;;;;;;;;;;;;;;;;ACAA,SAAgB,UAAU;CACxB,OAAO,UAAU,EAAE,KAAK;AAC1B;;;ACdA,SAAgB,SAAS,YAAoB,UAAkB,OAAe;CAC5E,MAAM,OAAO,CAAC,GAAG,UAAU;CAC3B,MAAM,KAAK,CAAC,GAAG,QAAQ;CAGvB,IAAI,GAAG,UAAU,KAAK,QAAQ;EAC5B,MAAM,UAAU,KAAK,MAAM,GAAG,SAAS,KAAK;EAC5C,MAAM,gBAAgB,KAAK,MAAM,IAAI,KAAK,SAAS,GAAG,GAAG,QAAQ,KAAK,CAAC;EACvE,IAAI,OAAO;EACX,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,QAAQ,KAC7B,IAAI,IAAI,SACN,QAAQ,GAAG;OACN,IAAI,KAAK,MAAM,KAAK,eACzB,QAAQ,KAAK,MAAM,GAAG;EAI1B,OAAO;CACT,OAEK;EACH,MAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,MAAM;EACpD,MAAM,gBAAgB,KAAK,MAAM,IAAI,KAAK,SAAS,GAAG,GAAG,QAAQ,KAAK,CAAC;EACvE,MAAM,OAAO,CAAC;EACd,KAAK,IAAI,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KACpC,IAAI,IAAI,SACN,KAAK,QAAQ,KAAK,EAAE;OACf,IAAI,GAAG,MAAM,IAAI,eACtB,KAAK,QAAQ,GAAG,MAAM,KAAK,EAAE;EAIjC,OAAO,KAAK,KAAK,EAAE;CACrB;AACF;AAyCA,SAAgB,SACd,MACA,IACA,OACA,mBAAmB,OACd;CACL,IAAI,UAAU,GAAG,OAAO;CACxB,IAAI,UAAU,GAAG,OAAO;CAExB,IAAI,QAAQ,QAAQ,MAAM,MAAM;EAC9B,IAAI,CAAC,kBACH,UAAU,EAAE,KACV,sBAAsB,KAAK,MAAM,GAAG,oCACtC;EAEF;CACF;CAEA,IAAI,OAAO,SAAS,YAAY,OAAO,OAAO,UAC5C,OAAO,IAAI,MAAM,IAAI,KAAK;CAG5B,IAAI,OAAO,SAAS,YAAY,OAAO,OAAO,UAC5C,OAAO,SAAS,MAAM,IAAI,KAAK;CAGjC,IAAI,OAAO,SAAS,aAAa,OAAO,OAAO,WAC7C,OAAO,QAAQ,KAAM,OAAO;CAG9B,IAAI,UAAU,MACZ,OAAO,KAAK,KAAK,IAAI,KAAK;CAG5B,IAAI,QAAQ,MAAM,OAAO,SAAS,YAAY,OAAO,OAAO,UAC1D,IAAI,MAAM,QAAQ,IAAI,KAAK,MAAM,QAAQ,EAAE;MACrC,KAAK,WAAW,GAAG,QACrB,OAAO,KAAK,KAAK,GAAG,MAAM,SAAS,GAAG,GAAG,IAAI,KAAK,CAAC;CAAA,OAEhD;EACL,IAAI,WAAW;EACf,IAAI,EAAE,gBAAgB,QAAQ,EAAE,cAAc,MAAM;GAClD,WAAW;GACX,OAAO,IAAI,IAAI,OAAO,QAAQ,IAAI,CAAC;GACnC,KAAK,IAAI,IAAI,OAAO,QAAQ,EAAE,CAAC;EACjC;EAEA,IAAI,gBAAgB,OAAO,cAAc,KAAK;GAC5C,MAAM,yBAAS,IAAI,IAAI;GACvB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG;IACzD,MAAM,QAAQ,SAAS,KAAK,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,OAAO,IAAI;IAC9D,IAAI,UAAU,KAAA,GAAW,OAAO,IAAI,KAAK,KAAK;GAChD;GACA,OAAO,WAAW,OAAO,YAAY,MAAM,IAAI;EACjD;CACF;CAIF,OAAO;AACT;AAEA,SAAgB,SAAY,MAAS,IAAO,OAAkB;CAC5D,OAAO,QAAQ,KAAM,OAAO;AAC9B;AAEA,SAAgB,IAAI,MAAc,IAAY,OAAe;CAC3D,OAAO,QAAQ,KAAK,QAAQ;AAC9B;AAEA,SAAgB,MACd,QACA,MACA,SACA,OACA,OACA;CACA,OAAO,WAAY,QAAQ,WAAW,QAAQ,YAAa,OAAO;AACpE;AAEA,SAAgB,MAAM,KAAa,KAAa,OAAe;CAC7D,OAAO,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAM;AACjD;AAEA,SAAgB,WACd,QACA,MACA,SACA,OACA,OACA;CACA,MAAM,gBAAgB,MAAM,QAAQ,MAAM,SAAS,OAAO,KAAK;CAC/D,IAAI,UAAU,OAAO,CAAC,SAAS,SAAS,CAAC,OAAO,OAAO;CAEvD,OAAO,MAAM,SAAS,OAAO,aAAa;AAC5C;AAEA,SAAgB,QACd,OACA,SACA,OACS;CACT,IAAI,OAAO;CACX,IAAI,QAAQ,GACV,QAAQ,IAAI;MAEZ,OAAO,CAAC;CAMV,MAAM,UAAU,IAHG,OACf,KAAK,KAAK,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,IACjC,KAAK,KAAK,KAAK,GACa,IAAI,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK;CAEjE,IAAI,SAAS,KAAK,IAAI,OAAO;CAC7B,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO;CACjC,IAAI,SACF,CAAC,QAAQ,UAAU,CAAC,QAAQ,MAAM;CAGpC,OAAO,IAAI,QAAQ,QAAQ,MAAM;AACnC;;;ACrMA,SAAS,QAAQ,WAAW,CAAC;AAkB7B,UAAiB,OACf,QACA,MACA,IACA,6BACA,mBACA,OACiB;CACjB,MAAM,kBACJ,OAAO,gCAAgC,WACnC,8BACA;CAEN,QACE,OAAO,gCAAgC,WAAW,QAAQ;CAE5D,MAAM,cAAgC,OAAe,SAAiB;EACpE,IAAI,OAAO,gCAAgC,YACzC,4BAA4B,OAAO,IAAI;OAClC,IAAI,OAAO,sBAAsB,YACtC,kBAAkB,OAAO,IAAI;CAEjC;CAEA,SAAS,UAAU;EACjB,MAAM;EACN,WAAW;EACX,SAAS;CACX;CAEA,IAAI,OAAO,QAAQ,GAAG;EACpB,UAAU,EAAE,sBAAM,IAAI,MAAM,qCAAqC,CAAC;EAClE;CACF;CACA,IAAI,OAAO,YAAY,GAAG;EACxB,UAAU,EAAE,sBACV,IAAI,MAAM,iDAAiD,CAC7D;EACA;CACF;CACA,IAAI,OAAO,UAAU,GAAG;EACtB,UAAU,EAAE,sBACV,IAAI,MAAM,+CAA+C,CAC3D;EACA;CACF;CAEA,MAAM,SAAS,UAAU;CAEzB,IAAI,WAAW;CACf,IAAI,WAAW,OAAO,mBAAmB;CAEzC,MAAM,UAAU,OAAe;EAC7B,IAAI,WAAW,MACb;EAEF,MAAM,gBAAgB,WAAW;EAIjC,MAAM,QAAQ,CAAC,OAAO,YAAY,gBAAgB,OAAO,UAAU;EAGnE,YAAa,QAAQ,OAAO,OAAQ;EAEpC,YAAY,WAAW;CACzB;CAMA,MAAM,WAAW,IAAI;CAErB,WAAW,MAAM,CAAC;CAElB,MAAM,YAAY,OAAO,KAAK;CAC9B,IAAI,iBAAiB;CAErB,IAAI,UAAU;CACd,OAAO,CAAC,SAAS;EACf,OAAO,iBAAiB,OAAO,OAAO;GACpC,MAAM,aAAa,OAAO,QAAQ;GAElC,IAAI,WAAW,YAAY;IACzB,OAAO,UAAU;IACjB,iBAAiB,OAAO;GAC1B,OAAO;IACL,OAAO,QAAQ;IACf,kBAAkB;GACpB;GAGA,IACE,KAAK,IAAI,KAAK,QAAQ,IAAI,mBAC1B,KAAK,IAAI,QAAQ,IAAI,iBACrB;IAEA,OAAO,KAAK,cAAc;IAC1B,UAAU;IAEV;GACF;EACF;EAGA,IAAI,CAAC,SAAS;GACZ,WAAW,UAAU,OAAO,QAAQ,SAAS;GAC7C;EACF;CACF;CAEA,WAAW,IAAI,OAAO,QAAQ,SAAS;CACvC,QAAQ,IAAI,OAAO,QAAQ,SAAS;AACtC;AASA,SAAgB,WACd,MACA,WACA,SACA,iBACQ;CACR,OAAO;EACL;EACA;EACA;EACA;CACF;AACF;AAEA,MAAa,aAAqB,WAAW,KAAM,KAAK,KAAK,EAAI;AACjE,MAAa,aAAqB,WAAW,IAAK,IAAM,KAAM,CAAG;AACjE,MAAa,eAAuB,WAAW,KAAM,MAAM,KAAM,CAAG;AACpE,MAAa,cAAsB,WAAW,KAAM,OAAO,MAAM,CAAG;AACpE,MAAa,aAAqB,WAAW,KAAM,IAAM,IAAK,CAAG;AACjE,MAAa,eAAuB,WAAW,KAAM,IAAM,IAAK,GAAG;AACnE,MAAa,eAAuB,WAAW,KAAM,OAAO,MAAM,CAAG;;;AC5JrE,SAAgB,IAAI,OAAe,OAAO,GAAG,KAAK,GAAG;CACnD,OAAO,MAAM,IAAI,GAAG,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;AAC/C;AAEA,SAAgB,WAAW,OAAe,OAAO,GAAG,KAAK,GAAW;CAClE,QAAQ,IAAI,KAAK,IAAK,QAAQ,KAAK,KAAM,CAAC;CAE1C,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,YAAY,OAAe,OAAO,GAAG,KAAK,GAAW;CACnE,QAAQ,KAAK,IAAK,QAAQ,KAAK,KAAM,CAAC;CAEtC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,cAAc,OAAe,OAAO,GAAG,KAAK,GAAW;CACrE,QAAQ,EAAE,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK;CAE3C,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAGA,SAAgB,WAAW,OAAe,OAAO,GAAG,KAAK,GAAW;CAClE,QAAQ,QAAQ;CAEhB,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,YAAY,OAAe,OAAO,GAAG,KAAK,GAAW;CACnE,QAAQ,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC;CAEjC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,cAAc,OAAe,OAAO,GAAG,KAAK,GAAG;CAC7D,QAAQ,QAAQ,KAAM,IAAI,QAAQ,QAAQ,IAAI,KAAK,IAAI,KAAK,QAAQ,GAAG,CAAC,IAAI;CAE5E,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAGA,SAAgB,YAAY,OAAe,OAAO,GAAG,KAAK,GAAW;CACnE,QAAQ,QAAQ,QAAQ;CAExB,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,aAAa,OAAe,OAAO,GAAG,KAAK,GAAW;CACpE,QAAQ,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC;CAEjC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,eAAe,OAAe,OAAO,GAAG,KAAK,GAAG;CAC9D,QACE,QAAQ,KACJ,IAAI,QAAQ,QAAQ,QACpB,IAAI,KAAK,IAAI,KAAK,QAAQ,GAAG,CAAC,IAAI;CAExC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAGA,SAAgB,YAAY,OAAe,OAAO,GAAG,KAAK,GAAW;CACnE,QAAQ,QAAQ,QAAQ,QAAQ;CAEhC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,aAAa,OAAe,OAAO,GAAG,KAAK,GAAW;CACpE,QAAQ,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC;CAEjC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,eAAe,OAAe,OAAO,GAAG,KAAK,GAAG;CAC9D,QACE,QAAQ,KACJ,IAAI,QAAQ,QAAQ,QAAQ,QAC5B,IAAI,KAAK,IAAI,KAAK,QAAQ,GAAG,CAAC,IAAI;CAExC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAGA,SAAgB,YAAY,OAAe,OAAO,GAAG,KAAK,GAAW;CACnE,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ;CAExC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,aAAa,OAAe,OAAO,GAAG,KAAK,GAAW;CACpE,QAAQ,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC;CAEjC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,eAAe,OAAe,OAAO,GAAG,KAAK,GAAG;CAC9D,QACE,QAAQ,KACJ,KAAK,QAAQ,QAAQ,QAAQ,QAAQ,QACrC,IAAI,KAAK,IAAI,KAAK,QAAQ,GAAG,CAAC,IAAI;CAExC,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAGA,SAAgB,WAAW,OAAe,OAAO,GAAG,KAAK,GAAG;CAC1D,QAAQ,UAAU,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,QAAQ,EAAE;CAErD,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,YAAY,OAAe,OAAO,GAAG,KAAK,GAAG;CAC3D,QAAQ,UAAU,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,MAAM,KAAK;CAErD,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,cAAc,OAAe,OAAO,GAAG,KAAK,GAAG;CAC7D,QACE,UAAU,IACN,IACA,UAAU,IACR,IACA,QAAQ,KACN,KAAK,IAAI,GAAG,KAAK,QAAQ,EAAE,IAAI,KAC9B,IAAI,KAAK,IAAI,GAAG,MAAM,QAAQ,EAAE,KAAK;CAEhD,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAGA,SAAgB,WAAW,OAAe,OAAO,GAAG,KAAK,GAAG;CAC1D,QAAQ,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;CAE5C,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,YAAY,OAAe,OAAO,GAAG,KAAK,GAAG;CAC3D,QAAQ,KAAK,KAAK,IAAI,KAAK,IAAI,QAAQ,GAAG,CAAC,CAAC;CAE5C,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAEA,SAAgB,cAAc,OAAe,OAAO,GAAG,KAAK,GAAG;CAC7D,QACE,QAAQ,MACH,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,KAAK,KAC7C,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK;CAEzD,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAGA,SAAgB,iBAAiB,IAAI,SAAyB;CAC5D,QAAQ,OAAe,OAAO,GAAG,KAAK,MAAM;EAC1C,SAAS,IAAI,KAAK,QAAQ,QAAQ,QAAQ,IAAI,QAAQ;EAEtD,OAAO,IAAI,MAAM,IAAI,KAAK;CAC5B;AACF;AAEA,SAAgB,kBAAkB,IAAI,SAAyB;CAC7D,QAAQ,OAAe,OAAO,GAAG,KAAK,MAAM;EAC1C,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,QAAQ,GAAG,CAAC,IAAI,IAAI,KAAK,IAAI,QAAQ,GAAG,CAAC;EAExE,OAAO,IAAI,MAAM,IAAI,KAAK;CAC5B;AACF;AAEA,SAAgB,oBAAoB,IAAI,SAAS,IAAI,OAAuB;CAC1E,QAAQ,OAAe,OAAO,GAAG,KAAK,MAAM;EAC1C,QACE,QAAQ,KACH,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAM,KAC9D,KAAK,IAAI,IAAI,QAAQ,GAAG,CAAC,MACtB,IAAI,IAAI,MAAM,QAAQ,IAAI,KAAK,IAAI,KACrC,KACF;EAEN,OAAO,IAAI,MAAM,IAAI,KAAK;CAC5B;AACF;AAGA,SAAgB,oBAAoB,IAAI,UAA0B;CAChE,QAAQ,OAAe,OAAO,GAAG,KAAK,MAAM;EAC1C,QACE,UAAU,IACN,IACA,UAAU,IACR,IACA,CAAC,KAAK,IAAI,GAAG,KAAK,QAAQ,EAAE,IAAI,KAAK,KAAK,QAAQ,KAAK,SAAS,CAAC;EAEzE,OAAO,IAAI,MAAM,IAAI,KAAK;CAC5B;AACF;AAEA,SAAgB,qBAAqB,IAAI,UAA0B;CACjE,QAAQ,OAAe,OAAO,GAAG,KAAK,MAAM;EAC1C,QACE,UAAU,IACN,IACA,UAAU,IACR,IACA,KAAK,IAAI,GAAG,MAAM,KAAK,IAAI,KAAK,KAAK,QAAQ,KAAK,OAAQ,CAAC,IAAI;EAEvE,OAAO,IAAI,MAAM,IAAI,KAAK;CAC5B;AACF;AAEA,SAAgB,uBAAuB,IAAI,SAAyB;CAClE,QAAQ,OAAe,OAAO,GAAG,KAAK,MAAM;EAC1C,QACE,UAAU,IACN,IACA,UAAU,IACR,IACA,QAAQ,KACN,EACE,KAAK,IAAI,GAAG,KAAK,QAAQ,EAAE,IAC3B,KAAK,KAAK,KAAK,QAAQ,UAAU,CAAC,KAChC,IACH,KAAK,IAAI,GAAG,MAAM,QAAQ,EAAE,IAC3B,KAAK,KAAK,KAAK,QAAQ,UAAU,CAAC,IAClC,IACF;EAEV,OAAO,IAAI,MAAM,IAAI,KAAK;CAC5B;AACF;AAGA,SAAgB,mBAAmB,IAAI,QAAQ,IAAI,MAAsB;CACvE,MAAM,gBAAgB,oBAAoB,GAAG,CAAC;CAE9C,QAAQ,OAAe,OAAO,GAAG,KAAK,MAAM;EAC1C,OAAO,IAAI,cAAc,IAAI,OAAO,MAAM,EAAE;CAC9C;AACF;AAEA,SAAgB,oBAAoB,IAAI,QAAQ,IAAI,MAAsB;CACxE,QAAQ,OAAe,OAAO,GAAG,KAAK,MAAM;EAC1C,IAAI,QAAQ,IAAI,GACd,QAAQ,IAAI,QAAQ;OACf,IAAI,QAAQ,IAAI,GACrB,QAAQ,KAAK,SAAS,QAAQ,KAAK,QAAQ;OACtC,IAAI,QAAQ,MAAM,GACvB,QAAQ,KAAK,SAAS,OAAO,KAAK,QAAQ;OAE1C,QAAQ,KAAK,SAAS,QAAQ,KAAK,QAAQ;EAG7C,OAAO,IAAI,MAAM,IAAI,KAAK;CAC5B;AACF;AAEA,SAAgB,sBAAsB,IAAI,QAAQ,IAAI,MAAsB;CAC1E,MAAM,gBAAgB,oBAAoB,GAAG,CAAC;CAE9C,QAAQ,OAAe,OAAO,GAAG,KAAK,MAAM;EAC1C,OAAO,QAAQ,MACV,IAAI,cAAc,IAAI,IAAI,OAAO,MAAM,EAAE,KAAK,KAC9C,IAAI,cAAc,IAAI,QAAQ,GAAG,MAAM,EAAE,KAAK;CACrD;AACF;AAGA,SAAgB,OAAO,OAAe,OAAO,GAAG,KAAK,GAAG;CACtD,OAAO,IAAI,MAAM,IAAI,KAAK;AAC5B;AAGA,SAAgB,IAAI,OAAe,OAAO,GAAG,KAAK,GAAG;CACnD,OAAO,MAAM,IAAI,GAAG,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;AAC/C;AAGA,MAAa,aAA6B,iBAAiB;AAC3D,MAAa,cAA8B,kBAAkB;AAC7D,MAAa,gBAAgC,oBAAoB;AAEjE,MAAa,eAA+B,mBAAmB;AAC/D,MAAa,gBAAgC,oBAAoB;AACjE,MAAa,kBAAkC,sBAAsB;AAErE,MAAa,gBAAgC,oBAAoB;AACjE,MAAa,iBAAiC,qBAAqB;AACnE,MAAa,mBAAmC,uBAAuB;;;ACzSvE,SAAS,OAAO,WAAW,CAAC;AAC5B,UAAiB,MACf,SACA,YACA,OACiB;CACjB,MAAM,SAAS,UAAU;CAEzB,MAAM,YAAY,OAAO,KAAK;CAC9B,MAAM,UAAU,OAAO,KAAK,IAAI;CAEhC,WAAW,GAAG,CAAC;CACf,OAAO,UAAU,OAAO,OAAO;EAC7B,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,QAAQ,OAAO;EACrB,IAAI,OAAO,GACT,WAAW,OAAO,IAAI;EAExB;CACF;CACA,OAAO,KAAK,OAAO;CAEnB,WAAW,GAAG,OAAO;CACrB,QAAQ,GAAG,OAAO;AACpB;;;ACjBA,IAAa,oBAAb,MAAa,kBAEX;CAkD6B;CAjD7B,OAAiB,gCAAgB,IAAI,IAA4B;CACjE,OAAiB,kBAA4C,CAAC;CAC9D,OAAiB,WAAiC,CAAC;CAOnD,OAAc,eACZ,SACA,eAAyB,MACA;EACzB,MAAM,SAAkC;GACtC;GACA,OAAO;GACP,wBAAO,IAAI,MAAM,GAAE;EACrB;EAEA,MAAM,UAAU,KAAK,gBAAgB,GAAG,EAAE;EAC1C,IAAI,SACF,OAAO,QAAQ,QAAQ;EAEzB,QAAQ,MAAK,UAAS;GACpB,OAAO,QAAQ;GACf,SAAS,UAAU;EACrB,CAAC;EAED,KAAK,SAAS,KAAK,MAAM;EACzB,OAAO;CACT;CAEA,OAAc,cAAc;EAC1B,OAAO,KAAK,SAAS,SAAS;CAChC;CAEA,aAAoB,kBAAkB;EACpC,MAAM,WAAW,CAAC,GAAG,KAAK,QAAQ;EAClC,MAAM,QAAQ,IAAI,SAAS,KAAI,WAAU,OAAO,OAAO,CAAC;EACxD,KAAK,WAAW,KAAK,SAAS,QAAO,MAAK,CAAC,SAAS,SAAS,CAAC,CAAC;EAC/D,OAAO;CACT;CAEA;CAEA,+BAAyB,IAAI,IAAwB;CACrD,QAAkB,IAAI,eAAe;CACrC,kBAA4B,KAAK,MAAM,MAAM;CAE7C,YAAmB,OAAyB;EAAf,KAAA,QAAA;EAC3B,KAAK,YAAY,KAAK,OAAO,KAAK,IAAI;EAEtC,OAAO,eAAe,KAAK,WAAW,WAAW,EAC/C,OAAO,KACT,CAAC;EAED,OAAO,eAAe,KAAK,WAAW,aAAa,EACjD,OAAO,KAAK,UAAU,KAAK,IAAI,EACjC,CAAC;CACH;CAEA,SAAmB,CAEnB;CAEA,kBAA4B;EAC1B,IAAI,kBAAkB,cAAc,IAAI,IAAI,GAC1C,MAAM,IAAI,cACR,mDACA;gEAEF;EAGF,kBAAkB,cAAc,IAAI,IAAI;EACxC,kBAAkB,gBAAgB,KAAK,IAAI;CAC7C;CAEA,mBAA6B;EAC3B,kBAAkB,cAAc,OAAO,IAAI;EAC3C,IAAI,kBAAkB,gBAAgB,IAAI,MAAM,MAC9C,MAAM,IAAI,MAAM,kDAAkD;CAEtE;CAEA,oBAA8B;EAC5B,KAAK,aAAa,SAAQ,QAAO,IAAI,YAAY,KAAK,SAAS,CAAC;EAChE,KAAK,aAAa,MAAM;CAC1B;CAEA,UAAoB;EAClB,MAAM,SAAS,kBAAkB,gBAAgB,GAAG,EAAE;EACtD,IAAI,QAAQ;GACV,OAAO,aAAa,IAAI,KAAK,MAAM,YAAY;GAC/C,KAAK,MAAM,UAAU,OAAO,SAAS;EACvC;CACF;CAEA,UAAiB;EACf,KAAK,kBAAkB;EACvB,KAAK,MAAM,MAAM;EACjB,KAAK,QAAQ;CACf;CAEA,MAAa,YAA2B;EACtC,GAAG;GACD,MAAM,kBAAkB,gBAAgB;GACxC,KAAK,UAAU;EACjB,SAAS,kBAAkB,YAAY;EACvC,OAAO,KAAK;CACd;AACF;;;AC7HA,MAAa,UAAU,OAAO,IAAI,sCAAsC;;;ACExE,SAAgB,WAAc,OAAyC;CACrE,OAAO,OAAO,UAAU;AAC1B;AAEA,SAAgB,OACd,OACA,cACkB;CAClB,OAAO,WAAW,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI,aAAa,KAAK;AAC7E;AAEA,SAAgB,OAAU,OAA0B;CAClD,OAAO,WAAW,KAAK,IAAI,MAAM,IAAI;AACvC;;;ACwCA,IAAa,gBAAb,cAIU,kBAA0B;CAOxB;CACS;CAEP;CATZ;CACA;CACA;CACA,WAAqB;CAErB,YACE,SACA,eACA,QAAkC,KAAA,GAClC,UAAoD,UAAiB,OACrE,aAA8D,CAAC,GAC/D;EACA,MAAM,KAAK;EANH,KAAA,UAAA;EACS,KAAA,gBAAA;EAEP,KAAA,SAAA;EAKV,OAAO,eAAe,KAAK,WAAW,SAAS,EAC7C,OAAO,KAAK,MAAM,KAAK,IAAI,EAC7B,CAAC;EACD,OAAO,eAAe,KAAK,WAAW,QAAQ,EAC5C,OAAO,KAAK,KAAK,KAAK,IAAI,EAC5B,CAAC;EACD,OAAO,eAAe,KAAK,WAAW,aAAa,EACjD,OAAO,KAAK,UAAU,KAAK,IAAI,EACjC,CAAC;EAED,IAAI,KAAK,YAAY,KAAA,GAAW;GAC9B,KAAK,UAAU,KAAK;GACpB,KAAK,UAAU;GAEf,IAAI,CAAC,WAAW,KAAK,OAAO,GAC1B,KAAK,OAAO,KAAK,MAAM,KAAK,OAAO;EAEvC;EAEA,KAAK,aAAa;GAChB,QAAQ,KAAK,OAAO,KAAK,IAAI;GAC7B,QAAQ,KAAK,OAAO,KAAK,IAAI;GAC7B,SAAS,KAAK,QAAQ,KAAK,IAAI;GAC/B,GAAG;EACL;CACF;CAEA,WAAwD;EACtD,OAAO,KAAK;CACd;CAEA,MAAa,OAA6B;EACxC,OAAO,KAAK,OAAO,KAAK;CAC1B;CAEA,IAAW,OAA2D;EACpE,KAAK,WAAW,OAAO,KAAK;EAC5B,OAAO,KAAK;CACd;CAEA,OAAc,OAA2D;EACvE,IAAI,UAAU,SACZ,QAAQ,KAAK;EAGf,IAAI,KAAK,YAAY,OACnB,OAAO,KAAK;EAGd,KAAK,UAAU;EACf,KAAK,kBAAkB;EAEvB,IAAI,CAAC,WAAW,KAAK,GACnB,KAAK,OAAO,KAAK,MAAM,KAAK;EAG9B,KAAK,UAAU;EACf,OAAO,KAAK;CACd;CAEA,MAAqB;EACnB,OAAO,KAAK,WAAW,OAAO;CAChC;CAEA,SAAwB;EACtB,IAAI,KAAK,MAAM,SAAS,KAAK,WAAW,KAAK,OAAO,GAAG;GACrD,KAAK,kBAAkB;GACvB,KAAK,gBAAgB;GACrB,IAAI;IACF,KAAK,OAAO,KAAK,MAAM,KAAK,QAAQ,CAAC;GACvC,SAAS,GAAQ;IACf,UAAU,EAAE,MAAM;KAChB,GAAG,WAAW,CAAC;KACf,SAAe,KAAK,OAAQ;IAC9B,CAAC;GACH;GACA,KAAK,iBAAiB;EACxB;EACA,KAAK,MAAM,MAAM;EACjB,KAAK,QAAQ;EAEb,OAAO,KAAK;CACd;CAEA,OACE,OACA,UACA,iBAAiC,gBACjC,wBAAuD,KAAK,eAC5D;EACA,IAAI,UAAU,KAAA,GACZ,OAAO,KAAK,IAAI;EAGlB,IAAI,aAAa,KAAA,GACf,OAAO,KAAK,IAAI,KAAK;EAIvB,OADc,KAAK,YAAY,gBAAgB,qBACpC,EAAE,GAAG,OAAO,QAAQ;CACjC;CAEA,YACE,uBACA,8BACA;EACA,MAAM,UAAU,KAAK,IAAI;EACzB,MAAM,QAA2B,CAAC;EAElC,MAAM,OAAO,IAAI,mBAAmB,UAAU,UAAU;GACtD,OAAO,MAAM,SAAS,GACpB,OAAO,MAAM,MAAM;EAEvB,CAAC;EAED,KAAK,MACH,OACA,UACA,iBAAiB,uBACjB,wBAAwB,iCACrB;GACH,wBAAwB;GACxB,+BAA+B;GAC/B,MAAM,KACJ,KAAK,MAAM,OAAO,UAAU,gBAAgB,qBAAqB,CACnE;GACA,OAAO;EACT;EAEA,KAAK,QACH,MACA,iBAAiB,uBACjB,wBAAwB,iCACrB;GACH,wBAAwB;GACxB,+BAA+B;GAC/B,MAAM,KACJ,KAAK,MACH,SACA,MACA,uBACA,4BACF,CACF;GACA,OAAO;EACT;EAEA,KAAK,QAAQ,aAAqB;GAChC,MAAM,KAAK,QAAQ,QAAQ,CAAC;GAC5B,OAAO;EACT;EAEA,KAAK,OAAO,cAA+B;GACzC,MAAM,KAAK,SAAS;GACpB,OAAO;EACT;EAEA,KAAK,MAAM,aAAyB;GAClC,MAAM,KACJ,IAAI,aAAa;IACf,SAAS;GACX,CAAC,CACH;GACA,OAAO;EACT;EAEA,OAAO;CACT;CAEA,CAAW,MACT,OACA,UACA,gBACA,uBACiB;EACjB,IAAI,UAAU,SACZ,QAAQ,KAAK;EAGf,KAAK,WAAW;EAChB,OAAO,KAAK,WAAW,QACrB,OACA,UACA,gBACA,qBACF;EACA,KAAK,IAAI,KAAK;EACd,KAAK,WAAW;CAClB;CAEA,CAAQ,QACN,OACA,UACA,gBACA,uBACiB;EACjB,MAAM,OAAO,KAAK,IAAI;EACtB,OAAO,MAAM,WAAU,MAAK;GAC1B,KAAK,IACH,sBACE,MACA,KAAK,MAAM,OAAO,KAAK,CAAC,GACxB,eAAe,CAAC,CAClB,CACF;EACF,CAAC;CACH;CAEA,UAA0B;EACxB,MAAM,QAAQ;EACd,KAAK,UAAU,KAAA;EACf,KAAK,UAAU,KAAA;EACf,KAAK,OAAO,KAAA;CACd;;;;;;;;;;;;;CAcA,QAAe;EACb,IAAI,KAAK,YAAY,KAAA,GACnB,KAAK,IAAI,KAAK,OAAO;EAEvB,OAAO,KAAK;CACd;;;;;;;;;;;;;;;CAgBA,OAAc;EACZ,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;CAC5B;;;;;;;;;;;;;;;;;CAkBA,YAAmB;EACjB,KAAK,QAAQ;EACb,OAAO,KAAK,YAAY,KAAK;CAC/B;;;;CAKA,aAAoB;EAClB,OAAO,KAAK;CACd;;;;;;;;;;;;;;;;;;;;;;;;CAyBA,MAAa;EACX,OAAO,KAAK;CACd;;;;CAKA,aAAoB;EAClB,OAAO,KAAK;CACd;AACF;;;AC9WA,IAAa,wBAAb,cAKU,cAA4C;CAIjC;CAHnB,UAAsE,CAAC;CAEvE,YACE,SAIA,QACA,SACA,eACA,QAAkC,KAAA,GAClC,aAA8D,CAAC,GAC/D;EACA,MAAM,KAAA,GAAW,eAAe,OAAO,QAAQ,UAAU;EAVxC,KAAA,UAAA;EAWjB,KAAK,SAAS;EAEd,KAAK,MAAM,SAAS,SAAS;GAC3B,IAAI;GACJ,IAAI;GACJ,IAAI,MAAM,QAAQ,KAAK,GAAG;IACxB,CAAC,KAAK,UAAU;IAChB,OAAQ,QAAgB,UAAU;GACpC,OAAO;IACL,MAAM;IACN,SAAS,IAAI,cACX,OAAO,UAAS,UAAS,OAAO,KAAK,EAAE,MAAM,GACxC,KACL,SAAS,KAAK,SAChB,EAAE,SAAS;GACb;GACA,KAAK,QAAQ,KAAK,CAAC,KAAK,MAAM,CAAC;GAC/B,OAAO,eAAe,KAAK,WAAW,KAAK,EAAC,OAAO,OAAM,CAAC;EAC5D;CACF;CAEA,WAKE;EACA,OAAO,KAAK;CACd;CAEA,MAAsB,OAA6B;EACjD,OAAO,KAAK,OAAO,KAAK;CAC1B;CAEA,SAAiC;EAC/B,OAAO,KAAK,MAER,OAAO,YACL,KAAK,QAAQ,KAAK,CAAC,KAAK,cAAc,CAAC,KAAK,SAAS,CAAC,CAAC,CACzD,CAEJ;CACF;CAEA,OAAuB,OAAoC;EACzD,IAAI,WAAW,KAAK,GAClB,KAAK,MAAM,CAAC,KAAK,aAAa,KAAK,SACjC,eAAe,KAAK,OAAO,MAAM,CAAC,EAAE,IAAI;OAErC;GACL,MAAM,SAAS,KAAK,MAAM,KAAK;GAC/B,KAAK,MAAM,CAAC,KAAK,aAAa,KAAK,SACjC,SAAS,OAAO,IAAI;EAExB;EAEA,OAAO,KAAK;CACd;CAEA,QAAgC;EAC9B,KAAK,MAAM,GAAG,WAAW,KAAK,SAC5B,OAAO,MAAM;EAEf,OAAO,KAAK;CACd;CAEA,OAA+B;EAC7B,KAAK,MAAM,GAAG,WAAW,KAAK,SAC5B,OAAO,KAAK;EAEd,OAAO,KAAK;CACd;CAEA,YAAqC;EACnC,KAAK,MAAM,GAAG,WAAW,KAAK,SAC5B,IAAI,CAAC,OAAO,UAAU,GACpB,OAAO;EAGX,OAAO;CACT;CAEA,MAAsB;EACpB,OAAO,OAAO,YACZ,KAAK,QAAQ,KAAK,CAAC,KAAK,cAAc,CAAC,KAAK,SAAS,QAAQ,IAAI,CAAC,CAAC,CACrE;CACF;AACF;;;ACxHA,IAAa,kBAAb,cAA6C,kBAAuB;CAI/C;CAHnB;CAEA,YACE,SACA,OACA;EACA,MAAM,KAAK;EAHM,KAAA,UAAA;EAIjB,KAAK,UAAU;CACjB;CAEA,WAAoC;EAClC,OAAO,KAAK;CACd;CAEA,UAA0B;EACxB,MAAM,QAAQ;EACd,KAAK,OAAO,KAAA;CACd;CAEA,OAA0B,GAAG,MAAqB;EAChD,IAAI,KAAK,MAAM,SAAS,GAAG;GACzB,KAAK,kBAAkB;GACvB,KAAK,gBAAgB;GACrB,IAAI;IACF,KAAK,OAAO,KAAK,QAAQ,GAAG,IAAI;GAClC,SAAS,GAAQ;IACf,UAAU,EAAE,MAAM;KAChB,GAAG,WAAW,CAAC;KACf,SAAS,KAAK,OAAO;IACvB,CAAC;GACH;GACA,KAAK,iBAAiB;EACxB;EACA,KAAK,MAAM,MAAM;EACjB,KAAK,QAAQ;EAEb,OAAO,KAAK;CACd;AACF;;;AC7CA,SAAgB,eACd,SACA,OACkB;CAClB,OAAO,IAAI,gBAAwB,SAAS,KAAK,EAAE,SAAS;AAC9D;;;ACQA,SAAgB,oBACd,SACA,UAAoB,MACA;CACpB,IAAI;CACJ,MAAM,SAAS,aAAa,OAAO;CACnC,OAAO,qBAAqB;EAC1B,MAAM,UAAU,OAAO;EACvB,IAAI,CAAC,UAAU,OAAO,YAAY,SAChC,SAAS,gBAAgB,eACvB,SACA,QAAQ,SAAS,OACnB;EAGF,OAAO,OAAO;CAChB,CAAC;AACH;;;AC7BA,IAAa,wBAAb,cAA2C,kBAAkB;CAEvB;CADpC;CACA,YAAmB,UAAuC;EACxD,MAAM;EAD4B,KAAA,WAAA;EAElC,KAAK,cAAc,UAAU,EAAE,WAAW,UAAU,KAAK,MAAM;EAC/D,KAAK,UAAU;CACjB;CAEA,eAAuB;EACrB,IAAI,KAAK,MAAM,SAAS,GAAG;GACzB,KAAK,kBAAkB;GACvB,KAAK,gBAAgB;GACrB,KAAK,SAAS;GACd,KAAK,iBAAiB;GACtB,KAAK,MAAM,MAAM;EACnB;CACF;CAEA,UAAiB;EACf,MAAM,QAAQ;EACd,KAAK,YAAY;CACnB;AACF;;;;;;;;;ACjBA,SAAgB,qBAAqB,UAAkC;CACrE,MAAM,UAAU,IAAI,sBAAsB,QAAQ;CAClD,aAAa,QAAQ,QAAQ;AAC/B;;;ACTA,IAAa,gBAAb,cAAmC,kBAAkB;CACf;CAApC,YAAmB,UAAuC;EACxD,MAAM;EAD4B,KAAA,WAAA;EAElC,KAAK,MAAM,UAAU,KAAK,MAAM;EAChC,KAAK,UAAU;CACjB;CAEA,eAAuB;EACrB,KAAK,kBAAkB;EACvB,KAAK,gBAAgB;EACrB,KAAK,SAAS;EACd,KAAK,iBAAiB;EACtB,KAAK,MAAM,MAAM;CACnB;AACF;;;;;;;;ACTA,SAAgB,aAAa,UAAkC;CAC7D,MAAM,UAAU,IAAI,cAAc,QAAQ;CAC1C,aAAa,QAAQ,QAAQ;AAC/B;;;ACPA,SAAgB,aACd,SACA,gBAA+C,UAC/C,OAC8B;CAC9B,OAAO,IAAI,cACT,SACA,eACA,KACF,EAAE,SAAS;AACb;;;AC8BA,IAAa,uBAAb,cACU,sBAEV;CACE,YACE,SACA,QACA,SACA,eACA,QAAkC,KAAA,GAClC,aAAkE,CAAC,GACnE;EACA,MAAM,SAAS,QAAQ,SAAS,eAAe,OAAO,UAAU;EAEhE,OAAO,eAAe,KAAK,WAAW,QAAQ,EAC5C,OAAO,KAAK,KAAK,KAAK,IAAI,EAC5B,CAAC;EAED,OAAO,eAAe,KAAK,WAAW,OAAO,EAC3C,OAAO,KAAK,IAAI,KAAK,IAAI,EAC3B,CAAC;EAED,OAAO,eAAe,KAAK,WAAW,OAAO,EAC3C,OAAO,KAAK,IAAI,KAAK,IAAI,EAC3B,CAAC;EAED,OAAO,eAAe,KAAK,WAAW,OAAO,EAC3C,OAAO,KAAK,IAAI,KAAK,IAAI,EAC3B,CAAC;EAED,OAAO,eAAe,KAAK,WAAW,OAAO,EAC3C,OAAO,KAAK,IAAI,KAAK,IAAI,EAC3B,CAAC;EAED,OAAO,eAAe,KAAK,WAAW,OAAO,EAC3C,OAAO,KAAK,IAAI,KAAK,IAAI,EAC3B,CAAC;EAED,OAAO,eAAe,KAAK,WAAW,SAAS,EAC7C,OAAO,KAAK,MAAM,KAAK,IAAI,EAC7B,CAAC;EAED,OAAO,eAAe,KAAK,WAAW,OAAO,EAC3C,OAAO,KAAK,IAAI,KAAK,IAAI,EAC3B,CAAC;CACH;CAEA,WAAkD;EAChD,OAAO,KAAK;CACd;CAWA,KACE,UACA,UACA,gBACA,uBACoD;EACpD,MAAM,WAAW,SAAS,KAAK,IAAI,CAAC;EACpC,OAAO,KAAK,OACV,UACA,UACA,gBACA,qBACF;CACF;CASA,IACE,OACA,UACA,gBACA,uBACoD;EACpD,MAAM,YAAY,YAAqB,QAAQ,IAAI,KAAK;EACxD,IAAI,aAAa,KAAA,GAAW,OAAO,KAAK,KAAK,QAAQ;EACrD,OAAO,KAAK,KAAK,UAAU,UAAU,gBAAgB,qBAAqB;CAC5E;CASA,IACE,OACA,UACA,gBACA,uBACoD;EACpD,MAAM,YAAY,YAAqB,QAAQ,IAAI,KAAK;EACxD,IAAI,aAAa,KAAA,GAAW,OAAO,KAAK,KAAK,QAAQ;EACrD,OAAO,KAAK,KAAK,UAAU,UAAU,gBAAgB,qBAAqB;CAC5E;CASA,IACE,OACA,UACA,gBACA,uBACoD;EACpD,MAAM,YAAY,YAAqB,QAAQ,IAAI,KAAK;EACxD,IAAI,aAAa,KAAA,GAAW,OAAO,KAAK,KAAK,QAAQ;EACrD,OAAO,KAAK,KAAK,UAAU,UAAU,gBAAgB,qBAAqB;CAC5E;CASA,IACE,OACA,UACA,gBACA,uBACoD;EACpD,MAAM,YAAY,YAAqB,QAAQ,IAAI,KAAK;EACxD,IAAI,aAAa,KAAA,GAAW,OAAO,KAAK,KAAK,QAAQ;EACrD,OAAO,KAAK,KAAK,UAAU,UAAU,gBAAgB,qBAAqB;CAC5E;CASA,IACE,OACA,UACA,gBACA,uBACoD;EACpD,MAAM,YAAY,YAAqB,QAAQ,IAAI,KAAK;EACxD,IAAI,aAAa,KAAA,GAAW,OAAO,KAAK,KAAK,QAAQ;EACrD,OAAO,KAAK,KAAK,UAAU,UAAU,gBAAgB,qBAAqB;CAC5E;CASA,MACE,OACA,UACA,gBACA,uBACoD;EACpD,MAAM,YAAY,YAAqB,QAAQ,MAAM,KAAK;EAC1D,IAAI,aAAa,KAAA,GAAW,OAAO,KAAK,KAAK,QAAQ;EACrD,OAAO,KAAK,KAAK,UAAU,UAAU,gBAAgB,qBAAqB;CAC5E;CASA,IACE,OACA,UACA,gBACA,uBACoD;EACpD,MAAM,YAAY,YAAqB,QAAQ,IAAI,KAAK;EACxD,IAAI,aAAa,KAAA,GAAW,OAAO,KAAK,KAAK,QAAQ;EACrD,OAAO,KAAK,KAAK,UAAU,UAAU,gBAAgB,qBAAqB;CAC5E;AACF;;;ACzNA,IAAa,UAAb,MAAa,QAA0C;CACrD,OAAuB,SAAS,OAAO,IACrC,oCACF;CAEA,MAAa;CACb,QAAe;CACf,SAAgB;CAChB,OAAc;CAEd,OAAc,aACZ,SACA,gBAAgD,QAAQ,MACnC;EACrB,OAAO,IAAI,sBACT;GAAC;GAAO;GAAS;GAAU;EAAM,IAChC,UAA2B,IAAI,QAAQ,KAAK,GAC7C,SACA,aACF,EAAE,SAAS;CACb;CAEA,OAAc,KAAK,MAAe,IAAa,OAAwB;EACrE,OAAO,IAAI,QACT,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAC3B,IAAI,KAAK,OAAO,GAAG,OAAO,KAAK,GAC/B,IAAI,KAAK,QAAQ,GAAG,QAAQ,KAAK,GACjC,IAAI,KAAK,MAAM,GAAG,MAAM,KAAK,CAC/B;CACF;CAEA,IAAW,IAAY;EACrB,OAAO,KAAK,OAAO,KAAK;CAC1B;CAEA,IAAW,IAAY;EACrB,OAAO,KAAK,MAAM,KAAK;CACzB;CAQA,YACE,MAAuB,GACvB,KACA,OACA,MACA;EACA,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAC/B;EAGF,IAAI,MAAM,QAAQ,GAAG,GAAG;GACtB,OAAO,IAAI;GACX,QAAQ,IAAI;GACZ,MAAM,IAAI;GACV,MAAM,IAAI;EACZ;EAEA,IAAI,OAAO,QAAQ,UAAU;GAC3B,KAAK,MAAM;GACX,KAAK,QAAQ,QAAQ,KAAA,IAAY,MAAM;GACvC,KAAK,SAAS,UAAU,KAAA,IAAY,QAAQ;GAC5C,KAAK,OAAO,SAAS,KAAA,IAAY,OAAO,QAAQ,KAAA,IAAY,MAAM;GAClE;EACF;EAEA,KAAK,MAAM,IAAI;EACf,KAAK,QAAQ,IAAI;EACjB,KAAK,SAAS,IAAI;EAClB,KAAK,OAAO,IAAI;CAClB;CAEA,KAAY,IAAa,OAAe;EACtC,OAAO,QAAQ,KAAK,MAAM,IAAI,KAAK;CACrC;CAEA,MAAa,OAAwB;EACnC,OAAO,IAAI,QACT,KAAK,MAAM,OACX,KAAK,QAAQ,OACb,KAAK,SAAS,OACd,KAAK,OAAO,KACd;CACF;CAEA,UAAiB,OAAwB;EACvC,OAAO,IAAI,QACT,KAAK,MAAM,OACX,KAAK,QAAQ,OACb,KAAK,SAAS,OACd,KAAK,OAAO,KACd;CACF;CAEA,WAA0B;EACxB,OAAO,QAAQ;CACjB;CAEA,WAAkB;EAChB,OAAO,WAAW,KAAK,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,OAAO,IAAI,KAAK,KAAK;CAC1E;CAEA,UACE,IACA,UACM;EACN,GAAG,UAAU,UAAU,KAAK,KAAK,KAAK,OAAO,KAAK,QAAQ,KAAK,IAAI;CACrE;CAEA,YAAsC;EACpC,OAAO;GACL,KAAK,KAAK;GACV,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,MAAM,KAAK;EACb;CACF;AACF;;;ACnJA,MAAa,UAAU;AAUvB,SAAgB,OAAO,OAA2B;CAChD,OAAO,SAAS,OAAO,UAAU,YAAY,cAAc;AAC7D;;;;;;;;;;;;;;;;;;;;;;;;ACoBA,IAAa,WAAb,MAAa,SAA2C;CACtD,OAAuB,SAAS,OAAO,IACrC,qCACF;CAEA,SAAuC,IAAI,aAAa,CAAC;CACzD,OAAuB,WAAqB,IAAI,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CACzE,OAAuB,OAAiB,IAAI,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAErE,OAAc,aAAa,OAAyB;EAClD,OAAO,SAAS,SAAS,OAAO,KAAK;CACvC;CAEA,OAAc,gBAAgB,aAAwC;EACpE,OAAO,SAAS,SAAS,UAAU,IAAI,QAAQ,WAAW,CAAC;CAC7D;CAEA,OAAc,YAAY,OAAkC;EAC1D,OAAO,SAAS,SAAS,MAAM,IAAI,QAAQ,KAAK,CAAC;CACnD;CAEA,IAAW,IAAa;EACtB,OAAO,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,OAAO,EAAE;CACnD;CAEA,IAAW,IAAa;EACtB,OAAO,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,OAAO,EAAE;CACnD;CAEA,IAAW,SAAiB;EAC1B,OAAO,KAAK,OAAO;CACrB;CAEA,IAAW,OAAO,OAAe;EAC/B,KAAK,OAAO,KAAK,KAAK,EAAE,WAAW,MAAM,KAAK,EAAE;CAClD;CAEA,IAAW,QAAgB;EACzB,OAAO,KAAK,OAAO;CACrB;CAEA,IAAW,MAAM,OAAe;EAC9B,KAAK,OAAO,KAAK;CACnB;CAEA,IAAW,SAAiB;EAC1B,OAAO,KAAK,OAAO;CACrB;CAEA,IAAW,OAAO,OAAe;EAC/B,KAAK,OAAO,KAAK,KAAK,EAAE,WAAW,MAAM,KAAK,EAAE;CAClD;CAEA,IAAW,QAAgB;EACzB,OAAO,KAAK,OAAO;CACrB;CAEA,IAAW,MAAM,OAAe;EAC9B,KAAK,OAAO,KAAK;CACnB;CAEA,IAAW,aAAqB;EAC9B,OAAO,KAAK,OAAO;CACrB;CAEA,IAAW,WAAW,OAAe;EACnC,KAAK,OAAO,KAAK;CACnB;CAEA,IAAW,aAAqB;EAC9B,OAAO,KAAK,OAAO;CACrB;CAEA,IAAW,WAAW,OAAe;EACnC,KAAK,OAAO,KAAK;CACnB;CAEA,IAAW,WAAmB;EAC5B,OAAO,QAAQ,QAAQ,KAAK,OAAO,IAAI,KAAK,OAAO,EAAE;CACvD;CAEA,IAAW,SAAS,OAAe;EACjC,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK,QAAQ;EAEhD,KAAK,OAAO,KAAK,OAAO,OAAO;EAC/B,KAAK,OAAO,KAAK,OAAO,OAAO;EAC/B,KAAK,OAAO,KAAK,OAAO,OAAO;EAC/B,KAAK,OAAO,KAAK,OAAO,OAAO;CACjC;CAEA,IAAW,cAAuB;EAChC,OAAO,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,OAAO,EAAE;CACnD;CAEA,IAAW,YAAY,aAA8B;EACnD,MAAM,MAAM,IAAI,QAAQ,WAAW;EACnC,KAAK,OAAO,KAAK,IAAI;EACrB,KAAK,OAAO,KAAK,IAAI;CACvB;CAEA,IAAW,UAAmB;EAC5B,OAAO,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,OAAO,EAAE;CACnD;CAEA,IAAW,QAAQ,OAAwB;EACzC,MAAM,QAAQ,IAAI,QAAQ,KAAK;EAE/B,MAAM,IAAI,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,OAAO,EAAE,EAAE;EACtD,MAAM,IAAI,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,OAAO,EAAE,EAAE;EAEtD,KAAK,OAAO,KAAK,EAAE,IAAI,MAAM;EAC7B,KAAK,OAAO,KAAK,EAAE,IAAI,MAAM;EAC7B,KAAK,OAAO,KAAK,EAAE,IAAI,MAAM;EAC7B,KAAK,OAAO,KAAK,EAAE,IAAI,MAAM;CAC/B;;;;;;;;;;;;;;;;;;;;;;;;CAyBA,IAAW,UAA2B;EACpC,MAAM,KAAK,KAAK,OAAO,IACrB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO;EACnB,MAAM,MAAM,KAAK,OAAO,IACtB,MAAM,KAAK,OAAO;EAEpB,IAAI,MAAM,KAAK,KAAK,KAAK;EAEzB,IAAI,CAAC,KACH,OAAO;EAGT,MAAM,IAAM;EAEZ,OAAO,IAAI,SACT,KAAK,KACL,CAAC,KAAK,KACN,CAAC,KAAK,KACN,KAAK,MACJ,KAAK,MAAM,KAAK,OAAO,MACvB,KAAK,MAAM,KAAK,OAAO,GAC1B;CACF;;;;CAKA,IAAW,cAAsB;EAC/B,OAAO,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,OAAO;CACxE;CAEA,IAAW,YAAuB;EAChC,OAAO,IAAI,UAAU;GACnB,KAAK,OAAO;GACZ,KAAK,OAAO;GACZ,KAAK,OAAO;GACZ,KAAK,OAAO;GACZ,KAAK,OAAO;GACZ,KAAK,OAAO;EACd,CAAC;CACH;CAiBA,YACE,GACA,GACA,GACA,GACA,IACA,IACA;EACA,IAAI,UAAU,WAAW,GAAG;GAC1B,KAAK,SAAS,IAAI,aAAa;IAAC;IAAG;IAAG;IAAG;IAAG;IAAG;GAAC,CAAC;GACjD;EACF;EAEA,IAAI,UAAU,WAAW,GAAG;GAC1B,KAAK,OAAO,KAAK;GACjB,KAAK,OAAO,KAAK;GACjB,KAAK,OAAO,KAAK;GACjB,KAAK,OAAO,KAAK;GACjB,KAAK,OAAO,KAAK;GACjB,KAAK,OAAO,KAAK;GACjB;EACF;EAEA,IAAI,aAAa,WAAW;GAC1B,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB;EACF;EAEA,IAAI,aAAa,UAAU;GACzB,KAAK,SAAS,EAAE;GAChB;EACF;EAEA,IAAI,MAAM,QAAQ,CAAC,GAAG;GACpB,IAAI,EAAE,WAAW,GAAG;IAClB,KAAK,OAAO,KAAK,EAAE;IACnB,KAAK,OAAO,KAAK,EAAE;IACnB,KAAK,OAAO,KAAM,EAAe;IACjC,KAAK,OAAO,KAAM,EAAe;IACjC,KAAK,OAAO,KAAM,EAAe;IACjC,KAAK,OAAO,KAAM,EAAe;IACjC;GACF;GAEA,IAAI,EAAE,WAAW,GAAG;IAClB,MAAM,IAAI,IAAI,QAAQ,EAAE,EAAE;IAC1B,MAAM,IAAI,IAAI,QAAQ,EAAE,EAAE;IAC1B,MAAM,IAAI,IAAI,QAAQ,EAAE,EAAE;IAC1B,KAAK,OAAO,KAAK,EAAE;IACnB,KAAK,OAAO,KAAK,EAAE;IACnB,KAAK,OAAO,KAAK,EAAE;IACnB,KAAK,OAAO,KAAK,EAAE;IACnB,KAAK,OAAO,KAAK,EAAE;IACnB,KAAK,OAAO,KAAK,EAAE;IACnB;GACF;GAEA,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB,KAAK,OAAO,KAAK,EAAE;GACnB;EACF;EAEA,MAAM,IAAI,IAAI,QAAQ,CAAoB;EAC1C,MAAM,IAAI,IAAI,QAAQ,CAAC;EACvB,MAAM,IAAI,IAAI,QAAQ,CAAC;EACvB,KAAK,OAAO,KAAK,EAAE;EACnB,KAAK,OAAO,KAAK,EAAE;EACnB,KAAK,OAAO,KAAK,EAAE;EACnB,KAAK,OAAO,KAAK,EAAE;EACnB,KAAK,OAAO,KAAK,EAAE;EACnB,KAAK,OAAO,KAAK,EAAE;CACrB;;;;;;;;;;;;;;;;;;;;;;;;CAyBA,OAAc,OAAwB;EACpC,OAAO,IAAI,QAAQ,KAAK,OAAO,QAAQ,IAAI,KAAK,OAAO,QAAQ,IAAI,EAAE;CACvE;;;;;;;;;;;;;;;;;;;;;CAsBA,IAAW,OAAyC;EAClD,OAAO;GAAC,KAAK,OAAO;GAAQ,KAAK,OAAO,QAAQ;GAAI,KAAK,OAAO,QAAQ;EAAE;CAC5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCA,IAAW,OAA2B;EACpC,MAAM,KAAK,KAAK,OAAO,IACrB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO;EACnB,MAAM,KAAK,MAAM,OAAO,IACtB,KAAK,MAAM,OAAO,IAClB,KAAK,MAAM,OAAO,IAClB,KAAK,MAAM,OAAO,IAClB,KAAK,MAAM,OAAO,IAClB,KAAK,MAAM,OAAO;EAEpB,OAAO,IAAI,SACT,KAAK,KAAK,KAAK,IACf,KAAK,KAAK,KAAK,IACf,KAAK,KAAK,KAAK,IACf,KAAK,KAAK,KAAK,IACf,KAAK,KAAK,KAAK,KAAK,IACpB,KAAK,KAAK,KAAK,KAAK,EACtB;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCA,OAAc,OAAe,UAAU,MAAgB;EACrD,IAAI,SACF,SAAS;EAGX,MAAM,KAAK,KAAK,OAAO,IACrB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO,IACjB,KAAK,KAAK,OAAO;EACnB,MAAM,IAAI,KAAK,IAAI,KAAK;EACxB,MAAM,IAAI,KAAK,IAAI,KAAK;EAExB,OAAO,IAAI,SACT,KAAK,IAAI,KAAK,GACd,KAAK,IAAI,KAAK,GACd,KAAK,CAAC,IAAI,KAAK,GACf,KAAK,CAAC,IAAI,KAAK,GACf,IACA,EACF;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCA,MAAa,KAAgC;EAC3C,MAAM,IAAI,IAAI,QAAQ,GAAG;EAEzB,OAAO,IAAI,SACT,KAAK,OAAO,KAAK,EAAE,GACnB,KAAK,OAAO,KAAK,EAAE,GACnB,KAAK,OAAO,KAAK,EAAE,GACnB,KAAK,OAAO,KAAK,EAAE,GACnB,KAAK,OAAO,IACZ,KAAK,OAAO,EACd;CACF;;;;;;;;;;;;;;;;;;;;;;CAuBA,UAAiB,GAAqB;EACpC,OAAO,IAAI,SACT,KAAK,OAAO,KAAK,GACjB,KAAK,OAAO,KAAK,GACjB,KAAK,OAAO,KAAK,GACjB,KAAK,OAAO,KAAK,GACjB,KAAK,OAAO,KAAK,GACjB,KAAK,OAAO,KAAK,CACnB;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCA,UAAiB,KAAgC;EAC/C,MAAM,IAAI,IAAI,QAAQ,GAAG;EAEzB,OAAO,IAAI,SACT,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO,KAAK,EAAE,IAAI,KAAK,OAAO,KAAK,EAAE,IAAI,KAAK,OAAO,IAC1D,KAAK,OAAO,KAAK,EAAE,IAAI,KAAK,OAAO,KAAK,EAAE,IAAI,KAAK,OAAO,EAC5D;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCA,IAAW,OAA2B;EACpC,OAAO,IAAI,SACT,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,EAChC;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCA,IAAW,OAA2B;EACpC,OAAO,IAAI,SACT,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,IAC9B,KAAK,OAAO,KAAK,MAAM,OAAO,EAChC;CACF;CAEA,WAA0B;EACxB,OAAO,SAAS;CAClB;CAEA,UACE,IACA,UACM;EACN,GAAG,iBAAiB,UAAU,OAAO;GACnC,KAAK,OAAO;GACZ,KAAK,OAAO;GACZ;GACA,KAAK,OAAO;GACZ,KAAK,OAAO;GACZ;GACA,KAAK,OAAO;GACZ,KAAK,OAAO;GACZ;EACF,CAAC;CACH;CAEA,OAAc,OAAiB,YAAoB,SAAkB;EACnE,OACE,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,OAAO,EAAE,KACvC,YAAY,OAAO,WACrB,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,OAAO,EAAE,KACvC,YAAY,OAAO,WACrB,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,OAAO,EAAE,KACvC,YAAY,OAAO,WACrB,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,OAAO,EAAE,KACvC,YAAY,OAAO,WACrB,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,OAAO,EAAE,KACvC,YAAY,OAAO,WACrB,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,OAAO,EAAE,KAAK,YAAY,OAAO;CAErE;CAEA,cAAqB,OAA0B;EAC7C,OACE,KAAK,OAAO,OAAO,MAAM,OAAO,MAChC,KAAK,OAAO,OAAO,MAAM,OAAO,MAChC,KAAK,OAAO,OAAO,MAAM,OAAO,MAChC,KAAK,OAAO,OAAO,MAAM,OAAO,MAChC,KAAK,OAAO,OAAO,MAAM,OAAO,MAChC,KAAK,OAAO,OAAO,MAAM,OAAO;CAEpC;AACF;;;AC9tBA,IAAY,SAAL,yBAAA,QAAA;CACL,OAAA,OAAA,cAAA,KAAA;CACA,OAAA,OAAA,gBAAA,KAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAY,YAAL,yBAAA,WAAA;CACL,UAAA,UAAA,SAAA,KAAA;CACA,UAAA,UAAA,YAAA,KAAA;CACA,UAAA,UAAA,UAAA,MAAA;CACA,UAAA,UAAA,WAAA,MAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAY,SAAL,yBAAA,QAAA;CACL,OAAA,OAAA,YAAA,KAAA;CACA,OAAA,OAAA,SAAA,KAAA;CACA,OAAA,OAAA,YAAA,KAAA;CACA,OAAA,OAAA,UAAA,MAAA;CACA,OAAA,OAAA,WAAA,MAAA;CACA,OAAA,OAAA,aAAA,MAAA;CACA,OAAA,OAAA,cAAA,MAAA;CACA,OAAA,OAAA,gBAAA,MAAA;CACA,OAAA,OAAA,iBAAA,MAAA;;AACF,EAAA,CAAA,CAAA;AAIA,SAAgB,WACd,QACA,OAAe,GACK;CACpB,IAAI,OAAA;MACE,SAAA,GACF,SAAU,SAAS,KAAA;OACd,IAAI,SAAA,GACT,SAAU,SAAS,KAAA;CAAA;CAIvB,IAAI,OAAA;MACE,SAAA,IACF,SAAU,SAAS,MAAA;OACd,IAAI,SAAA,IACT,SAAU,SAAS,MAAA;CAAA;CAIvB,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,eAAe,QAAqC;CAClE,IAAI,WAAA,GACF,OAAO,QAAQ;CAGjB,IAAI,IAAI;CACR,IAAI,SAAA,IACF,IAAI;MACC,IAAI,SAAA,IACT,IAAI;CAGN,IAAI,IAAI;CACR,IAAI,SAAA,GACF,IAAI;MACC,IAAI,SAAA,GACT,IAAI;CAGN,OAAO,IAAI,QAAQ,GAAG,CAAC;AACzB;;;;;;AChDA,IAAa,UAAb,MAAa,QAA0C;CACrD,OAAuB,SAAS,OAAO,IACrC,oCACF;CAEA,OAAuB,OAAO,IAAI,QAAQ;CAC1C,OAAuB,MAAM,IAAI,QAAQ,GAAG,CAAC;CAC7C,OAAuB,QAAQ,IAAI,QAAQ,GAAG,CAAC;CAC/C,OAAuB,OAAO,IAAI,QAAQ,IAAI,CAAC;CAC/C,OAAuB,KAAK,IAAI,QAAQ,GAAG,CAAC;CAC5C,OAAuB,OAAO,IAAI,QAAQ,GAAG,EAAE;;;;CAK/C,OAAuB,MAAM,IAAI,QAAQ,GAAG,EAAE;;;;CAI9C,OAAuB,SAAS,IAAI,QAAQ,GAAG,CAAC;;;;CAIhD,OAAuB,UAAU,IAAI,QAAQ,IAAI,EAAE;;;;CAInD,OAAuB,WAAW,IAAI,QAAQ,GAAG,EAAE;;;;CAInD,OAAuB,aAAa,IAAI,QAAQ,IAAI,CAAC;;;;CAIrD,OAAuB,cAAc,IAAI,QAAQ,GAAG,CAAC;CAErD,IAAW;CACX,IAAW;CAEX,OAAc,aACZ,SACA,gBAAgD,QAAQ,MACxD,OACqB;EACrB,OAAO,IAAI,qBACT,CAAC,KAAK,GAAG,IACR,UAA2B,IAAI,QAAQ,KAAK,GAC7C,SACA,eACA,KACF,EAAE,SAAS;CACb;CAEA,OAAc,KAAK,MAAe,IAAa,OAAyB;EACtE,IAAI;EACJ,IAAI;EAEJ,IAAI,OAAO,UAAU,UACnB,SAAS,SAAS;OACb;GACL,SAAS,MAAM;GACf,SAAS,MAAM;EACjB;EAEA,OAAO,IAAI,QAAQ,IAAI,KAAK,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC;CACzE;CAEA,OAAc,QACZ,MACA,IACA,OACA,UAAU,OACV,OACA;EACA,UAAU,KAAK,IAAI,EAAE,EAAE;EACvB,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,OAAO,SAAS,KAAK,CAAC;CAC9D;CAEA,OAAc,cAAc,SAAmB,OAAgB;EAC7D,QAAQ,MAAe,IAAa,UAClC,QAAQ,QAAQ,MAAM,IAAI,OAAO,SAAS,KAAK;CACnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDA,OAAc,UACZ,MACA,IACA,OACA,mBAAmB,OACnB,SAAS,QAAQ,MACjB;EACA,OAAO,KAAK,IAAI,MAAM;EACtB,KAAK,GAAG,IAAI,MAAM;EAElB,MAAM,YAAY,KAAK;EACvB,IAAI,UAAU,GAAG;EAGjB,IAF2B,YAAY,YAEZ,kBACzB,UAAU,WAAW,mBAAmB,OAAO;EAGjD,MAAM,QAAQ,IAAI,WAAW,SAAS,KAAK,IAAI;EAC/C,MAAM,YAAY,IAAI,KAAK,WAAW,GAAG,WAAW,KAAK;EAEzD,OAAO,IAAI,QACT,YAAY,KAAK,IAAI,KAAK,IAAI,OAAO,GACrC,YAAY,KAAK,IAAI,KAAK,IAAI,OAAO,CACvC;CACF;;;;;;;;;CAUA,OAAc,gBACZ,mBAAmB,OACnB,SAA0B,QAAQ,MAClC;EACA,QAAQ,MAAe,IAAa,UAClC,QAAQ,UAAU,MAAM,IAAI,OAAO,kBAAkB,IAAI,QAAQ,MAAM,CAAC;CAC5E;CAEA,OAAc,WAAW,QAA4B;EACnD,MAAM,WAAW,IAAI,QAAQ;EAE7B,IAAI,WAAA,GACF,OAAO;EAGT,IAAI,SAAA,IACF,SAAS,IAAI;OACR,IAAI,SAAA,IACT,SAAS,IAAI;EAGf,IAAI,SAAA,GACF,SAAS,IAAI;OACR,IAAI,SAAA,GACT,SAAS,IAAI;EAGf,OAAO;CACT;CAEA,OAAc,WAAW,OAAwB;EAC/C,OAAO,IAAI,QAAQ,OAAO,KAAK;CACjC;CAEA,OAAc,YAAY,SAAiB;EACzC,OAAO,IAAI,QAAQ,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC;CACzD;CAEA,OAAc,YAAY,SAAiB;EACzC,OAAO,QAAQ,YAAY,UAAU,OAAO;CAC9C;;;;;;;;CASA,OAAc,QAAQ,GAAW,GAAW;EAC1C,OAAO,KAAK,MAAM,GAAG,CAAC;CACxB;;;;;;;;;;;CAYA,OAAc,QAAQ,GAAW,GAAW;EAC1C,OAAO,QAAQ,QAAQ,GAAG,CAAC,IAAI;CACjC;CAEA,OAAc,UAAU,GAAW,GAAW;EAC5C,OAAO,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC;CAChC;CAEA,OAAc,iBAAiB,GAAW,GAAW;EACnD,OAAO,IAAI,IAAI,IAAI;CACrB;CAEA,OAAc,aAAa,GAAY,GAAY;EACjD,OACE,KAAK,KAAK,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,KAC7D,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;CAE3B;CAEA,IAAW,QAAgB;EACzB,OAAO,KAAK;CACd;CAEA,IAAW,MAAM,OAAe;EAC9B,KAAK,IAAI;CACX;CAEA,IAAW,SAAiB;EAC1B,OAAO,KAAK;CACd;CAEA,IAAW,OAAO,OAAe;EAC/B,KAAK,IAAI;CACX;CAEA,IAAW,YAAoB;EAC7B,OAAO,QAAQ,UAAU,KAAK,GAAG,KAAK,CAAC;CACzC;CAEA,IAAW,mBAA2B;EACpC,OAAO,QAAQ,iBAAiB,KAAK,GAAG,KAAK,CAAC;CAChD;CAEA,IAAW,aAAsB;EAC/B,OAAO,KAAK,MAAM,IAAI,QAAQ,UAAU,KAAK,GAAG,KAAK,CAAC,CAAC;CACzD;CAEA,IAAW,OAAgB;EACzB,OAAO,IAAI,QAAQ,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;CAC3E;CAEA,IAAW,UAAmB;EAC5B,OAAO,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;CACrC;CAEA,IAAW,UAAmB;EAC5B,OAAO,IAAI,QAAQ,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;CAC3D;CAEA,IAAW,UAAmB;EAC5B,OAAO,IAAI,QAAQ,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;CAC3D;CAEA,IAAW,SAAkB;EAC3B,OAAO,IAAI,QAAQ,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC;CACzD;CAEA,IAAW,gBAAyB;EAClC,OAAO,IAAI,QAAQ,KAAK,GAAG,CAAC,KAAK,CAAC;CACpC;;;;CAKA,IAAW,UAAU;EACnB,OAAO,QAAQ,QAAQ,KAAK,GAAG,KAAK,CAAC;CACvC;;;;;;;CAQA,IAAW,UAAU;EACnB,OAAO,QAAQ,QAAQ,KAAK,GAAG,KAAK,CAAC;CACvC;CAEA,IAAW,MAAc;EACvB,OAAO,KAAK,IAAI,KAAK;CACvB;CAMA,YAAmB,KAAgC,KAAc;EAC/D,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAC/B;EAGF,IAAI,OAAO,QAAQ,UAAU;GAC3B,KAAK,IAAI;GACT,KAAK,IAAI,OAAO;GAChB;EACF;EAEA,IAAI,MAAM,QAAQ,GAAG,GAAG;GACtB,KAAK,IAAI,IAAI;GACb,KAAK,IAAI,IAAI;GACb;EACF;EAEA,IAAI,WAAW,KAAK;GAClB,KAAK,IAAI,IAAI;GACb,KAAK,IAAI,IAAI;GACb;EACF;EAEA,KAAK,IAAI,IAAI;EACb,KAAK,IAAI,IAAI;CACf;CAEA,KAAY,IAAa,OAAyB;EAChD,OAAO,QAAQ,KAAK,MAAM,IAAI,KAAK;CACrC;CAEA,gBAAuB,QAA4B;EACjD,MAAM,SAAS,QAAQ,WAAW,MAAM;EACxC,OAAO,KAAK,KAAK,IAAI;EACrB,OAAO,KAAK,KAAK,IAAI;EAErB,OAAO;CACT;CAEA,MAAa,OAAe;EAC1B,OAAO,IAAI,QAAQ,KAAK,IAAI,OAAO,KAAK,IAAI,KAAK;CACnD;CAEA,iBAAwB,QAA0B;EAChD,MAAM,IAAI,IAAI,SAAS,MAAM;EAE7B,OAAO,IAAI,QACT,KAAK,IAAI,EAAE,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,YACzC,KAAK,IAAI,EAAE,QAAQ,KAAK,IAAI,EAAE,SAAS,EAAE,UAC3C;CACF;CAEA,UAAiB,QAA0B;EACzC,MAAM,IAAI,IAAI,SAAS,MAAM;EAE7B,OAAO,IAAI,QACT,KAAK,IAAI,EAAE,SAAS,KAAK,IAAI,EAAE,OAC/B,KAAK,IAAI,EAAE,QAAQ,KAAK,IAAI,EAAE,MAChC;CACF;CAEA,IAAW,gBAAiC;EAC1C,MAAM,SAAS,IAAI,QAAQ,cAAc;EACzC,OAAO,IAAI,QAAQ,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC;CACzD;CAEA,IAAW,gBAAiC;EAC1C,MAAM,SAAS,IAAI,QAAQ,cAAc;EACzC,OAAO,IAAI,QAAQ,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC;CACzD;CAEA,IAAW,gBAAiC;EAC1C,MAAM,SAAS,IAAI,QAAQ,cAAc;EACzC,OAAO,IAAI,QAAQ,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC;CACzD;CAEA,IAAW,gBAAiC;EAC1C,MAAM,SAAS,IAAI,QAAQ,cAAc;EACzC,OAAO,IAAI,QAAQ,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC;CACzD;CAEA,IAAW,gBAAyC;EAClD,MAAM,SAAS,IAAI,QAAQ,cAAc;EACzC,OAAO,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO;CAC7C;CAEA,MAAa,gBAAyC;EACpD,MAAM,SAAS,IAAI,QAAQ,cAAc;EACzC,OAAO,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO;CAC7C;CAEA,IAAW,gBAA0C;EACnD,MAAM,SAAS,IAAI,QAAQ,cAAc;EACzC,OAAO,IAAI,QAAQ,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC;CACzD;;;;;;;CAQA,OACE,OACA,SAA0B,QAAQ,MACzB;EACT,MAAM,eAAe,IAAI,QAAQ,MAAM;EAEvC,MAAM,SAAS,SAAS,gBAAgB,YAAY,EACjD,OAAO,KAAK,EACZ,UAAU,aAAa,OAAO;EAEjC,OAAO,KAAK,iBAAiB,MAAM;CACrC;CAEA,KAAY,OAAe;EACzB,OAAO,IAAI,QAAQ,KAAK,IAAI,OAAO,KAAK,CAAC;CAC3C;CAEA,KAAY,OAAe;EACzB,OAAO,IAAI,QAAQ,KAAK,GAAG,KAAK,IAAI,KAAK;CAC3C;;;;;;;;;;;;;CAcA,IAAW,UAAoD;EAC7D,OAAO,IAAI,QAAQ,SAAS,KAAK,GAAG,CAAC,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC;CAC7D;CAEA,WAA0B;EACxB,OAAO,QAAQ;CACjB;CAEA,WAAkB;EAChB,OAAO,WAAW,KAAK,EAAE,IAAI,KAAK,EAAE;CACtC;CAEA,UAAmC;EACjC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;CACxB;CAEA,UACE,IACA,UACM;EACN,GAAG,UAAU,UAAU,KAAK,GAAG,KAAK,CAAC;CACvC;CAEA,YAAsC;EACpC,OAAO;GAAC,GAAG,KAAK;GAAG,GAAG,KAAK;EAAC;CAC9B;;;;;;;;;;CAWA,cAAqB,OAAyB;EAC5C,OAAO,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM;CAChD;;;;;;;;;;;;CAaA,OAAc,OAAgB,YAAY,SAAkB;EAC1D,OACE,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,YAAY,OAAO,WACjD,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,YAAY,OAAO;CAErD;CAEA,EAAS,OAAO,YAAY;EAC1B,MAAM,KAAK;EACX,MAAM,KAAK;CACb;AACF;;;AChhBA,IAAa,OAAb,MAAa,KAAuC;CAClD,OAAuB,SAAS,OAAO,IAAI,iCAAiC;CAE5E,IAAW;CACX,IAAW;CACX,QAAe;CACf,SAAgB;CAEhB,OAAc,aACZ,SACA,gBAA6C,KAAK,MAChC;EAClB,OAAO,IAAI,sBACT;GAAC;GAAK;GAAK;GAAS;EAAQ,IAC3B,UAAwB,IAAI,KAAK,KAAK,GACvC,SACA,aACF,EAAE,SAAS;CACb;CAEA,OAAc,KACZ,MACA,IACA,OACM;EACN,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI,OAAO,UAAU,UACnB,SAAS,SAAS,aAAa,cAAc;OACxC,IAAI,iBAAiB,SAAS;GACnC,SAAS,aAAa,MAAM;GAC5B,SAAS,cAAc,MAAM;EAC/B,OAAO;GACL,SAAS,MAAM;GACf,SAAS,MAAM;GACf,aAAa,MAAM;GACnB,cAAc,MAAM;EACtB;EAEA,OAAO,IAAI,KACT,IAAI,KAAK,GAAG,GAAG,GAAG,MAAM,GACxB,IAAI,KAAK,GAAG,GAAG,GAAG,MAAM,GACxB,IAAI,KAAK,OAAO,GAAG,OAAO,UAAU,GACpC,IAAI,KAAK,QAAQ,GAAG,QAAQ,WAAW,CACzC;CACF;CAEA,OAAc,QACZ,MACA,IACA,OACA,UAAU,OACV,OACA;EACA,WACG,KAAK,SAAS,IAAI,GAAG,QAAQ,EAAE,MAAM,KAAK,KAAK,IAAI,GAAG,IAAI,EAAE,OAAO;EAEtE,OAAO,KAAK,KAAK,MAAM,IAAI,QAAQ,OAAO,SAAS,KAAK,CAAC;CAC3D;CAEA,OAAc,iBAAiB,MAAqB;EAClD,OAAO,IAAI,KAAK,CAAC,KAAK,QAAQ,GAAG,CAAC,KAAK,SAAS,GAAG,KAAK,OAAO,KAAK,MAAM;CAC5E;CAEA,OAAc,WAAW,GAAG,QAAyB;EACnD,IAAI,OAAO;EACX,IAAI,OAAO;EACX,IAAI,OAAO;EACX,IAAI,OAAO;EAEX,KAAK,MAAM,SAAS,QAAQ;GAC1B,IAAI,MAAM,IAAI,MACZ,OAAO,MAAM;GAEf,IAAI,MAAM,IAAI,MACZ,OAAO,MAAM;GAEf,IAAI,MAAM,IAAI,MACZ,OAAO,MAAM;GAEf,IAAI,MAAM,IAAI,MACZ,OAAO,MAAM;EAEjB;EAEA,OAAO,IAAI,KAAK,MAAM,MAAM,OAAO,MAAM,OAAO,IAAI;CACtD;CAEA,OAAc,WAAW,GAAG,OAAqB;EAC/C,IAAI,OAAO;EACX,IAAI,OAAO;EACX,IAAI,OAAO;EACX,IAAI,OAAO;EAEX,KAAK,MAAM,OAAO,OAAO;GACvB,MAAM,QAAQ,IAAI,IAAI,IAAI;GAC1B,IAAI,QAAQ,MACV,OAAO;GAET,IAAI,IAAI,IAAI,MACV,OAAO,IAAI;GAEb,MAAM,SAAS,IAAI,IAAI,IAAI;GAC3B,IAAI,SAAS,MACX,OAAO;GAET,IAAI,IAAI,IAAI,MACV,OAAO,IAAI;EAEf;EAEA,OAAO,IAAI,KAAK,MAAM,MAAM,OAAO,MAAM,OAAO,IAAI;CACtD;CAEA,KAAY,IAAU,OAAgC;EACpD,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK;CAClC;CAEA,IAAW,WAAW;EACpB,OAAO,IAAI,QAAQ,KAAK,GAAG,KAAK,CAAC;CACnC;CAEA,IAAW,SAAS,OAAgB;EAClC,KAAK,IAAI,MAAM;EACf,KAAK,IAAI,MAAM;CACjB;CAEA,IAAW,OAAO;EAChB,OAAO,IAAI,QAAQ,KAAK,OAAO,KAAK,MAAM;CAC5C;CAEA,IAAW,SAAS;EAClB,OAAO,IAAI,QAAQ,KAAK,IAAI,KAAK,QAAQ,GAAG,KAAK,IAAI,KAAK,SAAS,CAAC;CACtE;CAEA,IAAW,OAAO;EAChB,OAAO,KAAK;CACd;CAEA,IAAW,KAAK,OAAe;EAC7B,KAAK,SAAS,KAAK,IAAI;EACvB,KAAK,IAAI;CACX;CAEA,IAAW,QAAQ;EACjB,OAAO,KAAK,IAAI,KAAK;CACvB;CAEA,IAAW,MAAM,OAAe;EAC9B,KAAK,QAAQ,QAAQ,KAAK;CAC5B;CAEA,IAAW,MAAM;EACf,OAAO,KAAK;CACd;CAEA,IAAW,IAAI,OAAe;EAC5B,KAAK,UAAU,KAAK,IAAI;EACxB,KAAK,IAAI;CACX;CAEA,IAAW,SAAS;EAClB,OAAO,KAAK,IAAI,KAAK;CACvB;CAEA,IAAW,OAAO,OAAe;EAC/B,KAAK,SAAS,QAAQ,KAAK;CAC7B;CAEA,IAAW,UAAmB;EAC5B,OAAO,KAAK;CACd;CAEA,IAAW,WAAoB;EAC7B,OAAO,IAAI,QAAQ,KAAK,IAAI,KAAK,OAAO,KAAK,CAAC;CAChD;CAEA,IAAW,aAAsB;EAC/B,OAAO,IAAI,QAAQ,KAAK,GAAG,KAAK,IAAI,KAAK,MAAM;CACjD;CAEA,IAAW,cAAuB;EAChC,OAAO,IAAI,QAAQ,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,MAAM;CAC9D;CAEA,IAAW,UAAgD;EACzD,OAAO;GAAC,KAAK;GAAS,KAAK;GAAU,KAAK;GAAa,KAAK;EAAU;CACxE;CAEA,IAAW,eAAe;EACxB,OAAO,IAAI,KACT,KAAK,MAAM,KAAK,CAAC,GACjB,KAAK,MAAM,KAAK,CAAC,GACjB,KAAK,KAAK,KAAK,QAAQ,CAAC,GACxB,KAAK,KAAK,KAAK,SAAS,CAAC,CAC3B;CACF;CAMA,YACE,KACA,MAAwB,GACxB,QAAQ,GACR,OAAO,GACP;EACA,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAC/B;EAGF,IAAI,OAAO,QAAQ,UAAU;GAC3B,KAAK,IAAI;GACT,KAAK,IAAY;GACjB,KAAK,QAAQ;GACb,KAAK,SAAS;GACd;EACF;EAEA,IAAI,eAAe,SAAS;GAC1B,KAAK,IAAI,IAAI;GACb,KAAK,IAAI,IAAI;GAEb,IAAI,eAAe,SAAS;IAC1B,KAAK,QAAQ,IAAI;IACjB,KAAK,SAAS,IAAI;GACpB;GAEA;EACF;EAEA,IAAI,MAAM,QAAQ,GAAG,GAAG;GACtB,KAAK,IAAI,IAAI;GACb,KAAK,IAAI,IAAI;GACb,KAAK,QAAQ,IAAI;GACjB,KAAK,SAAS,IAAI;GAClB;EACF;EAEA,KAAK,IAAI,IAAI;EACb,KAAK,IAAI,IAAI;EACb,KAAK,QAAQ,IAAI;EACjB,KAAK,SAAS,IAAI;CACpB;CAEA,UAAiB,QAAgC;EAC/C,OAAO,IAAI,KACT,KAAK,SAAS,iBAAiB,MAAM,GACrC,KAAK,KAAK,UAAU,MAAM,CAC5B;CACF;CAEA,iBAAwB,QAA0B;EAChD,OAAO,KAAK,QAAQ,KAAI,WAAU,OAAO,iBAAiB,MAAM,CAAC;CACnE;;;;;;CAOA,UAAiB,QAA+B;EAC9C,MAAM,cAAc,IAAI,QAAQ,MAAM;EACtC,OAAO,IAAI,KACT,KAAK,IAAI,YAAY,GACrB,KAAK,IAAI,YAAY,GACrB,KAAK,OACL,KAAK,MACP;CACF;;;;;;CAOA,OAAc,OAAwB;EACpC,MAAM,UAAU,IAAI,QAAQ,KAAK;EACjC,MAAM,SAAS,IAAI,KAAK,IAAI;EAC5B,OAAO,QAAQ,QAAQ;EACvB,OAAO,OAAO,QAAQ;EACtB,OAAO,SAAS,QAAQ;EACxB,OAAO,UAAU,QAAQ;EAEzB,OAAO;CACT;;;;;;CAOA,WAAkB,OAAwB;EACxC,OAAO,KAAK,OAAO,KAAK;CAC1B;CAEA,SAAgB,OAAyB;EACvC,OACE,MAAM,KAAK,KAAK,KAChB,MAAM,KAAK,KAAK,IAAI,KAAK,SACzB,MAAM,KAAK,KAAK,KAChB,MAAM,KAAK,KAAK,IAAI,KAAK;CAE7B;CAEA,WAAkB,OAAsB;EACtC,OACE,KAAK,OAAO,MAAM,SAClB,KAAK,QAAQ,MAAM,QACnB,KAAK,MAAM,MAAM,UACjB,KAAK,SAAS,MAAM;CAExB;CAEA,aAAoB,OAAmB;EACrC,MAAM,OAAO,IAAI,KAAK;EAEtB,IAAI,KAAK,WAAW,KAAK,GAAG;GAC1B,KAAK,OAAO,KAAK,IAAI,KAAK,MAAM,MAAM,IAAI;GAC1C,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,MAAM,GAAG;GACvC,KAAK,QAAQ,KAAK,IAAI,KAAK,OAAO,MAAM,KAAK;GAC7C,KAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM;EAClD;EAEA,OAAO;CACT;CAEA,MAAa,OAAmB;EAC9B,MAAM,OAAO,IAAI,KAAK;EAEtB,KAAK,OAAO,KAAK,IAAI,KAAK,MAAM,MAAM,IAAI;EAC1C,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,MAAM,GAAG;EACvC,KAAK,QAAQ,KAAK,IAAI,KAAK,OAAO,MAAM,KAAK;EAC7C,KAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM;EAEhD,OAAO;CACT;CAEA,WAA0B;EACxB,OAAO,KAAK;CACd;CAEA,WAA0B;EACxB,OAAO,QAAQ,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,KAAK,OAAO;CAClE;CAEA,UACE,IACA,UACM;EACN,GAAG,UAAU,UAAU,KAAK,GAAG,KAAK,GAAG,KAAK,OAAO,KAAK,MAAM;CAChE;CAEA,YAAmC;EACjC,OAAO;GAAC,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG,OAAO,KAAK;GAAO,QAAQ,KAAK;EAAM;CACtE;AACF;;;;;;;;;;AChWA,IAAa,QAAb,MAAa,MAAwC;CACnD,OAAuB,SAAS,OAAO,IACrC,kCACF;CAEA;CAEA,YAAmB,OAAsB;EACvC,IAAI,iBAAiB,OAAO;GAC1B,KAAK,QAAQ,MAAM;GACnB;EACF;EAEA,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,OAAO;GAC/D,KAAK,QAAQ,OAAO,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;GAC1D;EACF;EAEA,KAAK,QAAQ,OAAO,KAAK;CAC3B;CAEA,OAAe,WAAW,OAA4B;EACpD,MAAM,QAAQ,IAAI,MAAM,CAAC;EACzB,MAAM,QAAQ;EACd,OAAO;CACT;CAEA,OAAc,KACZ,MACA,IACA,OACA,aAAyB,OAClB;EACP,MAAM,YACJ,SAAS,OAAO,OAAO,OAAO,SAAS,WAAW,IAAI,MAAM,IAAI,IAAI;EACtE,MAAM,UACJ,OAAO,OAAO,OAAO,OAAO,OAAO,WAAW,IAAI,MAAM,EAAE,IAAI;EAEhE,MAAM,eACJ,aAAa,SAAS,MAAM,CAAC,KAAK,IAAI,MAAM,kBAAkB;EAChE,MAAM,aACJ,WAAW,WAAW,MAAM,CAAC,KAAK,IAAI,MAAM,kBAAkB;EAEhE,OAAO,MAAM,WACX,OAAO,IAAI,aAAa,OAAO,WAAW,OAAO,OAAO,UAAU,CACpE;CACF;CAEA,OAAc,WACZ,YAC8B;EAC9B,QACE,MACA,IACA,UACG,MAAM,KAAK,MAAM,IAAI,OAAO,UAAU;CAC7C;CAEA,OAAc,aACZ,SACA,gBAA8C,MAAM,MACjC;EACnB,OAAO,IAAI,cACT,SACA,eACA,KAAA,IACC,UAAyB,IAAI,MAAM,KAAK,CAC3C,EAAE,SAAS;CACb;CAEA,OAAc,QAAQ,GAAW,GAAW,GAAW,GAAmB;EACxE,MAAM,QAAQ,OAAO,IAAI,GAAG,GAAG,CAAC;EAChC,IAAI,MAAM,KAAA,GACR,OAAO,MAAM,WAAW,MAAM,MAAM,CAAC,CAAC;EAExC,OAAO,MAAM,WAAW,KAAK;CAC/B;CAEA,OAAc,QAAQ,OAAwB;EAC5C,OAAO,OAAO,MAAM,KAAK;CAC3B;CAEA,IAAW,MAAwC;EACjD,OAAO,KAAK,MAAM,IAAI,IAAI;CAC5B;CAEA,IAAW,MAAsB;EAC/B,OAAO,KAAK,MAAM,IAAI,IAAI;CAC5B;CAEA,KAA8C;EAC5C,OAAO,KAAK,MAAM,GAAG;CACvB;CAIA,MAAa,OAAgC;EAC3C,IAAI,UAAU,KAAA,GACZ,OAAO,KAAK,MAAM,MAAM;EAE1B,OAAO,MAAM,WAAW,KAAK,MAAM,MAAM,KAAK,CAAC;CACjD;CAEA,OAAsB;EACpB,OAAO,KAAK,MAAM,KAAK;CACzB;CAEA,IAAW,QAAQ,MAAgC;EACjD,OAAO,KAAK,MAAM,IAAI,KAAK;CAC7B;CAEA,KAAY,QAAQ,MAAwC;EAC1D,OAAO,KAAK,MAAM,KAAK,KAAK;CAC9B;CAEA,MAAuC;EACrC,OAAO,KAAK,MAAM,IAAI;CACxB;CAEA,MAAuC;EACrC,OAAO,KAAK,MAAM,IAAI;CACxB;CAEA,MAAuC;EACrC,OAAO,KAAK,MAAM,IAAI;CACxB;CAEA,MAAuC;EACrC,OAAO,KAAK,MAAM,IAAI;CACxB;CAEA,MAAuC;EACrC,OAAO,KAAK,MAAM,IAAI;CACxB;CAEA,MAAuC;EACrC,OAAO,KAAK,MAAM,IAAI;CACxB;CAEA,QAAyC;EACvC,OAAO,KAAK,MAAM,MAAM;CAC1B;CAEA,QAAyC;EACvC,OAAO,KAAK,MAAM,MAAM;CAC1B;CAEA,MAAqB;EACnB,OAAO,KAAK,MAAM,IAAI;CACxB;CAEA,cAA6B;EAC3B,OAAO,KAAK,MAAM,YAAY;CAChC;CAEA,UAA0B;EACxB,OAAO,KAAK,MAAM,QAAQ;CAC5B;CAEA,OAAc,QAAwB;EACpC,OAAO,MAAM,WAAW,KAAK,MAAM,OAAO,MAAM,CAAC;CACnD;CAEA,SAAgB,QAAwB;EACtC,OAAO,MAAM,WAAW,KAAK,MAAM,SAAS,MAAM,CAAC;CACrD;CAEA,SAAgB,QAAwB;EACtC,OAAO,MAAM,WAAW,KAAK,MAAM,SAAS,MAAM,CAAC;CACrD;CAEA,WAAkB,QAAwB;EACxC,OAAO,MAAM,WAAW,KAAK,MAAM,WAAW,MAAM,CAAC;CACvD;CAEA,IACE,OACA,OACA,YACO;EACP,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,MAAM,KAAK,IAAI;EAC7D,OAAO,MAAM,WAAW,KAAK,MAAM,IAAI,MAAM,OAAO,OAAO,UAAU,CAAC;CACxE;CAEA,MAAa,OAAgB,MAAwC;EACnE,OAAO,MAAM,WAAW,KAAK,MAAM,MAAM,OAAO,IAAI,CAAC;CACvD;CAEA,KAAY,OAAgB,MAAwC;EAClE,OAAO,MAAM,WAAW,KAAK,MAAM,KAAK,OAAO,IAAI,CAAC;CACtD;CAIA,UACE,OACA,MACgB;EAChB,IAAI,UAAU,KAAA,GACZ,OAAO,KAAK,MAAM,UAAU;EAE9B,OAAO,MAAM,WAAW,KAAK,MAAM,UAAU,OAAO,IAAI,CAAC;CAC3D;CAEA,IAAW,SAAiB,OAA+B;EACzD,OAAO,MAAM,WAAW,KAAK,MAAM,IAAI,SAAS,KAAK,CAAC;CACxD;CAEA,IAAW,UAA0B;EACnC,OAAO,KAAK,MAAM,IAAI,QAAQ;CAChC;CAEA,YAAoC;EAClC,OAAO,KAAK,IAAI;CAClB;CAEA,WAA0B;EACxB,OAAO,MAAM;CACf;CAEA,UACE,IACA,UACM;EACN,GAAG,WAAW,UAAU,KAAK,GAAG,CAAC;CACnC;CAEA,KAAY,IAAW,OAAe,YAAgC;EACpE,OAAO,MAAM,KAAK,MAAM,IAAI,OAAO,UAAU;CAC/C;CAEA,WAA0B;EACxB,OAAO,KAAK,IAAI;CAClB;AACF;;;AC1QA,SAAgB,eAAe,OAAe,QAAmB;CAC/D,OAAO,QAAQ,YAAY,KAAK,EAAE,UAAU,MAAM,EAAE;AACtD;AAEA,SAAgB,gBAAgB,QAAgB,QAAmB;CACjE,OAAO,QAAQ,UAAU,OAAO,KAAK,OAAO,GAAG,IAAI;AACrD;;;;;;ACFA,IAAa,iBAAb,cAAoC,UAGlC;CACA,OAAuB,MAAM;CAE7B,MAAsB,OAA2C;EAC/D,OAAO,UAAU,OAAO,OAAO,IAAI,MAAM,KAAK;CAChD;CAEA,YAAkD;EAChD,OAAO,KAAK,MAAM,SAAS,UAAU,KAAK;CAC5C;AACF;;;;;;ACbA,IAAa,gBAAb,MAAa,sBAAyB,UAAa;CAQ/B;CAPlB,OAAuB,SAAS,OAAO,IACrC,yCACF;CACA,OAAuB,cAAc;CAErC,YACE,MACA,SACA,UAAa,QAAQ,IAAI,OACzB;EACA,MAAM,MAAM,OAAO;EAHH,KAAA,UAAA;CAIlB;CAEA,IAAW,OAAU;EACnB,MAAM,IAAI,KAAK,UAAU,KAAK,GAAG,KAAK;CACxC;CAEA,MAAa,OAAa;EACxB,OAAO,KAAK,UAAU,KAAK,GAAG;CAChC;CAEA,UAAiB,OAAyB;EACxC,OACE,KAAK,QAAQ,MAAK,WAAU,OAAO,UAAU,KAAK,KAAK,KAAK,QAAQ;CAExE;AACF;;;;;;ACzBA,IAAa,oBAAb,cAAuC,UAGpC;CAwBS;CAvBV,OAAuB;;;;;;CAOvB,IAAW,kBAAkB;EAC3B,OAAO,KAAK,OAAO;CACrB;CACA;CAEA,IAAW,UAAsC;EAC/C,OAAO,KAAK,aAAa,KAAK;CAChC;CAEA;CACA;CACA;CAEA,YACE,MACA,SACA,UAAkB,GAClB;EACA,MAAM,YAAY,QAAQ,QAAQ,SAChC,WAAU,OAAO,YAAY,OAAO,KAAK,CAAC,CAC5C;EACA,MAAM,eAAe,UAAU,KAAI,aAAY,SAAS,KAAK,OAAO,CAAC;EACrE,MAAM,gBAAgB,IAAI,cACxB,YACA,UAAU,KAAI,cAAa;GACzB,OAAO,SAAS;GAChB,MAAM,SAAS;EACjB,EAAE,GACF,UAAU,UAAU,EACtB;EAEA,MAAM,MAAM;GACV,MAAM,cAAc,IAAI;GACxB,SAAS,aAAa,UAAU,IAAI;EACtC,CAAC;EAlBO,KAAA,UAAA;EAoBR,KAAK,YAAY;EACjB,KAAK,gBAAgB;EACrB,KAAK,cAAc,UAAU,UAAU,KAAK,cAAc,KAAK;EAC/D,KAAK,cAAc,QAAQ,aAAa,SAAS,CAAC,EAAE,MAAM;EAC1D,KAAK,eAAe;EACpB,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,aAA+B,CAAC;EAExE,IAAI,KAAK,SAAS;GAChB,KAAK,QAAQ,UAAU,UAAU,KAAK,cAAc,KAAK;GACzD,KAAK,OAAO,UAAU,CAAC,KAAK,eAAe,KAAK,OAAO;EACzD;CACF;CAEA,IAAW,OAAqC;EAC9C,KAAK,cAAc,IAAI,MAAM,IAAI;EACjC,KAAK,SAAS,IAAI,MAAM,WAAW,CAAC,CAAC;CACvC;CAEA,YAAiD;EAC/C,OAAO;GACL,MAAM,KAAK,cAAc,UAAU;GACnC,SAAS,KAAK,SAAS,UAAU,KAAK;EACxC;CACF;CAEA,QAAqB;EACnB,OAAO,IAAU,KAAK,YAAa,KAAK,MAAM,KAAK,WAAW,KAAK,OAAO;CAC5E;CAEA,qBAA6B;EAC3B,MAAM,QAAQ,KAAK,cAAc,IAAI;EACrC,MAAM,QAAQ,KAAK,IACjB,KAAK,UAAU,WAAU,aAAY,SAAS,OAAO,KAAK,GAC1D,CACF;EAEA,IAAI,KAAK,YAAY,OAAO;GAC1B,KAAK,SAAS,UAAU,YAAY,KAAK,YAAY;GACrD,KAAK,UAAU;GACf,KAAK,SAAS,UAAU,UAAU,KAAK,cAAc,KAAK;GAC1D,KAAK,OAAO,UAAU,KAAK,UACvB,CAAC,KAAK,eAAe,KAAK,OAAO,IACjC,CAAC,KAAK,aAAa;EACzB;EAEA,KAAK,MAAM,UAAU;GACnB,MAAM,KAAK,cAAc,IAAI;GAC7B,SAAS,KAAK,SAAS,IAAI,KAAK;EAClC;CACF;AACF;;;;;;;;;;;;;;AC3FA,IAAa,WAAb,MAAa,SAAY;CAOJ;CACT;CAPV,OAAwB,IAAI,UAAU;CACtC,eAAuB;CACvB,QAA0B;CAC1B,YAAyC;CAEzC,YACE,MACA,SAAiC,OACjC;EAFiB,KAAA,OAAA;EACT,KAAA,SAAA;CACP;CAEH,OAAc,OAAqB;EACjC,IAAI,KAAK,WAAW;EACpB,KAAK,YAAY;EACjB,IAAI,KAAK,OACP,KAAK,UAAU,IAAI,KAAK,KAAK;EAE/B,KAAK,WAAW,UAAU,UAAU,KAAK,aAAa;CACxD;CAEA,gBAA0B,YAAY;EACpC,IAAI,OAAO,KAAK,OAAO,KAAK,aAAa,CAAC,KAAK,cAAc;GAC3D,MAAM,OAAO,KAAK,UAAU,UAAU;GACtC,MAAM,KAAK,KAAK,QAAQ;GACxB,IAAI;IAEF,MAAM,KAAK,SAAS,IAAI;GAC1B,SAAS,GAAQ;IACf,UAAU,EAAE,MAAM,CAAC;GACrB;GACA,KAAK,KAAK,QAAQ;EACpB;CACF;CAEA,MAAc,SAAS,MAAS;EAC9B,IAAI,KAAK,WAAW,OAClB;EAGF,IAAI,CAAC,KAAK,QACR,MAAM,IAAI,MAAM,qBAAqB,KAAK,KAAK,aAAa;EAG9D,IAAI,SAAS,aAAa,KAAK,SAC7B,MAAM,IAAI,MAAM,gBAAgB,KAAK,KAAK,0BAA0B;EAGtE,MAAM,SAAS,KAAK;EACpB,MAAM,IAAI,SAAe,SAAS,WAAW;GAC3C,iBAAiB;IACf,OAAO,SAAS,aAAa;IAC7B,OAAO,iDAAiD,KAAK,MAAM;GACrE,GAAG,GAAI;GACP,SAAS,aAAa,gBAAgB;IACpC,OAAO,SAAS,aAAa;IAC7B,QAAQ;GACV;GACA,OAAO,KAAK,IAAK,KAAK,uBAAuB;IAC3C;IACA;GACF,CAAC;EACH,CAAC;CACH;;;;;;;;;CAUA,SAAgB,MAAS;EACvB,KAAK,eAAe;EACpB,KAAK,QAAQ;EACb,KAAK,WAAW,IAAI,IAAI;EACxB,KAAK,eAAe;CACtB;CAEA,OAAe,eAAyC,CAAC;CAEzD;EACE,IAAI,OAAO,KAAK,KACd,OAAO,KAAK,IAAI,GAAG,4BAA4B,EAAC,aAAY;GAC1D,KAAK,aAAa,UAAU;EAC9B,CAAC;CAEL;AACF;;;;;;AC/FA,IAAa,kBAAb,cAAqC,UAAuB;CAC1D,OAAuB;CACvB,UAA0C,CAAC;CAC3C,MAAgB;CAChB,MAAgB;CAChB,YAAsB;CACtB,OAAiB;CAEjB,MAAa,OAAoB;EAC/B,IAAI,SAAS,WAAW,KAAK;EAC7B,IAAI,MAAM,MAAM,GACd,SAAS,KAAK;EAGhB,OAAO,MAAM,KAAK,KAAK,KAAK,KAAK,MAAM;CACzC;CAEA,aAAoB;EAClB,OAAO,KAAK;CACd;CAEA,WAAkB,SAAqC;EACrD,KAAK,UAAU;EACf,OAAO;CACT;CAEA,SAAgB,KAAc,KAAoB;EAChD,KAAK,MAAM,OAAO;EAClB,KAAK,MAAM,OAAO;EAClB,OAAO;CACT;CAEA,SAAwB;EACtB,OAAO,KAAK,OAAO;CACrB;CAEA,SAAwB;EACtB,OAAO,KAAK,OAAO;CACrB;CAEA,aAAoB,WAAyB;EAC3C,KAAK,YAAY,MAAM,GAAG,KAAK,SAAS;EACxC,OAAO;CACT;CAEA,eAA8B;EAC5B,OAAO,KAAK;CACd;CAEA,QAAe,MAAoB;EACjC,KAAK,OAAO;EACZ,OAAO;CACT;CAEA,UAAyB;EACvB,OAAO,KAAK;CACd;AACF;;;;;;;;;;ACrDA,IAAa,iBAAb,MAAa,uBAAuB,UAGlC;CACA,OAAuB,SAAS,OAAO,IACrC,0CACF;CACA,OAAuB,eAAe;CAEtC,MAAsB,OAAkD;EACtE,OAAO,KAAK,WAAW,UAAU,MAAM,IAAI,MAAM,MAAM,QAAQ;CACjE;;;;;;;;;;;;;CAcA,OACE,YACA,UACA,UACA,KACA;EACA,KAAK,MAAM,UAAU,KAAK,WACxB,WAAW,MAAM,SACjB,aAAa,MAAM,SACnB,WAAW,MAAM,OACnB;CACF;CAEA,WACE,UACA,aAAqB,KAAK,MAAM,QAAQ,IACxC,WAAmB,KAAK,MAAM,QAAQ,IACpB;EAClB,aAAa,MAAM,GAAG,UAAU,UAAU;EAC1C,WAAW,MAAM,GAAG,UAAU,YAAY,QAAQ;EAElD,IAAI,aAAa,UACf,CAAC,YAAY,YAAY,CAAC,UAAU,UAAU;EAGhD,IAAI,YAAY,UACd,WAAW;EAGb,OAAO,CAAC,YAAY,QAAQ;CAC9B;AACF;;;;;;AC7DA,IAAa,kBAAb,cAAgE,UAAa;CAC3E,OAAuB;CACvB,UAAqC,CAAC;CAEtC,aAAoB;EAClB,OAAO,KAAK;CACd;CAEA,WAAkB,SAAgC;EAChD,KAAK,UAAU;EACf,OAAO;CACT;AACF;;;;;;ACZA,IAAa,mBAAb,cAAsC,UAAoC;CACxE,OAAuB,QAAQ;CAE/B,MAAsB,OAAiC;EACrD,OAAO,IAAI,QAAQ,KAAK;CAC1B;CAEA,YAA6C;EAC3C,OAAO,KAAK,MAAM,QAAQ,UAAU;CACtC;AACF;;;;;;;;;;ACNA,SAAgB,cACd,SACA,UACA,eACA;CACA,IAAI,YAAY,MACd,iBAAiB,CAEjB;CAGF,MAAM,QAAQ,SAAS;CACvB,MAAM,QAAQ,MAAM;CACpB,MAAM,gBAAgB,iBAAiB;CAEvC,MAAM,YAAY,OAAO,gBAAgB,eAAe,UAAU,QAAQ;CAC1E,MAAM,YAAY,MAAM,gBAAgB,eAAe,UAAU,OAAO;CAExE,MAAM,aAAa;CAEnB,aAAa;EACX,MAAM,uBAAuB;EAC7B,YAAY;EACZ,UAAU;CACZ;AACF;;;;;;;;AC1BA,UAAiB,eAAe,WAAW,IAAsB;CAC/D,MAAM,WAAW,aAAa,CAAC;CAC/B,MAAM,gBAAgB,eAAc,QAAO;EACzC,IAAI,cAAc,SAAS;CAC7B,CAAC;CAED,OAAO,SAAS,GAAG,QAAQ;CAC3B,cAAc;AAChB;;;ACSA,UAAiB,gBACf,YAAA,GACA,WAAW,IACM;CAEjB,MAAM,WADO,SAAS,EAAE,YACJ,EAAE,gBAAgB,SAAS,EAAE,MAAM,CAAC;CACxD,MAAM,mBAAmB,QAAQ,aAAa;CAC9C,MAAM,kBAAkB,QAAQ,aAAa,QAAQ;CACrD,MAAM,gBAAgB,eACpB,QAAO,IAAI,UAAU,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC,IAC7D,QAAO,IAAI,UAAU,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAAC,CACjE;CAEA,OAAO,IACL,iBAAiB,SAAS,MAAM,EAAE,GAAG,QAAQ,GAC7C,gBAAgB,QAAQ,MAAM,QAAQ,CACxC;CACA,cAAc;AAChB;;;;;;;;;;;;;;AC5BA,UAAiB,eACf,WAAW,IACX,gBAAsC,MACrB;CACjB,MAAM,gBAAgB,oBACd,CAEN,GACA,KAAA,GACA,aACF;CAEA,OAAO,QAAQ,QAAQ;CACvB,cAAc;AAChB;;;;;;;;;AChBA,UAAiB,iBAAiB,MAAY,WAAW,IAAsB;CAC7E,MAAM,QAAQ,SAAS,EAAE,YAAY,EAAE,IAAI,KAAK,IAAI;CAEpD,MAAM,kBAAkB,QAAQ,aAAa,KAAK,QAAQ;CAC1D,MAAM,eAAe,QAAQ,aAAa,QAAQ,IAAI,IAAI,KAAK,CAAC;CAChE,MAAM,mBAAmB,QAAQ,aAAa,CAAC;CAC/C,MAAM,gBAAgB,QAAQ,aAAa,CAAC;CAC5C,MAAM,QAAQ,aAAa,CAAC;CAE5B,MAAM,gBAAgB,eACpB,QAAO;EACL,IAAI,cAAc,WAAW,IAAK,IAAK,GAAG,GAAG,MAAM,CAAC;EACpD,IAAI,UAAU,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC;EACtD,IAAI,MAAM,aAAa,EAAE,GAAG,aAAa,EAAE,CAAC;CAC9C,IACA,QAAO;EACL,IAAI,cAAc,WAAW,IAAK,IAAK,GAAG,GAAG,MAAM,CAAC;EACpD,IAAI,UAAU,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAAC;EACxD,IAAI,MAAM,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC;CAChD,CACF;CAEA,MAAM,UAAU,MAAc,eAAe,IAAI,CAAC;CAClD,OAAO,IACL,gBAAgB,QAAQ,MAAM,UAAU,MAAM,GAC9C,iBAAiB,KAAK,SAAS,QAAQ,IAAI,KAAK,GAAG,UAAU,MAAM,GACnE,aAAa,GAAG,UAAU,MAAM,GAChC,cAAc,OAAO,UAAU,MAAM,GACrC,MAAM,GAAG,UAAU,MAAM,CAC3B;CAEA,cAAc;AAChB;;;;;;;;;AChCA,UAAiB,kBACf,MACA,WAAW,IACM;CACjB,MAAM,QAAQ,SAAS,EAAE,YAAY,EAAE,IAAI,KAAK,IAAI;CAEpD,MAAM,kBAAkB,QAAQ,aAC9B,KAAK,SAAS,QAAQ,IAAI,KAAK,CACjC;CACA,MAAM,eAAe,QAAQ,aAAa,KAAK;CAC/C,MAAM,mBAAmB,QAAQ,aAAa,CAAC;CAC/C,MAAM,gBAAgB,QAAQ,aAAa,CAAC;CAC5C,MAAM,QAAQ,aAAa,CAAC;CAE5B,MAAM,gBAAgB,eACpB,QAAO;EACL,IAAI,cAAc,WAAW,IAAK,IAAK,GAAG,GAAG,MAAM,CAAC;EACpD,IAAI,UAAU,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC;EACtD,IAAI,MAAM,aAAa,EAAE,GAAG,aAAa,EAAE,CAAC;CAC9C,IACA,QAAO;EACL,IAAI,cAAc,WAAW,IAAK,IAAK,GAAG,GAAG,MAAM,CAAC;EACpD,IAAI,UAAU,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAAC;EACxD,IAAI,MAAM,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC;CAChD,CACF;CAEA,MAAM,UAAU,MAAc,eAAe,KAAK,KAAK,CAAC,CAAC;CACzD,OAAO,IACL,gBAAgB,QAAQ,MAAM,UAAU,MAAM,GAC9C,iBAAiB,KAAK,UAAU,UAAU,MAAM,GAChD,aAAa,GAAG,UAAU,MAAM,GAChC,cAAc,QAAQ,IAAI,IAAI,KAAK,GAAG,UAAU,MAAM,GACtD,MAAM,GAAG,UAAU,MAAM,CAC3B;CAEA,cAAc;AAChB"}
|