@muze-labs/simplyflow 0.9.0 → 0.10.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/state.mjs", "../src/symbols.mjs", "../src/bind.transformers.mjs", "../src/dom.mjs", "../src/bind.render.mjs", "../src/bind.mjs", "../src/model.mjs", "../src/render.mjs", "../src/suggest.mjs", "../src/route.mjs", "../src/path.mjs", "../src/command.mjs", "../src/action.mjs", "../src/shortcut.mjs", "../src/behavior.mjs", "../src/include.mjs", "../src/app.mjs", "../src/highlight.mjs", "../src/flow.mjs"],
4
- "sourcesContent": ["import { DEP } from './symbols.mjs'\n\nconst MAP_READS_KEY = new Set(['get', 'has'])\nconst MAP_READS_ITERATION = new Set(['keys', 'values', 'entries', 'forEach', Symbol.iterator])\nconst MAP_WRITES = new Set(['set', 'delete', 'clear'])\nconst SET_WRITES = new Set(['add', 'delete', 'clear'])\nconst SET_ITERATION_PROPERTIES = {\n entries: {},\n forEach: {},\n has: {},\n keys: {},\n values: {},\n [Symbol.iterator]: {}\n}\n\nfunction isObjectLike(value) {\n return value !== null && (typeof value === 'object' || typeof value === 'function')\n}\n\n/**\n * Returns true when value is a SimplyFlow signal proxy.\n *\n * @param {*} value Value to inspect.\n * @returns {boolean} True if value is a signal proxy, otherwise false.\n * @throws {never} Does not intentionally throw.\n */\nexport function isSignal(value) {\n return Boolean(isObjectLike(value) && value[DEP.SIGNAL])\n}\n\n/**\n * Returns the raw target for a signal, or value unchanged when it is not a signal.\n *\n * @param {*} value Signal or ordinary value.\n * @returns {*} The signal target, or the original value.\n * @throws {never} Does not intentionally throw.\n */\nexport function raw(value) {\n return isSignal(value) ? value[DEP.XRAY] : value\n}\n\n/**\n * Returns the existing signal proxy for value, if one has been registered.\n *\n * @param {*} value Raw target or signal proxy.\n * @returns {*} The existing signal proxy, the same signal when value is already a signal, or undefined.\n * @throws {never} Does not intentionally throw.\n */\nexport function getSignal(value) {\n return isSignal(value) ? value : signals.get(value)\n}\n\nfunction targetSignal(target) {\n return signals.get(target)\n}\n\nfunction readTarget(target, property) {\n // Reflect.get() uses the proxy as the receiver for accessors. That breaks\n // native Map/Set size getters and class getters that rely on private fields.\n return target?.[property]\n}\n\nfunction bindMethod(target, receiver, value) {\n if (\n target instanceof HTMLElement\n || target instanceof Number\n || target instanceof String\n || target instanceof Boolean\n ) {\n return value.bind(target)\n }\n\n // For user-defined classes, bind to the signal so method bodies remain\n // reactive when they read or write public properties through `this`.\n return value.bind(receiver)\n}\n\nfunction collectRemovedArrayValues(target, nextLength) {\n const values = new Map()\n if (!Array.isArray(target) || nextLength >= target.length) {\n return values\n }\n\n for (let index = nextLength; index < target.length; index++) {\n if (Object.hasOwn(target, index)) {\n values.set(index, target[index])\n }\n }\n return values\n}\n\nfunction addArrayLengthChanges(context, target, oldLength, removedValues = new Map()) {\n if (!Array.isArray(target) || oldLength === target.length) {\n return\n }\n\n context.set(DEP.LENGTH, { was: oldLength, now: target.length })\n context.set(DEP.ITERATE, {})\n\n // Directly shrinking .length deletes indexes without going through the\n // proxy's delete trap. Notify listeners of those indexes explicitly.\n for (const [index, oldValue] of removedValues) {\n context.set(String(index), { delete: true, was: oldValue, now: undefined })\n }\n}\n\nfunction notifyContext(receiver, context) {\n if (context.size) {\n notifySet(receiver, context)\n }\n}\n\nfunction wrapArrayMethod(target, property, receiver, value) {\n return (...args) => {\n const oldLength = target.length\n\n // Native array methods must run with the proxy as `this`. That lets\n // their internal get/set/delete operations pass through the proxy traps.\n const result = value.apply(receiver, args)\n\n if (oldLength !== target.length) {\n notifySet(receiver, makeContext(DEP.LENGTH, { was: oldLength, now: target.length }))\n }\n return result\n }\n}\n\nfunction addMapWriteChanges(context, target, property, args, oldSize) {\n if (property === 'set') {\n const [key, nextValue] = args\n const hadKey = target.has(key)\n const oldValue = target.get(key)\n\n return () => {\n if (!hadKey || !Object.is(oldValue, nextValue)) {\n context.set(key, { was: oldValue, now: nextValue })\n // Existing value changes affect values(), entries(), forEach()\n // and direct iteration. The current dependency model uses one\n // iteration token, so keys() listeners are also conservatively\n // notified until Map iteration dependencies are split further.\n context.set(DEP.ITERATE, {})\n }\n if (!hadKey) {\n context.set(DEP.SIZE, { was: oldSize, now: target.size })\n }\n }\n }\n\n if (property === 'delete') {\n const [key] = args\n const hadKey = target.has(key)\n const oldValue = target.get(key)\n\n return () => {\n if (hadKey) {\n context.set(key, { delete: true, was: oldValue, now: undefined })\n context.set(DEP.SIZE, { was: oldSize, now: target.size })\n context.set(DEP.ITERATE, {})\n }\n }\n }\n\n if (property === 'clear') {\n const oldEntries = oldSize ? Array.from(target.entries()) : []\n\n return () => {\n if (oldEntries.length) {\n for (const [key, oldValue] of oldEntries) {\n context.set(key, { delete: true, was: oldValue, now: undefined })\n }\n context.set(DEP.SIZE, { was: oldSize, now: target.size })\n context.set(DEP.ITERATE, {})\n }\n }\n }\n\n return () => {}\n}\n\nfunction wrapMapMethod(target, property, receiver, value) {\n return (...args) => {\n if (MAP_READS_KEY.has(property)) {\n notifyGet(receiver, args[0])\n }\n if (MAP_READS_ITERATION.has(property)) {\n notifyGet(receiver, DEP.ITERATE)\n }\n\n const oldSize = target.size\n const context = new Map()\n const addChanges = MAP_WRITES.has(property)\n ? addMapWriteChanges(context, target, property, args, oldSize)\n : () => {}\n const result = value.apply(target, args)\n\n addChanges()\n notifyContext(receiver, context)\n return result\n }\n}\n\nfunction addSetWriteChanges(context, target, property, args, oldSize) {\n const [value] = args\n const hadValue = property === 'add' || property === 'delete'\n ? target.has(value)\n : false\n\n return () => {\n const changed = property === 'clear'\n ? oldSize > 0\n : target.size !== oldSize || (property === 'delete' && hadValue)\n\n if (!changed) {\n return\n }\n\n context.set(DEP.SIZE, { was: oldSize, now: target.size })\n\n // Set.has(value) currently tracks at method level rather than per value.\n // Notify all Set read methods after real writes so this remains correct,\n // but suppress add(existing), delete(missing), and clear(empty).\n for (const prop of Reflect.ownKeys(SET_ITERATION_PROPERTIES)) {\n context.set(prop, {})\n }\n }\n}\n\nfunction wrapSetMethod(target, property, receiver, value) {\n return (...args) => {\n const oldSize = target.size\n const context = new Map()\n const addChanges = SET_WRITES.has(property)\n ? addSetWriteChanges(context, target, property, args, oldSize)\n : () => {}\n const result = value.apply(target, args)\n\n addChanges()\n notifyContext(receiver, context)\n return result\n }\n}\n\nfunction propertyValueChanged(descriptor, oldDescriptor, oldValue, newDescriptor, newValue) {\n return (\n (Object.hasOwn(descriptor, 'value') && !Object.is(oldValue, newValue))\n || (Object.hasOwn(descriptor, 'get') && oldDescriptor?.get !== newDescriptor?.get)\n || (Object.hasOwn(descriptor, 'set') && oldDescriptor?.set !== newDescriptor?.set)\n )\n}\n\nconst signalHandler = {\n get(target, property, receiver) {\n const value = readTarget(target, property)\n notifyGet(receiver, property)\n\n if (typeof value === 'function') {\n if (Array.isArray(target)) {\n return wrapArrayMethod(target, property, receiver, value)\n }\n if (target instanceof Map) {\n return wrapMapMethod(target, property, receiver, value)\n }\n if (target instanceof Set) {\n return wrapSetMethod(target, property, receiver, value)\n }\n return bindMethod(target, receiver, value)\n }\n\n return isObjectLike(value) ? signal(value) : value\n },\n\n set(target, property, value, receiver) {\n const hadOwn = Object.hasOwn(target, property)\n const oldLength = Array.isArray(target) ? target.length : undefined\n const removedValues = property === DEP.LENGTH\n ? collectRemovedArrayValues(target, Number(value))\n : new Map()\n const oldValue = target[property]\n\n target[property] = value\n\n const hasOwn = Object.hasOwn(target, property)\n const newValue = target[property]\n const context = new Map()\n\n if (!Object.is(oldValue, newValue) || (!hadOwn && hasOwn)) {\n context.set(property, { was: oldValue, now: newValue })\n }\n if (!hadOwn && hasOwn) {\n context.set(DEP.ITERATE, {})\n }\n\n addArrayLengthChanges(context, target, oldLength, removedValues)\n notifyContext(receiver, context)\n return true\n },\n\n has(target, property) {\n // The has trap has no receiver argument. Look up the stable proxy so\n // `property in signal` can still be tracked reactively.\n const receiver = targetSignal(target)\n if (receiver) {\n notifyGet(receiver, property)\n }\n return Reflect.has(target, property)\n },\n\n deleteProperty(target, property) {\n const hadOwn = Object.hasOwn(target, property)\n if (!hadOwn) {\n return true\n }\n\n const oldValue = target[property]\n const oldLength = Array.isArray(target) ? target.length : undefined\n const result = Reflect.deleteProperty(target, property)\n if (!result) {\n return result\n }\n\n const receiver = targetSignal(target)\n const context = makeContext(property, { delete: true, was: oldValue, now: undefined })\n context.set(DEP.ITERATE, { delete: true, property })\n addArrayLengthChanges(context, target, oldLength)\n notifySet(receiver, context)\n return result\n },\n\n defineProperty(target, property, descriptor) {\n const hadOwn = Object.hasOwn(target, property)\n const oldDescriptor = Object.getOwnPropertyDescriptor(target, property)\n const oldValue = target[property]\n const oldLength = Array.isArray(target) ? target.length : undefined\n const removedValues = property === DEP.LENGTH && Object.hasOwn(descriptor, 'value')\n ? collectRemovedArrayValues(target, Number(descriptor.value))\n : new Map()\n\n const result = Reflect.defineProperty(target, property, descriptor)\n if (!result) {\n return result\n }\n\n const hasOwn = Object.hasOwn(target, property)\n const newDescriptor = Object.getOwnPropertyDescriptor(target, property)\n const newValue = target[property]\n const context = new Map()\n\n if (!hadOwn && hasOwn) {\n context.set(property, { was: oldValue, now: newValue })\n context.set(DEP.ITERATE, {})\n } else if (hadOwn && hasOwn) {\n if (propertyValueChanged(descriptor, oldDescriptor, oldValue, newDescriptor, newValue)) {\n context.set(property, { was: oldValue, now: newValue })\n }\n if (oldDescriptor?.enumerable !== newDescriptor?.enumerable) {\n context.set(DEP.ITERATE, {})\n }\n }\n\n addArrayLengthChanges(context, target, oldLength, removedValues)\n notifyContext(targetSignal(target), context)\n return result\n },\n\n ownKeys(target) {\n const receiver = targetSignal(target)\n notifyGet(receiver, DEP.ITERATE)\n return Reflect.ownKeys(target)\n }\n}\n\n/**\n * Low-level registry for signal proxies and effect result signals.\n *\n * @type {WeakMap<object|Function, Proxy>}\n * @returns {WeakMap<object|Function, Proxy>} Maps raw targets to signals, and effect functions to result signals.\n * @throws {never} Reading this property does not throw.\n * @deprecated Prefer createSignal(), getSignal(), registerSignal(), isSignal(), and raw().\n */\nexport const signals = new WeakMap()\n\nfunction assertSignalTarget(value, name) {\n if (!isObjectLike(value)) {\n throw new TypeError(\n `simplyflow/state: ${name}() expects an object, array, Map, Set, class instance, function, or DOM node; received ${typeof value}`\n )\n }\n}\n\nfunction assertProxyHandler(handler, name) {\n if (!handler || typeof handler !== 'object') {\n throw new TypeError(`simplyflow/state: ${name}() expects a Proxy handler object`)\n }\n}\n\nfunction signalProxyHandler(handler) {\n // All signal implementations must answer these two private symbol reads in\n // the same way. Keeping that boilerplate here lets custom signal handlers\n // focus on their own get/set/observe behavior.\n return {\n ...handler,\n get(target, property, receiver) {\n if (property === DEP.XRAY) {\n return target\n }\n if (property === DEP.SIGNAL) {\n return true\n }\n if (handler.get) {\n return handler.get(target, property, receiver)\n }\n return readTarget(target, property)\n }\n }\n}\n\n/**\n * Registers a custom signal proxy for a raw target.\n *\n * @param {object|Function} target Raw object, function, class instance, collection, or DOM node to register.\n * @param {Proxy} proxy Signal proxy that represents target.\n * @returns {Proxy} The registered proxy.\n * @throws {TypeError} If target is not object-like or proxy is not a signal.\n * @throws {Error} If target is already registered with a different signal.\n */\nexport function registerSignal(target, proxy) {\n const rawTarget = raw(target)\n assertSignalTarget(rawTarget, 'registerSignal')\n\n if (!isSignal(proxy)) {\n throw new TypeError('simplyflow/state: registerSignal() expects a signal proxy')\n }\n\n const existing = signals.get(rawTarget)\n if (existing && existing !== proxy) {\n throw new Error('simplyflow/state: registerSignal() target already has a different signal')\n }\n\n signals.set(rawTarget, proxy)\n return proxy\n}\n\n/**\n * Creates or returns a signal proxy using a custom Proxy handler.\n *\n * @param {object|Function} target Raw object, function, class instance, collection, or DOM node to wrap.\n * @param {ProxyHandler<object>} [handler={}] Custom proxy traps for the signal.\n * @param {Function} [init] Optional initializer called once with (target, proxy).\n * @returns {Proxy} Existing or newly created signal proxy for target.\n * @throws {TypeError} If target is not object-like, handler is not an object, or init is not a function.\n * @throws {*} Re-throws errors from init.\n */\nexport function createSignal(target, handler = {}, init) {\n assertSignalTarget(target, 'createSignal')\n assertProxyHandler(handler, 'createSignal')\n if (init !== undefined && typeof init !== 'function') {\n throw new TypeError('simplyflow/state: createSignal() expects init to be a function')\n }\n\n if (isSignal(target)) {\n return target\n }\n\n const existing = getSignal(target)\n if (existing) {\n return existing\n }\n\n const proxy = new Proxy(target, signalProxyHandler(handler))\n registerSignal(target, proxy)\n init?.(target, proxy)\n return proxy\n}\n\n/**\n * Creates a transparent reactive proxy for an object, collection, class instance, DOM node, or function.\n *\n * @param {object|Function} [value={}] Target to wrap.\n * @returns {Proxy} Existing or newly created signal proxy for value.\n * @throws {TypeError} If value is not object-like.\n */\nexport function signal(value = {}) {\n if (!isObjectLike(value)) {\n throw new TypeError(\n `simplyflow/state: signal() expects an object, array, Map, Set, class instance, or function; received ${typeof value}`\n )\n }\n return createSignal(value, signalHandler)\n}\n\nlet tracers = []\nlet tracing = false\n\n/**\n * Runs a traced function, or returns effects currently depending on a signal property.\n *\n * @param {Function|Proxy} target Function to run with tracing enabled, or signal to inspect.\n * @param {string|symbol|number} [prop] Signal property whose listeners should be returned.\n * @returns {*} Result of target() for traced functions, or an array of listener descriptions.\n * @throws {TypeError} If inspecting listeners and target is not a signal.\n * @throws {*} Re-throws errors from target() when tracing a function.\n */\nexport function trace(target, prop) {\n if (typeof target === 'function') {\n tracing = true\n try {\n return target()\n } finally {\n tracing = false\n }\n }\n\n if (!isSignal(target)) {\n throw new TypeError('simplyflow/state: trace() expects either a function or a signal')\n }\n\n return getListeners(target, prop).map(listener => ({\n effect: listener.effectType,\n fn: listener.effectFunction,\n signal: signals.get(listener.effectFunction)\n }))\n}\n\n/**\n * Adds an observer for dependency tracking events emitted inside trace(fn).\n *\n * @param {{get?: Function, set?: Function}} tracer Object with get and/or set callback functions.\n * @returns {void}\n * @throws {TypeError} If tracer is not an object.\n * @throws {Error} If tracer has no callbacks, or if a provided callback is not a function.\n */\nexport function addTracer(tracer) {\n if (!tracer || typeof tracer !== 'object') {\n throw new TypeError('simplyflow/state: addTracer() expects a tracer object')\n }\n if (!tracer.get && !tracer.set) {\n throw new Error('simplyflow/state: addTracer: missing \"get\" or \"set\" property in tracer')\n }\n if (tracer.get && typeof tracer.get !== 'function') {\n throw new Error('simplyflow/state: addTracer: \"get\" is not a function')\n }\n if (tracer.set && typeof tracer.set !== 'function') {\n throw new Error('simplyflow/state: addTracer: \"set\" is not a function')\n }\n tracers.push(tracer)\n}\n\nfunction callTracers(kind, ...params) {\n for (const tracer of tracers) {\n tracer[kind]?.(...params)\n }\n}\n\nlet batchedListeners = new Set()\nlet batchDepth = 0\n\n/**\n * Triggers effects that depend on the changed signal properties in context.\n *\n * @param {Proxy} self Signal whose properties changed.\n * @param {Map<string|symbol|number, object>} [context=new Map()] Change map, usually created with makeContext().\n * @returns {void}\n * @throws {TypeError} If self is not a signal or context is not a Map.\n */\nexport function notifySet(self, context = new Map()) {\n if (!isSignal(self)) {\n throw new TypeError('simplyflow/state: notifySet() expects a signal as first argument')\n }\n if (!(context instanceof Map)) {\n throw new TypeError('simplyflow/state: notifySet() expects context to be a Map; use makeContext()')\n }\n\n const listeners = new Set()\n context.forEach((change, property) => {\n for (const listener of listenersFor(self, property)) {\n // Avoid makeContext() here: notifySet() is a hot path and this loop\n // can run once per changed property per listener. Writing directly\n // to the listener context keeps object/Map keys intact and avoids\n // creating a short-lived Map for every listener notification.\n addContextChange(listener, property, change)\n listeners.add(listener)\n }\n })\n\n if (!listeners.size) {\n return\n }\n\n if (batchDepth) {\n for (const listener of listeners) {\n batchedListeners.add(listener)\n }\n return\n }\n\n runListeners(listeners, self, context)\n}\n\n/**\n * Creates a normalized change context map for notifySet().\n *\n * @param {Map|object|string|symbol|number} property Property name, property-to-change object, or existing context Map.\n * @param {object} [change] Change metadata when property names a single changed property.\n * @returns {Map<string|symbol|number, object>} Normalized change context.\n * @throws {never} Does not intentionally throw.\n */\nexport function makeContext(property, change) {\n const context = new Map()\n\n if (property instanceof Map) {\n property.forEach((change, prop) => context.set(prop, change))\n return context\n }\n\n if (property !== null && typeof property === 'object') {\n for (const prop of Reflect.ownKeys(property)) {\n context.set(prop, property[prop])\n }\n } else {\n context.set(property, change)\n }\n return context\n}\n\nfunction addContextChange(listener, property, change) {\n if (!listener.context) {\n listener.context = new Map()\n }\n listener.context.set(property, change)\n listener.needsUpdate = true\n}\n\nfunction clearContext(listener) {\n delete listener.context\n delete listener.needsUpdate\n}\n\n/**\n * Records a dependency on self[property] for the currently running effect.\n *\n * @param {Proxy} self Signal being read.\n * @param {string|symbol|number} property Property being read.\n * @returns {void}\n * @throws {never} Does not intentionally throw.\n */\nexport function notifyGet(self, property) {\n const currentCompute = computeStack[computeStack.length - 1]\n if (!currentCompute || currentCompute.skipDependency?.(self, property)) {\n return\n }\n\n if (tracing && tracers.length) {\n callTracers('get', self, property)\n }\n setListeners(self, property, currentCompute)\n}\n\nconst listenersMap = new WeakMap()\nconst computeMap = new WeakMap()\n\nconst emptyListeners = new Set()\n\nfunction listenersFor(self, property) {\n return listenersMap.get(self)?.get(property) || emptyListeners\n}\n\nfunction getListeners(self, property) {\n return Array.from(listenersFor(self, property))\n}\n\nfunction setListeners(self, property, compute) {\n if (!listenersMap.has(self)) {\n listenersMap.set(self, new Map())\n }\n const listeners = listenersMap.get(self)\n if (!listeners.has(property)) {\n listeners.set(property, new Set())\n }\n listeners.get(property).add(compute)\n\n if (!computeMap.has(compute)) {\n computeMap.set(compute, new Map())\n }\n const dependencies = computeMap.get(compute)\n if (!dependencies.has(property)) {\n dependencies.set(property, new Set())\n }\n dependencies.get(property).add(self)\n}\n\nfunction clearListeners(compute) {\n const dependencies = computeMap.get(compute)\n if (!dependencies) {\n return\n }\n\n dependencies.forEach((signals, property) => {\n signals.forEach(signal => {\n const listeners = listenersMap.get(signal)\n listeners?.get(property)?.delete(compute)\n })\n })\n\n computeMap.delete(compute)\n}\n\nconst computeStack = []\nconst effectStack = []\nconst signalStack = []\nconst effectMap = new WeakMap()\n\nfunction assertFunction(fn, name) {\n if (typeof fn !== 'function') {\n throw new TypeError(`simplyflow/state: ${name}() expects a function`)\n }\n}\n\nfunction assertNotRecursive(fn) {\n if (effectStack.includes(fn)) {\n throw new Error('Recursive update() call', { cause: fn })\n }\n}\n\nfunction effectSignal(fn) {\n let connectedSignal = signals.get(fn)\n if (!connectedSignal) {\n connectedSignal = signal({ current: null })\n signals.set(fn, connectedSignal)\n }\n return connectedSignal\n}\n\nfunction setEffectResult(connectedSignal, result) {\n if (result instanceof Promise) {\n result.then(value => {\n connectedSignal.current = value\n })\n } else {\n connectedSignal.current = result\n }\n}\n\nfunction runTracked(compute, connectedSignal, fn, effectType, args = [compute, computeStack, signalStack]) {\n if (signalStack.includes(connectedSignal)) {\n throw new Error('Cyclical dependency in update() call', { cause: fn })\n }\n\n clearListeners(compute)\n compute.effectFunction = fn\n compute.effectType = effectType\n computeStack.push(compute)\n signalStack.push(connectedSignal)\n\n let result\n try {\n result = fn(...args)\n } finally {\n computeStack.pop()\n signalStack.pop()\n setEffectResult(connectedSignal, result)\n }\n}\n\nfunction runListeners(listeners, signal, context) {\n const currentEffect = computeStack[computeStack.length - 1]\n\n for (const listener of listeners) {\n if (listener !== currentEffect && listener?.needsUpdate) {\n if (listener.scheduleClock) {\n listener.scheduleClock()\n } else {\n if (signal && tracing && tracers.length) {\n callTracers('set', signal, context, listener)\n }\n listener()\n }\n }\n clearContext(listener)\n }\n}\n\n/**\n * Runs fn immediately and reruns it synchronously when any signal property it reads changes.\n *\n * @param {Function} fn Effect function to run and track.\n * @returns {Proxy} Signal whose current property contains the latest effect result.\n * @throws {TypeError} If fn is not a function.\n * @throws {Error} If fn is already running recursively or creates a cyclic dependency.\n * @throws {*} Re-throws errors from fn during the initial run.\n */\nexport function effect(fn) {\n assertFunction(fn, 'effect')\n assertNotRecursive(fn)\n effectStack.push(fn)\n\n const connectedSignal = effectSignal(fn)\n const compute = function computeEffect() {\n runTracked(compute, connectedSignal, fn, effect)\n }\n compute.fn = fn\n effectMap.set(connectedSignal, compute)\n\n compute()\n return connectedSignal\n}\n\n/**\n * Stops an effect, clears its dependencies, and releases its reusable function mapping.\n *\n * @param {Proxy} connectedSignal Signal returned by effect(), throttledEffect(), or clockEffect().\n * @returns {void}\n * @throws {TypeError} If connectedSignal is not a signal.\n */\nexport function destroy(connectedSignal) {\n if (!isSignal(connectedSignal)) {\n throw new TypeError('simplyflow/state: destroy() expects an effect signal')\n }\n\n const compute = effectMap.get(connectedSignal)\n if (!compute) {\n return\n }\n\n compute.destroy?.()\n clearListeners(compute)\n\n if (compute.fn) {\n signals.delete(compute.fn)\n const index = effectStack.findIndex(fn => fn === compute.fn)\n if (index !== -1) {\n effectStack.splice(index, 1)\n }\n }\n\n effectMap.delete(connectedSignal)\n}\n\n/**\n * Runs fn while deferring effect execution until the outermost batch finishes.\n *\n * @param {Function} fn Function to run inside the batch.\n * @returns {*} The value returned by fn.\n * @throws {TypeError} If fn is not a function.\n * @throws {*} Re-throws errors from fn.\n */\nexport function batch(fn) {\n assertFunction(fn, 'batch')\n batchDepth++\n\n let result\n try {\n result = fn()\n } finally {\n const finish = () => {\n batchDepth--\n if (!batchDepth) {\n runBatchedListeners()\n }\n }\n\n if (result instanceof Promise) {\n result.then(finish, finish)\n } else {\n finish()\n }\n }\n return result\n}\n\nfunction runBatchedListeners() {\n const listeners = batchedListeners\n batchedListeners = new Set()\n\n // Batched clocked dependency changes must be marked before clock ticks are\n // flushed. Otherwise batch(() => { clock.time++; source.value++ }) would see\n // the tick first and leave the source change pending until the next tick.\n const clocked = new Set()\n const ready = new Set()\n for (const listener of listeners) {\n if (listener.scheduleClock) {\n clocked.add(listener)\n } else {\n ready.add(listener)\n }\n }\n\n runListeners(clocked)\n runListeners(ready)\n}\n\n/**\n * Runs fn as an effect, throttling reruns to at most once per throttleTime milliseconds.\n *\n * @param {Function} fn Effect function to run and track.\n * @param {number} throttleTime Minimum time in milliseconds between reruns after the initial run.\n * @returns {Proxy} Signal whose current property contains the latest effect result.\n * @throws {TypeError} If fn is not a function or throttleTime is not a non-negative finite number.\n * @throws {Error} If fn is already running recursively or creates a cyclic dependency.\n * @throws {*} Re-throws errors from fn during the initial run.\n */\nexport function throttledEffect(fn, throttleTime) {\n assertFunction(fn, 'throttledEffect')\n if (!Number.isFinite(throttleTime) || throttleTime < 0) {\n throw new TypeError('simplyflow/state: throttledEffect() expects throttleTime to be a non-negative number')\n }\n assertNotRecursive(fn)\n effectStack.push(fn)\n\n const connectedSignal = effectSignal(fn)\n let throttledUntil = 0\n let hasChange = true\n let timeout = null\n\n const compute = function computeEffect() {\n const now = Date.now()\n if (throttledUntil > now) {\n hasChange = true\n schedule()\n return\n }\n\n runTracked(compute, connectedSignal, fn, throttledEffect)\n hasChange = false\n throttledUntil = Date.now() + throttleTime\n schedule()\n }\n\n function schedule() {\n if (timeout) {\n return\n }\n\n const delay = Math.max(0, throttledUntil - Date.now())\n timeout = globalThis.setTimeout(() => {\n timeout = null\n if (hasChange) {\n compute()\n }\n }, delay)\n }\n\n compute.fn = fn\n compute.destroy = () => {\n if (timeout) {\n globalThis.clearTimeout(timeout)\n timeout = null\n }\n hasChange = false\n }\n effectMap.set(connectedSignal, compute)\n\n compute()\n return connectedSignal\n}\n\nconst clockQueues = new WeakMap()\n\nfunction readClockTime(clock) {\n return raw(clock).time\n}\n\nfunction getClockQueue(clock) {\n if (!clockQueues.has(clock)) {\n const queue = {\n clock,\n effects: new Set(),\n pending: new Set(),\n time: readClockTime(clock)\n }\n\n // A clock has exactly one listener on `.time`. Ordinary dependency\n // changes add clock effects to `pending`; the shared tick listener only\n // flushes that pending set after time increases. This avoids waking every\n // clockEffect on every clock tick just to discover most of them have no\n // pending changes.\n queue.tick = function tickClockEffects() {\n const time = readClockTime(clock)\n if (time <= queue.time) {\n return\n }\n\n queue.time = time\n const pending = Array.from(queue.pending)\n queue.pending.clear()\n\n for (const compute of pending) {\n compute.clockPending = false\n if (queue.effects.has(compute)) {\n compute()\n }\n }\n }\n queue.tick.effectFunction = queue.tick\n queue.tick.effectType = clockEffect\n setListeners(clock, 'time', queue.tick)\n clockQueues.set(clock, queue)\n }\n\n return clockQueues.get(clock)\n}\n\nfunction detachClockEffect(compute) {\n const queue = compute.clockQueue\n if (!queue) {\n return\n }\n\n queue.pending.delete(compute)\n queue.effects.delete(compute)\n if (!queue.effects.size) {\n clearListeners(queue.tick)\n clockQueues.delete(queue.clock)\n }\n}\n\n/**\n * Tracks fn like an effect, but recomputes only after clock.time advances.\n *\n * @param {Function} fn Effect function to run and track.\n * @param {{time: number}} clock Clock object controlling when pending changes recompute.\n * @returns {Proxy} Signal whose current property contains the latest effect result.\n * @throws {TypeError} If fn is not a function or clock lacks a numeric time property.\n * @throws {*} Re-throws errors from fn during the initial run.\n */\nexport function clockEffect(fn, clock) {\n assertFunction(fn, 'clockEffect')\n if (!clock || typeof clock !== 'object' || typeof raw(clock).time !== 'number') {\n throw new TypeError('simplyflow/state: clockEffect() expects a clock object with a numeric .time property')\n }\n\n const clockSignal = isSignal(clock) ? clock : signal(raw(clock))\n const connectedSignal = effectSignal(fn)\n const queue = getClockQueue(clockSignal)\n\n const compute = function computeEffect() {\n clearListeners(compute)\n compute.effectFunction = fn\n compute.effectType = clockEffect\n computeStack.push(compute)\n\n let result\n try {\n result = fn(compute, computeStack)\n } finally {\n computeStack.pop()\n setEffectResult(connectedSignal, result)\n }\n }\n\n compute.fn = fn\n compute.clockQueue = queue\n compute.skipDependency = (self, property) => self === clockSignal && property === 'time'\n compute.scheduleClock = () => {\n if (!compute.clockPending) {\n compute.clockPending = true\n queue.pending.add(compute)\n }\n }\n compute.destroy = () => detachClockEffect(compute)\n\n queue.effects.add(compute)\n effectMap.set(connectedSignal, compute)\n\n compute()\n return connectedSignal\n}\n\n/**\n * Runs fn without recording signal reads as dependencies for the current effect.\n *\n * @param {Function} fn Function to run without dependency tracking.\n * @returns {*} The value returned by fn.\n * @throws {TypeError} If fn is not a function.\n * @throws {*} Re-throws errors from fn.\n */\nexport function untracked(fn) {\n assertFunction(fn, 'untracked')\n const index = computeStack.length - 1\n const current = computeStack[index]\n computeStack[index] = false\n try {\n return fn()\n } finally {\n computeStack[index] = current\n }\n}\n\nfunction cloneOptions(options) {\n if (typeof options === 'boolean') {\n return { deep: options }\n }\n if (options === undefined) {\n return { deep: true }\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('simplyflow/state: clone() expects options to be a boolean or object')\n }\n return { deep: options.deep !== false }\n}\n\nfunction typeName(value) {\n return value?.constructor?.name || Object.prototype.toString.call(value).slice(8, -1)\n}\n\nfunction isPlainObject(value) {\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction isTypedArray(value) {\n return ArrayBuffer.isView(value) && !(value instanceof DataView)\n}\n\nfunction isIntegerKey(property) {\n if (typeof property !== 'string' || property === '') {\n return false\n }\n const index = Number(property)\n return Number.isInteger(index) && index >= 0 && String(index) === property\n}\n\nfunction hasToClone(value) {\n return typeof value.toClone === 'function'\n}\n\nfunction cannotClone(value, path) {\n throw new TypeError(\n `simplyflow/state: clone() cannot clone ${typeName(value)} at ${path}; add a toClone() method for custom objects`\n )\n}\n\nfunction cloneDescriptorProperties(source, result, cloneValue, skip = () => false) {\n const descriptors = Object.getOwnPropertyDescriptors(source)\n\n for (const key of Reflect.ownKeys(descriptors)) {\n if (skip(key)) {\n delete descriptors[key]\n continue\n }\n\n const descriptor = descriptors[key]\n // Accessor descriptors may hide state in closures or private fields.\n // Copying the accessor would not necessarily create an independent clone,\n // and reading it would execute user code. Custom objects that need this\n // should expose toClone() so they control how hidden state is copied.\n if (!Object.hasOwn(descriptor, 'value')) {\n cannotClone(source, String(key))\n }\n descriptor.value = cloneValue(descriptor.value, String(key))\n }\n\n Object.defineProperties(result, descriptors)\n return result\n}\n\nfunction cloneArrayBuffer(value) {\n return value.slice(0)\n}\n\nfunction cloneSharedArrayBuffer(value) {\n const result = new SharedArrayBuffer(value.byteLength)\n new Uint8Array(result).set(new Uint8Array(value))\n return result\n}\n\nfunction cloneErrorObject(value, cloneValue, path) {\n const standardErrors = new Set([\n Error,\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError,\n typeof AggregateError === 'undefined' ? undefined : AggregateError\n ])\n\n if (!standardErrors.has(value.constructor)) {\n cannotClone(value, path)\n }\n\n const options = Object.hasOwn(value, 'cause')\n ? { cause: cloneValue(value.cause, 'cause') }\n : undefined\n\n if (typeof AggregateError !== 'undefined' && value instanceof AggregateError) {\n const errors = Array.from(value.errors || [], (error, index) => cloneValue(error, `errors.${index}`))\n return new AggregateError(errors, value.message, options)\n }\n\n return new value.constructor(value.message, options)\n}\n\n/**\n * Creates a non-reactive clone of a value or signal target.\n *\n * Deep-clones by default so nested signal data is not shared with the source. Built-in cloneable objects use their\n * native representation. Custom objects must provide toClone(); otherwise clone() throws instead of returning a\n * shared reference or copying only public properties.\n *\n * @param {*} value Value or signal target to clone.\n * @param {boolean|{deep?: boolean}} [options] false or { deep: false } keeps legacy shallow top-level cloning.\n * @returns {*} Non-reactive clone of value.\n * @throws {TypeError} If options are invalid, an unsupported object is encountered, an accessor property is found, or toClone() returns the original object.\n * @throws {*} Re-throws errors from custom toClone() methods.\n */\nexport function clone(value, options) {\n const { deep } = cloneOptions(options)\n const seen = new Map()\n\n function cloneChild(value, path) {\n return deep ? cloneValue(value, path) : raw(value)\n }\n\n function cloneValue(value, path = 'value') {\n const source = raw(value)\n\n if (!isObjectLike(source)) {\n return source\n }\n if (seen.has(source)) {\n return seen.get(source)\n }\n if (hasToClone(source)) {\n const result = raw(source.toClone())\n if (Object.is(result, source)) {\n throw new TypeError(`simplyflow/state: clone() toClone() returned the original object at ${path}`)\n }\n seen.set(source, result)\n return result\n }\n\n if (Array.isArray(source)) {\n const result = new Array(source.length)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild, key => key === 'length')\n }\n\n if (isPlainObject(source)) {\n const result = Object.create(Object.getPrototypeOf(source))\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof Map) {\n const result = new Map()\n seen.set(source, result)\n source.forEach((mapValue, mapKey) => {\n result.set(cloneChild(mapKey, 'map key'), cloneChild(mapValue, 'map value'))\n })\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof Set) {\n const result = new Set()\n seen.set(source, result)\n source.forEach(setValue => result.add(cloneChild(setValue, 'set value')))\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof Date) {\n const result = new Date(source.getTime())\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof RegExp) {\n const result = new RegExp(source.source, source.flags)\n result.lastIndex = source.lastIndex\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild, key => key === 'lastIndex')\n }\n\n if (source instanceof ArrayBuffer) {\n const result = cloneArrayBuffer(source)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' && source instanceof SharedArrayBuffer) {\n const result = cloneSharedArrayBuffer(source)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof DataView) {\n const buffer = source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength)\n const result = new DataView(buffer)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (isTypedArray(source)) {\n const result = new source.constructor(source)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild, isIntegerKey)\n }\n\n if (typeof URL !== 'undefined' && source instanceof URL) {\n const result = new URL(source.href)\n seen.set(source, result)\n // Browser and jsdom URL objects can store implementation details in\n // own symbol properties. Copying those would couple the clone back\n // to the original, so the URL constructor is the complete clone.\n return result\n }\n\n if (typeof URLSearchParams !== 'undefined' && source instanceof URLSearchParams) {\n const result = new URLSearchParams(source)\n seen.set(source, result)\n return result\n }\n\n if (typeof File !== 'undefined' && source instanceof File) {\n const result = new File([source], source.name, {\n type: source.type,\n lastModified: source.lastModified\n })\n seen.set(source, result)\n return result\n }\n\n if (typeof Blob !== 'undefined' && source instanceof Blob) {\n const result = source.slice(0, source.size, source.type)\n seen.set(source, result)\n return result\n }\n\n if (source instanceof Error) {\n const result = cloneErrorObject(source, cloneChild, path)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild, key => (\n key === 'message' || key === 'cause' || key === 'errors' || key === 'stack'\n ))\n }\n\n if (typeof Node !== 'undefined' && source instanceof Node && typeof source.cloneNode === 'function') {\n const result = source.cloneNode(deep)\n seen.set(source, result)\n return result\n }\n\n cannotClone(source, path)\n }\n\n return cloneValue(value)\n}\n", "export const DEP = {\n ITERATE: Symbol.for('@simplyedit/simplyflow.iterate'),\n XRAY: Symbol.for('@simplyedit/simplyflow.xRay'),\n SIGNAL: Symbol.for('@simplyedit/simplyflow.Signal'),\n TEMPLATE: Symbol.for('@simplyedit/simplyflow.bindTemplate'),\n VALUE: Symbol.for('@simplyedit/simplyflow.bindValue'),\n LENGTH: 'length',\n SIZE: 'size'\n}\n", "export function escape_html(context, next) {\n let content = context.value?.innerHTML\n if (typeof context.value == 'string') {\n content = context.value\n context.value = { innerHTML: content }\n }\n if (content) {\n content = content.replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n context.value.innerHTML = content\n }\n next(context)\n}\n\nexport function fixed_content(context, next) {\n if (typeof context.value == 'string') {\n context.value = {}\n } else {\n delete context.value?.innerHTML\n }\n next(context)\n}\n", "import { createSignal, getSignal, isSignal, signal as stateSignal, notifyGet, notifySet, makeContext,\n throttledEffect, untracked, batch } from './state.mjs'\nimport { getValueByPath } from './bind.mjs'\nimport { setValueByPath, getProperties } from './bind.render.mjs'\nimport { DEP } from './symbols.mjs'\n\n/**\n * Tracks element => signal mapping so that each element only has one signal\n */\nconst domSignals = new WeakMap()\n\n/**\n * Tracks element => mutationObservers\n */\nconst observers = new WeakMap()\n\n/**\n * A dom signal is a Proxy, to track access to properties\n */\nconst domSignalHandler = {\n get: (target, property, receiver) => {\n const value = target?.[property]\n notifyGet(receiver, property)\n if (typeof value === 'function') {\n return value.bind(target) // make sure element functions are not linked to the proxy\n }\n if (value && typeof value == 'object') {\n return stateSignal(value)\n }\n return value\n },\n set: (target, property, value, receiver) => {\n const current = target[property]\n target[property] = value\n const now = target[property]\n if (!Object.is(current, now)) {\n notifySet(receiver, makeContext(property, { was: current, now }))\n }\n return true\n },\n has: (target, property) => {\n const receiver = getSignal(target)\n if (receiver) {\n notifyGet(receiver, property)\n }\n return Reflect.has(target, property)\n },\n ownKeys: (target) => {\n // The ownKeys trap has no receiver argument. Recover the stable signal\n // proxy so Object.keys(domSignal) can track DOM key iteration.\n const receiver = getSignal(target)\n if (receiver) {\n notifyGet(receiver, DEP.ITERATE)\n }\n return Reflect.ownKeys(target)\n }\n}\n\n/**\n * This function returns a dom signal. Using this in an effect() function\n * will automatically trigger the effect if a property of the dom signal \n * changes.\n * Valid options are any of the mutationObserver options, like characterData, subtree, etc.\n * @param HTMLElement el\n * @param Object options\n * @returns Proxy\n */\nexport function signal(el, options) {\n if (isSignal(el)) {\n return el\n }\n\n const existing = getSignal(el)\n if (existing) {\n return existing\n }\n\n return createSignal(el, domSignalHandler, (target, proxy) => {\n domListen(target, proxy, options)\n })\n}\n\n/**\n * This sets up the mutationObserver that calls notifySet on changes in the DOM\n */\nfunction domListen(el, signal, options) {\n const defaultOptions = {\n characterData: true,\n subtree: true,\n attributes: true,\n attributesOldValue: true,\n childList: true\n }\n if (!options) {\n options = defaultOptions\n }\n let oldContentHTML = el.innerHTML\n let oldContentText = el.innerText\n if (!observers.has(el)) {\n const observer = new MutationObserver((mutationList, observer) => {\n // collect changes\n const changes = {}\n for (const mutation of mutationList) {\n if (mutation.type==='attributes') {\n // check if any listeners for each attribute\n changes[mutation.attributeName] = mutation.attributeOldValue\n } else if (mutation.type==='subtree' || mutation.type==='characterData') {\n // change on innerHTML/innerText\n if (el.innerHTML != oldContentHTML) {\n changes.innerHTML = oldContentHTML\n oldContentHTML = el.innerHTML\n }\n if (el.innerText != oldContentText) {\n changes.innerText = oldContentText\n oldContentText = el.innerText\n }\n } else if (mutation.type==='childList') {\n changes.children = { //FIXME: overwrites changes in this list path if list is rendered multiple times\n was: Array.from(el.children) //FIXME; fill in 'now'\n }\n changes.length = -1 //FIXME: don't do this :)\n if (el.innerHTML != oldContentHTML) {\n changes.innerHTML = oldContentHTML\n oldContentHTML = el.innerHTML\n }\n if (el.innerText != oldContentText) {\n changes.innerText = oldContentText\n oldContentText = el.innerText\n }\n } else {\n console.log('nothing to do for',el,mutation.type)\n }\n }\n for (const prop in changes) {\n notifySet(signal, makeContext(prop, { was: changes[prop], now: el[prop] }))\n }\n })\n observer.observe(el, options)\n observers.set(el, observer)\n //@TODO: unregister the observer when el is removed from the dom (after a timeout)\n if (el.matches('input, textarea, select')) {\n let prevValue = el.value\n let prevChecked = el.checked\n const notifyFormValue = () => {\n notifySet(signal, makeContext('value', { was: prevValue, now: el.value }))\n prevValue = el.value\n if ('checked' in el) {\n notifySet(signal, makeContext('checked', { was: prevChecked, now: el.checked }))\n prevChecked = el.checked\n }\n }\n el.addEventListener('change', notifyFormValue)\n if (el.matches('input, textarea')) {\n el.addEventListener('input', notifyFormValue)\n }\n }\n }\n}\n\n/**\n * This function sets up the dom signal on an element, provided it has a `data-flow-list` attribute\n * @param HTMLElement element - the element to track\n * @returns Proxy\n */\nexport function trackDomList(element)\n{\n const path = this.getBindingPath(element)\n if (!path) {\n throw new Error('Could not find binding path for element', { cause: element })\n }\n const s = signal(element, {\n childList: true\n })\n throttledEffect(() => {\n const children = Array.from(s.children)\n untracked(() => { // don't track access to the data, only track dom changes\n batch(() => { // apply all changes in the list as one change\n let key=0\n const currentList = getValueByPath(this.options.root, path)\n const source = currentList.slice() // make sure changes in currentList don't affect the original source\n for (const item of children) {\n if (item.tagName==='TEMPLATE') {\n continue\n }\n if (item.dataset.flowKey) { //FIXME: could be other attribute name\n if (item.dataset.flowKey!=key) {\n setValueByPath(this.options.root, path+'.'+key,\n source[item.dataset.flowKey])\n }\n key++\n }\n }\n if (currentList.length>key) {\n // remove extra values\n currentList.length = key\n }\n })\n })\n }, 50)\n return s\n}\n\n/**\n * This function sets up the dom signal on an element, provided it has a `data-flow-field` attribute\n * @param HTMLElement element - the element to track\n * @returns Proxy\n */\nexport function trackDomField(element, props, valueIsString, stringProperty = 'innerHTML', getUpdateValue) {\n if (domSignals.has(element)) {\n return\n }\n const path = this.getBindingPath(element)\n if (!path) {\n throw new Error('Could not find binding path for element', { cause: element })\n }\n const s = signal(element)\n domSignals.set(element, s)\n //TODO: run reverse transformers (extract)\n batch(() => { // avoids cyclical dependencies - check why\n throttledEffect(() => {\n let updateValue\n if (getUpdateValue) {\n // Custom edit extractors often need the current data value, for\n // example to toggle a checkbox value in an array. Read the DOM\n // properties here for dependency tracking, but read the data only\n // in the untracked section below to avoid DOM/data cycles.\n for (const prop of props) {\n s[prop]\n }\n } else {\n updateValue = s[stringProperty]\n if (!valueIsString) {\n updateValue = getProperties(s, ...props)\n }\n }\n untracked(() => { // don't track changes in data, only in the dom\n // Rendering a primitive value into the DOM usually turns it into\n // a string. Do not write that string straight back to the data\n // when it still represents the current value. This keeps numbers\n // and booleans stable after one-way rendering in a two-way bind.\n const currentValue = getValueByPath(this.options.root, path)\n if (getUpdateValue) {\n updateValue = getUpdateValue.call(this, s, currentValue)\n }\n if (typeof updateValue === 'undefined') {\n return\n }\n if (valueIsString && !Object.is(currentValue, updateValue) && String(currentValue) === updateValue) {\n return\n }\n // don't trigger this effect when the data changes (root.path)\n setValueByPath(this.options.root, path, updateValue)\n })\n }, 50)\n })\n return s\n}\n\n\n/**\n * Finds the closest ancestor, including `el` itself, that has `attr` and\n * returns that attribute value.\n *\n * This helper is used by the app/command layer and lives in this module so\n * DOM utility helpers shared by the app and binding layers.\n *\n * @param {Element} el - Element to start searching from.\n * @param {string} attr - Attribute name to find.\n * @returns {string|undefined} The attribute value, or undefined if not found.\n */\nexport function findAttribute(el, attr) {\n return el.closest('['+attr+']')\n ?.getAttribute(attr)\n}\n", "/*\n * Default renderers for data binding\n * Will be used unless overriden in the SimplyBind options parameter\n */\nimport { signal as domSignal, trackDomField, trackDomList } from './dom.mjs'\nimport { throttledEffect, effect, untracked, batch } from './state.mjs'\nimport { getValueByPath } from './bind.mjs'\nimport { DEP } from './symbols.mjs'\n\nfunction writesFromDom(binding, context)\n{\n return binding.options.twoway || context.edit\n}\n\n/**\n * This function is used by default to render dom elements with the `data-flow-field` attribute.\n * It will switch to only switching in template content if the context has any templates.\n * Otherwise it will call the matching render function depending on the tagName of the\n * context.element\n */\nexport function field(context)\n{\n if (context.templates?.length) {\n fieldByTemplates.call(this, context)\n // TODO: check if existence of one or more templates must mean that\n // only the template rendering is applied, instead of also rendering attributes\n } else if (Object.hasOwnProperty.call(this.options.renderers, context.element.tagName)) {\n const renderer = this.options.renderers[context.element.tagName]\n if (renderer) {\n renderer.call(this, context)\n }\n } else if (this.options.renderers['*']) {\n this.options.renderers['*'].call(this, context)\n }\n return context\n}\n\n/**\n * This function is used by default to render DOM elements with the `data-flow-list` attribute.\n * The context.value must be an array. And context.templates must not be empty.\n */\nexport function list(context)\n{\n if (!Array.isArray(context.value)) {\n context.value = [context.value]\n }\n // make sure this effect is triggered if the length of the array changes\n const length = context.value.length\n if (!context.templates?.length) {\n console.error('No templates found in', context.element)\n } else {\n arrayByTemplates.call(this, context)\n }\n return context\n}\n\n/**\n * This function is used by default to render DOM elements with the `data-flow-map` attribute.\n * The context.value must be a non-null object. And context.templates must not be empty.\n */\nexport function map(context)\n{\n if (typeof context.value != 'object' || !context.value) {\n console.error('Value is not an object.', context.element, context.path, context.value)\n } else if (!context.templates?.length) {\n console.error('No templates found in', context.element)\n } else {\n objectByTemplates.call(this, context)\n }\n return context\n}\n\nfunction isInt(s) {\n if (parseInt(s)==s) {\n return true\n }\n}\n\n/**\n * This function sets a given value on the given path, starting at the given root.\n * It will automatically create objects if a path part does not yet exist.\n * @param root the root object\n * @param path a JSON path\n * @param value the value to set\n */\nexport function setValueByPath(root, path, value)\n{\n batch(() => {\n let parts = path.split('.')\n let curr = root\n let part\n part = parts.shift()\n let prev = null\n let prevPart = null\n let prevCurr = curr\n while (part && curr) {\n prevCurr = curr\n part = decodeURIComponent(part)\n if (part=='0' && !Array.isArray(curr)) {\n // ignore so that data-flow-list=\"nonarray\" will work\n } else if (part==':key') {\n // FIXME: should change the key, not the value... not supported yet?\n throw new Error('setting key not yet supported')\n curr = prevPart\n } else if (part==':value') {\n // do nothing\n } else if (Array.isArray(curr) && !isInt(part) && typeof curr[part]=='undefined') {\n prev = curr[0]\n curr = curr[0][part] // so that data-flow-field=\"array.foo\" works\n } else {\n prev = curr\n curr = curr[part]\n }\n prevPart = part\n part = parts.shift()\n if (part && !curr) {\n // path in html does not exist yet, so create it\n const intKey = parseInt(part)\n if (intKey>=0 && part===''+intKey) {\n prevCurr[prevPart] = []\n } else {\n prevCurr[prevPart] = {}\n }\n curr = prevCurr[prevPart]\n }\n }\n if (prev && prevPart && prev[prevPart]!==value) {\n if (Array.isArray(value)) {\n prev[prevPart] = value\n } else if (value && typeof value=='object') {\n curr = prev[prevPart]\n if (!curr) {\n // last part of path in html does not exist yet, create it\n prev[prevPart] = {}\n curr = prev[prevPart]\n }\n for (const prop in value) {\n if (curr[prop]!==value[prop]) {\n curr[prop] = value[prop]\n }\n }\n } else {\n prev[prevPart] = value\n }\n }\n })\n}\n\n/**\n * Renders an array value by applying templates for each entry\n * Replaces or removes existing DOM children if needed\n * Reuses (doesn't touch) DOM children if template doesn't change\n * FIXME: this doesn't handle situations where there is no matching template\n * this messes up self healing. check renderObjectByTemplates for a better implementation\n */\nexport function arrayByTemplates(context)\n{\n const attribute = this.options.attribute\n const attributes = [attribute+'-field',attribute+'-edit',attribute+'-list',attribute+'-map',attribute+'-value-path']\n const attrQuery = '['+attributes.join('],[')+']'\n const keyAttribute = attribute+'-key'\n const items = Array.from(context.element.querySelectorAll(':scope > ['+keyAttribute+']'))\n const usedItems = new Set()\n let cursor = 0\n\n context.list = context.value\n\n for (let index = 0; index < context.value.length; index++) {\n context.index = index\n const value = context.list[index]\n let item = nextUnusedItem(items, usedItems, cursor)\n\n if (!item) {\n context.element.appendChild(this.applyTemplate(context))\n continue\n }\n\n const newTemplate = this.findTemplate(context.templates, value)\n const currentValueMatches = item[DEP.VALUE] === value\n let reusableItem = currentValueMatches\n ? item\n : findReusableItem(items, usedItems, value, newTemplate, cursor + 1)\n\n if (reusableItem) {\n if (newTemplate != reusableItem[DEP.TEMPLATE]) {\n context.element.replaceChild(this.applyTemplate(context), reusableItem)\n } else {\n context.element.insertBefore(reusableItem, item)\n updateItemKey(reusableItem, index, context.path, keyAttribute, attributes, attrQuery)\n reusableItem[DEP.VALUE] = value\n }\n usedItems.add(reusableItem)\n if (reusableItem === item) {\n cursor++\n }\n continue\n }\n\n context.element.insertBefore(this.applyTemplate(context), item)\n }\n\n for (let item of items) {\n if (!usedItems.has(item)) {\n item.remove()\n }\n }\n\n if (this.options.twoway) {\n trackDomList.call(this, context.element)\n }\n}\n\nfunction nextUnusedItem(items, usedItems, start)\n{\n while (start < items.length) {\n const item = items[start]\n if (!usedItems.has(item)) {\n return item\n }\n start++\n }\n}\n\nfunction findReusableItem(items, usedItems, value, template, start)\n{\n for (let i = start; i < items.length; i++) {\n const item = items[i]\n if (!usedItems.has(item) && item[DEP.VALUE] === value && item[DEP.TEMPLATE] === template) {\n return item\n }\n }\n}\n\n\nfunction updateItemKey(item, key, path, keyAttribute, attributes, attrQuery)\n{\n const oldKey = item.getAttribute(keyAttribute)\n const newKey = ''+key\n\n if (oldKey === newKey) {\n return\n }\n\n item.setAttribute(keyAttribute, newKey)\n\n const oldPrefix = path+'.'+oldKey\n const newPrefix = path+'.'+newKey\n const bindings = Array.from(item.querySelectorAll(attrQuery))\n if (item.matches(attrQuery)) {\n bindings.unshift(item)\n }\n\n for (let binding of bindings) {\n for (let attr of attributes) {\n const bindPath = binding.getAttribute(attr)\n if (!bindPath || bindPath.substr(0,5)===':root') {\n continue\n }\n if (bindPath === oldPrefix) {\n binding.setAttribute(attr, newPrefix)\n } else if (bindPath.startsWith(oldPrefix+'.')) {\n binding.setAttribute(attr, newPrefix+bindPath.substr(oldPrefix.length))\n }\n }\n }\n}\n\n/**\n * Renders an object value by applying templates for each entry (Object.entries)\n * Replaces,moves or removes existing DOM children if needed\n * Reuses (doesn't touch) DOM children if template doesn't change\n */\nexport function objectByTemplates(context)\n{\n const attribute = this.options.attribute\n const attributes = [attribute+'-field',attribute+'-edit',attribute+'-list',attribute+'-map',attribute+'-value-path']\n const attrQuery = '['+attributes.join('],[')+']'\n const keyAttribute = attribute+'-key'\n const items = Array.from(context.element.querySelectorAll(':scope > ['+keyAttribute+']'))\n const usedItems = new Set()\n let cursor = 0\n\n context.list = context.value\n\n for (let key in context.list) {\n context.index = key\n const value = context.list[key]\n let item = nextUnusedItem(items, usedItems, cursor)\n\n if (!item) {\n context.element.appendChild(this.applyTemplate(context))\n continue\n }\n\n const newTemplate = this.findTemplate(context.templates, value)\n let reusableItem\n\n if (item.getAttribute(keyAttribute) === key) {\n reusableItem = item\n } else {\n reusableItem = findItemByKey(items, usedItems, key, keyAttribute)\n || findReusableItem(items, usedItems, value, newTemplate, cursor)\n }\n\n if (reusableItem) {\n if (newTemplate != reusableItem[DEP.TEMPLATE]) {\n context.element.replaceChild(this.applyTemplate(context), reusableItem)\n } else {\n context.element.insertBefore(reusableItem, item)\n updateItemKey(reusableItem, key, context.path, keyAttribute, attributes, attrQuery)\n reusableItem[DEP.VALUE] = value\n }\n usedItems.add(reusableItem)\n if (reusableItem === item) {\n cursor++\n }\n continue\n }\n\n context.element.insertBefore(this.applyTemplate(context), item)\n }\n\n for (let item of items) {\n if (!usedItems.has(item)) {\n item.remove()\n }\n }\n}\n\nfunction findItemByKey(items, usedItems, key, keyAttribute)\n{\n const stringKey = ''+key\n for (let item of items) {\n if (!usedItems.has(item) && item.getAttribute(keyAttribute) === stringKey) {\n return item\n }\n }\n}\n\n/**\n * renders the contents of an html element by rendering\n * a matching template, once.\n */\nexport function fieldByTemplates(context)\n{\n const rendered = context.element.querySelector(':scope > :not(template)')\n const template = this.findTemplate(context.templates, context.value)\n context.parent = getParentPath(context.element)\n if (rendered) {\n if (template) {\n if (rendered?.[DEP.TEMPLATE] != template) {\n const clone = this.applyTemplate(context)\n context.element.replaceChild(clone, rendered)\n }\n } else {\n context.element.removeChild(rendered)\n }\n } else if (template) {\n const clone = this.applyTemplate(context)\n context.element.appendChild(clone)\n }\n}\n\nfunction getParentPath(el, attribute)\n{\n const parentEl = el.parentElement?.closest(`[${attribute}-list],[${attribute}-map]`)\n if (!parentEl) {\n return ''\n }\n if (parentEl.hasAttribute(`${attribute}-list`)) {\n return parentEl.getAttribute(`${attribute}-list`)+'.'\n }\n return parentEl.getAttribute(`${attribute}-map`)+'.'\n}\n\n/**\n * renders a single input type\n * for radio/checkbox inputs it only sets the checked attribute to true/false\n * if the value attribute matches the current value\n * for other inputs the value attribute is updated\n */\nexport function input(context)\n{\n const el = context.element\n let value = context.value\n\n // Inputs display their bound primitive in `value`, not `innerHTML`.\n // Calling element() here would also enable two-way tracking on\n // innerHTML, which would overwrite text input data with an empty string.\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n setProperties(el, value, 'title', 'id', 'className', 'value', 'checked')\n value = value.value\n }\n if (typeof value == 'undefined') {\n value = ''\n }\n if (el.type=='checkbox') {\n el.checked = checkboxIsChecked(el, value)\n } else if (el.type=='radio') {\n el.checked = matchValue(el.value, value)\n } else if (!matchValue(el.value, value)) {\n el.value = ''+value\n }\n\n if (writesFromDom(this, context)) {\n if (el.type=='checkbox') {\n trackDomField.call(this, context.element, ['checked'], true, 'checked', checkboxEditValue)\n } else if (el.type=='radio') {\n trackDomField.call(this, context.element, ['checked'], true, 'checked', radioEditValue)\n } else {\n trackDomField.call(this, context.element, ['value'], true, 'value')\n }\n }\n}\n\nfunction checkboxIsChecked(el, value)\n{\n if (Array.isArray(value)) {\n return value.some(selected => matchValue(el.value, selected))\n }\n if (typeof value === 'boolean') {\n return value\n }\n return matchValue(el.value, value)\n}\n\nfunction checkboxEditValue(el, currentValue)\n{\n // An array-bound checkbox toggles its value in that array. Otherwise a\n // checkbox edits a boolean; this keeps the app API simple and predictable.\n // Existing string values are left alone on the initial checked render so\n // lower-level two-way bindings do not immediately rewrite legacy data.\n if (Array.isArray(currentValue)) {\n const value = el.value\n const values = currentValue.filter(item => !matchValue(item, value))\n if (el.checked) {\n values.push(value)\n }\n return values\n }\n if (typeof currentValue === 'boolean') {\n return el.checked\n }\n if (el.checked && matchValue(el.value, currentValue)) {\n return currentValue\n }\n return el.checked\n}\n\nfunction radioEditValue(el, currentValue)\n{\n // Browsers fire the useful change event on the newly checked radio. If this\n // radio is not checked, leave the bound value unchanged.\n if (!el.checked) {\n return undefined\n }\n return el.value\n}\n\n/**\n * Sets the value of the button, doesn't touch the innerHTML\n */\nexport function button(context)\n{\n element.call(this, context, 'value')\n}\n\n/**\n * Sets the selected attribute of select options\n */\nexport function select(context)\n{\n const el = context.element\n let value = context.value\n\n if (value === null) {\n value = ''\n }\n\n if (Array.isArray(value)) {\n for (let option of el.options) {\n option.selected = value.some(selected => matchValue(option.value, selected))\n if (option.selected) {\n option.setAttribute('selected', true)\n } else {\n option.removeAttribute('selected')\n }\n }\n } else if (typeof value!='object') {\n let option = Array.from(el.options).find(o => matchValue(o.value,value))\n if (option) {\n option.selected = true\n option.setAttribute('selected', true)\n }\n } else { // value is a non-null object\n if (value.options) {\n setSelectOptions(el, value.options)\n }\n if (typeof value.selected !== 'undefined') {\n select.call(this, Object.assign({}, context, {value:value.selected}))\n }\n setProperties(el, value, 'name', 'id', 'selectedIndex', 'className') // allow innerHTML? if so call element instead\n }\n\n if (writesFromDom(this, context)) {\n if (el.multiple) {\n trackDomField.call(this, context.element, ['value'], true, 'value', selectMultipleEditValue)\n } else {\n trackDomField.call(this, context.element, ['value'], true, 'value')\n }\n }\n}\n\nfunction selectMultipleEditValue(el)\n{\n // Keep multiple-select editing as ordinary data: an array of selected values.\n // Reading `value` registers the DOM dependency; the change listener notifies\n // it whenever the selection changes.\n const value = el.value\n return Array.from(el.options)\n .filter(option => option.selected)\n .map(option => option.value)\n}\n\n/**\n * adds a single option to a select element. The option.text property is optional, if not set option.value is used.\n * @param select The select element\n * @param option An option descriptor, either a string, object with {text,value,defaultSelected,selected} properties or an Option object\n */\nexport function addOption(select, option)\n{\n if (!option) {\n return\n }\n if (typeof option !== 'object') {\n select.options.add(new Option(''+option))\n } else if (option.text) {\n select.options.add(new Option(option.text, option.value, option.defaultSelected, option.selected))\n } else if (typeof option.value != 'undefined') {\n select.options.add(new Option(''+option.value, option.value, option.defaultSelected, option.selected))\n }\n}\n\n/**\n * This function clears all existing options of a select element, and adds the specified options.\n */\nexport function setSelectOptions(select,options)\n{\n //@TODO: only update in case of changes?\n select.innerHTML = ''\n if (Array.isArray(options)) {\n for (const option of options) {\n addOption(select, option)\n }\n } else if (options && typeof options == 'object') {\n for (const option in options) {\n addOption(select, { text: options[option], value: option })\n }\n }\n}\n\n/**\n * Sets the innerHTML and href, id, title, target, name, newwindow, nofollow attributes of an anchor\n */\nexport function anchor(context)\n{\n element.call(this, context, 'target', 'href', 'name', 'newwindow', 'nofollow')\n if (writesFromDom(this, context)) {\n batch(() => {\n updateProperties.call(this, context, ['target', 'href', 'name', 'newwindow', 'nofollow'])\n })\n }\n}\n\n/**\n * Sets the title, id, alt and src attributes of an image.\n */\nexport function image(context)\n{\n setProperties(context.element, context.value, 'title', 'alt', 'src', 'id')\n if (writesFromDom(this, context)) {\n batch(() => {\n updateProperties.call(this, context, ['title', 'alt', 'src', 'id'])\n })\n }\n}\n\n/**\n * Sets the title, id and src attribute of an iframe\n */\nexport function iframe(context)\n{\n setProperties(context.element, context.value, 'title', 'src', 'id')\n if (writesFromDom(this, context)) {\n batch(() => {\n updateProperties.call(this, context, ['title','src','id'])\n })\n }\n}\n\n/**\n * Sets the content and id attribute of a meta element\n */\nexport function meta(context)\n{\n setProperties(context.element, context.value, 'content', 'id')\n if (writesFromDom(this, context)) {\n batch(() => {\n updateProperties.call(this, context, ['content','id'])\n })\n }\n}\n\n/**\n * sets the innerHTML and title and id properties of any HTML element\n */\nexport function element(context, ...extraprops)\n{\n const el = context.element\n let value = context.value\n let valueIsString = false\n if (typeof value!='undefined' && value!==null) {\n let strValue = ''+value\n if (typeof value!='object' || strValue.substring(0,8)!='[object ') {\n value = { innerHTML: value }\n valueIsString = true\n }\n }\n const props = ['innerHTML','title','id','className'].concat(extraprops)\n setProperties(el, value, ...props)\n if (writesFromDom(this, context)) {\n trackDomField.call(this, context.element, props, valueIsString)\n }\n}\n\n/**\n * Sets a list of properties on a dom element, equal to \n * the string value of a data object\n * only updates the dom element if the property doesn't match\n */\nexport function setProperties(el, data, ...properties) {\n if (!data || typeof data!=='object') {\n return\n }\n for (const property of properties) {\n if (typeof data[property] === 'undefined') {\n continue\n }\n if (matchValue(el[property], data[property])) {\n continue\n }\n if (data[property] === null) {\n el[property] = ''\n } else {\n el[property] = ''+data[property]\n }\n }\n}\n\n\nfunction updateProperties(context, properties)\n{\n trackDomField.call(this, context.element, properties, false)\n}\n\nexport function getProperties(el, ...properties) {\n const result = {}\n for (const property of properties) {\n switch(property) {\n default: \n result[property] = el[property]\n break\n }\n }\n return result\n}\n\n/**\n * Returns true if a matches b, either by having the\n * same string value, or matching string :empty against a falsy value\n */\nexport function matchValue(a,b)\n{\n if (a==':empty' && !b) {\n return true\n }\n if (b==':empty' && !a) {\n return true\n }\n if (''+a == ''+b) {\n return true\n }\n return false\n}\n", "import { throttledEffect, destroy } from './state.mjs'\nimport { escape_html, fixed_content } from './bind.transformers.mjs'\nimport * as render from './bind.render.mjs'\nimport { DEP } from './symbols.mjs'\n\n/**\n * Implements one way databinding, updating dom elements with matching attributes\n * to changes in signals (see state.mjs)\n * \n * @class\n */\nclass SimplyBind\n{\n \n /**\n * @param Object options - a set of options for this instance, options may include:\n * - root (signal) (required) - the root data object that contains al signals that can be bound\n * - container (HTMLElement) - the dom element to use as the root for all bindings\n * - attribute (string) - the prefix for the field, edit, list and map attributes, e.g. 'data-bind'\n * - transformers (object name:function) - a map of transformer names and functions\n * - render (object with field, list and map properties); edit uses field renderers\n */\n constructor(options)\n {\n /**\n * A map of HTMLElements and the data bindings on each, in the form of \n * the connectedSignal returned by the (throttled)Effect.\n * @type {Map}\n * @public\n */\n this.bindings = new Map()\n\n const defaultTransformers = {\n escape_html,\n fixed_content\n }\n const defaultOptions = {\n container: document.body,\n attribute: 'data-flow',\n transformers: defaultTransformers,\n render: {\n field: [render.field],\n list: [render.list],\n map: [render.map]\n },\n renderers: {\n 'INPUT':render.input,\n 'TEXTAREA':render.input,\n 'BUTTON':render.button,\n 'SELECT':render.select,\n 'A':render.anchor,\n 'IMG':render.image,\n 'IFRAME':render.iframe,\n 'META':render.meta,\n 'TEMPLATE':null,\n '*':render.element\n },\n twoway: false\n }\n if (!options?.root) {\n throw new Error('bind needs at least options.root set')\n }\n this.options = Object.assign({}, defaultOptions, options)\n if (options.transformers) {\n this.options.transformers = Object.assign({}, defaultTransformers, options?.transformers)\n }\n const attribute = this.options.attribute\n const bindAttributes = [attribute+'-field',attribute+'-edit',attribute+'-list',attribute+'-map']\n const transformAttribute = attribute+'-transform'\n\n const getBindingAttribute = (el) => {\n const foundAttribute = bindAttributes.find(attr => el.hasAttribute(attr))\n if (!foundAttribute) {\n console.error('No matching attribute found',el,bindAttributes)\n }\n return foundAttribute\n }\n\n // sets up the effect that updates the element if its\n // data binding value changes\n const renderElement = (el) => {\n this.bindings.set(el, throttledEffect(() => {\n if (!el.isConnected) {\n // el is no longer part of this document\n untrack(el, this.getBindingPath(el))\n const binding = this.bindings.get(el)\n if (binding) {\n destroy(binding)\n this.bindings.delete(el)\n }\n // doing this here instead of in a mutationobserver\n // allows an element to be temporary removed and then inserted\n // without the binding having to be reset\n return\n }\n let context = {\n templates: el.querySelectorAll(':scope > template'),\n attribute: getBindingAttribute(el)\n }\n context.edit = context.attribute === this.options.attribute+'-edit'\n context.path = this.getBindingPath(el)\n context.value = getValueByPath(this.options.root, context.path)\n context.element = el\n track(el, context)\n runTransformers(context)\n }, 50))\n }\n\n // finds and runs applicable transformers\n // creates a stack of transformers, calls the topmost\n // each transformer can opt to call the next or not\n // transformers should return the context object (possibly altered)\n const runTransformers = (context) => {\n let transformers\n switch(context.attribute) {\n case this.options.attribute+'-field':\n case this.options.attribute+'-edit':\n transformers = Array.from(this.options.render.field)\n break\n case this.options.attribute+'-list':\n transformers = Array.from(this.options.render.list)\n break\n case this.options.attribute+'-map':\n transformers = Array.from(this.options.render.map)\n break\n default:\n throw new Error('no valid context attribute specified',context)\n break\n }\n if (context.element.hasAttribute(transformAttribute)) {\n context.element.getAttribute(transformAttribute)\n .split(' ').filter(Boolean)\n .forEach(t => {\n if (this.options.transformers[t]) {\n transformers.push(this.options.transformers[t])\n } else {\n console.warn('No transformer with name '+t+' configured', {cause:context.element})\n }\n })\n }\n let next\n for (let transformer of transformers) {\n next = ((next, transformer) => {\n return (context) => {\n return transformer.call(this, context, next)\n }\n })(next, transformer)\n }\n next(context)\n }\n\n // given a set of elements with data bind attribute\n // this renders each of those elements\n const applyBindings = (bindings) => {\n for (let bindingEl of bindings) {\n if (!this.bindings.get(bindingEl)) { // bindingEl may have moved from somewhere else in this document\n renderElement(bindingEl)\n }\n }\n }\n\n // this handles the mutation observer changes\n // if any element is added, and has a data bind attribute\n // it applies that data binding\n const updateBindings = (changes) => {\n const selector = `[${attribute}-field],[${attribute}-edit],[${attribute}-list],[${attribute}-map]`\n for (const change of changes) {\n if (change.type==\"childList\" && change.addedNodes) {\n for (let node of change.addedNodes) {\n if (node instanceof HTMLElement) {\n let bindings = Array.from(node.querySelectorAll(selector))\n if (node.matches(selector)) {\n bindings.unshift(node)\n }\n if (bindings.length) {\n applyBindings(bindings)\n }\n }\n }\n }\n }\n }\n\n // this responds to elements getting added to the dom\n // and if any have data bind attributes, it applies those bindings\n this.observer = new MutationObserver((changes) => {\n updateBindings(changes)\n })\n\n this.observer.observe(this.options.container, {\n subtree: true,\n childList: true\n })\n\n // this finds elements with data binding attributes and applies those bindings\n // must come after setting up the observer, or included templates\n // won't trigger their own bindings\n const bindings = this.options.container.querySelectorAll(\n ':is(['+this.options.attribute+'-field]'+\n ',['+this.options.attribute+'-edit]'+\n ',['+this.options.attribute+'-list]'+\n ',['+this.options.attribute+'-map]):not(template)'\n )\n try {\n if (bindings.length) {\n applyBindings(bindings)\n }\n } catch (error) {\n this.destroy()\n throw error\n }\n\n }\n\n /**\n * Finds the first matching template and creates a new DocumentFragment\n * with the correct data bind attributes in it (prepends the current path)\n * @param Context context\n * @return DocumentFragment\n */\n applyTemplate(context)\n {\n const path = context.path\n const parent = context.parent\n const templates = context.templates\n const list = context.list\n const index = context.index\n const value = list ? list[index] : context.value\n\n let template = this.findTemplate(templates, value)\n if (!template) {\n let result = new DocumentFragment()\n result.innerHTML = '<!-- no matching template -->'\n return result\n }\n let clone = template.content.cloneNode(true)\n if (!clone.children?.length) {\n return clone\n }\n if (clone.children.length>1) {\n throw new Error('template must contain a single root node', { cause: template })\n }\n const attribute = this.options.attribute\n\n const attributes = [attribute+'-field',attribute+'-edit',attribute+'-list',attribute+'-map']\n const bindings = clone.querySelectorAll(`[${attribute}-field],[${attribute}-edit],[${attribute}-list],[${attribute}-map]`)\n for (let binding of bindings) {\n if (binding.tagName=='TEMPLATE') {\n continue\n }\n const attr = attributes.find(attr => binding.hasAttribute(attr))\n let bind = binding.getAttribute(attr)\n bind = this.applyLinks(template.links, bind)\n if (bind.substring(0, ':root.'.length)==':root.') {\n binding.setAttribute(attr, bind.substring(':root.'.length))\n } else if (bind==':value' && index!=null) {\n binding.setAttribute(attr, path+'.'+index)\n } else if (index!=null) {\n binding.setAttribute(attr, path+'.'+index+'.'+bind)\n } else {\n binding.setAttribute(attr, parent+bind)\n }\n }\n this.applyTemplateCommandValues(clone, template.links, path, index)\n if (typeof index !== 'undefined') {\n clone.children[0].setAttribute(attribute+'-key',index)\n }\n // keep track of the used template and value reference, so list items can be\n // reused when an array insertion shifts their numeric index.\n clone.children[0][DEP.TEMPLATE] = template\n clone.children[0][DEP.VALUE] = value\n\n // return clone, not the firstChild, so that all whitespace is cloned as well\n return clone\n }\n\n applyTemplateCommandValues(fragment, links, path, index)\n {\n const valueAttribute = this.options.attribute+'-value'\n const valuePathAttribute = this.options.attribute+'-value-path'\n const valueSelector = '['+valueAttribute+']'\n const elements = Array.from(fragment.querySelectorAll(valueSelector))\n\n for (const element of elements) {\n let value = element.getAttribute(valueAttribute)\n value = this.applyLinks(links, value)\n const resolved = templateCommandValue(value, path, index)\n if (!resolved) {\n continue\n }\n if (Object.hasOwn(resolved, 'path')) {\n element.setAttribute(valuePathAttribute, resolved.path)\n } else {\n element.setAttribute(valueAttribute, resolved.value)\n element.removeAttribute(valuePathAttribute)\n }\n }\n }\n\n parseLinks(links)\n {\n let result = {}\n links = links.split(';').map(link => link.trim())\n for (let link of links) {\n link = link.split('=')\n result[link[0].trim()] = link[1].trim()\n }\n return result\n }\n\n applyLinks(links, value)\n {\n for (let link in links) {\n if (value.startsWith(link+'.')) {\n return links[link] + value.substr(link.length)\n } else if (value==link) {\n return links[link]\n }\n }\n return value\n }\n\n /**\n * Returns the path referenced in either the field, list or map attribute\n * @param HTMLElement el\n * @return string The path referenced, or void\n */\n getBindingPath(el)\n {\n const attributes = [\n this.options.attribute+'-field', \n this.options.attribute+'-edit',\n this.options.attribute+'-list',\n this.options.attribute+'-map'\n ]\n for (let attr of attributes) {\n if (el.hasAttribute(attr)) {\n return el.getAttribute(attr)\n }\n }\n }\n\n /**\n * Finds the first template from an array of templates that\n * matches the given value. \n */\n findTemplate(templates, value)\n {\n const templateMatches = t => {\n // find the value to match against (e.g. data-bind=\"foo\")\n let path = this.getBindingPath(t)\n let currentItem\n if (path) {\n if (path.substr(0,6)==':root.') {\n currentItem = getValueByPath(this.options.root, path.substring(6))\n } else {\n currentItem = getValueByPath(value, path)\n }\n } else {\n currentItem = value\n }\n\n // then check the value against pattern, if set (e.g. data-bind-match=\"bar\")\n const strItem = ''+currentItem\n let matches = t.getAttribute(this.options.attribute+'-match')\n if (matches) {\n if (matches===':empty' && !currentItem) {\n return t\n } else if (matches===':notempty' && currentItem) {\n return t\n }\n if (strItem == matches) {\n return t\n }\n }\n if (!matches) {\n // no data-bind-match is set, so return this template\n return t\n }\n }\n let template = Array.from(templates).find(templateMatches)\n let links = null\n if (template?.hasAttribute(this.options.attribute+'-link')) {\n links = this.parseLinks(template.getAttribute(this.options.attribute+'-link'))\n }\n let rel = template?.getAttribute('rel')\n if (rel) {\n let replacement = document.querySelector('template#'+rel)\n if (!replacement) {\n throw new Error('Could not find template with id '+rel)\n }\n template = replacement\n }\n if (template) {\n template.links = links\n }\n return template\n }\n\n destroy()\n {\n this.bindings.forEach((binding, element) => {\n untrack(element, this.getBindingPath(element))\n destroy(binding)\n })\n this.bindings = new Map()\n this.observer.disconnect()\n }\n\n}\n\n/**\n * Returns a new instance of SimplyBind. This is the normal start\n * of a data bind flow\n */\nexport function bind(options)\n{\n return new SimplyBind(options)\n}\n\nconst tracking = new Map()\n\nexport function trace(path)\n{\n return tracking.get(path)\n}\n\nfunction track(el, context) {\n untrack(el)\n if (!tracking.has(context.path)) {\n tracking.set(context.path, [context])\n } else {\n tracking.get(context.path).push(context)\n }\n}\n\nfunction untrack(el, path) {\n if (path) {\n let list = tracking.get(path)\n if (list) {\n list = list.filter(context => context.element !== el)\n tracking.set(path, list)\n }\n return\n }\n tracking.forEach((list, trackedPath) => {\n list = list.filter(context => context.element !== el)\n tracking.set(trackedPath, list)\n })\n}\n\n\n\nfunction templateCommandValue(value, path, index)\n{\n if (!value || value[0] !== ':') {\n return null\n }\n if (value === ':key') {\n return { value: ''+index }\n }\n if (value === ':value') {\n return { path: templateItemPath(path, index) }\n }\n if (value.startsWith(':value.')) {\n return { path: joinPath(templateItemPath(path, index), value.substring(':value'.length)) }\n }\n if (value.startsWith(':root.')) {\n return { path: value.substring(':root.'.length) }\n }\n return null\n}\n\nfunction templateItemPath(path, index)\n{\n if (typeof index === 'undefined') {\n return path\n }\n return joinPath(path, '.'+index)\n}\n\nfunction joinPath(path, suffix)\n{\n if (!path) {\n return suffix.replace(/^\\./, '')\n }\n return path+suffix\n}\n\n/**\n * Returns the value by walking the given path as a json pointer, starting at root\n * if you have a property with a '.' in its name urlencode the '.', e.g: %46\n * \n * @param HTMLElement root\n * @param string path e.g. 'foo.bar'\n * @return mixed the value found by walking the path from the root object or undefined\n */\nexport function getValueByPath(root, path)\n{\n let parts = path.split('.')\n let curr = root\n let part\n part = parts.shift()\n let prevPart = null\n while (part && curr) {\n part = decodeURIComponent(part)\n if (part=='0' && !Array.isArray(curr)) {\n // ignore so that data-flow-list=\"nonarray\" will work\n } else if (part==':key') {\n curr = prevPart\n } else if (part==':value') {\n // do nothing\n } else if (Array.isArray(curr) && typeof curr[part]=='undefined' && curr[0]) {\n curr = curr[0][part] // so that data-flow-field=\"array.foo\" works\n } else {\n curr = curr[part]\n }\n prevPart = part\n part = parts.shift()\n }\n return curr\n}\n", "import { signal, isSignal, raw, throttledEffect, batch } from './state.mjs'\n\n/**\n * This class implements a pluggable data model, where you can\n * add effects that are run only when either an option for that\n * effect changes, or when an effect earlier in the chain of\n * effects changes.\n */\nclass SimplyFlowModel {\n\n\t/**\n\t * Creates a new datamodel, with a state property that contains\n\t * all the data passed to this constructor\n\t * @param state\tObject with all the data for this model\n\t * @throws Error if state is not set\n\t */\n\tconstructor(state) {\n\t\tif (!state) {\n\t\t\tthrow new Error('no options set')\n\t\t}\n\t\tif (state.data==null || typeof state.data[Symbol.iterator] !== 'function') {\n\t\t\tconsole.warn('SimplyFlowModel: options.data is not iterable')\n\t\t}\n\t\tthis.state = signal(state)\n\t\tif (!this.state.options) {\n\t\t\tthis.state.options = {}\n\t\t}\n\t\tthis.effects = [{current:this.state.data}]\n\t\tthis.view = {\n current: this.state.data\n }\n\t}\n\n\t/**\n\t * Adds an effect to run whenever a signal it depends on\n\t * changes. this.state is the usual signal.\n\t * The `fn` function param is not itself an effect, but must return\n\t * and effect function. `fn` takes one param, which is the data signal.\n\t * This signal will always have at least a `current` property.\n\t * The result of the effect function is pushed on to the this.effects\n\t * list. And the last effect added is set as this.view\n\t */\n\taddEffect(fn) {\n\t\tif (!fn || typeof fn !=='function') {\n\t\t\tthrow new Error('addEffect requires an effect function as its parameter', { cause: fn })\n\t\t}\n\t\tconst dataSignal = this.effects[this.effects.length-1]\n\t\tconst connectedSignal = fn.call(this, dataSignal)\n\t\tif (!isSignal(connectedSignal)) {\n\t\t\tthrow new Error('addEffect function parameter must return a Signal', { cause: fn })\n\t\t}\n\t\tthis.view = connectedSignal\n\t\tthis.effects.push(this.view)\n\t}\n}\n\nexport function model(options) {\n\treturn new SimplyFlowModel(options)\n}\n\n/**\n * Returns a function for model.addEffect that sorts the input data\n * \n * Options:\n * - direction (string) default 'asc' - change to 'desc' to sort in descending order\n * - sortBy (string) (optional) - used by the default sorting function to select the property to sort on\n * - sortFn (function) (required - set by default) - the sort function to use\n */\nexport function sort(options={}) {\n\treturn function(data) {\n\t\t// initialize the sort options, only gets called once\n\t\tthis.state.options.sort = Object.assign({\n\t\t\tdirection: 'asc',\n\t\t\tsortBy: null,\n\t\t\tsortFn: ((a,b) => {\n\t\t\t\tconst sort = this.state.options.sort\n\t\t\t\tconst sortBy = sort.sortBy\n\t\t\t\tif (!sort.sortBy) {\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t\tconst direction = sort.sortDirection || sort.direction || 'asc'\n\t\t\t\tconst larger = direction == 'asc' ? 1 : -1\n\t\t\t\tconst smaller = direction == 'asc' ? -1 : 1\n\t\t\t\tif (typeof a?.[sortBy] === 'undefined') {\n\t\t\t\t\tif (typeof b?.[sortBy] === 'undefined') {\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\treturn larger\n\t\t\t\t}\n\t\t\t\tif (typeof b?.[sortBy] === 'undefined') {\n\t\t\t\t\treturn smaller\n\t\t\t\t}\n\t\t\t\tif (a[sortBy]<b[sortBy]) {\n\t\t\t\t\treturn smaller\n\t\t\t\t} else if (a[sortBy]>b[sortBy]) {\n\t\t\t\t\treturn larger\n\t\t\t\t} else {\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t})\n\t\t}, options);\n\t\t// then return the effect, which is called when\n\t\t// either the data or the sort options change\n\t\treturn throttledEffect(() => {\n\t\t\tconst sort = this.state.options.sort\n\t\t\tconst direction = sort?.sortDirection || sort?.direction\n\t\t\tif (sort?.sortBy && direction) {\n\t\t\t\t// Read through the signal proxy so replacing `.sortFn` is tracked,\n\t\t\t\t// then call the raw comparator with the model as `this`.\n\t\t\t\tconst trackedSortFn = sort.sortFn\n\t\t\t\tconst sortFn = raw(sort).sortFn || trackedSortFn\n\t\t\t\treturn data.current.toSorted((a, b) => sortFn.call(this, a, b))\n\t\t\t}\n\t\t\treturn data.current\n\t\t}, 50)\n\t}\n}\n\n/**\n * Returns a function for model.addEffect that implements paging\n * for the input data. It will return a slice of the data matching\n * the page and pageSize options.\n * \n * Options:\n * - page (int) default 1 - which page to show, starts at 1\n * - pageSize (int) default 20 - how many items in a single page\n * - max (int) (calculated) - how many pages in total\n */\nexport function paging(options={}) {\n\treturn function(data) {\n\t\t// initialize the paging options\n\t\tthis.state.options.paging = Object.assign({\n\t\t\tpage: 1,\n\t\t\tpageSize: 20,\n\t\t\tmax: 1\n\t\t}, options)\n\t\treturn throttledEffect(() => {\n\t\t\treturn batch(() => {\n\t\t\t\tconst paging = this.state.options.paging\n\t\t\t\tif (!paging.pageSize) {\n\t\t\t\t\tpaging.pageSize = 20\n\t\t\t\t}\n\t\t\t\tpaging.max = Math.ceil(data.current.length / paging.pageSize)\n\t\t\t\tpaging.page = Math.max(1, Math.min(paging.max, paging.page))\n\n\t\t\t\tconst start = (paging.page-1) * paging.pageSize\n\t\t\t\tconst end = start + paging.pageSize\n\t\t\t\treturn data.current.slice(start, end)\n\t\t\t})\n\t\t}, 50)\n\t}\n}\n\n/**\n * Returns a function for model.addEffect that filters rows from the data,\n * using a custom filter function `options.matches`\n * \n * Options:\n * - name (string) (required) - the name of this filter, must be unique\n * - matches (function) (required) - the filter function to apply to the data\n * - enabled (bool) (required) - filter is applied only when enabled is set to true\n */\nexport function filter(options) {\n\tif (!options?.name || typeof options.name!=='string') {\n\t\tthrow new Error('filter requires options.name to be a string')\n\t}\n\tif (!options.matches || typeof options.matches!=='function') {\n\t\tthrow new Error('filter requires options.matches to be a function')\n\t}\n\treturn function(data) {\n\t\tif (this.state.options[options.name]) {\n\t\t\tthrow new Error('a filter with this name already exists on this model')\n\t\t}\n\t\tthis.state.options[options.name] = options\n\t\treturn throttledEffect(() => {\n\t\t\tconst filterOptions = this.state.options[options.name]\n\t\t\tif (filterOptions.enabled) {\n\t\t\t\t// Read through the signal proxy so replacing `.matches` is tracked\n\t\t\t\t// as a dependency of this effect. The proxied function may already\n\t\t\t\t// be bound to the options object, so call the raw function explicitly\n\t\t\t\t// with the model as `this`.\n\t\t\t\tconst trackedMatches = filterOptions.matches\n\t\t\t\tconst matches = raw(filterOptions).matches || trackedMatches\n\t\t\t\treturn data.current.filter(row => matches.call(this, row))\n\t\t\t}\n\t\t\treturn data.current\n\t\t}, 50)\n\t}\n}\n\n/**\n * Returns a function for model.addEffect that filters the data to only contain\n * columns (properties) that aren't hidden. Automatically runs again if any columns\n * hidden property changes.\n * \n * Options:\n * - columns (object) (required) - an object with properties describing each column. Each \n * property must be an object with an optional `hidden` property. If set to a truthy value,\n * and property in the dataset with the same name, will be filtered out.\n */\nexport function columns(options={}) {\n\tconst columnOptions = options?.columns && typeof options.columns === 'object'\n\t\t? options.columns\n\t\t: options\n\tif (!columnOptions\n\t\t|| typeof columnOptions!=='object'\n\t\t|| Object.keys(columnOptions).length===0) {\n\t\tthrow new Error('columns requires options to be an object with at least one property')\n\t}\n\treturn function(data) {\n\t\tthis.state.options.columns = columnOptions\n\t\treturn throttledEffect(() => {\n\t\t\treturn data.current.map(input => {\n\t\t\t\tlet result = {}\n\t\t\t\tfor (let key of Object.keys(this.state.options.columns)) {\n\t\t\t\t\tif (!this.state.options.columns[key]?.hidden) {\n\t\t\t\t\t\tresult[key] = input[key] ?? null\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result\n\t\t\t})\n\t\t}, 50)\n\t}\n}\n\n/**\n * Returns a function for use with model.addEffect, with the given options set\n * as model.options.scroll. The effect will return a slice of the input data, which\n * makes it easy to render just a part (slice) of the whole data.\n * \n * Options are:\n * - offset (int) default 0 (optional) - the offset in the data to start the slice\n * - rowCount (int) default 20 (optional / calculated) - the number of rows in the slice\n * - rowHeight (int) default 26 (optional) - the height of a single row in pixels\n * - itemsPerRow (int) default 1 (optional) - the number of items on a single row\n * - size (int) default data.current.length (calculated) - how many rows inside data.current before slicing\n * - scrollbar (HTMLElement) defualt null (optional) - if set, an effect is added to update this elements \n * \t height if data.current.length changes\n * - container (HTMLElement) default null (optional) - if set, a scroll listener is added to this element, \n * which will update the options.offset signal and trigger the slice effect. It will also set the rowCount.\n */\nexport function scroll(options) {\n\n\treturn function(data) {\n\t\tthis.state.options.scroll = Object.assign({\n\t\t\toffset: 0,\n\t\t\trowHeight: 26,\n\t\t\trowCount: 20,\n\t\t\titemsPerRow: 1,\n\t\t\tsize: data.current.length\n\t\t}, options)\n\t\tconst scrollOptions = this.state.options.scroll\n\n\t\tconst scrollbar = scrollOptions.scrollbar \n\t\t\t|| scrollOptions.container?.querySelector('[data-flow-scrollbar]')\n\t\tif (scrollbar) {\n\t\t\tif (scrollOptions.container) {\n\t\t\t\tscrollOptions.container.addEventListener('scroll', (evt) => {\n\t\t\t\t\tscrollOptions.offset = Math.floor(scrollOptions.container.scrollTop\n\t\t\t\t\t\t/ (scrollOptions.rowHeight*scrollOptions.itemsPerRow)\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthrottledEffect(() => {\n\t\t\t\tscrollOptions.size = data.current.length * scrollOptions.rowHeight\n\t\t\t\tscrollbar.style.height = scrollOptions.size + 'px'\n\t\t\t}, 50)\n\t\t}\n\n\t\treturn throttledEffect(() => {\n\t\t\tif (scrollOptions.container) {\n\t\t\t\t//TODO: add a resize listener so that if the size of the container\n\t\t\t\t// changes, the rowCount is calculated again\n\t\t\t\tscrollOptions.rowCount = Math.ceil(\n\t\t\t\t\tscrollOptions.container.getBoundingClientRect().height \n\t\t\t\t\t/ scrollOptions.rowHeight\n\t\t\t\t)\n\t\t\t}\n\t\t\tscrollOptions.data = data.current\n\t\t\tlet start = Math.min(scrollOptions.offset, data.current.length-1)\n\t\t\tlet end = start + scrollOptions.rowCount\n\t\t\tif (end > data.current.length) {\n\t\t\t\tend = data.current.length\n\t\t\t\tstart = end - scrollOptions.rowCount\n\t\t\t}\n\t\t\treturn data.current.slice(start, end)\n\t\t}, 50)\n\t}\n}", "export class SimplyRender extends HTMLElement \n{\n constructor()\n {\n super()\n }\n\n connectedCallback()\n {\n let templateId = this.getAttribute(\"rel\")\n let template = document.getElementById(templateId)\n\n if (template) {\n let content = template.content.cloneNode(true)\n for (const node of content.childNodes) {\n const clone = node.cloneNode(true)\n if (clone.nodeType == document.ELEMENT_NODE) {\n clone.querySelectorAll(\"template\").forEach(function(t) {\n t.setAttribute(\"simply-render\", \"\") //FIXME: whats this?\n })\n if (this.attributes) {\n for (const attr of this.attributes) {\n if (attr.name!='rel') {\n clone.setAttribute(attr.name, attr.value)\n }\n }\n }\n }\n this.parentNode.insertBefore(clone, this)\n }\n this.parentNode.removeChild(this)\n } else {\n const observe = () => {\n const observer = new MutationObserver(() => {\n template = document.getElementById(templateId)\n if (template) {\n observer.disconnect()\n this.replaceWith(this) // trigger connectedCallback?\n }\n })\n observer.observe(globalThis.document, {\n subtree: true,\n childList: true,\n })\n }\n\n observe()\n }\n }\n}\n\nif (!customElements.get('simply-render')) {\n customElements.define('simply-render', SimplyRender);\n}", "/**\n * Return the closest valid option name to a possibly misspelled name.\n *\n * Used for developer-friendly typo suggestions. Short unknown names such as\n * `api` or `db` are ignored by default because they are common app extension\n * properties and edit-distance suggestions are noisy for short strings.\n *\n * @param {string} name The unknown name to compare.\n * @param {Iterable<string>} options Valid option names to compare against.\n * @param {object} [settings] Optional matching settings.\n * @param {number} [settings.maxDistance=2] Maximum edit distance to accept.\n * @param {number} [settings.minLength=4] Minimum unknown-name length to check.\n * @returns {string|undefined} The closest option, or undefined when no useful suggestion exists.\n */\nexport function closest(name, options, { maxDistance = 2, minLength = 4 } = {})\n{\n if (name.length < minLength) {\n return\n }\n\n let result\n let resultDistance = Infinity\n for (const option of options) {\n const distance = editDistance(name, option, maxDistance)\n if (distance < resultDistance) {\n result = option\n resultDistance = distance\n }\n }\n return resultDistance <= maxDistance ? result : undefined\n}\n\n/**\n * Return the edit distance between two short strings.\n *\n * This is used only for friendly typo suggestions in developer warnings, so it\n * intentionally caps large length differences early instead of doing extra work.\n *\n * @param {string} a First string to compare.\n * @param {string} b Second string to compare.\n * @param {number} [maxDistance=2] Maximum useful distance for the caller.\n * @returns {number} The Levenshtein edit distance, or maxDistance + 1 when the strings are too far apart.\n */\nexport function editDistance(a, b, maxDistance = 2)\n{\n const tooFar = maxDistance + 1\n if (Math.abs(a.length - b.length) > maxDistance) {\n return tooFar\n }\n\n const previous = Array.from({ length: b.length + 1 }, (_, index) => index)\n const current = new Array(b.length + 1)\n\n for (let ai = 1; ai <= a.length; ai++) {\n current[0] = ai\n for (let bi = 1; bi <= b.length; bi++) {\n const cost = a[ai - 1] === b[bi - 1] ? 0 : 1\n current[bi] = Math.min(\n previous[bi] + 1,\n current[bi - 1] + 1,\n previous[bi - 1] + cost\n )\n }\n previous.splice(0, previous.length, ...current)\n }\n\n return previous[b.length]\n}\n", "import { closest } from './suggest.mjs'\nexport function routes(options)\n{\n return new SimplyRoute(options)\n}\n\nexport class SimplyRoute\n{\n constructor(options={})\n {\n this.options = options\n this.baseURL = options.baseURL || '/'\n this.app = options.app || {}\n this.addMissingSlash = !!options.addMissingSlash\n this.matchExact = !!options.matchExact\n this.hijackLinks = !!options.hijackLinks\n this.clear()\n if (options.routes) {\n this.load(options.routes)\n }\n }\n\n load(routes)\n {\n parseRoutes(routes, this.routeInfo, this.matchExact)\n }\n\n clear()\n {\n this.routeInfo = []\n this.listeners = {\n match: {},\n call: {},\n goto: {},\n finish: {}\n }\n }\n\n match(path, options)\n {\n let args = {\n path,\n options\n }\n args = this.runListeners('match',args)\n path = args.path ? args.path : path;\n\n let searchParams;\n if (!path) {\n const currentPath = document.location.pathname + document.location.hash\n if (this.has(currentPath)) {\n path = currentPath\n } else {\n path = document.location.pathname\n }\n searchParams = new URLSearchParams(document.location.search)\n } else {\n searchParams = searchParamsForPath(path)\n }\n path = getPath(routePath(path), this.baseURL);\n for ( let route of this.routeInfo) {\n let params = route.pattern.match(path)\n if (this.addMissingSlash && !params) {\n if (path && path[path.length-1]!='/') {\n const pathWithSlash = path + '/'\n params = route.pattern.match(pathWithSlash)\n if (params) {\n path = pathWithSlash\n history.replaceState({}, '', getURL(path, this.baseURL))\n }\n }\n }\n if (params) {\n Object.assign(params, options)\n args.route = route\n args.params = params\n args = this.runListeners('call', args)\n params = args.params ? args.params : params\n args.searchParams = searchParams\n args.result = callRouteAction(this.app, route, params, searchParams)\n this.runListeners('finish', args)\n return args.result\n }\n }\n return false\n }\n\n runListeners(action, params)\n {\n if (!this.listeners[action] || !Object.keys(this.listeners[action])) {\n return\n }\n Object.keys(this.listeners[action]).forEach((route) => {\n const pattern = compileRoutePattern(route)\n if (pattern.match(routePath(params.path))) {\n var result;\n for (let callback of this.listeners[action][route]) {\n result = callback.call(this.app, params)\n if (result) {\n params = result\n }\n }\n }\n })\n return params\n }\n\n handleEvents()\n {\n this.removeEvents()\n const popstateHandler = () => {\n this.match()\n }\n const clickHandler = (evt) => {\n if (evt.ctrlKey) {\n return;\n }\n if (evt.which != 1) {\n return; // not a 'left' mouse click\n }\n var link = evt.target;\n while (link && link.tagName!='A') {\n link = link.parentElement;\n }\n if (link \n && link.pathname \n && link.hostname==globalThis.location.hostname \n && !link.link\n && !link.dataset.simplyCommand\n ) {\n let check = [\n { match: link.hash, goto: link.hash },\n { match: link.pathname + link.hash, goto: link.pathname + link.search + link.hash },\n { match: link.pathname, goto: link.pathname + link.search }\n ]\n let target\n do {\n target = check.shift()\n target.match = getPath(target.match, this.baseURL);\n } while(check.length && !this.has(target.match))\n if ( this.has(target.match) ) {\n let params = this.runListeners('goto', { path: target.goto});\n if (params.path) {\n const followLink = this.goto(params.path)\n if (!followLink || (this.options.hijackLinks && followLink!==false)) {\n // now cancel the browser navigation, since a route handler was found\n evt.preventDefault();\n return false;\n }\n }\n }\n }\n }\n globalThis.addEventListener('popstate', popstateHandler)\n this.app.container.addEventListener('click', clickHandler)\n this.eventHandlers = {\n container: this.app.container,\n popstateHandler,\n clickHandler\n }\n }\n\n removeEvents()\n {\n if (!this.eventHandlers) {\n return\n }\n globalThis.removeEventListener('popstate', this.eventHandlers.popstateHandler)\n this.eventHandlers.container.removeEventListener('click', this.eventHandlers.clickHandler)\n this.eventHandlers = undefined\n }\n\n destroy()\n {\n this.removeEvents()\n }\n\n goto(path)\n {\n history.pushState({},'',getURL(path, this.baseURL))\n return this.match(path)\n }\n\n has(path)\n {\n path = getPath(routePath(path), this.baseURL)\n for (let route of this.routeInfo) {\n if (route.pattern.match(path)) {\n return true\n }\n }\n return false\n }\n\n addListener(action, route, callback)\n {\n if (['goto','match','call','finish'].indexOf(action)==-1) {\n throw new TypeError(`simplyflow/route: unknown listener type \"${action}\"`)\n }\n if (!this.listeners[action][route]) {\n this.listeners[action][route] = []\n }\n this.listeners[action][route].push(callback)\n }\n\n removeListener(action, route, callback)\n {\n if (['goto','match','call','finish'].indexOf(action)==-1) {\n throw new TypeError(`simplyflow/route: unknown listener type \"${action}\"`)\n }\n if (!this.listeners[action][route]) {\n return\n }\n this.listeners[action][route] = this.listeners[action][route].filter((listener) => {\n return listener != callback\n })\n }\n\n init(options)\n {\n if (options.baseURL) {\n this.baseURL = options.baseURL\n }\n }\n}\n\nfunction callRouteAction(app, route, params, searchParams)\n{\n if (typeof route.action === 'function') {\n return route.action.call(app, params, searchParams)\n }\n\n if (typeof route.action === 'string') {\n const action = app.actions?.[route.action]\n if (typeof action === 'function') {\n return action.call(app, routeActionParams(route, params, searchParams))\n }\n throw unknownRouteActionError(route, app.actions)\n }\n\n throw new TypeError(`simplyflow/route: route \"${route.path}\" must use a function or action name`)\n}\n\nconst warnedRouteQueryConflicts = new Set()\n\nfunction routeActionParams(route, params, searchParams)\n{\n const query = queryParams(searchParams)\n for (const key of Object.keys(query)) {\n if (Object.hasOwn(params, key)) {\n warnRouteQueryConflict(route, key)\n }\n }\n // Query parameters are user-editable, while route params come from the\n // developer-defined route pattern. Route params therefore win on conflicts.\n return Object.assign(query, params)\n}\n\nfunction queryParams(searchParams)\n{\n const params = {}\n for (const [key, value] of searchParams.entries()) {\n if (!Object.hasOwn(params, key)) {\n params[key] = value\n } else if (Array.isArray(params[key])) {\n params[key].push(value)\n } else {\n params[key] = [params[key], value]\n }\n }\n return params\n}\n\nfunction warnRouteQueryConflict(route, key)\n{\n const warningKey = `${route.path}\\0${key}`\n if (warnedRouteQueryConflicts.has(warningKey)) {\n return\n }\n warnedRouteQueryConflicts.add(warningKey)\n console.warn(`simplyflow/route: query parameter \"${key}\" was ignored because route \"${route.path}\" already provides a route parameter with that name.`)\n}\n\nfunction unknownRouteActionError(route, actions)\n{\n const suggestion = closest(route.action, Object.keys(actions || {}))\n const hint = suggestion ? ` Did you mean \"${suggestion}\"?` : ''\n return new TypeError(`simplyflow/route: route \"${route.path}\" uses unknown action \"${route.action}\".${hint}`)\n}\n\nfunction searchParamsForPath(path)\n{\n const index = typeof path === 'string' ? path.indexOf('?') : -1\n if (index === -1) {\n return new URLSearchParams()\n }\n const hashIndex = path.indexOf('#', index)\n const search = hashIndex === -1 ? path.substring(index) : path.substring(index, hashIndex)\n return new URLSearchParams(search)\n}\n\nfunction routePath(path)\n{\n const index = typeof path === 'string' ? path.indexOf('?') : -1\n if (index === -1) {\n return path\n }\n const hashIndex = path.indexOf('#', index)\n if (hashIndex === -1) {\n return path.substring(0, index)\n }\n return path.substring(0, index) + path.substring(hashIndex)\n}\n\nfunction getPath(path, baseURL='/')\n{\n if (path.substring(0,baseURL.length)==baseURL\n ||\n ( baseURL[baseURL.length-1]=='/' \n && path.length==(baseURL.length-1)\n && path == baseURL.substring(0,path.length)\n )\n ) {\n path = path.substring(baseURL.length)\n }\n if (path[0]!='/') {\n path = '/'+path\n }\n return path\n}\n\nfunction getURL(path, baseURL)\n{\n path = getPath(path, baseURL)\n if (baseURL[baseURL.length-1]==='/' && path[0]==='/') {\n path = path.substring(1)\n }\n if (path[0]=='#') {\n return path\n }\n return baseURL + path\n}\n\nfunction compileRoutePattern(path, exact=false)\n{\n const params = []\n const regexp = routeRegexp(path, exact, params)\n return {\n path,\n params,\n regexp,\n match(value) {\n const matches = regexp.exec(value)\n if (!matches) {\n return null\n }\n const result = {}\n params.forEach((name, i) => {\n result[name] = matches[i + 1]\n })\n return result\n }\n }\n}\n\nfunction routeRegexp(route, exact=false, params=[])\n{\n if (route.includes(':*')) {\n throw new TypeError(`simplyflow/route: route \"${route}\" uses the old wildcard syntax \":*\". Use a named wildcard like \":path*\" instead.`)\n }\n const prefix = route[0] === '#' ? '' : '^'\n const suffix = exact ? '$' : ''\n return new RegExp(prefix + routeRegexpSource(route, params) + suffix)\n}\n\nfunction routeRegexpSource(route, params)\n{\n let source = ''\n let index = 0\n while (index < route.length) {\n if (route[index] === ':') {\n const match = /^:([A-Za-z_][A-Za-z0-9_]*)(\\*)?/.exec(route.substring(index))\n if (!match) {\n throw new TypeError(`simplyflow/route: invalid route parameter in \"${route}\"`)\n }\n params.push(match[1])\n source += match[2] ? '(.*)' : '([^/]+)'\n index += match[0].length\n continue\n }\n if (route[index] === '*') {\n source += '.*'\n index++\n continue\n }\n source += escapeRegexp(route[index])\n index++\n }\n return source\n}\n\nfunction escapeRegexp(value)\n{\n return value.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n}\n\nfunction parseRoutes(routes, routeInfo, exact=false)\n{\n const paths = Object.keys(routes)\n for (let path of paths) {\n routeInfo.push({\n path,\n pattern: compileRoutePattern(path, exact),\n action: routes[path]\n })\n }\n return routeInfo\n}\n", "const path = {\n\tget(dataset, pointer) {\n\t\tif (typeof pointer !== 'string') {\n\t\t\treturn pointer\n\t\t}\n\t\tif (!pointer) {\n\t\t\treturn dataset\n\t\t}\n\t\treturn pointer.split('.').reduce(function(acc, name) {\n\t if (acc == null) {\n\t return null\n\t }\n\t if (!Reflect.has(Object(acc), name)) {\n\t return null\n\t }\n\t return acc[name]\n\t }, dataset)\n\t},\n\tset: function(dataset, pointer, value) {\n\t\tconst parent = path.get(dataset, path.parent(pointer))\n\t\tif (parent == null) {\n\t\t\tthrow new TypeError(`simplyflow/path: cannot set \"${pointer}\" because its parent path does not exist`)\n\t\t}\n\t\tparent[path.pop(pointer)] = value\n\t},\n\tpop: function(pointer) {\n\t\treturn pointer.split('.').pop()\n\t},\n\tpush: function(pointer, name) {\n\t\treturn (pointer ? pointer + '.' : '') + name\n\t},\n\tparent: function(pointer) {\n\t\tconst names = pointer.split('.')\n\t\tnames.pop()\n\t\treturn names.join('.')\n\t},\n\tparents: function(dataset, pointer) {\n\t\tlet result = []\n\t\twhile (pointer) {\n\t\t\tpointer = path.parent(pointer)\n\t\t\tresult.unshift(pointer)\n\t\t}\n\t\treturn result\n\t}\n}\n\nexport default path\n", "import { closest } from './suggest.mjs'\nimport path from './path.mjs'\n\nconst commandState = new WeakMap()\nconst COMMAND_OPTIONS = [\n 'commands',\n 'handlers',\n 'app',\n 'container'\n]\n\nclass SimplyCommands {\n\tconstructor(options={}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n this.app = options.app\n\t\tthis.$handlers = options.handlers || defaultHandlers\n if (options.commands) {\n \t\tObject.assign(this, options.commands)\n }\n\n\t\tconst commandHandler = (evt) => {\n\t\t\tconst command = getCommand(evt, this.$handlers, this.app)\n\t\t\tif (!command) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this[command.name]) {\n warnUnknownCommand(this, command.name, command.source)\n return\n\t\t\t}\n const shouldContinue = this[command.name].call(options.app, command.source, command.value, evt)\n if (shouldContinue!==true) {\n evt.preventDefault()\n evt.stopPropagation()\n return false\n }\n\t\t}\n\n const container = options.app.container\n container.addEventListener('click', commandHandler)\n container.addEventListener('submit', commandHandler)\n container.addEventListener('change', commandHandler)\n container.addEventListener('input', commandHandler)\n commandState.set(this, { container, commandHandler })\n\t}\n\n call(command, el, value, event) {\n if (!this[command]) {\n warnUnknownCommand(this, command, el)\n return\n }\n return this[command].call(this.app, el, value, event)\n }\n\n appendHandler(handler) {\n this.$handlers.push(handler)\n }\n\n prependHandler(handler) {\n this.$handlers.unshift(handler)\n }\n}\n\nexport function commands(options={}) {\n\treturn new SimplyCommands(options)\n}\n\nexport function destroyCommands(commandApi)\n{\n const state = commandState.get(commandApi)\n if (!state) {\n return\n }\n state.container.removeEventListener('click', state.commandHandler)\n state.container.removeEventListener('submit', state.commandHandler)\n state.container.removeEventListener('change', state.commandHandler)\n state.container.removeEventListener('input', state.commandHandler)\n commandState.delete(commandApi)\n}\n\nfunction getCommand(evt, handlers, app) {\n var el = evt.target.closest('[data-simply-command]')\n if (el) {\n for (let handler of handlers) {\n if (el.matches(handler.match)) {\n if (handler.check(el, evt)) {\n return {\n name: el.dataset.simplyCommand,\n source: el,\n value: handler.get(el, app)\n }\n }\n return null\n }\n }\n }\n return null\n}\n\n\nfunction getConfiguredCommandValue(el, app)\n{\n const pathAttribute = 'simplyValuePath'\n if (Object.hasOwn(el.dataset, pathAttribute)) {\n return {\n found: true,\n value: path.get(app?.data, el.dataset[pathAttribute])\n }\n }\n if (Object.hasOwn(el.dataset, 'simplyValue')) {\n return { found: true, value: el.dataset.simplyValue }\n }\n return { found: false, value: undefined }\n}\n\nconst defaultHandlers = [\n {\n match: 'input,select,textarea',\n get: function(el, app) {\n const configuredValue = getConfiguredCommandValue(el, app)\n if (configuredValue.found) {\n return configuredValue.value\n }\n if (el.tagName==='SELECT' && el.multiple) {\n let values = []\n for (let option of el.options) {\n if (option.selected) {\n values.push(option.value)\n }\n }\n return values\n }\n return el.value\n },\n check: function(el, evt) {\n return evt.type=='change' || (el.dataset.simplyImmediate && evt.type=='input')\n }\n },\n {\n match: 'a,button',\n get: function(el, app) {\n const configuredValue = getConfiguredCommandValue(el, app)\n if (configuredValue.found) {\n return configuredValue.value\n }\n return el.href || el.value\n },\n check: function(el,evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n },\n {\n match: 'form',\n get: function(el) {\n let data = {}\n for (let input of Array.from(el.elements)) {\n if (input.tagName=='INPUT' \n && (input.type=='checkbox' || input.type=='radio')\n ) {\n if (!input.checked) {\n return;\n }\n }\n if (data[input.name] && !Array.isArray(data[input.name])) {\n data[input.name] = [data[input.name]]\n }\n if (Array.isArray(data[input.name])) {\n data[input.name].push(input.value)\n } else {\n data[input.name] = input.value\n }\n }\n return data\n },\n check: function(el,evt) {\n return evt.type=='submit'\n }\n },\n {\n \tmatch: '*',\n get: function(el, app) {\n return getConfiguredCommandValue(el, app).value\n },\n check: function(el, evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n }\n]\n\nconst unknownCommandWarnings = new WeakMap()\n\nfunction warnUnknownCommand(commands, command, source)\n{\n let warned = unknownCommandWarnings.get(commands)\n if (!warned) {\n warned = new Set()\n unknownCommandWarnings.set(commands, warned)\n }\n if (warned.has(command)) {\n return\n }\n warned.add(command)\n\n const suggestion = closest(command, commandNames(commands))\n const suffix = suggestion ? `. Did you mean \"${suggestion}\"?` : ''\n if (source) {\n console.warn(`simplyflow/command: unknown command \"${command}\"${suffix}`, { cause: source })\n } else {\n console.warn(`simplyflow/command: unknown command \"${command}\"${suffix}`)\n }\n}\n\nfunction commandNames(commands)\n{\n return Object.keys(commands).filter(command => {\n return !command.startsWith('$') &&\n !COMMAND_OPTIONS.includes(command) &&\n typeof commands[command] === 'function'\n })\n}\n\n", "import { closest } from './suggest.mjs'\n\nconst warnedUnknownActions = new WeakMap()\n\nexport function actions(options) \n{\n\tif (options.app) {\n\t\tconst functionHandler = {\n\t\t\tapply(target, thisArg, argumentsList)\n\t\t\t{\n\t\t\t\ttry {\n\t\t\t\t\tconst result = target(...argumentsList)\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\treturn result.catch(err => {\n\t\t\t\t\t\t\treturn options.app.onError.call(this, err, target)\n\t\t\t\t\t\t})\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t} catch(err) {\n\t\t\t\t\treturn options.app.onError.call(this, err, target)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst actionHandler = {\n\t\t\tget(target, property)\n\t\t\t{\n\t\t\t\tif (!Object.hasOwn(target, property)) {\n\t\t\t\t\twarnUnknownAction(target, property)\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\tif (options.app.onError) {\n\t\t\t\t\treturn new Proxy(target[property].bind(options.app), functionHandler)\n\t\t\t\t} else {\n\t\t\t\t\treturn target[property].bind(options.app)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new Proxy(options.actions, actionHandler)\n\t} else {\n\t\treturn options\n\t}\n}\n\nfunction warnUnknownAction(actions, property)\n{\n\tif (typeof property !== 'string') {\n\t\treturn\n\t}\n\n\tlet warned = warnedUnknownActions.get(actions)\n\tif (!warned) {\n\t\twarned = new Set()\n\t\twarnedUnknownActions.set(actions, warned)\n\t}\n\tif (warned.has(property)) {\n\t\treturn\n\t}\n\twarned.add(property)\n\n\tconst suggestion = closest(property, Object.keys(actions))\n\tconst suffix = suggestion ? `. Did you mean \"${suggestion}\"?` : ''\n\tconsole.warn(`simplyflow/action: unknown action \"${property}\"${suffix}`)\n}\n", "const shortcutState = new WeakMap()\nconst accesskeyState = new WeakMap()\n\nconst KEY = Object.freeze({\n\tCompose: 229,\n\tControl: 17,\n\tMeta: 224,\n\tAlt: 18,\n\tShift: 16\n})\n\nclass SimplyShortcuts\n{\n\tconstructor(options = {})\n\t{\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n\t\tObject.assign(this, options.shortcuts)\n\n\t\tconst keyHandler = (e) => {\n\t\t\tlet shortcutScopes = []\n\t\t\tlet shortcutElement = e.target.closest('[data-simply-shortcuts]')\n\t\t\twhile (shortcutElement) {\n\t\t\t\tshortcutScopes.push(shortcutElement.dataset.simplyShortcuts)\n\t\t\t\tshortcutElement = shortcutElement.parentNode.closest('[data-simply-shortcuts]')\n\t\t\t}\n\t\t\tif (shortcutScopes[shortcutScopes.length-1]!='default') {\n\t\t\t\tshortcutScopes.push('default')\n\t\t\t}\n\n\t\t\tlet shortcutScope\n\t\t\tlet separators = ['+','-']\n\n\t\t\tfor (let separator of separators) {\n\t\t\t\tconst keyString = getKeyString(e, separator)\n\t\t\t\tfor (let i in shortcutScopes) {\n\t\t\t\t\tshortcutScope = shortcutScopes[i]\n\t\t\t\t\tif (this[shortcutScope] && (typeof this[shortcutScope][keyString]=='function')) {\n\t\t\t\t\t\tlet _continue = this[shortcutScope][keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof this[shortcutScope + '.' + keyString] == 'function') {\n\t\t\t\t\t\tlet _continue = this[shortcutScope + '.' + keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof this[keyString] == 'function') {\n\t\t\t\t\t\tlet _continue = this[keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst container = options.app.container\n\t\tcontainer.addEventListener('keydown', keyHandler)\n\t\tshortcutState.set(this, { container, keyHandler })\n\t}\n}\n\nfunction getKeyString(e, separator='+')\n{\n\tif (e.isComposing || e.keyCode === KEY.Compose) {\n\t return\n\t}\n\tif (e.defaultPrevented) {\n\t return\n\t}\n\tif (!e.target) {\n\t return\n\t}\n\n\tlet keyCombination = []\n\tif (e.ctrlKey && e.keyCode!=KEY.Control) {\n\t keyCombination.push('Control')\n\t}\n\tif (e.metaKey && e.keyCode!=KEY.Meta) {\n\t keyCombination.push('Meta')\n\t}\n\tif (e.altKey && e.keyCode!=KEY.Alt) {\n\t keyCombination.push('Alt')\n\t}\n\tif (e.shiftKey && e.keyCode!=KEY.Shift) {\n\t keyCombination.push('Shift')\n\t}\n\tkeyCombination.push(e.key.toLowerCase())\n\treturn keyCombination.join(separator)\n}\n\nexport function shortcuts(options={})\n{\n\treturn new SimplyShortcuts(options)\n}\n\nexport function destroyShortcuts(shortcutApi)\n{\n\tconst state = shortcutState.get(shortcutApi)\n\tif (!state) {\n\t\treturn\n\t}\n\tstate.container.removeEventListener('keydown', state.keyHandler)\n\tshortcutState.delete(shortcutApi)\n}\n\nexport function accesskeys(options={}) {\n\tconst container = options.container || options.app?.container || document.body\n\tconst keyHandler = (e) => {\n\t\tconst separators = [\"+\", \"-\"]\n\t\tfor (const separator of separators) {\n\t\t\tconst keyString = getKeyString(e, separator)\n\t\t\tconst selector = \"[data-simply-accesskey='\" + keyString + \"']\"\n\t\t\tconst targets = container.querySelectorAll(selector)\n\t\t\tif (targets.length) {\n\t\t\t\ttargets.forEach(function(target) {\n\t\t\t\t\ttarget.click()\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\tcontainer.addEventListener('keydown', keyHandler)\n\tconst controller = {}\n\taccesskeyState.set(controller, { container, keyHandler })\n\treturn controller\n}\n\nexport function destroyAccesskeys(accesskeyApi)\n{\n\tconst state = accesskeyState.get(accesskeyApi)\n\tif (!state) {\n\t\treturn\n\t}\n\tstate.container.removeEventListener('keydown', state.keyHandler)\n\taccesskeyState.delete(accesskeyApi)\n}\n", "import { closest } from './suggest.mjs'\n\nconst BEHAVIOR_SELECTOR = '[data-simply-behavior]'\n\nclass SimplyBehaviors\n{\n constructor(options = {})\n {\n this.app = options.app\n this.container = options.container || document.body\n this.behaviors = options.behaviors || {}\n this.active = new Set()\n this.cleanups = new WeakMap()\n this.unknown = new Set()\n\n this.observer = new MutationObserver((changes) => this.handleChanges(changes))\n this.observer.observe(this.container, {\n subtree: true,\n childList: true\n })\n\n for (const node of behaviorNodes(this.container)) {\n this.start(node)\n }\n }\n\n start(node)\n {\n if (this.active.has(node)) {\n return\n }\n\n const name = node?.dataset?.simplyBehavior\n const behavior = this.behaviors[name]\n if (!name || typeof behavior !== 'function') {\n this.warnUnknown(name, node)\n return\n }\n\n this.active.add(node)\n const cleanup = behavior.call(this.app || node, node)\n if (typeof cleanup === 'function') {\n this.cleanups.set(node, cleanup)\n } else if (typeof cleanup !== 'undefined') {\n console.warn('simplyflow/behavior: behavior may only return a cleanup function', { cause: cleanup })\n }\n }\n\n stop(node)\n {\n if (!this.active.has(node)) {\n return\n }\n this.active.delete(node)\n\n const cleanup = this.cleanups.get(node)\n this.cleanups.delete(node)\n if (cleanup) {\n cleanup.call(this.app || node, node)\n }\n }\n\n handleChanges(changes)\n {\n const added = []\n for (const change of changes) {\n if (change.type !== 'childList') {\n continue\n }\n for (const node of change.removedNodes) {\n for (const behaviorNode of behaviorNodes(node)) {\n this.stop(behaviorNode)\n }\n }\n for (const node of change.addedNodes) {\n added.push(...behaviorNodes(node))\n }\n }\n for (const node of added) {\n this.start(node)\n }\n }\n\n warnUnknown(name, node)\n {\n if (!name || this.unknown.has(name)) {\n return\n }\n this.unknown.add(name)\n\n const suggestion = closest(name, Object.keys(this.behaviors))\n const suffix = suggestion ? `. Did you mean \"${suggestion}\"?` : ''\n console.warn(`simplyflow/behavior: unknown behavior \"${name}\"${suffix}`, { cause: node })\n }\n\n destroy()\n {\n this.observer.disconnect()\n for (const node of Array.from(this.active)) {\n this.stop(node)\n }\n }\n}\n\nexport function behaviors(options = {})\n{\n return new SimplyBehaviors(options)\n}\n\nfunction behaviorNodes(root)\n{\n if (!root?.querySelectorAll) {\n return []\n }\n\n const nodes = Array.from(root.querySelectorAll(BEHAVIOR_SELECTOR))\n if (root.matches?.(BEHAVIOR_SELECTOR)) {\n nodes.unshift(root)\n }\n return nodes\n}\n", "function throttle(callbackFunction, intervalTime)\n{\n let eventId = 0\n return function throttledCallback(...params) {\n if (eventId) {\n return\n }\n eventId = globalThis.setTimeout(() => {\n eventId = 0\n callbackFunction.apply(this, params)\n }, intervalTime)\n }\n}\n\nconst runWhenIdle = (() => {\n if (globalThis.requestIdleCallback) {\n return (callback) => {\n globalThis.requestIdleCallback(callback, {timeout: 500})\n }\n }\n return globalThis.requestAnimationFrame || ((callback) => globalThis.setTimeout(callback, 0))\n})()\n\nfunction rebaseHref(relative, base, cacheBuster)\n{\n const url = new URL(relative, base)\n if (cacheBuster) {\n url.searchParams.set('cb', cacheBuster)\n }\n return url.href\n}\n\nfunction cloneScript(script, base, cacheBuster)\n{\n const clone = globalThis.document.createElement('script')\n for (const attr of script.attributes) {\n clone.setAttribute(attr.name, attr.value)\n }\n clone.removeAttribute('data-simply-location')\n\n if (clone.hasAttribute('src')) {\n clone.src = rebaseHref(clone.getAttribute('src'), base, cacheBuster)\n } else {\n clone.textContent = script.textContent\n }\n return clone\n}\n\nfunction insertScript(script, placeholder)\n{\n placeholder.parentNode.insertBefore(script, placeholder)\n placeholder.parentNode.removeChild(placeholder)\n}\n\nfunction shouldWaitForScript(script)\n{\n // Async scripts are explicitly independent. Every other external script from\n // an include is treated as ordered, including scripts that used `defer`;\n // dynamically inserted `defer` scripts do not reliably model parser defer.\n return script.hasAttribute('src') && !script.hasAttribute('async')\n}\n\nfunction insertAndWaitForScript(script, placeholder)\n{\n return new Promise((resolve) => {\n const done = () => {\n script.removeEventListener('load', done)\n script.removeEventListener('error', done)\n resolve()\n }\n script.addEventListener('load', done)\n script.addEventListener('error', done)\n insertScript(script, placeholder)\n })\n}\n\nfunction findIncludeLinks(container)\n{\n const selector = 'link[rel=\"simply-include\"],link[rel=\"simply-include-once\"]'\n const links = Array.from(container.querySelectorAll(selector))\n if (container.matches?.(selector)) {\n links.unshift(container)\n }\n return links\n}\n\nclass SimplyIncludes\n{\n constructor(options={})\n {\n this.container = options.container || globalThis.document\n this.cacheBuster = options.cacheBuster ?? defaultCacheBuster\n this.included = Object.create(null)\n this.scriptLocations = []\n this.destroyed = false\n this.handleChanges = throttle(() => {\n runWhenIdle(() => {\n if (!this.destroyed) {\n this.includeLinks(findIncludeLinks(this.container))\n }\n })\n }, 10)\n if (options.observe !== false) {\n this.observer = new MutationObserver(this.handleChanges)\n this.observer.observe(this.container, {\n subtree: true,\n childList: true,\n })\n this.handleChanges()\n }\n }\n\n async scripts(scripts, base)\n {\n const arr = scripts.slice()\n for (const script of arr) {\n if (this.destroyed) {\n return\n }\n const clone = cloneScript(script, base, this.cacheBuster)\n const node = this.scriptLocations[script.dataset.simplyLocation]\n if (!node?.parentNode) {\n continue\n }\n\n // Included scripts should behave like normal document-order scripts by default:\n // each blocking external script must finish loading and running before the next\n // script from the include is inserted. Dynamically inserted scripts are async by\n // default, so async=false and waiting for load are both needed here.\n const waitForLoad = shouldWaitForScript(clone)\n if (waitForLoad) {\n clone.async = false // important: set the property, not the boolean attribute\n await insertAndWaitForScript(clone, node)\n } else {\n insertScript(clone, node)\n }\n }\n }\n\n html(html, link)\n {\n const fragment = globalThis.document.createRange().createContextualFragment(html)\n const stylesheets = fragment.querySelectorAll('link[rel=\"stylesheet\"],style')\n for (const stylesheet of stylesheets) {\n const href = stylesheet.getAttribute('href')\n if (href) {\n stylesheet.href = rebaseHref(href, link.href, this.cacheBuster)\n }\n globalThis.document.head.appendChild(stylesheet)\n }\n\n // Scripts imported through a fragment do not execute reliably in document order.\n // Placeholders preserve their positions while scripts are reinserted sequentially.\n const scriptsFragment = globalThis.document.createDocumentFragment()\n const scripts = fragment.querySelectorAll('script')\n if (scripts.length) {\n for (const script of scripts) {\n const placeholder = globalThis.document.createComment(script.src || 'inline script')\n script.parentNode.insertBefore(placeholder, script)\n script.dataset.simplyLocation = this.scriptLocations.length\n this.scriptLocations.push(placeholder)\n scriptsFragment.appendChild(script)\n }\n globalThis.setTimeout(() => {\n this.scripts(Array.from(scriptsFragment.children), link ? link.href : globalThis.location.href)\n }, 10)\n }\n\n link.parentNode.insertBefore(fragment, link)\n }\n\n async includeLinks(links)\n {\n const remainingLinks = links.reduce((remainder, link) => {\n if (link.rel === 'simply-include-once' && this.included[link.href]) {\n link.parentNode.removeChild(link)\n } else {\n this.included[link.href] = true\n link.rel = 'simply-include-loading'\n remainder.push(link)\n }\n return remainder\n }, [])\n\n for (const link of remainingLinks) {\n if (this.destroyed || !link.href) {\n continue\n }\n try {\n const response = await fetch(link.href)\n if (!response.ok) {\n console.warn(`simplyflow/include: failed to load \"${link.href}\" (${response.status})`)\n link.rel = 'simply-include-error'\n continue\n }\n const html = await response.text()\n if (this.destroyed || !link.parentNode) {\n continue\n }\n this.html(html, link)\n link.parentNode?.removeChild(link)\n } catch (error) {\n console.warn(`simplyflow/include: failed to load \"${link.href}\"`, { cause: error })\n link.rel = 'simply-include-error'\n }\n }\n }\n\n destroy()\n {\n this.destroyed = true\n this.observer?.disconnect()\n this.observer = undefined\n }\n}\n\nexport function includes(options={})\n{\n return new SimplyIncludes(options)\n}\n\nlet defaultCacheBuster = null\nconst defaultInclude = () => new SimplyIncludes({\n container: globalThis.document,\n cacheBuster: defaultCacheBuster,\n observe: false\n})\n\nexport const include = {\n get cacheBuster() {\n return defaultCacheBuster\n },\n set cacheBuster(value) {\n defaultCacheBuster = value\n },\n scripts: (scripts, base) => defaultInclude().scripts(scripts, base),\n html: (html, link) => defaultInclude().html(html, link),\n links: (links) => defaultInclude().includeLinks(Array.from(links))\n}\n", "import { bind } from './bind.mjs'\nimport { signal } from './state.mjs'\nimport { routes } from './route.mjs'\nimport { commands, destroyCommands } from './command.mjs'\nimport { actions } from './action.mjs'\nimport { shortcuts, destroyShortcuts, accesskeys, destroyAccesskeys } from './shortcut.mjs'\nimport { behaviors } from './behavior.mjs'\nimport { includes } from './include.mjs'\nimport { closest } from './suggest.mjs'\n\nconst APP_OPTIONS = [\n 'container',\n 'data',\n 'templates',\n 'styles',\n 'start',\n 'onError',\n 'components',\n 'behaviors',\n 'baseURL',\n 'commands',\n 'shortcuts',\n 'routes',\n 'actions'\n]\n\nclass SimplyApp\n{\n constructor(options={})\n {\n if (options.components) {\n const mergedOptions = {}\n mergeComponents(mergedOptions, options.components)\n mergeOptions(mergedOptions, options) // app options override component options\n options = mergedOptions\n }\n\n\n this.container = options.container || document.body\n this.destroyed = false\n this.data = signal(options.data || {})\n this.start = options.start\n this.onError = options.onError\n this.components = options.components\n this.baseURL = options.baseURL\n\n installTemplates(this.container, options.templates)\n installStyles(this.container, options.styles)\n\n for (const key of Object.keys(options)) {\n switch(key) {\n case 'container':\n case 'data':\n case 'templates':\n case 'styles':\n case 'start':\n case 'onError':\n case 'components':\n case 'baseURL':\n break\n case 'commands':\n this.commands = commands({ app: this, container: this.container, commands: options.commands})\n break\n case 'shortcuts':\n this.shortcuts = shortcuts({ app: this, shortcuts: options.shortcuts })\n break\n case 'behaviors':\n this.behaviors = behaviors({ app: this, container: this.container, behaviors: options.behaviors })\n break\n case 'routes':\n this.routes = routes({ app: this, routes: options.routes})\n break\n case 'actions':\n this.actions = actions({app: this, actions: options.actions})\n break\n case 'prototype':\n case '__proto__':\n // ignore this to avoid prototype pollution\n break\n default:\n // Unknown options become app properties. Warn only when the\n // name is close to a built-in option, which usually means a typo.\n warnLikelyOptionTypo(key)\n this[key] = options[key]\n break\n }\n }\n\n this.binding = bind({\n root: this.data,\n container: this.container,\n attribute: 'data-simply'\n })\n\n this.includes = includes({ container: this.container })\n\n this.accesskeys = accesskeys({ app: this, container: this.container })\n }\n\n get app()\n {\n return this\n }\n\n destroy()\n {\n this.destroyed = true\n if (this.binding) {\n this.binding.destroy()\n this.binding = undefined\n }\n if (this.commands) {\n destroyCommands(this.commands)\n }\n if (this.shortcuts) {\n destroyShortcuts(this.shortcuts)\n }\n if (this.accesskeys) {\n destroyAccesskeys(this.accesskeys)\n this.accesskeys = undefined\n }\n if (this.routes) {\n this.routes.destroy()\n this.routes = undefined\n }\n if (this.behaviors) {\n this.behaviors.destroy()\n this.behaviors = undefined\n }\n if (this.includes) {\n this.includes.destroy()\n this.includes = undefined\n }\n }\n}\n\nfunction installTemplates(container, templates)\n{\n if (!templates) {\n return\n }\n for (const name of Object.keys(templates)) {\n const element = document.createElement('div')\n element.innerHTML = templates[name]\n let template = container.querySelector('template#'+name)\n if (!template) {\n template = document.createElement('template')\n template.id = name\n template.content.append(...element.children)\n container.appendChild(template)\n } else {\n template.content.replaceChildren(...element.children)\n }\n }\n}\n\nfunction installStyles(container, styles)\n{\n if (!styles) {\n return\n }\n for (const name of Object.keys(styles)) {\n let style = container.querySelector('style#'+name+'.css')\n if (!style) {\n style = document.createElement('style')\n style.id = name+'.css'\n container.appendChild(style)\n }\n style.innerHTML = styles[name]\n }\n}\n\n\nfunction warnLikelyOptionTypo(key)\n{\n const suggestion = closest(key, APP_OPTIONS)\n if (suggestion) {\n console.warn(`simplyflow/app: unknown option \"${key}\". Did you mean \"${suggestion}\"? The option was still added to the app as \"app.${key}\".`)\n }\n}\n\nfunction initRoutes(app) {\n if (app.destroyed) {\n return\n }\n if (app.routes) {\n if (app.baseURL) {\n app.routes.init({ baseURL: app.baseURL })\n }\n app.routes.handleEvents()\n globalThis.setTimeout(() => {\n if (app.destroyed || !app.routes) {\n return\n }\n if (app.routes.has(globalThis.location?.hash)) {\n app.routes.match(globalThis.location.hash)\n } else {\n app.routes.match(globalThis.location?.pathname+globalThis.location?.hash)\n }\n })\n }\n}\n\n\nfunction handleAppError(app, error, context)\n{\n if (app.onError) {\n return app.onError.call(app, error, context)\n }\n throw error\n}\n\nexport function app(options={})\n{\n const app = new SimplyApp(options)\n if (!app.start) {\n initRoutes(app)\n return app\n }\n\n try {\n const result = app.start.call(app)\n if (result instanceof Promise) {\n result.then(() => initRoutes(app)).catch(error => handleAppError(app, error, app.start))\n } else {\n initRoutes(app)\n }\n } catch (error) {\n handleAppError(app, error, app.start)\n }\n return app\n}\n\n\nfunction mergeOptions(options, otherOptions)\n{\n for (const key of Object.keys(otherOptions)) {\n switch(typeof otherOptions[key]) {\n case 'object':\n if (!otherOptions[key]) {\n continue // null\n }\n if (!options[key]) {\n options[key] = otherOptions[key]\n } else {\n mergeOptions(options[key], otherOptions[key])\n }\n break\n default:\n options[key] = otherOptions[key]\n }\n }\n}\n\nfunction mergeComponents(options, components) {\n for (const name of Object.keys(components)) {\n const component = components[name]\n if (component.components) {\n mergeComponents(options, component.components)\n }\n if (!options.components) {\n options.components = {}\n }\n options.components[name] = component\n for (const key of Object.keys(component)) {\n switch(key) {\n case 'start':\n case 'onError':\n // App lifecycle functions are app-level behavior, not merged component state.\n case 'components':\n // already handled\n break\n default:\n if (!options[key]) {\n options[key] = Object.create(null)\n }\n mergeOptions(options[key], component[key])\n break\n }\n }\n }\n}\n", "export function html(strings, ...values) {\n const outputArray = values.map(\n (value, index) =>\n `${strings[index]}${value}`,\n );\n return outputArray.join(\"\") + strings[strings.length - 1];\n}\n\nexport function css(strings, ...values) {\n\treturn html(strings, ...values)\n}\n", "import { bind } from './bind.mjs'\nimport * as model from './model.mjs'\nimport * as state from './state.mjs'\nimport './render.mjs'\nimport * as dom from './dom.mjs'\nimport { app } from './app.mjs'\nimport { actions } from './action.mjs'\nimport { behaviors } from './behavior.mjs'\nimport { commands } from './command.mjs'\nimport { include, includes } from './include.mjs'\nimport { shortcuts } from './shortcut.mjs'\nimport path from './path.mjs'\nimport { routes, SimplyRoute } from './route.mjs'\nimport { html, css } from './highlight.mjs'\n\nif (!globalThis.simply) {\n globalThis.simply = {}\n}\n\n// These global template tags are intentional. Many editors recognize\n// html`...` and css`...` template literals and provide syntax highlighting.\n// Keeping them global gives script-tag users the same authoring experience\n// without requiring a build step or explicit imports.\nglobalThis.html = html\nglobalThis.css = css\n\nconst modelApi = Object.assign(model.model, {\n model: model.model,\n sort: model.sort,\n paging: model.paging,\n filter: model.filter,\n columns: model.columns,\n scroll: model.scroll\n})\n\nObject.assign(globalThis.simply, {\n app,\n bind,\n model: modelApi,\n state,\n signal: state.signal,\n effect: state.effect,\n batch: state.batch,\n clone: state.clone,\n destroy: state.destroy,\n untracked: state.untracked,\n throttledEffect: state.throttledEffect,\n clockEffect: state.clockEffect,\n createSignal: state.createSignal,\n isSignal: state.isSignal,\n raw: state.raw,\n dom,\n behaviors,\n actions,\n commands,\n include,\n includes,\n shortcuts,\n path,\n routes\n})\n\ndelete globalThis.simply.advanced\n\nexport {\n app,\n bind,\n model,\n state,\n dom,\n behaviors,\n actions,\n commands,\n include,\n includes,\n shortcuts,\n path,\n routes,\n SimplyRoute,\n html,\n css\n}\n\nexport default globalThis.simply\n"],
5
- "mappings": "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",
6
- "names": ["state_exports", "__export", "addTracer", "batch", "clockEffect", "clone", "createSignal", "destroy", "effect", "getSignal", "isSignal", "makeContext", "notifyGet", "notifySet", "raw", "registerSignal", "signal", "signals", "throttledEffect", "trace", "untracked", "DEP", "MAP_READS_KEY", "MAP_READS_ITERATION", "MAP_WRITES", "SET_WRITES", "SET_ITERATION_PROPERTIES", "isObjectLike", "value", "isSignal", "DEP", "raw", "getSignal", "signals", "targetSignal", "target", "readTarget", "property", "bindMethod", "receiver", "collectRemovedArrayValues", "nextLength", "values", "index", "addArrayLengthChanges", "context", "oldLength", "removedValues", "oldValue", "notifyContext", "notifySet", "wrapArrayMethod", "args", "result", "makeContext", "addMapWriteChanges", "oldSize", "key", "nextValue", "hadKey", "oldEntries", "wrapMapMethod", "notifyGet", "addChanges", "addSetWriteChanges", "hadValue", "prop", "wrapSetMethod", "propertyValueChanged", "descriptor", "oldDescriptor", "newDescriptor", "newValue", "signalHandler", "signal", "hadOwn", "hasOwn", "assertSignalTarget", "name", "assertProxyHandler", "handler", "signalProxyHandler", "registerSignal", "proxy", "rawTarget", "existing", "createSignal", "init", "tracers", "tracing", "trace", "getListeners", "listener", "addTracer", "tracer", "callTracers", "kind", "params", "batchedListeners", "batchDepth", "self", "listeners", "change", "listenersFor", "addContextChange", "runListeners", "clearContext", "currentCompute", "computeStack", "setListeners", "listenersMap", "computeMap", "emptyListeners", "compute", "dependencies", "clearListeners", "effectStack", "signalStack", "effectMap", "assertFunction", "fn", "assertNotRecursive", "effectSignal", "connectedSignal", "setEffectResult", "runTracked", "effectType", "currentEffect", "effect", "destroy", "batch", "finish", "runBatchedListeners", "clocked", "ready", "throttledEffect", "throttleTime", "throttledUntil", "hasChange", "timeout", "now", "schedule", "delay", "clockQueues", "readClockTime", "clock", "getClockQueue", "queue", "time", "pending", "clockEffect", "detachClockEffect", "clockSignal", "untracked", "current", "cloneOptions", "options", "typeName", "isPlainObject", "prototype", "isTypedArray", "isIntegerKey", "hasToClone", "cannotClone", "path", "cloneDescriptorProperties", "source", "cloneValue", "skip", "descriptors", "cloneArrayBuffer", "cloneSharedArrayBuffer", "cloneErrorObject", "errors", "error", "clone", "deep", "seen", "cloneChild", "mapValue", "mapKey", "setValue", "buffer", "escape_html", "context", "next", "content", "fixed_content", "dom_exports", "__export", "findAttribute", "signal", "trackDomField", "trackDomList", "domSignals", "observers", "domSignalHandler", "target", "property", "receiver", "value", "notifyGet", "signal", "current", "now", "notifySet", "makeContext", "getSignal", "DEP", "el", "options", "isSignal", "existing", "createSignal", "proxy", "domListen", "oldContentHTML", "oldContentText", "observer", "mutationList", "changes", "mutation", "prop", "prevValue", "prevChecked", "notifyFormValue", "trackDomList", "element", "path", "s", "throttledEffect", "children", "untracked", "batch", "key", "currentList", "getValueByPath", "source", "item", "setValueByPath", "trackDomField", "props", "valueIsString", "stringProperty", "getUpdateValue", "updateValue", "getProperties", "currentValue", "findAttribute", "attr", "writesFromDom", "binding", "context", "field", "fieldByTemplates", "renderer", "list", "length", "arrayByTemplates", "map", "objectByTemplates", "isInt", "s", "setValueByPath", "root", "path", "value", "batch", "parts", "curr", "part", "prev", "prevPart", "prevCurr", "intKey", "prop", "attribute", "attributes", "attrQuery", "keyAttribute", "items", "usedItems", "cursor", "index", "item", "nextUnusedItem", "newTemplate", "reusableItem", "DEP", "findReusableItem", "updateItemKey", "trackDomList", "start", "template", "key", "oldKey", "newKey", "oldPrefix", "newPrefix", "bindings", "attr", "bindPath", "findItemByKey", "stringKey", "rendered", "getParentPath", "clone", "el", "parentEl", "input", "setProperties", "checkboxIsChecked", "matchValue", "trackDomField", "checkboxEditValue", "radioEditValue", "selected", "currentValue", "values", "button", "element", "select", "option", "o", "setSelectOptions", "selectMultipleEditValue", "addOption", "options", "anchor", "updateProperties", "image", "iframe", "meta", "extraprops", "valueIsString", "strValue", "props", "data", "properties", "property", "getProperties", "result", "a", "b", "SimplyBind", "options", "defaultTransformers", "escape_html", "fixed_content", "defaultOptions", "field", "list", "map", "input", "button", "select", "anchor", "image", "iframe", "meta", "element", "attribute", "bindAttributes", "transformAttribute", "getBindingAttribute", "el", "foundAttribute", "attr", "renderElement", "throttledEffect", "untrack", "binding", "destroy", "context", "getValueByPath", "track", "runTransformers", "transformers", "t", "next", "transformer", "applyBindings", "bindings", "bindingEl", "updateBindings", "changes", "selector", "change", "node", "error", "path", "parent", "templates", "index", "value", "template", "result", "clone", "attributes", "bind", "DEP", "fragment", "links", "valueAttribute", "valuePathAttribute", "valueSelector", "elements", "resolved", "templateCommandValue", "link", "templateMatches", "currentItem", "strItem", "matches", "rel", "replacement", "tracking", "track", "el", "context", "untrack", "tracking", "path", "list", "trackedPath", "templateCommandValue", "value", "index", "templateItemPath", "joinPath", "suffix", "getValueByPath", "root", "parts", "curr", "part", "prevPart", "model_exports", "__export", "columns", "filter", "model", "paging", "scroll", "sort", "SimplyFlowModel", "state", "signal", "fn", "dataSignal", "connectedSignal", "isSignal", "model", "options", "sort", "data", "a", "b", "sortBy", "direction", "larger", "smaller", "throttledEffect", "trackedSortFn", "sortFn", "raw", "paging", "batch", "start", "end", "filter", "filterOptions", "trackedMatches", "matches", "row", "columns", "columnOptions", "input", "result", "key", "scroll", "scrollOptions", "scrollbar", "evt", "SimplyRender", "templateId", "template", "content", "node", "clone", "t", "attr", "observer", "closest", "name", "options", "maxDistance", "minLength", "result", "resultDistance", "option", "distance", "editDistance", "a", "b", "tooFar", "previous", "_", "index", "current", "ai", "bi", "cost", "routes", "options", "SimplyRoute", "parseRoutes", "path", "args", "searchParams", "searchParamsForPath", "currentPath", "getPath", "routePath", "route", "params", "pathWithSlash", "getURL", "callRouteAction", "action", "compileRoutePattern", "result", "callback", "popstateHandler", "clickHandler", "evt", "link", "check", "target", "followLink", "listener", "app", "routeActionParams", "unknownRouteActionError", "warnedRouteQueryConflicts", "query", "queryParams", "key", "warnRouteQueryConflict", "value", "warningKey", "actions", "suggestion", "closest", "hint", "index", "hashIndex", "search", "baseURL", "exact", "regexp", "routeRegexp", "matches", "name", "i", "prefix", "suffix", "routeRegexpSource", "source", "match", "escapeRegexp", "routeInfo", "paths", "path", "dataset", "pointer", "acc", "name", "value", "parent", "names", "result", "path_default", "commandState", "COMMAND_OPTIONS", "SimplyCommands", "options", "defaultHandlers", "commandHandler", "evt", "command", "getCommand", "warnUnknownCommand", "container", "el", "value", "event", "handler", "commands", "destroyCommands", "commandApi", "state", "handlers", "app", "getConfiguredCommandValue", "pathAttribute", "path_default", "configuredValue", "values", "option", "data", "input", "unknownCommandWarnings", "source", "warned", "suggestion", "closest", "commandNames", "suffix", "warnedUnknownActions", "actions", "options", "functionHandler", "target", "thisArg", "argumentsList", "result", "err", "actionHandler", "property", "warnUnknownAction", "warned", "suggestion", "closest", "suffix", "shortcutState", "accesskeyState", "KEY", "SimplyShortcuts", "options", "keyHandler", "e", "shortcutScopes", "shortcutElement", "shortcutScope", "separators", "separator", "keyString", "getKeyString", "i", "container", "keyCombination", "shortcuts", "destroyShortcuts", "shortcutApi", "state", "accesskeys", "selector", "targets", "target", "controller", "destroyAccesskeys", "accesskeyApi", "BEHAVIOR_SELECTOR", "SimplyBehaviors", "options", "changes", "node", "behaviorNodes", "name", "behavior", "cleanup", "added", "change", "behaviorNode", "suggestion", "closest", "suffix", "behaviors", "root", "nodes", "throttle", "callbackFunction", "intervalTime", "eventId", "params", "runWhenIdle", "callback", "rebaseHref", "relative", "base", "cacheBuster", "url", "cloneScript", "script", "clone", "attr", "insertScript", "placeholder", "shouldWaitForScript", "insertAndWaitForScript", "resolve", "done", "findIncludeLinks", "container", "selector", "links", "SimplyIncludes", "options", "defaultCacheBuster", "scripts", "arr", "node", "html", "link", "fragment", "stylesheets", "stylesheet", "href", "scriptsFragment", "remainingLinks", "remainder", "response", "error", "includes", "defaultInclude", "include", "value", "APP_OPTIONS", "SimplyApp", "options", "mergedOptions", "mergeComponents", "mergeOptions", "signal", "installTemplates", "installStyles", "key", "commands", "shortcuts", "behaviors", "routes", "actions", "warnLikelyOptionTypo", "bind", "includes", "accesskeys", "destroyCommands", "destroyShortcuts", "destroyAccesskeys", "container", "templates", "name", "element", "template", "styles", "style", "suggestion", "closest", "initRoutes", "app", "handleAppError", "error", "context", "result", "otherOptions", "components", "component", "html", "strings", "values", "value", "index", "css", "html", "css", "modelApi", "model", "sort", "paging", "filter", "columns", "scroll", "app", "bind", "state_exports", "signal", "effect", "batch", "clone", "destroy", "untracked", "throttledEffect", "clockEffect", "createSignal", "isSignal", "raw", "dom_exports", "behaviors", "actions", "commands", "include", "includes", "shortcuts", "path_default", "routes", "flow_default"]
3
+ "sources": ["../../state/src/index.mjs", "../../state/src/symbols.mjs", "../../bind/src/dom.mjs", "../../bind/src/render.mjs", "../../bind/src/transformers.mjs", "../../bind/src/index.mjs", "../../model/src/index.mjs", "../src/render.mjs", "../../app/src/suggest.mjs", "../../app/src/route.mjs", "../../app/src/path.mjs", "../../app/src/command.mjs", "../../app/src/action.mjs", "../../app/src/shortcut.mjs", "../../app/src/behavior.mjs", "../../app/src/include.mjs", "../../app/src/index.mjs", "../../app/src/highlight.mjs", "../src/index.mjs"],
4
+ "sourcesContent": ["import { DEP } from './symbols.mjs'\n\nconst MAP_READS_KEY = new Set(['get', 'has'])\nconst MAP_READS_ITERATION = new Set(['keys', 'values', 'entries', 'forEach', Symbol.iterator])\nconst MAP_WRITES = new Set(['set', 'delete', 'clear'])\nconst SET_WRITES = new Set(['add', 'delete', 'clear'])\nconst SET_ITERATION_PROPERTIES = {\n entries: {},\n forEach: {},\n has: {},\n keys: {},\n values: {},\n [Symbol.iterator]: {}\n}\n\nfunction isObjectLike(value) {\n return value !== null && (typeof value === 'object' || typeof value === 'function')\n}\n\n/**\n * Returns true when value is a SimplyFlow signal proxy.\n *\n * @param {*} value Value to inspect.\n * @returns {boolean} True if value is a signal proxy, otherwise false.\n * @throws {never} Does not intentionally throw.\n */\nexport function isSignal(value) {\n return Boolean(isObjectLike(value) && value[DEP.SIGNAL])\n}\n\n/**\n * Returns the raw target for a signal, or value unchanged when it is not a signal.\n *\n * @param {*} value Signal or ordinary value.\n * @returns {*} The signal target, or the original value.\n * @throws {never} Does not intentionally throw.\n */\nexport function raw(value) {\n return isSignal(value) ? value[DEP.XRAY] : value\n}\n\n/**\n * Returns the existing signal proxy for value, if one has been registered.\n *\n * @param {*} value Raw target or signal proxy.\n * @returns {*} The existing signal proxy, the same signal when value is already a signal, or undefined.\n * @throws {never} Does not intentionally throw.\n */\nexport function getSignal(value) {\n return isSignal(value) ? value : signals.get(value)\n}\n\nfunction targetSignal(target) {\n return signals.get(target)\n}\n\nfunction readTarget(target, property) {\n // Reflect.get() uses the proxy as the receiver for accessors. That breaks\n // native Map/Set size getters and class getters that rely on private fields.\n return target?.[property]\n}\n\nfunction bindMethod(target, receiver, value) {\n if (\n target instanceof HTMLElement\n || target instanceof Number\n || target instanceof String\n || target instanceof Boolean\n ) {\n return value.bind(target)\n }\n\n // For user-defined classes, bind to the signal so method bodies remain\n // reactive when they read or write public properties through `this`.\n return value.bind(receiver)\n}\n\nfunction collectRemovedArrayValues(target, nextLength) {\n const values = new Map()\n if (!Array.isArray(target) || nextLength >= target.length) {\n return values\n }\n\n for (let index = nextLength; index < target.length; index++) {\n if (Object.hasOwn(target, index)) {\n values.set(index, target[index])\n }\n }\n return values\n}\n\nfunction addArrayLengthChanges(context, target, oldLength, removedValues = new Map()) {\n if (!Array.isArray(target) || oldLength === target.length) {\n return\n }\n\n context.set(DEP.LENGTH, { was: oldLength, now: target.length })\n context.set(DEP.ITERATE, {})\n\n // Directly shrinking .length deletes indexes without going through the\n // proxy's delete trap. Notify listeners of those indexes explicitly.\n for (const [index, oldValue] of removedValues) {\n context.set(String(index), { delete: true, was: oldValue, now: undefined })\n }\n}\n\nfunction notifyContext(receiver, context) {\n if (context.size) {\n notifySet(receiver, context)\n }\n}\n\nfunction wrapArrayMethod(target, property, receiver, value) {\n return (...args) => {\n const oldLength = target.length\n\n // Native array methods must run with the proxy as `this`. That lets\n // their internal get/set/delete operations pass through the proxy traps.\n const result = value.apply(receiver, args)\n\n if (oldLength !== target.length) {\n notifySet(receiver, makeContext(DEP.LENGTH, { was: oldLength, now: target.length }))\n }\n return result\n }\n}\n\nfunction addMapWriteChanges(context, target, property, args, oldSize) {\n if (property === 'set') {\n const [key, nextValue] = args\n const hadKey = target.has(key)\n const oldValue = target.get(key)\n\n return () => {\n if (!hadKey || !Object.is(oldValue, nextValue)) {\n context.set(key, { was: oldValue, now: nextValue })\n // Existing value changes affect values(), entries(), forEach()\n // and direct iteration. The current dependency model uses one\n // iteration token, so keys() listeners are also conservatively\n // notified until Map iteration dependencies are split further.\n context.set(DEP.ITERATE, {})\n }\n if (!hadKey) {\n context.set(DEP.SIZE, { was: oldSize, now: target.size })\n }\n }\n }\n\n if (property === 'delete') {\n const [key] = args\n const hadKey = target.has(key)\n const oldValue = target.get(key)\n\n return () => {\n if (hadKey) {\n context.set(key, { delete: true, was: oldValue, now: undefined })\n context.set(DEP.SIZE, { was: oldSize, now: target.size })\n context.set(DEP.ITERATE, {})\n }\n }\n }\n\n if (property === 'clear') {\n const oldEntries = oldSize ? Array.from(target.entries()) : []\n\n return () => {\n if (oldEntries.length) {\n for (const [key, oldValue] of oldEntries) {\n context.set(key, { delete: true, was: oldValue, now: undefined })\n }\n context.set(DEP.SIZE, { was: oldSize, now: target.size })\n context.set(DEP.ITERATE, {})\n }\n }\n }\n\n return () => {}\n}\n\nfunction wrapMapMethod(target, property, receiver, value) {\n return (...args) => {\n if (MAP_READS_KEY.has(property)) {\n notifyGet(receiver, args[0])\n }\n if (MAP_READS_ITERATION.has(property)) {\n notifyGet(receiver, DEP.ITERATE)\n }\n\n const oldSize = target.size\n const context = new Map()\n const addChanges = MAP_WRITES.has(property)\n ? addMapWriteChanges(context, target, property, args, oldSize)\n : () => {}\n const result = value.apply(target, args)\n\n addChanges()\n notifyContext(receiver, context)\n return result\n }\n}\n\nfunction addSetWriteChanges(context, target, property, args, oldSize) {\n const [value] = args\n const hadValue = property === 'add' || property === 'delete'\n ? target.has(value)\n : false\n\n return () => {\n const changed = property === 'clear'\n ? oldSize > 0\n : target.size !== oldSize || (property === 'delete' && hadValue)\n\n if (!changed) {\n return\n }\n\n context.set(DEP.SIZE, { was: oldSize, now: target.size })\n\n // Set.has(value) currently tracks at method level rather than per value.\n // Notify all Set read methods after real writes so this remains correct,\n // but suppress add(existing), delete(missing), and clear(empty).\n for (const prop of Reflect.ownKeys(SET_ITERATION_PROPERTIES)) {\n context.set(prop, {})\n }\n }\n}\n\nfunction wrapSetMethod(target, property, receiver, value) {\n return (...args) => {\n const oldSize = target.size\n const context = new Map()\n const addChanges = SET_WRITES.has(property)\n ? addSetWriteChanges(context, target, property, args, oldSize)\n : () => {}\n const result = value.apply(target, args)\n\n addChanges()\n notifyContext(receiver, context)\n return result\n }\n}\n\nfunction propertyValueChanged(descriptor, oldDescriptor, oldValue, newDescriptor, newValue) {\n return (\n (Object.hasOwn(descriptor, 'value') && !Object.is(oldValue, newValue))\n || (Object.hasOwn(descriptor, 'get') && oldDescriptor?.get !== newDescriptor?.get)\n || (Object.hasOwn(descriptor, 'set') && oldDescriptor?.set !== newDescriptor?.set)\n )\n}\n\nconst signalHandler = {\n get(target, property, receiver) {\n const value = readTarget(target, property)\n notifyGet(receiver, property)\n\n if (typeof value === 'function') {\n if (Array.isArray(target)) {\n return wrapArrayMethod(target, property, receiver, value)\n }\n if (target instanceof Map) {\n return wrapMapMethod(target, property, receiver, value)\n }\n if (target instanceof Set) {\n return wrapSetMethod(target, property, receiver, value)\n }\n return bindMethod(target, receiver, value)\n }\n\n return isObjectLike(value) ? signal(value) : value\n },\n\n set(target, property, value, receiver) {\n const hadOwn = Object.hasOwn(target, property)\n const oldLength = Array.isArray(target) ? target.length : undefined\n const removedValues = property === DEP.LENGTH\n ? collectRemovedArrayValues(target, Number(value))\n : new Map()\n const oldValue = target[property]\n\n target[property] = value\n\n const hasOwn = Object.hasOwn(target, property)\n const newValue = target[property]\n const context = new Map()\n\n if (!Object.is(oldValue, newValue) || (!hadOwn && hasOwn)) {\n context.set(property, { was: oldValue, now: newValue })\n }\n if (!hadOwn && hasOwn) {\n context.set(DEP.ITERATE, {})\n }\n\n addArrayLengthChanges(context, target, oldLength, removedValues)\n notifyContext(receiver, context)\n return true\n },\n\n has(target, property) {\n // The has trap has no receiver argument. Look up the stable proxy so\n // `property in signal` can still be tracked reactively.\n const receiver = targetSignal(target)\n if (receiver) {\n notifyGet(receiver, property)\n }\n return Reflect.has(target, property)\n },\n\n deleteProperty(target, property) {\n const hadOwn = Object.hasOwn(target, property)\n if (!hadOwn) {\n return true\n }\n\n const oldValue = target[property]\n const oldLength = Array.isArray(target) ? target.length : undefined\n const result = Reflect.deleteProperty(target, property)\n if (!result) {\n return result\n }\n\n const receiver = targetSignal(target)\n const context = makeContext(property, { delete: true, was: oldValue, now: undefined })\n context.set(DEP.ITERATE, { delete: true, property })\n addArrayLengthChanges(context, target, oldLength)\n notifySet(receiver, context)\n return result\n },\n\n defineProperty(target, property, descriptor) {\n const hadOwn = Object.hasOwn(target, property)\n const oldDescriptor = Object.getOwnPropertyDescriptor(target, property)\n const oldValue = target[property]\n const oldLength = Array.isArray(target) ? target.length : undefined\n const removedValues = property === DEP.LENGTH && Object.hasOwn(descriptor, 'value')\n ? collectRemovedArrayValues(target, Number(descriptor.value))\n : new Map()\n\n const result = Reflect.defineProperty(target, property, descriptor)\n if (!result) {\n return result\n }\n\n const hasOwn = Object.hasOwn(target, property)\n const newDescriptor = Object.getOwnPropertyDescriptor(target, property)\n const newValue = target[property]\n const context = new Map()\n\n if (!hadOwn && hasOwn) {\n context.set(property, { was: oldValue, now: newValue })\n context.set(DEP.ITERATE, {})\n } else if (hadOwn && hasOwn) {\n if (propertyValueChanged(descriptor, oldDescriptor, oldValue, newDescriptor, newValue)) {\n context.set(property, { was: oldValue, now: newValue })\n }\n if (oldDescriptor?.enumerable !== newDescriptor?.enumerable) {\n context.set(DEP.ITERATE, {})\n }\n }\n\n addArrayLengthChanges(context, target, oldLength, removedValues)\n notifyContext(targetSignal(target), context)\n return result\n },\n\n ownKeys(target) {\n const receiver = targetSignal(target)\n notifyGet(receiver, DEP.ITERATE)\n return Reflect.ownKeys(target)\n }\n}\n\n/**\n * Low-level registry for signal proxies and effect result signals.\n *\n * @type {WeakMap<object|Function, Proxy>}\n * @returns {WeakMap<object|Function, Proxy>} Maps raw targets to signals, and effect functions to result signals.\n * @throws {never} Reading this property does not throw.\n * @deprecated Prefer createSignal(), getSignal(), registerSignal(), isSignal(), and raw().\n */\nexport const signals = new WeakMap()\n\nfunction assertSignalTarget(value, name) {\n if (!isObjectLike(value)) {\n throw new TypeError(\n `simplyflow/state: ${name}() expects an object, array, Map, Set, class instance, function, or DOM node; received ${typeof value}`\n )\n }\n}\n\nfunction assertProxyHandler(handler, name) {\n if (!handler || typeof handler !== 'object') {\n throw new TypeError(`simplyflow/state: ${name}() expects a Proxy handler object`)\n }\n}\n\nfunction signalProxyHandler(handler) {\n // All signal implementations must answer these two private symbol reads in\n // the same way. Keeping that boilerplate here lets custom signal handlers\n // focus on their own get/set/observe behavior.\n return {\n ...handler,\n get(target, property, receiver) {\n if (property === DEP.XRAY) {\n return target\n }\n if (property === DEP.SIGNAL) {\n return true\n }\n if (handler.get) {\n return handler.get(target, property, receiver)\n }\n return readTarget(target, property)\n }\n }\n}\n\n/**\n * Registers a custom signal proxy for a raw target.\n *\n * @param {object|Function} target Raw object, function, class instance, collection, or DOM node to register.\n * @param {Proxy} proxy Signal proxy that represents target.\n * @returns {Proxy} The registered proxy.\n * @throws {TypeError} If target is not object-like or proxy is not a signal.\n * @throws {Error} If target is already registered with a different signal.\n */\nexport function registerSignal(target, proxy) {\n const rawTarget = raw(target)\n assertSignalTarget(rawTarget, 'registerSignal')\n\n if (!isSignal(proxy)) {\n throw new TypeError('simplyflow/state: registerSignal() expects a signal proxy')\n }\n\n const existing = signals.get(rawTarget)\n if (existing && existing !== proxy) {\n throw new Error('simplyflow/state: registerSignal() target already has a different signal')\n }\n\n signals.set(rawTarget, proxy)\n return proxy\n}\n\n/**\n * Creates or returns a signal proxy using a custom Proxy handler.\n *\n * @param {object|Function} target Raw object, function, class instance, collection, or DOM node to wrap.\n * @param {ProxyHandler<object>} [handler={}] Custom proxy traps for the signal.\n * @param {Function} [init] Optional initializer called once with (target, proxy).\n * @returns {Proxy} Existing or newly created signal proxy for target.\n * @throws {TypeError} If target is not object-like, handler is not an object, or init is not a function.\n * @throws {*} Re-throws errors from init.\n */\nexport function createSignal(target, handler = {}, init) {\n assertSignalTarget(target, 'createSignal')\n assertProxyHandler(handler, 'createSignal')\n if (init !== undefined && typeof init !== 'function') {\n throw new TypeError('simplyflow/state: createSignal() expects init to be a function')\n }\n\n if (isSignal(target)) {\n return target\n }\n\n const existing = getSignal(target)\n if (existing) {\n return existing\n }\n\n const proxy = new Proxy(target, signalProxyHandler(handler))\n registerSignal(target, proxy)\n init?.(target, proxy)\n return proxy\n}\n\n/**\n * Creates a transparent reactive proxy for an object, collection, class instance, DOM node, or function.\n *\n * @param {object|Function} [value={}] Target to wrap.\n * @returns {Proxy} Existing or newly created signal proxy for value.\n * @throws {TypeError} If value is not object-like.\n */\nexport function signal(value = {}) {\n if (!isObjectLike(value)) {\n throw new TypeError(\n `simplyflow/state: signal() expects an object, array, Map, Set, class instance, or function; received ${typeof value}`\n )\n }\n return createSignal(value, signalHandler)\n}\n\nlet tracers = []\nlet tracing = false\n\n/**\n * Runs a traced function, or returns effects currently depending on a signal property.\n *\n * @param {Function|Proxy} target Function to run with tracing enabled, or signal to inspect.\n * @param {string|symbol|number} [prop] Signal property whose listeners should be returned.\n * @returns {*} Result of target() for traced functions, or an array of listener descriptions.\n * @throws {TypeError} If inspecting listeners and target is not a signal.\n * @throws {*} Re-throws errors from target() when tracing a function.\n */\nexport function trace(target, prop) {\n if (typeof target === 'function') {\n tracing = true\n try {\n return target()\n } finally {\n tracing = false\n }\n }\n\n if (!isSignal(target)) {\n throw new TypeError('simplyflow/state: trace() expects either a function or a signal')\n }\n\n return getListeners(target, prop).map(listener => ({\n effect: listener.effectType,\n fn: listener.effectFunction,\n signal: signals.get(listener.effectFunction)\n }))\n}\n\n/**\n * Adds an observer for dependency tracking events emitted inside trace(fn).\n *\n * @param {{get?: Function, set?: Function}} tracer Object with get and/or set callback functions.\n * @returns {void}\n * @throws {TypeError} If tracer is not an object.\n * @throws {Error} If tracer has no callbacks, or if a provided callback is not a function.\n */\nexport function addTracer(tracer) {\n if (!tracer || typeof tracer !== 'object') {\n throw new TypeError('simplyflow/state: addTracer() expects a tracer object')\n }\n if (!tracer.get && !tracer.set) {\n throw new Error('simplyflow/state: addTracer: missing \"get\" or \"set\" property in tracer')\n }\n if (tracer.get && typeof tracer.get !== 'function') {\n throw new Error('simplyflow/state: addTracer: \"get\" is not a function')\n }\n if (tracer.set && typeof tracer.set !== 'function') {\n throw new Error('simplyflow/state: addTracer: \"set\" is not a function')\n }\n tracers.push(tracer)\n}\n\nfunction callTracers(kind, ...params) {\n for (const tracer of tracers) {\n tracer[kind]?.(...params)\n }\n}\n\nlet batchedListeners = new Set()\nlet batchDepth = 0\n\n/**\n * Triggers effects that depend on the changed signal properties in context.\n *\n * @param {Proxy} self Signal whose properties changed.\n * @param {Map<string|symbol|number, object>} [context=new Map()] Change map, usually created with makeContext().\n * @returns {void}\n * @throws {TypeError} If self is not a signal or context is not a Map.\n */\nexport function notifySet(self, context = new Map()) {\n if (!isSignal(self)) {\n throw new TypeError('simplyflow/state: notifySet() expects a signal as first argument')\n }\n if (!(context instanceof Map)) {\n throw new TypeError('simplyflow/state: notifySet() expects context to be a Map; use makeContext()')\n }\n\n const listeners = new Set()\n context.forEach((change, property) => {\n for (const listener of listenersFor(self, property)) {\n // Avoid makeContext() here: notifySet() is a hot path and this loop\n // can run once per changed property per listener. Writing directly\n // to the listener context keeps object/Map keys intact and avoids\n // creating a short-lived Map for every listener notification.\n addContextChange(listener, property, change)\n listeners.add(listener)\n }\n })\n\n if (!listeners.size) {\n return\n }\n\n if (batchDepth) {\n for (const listener of listeners) {\n batchedListeners.add(listener)\n }\n return\n }\n\n runListeners(listeners, self, context)\n}\n\n/**\n * Creates a normalized change context map for notifySet().\n *\n * @param {Map|object|string|symbol|number} property Property name, property-to-change object, or existing context Map.\n * @param {object} [change] Change metadata when property names a single changed property.\n * @returns {Map<string|symbol|number, object>} Normalized change context.\n * @throws {never} Does not intentionally throw.\n */\nexport function makeContext(property, change) {\n const context = new Map()\n\n if (property instanceof Map) {\n property.forEach((change, prop) => context.set(prop, change))\n return context\n }\n\n if (property !== null && typeof property === 'object') {\n for (const prop of Reflect.ownKeys(property)) {\n context.set(prop, property[prop])\n }\n } else {\n context.set(property, change)\n }\n return context\n}\n\nfunction addContextChange(listener, property, change) {\n if (!listener.context) {\n listener.context = new Map()\n }\n listener.context.set(property, change)\n listener.needsUpdate = true\n}\n\nfunction clearContext(listener) {\n delete listener.context\n delete listener.needsUpdate\n}\n\n/**\n * Records a dependency on self[property] for the currently running effect.\n *\n * @param {Proxy} self Signal being read.\n * @param {string|symbol|number} property Property being read.\n * @returns {void}\n * @throws {never} Does not intentionally throw.\n */\nexport function notifyGet(self, property) {\n const currentCompute = computeStack[computeStack.length - 1]\n if (!currentCompute || currentCompute.skipDependency?.(self, property)) {\n return\n }\n\n if (tracing && tracers.length) {\n callTracers('get', self, property)\n }\n setListeners(self, property, currentCompute)\n}\n\nconst listenersMap = new WeakMap()\nconst computeMap = new WeakMap()\n\nconst emptyListeners = new Set()\n\nfunction listenersFor(self, property) {\n return listenersMap.get(self)?.get(property) || emptyListeners\n}\n\nfunction getListeners(self, property) {\n return Array.from(listenersFor(self, property))\n}\n\nfunction setListeners(self, property, compute) {\n if (!listenersMap.has(self)) {\n listenersMap.set(self, new Map())\n }\n const listeners = listenersMap.get(self)\n if (!listeners.has(property)) {\n listeners.set(property, new Set())\n }\n listeners.get(property).add(compute)\n\n if (!computeMap.has(compute)) {\n computeMap.set(compute, new Map())\n }\n const dependencies = computeMap.get(compute)\n if (!dependencies.has(property)) {\n dependencies.set(property, new Set())\n }\n dependencies.get(property).add(self)\n}\n\nfunction clearListeners(compute) {\n const dependencies = computeMap.get(compute)\n if (!dependencies) {\n return\n }\n\n dependencies.forEach((signals, property) => {\n signals.forEach(signal => {\n const listeners = listenersMap.get(signal)\n listeners?.get(property)?.delete(compute)\n })\n })\n\n computeMap.delete(compute)\n}\n\nconst computeStack = []\nconst effectStack = []\nconst signalStack = []\nconst effectMap = new WeakMap()\n\nfunction assertFunction(fn, name) {\n if (typeof fn !== 'function') {\n throw new TypeError(`simplyflow/state: ${name}() expects a function`)\n }\n}\n\nfunction assertNotRecursive(fn) {\n if (effectStack.includes(fn)) {\n throw new Error('Recursive update() call', { cause: fn })\n }\n}\n\nfunction effectSignal(fn) {\n let connectedSignal = signals.get(fn)\n if (!connectedSignal) {\n connectedSignal = signal({ current: null })\n signals.set(fn, connectedSignal)\n }\n return connectedSignal\n}\n\nfunction setEffectResult(connectedSignal, result) {\n if (result instanceof Promise) {\n result.then(value => {\n connectedSignal.current = value\n })\n } else {\n connectedSignal.current = result\n }\n}\n\nfunction runTracked(compute, connectedSignal, fn, effectType, args = [compute, computeStack, signalStack]) {\n if (signalStack.includes(connectedSignal)) {\n throw new Error('Cyclical dependency in update() call', { cause: fn })\n }\n\n clearListeners(compute)\n compute.effectFunction = fn\n compute.effectType = effectType\n computeStack.push(compute)\n signalStack.push(connectedSignal)\n\n let result\n try {\n result = fn(...args)\n } finally {\n computeStack.pop()\n signalStack.pop()\n setEffectResult(connectedSignal, result)\n }\n}\n\nfunction runListeners(listeners, signal, context) {\n const currentEffect = computeStack[computeStack.length - 1]\n\n for (const listener of listeners) {\n if (listener !== currentEffect && listener?.needsUpdate) {\n if (listener.scheduleClock) {\n listener.scheduleClock()\n } else {\n if (signal && tracing && tracers.length) {\n callTracers('set', signal, context, listener)\n }\n listener()\n }\n }\n clearContext(listener)\n }\n}\n\n/**\n * Runs fn immediately and reruns it synchronously when any signal property it reads changes.\n *\n * @param {Function} fn Effect function to run and track.\n * @returns {Proxy} Signal whose current property contains the latest effect result.\n * @throws {TypeError} If fn is not a function.\n * @throws {Error} If fn is already running recursively or creates a cyclic dependency.\n * @throws {*} Re-throws errors from fn during the initial run.\n */\nexport function effect(fn) {\n assertFunction(fn, 'effect')\n assertNotRecursive(fn)\n effectStack.push(fn)\n\n const connectedSignal = effectSignal(fn)\n const compute = function computeEffect() {\n runTracked(compute, connectedSignal, fn, effect)\n }\n compute.fn = fn\n effectMap.set(connectedSignal, compute)\n\n compute()\n return connectedSignal\n}\n\n/**\n * Stops an effect, clears its dependencies, and releases its reusable function mapping.\n *\n * @param {Proxy} connectedSignal Signal returned by effect(), throttledEffect(), or clockEffect().\n * @returns {void}\n * @throws {TypeError} If connectedSignal is not a signal.\n */\nexport function destroy(connectedSignal) {\n if (!isSignal(connectedSignal)) {\n throw new TypeError('simplyflow/state: destroy() expects an effect signal')\n }\n\n const compute = effectMap.get(connectedSignal)\n if (!compute) {\n return\n }\n\n compute.destroy?.()\n clearListeners(compute)\n\n if (compute.fn) {\n signals.delete(compute.fn)\n const index = effectStack.findIndex(fn => fn === compute.fn)\n if (index !== -1) {\n effectStack.splice(index, 1)\n }\n }\n\n effectMap.delete(connectedSignal)\n}\n\n/**\n * Runs fn while deferring effect execution until the outermost batch finishes.\n *\n * @param {Function} fn Function to run inside the batch.\n * @returns {*} The value returned by fn.\n * @throws {TypeError} If fn is not a function.\n * @throws {*} Re-throws errors from fn.\n */\nexport function batch(fn) {\n assertFunction(fn, 'batch')\n batchDepth++\n\n let result\n try {\n result = fn()\n } finally {\n const finish = () => {\n batchDepth--\n if (!batchDepth) {\n runBatchedListeners()\n }\n }\n\n if (result instanceof Promise) {\n result.then(finish, finish)\n } else {\n finish()\n }\n }\n return result\n}\n\nfunction runBatchedListeners() {\n const listeners = batchedListeners\n batchedListeners = new Set()\n\n // Batched clocked dependency changes must be marked before clock ticks are\n // flushed. Otherwise batch(() => { clock.time++; source.value++ }) would see\n // the tick first and leave the source change pending until the next tick.\n const clocked = new Set()\n const ready = new Set()\n for (const listener of listeners) {\n if (listener.scheduleClock) {\n clocked.add(listener)\n } else {\n ready.add(listener)\n }\n }\n\n runListeners(clocked)\n runListeners(ready)\n}\n\n/**\n * Runs fn as an effect, throttling reruns to at most once per throttleTime milliseconds.\n *\n * @param {Function} fn Effect function to run and track.\n * @param {number} throttleTime Minimum time in milliseconds between reruns after the initial run.\n * @returns {Proxy} Signal whose current property contains the latest effect result.\n * @throws {TypeError} If fn is not a function or throttleTime is not a non-negative finite number.\n * @throws {Error} If fn is already running recursively or creates a cyclic dependency.\n * @throws {*} Re-throws errors from fn during the initial run.\n */\nexport function throttledEffect(fn, throttleTime) {\n assertFunction(fn, 'throttledEffect')\n if (!Number.isFinite(throttleTime) || throttleTime < 0) {\n throw new TypeError('simplyflow/state: throttledEffect() expects throttleTime to be a non-negative number')\n }\n assertNotRecursive(fn)\n effectStack.push(fn)\n\n const connectedSignal = effectSignal(fn)\n let throttledUntil = 0\n let hasChange = true\n let timeout = null\n\n const compute = function computeEffect() {\n const now = Date.now()\n if (throttledUntil > now) {\n hasChange = true\n schedule()\n return\n }\n\n runTracked(compute, connectedSignal, fn, throttledEffect)\n hasChange = false\n throttledUntil = Date.now() + throttleTime\n }\n\n function schedule() {\n if (timeout) {\n return\n }\n\n const delay = Math.max(0, throttledUntil - Date.now())\n timeout = globalThis.setTimeout(() => {\n timeout = null\n if (hasChange) {\n compute()\n }\n }, delay)\n }\n\n compute.fn = fn\n compute.destroy = () => {\n if (timeout) {\n globalThis.clearTimeout(timeout)\n timeout = null\n }\n hasChange = false\n }\n effectMap.set(connectedSignal, compute)\n\n compute()\n return connectedSignal\n}\n\nconst clockQueues = new WeakMap()\n\nfunction readClockTime(clock) {\n return raw(clock).time\n}\n\nfunction getClockQueue(clock) {\n if (!clockQueues.has(clock)) {\n const queue = {\n clock,\n effects: new Set(),\n pending: new Set(),\n time: readClockTime(clock)\n }\n\n // A clock has exactly one listener on `.time`. Ordinary dependency\n // changes add clock effects to `pending`; the shared tick listener only\n // flushes that pending set after time increases. This avoids waking every\n // clockEffect on every clock tick just to discover most of them have no\n // pending changes.\n queue.tick = function tickClockEffects() {\n const time = readClockTime(clock)\n if (time <= queue.time) {\n return\n }\n\n queue.time = time\n const pending = Array.from(queue.pending)\n queue.pending.clear()\n\n for (const compute of pending) {\n compute.clockPending = false\n if (queue.effects.has(compute)) {\n compute()\n }\n }\n }\n queue.tick.effectFunction = queue.tick\n queue.tick.effectType = clockEffect\n setListeners(clock, 'time', queue.tick)\n clockQueues.set(clock, queue)\n }\n\n return clockQueues.get(clock)\n}\n\nfunction detachClockEffect(compute) {\n const queue = compute.clockQueue\n if (!queue) {\n return\n }\n\n queue.pending.delete(compute)\n queue.effects.delete(compute)\n if (!queue.effects.size) {\n clearListeners(queue.tick)\n clockQueues.delete(queue.clock)\n }\n}\n\n/**\n * Tracks fn like an effect, but recomputes only after clock.time advances.\n *\n * @param {Function} fn Effect function to run and track.\n * @param {{time: number}} clock Clock object controlling when pending changes recompute.\n * @returns {Proxy} Signal whose current property contains the latest effect result.\n * @throws {TypeError} If fn is not a function or clock lacks a numeric time property.\n * @throws {*} Re-throws errors from fn during the initial run.\n */\nexport function clockEffect(fn, clock) {\n assertFunction(fn, 'clockEffect')\n if (!clock || typeof clock !== 'object' || typeof raw(clock).time !== 'number') {\n throw new TypeError('simplyflow/state: clockEffect() expects a clock object with a numeric .time property')\n }\n\n const clockSignal = isSignal(clock) ? clock : signal(raw(clock))\n const connectedSignal = effectSignal(fn)\n const queue = getClockQueue(clockSignal)\n\n const compute = function computeEffect() {\n clearListeners(compute)\n compute.effectFunction = fn\n compute.effectType = clockEffect\n computeStack.push(compute)\n\n let result\n try {\n result = fn(compute, computeStack)\n } finally {\n computeStack.pop()\n setEffectResult(connectedSignal, result)\n }\n }\n\n compute.fn = fn\n compute.clockQueue = queue\n compute.skipDependency = (self, property) => self === clockSignal && property === 'time'\n compute.scheduleClock = () => {\n if (!compute.clockPending) {\n compute.clockPending = true\n queue.pending.add(compute)\n }\n }\n compute.destroy = () => detachClockEffect(compute)\n\n queue.effects.add(compute)\n effectMap.set(connectedSignal, compute)\n\n compute()\n return connectedSignal\n}\n\n/**\n * Runs fn without recording signal reads as dependencies for the current effect.\n *\n * @param {Function} fn Function to run without dependency tracking.\n * @returns {*} The value returned by fn.\n * @throws {TypeError} If fn is not a function.\n * @throws {*} Re-throws errors from fn.\n */\nexport function untracked(fn) {\n assertFunction(fn, 'untracked')\n const index = computeStack.length - 1\n const current = computeStack[index]\n computeStack[index] = false\n try {\n return fn()\n } finally {\n computeStack[index] = current\n }\n}\n\nfunction cloneOptions(options) {\n if (typeof options === 'boolean') {\n return { deep: options }\n }\n if (options === undefined) {\n return { deep: true }\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('simplyflow/state: clone() expects options to be a boolean or object')\n }\n return { deep: options.deep !== false }\n}\n\nfunction typeName(value) {\n return value?.constructor?.name || Object.prototype.toString.call(value).slice(8, -1)\n}\n\nfunction isPlainObject(value) {\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nfunction isTypedArray(value) {\n return ArrayBuffer.isView(value) && !(value instanceof DataView)\n}\n\nfunction isIntegerKey(property) {\n if (typeof property !== 'string' || property === '') {\n return false\n }\n const index = Number(property)\n return Number.isInteger(index) && index >= 0 && String(index) === property\n}\n\nfunction hasToClone(value) {\n return typeof value.toClone === 'function'\n}\n\nfunction cannotClone(value, path) {\n throw new TypeError(\n `simplyflow/state: clone() cannot clone ${typeName(value)} at ${path}; add a toClone() method for custom objects`\n )\n}\n\nfunction cloneDescriptorProperties(source, result, cloneValue, skip = () => false) {\n const descriptors = Object.getOwnPropertyDescriptors(source)\n\n for (const key of Reflect.ownKeys(descriptors)) {\n if (skip(key)) {\n delete descriptors[key]\n continue\n }\n\n const descriptor = descriptors[key]\n // Accessor descriptors may hide state in closures or private fields.\n // Copying the accessor would not necessarily create an independent clone,\n // and reading it would execute user code. Custom objects that need this\n // should expose toClone() so they control how hidden state is copied.\n if (!Object.hasOwn(descriptor, 'value')) {\n cannotClone(source, String(key))\n }\n descriptor.value = cloneValue(descriptor.value, String(key))\n }\n\n Object.defineProperties(result, descriptors)\n return result\n}\n\nfunction cloneArrayBuffer(value) {\n return value.slice(0)\n}\n\nfunction cloneSharedArrayBuffer(value) {\n const result = new SharedArrayBuffer(value.byteLength)\n new Uint8Array(result).set(new Uint8Array(value))\n return result\n}\n\nfunction cloneErrorObject(value, cloneValue, path) {\n const standardErrors = new Set([\n Error,\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError,\n typeof AggregateError === 'undefined' ? undefined : AggregateError\n ])\n\n if (!standardErrors.has(value.constructor)) {\n cannotClone(value, path)\n }\n\n const options = Object.hasOwn(value, 'cause')\n ? { cause: cloneValue(value.cause, 'cause') }\n : undefined\n\n if (typeof AggregateError !== 'undefined' && value instanceof AggregateError) {\n const errors = Array.from(value.errors || [], (error, index) => cloneValue(error, `errors.${index}`))\n return new AggregateError(errors, value.message, options)\n }\n\n return new value.constructor(value.message, options)\n}\n\n/**\n * Creates a non-reactive clone of a value or signal target.\n *\n * Deep-clones by default so nested signal data is not shared with the source. Built-in cloneable objects use their\n * native representation. Custom objects must provide toClone(); otherwise clone() throws instead of returning a\n * shared reference or copying only public properties.\n *\n * @param {*} value Value or signal target to clone.\n * @param {boolean|{deep?: boolean}} [options] false or { deep: false } keeps legacy shallow top-level cloning.\n * @returns {*} Non-reactive clone of value.\n * @throws {TypeError} If options are invalid, an unsupported object is encountered, an accessor property is found, or toClone() returns the original object.\n * @throws {*} Re-throws errors from custom toClone() methods.\n */\nexport function clone(value, options) {\n const { deep } = cloneOptions(options)\n const seen = new Map()\n\n function cloneChild(value, path) {\n return deep ? cloneValue(value, path) : raw(value)\n }\n\n function cloneValue(value, path = 'value') {\n const source = raw(value)\n\n if (!isObjectLike(source)) {\n return source\n }\n if (seen.has(source)) {\n return seen.get(source)\n }\n if (hasToClone(source)) {\n const result = raw(source.toClone())\n if (Object.is(result, source)) {\n throw new TypeError(`simplyflow/state: clone() toClone() returned the original object at ${path}`)\n }\n seen.set(source, result)\n return result\n }\n\n if (Array.isArray(source)) {\n const result = new Array(source.length)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild, key => key === 'length')\n }\n\n if (isPlainObject(source)) {\n const result = Object.create(Object.getPrototypeOf(source))\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof Map) {\n const result = new Map()\n seen.set(source, result)\n source.forEach((mapValue, mapKey) => {\n result.set(cloneChild(mapKey, 'map key'), cloneChild(mapValue, 'map value'))\n })\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof Set) {\n const result = new Set()\n seen.set(source, result)\n source.forEach(setValue => result.add(cloneChild(setValue, 'set value')))\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof Date) {\n const result = new Date(source.getTime())\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof RegExp) {\n const result = new RegExp(source.source, source.flags)\n result.lastIndex = source.lastIndex\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild, key => key === 'lastIndex')\n }\n\n if (source instanceof ArrayBuffer) {\n const result = cloneArrayBuffer(source)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' && source instanceof SharedArrayBuffer) {\n const result = cloneSharedArrayBuffer(source)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (source instanceof DataView) {\n const buffer = source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength)\n const result = new DataView(buffer)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild)\n }\n\n if (isTypedArray(source)) {\n const result = new source.constructor(source)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild, isIntegerKey)\n }\n\n if (typeof URL !== 'undefined' && source instanceof URL) {\n const result = new URL(source.href)\n seen.set(source, result)\n // Browser and jsdom URL objects can store implementation details in\n // own symbol properties. Copying those would couple the clone back\n // to the original, so the URL constructor is the complete clone.\n return result\n }\n\n if (typeof URLSearchParams !== 'undefined' && source instanceof URLSearchParams) {\n const result = new URLSearchParams(source)\n seen.set(source, result)\n return result\n }\n\n if (typeof File !== 'undefined' && source instanceof File) {\n const result = new File([source], source.name, {\n type: source.type,\n lastModified: source.lastModified\n })\n seen.set(source, result)\n return result\n }\n\n if (typeof Blob !== 'undefined' && source instanceof Blob) {\n const result = source.slice(0, source.size, source.type)\n seen.set(source, result)\n return result\n }\n\n if (source instanceof Error) {\n const result = cloneErrorObject(source, cloneChild, path)\n seen.set(source, result)\n return cloneDescriptorProperties(source, result, cloneChild, key => (\n key === 'message' || key === 'cause' || key === 'errors' || key === 'stack'\n ))\n }\n\n if (typeof Node !== 'undefined' && source instanceof Node && typeof source.cloneNode === 'function') {\n const result = source.cloneNode(deep)\n seen.set(source, result)\n return result\n }\n\n cannotClone(source, path)\n }\n\n return cloneValue(value)\n}\n", "export const DEP = {\n ITERATE: Symbol.for('@simplyedit/simplyflow.iterate'),\n XRAY: Symbol.for('@simplyedit/simplyflow.xRay'),\n SIGNAL: Symbol.for('@simplyedit/simplyflow.Signal'),\n TEMPLATE: Symbol.for('@simplyedit/simplyflow.bindTemplate'),\n VALUE: Symbol.for('@simplyedit/simplyflow.bindValue'),\n LENGTH: 'length',\n SIZE: 'size'\n}\n", "import { createSignal, getSignal, isSignal, signal as stateSignal, notifyGet, notifySet, makeContext,\n throttledEffect, untracked, batch } from '@muze-labs/simplyflow-state'\nimport { getValueByPath } from './index.mjs'\nimport { setValueByPath, getProperties } from './render.mjs'\nimport { DEP } from '@muze-labs/simplyflow-state/symbols'\n\n/**\n * Tracks element => signal mapping so that each element only has one signal\n */\nconst domSignals = new WeakMap()\n\n/**\n * Tracks element => mutationObservers\n */\nconst observers = new WeakMap()\n\n/**\n * A dom signal is a Proxy, to track access to properties\n */\nconst domSignalHandler = {\n get: (target, property, receiver) => {\n const value = target?.[property]\n notifyGet(receiver, property)\n if (typeof value === 'function') {\n return value.bind(target) // make sure element functions are not linked to the proxy\n }\n if (value && typeof value == 'object') {\n return stateSignal(value)\n }\n return value\n },\n set: (target, property, value, receiver) => {\n const current = target[property]\n target[property] = value\n const now = target[property]\n if (!Object.is(current, now)) {\n notifySet(receiver, makeContext(property, { was: current, now }))\n }\n return true\n },\n has: (target, property) => {\n const receiver = getSignal(target)\n if (receiver) {\n notifyGet(receiver, property)\n }\n return Reflect.has(target, property)\n },\n ownKeys: (target) => {\n // The ownKeys trap has no receiver argument. Recover the stable signal\n // proxy so Object.keys(domSignal) can track DOM key iteration.\n const receiver = getSignal(target)\n if (receiver) {\n notifyGet(receiver, DEP.ITERATE)\n }\n return Reflect.ownKeys(target)\n }\n}\n\n/**\n * This function returns a dom signal. Using this in an effect() function\n * will automatically trigger the effect if a property of the dom signal \n * changes.\n * Valid options are any of the mutationObserver options, like characterData, subtree, etc.\n * @param HTMLElement el\n * @param Object options\n * @returns Proxy\n */\nexport function signal(el, options) {\n if (isSignal(el)) {\n return el\n }\n\n const existing = getSignal(el)\n if (existing) {\n return existing\n }\n\n return createSignal(el, domSignalHandler, (target, proxy) => {\n domListen(target, proxy, options)\n })\n}\n\n/**\n * This sets up the mutationObserver that calls notifySet on changes in the DOM\n */\nfunction domListen(el, signal, options) {\n const defaultOptions = {\n characterData: true,\n subtree: true,\n attributes: true,\n attributesOldValue: true,\n childList: true\n }\n if (!options) {\n options = defaultOptions\n }\n let oldContentHTML = el.innerHTML\n let oldContentText = el.innerText\n if (!observers.has(el)) {\n const observer = new MutationObserver((mutationList, observer) => {\n // collect changes\n const changes = {}\n for (const mutation of mutationList) {\n if (mutation.type==='attributes') {\n // check if any listeners for each attribute\n changes[mutation.attributeName] = mutation.attributeOldValue\n } else if (mutation.type==='subtree' || mutation.type==='characterData') {\n // change on innerHTML/innerText\n if (el.innerHTML != oldContentHTML) {\n changes.innerHTML = oldContentHTML\n oldContentHTML = el.innerHTML\n }\n if (el.innerText != oldContentText) {\n changes.innerText = oldContentText\n oldContentText = el.innerText\n }\n } else if (mutation.type==='childList') {\n changes.children = { //FIXME: overwrites changes in this list path if list is rendered multiple times\n was: Array.from(el.children) //FIXME; fill in 'now'\n }\n changes.length = -1 //FIXME: don't do this :)\n if (el.innerHTML != oldContentHTML) {\n changes.innerHTML = oldContentHTML\n oldContentHTML = el.innerHTML\n }\n if (el.innerText != oldContentText) {\n changes.innerText = oldContentText\n oldContentText = el.innerText\n }\n } else {\n console.log('nothing to do for',el,mutation.type)\n }\n }\n for (const prop in changes) {\n notifySet(signal, makeContext(prop, { was: changes[prop], now: el[prop] }))\n }\n })\n observer.observe(el, options)\n observers.set(el, observer)\n //@TODO: unregister the observer when el is removed from the dom (after a timeout)\n if (el.matches('input, textarea, select')) {\n let prevValue = el.value\n let prevChecked = el.checked\n const notifyFormValue = () => {\n notifySet(signal, makeContext('value', { was: prevValue, now: el.value }))\n prevValue = el.value\n if ('checked' in el) {\n notifySet(signal, makeContext('checked', { was: prevChecked, now: el.checked }))\n prevChecked = el.checked\n }\n }\n el.addEventListener('change', notifyFormValue)\n if (el.matches('input, textarea')) {\n el.addEventListener('input', notifyFormValue)\n }\n }\n }\n}\n\n/**\n * This function sets up the dom signal on an element, provided it has a `data-flow-list` attribute\n * @param HTMLElement element - the element to track\n * @returns Proxy\n */\nexport function trackDomList(element)\n{\n const path = this.getBindingPath(element)\n if (!path) {\n throw new Error('Could not find binding path for element', { cause: element })\n }\n const s = signal(element, {\n childList: true\n })\n throttledEffect(() => {\n const children = Array.from(s.children)\n untracked(() => { // don't track access to the data, only track dom changes\n batch(() => { // apply all changes in the list as one change\n let key=0\n const currentList = getValueByPath(this.options.root, path)\n const source = currentList.slice() // make sure changes in currentList don't affect the original source\n for (const item of children) {\n if (item.tagName==='TEMPLATE') {\n continue\n }\n if (item.dataset.flowKey) { //FIXME: could be other attribute name\n if (item.dataset.flowKey!=key) {\n setValueByPath(this.options.root, path+'.'+key,\n source[item.dataset.flowKey])\n }\n key++\n }\n }\n if (currentList.length>key) {\n // remove extra values\n currentList.length = key\n }\n })\n })\n }, 50)\n return s\n}\n\n/**\n * This function sets up the dom signal on an element, provided it has a `data-flow-field` attribute\n * @param HTMLElement element - the element to track\n * @returns Proxy\n */\nexport function trackDomField(element, props, valueIsString, stringProperty = 'innerHTML', getUpdateValue, context) {\n if (domSignals.has(element)) {\n return\n }\n const path = this.getBindingPath(element)\n if (!path) {\n throw new Error('Could not find binding path for element', { cause: element })\n }\n const s = signal(element)\n domSignals.set(element, s)\n batch(() => { // avoids cyclical dependencies - check why\n throttledEffect(() => {\n let updateValue\n if (getUpdateValue) {\n // Custom edit extractors often need the current data value, for\n // example to toggle a checkbox value in an array. Read the DOM\n // properties here for dependency tracking, but read the data only\n // in the untracked section below to avoid DOM/data cycles.\n for (const prop of props) {\n s[prop]\n }\n } else {\n updateValue = s[stringProperty]\n if (!valueIsString) {\n updateValue = getProperties(s, ...props)\n }\n }\n untracked(() => { // don't track changes in data, only in the dom\n // Rendering a primitive value into the DOM usually turns it into\n // a string. Do not write that string straight back to the data\n // when it still represents the current value. This keeps numbers\n // and booleans stable after one-way rendering in a two-way bind.\n const currentValue = getValueByPath(this.options.root, path)\n if (getUpdateValue) {\n updateValue = getUpdateValue.call(this, s, currentValue)\n }\n if (typeof updateValue === 'undefined') {\n return\n }\n updateValue = this.extractValue?.(context, updateValue, currentValue) ?? updateValue\n if (typeof updateValue === 'undefined') {\n return\n }\n if (valueIsString && !Object.is(currentValue, updateValue) && String(currentValue) === updateValue) {\n return\n }\n // don't trigger this effect when the data changes (root.path)\n setValueByPath(this.options.root, path, updateValue, { replace: context?.replaceValue })\n })\n }, 50)\n })\n return s\n}\n\n\n/**\n * Finds the closest ancestor, including `el` itself, that has `attr` and\n * returns that attribute value.\n *\n * This helper is used by the app/command layer and lives in this module so\n * DOM utility helpers shared by the app and binding layers.\n *\n * @param {Element} el - Element to start searching from.\n * @param {string} attr - Attribute name to find.\n * @returns {string|undefined} The attribute value, or undefined if not found.\n */\nexport function findAttribute(el, attr) {\n return el.closest('['+attr+']')\n ?.getAttribute(attr)\n}\n", "/*\n * Default renderers for data binding\n * Will be used unless overriden in the SimplyBind options parameter\n */\nimport { signal as domSignal, trackDomField, trackDomList } from './dom.mjs'\nimport { throttledEffect, effect, untracked, batch } from '@muze-labs/simplyflow-state'\nimport { getValueByPath } from './index.mjs'\nimport { DEP } from '@muze-labs/simplyflow-state/symbols'\n\nfunction writesFromDom(binding, context)\n{\n return binding.options.twoway || context.edit\n}\n\n/**\n * This function is used by default to render dom elements with the `data-flow-field` attribute.\n * It will switch to only switching in template content if the context has any templates.\n * Otherwise it will call the matching render function depending on the tagName of the\n * context.element\n */\nexport function field(context)\n{\n if (context.templates?.length) {\n fieldByTemplates.call(this, context)\n // TODO: check if existence of one or more templates must mean that\n // only the template rendering is applied, instead of also rendering attributes\n } else if (Object.hasOwnProperty.call(this.options.renderers, context.element.tagName)) {\n const renderer = this.options.renderers[context.element.tagName]\n if (renderer) {\n renderer.call(this, context)\n }\n } else if (this.options.renderers['*']) {\n this.options.renderers['*'].call(this, context)\n }\n return context\n}\n\n/**\n * This function is used by default to render DOM elements with the `data-flow-list` attribute.\n * The context.value must be an array. And context.templates must not be empty.\n */\nexport function list(context)\n{\n if (!Array.isArray(context.value)) {\n context.value = [context.value]\n }\n // make sure this effect is triggered if the length of the array changes\n const length = context.value.length\n if (!context.templates?.length) {\n console.error('No templates found in', context.element)\n } else {\n arrayByTemplates.call(this, context)\n }\n return context\n}\n\n/**\n * This function is used by default to render DOM elements with the `data-flow-map` attribute.\n * The context.value must be a non-null object. And context.templates must not be empty.\n */\nexport function map(context)\n{\n if (typeof context.value != 'object' || !context.value) {\n console.error('Value is not an object.', context.element, context.path, context.value)\n } else if (!context.templates?.length) {\n console.error('No templates found in', context.element)\n } else {\n objectByTemplates.call(this, context)\n }\n return context\n}\n\nfunction isInt(s) {\n if (parseInt(s)==s) {\n return true\n }\n}\n\n/**\n * This function sets a given value on the given path, starting at the given root.\n * It will automatically create objects if a path part does not yet exist.\n * @param root the root object\n * @param path a JSON path\n * @param value the value to set\n */\nexport function setValueByPath(root, path, value, options={})\n{\n batch(() => {\n let parts = path.split('.')\n let curr = root\n let part\n part = parts.shift()\n let prev = null\n let prevPart = null\n let prevCurr = curr\n while (part && curr) {\n prevCurr = curr\n part = decodeURIComponent(part)\n if (part=='0' && !Array.isArray(curr)) {\n // ignore so that data-flow-list=\"nonarray\" will work\n } else if (part==':key') {\n // FIXME: should change the key, not the value... not supported yet?\n throw new Error('setting key not yet supported')\n curr = prevPart\n } else if (part==':value') {\n // do nothing\n } else if (Array.isArray(curr) && !isInt(part) && typeof curr[part]=='undefined') {\n prev = curr[0]\n curr = curr[0][part] // so that data-flow-field=\"array.foo\" works\n } else {\n prev = curr\n curr = curr[part]\n }\n prevPart = part\n part = parts.shift()\n if (part && !curr) {\n // path in html does not exist yet, so create it\n const intKey = parseInt(part)\n if (intKey>=0 && part===''+intKey) {\n prevCurr[prevPart] = []\n } else {\n prevCurr[prevPart] = {}\n }\n curr = prevCurr[prevPart]\n }\n }\n if (prev && prevPart && options.replace) {\n prev[prevPart] = value\n } else if (prev && prevPart && prev[prevPart]!==value) {\n if (Array.isArray(value)) {\n prev[prevPart] = value\n } else if (value && typeof value=='object') {\n curr = prev[prevPart]\n if (!curr) {\n // last part of path in html does not exist yet, create it\n prev[prevPart] = {}\n curr = prev[prevPart]\n }\n for (const prop in value) {\n if (curr[prop]!==value[prop]) {\n curr[prop] = value[prop]\n }\n }\n } else {\n prev[prevPart] = value\n }\n }\n })\n}\n\n/**\n * Renders an array value by applying templates for each entry\n * Replaces or removes existing DOM children if needed\n * Reuses (doesn't touch) DOM children if template doesn't change\n * FIXME: this doesn't handle situations where there is no matching template\n * this messes up self healing. check renderObjectByTemplates for a better implementation\n */\nexport function arrayByTemplates(context)\n{\n const attribute = this.options.attribute\n const attributes = [attribute+'-field',attribute+'-edit',attribute+'-list',attribute+'-map',attribute+'-value-path']\n const attrQuery = '['+attributes.join('],[')+']'\n const keyAttribute = attribute+'-key'\n const items = Array.from(context.element.querySelectorAll(':scope > ['+keyAttribute+']'))\n const usedItems = new Set()\n let cursor = 0\n\n context.list = context.value\n\n for (let index = 0; index < context.value.length; index++) {\n context.index = index\n const value = context.list[index]\n let item = nextUnusedItem(items, usedItems, cursor)\n\n if (!item) {\n context.element.appendChild(this.applyTemplate(context))\n continue\n }\n\n const newTemplate = this.findTemplate(context.templates, value)\n const currentValueMatches = item[DEP.VALUE] === value\n let reusableItem = currentValueMatches\n ? item\n : findReusableItem(items, usedItems, value, newTemplate, cursor + 1)\n\n if (reusableItem) {\n if (newTemplate != reusableItem[DEP.TEMPLATE]) {\n context.element.replaceChild(this.applyTemplate(context), reusableItem)\n } else {\n if (reusableItem !== item) {\n context.element.insertBefore(reusableItem, item)\n }\n updateItemKey(reusableItem, index, context.path, keyAttribute, attributes, attrQuery)\n reusableItem[DEP.VALUE] = value\n }\n usedItems.add(reusableItem)\n if (reusableItem === item) {\n cursor++\n }\n continue\n }\n\n context.element.insertBefore(this.applyTemplate(context), item)\n }\n\n for (let item of items) {\n if (!usedItems.has(item)) {\n item.remove()\n }\n }\n\n if (this.options.twoway) {\n trackDomList.call(this, context.element)\n }\n}\n\nfunction nextUnusedItem(items, usedItems, start)\n{\n while (start < items.length) {\n const item = items[start]\n if (!usedItems.has(item)) {\n return item\n }\n start++\n }\n}\n\nfunction findReusableItem(items, usedItems, value, template, start)\n{\n for (let i = start; i < items.length; i++) {\n const item = items[i]\n if (!usedItems.has(item) && item[DEP.VALUE] === value && item[DEP.TEMPLATE] === template) {\n return item\n }\n }\n}\n\n\nfunction updateItemKey(item, key, path, keyAttribute, attributes, attrQuery)\n{\n const oldKey = item.getAttribute(keyAttribute)\n const newKey = ''+key\n\n if (oldKey === newKey) {\n return\n }\n\n item.setAttribute(keyAttribute, newKey)\n\n const oldPrefix = path+'.'+oldKey\n const newPrefix = path+'.'+newKey\n const bindings = Array.from(item.querySelectorAll(attrQuery))\n if (item.matches(attrQuery)) {\n bindings.unshift(item)\n }\n\n for (let binding of bindings) {\n for (let attr of attributes) {\n const bindPath = binding.getAttribute(attr)\n if (!bindPath || bindPath.substr(0,5)===':root') {\n continue\n }\n if (bindPath === oldPrefix) {\n binding.setAttribute(attr, newPrefix)\n } else if (bindPath.startsWith(oldPrefix+'.')) {\n binding.setAttribute(attr, newPrefix+bindPath.substr(oldPrefix.length))\n }\n }\n }\n}\n\n/**\n * Renders an object value by applying templates for each entry (Object.entries)\n * Replaces,moves or removes existing DOM children if needed\n * Reuses (doesn't touch) DOM children if template doesn't change\n */\nexport function objectByTemplates(context)\n{\n const attribute = this.options.attribute\n const attributes = [attribute+'-field',attribute+'-edit',attribute+'-list',attribute+'-map',attribute+'-value-path']\n const attrQuery = '['+attributes.join('],[')+']'\n const keyAttribute = attribute+'-key'\n const items = Array.from(context.element.querySelectorAll(':scope > ['+keyAttribute+']'))\n const usedItems = new Set()\n let cursor = 0\n\n context.list = context.value\n\n for (let key in context.list) {\n context.index = key\n const value = context.list[key]\n let item = nextUnusedItem(items, usedItems, cursor)\n\n if (!item) {\n context.element.appendChild(this.applyTemplate(context))\n continue\n }\n\n const newTemplate = this.findTemplate(context.templates, value)\n let reusableItem\n\n if (item.getAttribute(keyAttribute) === key) {\n reusableItem = item\n } else {\n reusableItem = findItemByKey(items, usedItems, key, keyAttribute)\n || findReusableItem(items, usedItems, value, newTemplate, cursor)\n }\n\n if (reusableItem) {\n if (newTemplate != reusableItem[DEP.TEMPLATE]) {\n context.element.replaceChild(this.applyTemplate(context), reusableItem)\n } else {\n if (reusableItem !== item) {\n context.element.insertBefore(reusableItem, item)\n }\n updateItemKey(reusableItem, key, context.path, keyAttribute, attributes, attrQuery)\n reusableItem[DEP.VALUE] = value\n }\n usedItems.add(reusableItem)\n if (reusableItem === item) {\n cursor++\n }\n continue\n }\n\n context.element.insertBefore(this.applyTemplate(context), item)\n }\n\n for (let item of items) {\n if (!usedItems.has(item)) {\n item.remove()\n }\n }\n}\n\nfunction findItemByKey(items, usedItems, key, keyAttribute)\n{\n const stringKey = ''+key\n for (let item of items) {\n if (!usedItems.has(item) && item.getAttribute(keyAttribute) === stringKey) {\n return item\n }\n }\n}\n\n/**\n * renders the contents of an html element by rendering\n * a matching template, once.\n */\nexport function fieldByTemplates(context)\n{\n const rendered = context.element.querySelector(':scope > :not(template)')\n const template = this.findTemplate(context.templates, context.value)\n context.parent = getParentPath(context.element)\n if (rendered) {\n if (template) {\n if (rendered?.[DEP.TEMPLATE] != template) {\n const clone = this.applyTemplate(context)\n context.element.replaceChild(clone, rendered)\n }\n } else {\n context.element.removeChild(rendered)\n }\n } else if (template) {\n const clone = this.applyTemplate(context)\n context.element.appendChild(clone)\n }\n}\n\nfunction getParentPath(el, attribute)\n{\n const parentEl = el.parentElement?.closest(`[${attribute}-list],[${attribute}-map]`)\n if (!parentEl) {\n return ''\n }\n if (parentEl.hasAttribute(`${attribute}-list`)) {\n return parentEl.getAttribute(`${attribute}-list`)+'.'\n }\n return parentEl.getAttribute(`${attribute}-map`)+'.'\n}\n\n/**\n * renders a single input type\n * for radio/checkbox inputs it only sets the checked attribute to true/false\n * if the value attribute matches the current value\n * for other inputs the value attribute is updated\n */\nexport function input(context)\n{\n const el = context.element\n let value = context.value\n\n // Inputs display their bound primitive in `value`, not `innerHTML`.\n // Calling element() here would also enable two-way tracking on\n // innerHTML, which would overwrite text input data with an empty string.\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n setProperties(el, value, 'title', 'id', 'className', 'value', 'checked')\n value = value.value\n }\n if (typeof value == 'undefined') {\n value = ''\n }\n if (el.type=='checkbox') {\n el.checked = checkboxIsChecked(el, value)\n } else if (el.type=='radio') {\n el.checked = matchValue(el.value, value)\n } else if (!matchValue(el.value, value)) {\n el.value = ''+value\n }\n\n if (writesFromDom(this, context)) {\n if (el.type=='checkbox') {\n trackDomField.call(this, context.element, ['checked'], true, 'checked', checkboxEditValue, context)\n } else if (el.type=='radio') {\n trackDomField.call(this, context.element, ['checked'], true, 'checked', radioEditValue, context)\n } else {\n trackDomField.call(this, context.element, ['value'], true, 'value', undefined, context)\n }\n }\n}\n\nfunction checkboxIsChecked(el, value)\n{\n if (Array.isArray(value)) {\n return value.some(selected => matchValue(el.value, selected))\n }\n if (typeof value === 'boolean') {\n return value\n }\n return matchValue(el.value, value)\n}\n\nfunction checkboxEditValue(el, currentValue)\n{\n // An array-bound checkbox toggles its value in that array. Otherwise a\n // checkbox edits a boolean; this keeps the app API simple and predictable.\n // Existing string values are left alone on the initial checked render so\n // lower-level two-way bindings do not immediately rewrite legacy data.\n if (Array.isArray(currentValue)) {\n const value = el.value\n const values = currentValue.filter(item => !matchValue(item, value))\n if (el.checked) {\n values.push(value)\n }\n return values\n }\n if (typeof currentValue === 'boolean') {\n return el.checked\n }\n if (el.checked && matchValue(el.value, currentValue)) {\n return currentValue\n }\n return el.checked\n}\n\nfunction radioEditValue(el, currentValue)\n{\n // Browsers fire the useful change event on the newly checked radio. If this\n // radio is not checked, leave the bound value unchanged.\n if (!el.checked) {\n return undefined\n }\n return el.value\n}\n\n/**\n * Sets the value of the button, doesn't touch the innerHTML\n */\nexport function button(context)\n{\n element.call(this, context, 'value')\n}\n\n/**\n * Sets the selected attribute of select options\n */\nexport function select(context)\n{\n const el = context.element\n let value = context.value\n\n if (value === null) {\n value = ''\n }\n\n if (Array.isArray(value)) {\n for (let option of el.options) {\n option.selected = value.some(selected => matchValue(option.value, selected))\n if (option.selected) {\n option.setAttribute('selected', true)\n } else {\n option.removeAttribute('selected')\n }\n }\n } else if (typeof value!='object') {\n let option = Array.from(el.options).find(o => matchValue(o.value,value))\n if (option) {\n option.selected = true\n option.setAttribute('selected', true)\n }\n } else { // value is a non-null object\n if (value.options) {\n setSelectOptions(el, value.options)\n }\n if (typeof value.selected !== 'undefined') {\n select.call(this, Object.assign({}, context, {value:value.selected}))\n }\n setProperties(el, value, 'name', 'id', 'selectedIndex', 'className') // allow innerHTML? if so call element instead\n }\n\n if (writesFromDom(this, context)) {\n if (el.multiple) {\n trackDomField.call(this, context.element, ['value'], true, 'value', selectMultipleEditValue, context)\n } else {\n trackDomField.call(this, context.element, ['value'], true, 'value', undefined, context)\n }\n }\n}\n\nfunction selectMultipleEditValue(el)\n{\n // Keep multiple-select editing as ordinary data: an array of selected values.\n // Reading `value` registers the DOM dependency; the change listener notifies\n // it whenever the selection changes.\n const value = el.value\n return Array.from(el.options)\n .filter(option => option.selected)\n .map(option => option.value)\n}\n\n/**\n * adds a single option to a select element. The option.text property is optional, if not set option.value is used.\n * @param select The select element\n * @param option An option descriptor, either a string, object with {text,value,defaultSelected,selected} properties or an Option object\n */\nexport function addOption(select, option)\n{\n if (!option) {\n return\n }\n if (typeof option !== 'object') {\n select.options.add(new Option(''+option))\n } else if (option.text) {\n select.options.add(new Option(option.text, option.value, option.defaultSelected, option.selected))\n } else if (typeof option.value != 'undefined') {\n select.options.add(new Option(''+option.value, option.value, option.defaultSelected, option.selected))\n }\n}\n\n/**\n * This function clears all existing options of a select element, and adds the specified options.\n */\nexport function setSelectOptions(select,options)\n{\n //@TODO: only update in case of changes?\n select.innerHTML = ''\n if (Array.isArray(options)) {\n for (const option of options) {\n addOption(select, option)\n }\n } else if (options && typeof options == 'object') {\n for (const option in options) {\n addOption(select, { text: options[option], value: option })\n }\n }\n}\n\n/**\n * Sets the innerHTML and href, id, title, target, name, newwindow, nofollow attributes of an anchor\n */\nexport function anchor(context)\n{\n element.call(this, context, 'target', 'href', 'name', 'newwindow', 'nofollow')\n if (writesFromDom(this, context)) {\n batch(() => {\n updateProperties.call(this, context, ['target', 'href', 'name', 'newwindow', 'nofollow'])\n })\n }\n}\n\n/**\n * Sets the title, id, alt and src attributes of an image.\n */\nexport function image(context)\n{\n setProperties(context.element, context.value, 'title', 'alt', 'src', 'id')\n if (writesFromDom(this, context)) {\n batch(() => {\n updateProperties.call(this, context, ['title', 'alt', 'src', 'id'])\n })\n }\n}\n\n/**\n * Sets the title, id and src attribute of an iframe\n */\nexport function iframe(context)\n{\n setProperties(context.element, context.value, 'title', 'src', 'id')\n if (writesFromDom(this, context)) {\n batch(() => {\n updateProperties.call(this, context, ['title','src','id'])\n })\n }\n}\n\n/**\n * Sets the content and id attribute of a meta element\n */\nexport function meta(context)\n{\n setProperties(context.element, context.value, 'content', 'id')\n if (writesFromDom(this, context)) {\n batch(() => {\n updateProperties.call(this, context, ['content','id'])\n })\n }\n}\n\n/**\n * sets the innerHTML and title and id properties of any HTML element\n */\nexport function element(context, ...extraprops)\n{\n const el = context.element\n let value = context.value\n let valueIsString = false\n if (typeof value!='undefined' && value!==null) {\n let strValue = ''+value\n if (typeof value!='object' || strValue.substring(0,8)!='[object ') {\n value = { innerHTML: value }\n valueIsString = true\n }\n }\n const props = ['innerHTML','title','id','className'].concat(extraprops)\n setProperties(el, value, ...props)\n if (writesFromDom(this, context)) {\n trackDomField.call(this, context.element, props, valueIsString, 'innerHTML', undefined, context)\n }\n}\n\n/**\n * Sets a list of properties on a dom element, equal to \n * the string value of a data object\n * only updates the dom element if the property doesn't match\n */\nexport function setProperties(el, data, ...properties) {\n if (!data || typeof data!=='object') {\n return\n }\n for (const property of properties) {\n if (typeof data[property] === 'undefined') {\n continue\n }\n if (matchValue(el[property], data[property])) {\n continue\n }\n if (data[property] === null) {\n el[property] = ''\n } else {\n el[property] = ''+data[property]\n }\n }\n}\n\n\nfunction updateProperties(context, properties)\n{\n trackDomField.call(this, context.element, properties, false, 'innerHTML', undefined, context)\n}\n\nexport function getProperties(el, ...properties) {\n const result = {}\n for (const property of properties) {\n switch(property) {\n default: \n result[property] = el[property]\n break\n }\n }\n return result\n}\n\n/**\n * Returns true if a matches b, either by having the\n * same string value, or matching string :empty against a falsy value\n */\nexport function matchValue(a,b)\n{\n if (a==':empty' && !b) {\n return true\n }\n if (b==':empty' && !a) {\n return true\n }\n if (''+a == ''+b) {\n return true\n }\n return false\n}\n", "import { trackDomField } from './dom.mjs'\n\nexport const escape_html = {\n render(context, next) {\n if (typeof context.value !== 'string') {\n return next(context)\n }\n if (usesValueProperty(context.element)) {\n context.value = { value: context.value }\n } else {\n context.value = { innerHTML: escapeHTML(context.value) }\n }\n return next(context)\n },\n\n extract(context, next) {\n if (typeof context.value === 'string') {\n context.value = unescapeHTML(context.value)\n } else if (context.value && typeof context.value === 'object') {\n if (typeof context.value.innerHTML === 'string') {\n context.value = unescapeHTML(context.value.innerHTML)\n } else if (typeof context.value.value === 'string') {\n context.value = context.value.value\n }\n }\n return next(context)\n }\n}\n\nfunction usesValueProperty(element)\n{\n return element?.tagName === 'INPUT' || element?.tagName === 'TEXTAREA'\n}\n\nfunction escapeHTML(value)\n{\n return String(value)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n}\n\nfunction unescapeHTML(value)\n{\n const textarea = document.createElement('textarea')\n textarea.innerHTML = value\n return textarea.value\n}\n\nexport function fixed_content(context, next) {\n if (typeof context.value == 'string') {\n context.value = {}\n } else {\n delete context.value?.innerHTML\n }\n next(context)\n}\n\nexport const attributes = {\n render(context) {\n const names = getAttributeNames.call(this, context)\n setAttributes(context.element, context.value, names)\n if (context.edit) {\n trackDomField.call(\n this,\n context.element,\n names,\n false,\n 'innerHTML',\n () => readAttributes(context.element, names),\n context\n )\n }\n return context\n },\n\n extract(context, next) {\n const names = getAttributeNames.call(this, context)\n context.value = readAttributes(context.element, names)\n context.replaceValue = true\n return next ? next(context) : context\n }\n}\n\nfunction getAttributeNames(context)\n{\n const attribute = this.options.attribute+'-attributes'\n const configured = context.element.getAttribute(attribute)\n if (configured) {\n return configured.split(/[\\s,]+/).filter(Boolean)\n }\n if (context.value && typeof context.value === 'object' && !Array.isArray(context.value)) {\n return Object.keys(context.value)\n }\n if (context.currentValue && typeof context.currentValue === 'object' && !Array.isArray(context.currentValue)) {\n return Object.keys(context.currentValue)\n }\n return []\n}\n\nfunction setAttributes(element, data, names)\n{\n if (!names.length || !data || typeof data !== 'object' || Array.isArray(data)) {\n return\n }\n for (const name of names) {\n const value = data[name]\n if (typeof value === 'undefined' || value === null) {\n element.removeAttribute(name)\n } else if (element.getAttribute(name) !== ''+value) {\n element.setAttribute(name, ''+value)\n }\n }\n}\n\nfunction readAttributes(element, names)\n{\n const data = {}\n for (const name of names) {\n if (element.hasAttribute(name)) {\n data[name] = element.getAttribute(name)\n }\n }\n return data\n}\n", "import { throttledEffect, destroy } from '@muze-labs/simplyflow-state'\nimport { escape_html, fixed_content, attributes } from './transformers.mjs'\nimport * as render from './render.mjs'\nimport { DEP } from '@muze-labs/simplyflow-state/symbols'\n\n/**\n * Implements one way databinding, updating dom elements with matching attributes\n * to changes in signals (see state.mjs)\n * \n * @class\n */\nclass SimplyBind\n{\n \n /**\n * @param Object options - a set of options for this instance, options may include:\n * - root (signal) (required) - the root data object that contains al signals that can be bound\n * - container (HTMLElement) - the dom element to use as the root for all bindings\n * - attribute (string) - the prefix for the field, edit, list and map attributes, e.g. 'data-bind'\n * - transformers (object name:function) - a map of transformer names and functions\n * - render (object with field, list and map properties); edit uses field renderers\n */\n constructor(options)\n {\n /**\n * A map of HTMLElements and the data bindings on each, in the form of \n * the connectedSignal returned by the (throttled)Effect.\n * @type {Map}\n * @public\n */\n this.bindings = new Map()\n\n const defaultTransformers = {\n escape_html,\n fixed_content,\n attributes\n }\n const defaultOptions = {\n container: document.body,\n attribute: 'data-flow',\n transformers: defaultTransformers,\n render: {\n field: [render.field],\n list: [render.list],\n map: [render.map]\n },\n renderers: {\n 'INPUT':render.input,\n 'TEXTAREA':render.input,\n 'BUTTON':render.button,\n 'SELECT':render.select,\n 'A':render.anchor,\n 'IMG':render.image,\n 'IFRAME':render.iframe,\n 'META':render.meta,\n 'TEMPLATE':null,\n '*':render.element\n },\n twoway: false\n }\n if (!options?.root) {\n throw new Error('bind needs at least options.root set')\n }\n this.options = Object.assign({}, defaultOptions, options)\n if (options.transformers) {\n this.options.transformers = Object.assign({}, defaultTransformers, options?.transformers)\n } else {\n this.options.transformers = defaultTransformers\n }\n const attribute = this.options.attribute\n const bindAttributes = [attribute+'-field',attribute+'-edit',attribute+'-list',attribute+'-map']\n\n const getBindingAttribute = (el) => {\n const foundAttribute = bindAttributes.find(attr => el.hasAttribute(attr))\n if (!foundAttribute) {\n console.error('No matching attribute found',el,bindAttributes)\n }\n return foundAttribute\n }\n\n // sets up the effect that updates the element if its\n // data binding value changes\n const renderElement = (el) => {\n this.bindings.set(el, throttledEffect(() => {\n if (!el.isConnected) {\n // el is no longer part of this document\n untrack(el, this.getBindingPath(el))\n const binding = this.bindings.get(el)\n if (binding) {\n destroy(binding)\n this.bindings.delete(el)\n }\n // doing this here instead of in a mutationobserver\n // allows an element to be temporary removed and then inserted\n // without the binding having to be reset\n return\n }\n let context = {\n templates: el.querySelectorAll(':scope > template'),\n attribute: getBindingAttribute(el)\n }\n context.edit = context.attribute === this.options.attribute+'-edit'\n context.path = this.getBindingPath(el)\n context.value = getValueByPath(this.options.root, context.path)\n context.element = el\n track(el, context)\n runTransformers(context)\n }, 50))\n }\n\n // finds and runs applicable render transformers\n // creates a stack of transformers, calls the topmost\n // each transformer can opt to call the next or not\n // transformers should return the context object (possibly altered)\n const runTransformers = (context) => {\n let transformers\n switch(context.attribute) {\n case this.options.attribute+'-field':\n case this.options.attribute+'-edit':\n transformers = Array.from(this.options.render.field)\n break\n case this.options.attribute+'-list':\n transformers = Array.from(this.options.render.list)\n break\n case this.options.attribute+'-map':\n transformers = Array.from(this.options.render.map)\n break\n default:\n throw new Error('no valid context attribute specified',context)\n break\n }\n transformers.push(...this.getNamedTransformers(context.element)\n .map(transformer => getTransformerPhase(transformer, 'render'))\n .filter(Boolean))\n runTransformerStack.call(this, transformers, context)\n }\n\n // given a set of elements with data bind attribute\n // this renders each of those elements\n const applyBindings = (bindings) => {\n for (let bindingEl of bindings) {\n if (!this.bindings.get(bindingEl)) { // bindingEl may have moved from somewhere else in this document\n renderElement(bindingEl)\n }\n }\n }\n\n // this handles the mutation observer changes\n // if any element is added, and has a data bind attribute\n // it applies that data binding\n const updateBindings = (changes) => {\n const selector = `[${attribute}-field],[${attribute}-edit],[${attribute}-list],[${attribute}-map]`\n for (const change of changes) {\n if (change.type==\"childList\" && change.addedNodes) {\n for (let node of change.addedNodes) {\n if (node instanceof HTMLElement) {\n let bindings = Array.from(node.querySelectorAll(selector))\n if (node.matches(selector)) {\n bindings.unshift(node)\n }\n if (bindings.length) {\n applyBindings(bindings)\n }\n }\n }\n }\n }\n }\n\n // this responds to elements getting added to the dom\n // and if any have data bind attributes, it applies those bindings\n this.observer = new MutationObserver((changes) => {\n updateBindings(changes)\n })\n\n this.observer.observe(this.options.container, {\n subtree: true,\n childList: true\n })\n\n // this finds elements with data binding attributes and applies those bindings\n // must come after setting up the observer, or included templates\n // won't trigger their own bindings\n const bindings = this.options.container.querySelectorAll(\n ':is(['+this.options.attribute+'-field]'+\n ',['+this.options.attribute+'-edit]'+\n ',['+this.options.attribute+'-list]'+\n ',['+this.options.attribute+'-map]):not(template)'\n )\n try {\n if (bindings.length) {\n applyBindings(bindings)\n }\n } catch (error) {\n this.destroy()\n throw error\n }\n\n }\n\n /**\n * Finds the first matching template and creates a new DocumentFragment\n * with the correct data bind attributes in it (prepends the current path)\n * @param Context context\n * @return DocumentFragment\n */\n applyTemplate(context)\n {\n const path = context.path\n const parent = context.parent\n const templates = context.templates\n const list = context.list\n const index = context.index\n const value = list ? list[index] : context.value\n\n let template = this.findTemplate(templates, value)\n if (!template) {\n let result = new DocumentFragment()\n result.innerHTML = '<!-- no matching template -->'\n return result\n }\n let clone = template.content.cloneNode(true)\n if (!clone.children?.length) {\n return clone\n }\n if (clone.children.length>1) {\n throw new Error('template must contain a single root node', { cause: template })\n }\n const attribute = this.options.attribute\n\n const attributes = [attribute+'-field',attribute+'-edit',attribute+'-list',attribute+'-map']\n const bindings = clone.querySelectorAll(`[${attribute}-field],[${attribute}-edit],[${attribute}-list],[${attribute}-map]`)\n for (let binding of bindings) {\n if (binding.tagName=='TEMPLATE') {\n continue\n }\n const attr = attributes.find(attr => binding.hasAttribute(attr))\n let bind = binding.getAttribute(attr)\n bind = this.applyLinks(template.links, bind)\n if (bind.substring(0, ':root.'.length)==':root.') {\n binding.setAttribute(attr, bind.substring(':root.'.length))\n } else if (bind==':value' && index!=null) {\n binding.setAttribute(attr, path+'.'+index)\n } else if (index!=null) {\n binding.setAttribute(attr, path+'.'+index+'.'+bind)\n } else {\n binding.setAttribute(attr, parent+bind)\n }\n }\n this.applyTemplateCommandValues(clone, template.links, path, index)\n if (typeof index !== 'undefined') {\n clone.children[0].setAttribute(attribute+'-key',index)\n }\n // keep track of the used template and value reference, so list items can be\n // reused when an array insertion shifts their numeric index.\n clone.children[0][DEP.TEMPLATE] = template\n clone.children[0][DEP.VALUE] = value\n\n // return clone, not the firstChild, so that all whitespace is cloned as well\n return clone\n }\n\n applyTemplateCommandValues(fragment, links, path, index)\n {\n const valueAttribute = this.options.attribute+'-value'\n const valuePathAttribute = this.options.attribute+'-value-path'\n const valueSelector = '['+valueAttribute+']'\n const elements = Array.from(fragment.querySelectorAll(valueSelector))\n\n for (const element of elements) {\n let value = element.getAttribute(valueAttribute)\n value = this.applyLinks(links, value)\n const resolved = templateCommandValue(value, path, index)\n if (!resolved) {\n continue\n }\n if (Object.hasOwn(resolved, 'path')) {\n element.setAttribute(valuePathAttribute, resolved.path)\n } else {\n element.setAttribute(valueAttribute, resolved.value)\n element.removeAttribute(valuePathAttribute)\n }\n }\n }\n\n parseLinks(links)\n {\n let result = {}\n links = links.split(';').map(link => link.trim())\n for (let link of links) {\n link = link.split('=')\n result[link[0].trim()] = link[1].trim()\n }\n return result\n }\n\n applyLinks(links, value)\n {\n for (let link in links) {\n if (value.startsWith(link+'.')) {\n return links[link] + value.substr(link.length)\n } else if (value==link) {\n return links[link]\n }\n }\n return value\n }\n\n /**\n * Returns the path referenced in either the field, list or map attribute\n * @param HTMLElement el\n * @return string The path referenced, or void\n */\n getBindingPath(el)\n {\n const attributes = [\n this.options.attribute+'-field', \n this.options.attribute+'-edit',\n this.options.attribute+'-list',\n this.options.attribute+'-map'\n ]\n for (let attr of attributes) {\n if (el.hasAttribute(attr)) {\n return el.getAttribute(attr)\n }\n }\n }\n\n getNamedTransformers(el)\n {\n const transformAttribute = this.options.attribute+'-transform'\n if (!el.hasAttribute(transformAttribute)) {\n return []\n }\n return el.getAttribute(transformAttribute)\n .split(' ')\n .filter(Boolean)\n .map(name => {\n const transformer = this.options.transformers[name]\n if (!transformer) {\n console.warn('No transformer with name '+name+' configured', {cause: el})\n return null\n }\n return transformer\n })\n .filter(Boolean)\n }\n\n extractValue(context, value, currentValue)\n {\n if (!context?.element) {\n return value\n }\n const transformers = this.getNamedTransformers(context.element)\n .map(transformer => getTransformerPhase(transformer, 'extract'))\n .filter(Boolean)\n .reverse()\n if (!transformers.length) {\n return value\n }\n delete context.replaceValue\n const extractContext = Object.assign({}, context, {\n value,\n currentValue,\n originalValue: currentValue\n })\n runTransformerStack.call(this, transformers, extractContext)\n context.replaceValue = extractContext.replaceValue\n return extractContext.value\n }\n\n /**\n * Finds the first template from an array of templates that\n * matches the given value. \n */\n findTemplate(templates, value)\n {\n const templateMatches = t => {\n // find the value to match against (e.g. data-bind=\"foo\")\n let path = this.getBindingPath(t)\n let currentItem\n if (path) {\n if (path.substr(0,6)==':root.') {\n currentItem = getValueByPath(this.options.root, path.substring(6))\n } else {\n currentItem = getValueByPath(value, path)\n }\n } else {\n currentItem = value\n }\n\n // then check the value against pattern, if set (e.g. data-bind-match=\"bar\")\n const strItem = ''+currentItem\n let matches = t.getAttribute(this.options.attribute+'-match')\n if (matches) {\n if (matches===':empty' && !currentItem) {\n return t\n } else if (matches===':notempty' && currentItem) {\n return t\n }\n if (strItem == matches) {\n return t\n }\n }\n if (!matches) {\n // no data-bind-match is set, so return this template\n return t\n }\n }\n let template = Array.from(templates).find(templateMatches)\n let links = null\n if (template?.hasAttribute(this.options.attribute+'-link')) {\n links = this.parseLinks(template.getAttribute(this.options.attribute+'-link'))\n }\n let rel = template?.getAttribute('rel')\n if (rel) {\n let replacement = document.querySelector('template#'+rel)\n if (!replacement) {\n throw new Error('Could not find template with id '+rel)\n }\n template = replacement\n }\n if (template) {\n template.links = links\n }\n return template\n }\n\n destroy()\n {\n this.bindings.forEach((binding, element) => {\n untrack(element, this.getBindingPath(element))\n destroy(binding)\n })\n this.bindings = new Map()\n this.observer.disconnect()\n }\n\n}\n\n/**\n * Returns a new instance of SimplyBind. This is the normal start\n * of a data bind flow\n */\nexport function bind(options)\n{\n return new SimplyBind(options)\n}\n\nfunction getTransformerPhase(transformer, phase)\n{\n if (typeof transformer === 'function') {\n return phase === 'render' ? transformer : null\n }\n if (transformer && typeof transformer[phase] === 'function') {\n return transformer[phase]\n }\n return null\n}\n\nfunction runTransformerStack(transformers, context)\n{\n let next = context => context\n for (let transformer of transformers) {\n next = ((next, transformer) => {\n return (context) => {\n return transformer.call(this, context, next)\n }\n })(next, transformer)\n }\n return next?.(context)\n}\n\nconst tracking = new Map()\n\nexport function trace(path)\n{\n return tracking.get(path)\n}\n\nfunction track(el, context) {\n untrack(el)\n if (!tracking.has(context.path)) {\n tracking.set(context.path, [context])\n } else {\n tracking.get(context.path).push(context)\n }\n}\n\nfunction untrack(el, path) {\n if (path) {\n let list = tracking.get(path)\n if (list) {\n list = list.filter(context => context.element !== el)\n tracking.set(path, list)\n }\n return\n }\n tracking.forEach((list, trackedPath) => {\n list = list.filter(context => context.element !== el)\n tracking.set(trackedPath, list)\n })\n}\n\n\n\nfunction templateCommandValue(value, path, index)\n{\n if (!value || value[0] !== ':') {\n return null\n }\n if (value === ':key') {\n return { value: ''+index }\n }\n if (value === ':value') {\n return { path: templateItemPath(path, index) }\n }\n if (value.startsWith(':value.')) {\n return { path: joinPath(templateItemPath(path, index), value.substring(':value'.length)) }\n }\n if (value.startsWith(':root.')) {\n return { path: value.substring(':root.'.length) }\n }\n return null\n}\n\nfunction templateItemPath(path, index)\n{\n if (typeof index === 'undefined') {\n return path\n }\n return joinPath(path, '.'+index)\n}\n\nfunction joinPath(path, suffix)\n{\n if (!path) {\n return suffix.replace(/^\\./, '')\n }\n return path+suffix\n}\n\n/**\n * Returns the value by walking the given path as a json pointer, starting at root\n * if you have a property with a '.' in its name urlencode the '.', e.g: %46\n * \n * @param HTMLElement root\n * @param string path e.g. 'foo.bar'\n * @return mixed the value found by walking the path from the root object or undefined\n */\nexport function getValueByPath(root, path)\n{\n let parts = path.split('.')\n let curr = root\n let part\n part = parts.shift()\n let prevPart = null\n while (part && curr) {\n part = decodeURIComponent(part)\n if (part=='0' && !Array.isArray(curr)) {\n // ignore so that data-flow-list=\"nonarray\" will work\n } else if (part==':key') {\n curr = prevPart\n } else if (part==':value') {\n // do nothing\n } else if (Array.isArray(curr) && typeof curr[part]=='undefined' && curr[0]) {\n curr = curr[0][part] // so that data-flow-field=\"array.foo\" works\n } else {\n curr = curr[part]\n }\n prevPart = part\n part = parts.shift()\n }\n return curr\n}\n", "import { signal, isSignal, raw, throttledEffect, batch } from '@muze-labs/simplyflow-state'\n\n/**\n * This class implements a pluggable data model, where you can\n * add effects that are run only when either an option for that\n * effect changes, or when an effect earlier in the chain of\n * effects changes.\n */\nclass SimplyFlowModel {\n\n\t/**\n\t * Creates a new datamodel, with a state property that contains\n\t * all the data passed to this constructor\n\t * @param state\tObject with all the data for this model\n\t * @throws Error if state is not set\n\t */\n\tconstructor(state) {\n\t\tif (!state) {\n\t\t\tthrow new Error('no options set')\n\t\t}\n\t\tif (state.data==null || typeof state.data[Symbol.iterator] !== 'function') {\n\t\t\tconsole.warn('SimplyFlowModel: options.data is not iterable')\n\t\t}\n\t\tthis.state = signal(state)\n\t\tif (!this.state.options) {\n\t\t\tthis.state.options = {}\n\t\t}\n\t\tthis.effects = [{current:this.state.data}]\n\t\tthis.view = {\n current: this.state.data\n }\n\t}\n\n\t/**\n\t * Adds an effect to run whenever a signal it depends on\n\t * changes. this.state is the usual signal.\n\t * The `fn` function param is not itself an effect, but must return\n\t * and effect function. `fn` takes one param, which is the data signal.\n\t * This signal will always have at least a `current` property.\n\t * The result of the effect function is pushed on to the this.effects\n\t * list. And the last effect added is set as this.view\n\t */\n\taddEffect(fn) {\n\t\tif (!fn || typeof fn !=='function') {\n\t\t\tthrow new Error('addEffect requires an effect function as its parameter', { cause: fn })\n\t\t}\n\t\tconst dataSignal = this.effects[this.effects.length-1]\n\t\tconst connectedSignal = fn.call(this, dataSignal)\n\t\tif (!isSignal(connectedSignal)) {\n\t\t\tthrow new Error('addEffect function parameter must return a Signal', { cause: fn })\n\t\t}\n\t\tthis.view = connectedSignal\n\t\tthis.effects.push(this.view)\n\t}\n}\n\nexport function model(options) {\n\treturn new SimplyFlowModel(options)\n}\n\n/**\n * Returns a function for model.addEffect that sorts the input data\n * \n * Options:\n * - direction (string) default 'asc' - change to 'desc' to sort in descending order\n * - sortBy (string) (optional) - used by the default sorting function to select the property to sort on\n * - sortFn (function) (required - set by default) - the sort function to use\n */\nexport function sort(options={}) {\n\treturn function(data) {\n\t\t// initialize the sort options, only gets called once\n\t\tthis.state.options.sort = Object.assign({\n\t\t\tdirection: 'asc',\n\t\t\tsortBy: null,\n\t\t\tsortFn: ((a,b) => {\n\t\t\t\tconst sort = this.state.options.sort\n\t\t\t\tconst sortBy = sort.sortBy\n\t\t\t\tif (!sort.sortBy) {\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t\tconst direction = sort.sortDirection || sort.direction || 'asc'\n\t\t\t\tconst larger = direction == 'asc' ? 1 : -1\n\t\t\t\tconst smaller = direction == 'asc' ? -1 : 1\n\t\t\t\tif (typeof a?.[sortBy] === 'undefined') {\n\t\t\t\t\tif (typeof b?.[sortBy] === 'undefined') {\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\treturn larger\n\t\t\t\t}\n\t\t\t\tif (typeof b?.[sortBy] === 'undefined') {\n\t\t\t\t\treturn smaller\n\t\t\t\t}\n\t\t\t\tif (a[sortBy]<b[sortBy]) {\n\t\t\t\t\treturn smaller\n\t\t\t\t} else if (a[sortBy]>b[sortBy]) {\n\t\t\t\t\treturn larger\n\t\t\t\t} else {\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t})\n\t\t}, options);\n\t\t// then return the effect, which is called when\n\t\t// either the data or the sort options change\n\t\treturn throttledEffect(() => {\n\t\t\tconst sort = this.state.options.sort\n\t\t\tconst direction = sort?.sortDirection || sort?.direction\n\t\t\tif (sort?.sortBy && direction) {\n\t\t\t\t// Read through the signal proxy so replacing `.sortFn` is tracked,\n\t\t\t\t// then call the raw comparator with the model as `this`.\n\t\t\t\tconst trackedSortFn = sort.sortFn\n\t\t\t\tconst sortFn = raw(sort).sortFn || trackedSortFn\n\t\t\t\treturn data.current.toSorted((a, b) => sortFn.call(this, a, b))\n\t\t\t}\n\t\t\treturn data.current\n\t\t}, 50)\n\t}\n}\n\n/**\n * Returns a function for model.addEffect that implements paging\n * for the input data. It will return a slice of the data matching\n * the page and pageSize options.\n * \n * Options:\n * - page (int) default 1 - which page to show, starts at 1\n * - pageSize (int) default 20 - how many items in a single page\n * - max (int) (calculated) - how many pages in total\n */\nexport function paging(options={}) {\n\treturn function(data) {\n\t\t// initialize the paging options\n\t\tthis.state.options.paging = Object.assign({\n\t\t\tpage: 1,\n\t\t\tpageSize: 20,\n\t\t\tmax: 1\n\t\t}, options)\n\t\treturn throttledEffect(() => {\n\t\t\treturn batch(() => {\n\t\t\t\tconst paging = this.state.options.paging\n\t\t\t\tif (!paging.pageSize) {\n\t\t\t\t\tpaging.pageSize = 20\n\t\t\t\t}\n\t\t\t\tpaging.max = Math.ceil(data.current.length / paging.pageSize)\n\t\t\t\tpaging.page = Math.max(1, Math.min(paging.max, paging.page))\n\n\t\t\t\tconst start = (paging.page-1) * paging.pageSize\n\t\t\t\tconst end = start + paging.pageSize\n\t\t\t\treturn data.current.slice(start, end)\n\t\t\t})\n\t\t}, 50)\n\t}\n}\n\n/**\n * Returns a function for model.addEffect that filters rows from the data,\n * using a custom filter function `options.matches`\n * \n * Options:\n * - name (string) (required) - the name of this filter, must be unique\n * - matches (function) (required) - the filter function to apply to the data\n * - enabled (bool) (required) - filter is applied only when enabled is set to true\n */\nexport function filter(options) {\n\tif (!options?.name || typeof options.name!=='string') {\n\t\tthrow new Error('filter requires options.name to be a string')\n\t}\n\tif (!options.matches || typeof options.matches!=='function') {\n\t\tthrow new Error('filter requires options.matches to be a function')\n\t}\n\treturn function(data) {\n\t\tif (this.state.options[options.name]) {\n\t\t\tthrow new Error('a filter with this name already exists on this model')\n\t\t}\n\t\tthis.state.options[options.name] = options\n\t\treturn throttledEffect(() => {\n\t\t\tconst filterOptions = this.state.options[options.name]\n\t\t\tif (filterOptions.enabled) {\n\t\t\t\t// Read through the signal proxy so replacing `.matches` is tracked\n\t\t\t\t// as a dependency of this effect. The proxied function may already\n\t\t\t\t// be bound to the options object, so call the raw function explicitly\n\t\t\t\t// with the model as `this`.\n\t\t\t\tconst trackedMatches = filterOptions.matches\n\t\t\t\tconst matches = raw(filterOptions).matches || trackedMatches\n\t\t\t\treturn data.current.filter(row => matches.call(this, row))\n\t\t\t}\n\t\t\treturn data.current\n\t\t}, 50)\n\t}\n}\n\n/**\n * Returns a function for model.addEffect that filters the data to only contain\n * visible columns (properties). Automatically runs again if any column\n * visible property changes.\n * \n * Options:\n * - columns (object) (required) - an object with properties describing each column. Each \n * property must be an object with an optional `visible` property. Columns are visible by\n * default; set `visible` to false to filter the property out.\n */\nexport function columns(options={}) {\n\tconst columnOptions = options?.columns && typeof options.columns === 'object'\n\t\t? options.columns\n\t\t: options\n\tif (!columnOptions\n\t\t|| typeof columnOptions!=='object'\n\t\t|| Object.keys(columnOptions).length===0) {\n\t\tthrow new Error('columns requires options to be an object with at least one property')\n\t}\n\treturn function(data) {\n\t\tthis.state.options.columns = columnOptions\n\t\tconst projections = new WeakMap()\n\t\treturn throttledEffect(() => {\n\t\t\tconst visibleKeys = []\n\t\t\tconst visible = new Set()\n\t\t\tconst columns = this.state.options.columns\n\n\t\t\tfor (let key of Object.keys(columns)) {\n\t\t\t\tif (columns[key]?.visible !== false) {\n\t\t\t\t\tvisibleKeys.push(key)\n\t\t\t\t\tvisible.add(key)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data.current.map(input => {\n\t\t\t\tconst source = raw(input)\n\t\t\t\tlet result = source && typeof source === 'object'\n\t\t\t\t\t? projections.get(source)\n\t\t\t\t\t: null\n\t\t\t\tif (!result) {\n\t\t\t\t\tresult = {}\n\t\t\t\t\tif (source && typeof source === 'object') {\n\t\t\t\t\t\tprojections.set(source, result)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (let key of visibleKeys) {\n\t\t\t\t\tconst value = input?.[key] ?? null\n\t\t\t\t\tif (result[key] !== value) {\n\t\t\t\t\t\tresult[key] = value\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (let key of Object.keys(result)) {\n\t\t\t\t\tif (!visible.has(key)) {\n\t\t\t\t\t\tdelete result[key]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result\n\t\t\t})\n\t\t}, 50)\n\t}\n}\n\n/**\n * Returns a function for use with model.addEffect, with the given options set\n * as model.options.scroll. The effect will return a slice of the input data, which\n * makes it easy to render just a part (slice) of the whole data.\n * \n * Options are:\n * - offset (int) default 0 (optional) - the offset in the data to start the slice\n * - rowCount (int) default 20 (optional / calculated) - the number of rows in the slice\n * - rowHeight (int) default 26 (optional) - the height of a single row in pixels\n * - itemsPerRow (int) default 1 (optional) - the number of items on a single row\n * - size (int) default data.current.length (calculated) - how many rows inside data.current before slicing\n * - scrollbar (HTMLElement) defualt null (optional) - if set, an effect is added to update this elements \n * \t height if data.current.length changes\n * - container (HTMLElement) default null (optional) - if set, a scroll listener is added to this element, \n * which will update the options.offset signal and trigger the slice effect. It will also set the rowCount.\n */\nexport function scroll(options) {\n\n\treturn function(data) {\n\t\tthis.state.options.scroll = Object.assign({\n\t\t\toffset: 0,\n\t\t\trowHeight: 26,\n\t\t\trowCount: 20,\n\t\t\titemsPerRow: 1,\n\t\t\tsize: data.current.length\n\t\t}, options)\n\t\tconst scrollOptions = this.state.options.scroll\n\n\t\tconst scrollbar = scrollOptions.scrollbar \n\t\t\t|| scrollOptions.container?.querySelector('[data-flow-scrollbar]')\n\t\tif (scrollbar) {\n\t\t\tif (scrollOptions.container) {\n\t\t\t\tscrollOptions.container.addEventListener('scroll', (evt) => {\n\t\t\t\t\tscrollOptions.offset = Math.floor(scrollOptions.container.scrollTop\n\t\t\t\t\t\t/ (scrollOptions.rowHeight*scrollOptions.itemsPerRow)\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthrottledEffect(() => {\n\t\t\t\tscrollOptions.size = data.current.length * scrollOptions.rowHeight\n\t\t\t\tscrollbar.style.height = scrollOptions.size + 'px'\n\t\t\t}, 50)\n\t\t}\n\n\t\treturn throttledEffect(() => {\n\t\t\tif (scrollOptions.container) {\n\t\t\t\t//TODO: add a resize listener so that if the size of the container\n\t\t\t\t// changes, the rowCount is calculated again\n\t\t\t\tscrollOptions.rowCount = Math.ceil(\n\t\t\t\t\tscrollOptions.container.getBoundingClientRect().height \n\t\t\t\t\t/ scrollOptions.rowHeight\n\t\t\t\t)\n\t\t\t}\n\t\t\tscrollOptions.data = data.current\n\t\t\tlet start = Math.min(scrollOptions.offset, data.current.length-1)\n\t\t\tlet end = start + scrollOptions.rowCount\n\t\t\tif (end > data.current.length) {\n\t\t\t\tend = data.current.length\n\t\t\t\tstart = end - scrollOptions.rowCount\n\t\t\t}\n\t\t\treturn data.current.slice(start, end)\n\t\t}, 50)\n\t}\n}", "export class SimplyRender extends HTMLElement \n{\n constructor()\n {\n super()\n }\n\n connectedCallback()\n {\n let templateId = this.getAttribute(\"rel\")\n let template = document.getElementById(templateId)\n\n if (template) {\n let content = template.content.cloneNode(true)\n for (const node of content.childNodes) {\n const clone = node.cloneNode(true)\n if (clone.nodeType == document.ELEMENT_NODE) {\n clone.querySelectorAll(\"template\").forEach(function(t) {\n t.setAttribute(\"simply-render\", \"\") //FIXME: whats this?\n })\n if (this.attributes) {\n for (const attr of this.attributes) {\n if (attr.name!='rel') {\n clone.setAttribute(attr.name, attr.value)\n }\n }\n }\n }\n this.parentNode.insertBefore(clone, this)\n }\n this.parentNode.removeChild(this)\n } else {\n const observe = () => {\n const observer = new MutationObserver(() => {\n template = document.getElementById(templateId)\n if (template) {\n observer.disconnect()\n this.replaceWith(this) // trigger connectedCallback?\n }\n })\n observer.observe(globalThis.document, {\n subtree: true,\n childList: true,\n })\n }\n\n observe()\n }\n }\n}\n\nif (!customElements.get('simply-render')) {\n customElements.define('simply-render', SimplyRender);\n}", "/**\n * Return the closest valid option name to a possibly misspelled name.\n *\n * Used for developer-friendly typo suggestions. Short unknown names such as\n * `api` or `db` are ignored by default because they are common app extension\n * properties and edit-distance suggestions are noisy for short strings.\n *\n * @param {string} name The unknown name to compare.\n * @param {Iterable<string>} options Valid option names to compare against.\n * @param {object} [settings] Optional matching settings.\n * @param {number} [settings.maxDistance=2] Maximum edit distance to accept.\n * @param {number} [settings.minLength=4] Minimum unknown-name length to check.\n * @returns {string|undefined} The closest option, or undefined when no useful suggestion exists.\n */\nexport function closest(name, options, { maxDistance = 2, minLength = 4 } = {})\n{\n if (name.length < minLength) {\n return\n }\n\n let result\n let resultDistance = Infinity\n for (const option of options) {\n const distance = editDistance(name, option, maxDistance)\n if (distance < resultDistance) {\n result = option\n resultDistance = distance\n }\n }\n return resultDistance <= maxDistance ? result : undefined\n}\n\n/**\n * Return the edit distance between two short strings.\n *\n * This is used only for friendly typo suggestions in developer warnings, so it\n * intentionally caps large length differences early instead of doing extra work.\n *\n * @param {string} a First string to compare.\n * @param {string} b Second string to compare.\n * @param {number} [maxDistance=2] Maximum useful distance for the caller.\n * @returns {number} The Levenshtein edit distance, or maxDistance + 1 when the strings are too far apart.\n */\nexport function editDistance(a, b, maxDistance = 2)\n{\n const tooFar = maxDistance + 1\n if (Math.abs(a.length - b.length) > maxDistance) {\n return tooFar\n }\n\n const previous = Array.from({ length: b.length + 1 }, (_, index) => index)\n const current = new Array(b.length + 1)\n\n for (let ai = 1; ai <= a.length; ai++) {\n current[0] = ai\n for (let bi = 1; bi <= b.length; bi++) {\n const cost = a[ai - 1] === b[bi - 1] ? 0 : 1\n current[bi] = Math.min(\n previous[bi] + 1,\n current[bi - 1] + 1,\n previous[bi - 1] + cost\n )\n }\n previous.splice(0, previous.length, ...current)\n }\n\n return previous[b.length]\n}\n", "import { closest } from './suggest.mjs'\nexport function routes(options)\n{\n return new SimplyRoute(options)\n}\n\nexport class SimplyRoute\n{\n constructor(options={})\n {\n this.options = options\n this.baseURL = options.baseURL || '/'\n this.app = options.app || {}\n this.addMissingSlash = !!options.addMissingSlash\n this.matchExact = !!options.matchExact\n this.hijackLinks = !!options.hijackLinks\n this.clear()\n if (options.routes) {\n this.load(options.routes)\n }\n }\n\n load(routes)\n {\n parseRoutes(routes, this.routeInfo, this.matchExact)\n }\n\n clear()\n {\n this.routeInfo = []\n this.listeners = {\n match: {},\n call: {},\n goto: {},\n finish: {}\n }\n }\n\n match(path, options)\n {\n let args = {\n path,\n options\n }\n args = this.runListeners('match',args)\n path = args.path ? args.path : path;\n\n let searchParams;\n if (!path) {\n const currentPath = document.location.pathname + document.location.hash\n if (this.has(currentPath)) {\n path = currentPath\n } else {\n path = document.location.pathname\n }\n searchParams = new URLSearchParams(document.location.search)\n } else {\n searchParams = searchParamsForPath(path)\n }\n path = getPath(routePath(path), this.baseURL);\n for ( let route of this.routeInfo) {\n let params = route.pattern.match(path)\n if (this.addMissingSlash && !params) {\n if (path && path[path.length-1]!='/') {\n const pathWithSlash = path + '/'\n params = route.pattern.match(pathWithSlash)\n if (params) {\n path = pathWithSlash\n history.replaceState({}, '', getURL(path, this.baseURL))\n }\n }\n }\n if (params) {\n Object.assign(params, options)\n args.route = route\n args.params = params\n args = this.runListeners('call', args)\n params = args.params ? args.params : params\n args.searchParams = searchParams\n args.result = callRouteAction(this.app, route, params, searchParams)\n this.runListeners('finish', args)\n return args.result\n }\n }\n return false\n }\n\n runListeners(action, params)\n {\n if (!this.listeners[action] || !Object.keys(this.listeners[action])) {\n return\n }\n Object.keys(this.listeners[action]).forEach((route) => {\n const pattern = compileRoutePattern(route)\n if (pattern.match(routePath(params.path))) {\n var result;\n for (let callback of this.listeners[action][route]) {\n result = callback.call(this.app, params)\n if (result) {\n params = result\n }\n }\n }\n })\n return params\n }\n\n handleEvents()\n {\n this.removeEvents()\n const popstateHandler = () => {\n this.match()\n }\n const clickHandler = (evt) => {\n if (evt.ctrlKey) {\n return;\n }\n if (evt.which != 1) {\n return; // not a 'left' mouse click\n }\n var link = evt.target;\n while (link && link.tagName!='A') {\n link = link.parentElement;\n }\n if (link \n && link.pathname \n && link.hostname==globalThis.location.hostname \n && !link.link\n && !link.dataset.simplyCommand\n ) {\n let check = [\n { match: link.hash, goto: link.hash },\n { match: link.pathname + link.hash, goto: link.pathname + link.search + link.hash },\n { match: link.pathname, goto: link.pathname + link.search }\n ]\n let target\n do {\n target = check.shift()\n target.match = getPath(target.match, this.baseURL);\n } while(check.length && !this.has(target.match))\n if ( this.has(target.match) ) {\n let params = this.runListeners('goto', { path: target.goto});\n if (params.path) {\n const followLink = this.goto(params.path)\n if (!followLink || (this.options.hijackLinks && followLink!==false)) {\n // now cancel the browser navigation, since a route handler was found\n evt.preventDefault();\n return false;\n }\n }\n }\n }\n }\n globalThis.addEventListener('popstate', popstateHandler)\n this.app.container.addEventListener('click', clickHandler)\n this.eventHandlers = {\n container: this.app.container,\n popstateHandler,\n clickHandler\n }\n }\n\n removeEvents()\n {\n if (!this.eventHandlers) {\n return\n }\n globalThis.removeEventListener('popstate', this.eventHandlers.popstateHandler)\n this.eventHandlers.container.removeEventListener('click', this.eventHandlers.clickHandler)\n this.eventHandlers = undefined\n }\n\n destroy()\n {\n this.removeEvents()\n }\n\n goto(path)\n {\n history.pushState({},'',getURL(path, this.baseURL))\n return this.match(path)\n }\n\n has(path)\n {\n path = getPath(routePath(path), this.baseURL)\n for (let route of this.routeInfo) {\n if (route.pattern.match(path)) {\n return true\n }\n }\n return false\n }\n\n addListener(action, route, callback)\n {\n if (['goto','match','call','finish'].indexOf(action)==-1) {\n throw new TypeError(`simplyflow/route: unknown listener type \"${action}\"`)\n }\n if (!this.listeners[action][route]) {\n this.listeners[action][route] = []\n }\n this.listeners[action][route].push(callback)\n }\n\n removeListener(action, route, callback)\n {\n if (['goto','match','call','finish'].indexOf(action)==-1) {\n throw new TypeError(`simplyflow/route: unknown listener type \"${action}\"`)\n }\n if (!this.listeners[action][route]) {\n return\n }\n this.listeners[action][route] = this.listeners[action][route].filter((listener) => {\n return listener != callback\n })\n }\n\n init(options)\n {\n if (options.baseURL) {\n this.baseURL = options.baseURL\n }\n }\n}\n\nfunction callRouteAction(app, route, params, searchParams)\n{\n if (typeof route.action === 'function') {\n return route.action.call(app, params, searchParams)\n }\n\n if (typeof route.action === 'string') {\n const action = app.actions?.[route.action]\n if (typeof action === 'function') {\n return action.call(app, routeActionParams(route, params, searchParams))\n }\n throw unknownRouteActionError(route, app.actions)\n }\n\n throw new TypeError(`simplyflow/route: route \"${route.path}\" must use a function or action name`)\n}\n\nconst warnedRouteQueryConflicts = new Set()\n\nfunction routeActionParams(route, params, searchParams)\n{\n const query = queryParams(searchParams)\n for (const key of Object.keys(query)) {\n if (Object.hasOwn(params, key)) {\n warnRouteQueryConflict(route, key)\n }\n }\n // Query parameters are user-editable, while route params come from the\n // developer-defined route pattern. Route params therefore win on conflicts.\n return Object.assign(query, params)\n}\n\nfunction queryParams(searchParams)\n{\n const params = {}\n for (const [key, value] of searchParams.entries()) {\n if (!Object.hasOwn(params, key)) {\n params[key] = value\n } else if (Array.isArray(params[key])) {\n params[key].push(value)\n } else {\n params[key] = [params[key], value]\n }\n }\n return params\n}\n\nfunction warnRouteQueryConflict(route, key)\n{\n const warningKey = `${route.path}\\0${key}`\n if (warnedRouteQueryConflicts.has(warningKey)) {\n return\n }\n warnedRouteQueryConflicts.add(warningKey)\n console.warn(`simplyflow/route: query parameter \"${key}\" was ignored because route \"${route.path}\" already provides a route parameter with that name.`)\n}\n\nfunction unknownRouteActionError(route, actions)\n{\n const suggestion = closest(route.action, Object.keys(actions || {}))\n const hint = suggestion ? ` Did you mean \"${suggestion}\"?` : ''\n return new TypeError(`simplyflow/route: route \"${route.path}\" uses unknown action \"${route.action}\".${hint}`)\n}\n\nfunction searchParamsForPath(path)\n{\n const index = typeof path === 'string' ? path.indexOf('?') : -1\n if (index === -1) {\n return new URLSearchParams()\n }\n const hashIndex = path.indexOf('#', index)\n const search = hashIndex === -1 ? path.substring(index) : path.substring(index, hashIndex)\n return new URLSearchParams(search)\n}\n\nfunction routePath(path)\n{\n const index = typeof path === 'string' ? path.indexOf('?') : -1\n if (index === -1) {\n return path\n }\n const hashIndex = path.indexOf('#', index)\n if (hashIndex === -1) {\n return path.substring(0, index)\n }\n return path.substring(0, index) + path.substring(hashIndex)\n}\n\nfunction getPath(path, baseURL='/')\n{\n if (path.substring(0,baseURL.length)==baseURL\n ||\n ( baseURL[baseURL.length-1]=='/' \n && path.length==(baseURL.length-1)\n && path == baseURL.substring(0,path.length)\n )\n ) {\n path = path.substring(baseURL.length)\n }\n if (path[0]!='/') {\n path = '/'+path\n }\n return path\n}\n\nfunction getURL(path, baseURL)\n{\n path = getPath(path, baseURL)\n if (baseURL[baseURL.length-1]==='/' && path[0]==='/') {\n path = path.substring(1)\n }\n if (path[0]=='#') {\n return path\n }\n return baseURL + path\n}\n\nfunction compileRoutePattern(path, exact=false)\n{\n const params = []\n const regexp = routeRegexp(path, exact, params)\n return {\n path,\n params,\n regexp,\n match(value) {\n const matches = regexp.exec(value)\n if (!matches) {\n return null\n }\n const result = {}\n params.forEach((name, i) => {\n result[name] = matches[i + 1]\n })\n return result\n }\n }\n}\n\nfunction routeRegexp(route, exact=false, params=[])\n{\n if (route.includes(':*')) {\n throw new TypeError(`simplyflow/route: route \"${route}\" uses the old wildcard syntax \":*\". Use a named wildcard like \":path*\" instead.`)\n }\n const prefix = route[0] === '#' ? '' : '^'\n const suffix = exact ? '$' : ''\n return new RegExp(prefix + routeRegexpSource(route, params) + suffix)\n}\n\nfunction routeRegexpSource(route, params)\n{\n let source = ''\n let index = 0\n while (index < route.length) {\n if (route[index] === ':') {\n const match = /^:([A-Za-z_][A-Za-z0-9_]*)(\\*)?/.exec(route.substring(index))\n if (!match) {\n throw new TypeError(`simplyflow/route: invalid route parameter in \"${route}\"`)\n }\n params.push(match[1])\n source += match[2] ? '(.*)' : '([^/]+)'\n index += match[0].length\n continue\n }\n if (route[index] === '*') {\n source += '.*'\n index++\n continue\n }\n source += escapeRegexp(route[index])\n index++\n }\n return source\n}\n\nfunction escapeRegexp(value)\n{\n return value.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n}\n\nfunction parseRoutes(routes, routeInfo, exact=false)\n{\n const paths = Object.keys(routes)\n for (let path of paths) {\n routeInfo.push({\n path,\n pattern: compileRoutePattern(path, exact),\n action: routes[path]\n })\n }\n return routeInfo\n}\n", "const path = {\n\tget(dataset, pointer) {\n\t\tif (typeof pointer !== 'string') {\n\t\t\treturn pointer\n\t\t}\n\t\tif (!pointer) {\n\t\t\treturn dataset\n\t\t}\n\t\treturn pointer.split('.').reduce(function(acc, name) {\n\t if (acc == null) {\n\t return null\n\t }\n\t if (!Reflect.has(Object(acc), name)) {\n\t return null\n\t }\n\t return acc[name]\n\t }, dataset)\n\t},\n\tset: function(dataset, pointer, value) {\n\t\tconst parent = path.get(dataset, path.parent(pointer))\n\t\tif (parent == null) {\n\t\t\tthrow new TypeError(`simplyflow/path: cannot set \"${pointer}\" because its parent path does not exist`)\n\t\t}\n\t\tparent[path.pop(pointer)] = value\n\t},\n\tpop: function(pointer) {\n\t\treturn pointer.split('.').pop()\n\t},\n\tpush: function(pointer, name) {\n\t\treturn (pointer ? pointer + '.' : '') + name\n\t},\n\tparent: function(pointer) {\n\t\tconst names = pointer.split('.')\n\t\tnames.pop()\n\t\treturn names.join('.')\n\t},\n\tparents: function(dataset, pointer) {\n\t\tlet result = []\n\t\twhile (pointer) {\n\t\t\tpointer = path.parent(pointer)\n\t\t\tresult.unshift(pointer)\n\t\t}\n\t\treturn result\n\t}\n}\n\nexport default path\n", "import { closest } from './suggest.mjs'\nimport path from './path.mjs'\n\nconst commandState = new WeakMap()\nconst COMMAND_OPTIONS = [\n 'commands',\n 'handlers',\n 'app',\n 'container'\n]\n\nclass SimplyCommands {\n\tconstructor(options={}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n this.app = options.app\n\t\tthis.$handlers = options.handlers || defaultHandlers\n if (options.commands) {\n \t\tObject.assign(this, options.commands)\n }\n\n\t\tconst commandHandler = (evt) => {\n\t\t\tconst command = getCommand(evt, this.$handlers, this.app)\n\t\t\tif (!command) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this[command.name]) {\n warnUnknownCommand(this, command.name, command.source)\n return\n\t\t\t}\n const shouldContinue = this[command.name].call(options.app, command.source, command.value, evt)\n if (shouldContinue!==true) {\n evt.preventDefault()\n evt.stopPropagation()\n return false\n }\n\t\t}\n\n const container = options.app.container\n container.addEventListener('click', commandHandler)\n container.addEventListener('submit', commandHandler)\n container.addEventListener('change', commandHandler)\n container.addEventListener('input', commandHandler)\n commandState.set(this, { container, commandHandler })\n\t}\n\n call(command, el, value, event) {\n if (!this[command]) {\n warnUnknownCommand(this, command, el)\n return\n }\n return this[command].call(this.app, el, value, event)\n }\n\n appendHandler(handler) {\n this.$handlers.push(handler)\n }\n\n prependHandler(handler) {\n this.$handlers.unshift(handler)\n }\n}\n\nexport function commands(options={}) {\n\treturn new SimplyCommands(options)\n}\n\nexport function destroyCommands(commandApi)\n{\n const state = commandState.get(commandApi)\n if (!state) {\n return\n }\n state.container.removeEventListener('click', state.commandHandler)\n state.container.removeEventListener('submit', state.commandHandler)\n state.container.removeEventListener('change', state.commandHandler)\n state.container.removeEventListener('input', state.commandHandler)\n commandState.delete(commandApi)\n}\n\nfunction getCommand(evt, handlers, app) {\n var el = evt.target.closest('[data-simply-command]')\n if (el) {\n for (let handler of handlers) {\n if (el.matches(handler.match)) {\n if (handler.check(el, evt)) {\n return {\n name: el.dataset.simplyCommand,\n source: el,\n value: handler.get(el, app)\n }\n }\n return null\n }\n }\n }\n return null\n}\n\n\nfunction getConfiguredCommandValue(el, app)\n{\n const pathAttribute = 'simplyValuePath'\n if (Object.hasOwn(el.dataset, pathAttribute)) {\n return {\n found: true,\n value: path.get(app?.data, el.dataset[pathAttribute])\n }\n }\n if (Object.hasOwn(el.dataset, 'simplyValue')) {\n return { found: true, value: el.dataset.simplyValue }\n }\n return { found: false, value: undefined }\n}\n\nconst defaultHandlers = [\n {\n match: 'input,select,textarea',\n get: function(el, app) {\n const configuredValue = getConfiguredCommandValue(el, app)\n if (configuredValue.found) {\n return configuredValue.value\n }\n if (el.tagName==='SELECT' && el.multiple) {\n let values = []\n for (let option of el.options) {\n if (option.selected) {\n values.push(option.value)\n }\n }\n return values\n }\n return el.value\n },\n check: function(el, evt) {\n return evt.type=='change' || (el.dataset.simplyImmediate && evt.type=='input')\n }\n },\n {\n match: 'a,button',\n get: function(el, app) {\n const configuredValue = getConfiguredCommandValue(el, app)\n if (configuredValue.found) {\n return configuredValue.value\n }\n return el.href || el.value\n },\n check: function(el,evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n },\n {\n match: 'form',\n get: function(el) {\n let data = {}\n for (let input of Array.from(el.elements)) {\n if (input.tagName=='INPUT' \n && (input.type=='checkbox' || input.type=='radio')\n ) {\n if (!input.checked) {\n return;\n }\n }\n if (data[input.name] && !Array.isArray(data[input.name])) {\n data[input.name] = [data[input.name]]\n }\n if (Array.isArray(data[input.name])) {\n data[input.name].push(input.value)\n } else {\n data[input.name] = input.value\n }\n }\n return data\n },\n check: function(el,evt) {\n return evt.type=='submit'\n }\n },\n {\n \tmatch: '*',\n get: function(el, app) {\n return getConfiguredCommandValue(el, app).value\n },\n check: function(el, evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n }\n]\n\nconst unknownCommandWarnings = new WeakMap()\n\nfunction warnUnknownCommand(commands, command, source)\n{\n let warned = unknownCommandWarnings.get(commands)\n if (!warned) {\n warned = new Set()\n unknownCommandWarnings.set(commands, warned)\n }\n if (warned.has(command)) {\n return\n }\n warned.add(command)\n\n const suggestion = closest(command, commandNames(commands))\n const suffix = suggestion ? `. Did you mean \"${suggestion}\"?` : ''\n if (source) {\n console.warn(`simplyflow/command: unknown command \"${command}\"${suffix}`, { cause: source })\n } else {\n console.warn(`simplyflow/command: unknown command \"${command}\"${suffix}`)\n }\n}\n\nfunction commandNames(commands)\n{\n return Object.keys(commands).filter(command => {\n return !command.startsWith('$') &&\n !COMMAND_OPTIONS.includes(command) &&\n typeof commands[command] === 'function'\n })\n}\n\n", "import { closest } from './suggest.mjs'\n\nconst warnedUnknownActions = new WeakMap()\n\nexport function actions(options) \n{\n\tif (options.app) {\n\t\tconst functionHandler = {\n\t\t\tapply(target, thisArg, argumentsList)\n\t\t\t{\n\t\t\t\ttry {\n\t\t\t\t\tconst result = target(...argumentsList)\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\treturn result.catch(err => {\n\t\t\t\t\t\t\treturn options.app.onError.call(this, err, target)\n\t\t\t\t\t\t})\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t} catch(err) {\n\t\t\t\t\treturn options.app.onError.call(this, err, target)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst actionHandler = {\n\t\t\tget(target, property)\n\t\t\t{\n\t\t\t\tif (!Object.hasOwn(target, property)) {\n\t\t\t\t\twarnUnknownAction(target, property)\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\tif (options.app.onError) {\n\t\t\t\t\treturn new Proxy(target[property].bind(options.app), functionHandler)\n\t\t\t\t} else {\n\t\t\t\t\treturn target[property].bind(options.app)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new Proxy(options.actions, actionHandler)\n\t} else {\n\t\treturn options\n\t}\n}\n\nfunction warnUnknownAction(actions, property)\n{\n\tif (typeof property !== 'string') {\n\t\treturn\n\t}\n\n\tlet warned = warnedUnknownActions.get(actions)\n\tif (!warned) {\n\t\twarned = new Set()\n\t\twarnedUnknownActions.set(actions, warned)\n\t}\n\tif (warned.has(property)) {\n\t\treturn\n\t}\n\twarned.add(property)\n\n\tconst suggestion = closest(property, Object.keys(actions))\n\tconst suffix = suggestion ? `. Did you mean \"${suggestion}\"?` : ''\n\tconsole.warn(`simplyflow/action: unknown action \"${property}\"${suffix}`)\n}\n", "const shortcutState = new WeakMap()\nconst accesskeyState = new WeakMap()\n\nconst KEY = Object.freeze({\n\tCompose: 229,\n\tControl: 17,\n\tMeta: 224,\n\tAlt: 18,\n\tShift: 16\n})\n\nclass SimplyShortcuts\n{\n\tconstructor(options = {})\n\t{\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n\t\tObject.assign(this, options.shortcuts)\n\n\t\tconst keyHandler = (e) => {\n\t\t\tlet shortcutScopes = []\n\t\t\tlet shortcutElement = e.target.closest('[data-simply-shortcuts]')\n\t\t\twhile (shortcutElement) {\n\t\t\t\tshortcutScopes.push(shortcutElement.dataset.simplyShortcuts)\n\t\t\t\tshortcutElement = shortcutElement.parentNode.closest('[data-simply-shortcuts]')\n\t\t\t}\n\t\t\tif (shortcutScopes[shortcutScopes.length-1]!='default') {\n\t\t\t\tshortcutScopes.push('default')\n\t\t\t}\n\n\t\t\tlet shortcutScope\n\t\t\tlet separators = ['+','-']\n\n\t\t\tfor (let separator of separators) {\n\t\t\t\tconst keyString = getKeyString(e, separator)\n\t\t\t\tfor (let i in shortcutScopes) {\n\t\t\t\t\tshortcutScope = shortcutScopes[i]\n\t\t\t\t\tif (this[shortcutScope] && (typeof this[shortcutScope][keyString]=='function')) {\n\t\t\t\t\t\tlet _continue = this[shortcutScope][keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof this[shortcutScope + '.' + keyString] == 'function') {\n\t\t\t\t\t\tlet _continue = this[shortcutScope + '.' + keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof this[keyString] == 'function') {\n\t\t\t\t\t\tlet _continue = this[keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst container = options.app.container\n\t\tcontainer.addEventListener('keydown', keyHandler)\n\t\tshortcutState.set(this, { container, keyHandler })\n\t}\n}\n\nfunction getKeyString(e, separator='+')\n{\n\tif (e.isComposing || e.keyCode === KEY.Compose) {\n\t return\n\t}\n\tif (e.defaultPrevented) {\n\t return\n\t}\n\tif (!e.target) {\n\t return\n\t}\n\n\tlet keyCombination = []\n\tif (e.ctrlKey && e.keyCode!=KEY.Control) {\n\t keyCombination.push('Control')\n\t}\n\tif (e.metaKey && e.keyCode!=KEY.Meta) {\n\t keyCombination.push('Meta')\n\t}\n\tif (e.altKey && e.keyCode!=KEY.Alt) {\n\t keyCombination.push('Alt')\n\t}\n\tif (e.shiftKey && e.keyCode!=KEY.Shift) {\n\t keyCombination.push('Shift')\n\t}\n\tkeyCombination.push(e.key.toLowerCase())\n\treturn keyCombination.join(separator)\n}\n\nexport function shortcuts(options={})\n{\n\treturn new SimplyShortcuts(options)\n}\n\nexport function destroyShortcuts(shortcutApi)\n{\n\tconst state = shortcutState.get(shortcutApi)\n\tif (!state) {\n\t\treturn\n\t}\n\tstate.container.removeEventListener('keydown', state.keyHandler)\n\tshortcutState.delete(shortcutApi)\n}\n\nexport function accesskeys(options={}) {\n\tconst container = options.container || options.app?.container || document.body\n\tconst keyHandler = (e) => {\n\t\tconst separators = [\"+\", \"-\"]\n\t\tfor (const separator of separators) {\n\t\t\tconst keyString = getKeyString(e, separator)\n\t\t\tconst selector = \"[data-simply-accesskey='\" + keyString + \"']\"\n\t\t\tconst targets = container.querySelectorAll(selector)\n\t\t\tif (targets.length) {\n\t\t\t\ttargets.forEach(function(target) {\n\t\t\t\t\ttarget.click()\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\tcontainer.addEventListener('keydown', keyHandler)\n\tconst controller = {}\n\taccesskeyState.set(controller, { container, keyHandler })\n\treturn controller\n}\n\nexport function destroyAccesskeys(accesskeyApi)\n{\n\tconst state = accesskeyState.get(accesskeyApi)\n\tif (!state) {\n\t\treturn\n\t}\n\tstate.container.removeEventListener('keydown', state.keyHandler)\n\taccesskeyState.delete(accesskeyApi)\n}\n", "import { closest } from './suggest.mjs'\n\nconst BEHAVIOR_SELECTOR = '[data-simply-behavior]'\n\nclass SimplyBehaviors\n{\n constructor(options = {})\n {\n this.app = options.app\n this.container = options.container || document.body\n this.behaviors = options.behaviors || {}\n this.active = new Set()\n this.cleanups = new WeakMap()\n this.unknown = new Set()\n\n this.observer = new MutationObserver((changes) => this.handleChanges(changes))\n this.observer.observe(this.container, {\n subtree: true,\n childList: true\n })\n\n for (const node of behaviorNodes(this.container)) {\n this.start(node)\n }\n }\n\n start(node)\n {\n if (this.active.has(node)) {\n return\n }\n\n const name = node?.dataset?.simplyBehavior\n const behavior = this.behaviors[name]\n if (!name || typeof behavior !== 'function') {\n this.warnUnknown(name, node)\n return\n }\n\n this.active.add(node)\n const cleanup = behavior.call(this.app || node, node)\n if (typeof cleanup === 'function') {\n this.cleanups.set(node, cleanup)\n } else if (typeof cleanup !== 'undefined') {\n console.warn('simplyflow/behavior: behavior may only return a cleanup function', { cause: cleanup })\n }\n }\n\n stop(node)\n {\n if (!this.active.has(node)) {\n return\n }\n this.active.delete(node)\n\n const cleanup = this.cleanups.get(node)\n this.cleanups.delete(node)\n if (cleanup) {\n cleanup.call(this.app || node, node)\n }\n }\n\n handleChanges(changes)\n {\n const added = []\n for (const change of changes) {\n if (change.type !== 'childList') {\n continue\n }\n for (const node of change.removedNodes) {\n for (const behaviorNode of behaviorNodes(node)) {\n this.stop(behaviorNode)\n }\n }\n for (const node of change.addedNodes) {\n added.push(...behaviorNodes(node))\n }\n }\n for (const node of added) {\n this.start(node)\n }\n }\n\n warnUnknown(name, node)\n {\n if (!name || this.unknown.has(name)) {\n return\n }\n this.unknown.add(name)\n\n const suggestion = closest(name, Object.keys(this.behaviors))\n const suffix = suggestion ? `. Did you mean \"${suggestion}\"?` : ''\n console.warn(`simplyflow/behavior: unknown behavior \"${name}\"${suffix}`, { cause: node })\n }\n\n destroy()\n {\n this.observer.disconnect()\n for (const node of Array.from(this.active)) {\n this.stop(node)\n }\n }\n}\n\nexport function behaviors(options = {})\n{\n return new SimplyBehaviors(options)\n}\n\nfunction behaviorNodes(root)\n{\n if (!root?.querySelectorAll) {\n return []\n }\n\n const nodes = Array.from(root.querySelectorAll(BEHAVIOR_SELECTOR))\n if (root.matches?.(BEHAVIOR_SELECTOR)) {\n nodes.unshift(root)\n }\n return nodes\n}\n", "function throttle(callbackFunction, intervalTime)\n{\n let eventId = 0\n return function throttledCallback(...params) {\n if (eventId) {\n return\n }\n eventId = globalThis.setTimeout(() => {\n eventId = 0\n callbackFunction.apply(this, params)\n }, intervalTime)\n }\n}\n\nconst runWhenIdle = (() => {\n if (globalThis.requestIdleCallback) {\n return (callback) => {\n globalThis.requestIdleCallback(callback, {timeout: 500})\n }\n }\n return globalThis.requestAnimationFrame || ((callback) => globalThis.setTimeout(callback, 0))\n})()\n\nfunction rebaseHref(relative, base, cacheBuster)\n{\n const url = new URL(relative, base)\n if (cacheBuster) {\n url.searchParams.set('cb', cacheBuster)\n }\n return url.href\n}\n\nfunction cloneScript(script, base, cacheBuster)\n{\n const clone = globalThis.document.createElement('script')\n for (const attr of script.attributes) {\n clone.setAttribute(attr.name, attr.value)\n }\n clone.removeAttribute('data-simply-location')\n\n if (clone.hasAttribute('src')) {\n clone.src = rebaseHref(clone.getAttribute('src'), base, cacheBuster)\n } else {\n clone.textContent = script.textContent\n }\n return clone\n}\n\nfunction insertScript(script, placeholder)\n{\n placeholder.parentNode.insertBefore(script, placeholder)\n placeholder.parentNode.removeChild(placeholder)\n}\n\nfunction shouldWaitForScript(script)\n{\n // Async scripts are explicitly independent. Every other external script from\n // an include is treated as ordered, including scripts that used `defer`;\n // dynamically inserted `defer` scripts do not reliably model parser defer.\n return script.hasAttribute('src') && !script.hasAttribute('async')\n}\n\nfunction insertAndWaitForScript(script, placeholder)\n{\n return new Promise((resolve) => {\n const done = () => {\n script.removeEventListener('load', done)\n script.removeEventListener('error', done)\n resolve()\n }\n script.addEventListener('load', done)\n script.addEventListener('error', done)\n insertScript(script, placeholder)\n })\n}\n\nfunction findIncludeLinks(container)\n{\n const selector = 'link[rel=\"simply-include\"],link[rel=\"simply-include-once\"]'\n const links = Array.from(container.querySelectorAll(selector))\n if (container.matches?.(selector)) {\n links.unshift(container)\n }\n return links\n}\n\nclass SimplyIncludes\n{\n constructor(options={})\n {\n this.container = options.container || globalThis.document\n this.cacheBuster = options.cacheBuster ?? defaultCacheBuster\n this.included = Object.create(null)\n this.scriptLocations = []\n this.destroyed = false\n this.handleChanges = throttle(() => {\n runWhenIdle(() => {\n if (!this.destroyed) {\n this.includeLinks(findIncludeLinks(this.container))\n }\n })\n }, 10)\n if (options.observe !== false) {\n this.observer = new MutationObserver(this.handleChanges)\n this.observer.observe(this.container, {\n subtree: true,\n childList: true,\n })\n this.handleChanges()\n }\n }\n\n async scripts(scripts, base)\n {\n const arr = scripts.slice()\n for (const script of arr) {\n if (this.destroyed) {\n return\n }\n const clone = cloneScript(script, base, this.cacheBuster)\n const node = this.scriptLocations[script.dataset.simplyLocation]\n if (!node?.parentNode) {\n continue\n }\n\n // Included scripts should behave like normal document-order scripts by default:\n // each blocking external script must finish loading and running before the next\n // script from the include is inserted. Dynamically inserted scripts are async by\n // default, so async=false and waiting for load are both needed here.\n const waitForLoad = shouldWaitForScript(clone)\n if (waitForLoad) {\n clone.async = false // important: set the property, not the boolean attribute\n await insertAndWaitForScript(clone, node)\n } else {\n insertScript(clone, node)\n }\n }\n }\n\n html(html, link)\n {\n const fragment = globalThis.document.createRange().createContextualFragment(html)\n const stylesheets = fragment.querySelectorAll('link[rel=\"stylesheet\"],style')\n for (const stylesheet of stylesheets) {\n const href = stylesheet.getAttribute('href')\n if (href) {\n stylesheet.href = rebaseHref(href, link.href, this.cacheBuster)\n }\n globalThis.document.head.appendChild(stylesheet)\n }\n\n // Scripts imported through a fragment do not execute reliably in document order.\n // Placeholders preserve their positions while scripts are reinserted sequentially.\n const scriptsFragment = globalThis.document.createDocumentFragment()\n const scripts = fragment.querySelectorAll('script')\n if (scripts.length) {\n for (const script of scripts) {\n const placeholder = globalThis.document.createComment(script.src || 'inline script')\n script.parentNode.insertBefore(placeholder, script)\n script.dataset.simplyLocation = this.scriptLocations.length\n this.scriptLocations.push(placeholder)\n scriptsFragment.appendChild(script)\n }\n globalThis.setTimeout(() => {\n this.scripts(Array.from(scriptsFragment.children), link ? link.href : globalThis.location.href)\n }, 10)\n }\n\n link.parentNode.insertBefore(fragment, link)\n }\n\n async includeLinks(links)\n {\n const remainingLinks = links.reduce((remainder, link) => {\n if (link.rel === 'simply-include-once' && this.included[link.href]) {\n link.parentNode.removeChild(link)\n } else {\n this.included[link.href] = true\n link.rel = 'simply-include-loading'\n remainder.push(link)\n }\n return remainder\n }, [])\n\n for (const link of remainingLinks) {\n if (this.destroyed || !link.href) {\n continue\n }\n try {\n const response = await fetch(link.href)\n if (!response.ok) {\n console.warn(`simplyflow/include: failed to load \"${link.href}\" (${response.status})`)\n link.rel = 'simply-include-error'\n continue\n }\n const html = await response.text()\n if (this.destroyed || !link.parentNode) {\n continue\n }\n this.html(html, link)\n link.parentNode?.removeChild(link)\n } catch (error) {\n console.warn(`simplyflow/include: failed to load \"${link.href}\"`, { cause: error })\n link.rel = 'simply-include-error'\n }\n }\n }\n\n destroy()\n {\n this.destroyed = true\n this.observer?.disconnect()\n this.observer = undefined\n }\n}\n\nexport function includes(options={})\n{\n return new SimplyIncludes(options)\n}\n\nlet defaultCacheBuster = null\nconst defaultInclude = () => new SimplyIncludes({\n container: globalThis.document,\n cacheBuster: defaultCacheBuster,\n observe: false\n})\n\nexport const include = {\n get cacheBuster() {\n return defaultCacheBuster\n },\n set cacheBuster(value) {\n defaultCacheBuster = value\n },\n scripts: (scripts, base) => defaultInclude().scripts(scripts, base),\n html: (html, link) => defaultInclude().html(html, link),\n links: (links) => defaultInclude().includeLinks(Array.from(links))\n}\n", "import { bind } from '@muze-labs/simplyflow-bind'\nimport { signal } from '@muze-labs/simplyflow-state'\nimport { routes } from './route.mjs'\nimport { commands, destroyCommands } from './command.mjs'\nimport { actions } from './action.mjs'\nimport { shortcuts, destroyShortcuts, accesskeys, destroyAccesskeys } from './shortcut.mjs'\nimport { behaviors } from './behavior.mjs'\nimport { includes } from './include.mjs'\nimport { closest } from './suggest.mjs'\n\nconst APP_OPTIONS = [\n 'container',\n 'data',\n 'templates',\n 'styles',\n 'start',\n 'onError',\n 'components',\n 'behaviors',\n 'baseURL',\n 'commands',\n 'shortcuts',\n 'routes',\n 'actions',\n 'transformers'\n]\n\nclass SimplyApp\n{\n constructor(options={})\n {\n if (options.components) {\n const mergedOptions = {}\n mergeComponents(mergedOptions, options.components)\n mergeOptions(mergedOptions, options) // app options override component options\n options = mergedOptions\n }\n\n\n this.container = options.container || document.body\n this.destroyed = false\n this.data = signal(options.data || {})\n this.start = options.start\n this.onError = options.onError\n this.components = options.components\n this.baseURL = options.baseURL\n this.transformers = options.transformers\n\n installTemplates(this.container, options.templates)\n installStyles(this.container, options.styles)\n\n for (const key of Object.keys(options)) {\n switch(key) {\n case 'container':\n case 'data':\n case 'templates':\n case 'styles':\n case 'start':\n case 'onError':\n case 'components':\n case 'baseURL':\n case 'transformers':\n break\n case 'commands':\n this.commands = commands({ app: this, container: this.container, commands: options.commands})\n break\n case 'shortcuts':\n this.shortcuts = shortcuts({ app: this, shortcuts: options.shortcuts })\n break\n case 'behaviors':\n this.behaviors = behaviors({ app: this, container: this.container, behaviors: options.behaviors })\n break\n case 'routes':\n this.routes = routes({ app: this, routes: options.routes})\n break\n case 'actions':\n this.actions = actions({app: this, actions: options.actions})\n break\n case 'prototype':\n case '__proto__':\n // ignore this to avoid prototype pollution\n break\n default:\n // Unknown options become app properties. Warn only when the\n // name is close to a built-in option, which usually means a typo.\n warnLikelyOptionTypo(key)\n this[key] = options[key]\n break\n }\n }\n\n this.binding = bind({\n root: this.data,\n container: this.container,\n attribute: 'data-simply',\n transformers: this.transformers\n })\n\n this.includes = includes({ container: this.container })\n\n this.accesskeys = accesskeys({ app: this, container: this.container })\n }\n\n get app()\n {\n return this\n }\n\n destroy()\n {\n this.destroyed = true\n if (this.binding) {\n this.binding.destroy()\n this.binding = undefined\n }\n if (this.commands) {\n destroyCommands(this.commands)\n }\n if (this.shortcuts) {\n destroyShortcuts(this.shortcuts)\n }\n if (this.accesskeys) {\n destroyAccesskeys(this.accesskeys)\n this.accesskeys = undefined\n }\n if (this.routes) {\n this.routes.destroy()\n this.routes = undefined\n }\n if (this.behaviors) {\n this.behaviors.destroy()\n this.behaviors = undefined\n }\n if (this.includes) {\n this.includes.destroy()\n this.includes = undefined\n }\n }\n}\n\nfunction installTemplates(container, templates)\n{\n if (!templates) {\n return\n }\n for (const name of Object.keys(templates)) {\n const element = document.createElement('div')\n element.innerHTML = templates[name]\n let template = container.querySelector('template#'+name)\n if (!template) {\n template = document.createElement('template')\n template.id = name\n template.content.append(...element.children)\n container.appendChild(template)\n } else {\n template.content.replaceChildren(...element.children)\n }\n }\n}\n\nfunction installStyles(container, styles)\n{\n if (!styles) {\n return\n }\n for (const name of Object.keys(styles)) {\n let style = container.querySelector('style#'+name+'.css')\n if (!style) {\n style = document.createElement('style')\n style.id = name+'.css'\n container.appendChild(style)\n }\n style.innerHTML = styles[name]\n }\n}\n\n\nfunction warnLikelyOptionTypo(key)\n{\n const suggestion = closest(key, APP_OPTIONS)\n if (suggestion) {\n console.warn(`simplyflow/app: unknown option \"${key}\". Did you mean \"${suggestion}\"? The option was still added to the app as \"app.${key}\".`)\n }\n}\n\nfunction initRoutes(app) {\n if (app.destroyed) {\n return\n }\n if (app.routes) {\n if (app.baseURL) {\n app.routes.init({ baseURL: app.baseURL })\n }\n app.routes.handleEvents()\n globalThis.setTimeout(() => {\n if (app.destroyed || !app.routes) {\n return\n }\n if (app.routes.has(globalThis.location?.hash)) {\n app.routes.match(globalThis.location.hash)\n } else {\n app.routes.match(globalThis.location?.pathname+globalThis.location?.hash)\n }\n })\n }\n}\n\n\nfunction handleAppError(app, error, context)\n{\n if (app.onError) {\n return app.onError.call(app, error, context)\n }\n throw error\n}\n\nexport function app(options={})\n{\n const app = new SimplyApp(options)\n if (!app.start) {\n initRoutes(app)\n return app\n }\n\n try {\n const result = app.start.call(app)\n if (result instanceof Promise) {\n result.then(() => initRoutes(app)).catch(error => handleAppError(app, error, app.start))\n } else {\n initRoutes(app)\n }\n } catch (error) {\n handleAppError(app, error, app.start)\n }\n return app\n}\n\n\nfunction mergeOptions(options, otherOptions)\n{\n for (const key of Object.keys(otherOptions)) {\n switch(typeof otherOptions[key]) {\n case 'object':\n if (!otherOptions[key]) {\n continue // null\n }\n if (!options[key]) {\n options[key] = otherOptions[key]\n } else {\n mergeOptions(options[key], otherOptions[key])\n }\n break\n default:\n options[key] = otherOptions[key]\n }\n }\n}\n\nfunction mergeComponents(options, components) {\n for (const name of Object.keys(components)) {\n const component = components[name]\n if (component.components) {\n mergeComponents(options, component.components)\n }\n if (!options.components) {\n options.components = {}\n }\n options.components[name] = component\n for (const key of Object.keys(component)) {\n switch(key) {\n case 'start':\n case 'onError':\n // App lifecycle functions are app-level behavior, not merged component state.\n case 'components':\n // already handled\n break\n default:\n if (!options[key]) {\n options[key] = Object.create(null)\n }\n mergeOptions(options[key], component[key])\n break\n }\n }\n }\n}\n", "export function html(strings, ...values) {\n const outputArray = values.map(\n (value, index) =>\n `${strings[index]}${value}`,\n );\n return outputArray.join(\"\") + strings[strings.length - 1];\n}\n\nexport function css(strings, ...values) {\n\treturn html(strings, ...values)\n}\n", "import { bind } from '@muze-labs/simplyflow-bind'\nimport * as model from '@muze-labs/simplyflow-model'\nimport * as state from '@muze-labs/simplyflow-state'\nimport './render.mjs'\nimport * as dom from '@muze-labs/simplyflow-bind/dom'\nimport { app } from '@muze-labs/simplyflow-app'\nimport { actions } from '@muze-labs/simplyflow-app/action'\nimport { behaviors } from '@muze-labs/simplyflow-app/behavior'\nimport { commands } from '@muze-labs/simplyflow-app/command'\nimport { include, includes } from '@muze-labs/simplyflow-app/include'\nimport { shortcuts } from '@muze-labs/simplyflow-app/shortcut'\nimport path from '@muze-labs/simplyflow-app/path'\nimport { routes, SimplyRoute } from '@muze-labs/simplyflow-app/route'\nimport { html, css } from '@muze-labs/simplyflow-app/highlight'\n\nif (!globalThis.simply) {\n globalThis.simply = {}\n}\n\n// These global template tags are intentional. Many editors recognize\n// html`...` and css`...` template literals and provide syntax highlighting.\n// Keeping them global gives script-tag users the same authoring experience\n// without requiring a build step or explicit imports.\nglobalThis.html = html\nglobalThis.css = css\n\nconst modelApi = Object.assign(model.model, {\n model: model.model,\n sort: model.sort,\n paging: model.paging,\n filter: model.filter,\n columns: model.columns,\n scroll: model.scroll\n})\n\nObject.assign(globalThis.simply, {\n app,\n bind,\n model: modelApi,\n state,\n signal: state.signal,\n effect: state.effect,\n batch: state.batch,\n clone: state.clone,\n destroy: state.destroy,\n untracked: state.untracked,\n throttledEffect: state.throttledEffect,\n clockEffect: state.clockEffect,\n createSignal: state.createSignal,\n isSignal: state.isSignal,\n raw: state.raw,\n dom,\n behaviors,\n actions,\n commands,\n include,\n includes,\n shortcuts,\n path,\n routes\n})\n\ndelete globalThis.simply.advanced\n\nexport {\n app,\n bind,\n model,\n state,\n dom,\n behaviors,\n actions,\n commands,\n include,\n includes,\n shortcuts,\n path,\n routes,\n SimplyRoute,\n html,\n css\n}\n\nexport default globalThis.simply\n"],
5
+ "mappings": "mGAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,eAAAE,GAAA,UAAAC,EAAA,gBAAAC,EAAA,UAAAC,GAAA,iBAAAC,EAAA,YAAAC,EAAA,WAAAC,GAAA,cAAAC,EAAA,aAAAC,EAAA,gBAAAC,EAAA,cAAAC,EAAA,cAAAC,EAAA,QAAAC,EAAA,mBAAAC,GAAA,WAAAC,EAAA,YAAAC,EAAA,oBAAAC,EAAA,UAAAC,GAAA,cAAAC,ICAO,IAAMC,EAAM,CACf,QAAS,OAAO,IAAI,gCAAgC,EACpD,KAAM,OAAO,IAAI,6BAA6B,EAC9C,OAAQ,OAAO,IAAI,+BAA+B,EAClD,SAAU,OAAO,IAAI,qCAAqC,EAC1D,MAAO,OAAO,IAAI,kCAAkC,EACpD,OAAQ,SACR,KAAM,MACV,EDNA,IAAMC,GAAgB,IAAI,IAAI,CAAC,MAAO,KAAK,CAAC,EACtCC,GAAsB,IAAI,IAAI,CAAC,OAAQ,SAAU,UAAW,UAAW,OAAO,QAAQ,CAAC,EACvFC,GAAa,IAAI,IAAI,CAAC,MAAO,SAAU,OAAO,CAAC,EAC/CC,GAAa,IAAI,IAAI,CAAC,MAAO,SAAU,OAAO,CAAC,EAC/CC,GAA2B,CAC7B,QAAS,CAAC,EACV,QAAS,CAAC,EACV,IAAK,CAAC,EACN,KAAM,CAAC,EACP,OAAQ,CAAC,EACT,CAAC,OAAO,QAAQ,EAAG,CAAC,CACxB,EAEA,SAASC,EAAaC,EAAO,CACzB,OAAOA,IAAU,OAAS,OAAOA,GAAU,UAAY,OAAOA,GAAU,WAC5E,CASO,SAASC,EAASD,EAAO,CAC5B,MAAO,GAAQD,EAAaC,CAAK,GAAKA,EAAME,EAAI,MAAM,EAC1D,CASO,SAASC,EAAIH,EAAO,CACvB,OAAOC,EAASD,CAAK,EAAIA,EAAME,EAAI,IAAI,EAAIF,CAC/C,CASO,SAASI,EAAUJ,EAAO,CAC7B,OAAOC,EAASD,CAAK,EAAIA,EAAQK,EAAQ,IAAIL,CAAK,CACtD,CAEA,SAASM,EAAaC,EAAQ,CAC1B,OAAOF,EAAQ,IAAIE,CAAM,CAC7B,CAEA,SAASC,GAAWD,EAAQE,EAAU,CAGlC,OAAOF,IAASE,CAAQ,CAC5B,CAEA,SAASC,GAAWH,EAAQI,EAAUX,EAAO,CACzC,OACIO,aAAkB,aACfA,aAAkB,QAClBA,aAAkB,QAClBA,aAAkB,QAEdP,EAAM,KAAKO,CAAM,EAKrBP,EAAM,KAAKW,CAAQ,CAC9B,CAEA,SAASC,GAA0BL,EAAQM,EAAY,CACnD,IAAMC,EAAS,IAAI,IACnB,GAAI,CAAC,MAAM,QAAQP,CAAM,GAAKM,GAAcN,EAAO,OAC/C,OAAOO,EAGX,QAASC,EAAQF,EAAYE,EAAQR,EAAO,OAAQQ,IAC5C,OAAO,OAAOR,EAAQQ,CAAK,GAC3BD,EAAO,IAAIC,EAAOR,EAAOQ,CAAK,CAAC,EAGvC,OAAOD,CACX,CAEA,SAASE,GAAsBC,EAASV,EAAQW,EAAWC,EAAgB,IAAI,IAAO,CAClF,GAAI,GAAC,MAAM,QAAQZ,CAAM,GAAKW,IAAcX,EAAO,QAInD,CAAAU,EAAQ,IAAIf,EAAI,OAAQ,CAAE,IAAKgB,EAAW,IAAKX,EAAO,MAAO,CAAC,EAC9DU,EAAQ,IAAIf,EAAI,QAAS,CAAC,CAAC,EAI3B,OAAW,CAACa,EAAOK,CAAQ,IAAKD,EAC5BF,EAAQ,IAAI,OAAOF,CAAK,EAAG,CAAE,OAAQ,GAAM,IAAKK,EAAU,IAAK,MAAU,CAAC,EAElF,CAEA,SAASC,EAAcV,EAAUM,EAAS,CAClCA,EAAQ,MACRK,EAAUX,EAAUM,CAAO,CAEnC,CAEA,SAASM,GAAgBhB,EAAQE,EAAUE,EAAUX,EAAO,CACxD,MAAO,IAAIwB,IAAS,CAChB,IAAMN,EAAYX,EAAO,OAInBkB,EAASzB,EAAM,MAAMW,EAAUa,CAAI,EAEzC,OAAIN,IAAcX,EAAO,QACrBe,EAAUX,EAAUe,EAAYxB,EAAI,OAAQ,CAAE,IAAKgB,EAAW,IAAKX,EAAO,MAAO,CAAC,CAAC,EAEhFkB,CACX,CACJ,CAEA,SAASE,GAAmBV,EAASV,EAAQE,EAAUe,EAAMI,EAAS,CAClE,GAAInB,IAAa,MAAO,CACpB,GAAM,CAACoB,EAAKC,CAAS,EAAIN,EACnBO,EAASxB,EAAO,IAAIsB,CAAG,EACvBT,EAAWb,EAAO,IAAIsB,CAAG,EAE/B,MAAO,IAAM,EACL,CAACE,GAAU,CAAC,OAAO,GAAGX,EAAUU,CAAS,KACzCb,EAAQ,IAAIY,EAAK,CAAE,IAAKT,EAAU,IAAKU,CAAU,CAAC,EAKlDb,EAAQ,IAAIf,EAAI,QAAS,CAAC,CAAC,GAE1B6B,GACDd,EAAQ,IAAIf,EAAI,KAAM,CAAE,IAAK0B,EAAS,IAAKrB,EAAO,IAAK,CAAC,CAEhE,CACJ,CAEA,GAAIE,IAAa,SAAU,CACvB,GAAM,CAACoB,CAAG,EAAIL,EACRO,EAASxB,EAAO,IAAIsB,CAAG,EACvBT,EAAWb,EAAO,IAAIsB,CAAG,EAE/B,MAAO,IAAM,CACLE,IACAd,EAAQ,IAAIY,EAAK,CAAE,OAAQ,GAAM,IAAKT,EAAU,IAAK,MAAU,CAAC,EAChEH,EAAQ,IAAIf,EAAI,KAAM,CAAE,IAAK0B,EAAS,IAAKrB,EAAO,IAAK,CAAC,EACxDU,EAAQ,IAAIf,EAAI,QAAS,CAAC,CAAC,EAEnC,CACJ,CAEA,GAAIO,IAAa,QAAS,CACtB,IAAMuB,EAAaJ,EAAU,MAAM,KAAKrB,EAAO,QAAQ,CAAC,EAAI,CAAC,EAE7D,MAAO,IAAM,CACT,GAAIyB,EAAW,OAAQ,CACnB,OAAW,CAACH,EAAKT,CAAQ,IAAKY,EAC1Bf,EAAQ,IAAIY,EAAK,CAAE,OAAQ,GAAM,IAAKT,EAAU,IAAK,MAAU,CAAC,EAEpEH,EAAQ,IAAIf,EAAI,KAAM,CAAE,IAAK0B,EAAS,IAAKrB,EAAO,IAAK,CAAC,EACxDU,EAAQ,IAAIf,EAAI,QAAS,CAAC,CAAC,CAC/B,CACJ,CACJ,CAEA,MAAO,IAAM,CAAC,CAClB,CAEA,SAAS+B,GAAc1B,EAAQE,EAAUE,EAAUX,EAAO,CACtD,MAAO,IAAIwB,IAAS,CACZ9B,GAAc,IAAIe,CAAQ,GAC1ByB,EAAUvB,EAAUa,EAAK,CAAC,CAAC,EAE3B7B,GAAoB,IAAIc,CAAQ,GAChCyB,EAAUvB,EAAUT,EAAI,OAAO,EAGnC,IAAM0B,EAAUrB,EAAO,KACjBU,EAAU,IAAI,IACdkB,EAAavC,GAAW,IAAIa,CAAQ,EACpCkB,GAAmBV,EAASV,EAAQE,EAAUe,EAAMI,CAAO,EAC3D,IAAM,CAAC,EACPH,EAASzB,EAAM,MAAMO,EAAQiB,CAAI,EAEvC,OAAAW,EAAW,EACXd,EAAcV,EAAUM,CAAO,EACxBQ,CACX,CACJ,CAEA,SAASW,GAAmBnB,EAASV,EAAQE,EAAUe,EAAMI,EAAS,CAClE,GAAM,CAAC5B,CAAK,EAAIwB,EACVa,EAAW5B,IAAa,OAASA,IAAa,SAC9CF,EAAO,IAAIP,CAAK,EAChB,GAEN,MAAO,IAAM,CAKT,GAJgBS,IAAa,QACvBmB,EAAU,EACVrB,EAAO,OAASqB,GAAYnB,IAAa,UAAY4B,EAM3D,CAAApB,EAAQ,IAAIf,EAAI,KAAM,CAAE,IAAK0B,EAAS,IAAKrB,EAAO,IAAK,CAAC,EAKxD,QAAW+B,KAAQ,QAAQ,QAAQxC,EAAwB,EACvDmB,EAAQ,IAAIqB,EAAM,CAAC,CAAC,EAE5B,CACJ,CAEA,SAASC,GAAchC,EAAQE,EAAUE,EAAUX,EAAO,CACtD,MAAO,IAAIwB,IAAS,CAChB,IAAMI,EAAUrB,EAAO,KACjBU,EAAU,IAAI,IACdkB,EAAatC,GAAW,IAAIY,CAAQ,EACpC2B,GAAmBnB,EAASV,EAAQE,EAAUe,EAAMI,CAAO,EAC3D,IAAM,CAAC,EACPH,EAASzB,EAAM,MAAMO,EAAQiB,CAAI,EAEvC,OAAAW,EAAW,EACXd,EAAcV,EAAUM,CAAO,EACxBQ,CACX,CACJ,CAEA,SAASe,GAAqBC,EAAYC,EAAetB,EAAUuB,EAAeC,EAAU,CACxF,OACK,OAAO,OAAOH,EAAY,OAAO,GAAK,CAAC,OAAO,GAAGrB,EAAUwB,CAAQ,GAChE,OAAO,OAAOH,EAAY,KAAK,GAAKC,GAAe,MAAQC,GAAe,KAC1E,OAAO,OAAOF,EAAY,KAAK,GAAKC,GAAe,MAAQC,GAAe,GAEtF,CAEA,IAAME,GAAgB,CAClB,IAAItC,EAAQE,EAAUE,EAAU,CAC5B,IAAMX,EAAQQ,GAAWD,EAAQE,CAAQ,EAGzC,OAFAyB,EAAUvB,EAAUF,CAAQ,EAExB,OAAOT,GAAU,WACb,MAAM,QAAQO,CAAM,EACbgB,GAAgBhB,EAAQE,EAAUE,EAAUX,CAAK,EAExDO,aAAkB,IACX0B,GAAc1B,EAAQE,EAAUE,EAAUX,CAAK,EAEtDO,aAAkB,IACXgC,GAAchC,EAAQE,EAAUE,EAAUX,CAAK,EAEnDU,GAAWH,EAAQI,EAAUX,CAAK,EAGtCD,EAAaC,CAAK,EAAI8C,EAAO9C,CAAK,EAAIA,CACjD,EAEA,IAAIO,EAAQE,EAAUT,EAAOW,EAAU,CACnC,IAAMoC,EAAS,OAAO,OAAOxC,EAAQE,CAAQ,EACvCS,EAAY,MAAM,QAAQX,CAAM,EAAIA,EAAO,OAAS,OACpDY,EAAgBV,IAAaP,EAAI,OACjCU,GAA0BL,EAAQ,OAAOP,CAAK,CAAC,EAC/C,IAAI,IACJoB,EAAWb,EAAOE,CAAQ,EAEhCF,EAAOE,CAAQ,EAAIT,EAEnB,IAAMgD,EAAS,OAAO,OAAOzC,EAAQE,CAAQ,EACvCmC,EAAWrC,EAAOE,CAAQ,EAC1BQ,EAAU,IAAI,IAEpB,OAAI,CAAC,OAAO,GAAGG,EAAUwB,CAAQ,GAAM,CAACG,GAAUC,IAC9C/B,EAAQ,IAAIR,EAAU,CAAE,IAAKW,EAAU,IAAKwB,CAAS,CAAC,EAEtD,CAACG,GAAUC,GACX/B,EAAQ,IAAIf,EAAI,QAAS,CAAC,CAAC,EAG/Bc,GAAsBC,EAASV,EAAQW,EAAWC,CAAa,EAC/DE,EAAcV,EAAUM,CAAO,EACxB,EACX,EAEA,IAAIV,EAAQE,EAAU,CAGlB,IAAME,EAAWL,EAAaC,CAAM,EACpC,OAAII,GACAuB,EAAUvB,EAAUF,CAAQ,EAEzB,QAAQ,IAAIF,EAAQE,CAAQ,CACvC,EAEA,eAAeF,EAAQE,EAAU,CAE7B,GAAI,CADW,OAAO,OAAOF,EAAQE,CAAQ,EAEzC,MAAO,GAGX,IAAMW,EAAWb,EAAOE,CAAQ,EAC1BS,EAAY,MAAM,QAAQX,CAAM,EAAIA,EAAO,OAAS,OACpDkB,EAAS,QAAQ,eAAelB,EAAQE,CAAQ,EACtD,GAAI,CAACgB,EACD,OAAOA,EAGX,IAAMd,EAAWL,EAAaC,CAAM,EAC9BU,EAAUS,EAAYjB,EAAU,CAAE,OAAQ,GAAM,IAAKW,EAAU,IAAK,MAAU,CAAC,EACrF,OAAAH,EAAQ,IAAIf,EAAI,QAAS,CAAE,OAAQ,GAAM,SAAAO,CAAS,CAAC,EACnDO,GAAsBC,EAASV,EAAQW,CAAS,EAChDI,EAAUX,EAAUM,CAAO,EACpBQ,CACX,EAEA,eAAelB,EAAQE,EAAUgC,EAAY,CACzC,IAAMM,EAAS,OAAO,OAAOxC,EAAQE,CAAQ,EACvCiC,EAAgB,OAAO,yBAAyBnC,EAAQE,CAAQ,EAChEW,EAAWb,EAAOE,CAAQ,EAC1BS,EAAY,MAAM,QAAQX,CAAM,EAAIA,EAAO,OAAS,OACpDY,EAAgBV,IAAaP,EAAI,QAAU,OAAO,OAAOuC,EAAY,OAAO,EAC5E7B,GAA0BL,EAAQ,OAAOkC,EAAW,KAAK,CAAC,EAC1D,IAAI,IAEJhB,EAAS,QAAQ,eAAelB,EAAQE,EAAUgC,CAAU,EAClE,GAAI,CAAChB,EACD,OAAOA,EAGX,IAAMuB,EAAS,OAAO,OAAOzC,EAAQE,CAAQ,EACvCkC,EAAgB,OAAO,yBAAyBpC,EAAQE,CAAQ,EAChEmC,EAAWrC,EAAOE,CAAQ,EAC1BQ,EAAU,IAAI,IAEpB,MAAI,CAAC8B,GAAUC,GACX/B,EAAQ,IAAIR,EAAU,CAAE,IAAKW,EAAU,IAAKwB,CAAS,CAAC,EACtD3B,EAAQ,IAAIf,EAAI,QAAS,CAAC,CAAC,GACpB6C,GAAUC,IACbR,GAAqBC,EAAYC,EAAetB,EAAUuB,EAAeC,CAAQ,GACjF3B,EAAQ,IAAIR,EAAU,CAAE,IAAKW,EAAU,IAAKwB,CAAS,CAAC,EAEtDF,GAAe,aAAeC,GAAe,YAC7C1B,EAAQ,IAAIf,EAAI,QAAS,CAAC,CAAC,GAInCc,GAAsBC,EAASV,EAAQW,EAAWC,CAAa,EAC/DE,EAAcf,EAAaC,CAAM,EAAGU,CAAO,EACpCQ,CACX,EAEA,QAAQlB,EAAQ,CACZ,IAAMI,EAAWL,EAAaC,CAAM,EACpC,OAAA2B,EAAUvB,EAAUT,EAAI,OAAO,EACxB,QAAQ,QAAQK,CAAM,CACjC,CACJ,EAUaF,EAAU,IAAI,QAE3B,SAAS4C,GAAmBjD,EAAOkD,EAAM,CACrC,GAAI,CAACnD,EAAaC,CAAK,EACnB,MAAM,IAAI,UACN,qBAAqBkD,CAAI,0FAA0F,OAAOlD,CAAK,EACnI,CAER,CAEA,SAASmD,GAAmBC,EAASF,EAAM,CACvC,GAAI,CAACE,GAAW,OAAOA,GAAY,SAC/B,MAAM,IAAI,UAAU,qBAAqBF,CAAI,mCAAmC,CAExF,CAEA,SAASG,GAAmBD,EAAS,CAIjC,MAAO,CACH,GAAGA,EACH,IAAI7C,EAAQE,EAAUE,EAAU,CAC5B,OAAIF,IAAaP,EAAI,KACVK,EAEPE,IAAaP,EAAI,OACV,GAEPkD,EAAQ,IACDA,EAAQ,IAAI7C,EAAQE,EAAUE,CAAQ,EAE1CH,GAAWD,EAAQE,CAAQ,CACtC,CACJ,CACJ,CAWO,SAAS6C,GAAe/C,EAAQgD,EAAO,CAC1C,IAAMC,EAAYrD,EAAII,CAAM,EAG5B,GAFA0C,GAAmBO,EAAW,gBAAgB,EAE1C,CAACvD,EAASsD,CAAK,EACf,MAAM,IAAI,UAAU,2DAA2D,EAGnF,IAAME,EAAWpD,EAAQ,IAAImD,CAAS,EACtC,GAAIC,GAAYA,IAAaF,EACzB,MAAM,IAAI,MAAM,0EAA0E,EAG9F,OAAAlD,EAAQ,IAAImD,EAAWD,CAAK,EACrBA,CACX,CAYO,SAASG,EAAanD,EAAQ6C,EAAU,CAAC,EAAGO,EAAM,CAGrD,GAFAV,GAAmB1C,EAAQ,cAAc,EACzC4C,GAAmBC,EAAS,cAAc,EACtCO,IAAS,QAAa,OAAOA,GAAS,WACtC,MAAM,IAAI,UAAU,gEAAgE,EAGxF,GAAI1D,EAASM,CAAM,EACf,OAAOA,EAGX,IAAMkD,EAAWrD,EAAUG,CAAM,EACjC,GAAIkD,EACA,OAAOA,EAGX,IAAMF,EAAQ,IAAI,MAAMhD,EAAQ8C,GAAmBD,CAAO,CAAC,EAC3D,OAAAE,GAAe/C,EAAQgD,CAAK,EAC5BI,IAAOpD,EAAQgD,CAAK,EACbA,CACX,CASO,SAAST,EAAO9C,EAAQ,CAAC,EAAG,CAC/B,GAAI,CAACD,EAAaC,CAAK,EACnB,MAAM,IAAI,UACN,wGAAwG,OAAOA,CAAK,EACxH,EAEJ,OAAO0D,EAAa1D,EAAO6C,EAAa,CAC5C,CAEA,IAAIe,GAAU,CAAC,EACXC,GAAU,GAWP,SAASC,GAAMvD,EAAQ+B,EAAM,CAChC,GAAI,OAAO/B,GAAW,WAAY,CAC9BsD,GAAU,GACV,GAAI,CACA,OAAOtD,EAAO,CAClB,QAAE,CACEsD,GAAU,EACd,CACJ,CAEA,GAAI,CAAC5D,EAASM,CAAM,EAChB,MAAM,IAAI,UAAU,iEAAiE,EAGzF,OAAOwD,GAAaxD,EAAQ+B,CAAI,EAAE,IAAI0B,IAAa,CAC/C,OAAQA,EAAS,WACjB,GAAIA,EAAS,eACb,OAAQ3D,EAAQ,IAAI2D,EAAS,cAAc,CAC/C,EAAE,CACN,CAUO,SAASC,GAAUC,EAAQ,CAC9B,GAAI,CAACA,GAAU,OAAOA,GAAW,SAC7B,MAAM,IAAI,UAAU,uDAAuD,EAE/E,GAAI,CAACA,EAAO,KAAO,CAACA,EAAO,IACvB,MAAM,IAAI,MAAM,wEAAwE,EAE5F,GAAIA,EAAO,KAAO,OAAOA,EAAO,KAAQ,WACpC,MAAM,IAAI,MAAM,sDAAsD,EAE1E,GAAIA,EAAO,KAAO,OAAOA,EAAO,KAAQ,WACpC,MAAM,IAAI,MAAM,sDAAsD,EAE1EN,GAAQ,KAAKM,CAAM,CACvB,CAEA,SAASC,GAAYC,KAASC,EAAQ,CAClC,QAAWH,KAAUN,GACjBM,EAAOE,CAAI,IAAI,GAAGC,CAAM,CAEhC,CAEA,IAAIC,GAAmB,IAAI,IACvBC,EAAa,EAUV,SAASjD,EAAUkD,EAAMvD,EAAU,IAAI,IAAO,CACjD,GAAI,CAAChB,EAASuE,CAAI,EACd,MAAM,IAAI,UAAU,kEAAkE,EAE1F,GAAI,EAAEvD,aAAmB,KACrB,MAAM,IAAI,UAAU,8EAA8E,EAGtG,IAAMwD,EAAY,IAAI,IAYtB,GAXAxD,EAAQ,QAAQ,CAACyD,EAAQjE,IAAa,CAClC,QAAWuD,KAAYW,GAAaH,EAAM/D,CAAQ,EAK9CmE,GAAiBZ,EAAUvD,EAAUiE,CAAM,EAC3CD,EAAU,IAAIT,CAAQ,CAE9B,CAAC,EAEG,EAACS,EAAU,KAIf,IAAIF,EAAY,CACZ,QAAWP,KAAYS,EACnBH,GAAiB,IAAIN,CAAQ,EAEjC,MACJ,CAEAa,GAAaJ,EAAWD,EAAMvD,CAAO,EACzC,CAUO,SAASS,EAAYjB,EAAUiE,EAAQ,CAC1C,IAAMzD,EAAU,IAAI,IAEpB,GAAIR,aAAoB,IACpB,OAAAA,EAAS,QAAQ,CAACiE,EAAQpC,IAASrB,EAAQ,IAAIqB,EAAMoC,CAAM,CAAC,EACrDzD,EAGX,GAAIR,IAAa,MAAQ,OAAOA,GAAa,SACzC,QAAW6B,KAAQ,QAAQ,QAAQ7B,CAAQ,EACvCQ,EAAQ,IAAIqB,EAAM7B,EAAS6B,CAAI,CAAC,OAGpCrB,EAAQ,IAAIR,EAAUiE,CAAM,EAEhC,OAAOzD,CACX,CAEA,SAAS2D,GAAiBZ,EAAUvD,EAAUiE,EAAQ,CAC7CV,EAAS,UACVA,EAAS,QAAU,IAAI,KAE3BA,EAAS,QAAQ,IAAIvD,EAAUiE,CAAM,EACrCV,EAAS,YAAc,EAC3B,CAEA,SAASc,GAAad,EAAU,CAC5B,OAAOA,EAAS,QAChB,OAAOA,EAAS,WACpB,CAUO,SAAS9B,EAAUsC,EAAM/D,EAAU,CACtC,IAAMsE,EAAiBC,EAAaA,EAAa,OAAS,CAAC,EACvD,CAACD,GAAkBA,EAAe,iBAAiBP,EAAM/D,CAAQ,IAIjEoD,IAAWD,GAAQ,QACnBO,GAAY,MAAOK,EAAM/D,CAAQ,EAErCwE,GAAaT,EAAM/D,EAAUsE,CAAc,EAC/C,CAEA,IAAMG,EAAe,IAAI,QACnBC,EAAa,IAAI,QAEjBC,GAAiB,IAAI,IAE3B,SAAST,GAAaH,EAAM/D,EAAU,CAClC,OAAOyE,EAAa,IAAIV,CAAI,GAAG,IAAI/D,CAAQ,GAAK2E,EACpD,CAEA,SAASrB,GAAaS,EAAM/D,EAAU,CAClC,OAAO,MAAM,KAAKkE,GAAaH,EAAM/D,CAAQ,CAAC,CAClD,CAEA,SAASwE,GAAaT,EAAM/D,EAAU4E,EAAS,CACtCH,EAAa,IAAIV,CAAI,GACtBU,EAAa,IAAIV,EAAM,IAAI,GAAK,EAEpC,IAAMC,EAAYS,EAAa,IAAIV,CAAI,EAClCC,EAAU,IAAIhE,CAAQ,GACvBgE,EAAU,IAAIhE,EAAU,IAAI,GAAK,EAErCgE,EAAU,IAAIhE,CAAQ,EAAE,IAAI4E,CAAO,EAE9BF,EAAW,IAAIE,CAAO,GACvBF,EAAW,IAAIE,EAAS,IAAI,GAAK,EAErC,IAAMC,EAAeH,EAAW,IAAIE,CAAO,EACtCC,EAAa,IAAI7E,CAAQ,GAC1B6E,EAAa,IAAI7E,EAAU,IAAI,GAAK,EAExC6E,EAAa,IAAI7E,CAAQ,EAAE,IAAI+D,CAAI,CACvC,CAEA,SAASe,GAAeF,EAAS,CAC7B,IAAMC,EAAeH,EAAW,IAAIE,CAAO,EACtCC,IAILA,EAAa,QAAQ,CAACjF,EAASI,IAAa,CACxCJ,EAAQ,QAAQyC,GAAU,CACJoC,EAAa,IAAIpC,CAAM,GAC9B,IAAIrC,CAAQ,GAAG,OAAO4E,CAAO,CAC5C,CAAC,CACL,CAAC,EAEDF,EAAW,OAAOE,CAAO,EAC7B,CAEA,IAAML,EAAe,CAAC,EAChBQ,EAAc,CAAC,EACfC,EAAc,CAAC,EACfC,EAAY,IAAI,QAEtB,SAASC,EAAeC,EAAI1C,EAAM,CAC9B,GAAI,OAAO0C,GAAO,WACd,MAAM,IAAI,UAAU,qBAAqB1C,CAAI,uBAAuB,CAE5E,CAEA,SAAS2C,GAAmBD,EAAI,CAC5B,GAAIJ,EAAY,SAASI,CAAE,EACvB,MAAM,IAAI,MAAM,0BAA2B,CAAE,MAAOA,CAAG,CAAC,CAEhE,CAEA,SAASE,GAAaF,EAAI,CACtB,IAAIG,EAAkB1F,EAAQ,IAAIuF,CAAE,EACpC,OAAKG,IACDA,EAAkBjD,EAAO,CAAE,QAAS,IAAK,CAAC,EAC1CzC,EAAQ,IAAIuF,EAAIG,CAAe,GAE5BA,CACX,CAEA,SAASC,GAAgBD,EAAiBtE,EAAQ,CAC1CA,aAAkB,QAClBA,EAAO,KAAKzB,GAAS,CACjB+F,EAAgB,QAAU/F,CAC9B,CAAC,EAED+F,EAAgB,QAAUtE,CAElC,CAEA,SAASwE,GAAWZ,EAASU,EAAiBH,EAAIM,EAAY1E,EAAO,CAAC6D,EAASL,EAAcS,CAAW,EAAG,CACvG,GAAIA,EAAY,SAASM,CAAe,EACpC,MAAM,IAAI,MAAM,uCAAwC,CAAE,MAAOH,CAAG,CAAC,EAGzEL,GAAeF,CAAO,EACtBA,EAAQ,eAAiBO,EACzBP,EAAQ,WAAaa,EACrBlB,EAAa,KAAKK,CAAO,EACzBI,EAAY,KAAKM,CAAe,EAEhC,IAAItE,EACJ,GAAI,CACAA,EAASmE,EAAG,GAAGpE,CAAI,CACvB,QAAE,CACEwD,EAAa,IAAI,EACjBS,EAAY,IAAI,EAChBO,GAAgBD,EAAiBtE,CAAM,CAC3C,CACJ,CAEA,SAASoD,GAAaJ,EAAW3B,EAAQ7B,EAAS,CAC9C,IAAMkF,EAAgBnB,EAAaA,EAAa,OAAS,CAAC,EAE1D,QAAWhB,KAAYS,EACfT,IAAamC,GAAiBnC,GAAU,cACpCA,EAAS,cACTA,EAAS,cAAc,GAEnBlB,GAAUe,IAAWD,GAAQ,QAC7BO,GAAY,MAAOrB,EAAQ7B,EAAS+C,CAAQ,EAEhDA,EAAS,IAGjBc,GAAad,CAAQ,CAE7B,CAWO,SAASoC,GAAOR,EAAI,CACvBD,EAAeC,EAAI,QAAQ,EAC3BC,GAAmBD,CAAE,EACrBJ,EAAY,KAAKI,CAAE,EAEnB,IAAMG,EAAkBD,GAAaF,CAAE,EACjCP,EAAU,UAAyB,CACrCY,GAAWZ,EAASU,EAAiBH,EAAIQ,EAAM,CACnD,EACA,OAAAf,EAAQ,GAAKO,EACbF,EAAU,IAAIK,EAAiBV,CAAO,EAEtCA,EAAQ,EACDU,CACX,CASO,SAASM,EAAQN,EAAiB,CACrC,GAAI,CAAC9F,EAAS8F,CAAe,EACzB,MAAM,IAAI,UAAU,sDAAsD,EAG9E,IAAMV,EAAUK,EAAU,IAAIK,CAAe,EAC7C,GAAKV,EAOL,IAHAA,EAAQ,UAAU,EAClBE,GAAeF,CAAO,EAElBA,EAAQ,GAAI,CACZhF,EAAQ,OAAOgF,EAAQ,EAAE,EACzB,IAAMtE,EAAQyE,EAAY,UAAUI,GAAMA,IAAOP,EAAQ,EAAE,EACvDtE,IAAU,IACVyE,EAAY,OAAOzE,EAAO,CAAC,CAEnC,CAEA2E,EAAU,OAAOK,CAAe,EACpC,CAUO,SAASO,EAAMV,EAAI,CACtBD,EAAeC,EAAI,OAAO,EAC1BrB,IAEA,IAAI9C,EACJ,GAAI,CACAA,EAASmE,EAAG,CAChB,QAAE,CACE,IAAMW,EAAS,IAAM,CACjBhC,IACKA,GACDiC,GAAoB,CAE5B,EAEI/E,aAAkB,QAClBA,EAAO,KAAK8E,EAAQA,CAAM,EAE1BA,EAAO,CAEf,CACA,OAAO9E,CACX,CAEA,SAAS+E,IAAsB,CAC3B,IAAM/B,EAAYH,GAClBA,GAAmB,IAAI,IAKvB,IAAMmC,EAAU,IAAI,IACdC,EAAQ,IAAI,IAClB,QAAW1C,KAAYS,EACfT,EAAS,cACTyC,EAAQ,IAAIzC,CAAQ,EAEpB0C,EAAM,IAAI1C,CAAQ,EAI1Ba,GAAa4B,CAAO,EACpB5B,GAAa6B,CAAK,CACtB,CAYO,SAASC,EAAgBf,EAAIgB,EAAc,CAE9C,GADAjB,EAAeC,EAAI,iBAAiB,EAChC,CAAC,OAAO,SAASgB,CAAY,GAAKA,EAAe,EACjD,MAAM,IAAI,UAAU,sFAAsF,EAE9Gf,GAAmBD,CAAE,EACrBJ,EAAY,KAAKI,CAAE,EAEnB,IAAMG,EAAkBD,GAAaF,CAAE,EACnCiB,EAAiB,EACjBC,EAAY,GACZC,EAAU,KAER1B,EAAU,UAAyB,CACrC,IAAM2B,EAAM,KAAK,IAAI,EACrB,GAAIH,EAAiBG,EAAK,CACtBF,EAAY,GACZG,EAAS,EACT,MACJ,CAEAhB,GAAWZ,EAASU,EAAiBH,EAAIe,CAAe,EACxDG,EAAY,GACZD,EAAiB,KAAK,IAAI,EAAID,CAClC,EAEA,SAASK,GAAW,CAChB,GAAIF,EACA,OAGJ,IAAMG,EAAQ,KAAK,IAAI,EAAGL,EAAiB,KAAK,IAAI,CAAC,EACrDE,EAAU,WAAW,WAAW,IAAM,CAClCA,EAAU,KACND,GACAzB,EAAQ,CAEhB,EAAG6B,CAAK,CACZ,CAEA,OAAA7B,EAAQ,GAAKO,EACbP,EAAQ,QAAU,IAAM,CAChB0B,IACA,WAAW,aAAaA,CAAO,EAC/BA,EAAU,MAEdD,EAAY,EAChB,EACApB,EAAU,IAAIK,EAAiBV,CAAO,EAEtCA,EAAQ,EACDU,CACX,CAEA,IAAMoB,EAAc,IAAI,QAExB,SAASC,GAAcC,EAAO,CAC1B,OAAOlH,EAAIkH,CAAK,EAAE,IACtB,CAEA,SAASC,GAAcD,EAAO,CAC1B,GAAI,CAACF,EAAY,IAAIE,CAAK,EAAG,CACzB,IAAME,EAAQ,CACV,MAAAF,EACA,QAAS,IAAI,IACb,QAAS,IAAI,IACb,KAAMD,GAAcC,CAAK,CAC7B,EAOAE,EAAM,KAAO,UAA4B,CACrC,IAAMC,EAAOJ,GAAcC,CAAK,EAChC,GAAIG,GAAQD,EAAM,KACd,OAGJA,EAAM,KAAOC,EACb,IAAMC,EAAU,MAAM,KAAKF,EAAM,OAAO,EACxCA,EAAM,QAAQ,MAAM,EAEpB,QAAWlC,KAAWoC,EAClBpC,EAAQ,aAAe,GACnBkC,EAAM,QAAQ,IAAIlC,CAAO,GACzBA,EAAQ,CAGpB,EACAkC,EAAM,KAAK,eAAiBA,EAAM,KAClCA,EAAM,KAAK,WAAaG,EACxBzC,GAAaoC,EAAO,OAAQE,EAAM,IAAI,EACtCJ,EAAY,IAAIE,EAAOE,CAAK,CAChC,CAEA,OAAOJ,EAAY,IAAIE,CAAK,CAChC,CAEA,SAASM,GAAkBtC,EAAS,CAChC,IAAMkC,EAAQlC,EAAQ,WACjBkC,IAILA,EAAM,QAAQ,OAAOlC,CAAO,EAC5BkC,EAAM,QAAQ,OAAOlC,CAAO,EACvBkC,EAAM,QAAQ,OACfhC,GAAegC,EAAM,IAAI,EACzBJ,EAAY,OAAOI,EAAM,KAAK,GAEtC,CAWO,SAASG,EAAY9B,EAAIyB,EAAO,CAEnC,GADA1B,EAAeC,EAAI,aAAa,EAC5B,CAACyB,GAAS,OAAOA,GAAU,UAAY,OAAOlH,EAAIkH,CAAK,EAAE,MAAS,SAClE,MAAM,IAAI,UAAU,sFAAsF,EAG9G,IAAMO,EAAc3H,EAASoH,CAAK,EAAIA,EAAQvE,EAAO3C,EAAIkH,CAAK,CAAC,EACzDtB,EAAkBD,GAAaF,CAAE,EACjC2B,EAAQD,GAAcM,CAAW,EAEjCvC,EAAU,UAAyB,CACrCE,GAAeF,CAAO,EACtBA,EAAQ,eAAiBO,EACzBP,EAAQ,WAAaqC,EACrB1C,EAAa,KAAKK,CAAO,EAEzB,IAAI5D,EACJ,GAAI,CACAA,EAASmE,EAAGP,EAASL,CAAY,CACrC,QAAE,CACEA,EAAa,IAAI,EACjBgB,GAAgBD,EAAiBtE,CAAM,CAC3C,CACJ,EAEA,OAAA4D,EAAQ,GAAKO,EACbP,EAAQ,WAAakC,EACrBlC,EAAQ,eAAiB,CAACb,EAAM/D,IAAa+D,IAASoD,GAAenH,IAAa,OAClF4E,EAAQ,cAAgB,IAAM,CACrBA,EAAQ,eACTA,EAAQ,aAAe,GACvBkC,EAAM,QAAQ,IAAIlC,CAAO,EAEjC,EACAA,EAAQ,QAAU,IAAMsC,GAAkBtC,CAAO,EAEjDkC,EAAM,QAAQ,IAAIlC,CAAO,EACzBK,EAAU,IAAIK,EAAiBV,CAAO,EAEtCA,EAAQ,EACDU,CACX,CAUO,SAAS8B,EAAUjC,EAAI,CAC1BD,EAAeC,EAAI,WAAW,EAC9B,IAAM7E,EAAQiE,EAAa,OAAS,EAC9B8C,EAAU9C,EAAajE,CAAK,EAClCiE,EAAajE,CAAK,EAAI,GACtB,GAAI,CACA,OAAO6E,EAAG,CACd,QAAE,CACEZ,EAAajE,CAAK,EAAI+G,CAC1B,CACJ,CAEA,SAASC,GAAaC,EAAS,CAC3B,GAAI,OAAOA,GAAY,UACnB,MAAO,CAAE,KAAMA,CAAQ,EAE3B,GAAIA,IAAY,OACZ,MAAO,CAAE,KAAM,EAAK,EAExB,GAAI,CAACA,GAAW,OAAOA,GAAY,SAC/B,MAAM,IAAI,UAAU,qEAAqE,EAE7F,MAAO,CAAE,KAAMA,EAAQ,OAAS,EAAM,CAC1C,CAEA,SAASC,GAASjI,EAAO,CACrB,OAAOA,GAAO,aAAa,MAAQ,OAAO,UAAU,SAAS,KAAKA,CAAK,EAAE,MAAM,EAAG,EAAE,CACxF,CAEA,SAASkI,GAAclI,EAAO,CAC1B,IAAMmI,EAAY,OAAO,eAAenI,CAAK,EAC7C,OAAOmI,IAAc,OAAO,WAAaA,IAAc,IAC3D,CAEA,SAASC,GAAapI,EAAO,CACzB,OAAO,YAAY,OAAOA,CAAK,GAAK,EAAEA,aAAiB,SAC3D,CAEA,SAASqI,GAAa5H,EAAU,CAC5B,GAAI,OAAOA,GAAa,UAAYA,IAAa,GAC7C,MAAO,GAEX,IAAMM,EAAQ,OAAON,CAAQ,EAC7B,OAAO,OAAO,UAAUM,CAAK,GAAKA,GAAS,GAAK,OAAOA,CAAK,IAAMN,CACtE,CAEA,SAAS6H,GAAWtI,EAAO,CACvB,OAAO,OAAOA,EAAM,SAAY,UACpC,CAEA,SAASuI,GAAYvI,EAAOwI,EAAM,CAC9B,MAAM,IAAI,UACN,0CAA0CP,GAASjI,CAAK,CAAC,OAAOwI,CAAI,6CACxE,CACJ,CAEA,SAASC,EAA0BC,EAAQjH,EAAQkH,EAAYC,EAAO,IAAM,GAAO,CAC/E,IAAMC,EAAc,OAAO,0BAA0BH,CAAM,EAE3D,QAAW7G,KAAO,QAAQ,QAAQgH,CAAW,EAAG,CAC5C,GAAID,EAAK/G,CAAG,EAAG,CACX,OAAOgH,EAAYhH,CAAG,EACtB,QACJ,CAEA,IAAMY,EAAaoG,EAAYhH,CAAG,EAK7B,OAAO,OAAOY,EAAY,OAAO,GAClC8F,GAAYG,EAAQ,OAAO7G,CAAG,CAAC,EAEnCY,EAAW,MAAQkG,EAAWlG,EAAW,MAAO,OAAOZ,CAAG,CAAC,CAC/D,CAEA,cAAO,iBAAiBJ,EAAQoH,CAAW,EACpCpH,CACX,CAEA,SAASqH,GAAiB9I,EAAO,CAC7B,OAAOA,EAAM,MAAM,CAAC,CACxB,CAEA,SAAS+I,GAAuB/I,EAAO,CACnC,IAAMyB,EAAS,IAAI,kBAAkBzB,EAAM,UAAU,EACrD,WAAI,WAAWyB,CAAM,EAAE,IAAI,IAAI,WAAWzB,CAAK,CAAC,EACzCyB,CACX,CAEA,SAASuH,GAAiBhJ,EAAO2I,EAAYH,EAAM,CACxB,IAAI,IAAI,CAC3B,MACA,UACA,WACA,eACA,YACA,UACA,SACA,OAAO,eAAmB,IAAc,OAAY,cACxD,CAAC,EAEmB,IAAIxI,EAAM,WAAW,GACrCuI,GAAYvI,EAAOwI,CAAI,EAG3B,IAAMR,EAAU,OAAO,OAAOhI,EAAO,OAAO,EACtC,CAAE,MAAO2I,EAAW3I,EAAM,MAAO,OAAO,CAAE,EAC1C,OAEN,GAAI,OAAO,eAAmB,KAAeA,aAAiB,eAAgB,CAC1E,IAAMiJ,EAAS,MAAM,KAAKjJ,EAAM,QAAU,CAAC,EAAG,CAACkJ,EAAOnI,IAAU4H,EAAWO,EAAO,UAAUnI,CAAK,EAAE,CAAC,EACpG,OAAO,IAAI,eAAekI,EAAQjJ,EAAM,QAASgI,CAAO,CAC5D,CAEA,OAAO,IAAIhI,EAAM,YAAYA,EAAM,QAASgI,CAAO,CACvD,CAeO,SAASmB,GAAMnJ,EAAOgI,EAAS,CAClC,GAAM,CAAE,KAAAoB,CAAK,EAAIrB,GAAaC,CAAO,EAC/BqB,EAAO,IAAI,IAEjB,SAASC,EAAWtJ,EAAOwI,EAAM,CAC7B,OAAOY,EAAOT,EAAW3I,EAAOwI,CAAI,EAAIrI,EAAIH,CAAK,CACrD,CAEA,SAAS2I,EAAW3I,EAAOwI,EAAO,QAAS,CACvC,IAAME,EAASvI,EAAIH,CAAK,EAExB,GAAI,CAACD,EAAa2I,CAAM,EACpB,OAAOA,EAEX,GAAIW,EAAK,IAAIX,CAAM,EACf,OAAOW,EAAK,IAAIX,CAAM,EAE1B,GAAIJ,GAAWI,CAAM,EAAG,CACpB,IAAMjH,EAAStB,EAAIuI,EAAO,QAAQ,CAAC,EACnC,GAAI,OAAO,GAAGjH,EAAQiH,CAAM,EACxB,MAAM,IAAI,UAAU,uEAAuEF,CAAI,EAAE,EAErG,OAAAa,EAAK,IAAIX,EAAQjH,CAAM,EAChBA,CACX,CAEA,GAAI,MAAM,QAAQiH,CAAM,EAAG,CACvB,IAAMjH,EAAS,IAAI,MAAMiH,EAAO,MAAM,EACtC,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAChBgH,EAA0BC,EAAQjH,EAAQ6H,EAAYzH,GAAOA,IAAQ,QAAQ,CACxF,CAEA,GAAIqG,GAAcQ,CAAM,EAAG,CACvB,IAAMjH,EAAS,OAAO,OAAO,OAAO,eAAeiH,CAAM,CAAC,EAC1D,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAChBgH,EAA0BC,EAAQjH,EAAQ6H,CAAU,CAC/D,CAEA,GAAIZ,aAAkB,IAAK,CACvB,IAAMjH,EAAS,IAAI,IACnB,OAAA4H,EAAK,IAAIX,EAAQjH,CAAM,EACvBiH,EAAO,QAAQ,CAACa,EAAUC,IAAW,CACjC/H,EAAO,IAAI6H,EAAWE,EAAQ,SAAS,EAAGF,EAAWC,EAAU,WAAW,CAAC,CAC/E,CAAC,EACMd,EAA0BC,EAAQjH,EAAQ6H,CAAU,CAC/D,CAEA,GAAIZ,aAAkB,IAAK,CACvB,IAAMjH,EAAS,IAAI,IACnB,OAAA4H,EAAK,IAAIX,EAAQjH,CAAM,EACvBiH,EAAO,QAAQe,GAAYhI,EAAO,IAAI6H,EAAWG,EAAU,WAAW,CAAC,CAAC,EACjEhB,EAA0BC,EAAQjH,EAAQ6H,CAAU,CAC/D,CAEA,GAAIZ,aAAkB,KAAM,CACxB,IAAMjH,EAAS,IAAI,KAAKiH,EAAO,QAAQ,CAAC,EACxC,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAChBgH,EAA0BC,EAAQjH,EAAQ6H,CAAU,CAC/D,CAEA,GAAIZ,aAAkB,OAAQ,CAC1B,IAAMjH,EAAS,IAAI,OAAOiH,EAAO,OAAQA,EAAO,KAAK,EACrD,OAAAjH,EAAO,UAAYiH,EAAO,UAC1BW,EAAK,IAAIX,EAAQjH,CAAM,EAChBgH,EAA0BC,EAAQjH,EAAQ6H,EAAYzH,GAAOA,IAAQ,WAAW,CAC3F,CAEA,GAAI6G,aAAkB,YAAa,CAC/B,IAAMjH,EAASqH,GAAiBJ,CAAM,EACtC,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAChBgH,EAA0BC,EAAQjH,EAAQ6H,CAAU,CAC/D,CAEA,GAAI,OAAO,kBAAsB,KAAeZ,aAAkB,kBAAmB,CACjF,IAAMjH,EAASsH,GAAuBL,CAAM,EAC5C,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAChBgH,EAA0BC,EAAQjH,EAAQ6H,CAAU,CAC/D,CAEA,GAAIZ,aAAkB,SAAU,CAC5B,IAAMgB,EAAShB,EAAO,OAAO,MAAMA,EAAO,WAAYA,EAAO,WAAaA,EAAO,UAAU,EACrFjH,EAAS,IAAI,SAASiI,CAAM,EAClC,OAAAL,EAAK,IAAIX,EAAQjH,CAAM,EAChBgH,EAA0BC,EAAQjH,EAAQ6H,CAAU,CAC/D,CAEA,GAAIlB,GAAaM,CAAM,EAAG,CACtB,IAAMjH,EAAS,IAAIiH,EAAO,YAAYA,CAAM,EAC5C,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAChBgH,EAA0BC,EAAQjH,EAAQ6H,EAAYjB,EAAY,CAC7E,CAEA,GAAI,OAAO,IAAQ,KAAeK,aAAkB,IAAK,CACrD,IAAMjH,EAAS,IAAI,IAAIiH,EAAO,IAAI,EAClC,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAIhBA,CACX,CAEA,GAAI,OAAO,gBAAoB,KAAeiH,aAAkB,gBAAiB,CAC7E,IAAMjH,EAAS,IAAI,gBAAgBiH,CAAM,EACzC,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAChBA,CACX,CAEA,GAAI,OAAO,KAAS,KAAeiH,aAAkB,KAAM,CACvD,IAAMjH,EAAS,IAAI,KAAK,CAACiH,CAAM,EAAGA,EAAO,KAAM,CAC3C,KAAMA,EAAO,KACb,aAAcA,EAAO,YACzB,CAAC,EACD,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAChBA,CACX,CAEA,GAAI,OAAO,KAAS,KAAeiH,aAAkB,KAAM,CACvD,IAAMjH,EAASiH,EAAO,MAAM,EAAGA,EAAO,KAAMA,EAAO,IAAI,EACvD,OAAAW,EAAK,IAAIX,EAAQjH,CAAM,EAChBA,CACX,CAEA,GAAIiH,aAAkB,MAAO,CACzB,IAAMjH,EAASuH,GAAiBN,EAAQY,EAAYd,CAAI,EACxD,OAAAa,EAAK,IAAIX,EAAQjH,CAAM,EAChBgH,EAA0BC,EAAQjH,EAAQ6H,EAAYzH,GACzDA,IAAQ,WAAaA,IAAQ,SAAWA,IAAQ,UAAYA,IAAQ,OACvE,CACL,CAEA,GAAI,OAAO,KAAS,KAAe6G,aAAkB,MAAQ,OAAOA,EAAO,WAAc,WAAY,CACjG,IAAMjH,EAASiH,EAAO,UAAUU,CAAI,EACpC,OAAAC,EAAK,IAAIX,EAAQjH,CAAM,EAChBA,CACX,CAEA8G,GAAYG,EAAQF,CAAI,CAC5B,CAEA,OAAOG,EAAW3I,CAAK,CAC3B,CEj0CA,IAAA2J,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,GAAA,WAAAC,GAAA,kBAAAC,EAAA,iBAAAC,KCSA,SAASC,EAAcC,EAASC,EAChC,CACI,OAAOD,EAAQ,QAAQ,QAAUC,EAAQ,IAC7C,CAQO,SAASC,GAAMD,EACtB,CACI,GAAIA,EAAQ,WAAW,OACnBE,GAAiB,KAAK,KAAMF,CAAO,UAG5B,OAAO,eAAe,KAAK,KAAK,QAAQ,UAAWA,EAAQ,QAAQ,OAAO,EAAG,CACpF,IAAMG,EAAW,KAAK,QAAQ,UAAUH,EAAQ,QAAQ,OAAO,EAC3DG,GACAA,EAAS,KAAK,KAAMH,CAAO,CAEnC,MAAW,KAAK,QAAQ,UAAU,GAAG,GACjC,KAAK,QAAQ,UAAU,GAAG,EAAE,KAAK,KAAMA,CAAO,EAElD,OAAOA,CACX,CAMO,SAASI,GAAKJ,EACrB,CACS,MAAM,QAAQA,EAAQ,KAAK,IAC5BA,EAAQ,MAAQ,CAACA,EAAQ,KAAK,GAGlC,IAAMK,EAASL,EAAQ,MAAM,OAC7B,OAAKA,EAAQ,WAAW,OAGpBM,GAAiB,KAAK,KAAMN,CAAO,EAFnC,QAAQ,MAAM,wBAAyBA,EAAQ,OAAO,EAInDA,CACX,CAMO,SAASO,GAAIP,EACpB,CACI,OAAI,OAAOA,EAAQ,OAAS,UAAY,CAACA,EAAQ,MAC7C,QAAQ,MAAM,0BAA2BA,EAAQ,QAASA,EAAQ,KAAMA,EAAQ,KAAK,EAC7EA,EAAQ,WAAW,OAG3BQ,GAAkB,KAAK,KAAMR,CAAO,EAFpC,QAAQ,MAAM,wBAAyBA,EAAQ,OAAO,EAInDA,CACX,CAEA,SAASS,GAAMC,EAAG,CACd,GAAI,SAASA,CAAC,GAAGA,EACb,MAAO,EAEf,CASO,SAASC,GAAeC,EAAMC,EAAMC,EAAOC,EAAQ,CAAC,EAC3D,CACIC,EAAM,IAAM,CACR,IAAIC,EAAQJ,EAAK,MAAM,GAAG,EACtBK,EAAON,EACPO,EACJA,EAAOF,EAAM,MAAM,EACnB,IAAIG,EAAO,KACPC,EAAW,KACXC,EAAWJ,EACf,KAAOC,GAAQD,GAAM,CAGjB,GAFAI,EAAWJ,EACXC,EAAO,mBAAmBA,CAAI,EAC1B,EAAAA,GAAM,KAAO,CAAC,MAAM,QAAQD,CAAI,GAE7B,IAAIC,GAAM,OAEb,MAAM,IAAI,MAAM,+BAA+B,EAExCA,GAAM,WAEN,MAAM,QAAQD,CAAI,GAAK,CAACT,GAAMU,CAAI,GAAK,OAAOD,EAAKC,CAAI,EAAG,KACjEC,EAAOF,EAAK,CAAC,EACbA,EAAOA,EAAK,CAAC,EAAEC,CAAI,IAEnBC,EAAOF,EACPA,EAAOA,EAAKC,CAAI,IAIpB,GAFAE,EAAWF,EACXA,EAAOF,EAAM,MAAM,EACfE,GAAQ,CAACD,EAAM,CAEf,IAAMK,EAAS,SAASJ,CAAI,EACxBI,GAAQ,GAAKJ,IAAO,GAAGI,EACvBD,EAASD,CAAQ,EAAI,CAAC,EAEtBC,EAASD,CAAQ,EAAI,CAAC,EAE1BH,EAAOI,EAASD,CAAQ,CAC5B,CACJ,CACA,GAAID,GAAQC,GAAYN,EAAQ,QAC5BK,EAAKC,CAAQ,EAAIP,UACVM,GAAQC,GAAYD,EAAKC,CAAQ,IAAIP,EAC5C,GAAI,MAAM,QAAQA,CAAK,EACnBM,EAAKC,CAAQ,EAAIP,UACVA,GAAS,OAAOA,GAAO,SAAU,CACxCI,EAAOE,EAAKC,CAAQ,EACfH,IAEDE,EAAKC,CAAQ,EAAI,CAAC,EAClBH,EAAOE,EAAKC,CAAQ,GAExB,QAAWG,KAAQV,EACXI,EAAKM,CAAI,IAAIV,EAAMU,CAAI,IACvBN,EAAKM,CAAI,EAAIV,EAAMU,CAAI,EAGnC,MACIJ,EAAKC,CAAQ,EAAIP,CAG7B,CAAC,CACL,CASO,SAASR,GAAiBN,EACjC,CACI,IAAMyB,EAAiB,KAAK,QAAQ,UAC9BC,EAAiB,CAACD,EAAU,SAASA,EAAU,QAAQA,EAAU,QAAQA,EAAU,OAAOA,EAAU,aAAa,EACjHE,EAAiB,IAAID,EAAW,KAAK,KAAK,EAAE,IAC5CE,EAAiBH,EAAU,OAC3BI,EAAiB,MAAM,KAAK7B,EAAQ,QAAQ,iBAAiB,aAAa4B,EAAa,GAAG,CAAC,EAC3FE,EAAiB,IAAI,IACvBC,EAAmB,EAEvB/B,EAAQ,KAAOA,EAAQ,MAEvB,QAASgC,EAAQ,EAAGA,EAAQhC,EAAQ,MAAM,OAAQgC,IAAS,CACvDhC,EAAQ,MAAQgC,EAChB,IAAMlB,EAAQd,EAAQ,KAAKgC,CAAK,EAC5BC,EAAOC,GAAeL,EAAOC,EAAWC,CAAM,EAElD,GAAI,CAACE,EAAM,CACPjC,EAAQ,QAAQ,YAAY,KAAK,cAAcA,CAAO,CAAC,EACvD,QACJ,CAEA,IAAMmC,EAAc,KAAK,aAAanC,EAAQ,UAAWc,CAAK,EAE1DsB,EADwBH,EAAKI,EAAI,KAAK,IAAMvB,EAE1CmB,EACAK,GAAiBT,EAAOC,EAAWhB,EAAOqB,EAAaJ,EAAS,CAAC,EAEvE,GAAIK,EAAc,CACVD,GAAeC,EAAaC,EAAI,QAAQ,EACxCrC,EAAQ,QAAQ,aAAa,KAAK,cAAcA,CAAO,EAAGoC,CAAY,GAElEA,IAAiBH,GACjBjC,EAAQ,QAAQ,aAAaoC,EAAcH,CAAI,EAEnDM,GAAcH,EAAcJ,EAAOhC,EAAQ,KAAM4B,EAAcF,EAAYC,CAAS,EACpFS,EAAaC,EAAI,KAAK,EAAIvB,GAE9BgB,EAAU,IAAIM,CAAY,EACtBA,IAAiBH,GACjBF,IAEJ,QACJ,CAEA/B,EAAQ,QAAQ,aAAa,KAAK,cAAcA,CAAO,EAAGiC,CAAI,CAClE,CAEA,QAASA,KAAQJ,EACRC,EAAU,IAAIG,CAAI,GACnBA,EAAK,OAAO,EAIhB,KAAK,QAAQ,QACbO,GAAa,KAAK,KAAMxC,EAAQ,OAAO,CAE/C,CAEA,SAASkC,GAAeL,EAAOC,EAAWW,EAC1C,CACI,KAAOA,EAAQZ,EAAM,QAAQ,CACzB,IAAMI,EAAOJ,EAAMY,CAAK,EACxB,GAAI,CAACX,EAAU,IAAIG,CAAI,EACnB,OAAOA,EAEXQ,GACJ,CACJ,CAEA,SAASH,GAAiBT,EAAOC,EAAWhB,EAAO4B,EAAUD,EAC7D,CACI,QAAS,EAAIA,EAAO,EAAIZ,EAAM,OAAQ,IAAK,CACvC,IAAMI,EAAOJ,EAAM,CAAC,EACpB,GAAI,CAACC,EAAU,IAAIG,CAAI,GAAKA,EAAKI,EAAI,KAAK,IAAMvB,GAASmB,EAAKI,EAAI,QAAQ,IAAMK,EAC5E,OAAOT,CAEf,CACJ,CAGA,SAASM,GAAcN,EAAMU,EAAK9B,EAAMe,EAAcF,EAAYC,EAClE,CACI,IAAMiB,EAASX,EAAK,aAAaL,CAAY,EACvCiB,EAAS,GAAGF,EAElB,GAAIC,IAAWC,EACX,OAGJZ,EAAK,aAAaL,EAAciB,CAAM,EAEtC,IAAMC,EAAYjC,EAAK,IAAI+B,EACrBG,EAAYlC,EAAK,IAAIgC,EACrBG,EAAW,MAAM,KAAKf,EAAK,iBAAiBN,CAAS,CAAC,EACxDM,EAAK,QAAQN,CAAS,GACtBqB,EAAS,QAAQf,CAAI,EAGzB,QAASlC,KAAWiD,EAChB,QAASC,KAAQvB,EAAY,CACzB,IAAMwB,EAAWnD,EAAQ,aAAakD,CAAI,EACtC,CAACC,GAAYA,EAAS,OAAO,EAAE,CAAC,IAAI,UAGpCA,IAAaJ,EACb/C,EAAQ,aAAakD,EAAMF,CAAS,EAC7BG,EAAS,WAAWJ,EAAU,GAAG,GACxC/C,EAAQ,aAAakD,EAAMF,EAAUG,EAAS,OAAOJ,EAAU,MAAM,CAAC,EAE9E,CAER,CAOO,SAAStC,GAAkBR,EAClC,CACI,IAAMyB,EAAiB,KAAK,QAAQ,UAC9BC,EAAiB,CAACD,EAAU,SAASA,EAAU,QAAQA,EAAU,QAAQA,EAAU,OAAOA,EAAU,aAAa,EACjHE,EAAiB,IAAID,EAAW,KAAK,KAAK,EAAE,IAC5CE,EAAiBH,EAAU,OAC3BI,EAAiB,MAAM,KAAK7B,EAAQ,QAAQ,iBAAiB,aAAa4B,EAAa,GAAG,CAAC,EAC3FE,EAAiB,IAAI,IACvBC,EAAmB,EAEvB/B,EAAQ,KAAOA,EAAQ,MAEvB,QAAS2C,KAAO3C,EAAQ,KAAM,CAC1BA,EAAQ,MAAQ2C,EAChB,IAAM7B,EAAQd,EAAQ,KAAK2C,CAAG,EAC1BV,EAAOC,GAAeL,EAAOC,EAAWC,CAAM,EAElD,GAAI,CAACE,EAAM,CACPjC,EAAQ,QAAQ,YAAY,KAAK,cAAcA,CAAO,CAAC,EACvD,QACJ,CAEA,IAAMmC,EAAc,KAAK,aAAanC,EAAQ,UAAWc,CAAK,EAC1DsB,EASJ,GAPIH,EAAK,aAAaL,CAAY,IAAMe,EACpCP,EAAeH,EAEfG,EAAee,GAActB,EAAOC,EAAWa,EAAKf,CAAY,GACzDU,GAAiBT,EAAOC,EAAWhB,EAAOqB,EAAaJ,CAAM,EAGpEK,EAAc,CACVD,GAAeC,EAAaC,EAAI,QAAQ,EACxCrC,EAAQ,QAAQ,aAAa,KAAK,cAAcA,CAAO,EAAGoC,CAAY,GAElEA,IAAiBH,GACjBjC,EAAQ,QAAQ,aAAaoC,EAAcH,CAAI,EAEnDM,GAAcH,EAAcO,EAAK3C,EAAQ,KAAM4B,EAAcF,EAAYC,CAAS,EAClFS,EAAaC,EAAI,KAAK,EAAIvB,GAE9BgB,EAAU,IAAIM,CAAY,EACtBA,IAAiBH,GACjBF,IAEJ,QACJ,CAEA/B,EAAQ,QAAQ,aAAa,KAAK,cAAcA,CAAO,EAAGiC,CAAI,CAClE,CAEA,QAASA,KAAQJ,EACRC,EAAU,IAAIG,CAAI,GACnBA,EAAK,OAAO,CAGxB,CAEA,SAASkB,GAActB,EAAOC,EAAWa,EAAKf,EAC9C,CACI,IAAMwB,EAAY,GAAGT,EACrB,QAASV,KAAQJ,EACb,GAAI,CAACC,EAAU,IAAIG,CAAI,GAAKA,EAAK,aAAaL,CAAY,IAAMwB,EAC5D,OAAOnB,CAGnB,CAMO,SAAS/B,GAAiBF,EACjC,CACI,IAAMqD,EAAWrD,EAAQ,QAAQ,cAAc,yBAAyB,EAClE0C,EAAW,KAAK,aAAa1C,EAAQ,UAAWA,EAAQ,KAAK,EAEnE,GADAA,EAAQ,OAASsD,GAActD,EAAQ,OAAO,EAC1CqD,EACA,GAAIX,GACA,GAAIW,IAAWhB,EAAI,QAAQ,GAAKK,EAAU,CACtC,IAAMa,EAAQ,KAAK,cAAcvD,CAAO,EACxCA,EAAQ,QAAQ,aAAauD,EAAOF,CAAQ,CAChD,OAEArD,EAAQ,QAAQ,YAAYqD,CAAQ,UAEjCX,EAAU,CACjB,IAAMa,EAAQ,KAAK,cAAcvD,CAAO,EACxCA,EAAQ,QAAQ,YAAYuD,CAAK,CACrC,CACJ,CAEA,SAASD,GAAcE,EAAI/B,EAC3B,CACI,IAAMgC,EAAYD,EAAG,eAAe,QAAQ,IAAI/B,CAAS,WAAWA,CAAS,OAAO,EACpF,OAAKgC,EAGDA,EAAS,aAAa,GAAGhC,CAAS,OAAO,EAClCgC,EAAS,aAAa,GAAGhC,CAAS,OAAO,EAAE,IAE/CgC,EAAS,aAAa,GAAGhC,CAAS,MAAM,EAAE,IALtC,EAMf,CAQO,SAASiC,GAAM1D,EACtB,CACI,IAAMwD,EAAMxD,EAAQ,QAChBc,EAAQd,EAAQ,MAKhBc,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,IAC1D6C,EAAcH,EAAI1C,EAAO,QAAS,KAAM,YAAa,QAAS,SAAS,EACvEA,EAAQA,EAAM,OAEd,OAAOA,EAAS,MAChBA,EAAQ,IAER0C,EAAG,MAAM,WACTA,EAAG,QAAUI,GAAkBJ,EAAI1C,CAAK,EACjC0C,EAAG,MAAM,QAChBA,EAAG,QAAUK,EAAWL,EAAG,MAAO1C,CAAK,EAC/B+C,EAAWL,EAAG,MAAO1C,CAAK,IAClC0C,EAAG,MAAQ,GAAG1C,GAGdhB,EAAc,KAAME,CAAO,IACvBwD,EAAG,MAAM,WACTM,EAAc,KAAK,KAAM9D,EAAQ,QAAS,CAAC,SAAS,EAAG,GAAM,UAAW+D,GAAmB/D,CAAO,EAC3FwD,EAAG,MAAM,QAChBM,EAAc,KAAK,KAAM9D,EAAQ,QAAS,CAAC,SAAS,EAAG,GAAM,UAAWgE,GAAgBhE,CAAO,EAE/F8D,EAAc,KAAK,KAAM9D,EAAQ,QAAS,CAAC,OAAO,EAAG,GAAM,QAAS,OAAWA,CAAO,EAGlG,CAEA,SAAS4D,GAAkBJ,EAAI1C,EAC/B,CACI,OAAI,MAAM,QAAQA,CAAK,EACZA,EAAM,KAAKmD,GAAYJ,EAAWL,EAAG,MAAOS,CAAQ,CAAC,EAE5D,OAAOnD,GAAU,UACVA,EAEJ+C,EAAWL,EAAG,MAAO1C,CAAK,CACrC,CAEA,SAASiD,GAAkBP,EAAIU,EAC/B,CAKI,GAAI,MAAM,QAAQA,CAAY,EAAG,CAC7B,IAAMpD,EAAQ0C,EAAG,MACXW,EAASD,EAAa,OAAOjC,GAAQ,CAAC4B,EAAW5B,EAAMnB,CAAK,CAAC,EACnE,OAAI0C,EAAG,SACHW,EAAO,KAAKrD,CAAK,EAEdqD,CACX,CACA,OAAI,OAAOD,GAAiB,UACjBV,EAAG,QAEVA,EAAG,SAAWK,EAAWL,EAAG,MAAOU,CAAY,EACxCA,EAEJV,EAAG,OACd,CAEA,SAASQ,GAAeR,EAAIU,EAC5B,CAGI,GAAKV,EAAG,QAGR,OAAOA,EAAG,KACd,CAKO,SAASY,GAAOpE,EACvB,CACIqE,GAAQ,KAAK,KAAMrE,EAAS,OAAO,CACvC,CAKO,SAASsE,GAAOtE,EACvB,CACI,IAAMwD,EAAMxD,EAAQ,QAChBc,EAAQd,EAAQ,MAMpB,GAJIc,IAAU,OACVA,EAAQ,IAGR,MAAM,QAAQA,CAAK,EACnB,QAASyD,KAAUf,EAAG,QAClBe,EAAO,SAAWzD,EAAM,KAAKmD,GAAYJ,EAAWU,EAAO,MAAON,CAAQ,CAAC,EACvEM,EAAO,SACPA,EAAO,aAAa,WAAY,EAAI,EAEpCA,EAAO,gBAAgB,UAAU,UAGlC,OAAOzD,GAAO,SAAU,CAC/B,IAAIyD,EAAS,MAAM,KAAKf,EAAG,OAAO,EAAE,KAAKgB,GAAKX,EAAWW,EAAE,MAAM1D,CAAK,CAAC,EACnEyD,IACAA,EAAO,SAAW,GAClBA,EAAO,aAAa,WAAY,EAAI,EAE5C,MACQzD,EAAM,SACN2D,GAAiBjB,EAAI1C,EAAM,OAAO,EAElC,OAAOA,EAAM,SAAa,KAC1BwD,GAAO,KAAK,KAAM,OAAO,OAAO,CAAC,EAAGtE,EAAS,CAAC,MAAMc,EAAM,QAAQ,CAAC,CAAC,EAExE6C,EAAcH,EAAI1C,EAAO,OAAQ,KAAM,gBAAiB,WAAW,EAGnEhB,EAAc,KAAME,CAAO,IACvBwD,EAAG,SACHM,EAAc,KAAK,KAAM9D,EAAQ,QAAS,CAAC,OAAO,EAAG,GAAM,QAAS0E,GAAyB1E,CAAO,EAEpG8D,EAAc,KAAK,KAAM9D,EAAQ,QAAS,CAAC,OAAO,EAAG,GAAM,QAAS,OAAWA,CAAO,EAGlG,CAEA,SAAS0E,GAAwBlB,EACjC,CAII,IAAM1C,EAAQ0C,EAAG,MACjB,OAAO,MAAM,KAAKA,EAAG,OAAO,EACvB,OAAOe,GAAUA,EAAO,QAAQ,EAChC,IAAIA,GAAUA,EAAO,KAAK,CACnC,CAOO,SAASI,GAAUL,EAAQC,EAClC,CACSA,IAGD,OAAOA,GAAW,SAClBD,EAAO,QAAQ,IAAI,IAAI,OAAO,GAAGC,CAAM,CAAC,EACjCA,EAAO,KACdD,EAAO,QAAQ,IAAI,IAAI,OAAOC,EAAO,KAAMA,EAAO,MAAOA,EAAO,gBAAiBA,EAAO,QAAQ,CAAC,EAC1F,OAAOA,EAAO,MAAS,KAC9BD,EAAO,QAAQ,IAAI,IAAI,OAAO,GAAGC,EAAO,MAAOA,EAAO,MAAOA,EAAO,gBAAiBA,EAAO,QAAQ,CAAC,EAE7G,CAKO,SAASE,GAAiBH,EAAOvD,EACxC,CAGI,GADAuD,EAAO,UAAY,GACf,MAAM,QAAQvD,CAAO,EACrB,QAAWwD,KAAUxD,EACjB4D,GAAUL,EAAQC,CAAM,UAErBxD,GAAW,OAAOA,GAAW,SACpC,QAAWwD,KAAUxD,EACjB4D,GAAUL,EAAQ,CAAE,KAAMvD,EAAQwD,CAAM,EAAG,MAAOA,CAAO,CAAC,CAGtE,CAKO,SAASK,GAAO5E,EACvB,CACIqE,GAAQ,KAAK,KAAMrE,EAAS,SAAU,OAAQ,OAAQ,YAAa,UAAU,EACzEF,EAAc,KAAME,CAAO,GAC3BgB,EAAM,IAAM,CACR6D,GAAiB,KAAK,KAAM7E,EAAS,CAAC,SAAU,OAAQ,OAAQ,YAAa,UAAU,CAAC,CAC5F,CAAC,CAET,CAKO,SAAS8E,GAAM9E,EACtB,CACI2D,EAAc3D,EAAQ,QAASA,EAAQ,MAAO,QAAS,MAAO,MAAO,IAAI,EACrEF,EAAc,KAAME,CAAO,GAC3BgB,EAAM,IAAM,CACR6D,GAAiB,KAAK,KAAM7E,EAAS,CAAC,QAAS,MAAO,MAAO,IAAI,CAAC,CACtE,CAAC,CAET,CAKO,SAAS+E,GAAO/E,EACvB,CACI2D,EAAc3D,EAAQ,QAASA,EAAQ,MAAO,QAAS,MAAO,IAAI,EAC9DF,EAAc,KAAME,CAAO,GAC3BgB,EAAM,IAAM,CACR6D,GAAiB,KAAK,KAAM7E,EAAS,CAAC,QAAQ,MAAM,IAAI,CAAC,CAC7D,CAAC,CAET,CAKO,SAASgF,GAAKhF,EACrB,CACI2D,EAAc3D,EAAQ,QAASA,EAAQ,MAAO,UAAW,IAAI,EACzDF,EAAc,KAAME,CAAO,GAC3BgB,EAAM,IAAM,CACR6D,GAAiB,KAAK,KAAM7E,EAAS,CAAC,UAAU,IAAI,CAAC,CACzD,CAAC,CAET,CAKO,SAASqE,GAAQrE,KAAYiF,EACpC,CACI,IAAMzB,EAAMxD,EAAQ,QAChBc,EAAQd,EAAQ,MAChBkF,EAAgB,GACpB,GAAI,OAAOpE,EAAO,KAAeA,IAAQ,KAAM,CAC3C,IAAIqE,EAAW,GAAGrE,GACd,OAAOA,GAAO,UAAYqE,EAAS,UAAU,EAAE,CAAC,GAAG,cACnDrE,EAAQ,CAAE,UAAWA,CAAM,EAC3BoE,EAAgB,GAExB,CACA,IAAME,EAAQ,CAAC,YAAY,QAAQ,KAAK,WAAW,EAAE,OAAOH,CAAU,EACtEtB,EAAcH,EAAI1C,EAAO,GAAGsE,CAAK,EAC7BtF,EAAc,KAAME,CAAO,GAC3B8D,EAAc,KAAK,KAAM9D,EAAQ,QAASoF,EAAOF,EAAe,YAAa,OAAWlF,CAAO,CAEvG,CAOO,SAAS2D,EAAcH,EAAI6B,KAASC,EAAY,CACnD,GAAI,GAACD,GAAQ,OAAOA,GAAO,UAG3B,QAAWE,KAAYD,EACf,OAAOD,EAAKE,CAAQ,EAAM,KAG1B1B,EAAWL,EAAG+B,CAAQ,EAAGF,EAAKE,CAAQ,CAAC,IAGvCF,EAAKE,CAAQ,IAAM,KACnB/B,EAAG+B,CAAQ,EAAI,GAEf/B,EAAG+B,CAAQ,EAAI,GAAGF,EAAKE,CAAQ,EAG3C,CAGA,SAASV,GAAiB7E,EAASsF,EACnC,CACIxB,EAAc,KAAK,KAAM9D,EAAQ,QAASsF,EAAY,GAAO,YAAa,OAAWtF,CAAO,CAChG,CAEO,SAASwF,GAAchC,KAAO8B,EAAY,CAC7C,IAAMG,EAAS,CAAC,EAChB,QAAWF,KAAYD,EACnB,OAAOC,EAAU,CACb,QACIE,EAAOF,CAAQ,EAAI/B,EAAG+B,CAAQ,EAClC,KACJ,CAEJ,OAAOE,CACX,CAMO,SAAS5B,EAAW6B,EAAEC,EAC7B,CAOI,OANID,GAAG,UAAY,CAACC,GAGhBA,GAAG,UAAY,CAACD,GAGhB,GAAGA,GAAK,GAAGC,CAInB,CDlrBA,IAAMC,GAAa,IAAI,QAKjBC,GAAY,IAAI,QAKhBC,GAAmB,CACrB,IAAK,CAACC,EAAQC,EAAUC,IAAa,CACjC,IAAMC,EAAQH,IAASC,CAAQ,EAE/B,OADAG,EAAUF,EAAUD,CAAQ,EACxB,OAAOE,GAAU,WACVA,EAAM,KAAKH,CAAM,EAExBG,GAAS,OAAOA,GAAS,SAClBE,EAAYF,CAAK,EAErBA,CACX,EACA,IAAK,CAACH,EAAQC,EAAUE,EAAOD,IAAa,CACxC,IAAMI,EAAUN,EAAOC,CAAQ,EAC/BD,EAAOC,CAAQ,EAAIE,EACnB,IAAMI,EAAMP,EAAOC,CAAQ,EAC3B,OAAK,OAAO,GAAGK,EAASC,CAAG,GACvBC,EAAUN,EAAUO,EAAYR,EAAU,CAAE,IAAKK,EAAS,IAAAC,CAAI,CAAC,CAAC,EAE7D,EACX,EACA,IAAK,CAACP,EAAQC,IAAa,CACvB,IAAMC,EAAWQ,EAAUV,CAAM,EACjC,OAAIE,GACAE,EAAUF,EAAUD,CAAQ,EAEzB,QAAQ,IAAID,EAAQC,CAAQ,CACvC,EACA,QAAUD,GAAW,CAGjB,IAAME,EAAWQ,EAAUV,CAAM,EACjC,OAAIE,GACAE,EAAUF,EAAUS,EAAI,OAAO,EAE5B,QAAQ,QAAQX,CAAM,CACjC,CACJ,EAWO,SAASK,GAAOO,EAAIC,EAAS,CAChC,GAAIC,EAASF,CAAE,EACX,OAAOA,EAGX,IAAMG,EAAWL,EAAUE,CAAE,EAC7B,OAAIG,GAIGC,EAAaJ,EAAIb,GAAkB,CAACC,EAAQiB,IAAU,CACzDC,GAAUlB,EAAQiB,EAAOJ,CAAO,CACpC,CAAC,CACL,CAKA,SAASK,GAAUN,EAAIP,EAAQQ,EAAS,CAQ/BA,IACDA,EARmB,CACnB,cAAe,GACf,QAAS,GACT,WAAY,GACZ,mBAAoB,GACpB,UAAW,EACf,GAIA,IAAIM,EAAiBP,EAAG,UACpBQ,EAAiBR,EAAG,UACxB,GAAI,CAACd,GAAU,IAAIc,CAAE,EAAG,CACpB,IAAMS,EAAW,IAAI,iBAAiB,CAACC,EAAcD,IAAa,CAE9D,IAAME,EAAU,CAAC,EACjB,QAAWC,KAAYF,EACfE,EAAS,OAAO,aAEhBD,EAAQC,EAAS,aAAa,EAAIA,EAAS,kBACpCA,EAAS,OAAO,WAAaA,EAAS,OAAO,iBAEhDZ,EAAG,WAAaO,IAChBI,EAAQ,UAAYJ,EACpBA,EAAiBP,EAAG,WAEpBA,EAAG,WAAaQ,IAChBG,EAAQ,UAAYH,EACpBA,EAAiBR,EAAG,YAEjBY,EAAS,OAAO,aACvBD,EAAQ,SAAW,CACf,IAAK,MAAM,KAAKX,EAAG,QAAQ,CAC/B,EACAW,EAAQ,OAAS,GACbX,EAAG,WAAaO,IAChBI,EAAQ,UAAYJ,EACpBA,EAAiBP,EAAG,WAEpBA,EAAG,WAAaQ,IAChBG,EAAQ,UAAYH,EACpBA,EAAiBR,EAAG,YAGxB,QAAQ,IAAI,oBAAoBA,EAAGY,EAAS,IAAI,EAGxD,QAAWC,KAAQF,EACff,EAAUH,EAAQI,EAAYgB,EAAM,CAAE,IAAKF,EAAQE,CAAI,EAAG,IAAKb,EAAGa,CAAI,CAAE,CAAC,CAAC,CAElF,CAAC,EAID,GAHAJ,EAAS,QAAQT,EAAIC,CAAO,EAC5Bf,GAAU,IAAIc,EAAIS,CAAQ,EAEtBT,EAAG,QAAQ,yBAAyB,EAAG,CACvC,IAAIc,EAAYd,EAAG,MACfe,EAAcf,EAAG,QACfgB,EAAkB,IAAM,CAC1BpB,EAAUH,EAAQI,EAAY,QAAS,CAAE,IAAKiB,EAAW,IAAKd,EAAG,KAAM,CAAC,CAAC,EACzEc,EAAYd,EAAG,MACX,YAAaA,IACbJ,EAAUH,EAAQI,EAAY,UAAW,CAAE,IAAKkB,EAAa,IAAKf,EAAG,OAAQ,CAAC,CAAC,EAC/Ee,EAAcf,EAAG,QAEzB,EACAA,EAAG,iBAAiB,SAAUgB,CAAe,EACzChB,EAAG,QAAQ,iBAAiB,GAC5BA,EAAG,iBAAiB,QAASgB,CAAe,CAEpD,CACJ,CACJ,CAOO,SAASC,GAAaC,EAC7B,CACI,IAAMC,EAAO,KAAK,eAAeD,CAAO,EACxC,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,0CAA2C,CAAE,MAAOD,CAAQ,CAAC,EAEjF,IAAME,EAAI3B,GAAOyB,EAAS,CACtB,UAAW,EACf,CAAC,EACD,OAAAG,EAAgB,IAAM,CAClB,IAAMC,EAAW,MAAM,KAAKF,EAAE,QAAQ,EACtCG,EAAU,IAAM,CACZC,EAAM,IAAM,CACR,IAAIC,EAAI,EACFC,EAAcC,EAAe,KAAK,QAAQ,KAAMR,CAAI,EACpDS,EAASF,EAAY,MAAM,EACjC,QAAWG,KAAQP,EACXO,EAAK,UAAU,YAGfA,EAAK,QAAQ,UACTA,EAAK,QAAQ,SAASJ,GACtBK,GAAe,KAAK,QAAQ,KAAMX,EAAK,IAAIM,EACvCG,EAAOC,EAAK,QAAQ,OAAO,CAAC,EAEpCJ,KAGJC,EAAY,OAAOD,IAEnBC,EAAY,OAASD,EAE7B,CAAC,CACL,CAAC,CACL,EAAG,EAAE,EACEL,CACX,CAOO,SAASW,EAAcb,EAASc,EAAOC,EAAeC,EAAiB,YAAaC,EAAgBC,EAAS,CAChH,GAAInD,GAAW,IAAIiC,CAAO,EACtB,OAEJ,IAAMC,EAAO,KAAK,eAAeD,CAAO,EACxC,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,0CAA2C,CAAE,MAAOD,CAAQ,CAAC,EAEjF,IAAME,EAAI3B,GAAOyB,CAAO,EACxB,OAAAjC,GAAW,IAAIiC,EAASE,CAAC,EACzBI,EAAM,IAAM,CACRH,EAAgB,IAAM,CAClB,IAAIgB,EACJ,GAAIF,EAKA,QAAWtB,KAAQmB,EACfZ,EAAEP,CAAI,OAGVwB,EAAcjB,EAAEc,CAAc,EACzBD,IACDI,EAAcC,GAAclB,EAAG,GAAGY,CAAK,GAG/CT,EAAU,IAAM,CAKZ,IAAMgB,EAAeZ,EAAe,KAAK,QAAQ,KAAMR,CAAI,EACvDgB,IACAE,EAAcF,EAAe,KAAK,KAAMf,EAAGmB,CAAY,GAEvD,SAAOF,EAAgB,OAG3BA,EAAc,KAAK,eAAeD,EAASC,EAAaE,CAAY,GAAKF,EACrE,SAAOA,EAAgB,OAGvBJ,GAAiB,CAAC,OAAO,GAAGM,EAAcF,CAAW,GAAK,OAAOE,CAAY,IAAMF,GAIvFP,GAAe,KAAK,QAAQ,KAAMX,EAAMkB,EAAa,CAAE,QAASD,GAAS,YAAa,CAAC,GAC3F,CAAC,CACL,EAAG,EAAE,CACT,CAAC,EACMhB,CACX,CAcO,SAASoB,GAAcxC,EAAIyC,EAAM,CACpC,OAAOzC,EAAG,QAAQ,IAAIyC,EAAK,GAAG,GACxB,aAAaA,CAAI,CAC3B,CElRO,IAAMC,GAAc,CACvB,OAAOC,EAASC,EAAM,CAClB,OAAI,OAAOD,EAAQ,OAAU,WAGzBE,GAAkBF,EAAQ,OAAO,EACjCA,EAAQ,MAAQ,CAAE,MAAOA,EAAQ,KAAM,EAEvCA,EAAQ,MAAQ,CAAE,UAAWG,GAAWH,EAAQ,KAAK,CAAE,GAEpDC,EAAKD,CAAO,CACvB,EAEA,QAAQA,EAASC,EAAM,CACnB,OAAI,OAAOD,EAAQ,OAAU,SACzBA,EAAQ,MAAQI,GAAaJ,EAAQ,KAAK,EACnCA,EAAQ,OAAS,OAAOA,EAAQ,OAAU,WAC7C,OAAOA,EAAQ,MAAM,WAAc,SACnCA,EAAQ,MAAQI,GAAaJ,EAAQ,MAAM,SAAS,EAC7C,OAAOA,EAAQ,MAAM,OAAU,WACtCA,EAAQ,MAAQA,EAAQ,MAAM,QAG/BC,EAAKD,CAAO,CACvB,CACJ,EAEA,SAASE,GAAkBG,EAC3B,CACI,OAAOA,GAAS,UAAY,SAAWA,GAAS,UAAY,UAChE,CAEA,SAASF,GAAWG,EACpB,CACI,OAAO,OAAOA,CAAK,EACd,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,EACtB,QAAQ,KAAM,OAAO,CAC9B,CAEA,SAASF,GAAaE,EACtB,CACI,IAAMC,EAAW,SAAS,cAAc,UAAU,EAClD,OAAAA,EAAS,UAAYD,EACdC,EAAS,KACpB,CAEO,SAASC,GAAcR,EAASC,EAAM,CACrC,OAAOD,EAAQ,OAAS,SACxBA,EAAQ,MAAQ,CAAC,EAEjB,OAAOA,EAAQ,OAAO,UAE1BC,EAAKD,CAAO,CAChB,CAEO,IAAMS,GAAa,CACtB,OAAOT,EAAS,CACZ,IAAMU,EAAQC,GAAkB,KAAK,KAAMX,CAAO,EAClD,OAAAY,GAAcZ,EAAQ,QAASA,EAAQ,MAAOU,CAAK,EAC/CV,EAAQ,MACRa,EAAc,KACV,KACAb,EAAQ,QACRU,EACA,GACA,YACA,IAAMI,GAAed,EAAQ,QAASU,CAAK,EAC3CV,CACJ,EAEGA,CACX,EAEA,QAAQA,EAASC,EAAM,CACnB,IAAMS,EAAQC,GAAkB,KAAK,KAAMX,CAAO,EAClD,OAAAA,EAAQ,MAAQc,GAAed,EAAQ,QAASU,CAAK,EACrDV,EAAQ,aAAe,GAChBC,EAAOA,EAAKD,CAAO,EAAIA,CAClC,CACJ,EAEA,SAASW,GAAkBX,EAC3B,CACI,IAAMe,EAAY,KAAK,QAAQ,UAAU,cACnCC,EAAahB,EAAQ,QAAQ,aAAae,CAAS,EACzD,OAAIC,EACOA,EAAW,MAAM,QAAQ,EAAE,OAAO,OAAO,EAEhDhB,EAAQ,OAAS,OAAOA,EAAQ,OAAU,UAAY,CAAC,MAAM,QAAQA,EAAQ,KAAK,EAC3E,OAAO,KAAKA,EAAQ,KAAK,EAEhCA,EAAQ,cAAgB,OAAOA,EAAQ,cAAiB,UAAY,CAAC,MAAM,QAAQA,EAAQ,YAAY,EAChG,OAAO,KAAKA,EAAQ,YAAY,EAEpC,CAAC,CACZ,CAEA,SAASY,GAAcP,EAASY,EAAMP,EACtC,CACI,GAAI,GAACA,EAAM,QAAU,CAACO,GAAQ,OAAOA,GAAS,UAAY,MAAM,QAAQA,CAAI,GAG5E,QAAWC,KAAQR,EAAO,CACtB,IAAMJ,EAAQW,EAAKC,CAAI,EACnB,OAAOZ,EAAU,KAAeA,IAAU,KAC1CD,EAAQ,gBAAgBa,CAAI,EACrBb,EAAQ,aAAaa,CAAI,IAAM,GAAGZ,GACzCD,EAAQ,aAAaa,EAAM,GAAGZ,CAAK,CAE3C,CACJ,CAEA,SAASQ,GAAeT,EAASK,EACjC,CACI,IAAMO,EAAO,CAAC,EACd,QAAWC,KAAQR,EACXL,EAAQ,aAAaa,CAAI,IACzBD,EAAKC,CAAI,EAAIb,EAAQ,aAAaa,CAAI,GAG9C,OAAOD,CACX,CCnHA,IAAME,GAAN,KACA,CAUI,YAAYC,EACZ,CAOI,KAAK,SAAW,IAAI,IAEpB,IAAMC,EAAsB,CACpB,YAAAC,GACA,cAAAC,GACA,WAAAC,EACR,EACMC,EAAiB,CACnB,UAAW,SAAS,KACpB,UAAW,YACX,aAAcJ,EACd,OAAQ,CACJ,MAAO,CAAQK,EAAK,EACpB,KAAM,CAAQC,EAAI,EAClB,IAAK,CAAQC,EAAG,CACpB,EACA,UAAW,CACP,MAAeC,GACf,SAAkBA,GAClB,OAAgBC,GAChB,OAAgBC,GAChB,EAAWC,GACX,IAAaC,GACb,OAAgBC,GAChB,KAAcC,GACd,SAAW,KACX,IAAWC,EACf,EACA,OAAQ,EACZ,EACA,GAAI,CAAChB,GAAS,KACV,MAAM,IAAI,MAAM,sCAAsC,EAE1D,KAAK,QAAU,OAAO,OAAO,CAAC,EAAGK,EAAgBL,CAAO,EACpDA,EAAQ,aACR,KAAK,QAAQ,aAAe,OAAO,OAAO,CAAC,EAAGC,EAAqBD,GAAS,YAAY,EAExF,KAAK,QAAQ,aAAeC,EAEhC,IAAMgB,EAAiB,KAAK,QAAQ,UAC9BC,EAAiB,CAACD,EAAU,SAASA,EAAU,QAAQA,EAAU,QAAQA,EAAU,MAAM,EAEzFE,EAAuBC,GAAO,CAChC,IAAMC,EAAiBH,EAAe,KAAKI,GAAQF,EAAG,aAAaE,CAAI,CAAC,EACxE,OAAKD,GACD,QAAQ,MAAM,8BAA8BD,EAAGF,CAAc,EAE1DG,CACX,EAIME,EAAiBH,GAAO,CAC1B,KAAK,SAAS,IAAIA,EAAII,EAAgB,IAAM,CACxC,GAAI,CAACJ,EAAG,YAAa,CAEjBK,GAAQL,EAAI,KAAK,eAAeA,CAAE,CAAC,EACnC,IAAMM,EAAU,KAAK,SAAS,IAAIN,CAAE,EAChCM,IACAC,EAAQD,CAAO,EACf,KAAK,SAAS,OAAON,CAAE,GAK3B,MACJ,CACA,IAAIQ,EAAU,CACV,UAAWR,EAAG,iBAAiB,mBAAmB,EAClD,UAAWD,EAAoBC,CAAE,CACrC,EACAQ,EAAQ,KAAOA,EAAQ,YAAc,KAAK,QAAQ,UAAU,QAC5DA,EAAQ,KAAO,KAAK,eAAeR,CAAE,EACrCQ,EAAQ,MAAQC,EAAe,KAAK,QAAQ,KAAMD,EAAQ,IAAI,EAC9DA,EAAQ,QAAUR,EAClBU,GAAMV,EAAIQ,CAAO,EACjBG,EAAgBH,CAAO,CAC3B,EAAG,EAAE,CAAC,CACV,EAMMG,EAAmBH,GAAY,CACjC,IAAII,EACJ,OAAOJ,EAAQ,UAAW,CACtB,KAAK,KAAK,QAAQ,UAAU,SAC5B,KAAK,KAAK,QAAQ,UAAU,QACxBI,EAAe,MAAM,KAAK,KAAK,QAAQ,OAAO,KAAK,EACnD,MACJ,KAAK,KAAK,QAAQ,UAAU,QACxBA,EAAe,MAAM,KAAK,KAAK,QAAQ,OAAO,IAAI,EAClD,MACJ,KAAK,KAAK,QAAQ,UAAU,OACxBA,EAAe,MAAM,KAAK,KAAK,QAAQ,OAAO,GAAG,EACjD,MACJ,QACI,MAAM,IAAI,MAAM,uCAAuCJ,CAAO,CAEtE,CACAI,EAAa,KAAK,GAAG,KAAK,qBAAqBJ,EAAQ,OAAO,EACzD,IAAIK,GAAeC,GAAoBD,EAAa,QAAQ,CAAC,EAC7D,OAAO,OAAO,CAAC,EACpBE,GAAoB,KAAK,KAAMH,EAAcJ,CAAO,CACxD,EAIMQ,EAAiBC,GAAa,CAChC,QAASC,KAAaD,EACb,KAAK,SAAS,IAAIC,CAAS,GAC5Bf,EAAce,CAAS,CAGnC,EAKMC,EAAkBC,GAAY,CAChC,IAAMC,EAAW,IAAIxB,CAAS,YAAYA,CAAS,WAAWA,CAAS,WAAWA,CAAS,QAC3F,QAAWyB,KAAUF,EACjB,GAAIE,EAAO,MAAM,aAAeA,EAAO,YACnC,QAASC,KAAQD,EAAO,WACpB,GAAIC,aAAgB,YAAa,CAC7B,IAAIN,EAAW,MAAM,KAAKM,EAAK,iBAAiBF,CAAQ,CAAC,EACrDE,EAAK,QAAQF,CAAQ,GACrBJ,EAAS,QAAQM,CAAI,EAErBN,EAAS,QACTD,EAAcC,CAAQ,CAE9B,EAIhB,EAIA,KAAK,SAAW,IAAI,iBAAkBG,GAAY,CAC9CD,EAAeC,CAAO,CAC1B,CAAC,EAED,KAAK,SAAS,QAAQ,KAAK,QAAQ,UAAW,CAC1C,QAAS,GACT,UAAW,EACf,CAAC,EAKD,IAAMH,EAAW,KAAK,QAAQ,UAAU,iBACpC,QAAQ,KAAK,QAAQ,UAAU,YAC1B,KAAK,QAAQ,UAAU,WACvB,KAAK,QAAQ,UAAU,WACvB,KAAK,QAAQ,UAAU,sBAChC,EACA,GAAI,CACIA,EAAS,QACTD,EAAcC,CAAQ,CAE9B,OAASO,EAAO,CACZ,WAAK,QAAQ,EACPA,CACV,CAEJ,CAQA,cAAchB,EACd,CACI,IAAMiB,EAAYjB,EAAQ,KACpBkB,EAAYlB,EAAQ,OACpBmB,EAAYnB,EAAQ,UACpBrB,EAAYqB,EAAQ,KACpBoB,EAAYpB,EAAQ,MACpBqB,EAAY1C,EAAOA,EAAKyC,CAAK,EAAIpB,EAAQ,MAE3CsB,EAAW,KAAK,aAAaH,EAAWE,CAAK,EACjD,GAAI,CAACC,EAAU,CACX,IAAIC,EAAS,IAAI,iBACjB,OAAAA,EAAO,UAAY,gCACZA,CACX,CACA,IAAIC,EAAQF,EAAS,QAAQ,UAAU,EAAI,EAC3C,GAAI,CAACE,EAAM,UAAU,OACjB,OAAOA,EAEX,GAAIA,EAAM,SAAS,OAAO,EACtB,MAAM,IAAI,MAAM,2CAA4C,CAAE,MAAOF,CAAS,CAAC,EAEnF,IAAMjC,EAAY,KAAK,QAAQ,UAEzBb,EAAa,CAACa,EAAU,SAASA,EAAU,QAAQA,EAAU,QAAQA,EAAU,MAAM,EACrFoB,EAAWe,EAAM,iBAAiB,IAAInC,CAAS,YAAYA,CAAS,WAAWA,CAAS,WAAWA,CAAS,OAAO,EACzH,QAASS,KAAWW,EAAU,CAC1B,GAAIX,EAAQ,SAAS,WACjB,SAEJ,IAAMJ,EAAOlB,EAAW,KAAKkB,GAAQI,EAAQ,aAAaJ,CAAI,CAAC,EAC3D+B,EAAO3B,EAAQ,aAAaJ,CAAI,EACpC+B,EAAO,KAAK,WAAWH,EAAS,MAAOG,CAAI,EACvCA,EAAK,UAAU,EAAG,CAAe,GAAG,SACpC3B,EAAQ,aAAaJ,EAAM+B,EAAK,UAAU,CAAe,CAAC,EACnDA,GAAM,UAAYL,GAAO,KAChCtB,EAAQ,aAAaJ,EAAMuB,EAAK,IAAIG,CAAK,EAClCA,GAAO,KACdtB,EAAQ,aAAaJ,EAAMuB,EAAK,IAAIG,EAAM,IAAIK,CAAI,EAElD3B,EAAQ,aAAaJ,EAAMwB,EAAOO,CAAI,CAE9C,CACA,YAAK,2BAA2BD,EAAOF,EAAS,MAAOL,EAAMG,CAAK,EAC9D,OAAOA,EAAU,KACjBI,EAAM,SAAS,CAAC,EAAE,aAAanC,EAAU,OAAO+B,CAAK,EAIzDI,EAAM,SAAS,CAAC,EAAEE,EAAI,QAAQ,EAAIJ,EAClCE,EAAM,SAAS,CAAC,EAAEE,EAAI,KAAK,EAAIL,EAGxBG,CACX,CAEA,2BAA2BG,EAAUC,EAAOX,EAAMG,EAClD,CACI,IAAMS,EAAqB,KAAK,QAAQ,UAAU,SAC5CC,EAAqB,KAAK,QAAQ,UAAU,cAC5CC,EAAqB,IAAIF,EAAe,IACxCG,EAAqB,MAAM,KAAKL,EAAS,iBAAiBI,CAAa,CAAC,EAE9E,QAAW3C,KAAW4C,EAAU,CAC5B,IAAIX,EAAQjC,EAAQ,aAAayC,CAAc,EAC/CR,EAAQ,KAAK,WAAWO,EAAOP,CAAK,EACpC,IAAMY,EAAWC,GAAqBb,EAAOJ,EAAMG,CAAK,EACnDa,IAGD,OAAO,OAAOA,EAAU,MAAM,EAC9B7C,EAAQ,aAAa0C,EAAoBG,EAAS,IAAI,GAEtD7C,EAAQ,aAAayC,EAAgBI,EAAS,KAAK,EACnD7C,EAAQ,gBAAgB0C,CAAkB,GAElD,CACJ,CAEA,WAAWF,EACX,CACI,IAAIL,EAAS,CAAC,EACdK,EAAQA,EAAM,MAAM,GAAG,EAAE,IAAIO,GAAQA,EAAK,KAAK,CAAC,EAChD,QAASA,KAAQP,EACbO,EAAOA,EAAK,MAAM,GAAG,EACrBZ,EAAOY,EAAK,CAAC,EAAE,KAAK,CAAC,EAAIA,EAAK,CAAC,EAAE,KAAK,EAE1C,OAAOZ,CACX,CAEA,WAAWK,EAAOP,EAClB,CACI,QAASc,KAAQP,EAAO,CACpB,GAAIP,EAAM,WAAWc,EAAK,GAAG,EACzB,OAAOP,EAAMO,CAAI,EAAId,EAAM,OAAOc,EAAK,MAAM,EAC1C,GAAId,GAAOc,EACd,OAAOP,EAAMO,CAAI,CAEzB,CACA,OAAOd,CACX,CAOA,eAAe7B,EACf,CACI,IAAMhB,EAAa,CACf,KAAK,QAAQ,UAAU,SACvB,KAAK,QAAQ,UAAU,QACvB,KAAK,QAAQ,UAAU,QACvB,KAAK,QAAQ,UAAU,MAC3B,EACA,QAASkB,KAAQlB,EACb,GAAIgB,EAAG,aAAaE,CAAI,EACpB,OAAOF,EAAG,aAAaE,CAAI,CAGvC,CAEA,qBAAqBF,EACrB,CACI,IAAM4C,EAAqB,KAAK,QAAQ,UAAU,aAClD,OAAK5C,EAAG,aAAa4C,CAAkB,EAGhC5C,EAAG,aAAa4C,CAAkB,EACpC,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAIC,GAAQ,CACT,IAAMhC,EAAc,KAAK,QAAQ,aAAagC,CAAI,EAClD,OAAKhC,IACD,QAAQ,KAAK,4BAA4BgC,EAAK,cAAe,CAAC,MAAO7C,CAAE,CAAC,EACjE,KAGf,CAAC,EACA,OAAO,OAAO,EAbR,CAAC,CAchB,CAEA,aAAaQ,EAASqB,EAAOiB,EAC7B,CACI,GAAI,CAACtC,GAAS,QACV,OAAOqB,EAEX,IAAMjB,EAAe,KAAK,qBAAqBJ,EAAQ,OAAO,EACzD,IAAIK,GAAeC,GAAoBD,EAAa,SAAS,CAAC,EAC9D,OAAO,OAAO,EACd,QAAQ,EACb,GAAI,CAACD,EAAa,OACd,OAAOiB,EAEX,OAAOrB,EAAQ,aACf,IAAMuC,EAAiB,OAAO,OAAO,CAAC,EAAGvC,EAAS,CAC9C,MAAAqB,EACA,aAAAiB,EACA,cAAeA,CACnB,CAAC,EACD,OAAA/B,GAAoB,KAAK,KAAMH,EAAcmC,CAAc,EAC3DvC,EAAQ,aAAeuC,EAAe,aAC/BA,EAAe,KAC1B,CAMA,aAAapB,EAAWE,EACxB,CACI,IAAMmB,EAAkBC,GAAK,CAEzB,IAAIxB,EAAO,KAAK,eAAewB,CAAC,EAC5BC,EACAzB,EACIA,EAAK,OAAO,EAAE,CAAC,GAAG,SAClByB,EAAczC,EAAe,KAAK,QAAQ,KAAMgB,EAAK,UAAU,CAAC,CAAC,EAEjEyB,EAAczC,EAAeoB,EAAOJ,CAAI,EAG5CyB,EAAcrB,EAIlB,IAAMsB,EAAU,GAAGD,EACfE,EAAUH,EAAE,aAAa,KAAK,QAAQ,UAAU,QAAQ,EAC5D,GAAIG,EAAS,CACT,GAAIA,IAAU,UAAY,CAACF,EACvB,OAAOD,EAIX,GAHWG,IAAU,aAAeF,GAGhCC,GAAWC,EACX,OAAOH,CAEf,CACA,GAAI,CAACG,EAED,OAAOH,CAEf,EACInB,EAAW,MAAM,KAAKH,CAAS,EAAE,KAAKqB,CAAe,EACrDZ,EAAQ,KACRN,GAAU,aAAa,KAAK,QAAQ,UAAU,OAAO,IACrDM,EAAQ,KAAK,WAAWN,EAAS,aAAa,KAAK,QAAQ,UAAU,OAAO,CAAC,GAEjF,IAAIuB,EAAMvB,GAAU,aAAa,KAAK,EACtC,GAAIuB,EAAK,CACL,IAAIC,EAAc,SAAS,cAAc,YAAYD,CAAG,EACxD,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,mCAAmCD,CAAG,EAE1DvB,EAAWwB,CACf,CACA,OAAIxB,IACAA,EAAS,MAAQM,GAEdN,CACX,CAEA,SACA,CACI,KAAK,SAAS,QAAQ,CAACxB,EAASV,IAAY,CACxCS,GAAQT,EAAS,KAAK,eAAeA,CAAO,CAAC,EAC7CW,EAAQD,CAAO,CACnB,CAAC,EACD,KAAK,SAAW,IAAI,IACpB,KAAK,SAAS,WAAW,CAC7B,CAEJ,EAMO,SAAS2B,GAAKrD,EACrB,CACI,OAAO,IAAID,GAAWC,CAAO,CACjC,CAEA,SAASkC,GAAoBD,EAAa0C,EAC1C,CACI,OAAI,OAAO1C,GAAgB,WAChB0C,IAAU,SAAW1C,EAAc,KAE1CA,GAAe,OAAOA,EAAY0C,CAAK,GAAM,WACtC1C,EAAY0C,CAAK,EAErB,IACX,CAEA,SAASxC,GAAoBH,EAAcJ,EAC3C,CACI,IAAIgD,EAAOhD,GAAWA,EACtB,QAASK,KAAeD,EACpB4C,GAAQ,CAACA,EAAM3C,IACHL,GACGK,EAAY,KAAK,KAAML,EAASgD,CAAI,GAEhDA,EAAM3C,CAAW,EAExB,OAAO2C,IAAOhD,CAAO,CACzB,CAEA,IAAMiD,EAAW,IAAI,IAOrB,SAASC,GAAMC,EAAIC,EAAS,CACxBC,GAAQF,CAAE,EACLG,EAAS,IAAIF,EAAQ,IAAI,EAG1BE,EAAS,IAAIF,EAAQ,IAAI,EAAE,KAAKA,CAAO,EAFvCE,EAAS,IAAIF,EAAQ,KAAM,CAACA,CAAO,CAAC,CAI5C,CAEA,SAASC,GAAQF,EAAII,EAAM,CACvB,GAAIA,EAAM,CACN,IAAIC,EAAOF,EAAS,IAAIC,CAAI,EACxBC,IACAA,EAAOA,EAAK,OAAOJ,GAAWA,EAAQ,UAAYD,CAAE,EACpDG,EAAS,IAAIC,EAAMC,CAAI,GAE3B,MACJ,CACAF,EAAS,QAAQ,CAACE,EAAMC,IAAgB,CACpCD,EAAOA,EAAK,OAAOJ,GAAWA,EAAQ,UAAYD,CAAE,EACpDG,EAAS,IAAIG,EAAaD,CAAI,CAClC,CAAC,CACL,CAIA,SAASE,GAAqBC,EAAOJ,EAAMK,EAC3C,CACI,MAAI,CAACD,GAASA,EAAM,CAAC,IAAM,IAChB,KAEPA,IAAU,OACH,CAAE,MAAO,GAAGC,CAAM,EAEzBD,IAAU,SACH,CAAE,KAAME,GAAiBN,EAAMK,CAAK,CAAE,EAE7CD,EAAM,WAAW,SAAS,EACnB,CAAE,KAAMG,GAASD,GAAiBN,EAAMK,CAAK,EAAGD,EAAM,UAAU,CAAe,CAAC,CAAE,EAEzFA,EAAM,WAAW,QAAQ,EAClB,CAAE,KAAMA,EAAM,UAAU,CAAe,CAAE,EAE7C,IACX,CAEA,SAASE,GAAiBN,EAAMK,EAChC,CACI,OAAI,OAAOA,EAAU,IACVL,EAEJO,GAASP,EAAM,IAAIK,CAAK,CACnC,CAEA,SAASE,GAASP,EAAMQ,EACxB,CACI,OAAKR,EAGEA,EAAKQ,EAFDA,EAAO,QAAQ,MAAO,EAAE,CAGvC,CAUO,SAASC,EAAeC,EAAMV,EACrC,CACI,IAAIW,EAAQX,EAAK,MAAM,GAAG,EACtBY,EAAOF,EACPG,EACJA,EAAOF,EAAM,MAAM,EACnB,IAAIG,EAAW,KACf,KAAOD,GAAQD,GACXC,EAAO,mBAAmBA,CAAI,EAC1BA,GAAM,KAAO,CAAC,MAAM,QAAQD,CAAI,IAEzBC,GAAM,OACbD,EAAOE,EACAD,GAAM,WAEN,MAAM,QAAQD,CAAI,GAAK,OAAOA,EAAKC,CAAI,EAAG,KAAeD,EAAK,CAAC,EACtEA,EAAOA,EAAK,CAAC,EAAEC,CAAI,EAEnBD,EAAOA,EAAKC,CAAI,IAEpBC,EAAWD,EACXA,EAAOF,EAAM,MAAM,EAEvB,OAAOC,CACX,CC9jBA,IAAAG,GAAA,GAAAC,GAAAD,GAAA,aAAAE,GAAA,WAAAC,GAAA,UAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,SAAAC,KAQA,IAAMC,GAAN,KAAsB,CAQrB,YAAYC,EAAO,CAClB,GAAI,CAACA,EACJ,MAAM,IAAI,MAAM,gBAAgB,GAE7BA,EAAM,MAAM,MAAQ,OAAOA,EAAM,KAAK,OAAO,QAAQ,GAAM,aAC9D,QAAQ,KAAK,+CAA+C,EAE7D,KAAK,MAAQC,EAAOD,CAAK,EACpB,KAAK,MAAM,UACf,KAAK,MAAM,QAAU,CAAC,GAEvB,KAAK,QAAU,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,EACzC,KAAK,KAAO,CACR,QAAS,KAAK,MAAM,IACtB,CACH,CAWA,UAAUE,EAAI,CACb,GAAI,CAACA,GAAM,OAAOA,GAAM,WACvB,MAAM,IAAI,MAAM,yDAA0D,CAAE,MAAOA,CAAG,CAAC,EAExF,IAAMC,EAAa,KAAK,QAAQ,KAAK,QAAQ,OAAO,CAAC,EAC/CC,EAAkBF,EAAG,KAAK,KAAMC,CAAU,EAChD,GAAI,CAACE,EAASD,CAAe,EAC5B,MAAM,IAAI,MAAM,oDAAqD,CAAE,MAAOF,CAAG,CAAC,EAEnF,KAAK,KAAOE,EACZ,KAAK,QAAQ,KAAK,KAAK,IAAI,CAC5B,CACD,EAEO,SAASE,GAAMC,EAAS,CAC9B,OAAO,IAAIR,GAAgBQ,CAAO,CACnC,CAUO,SAASC,GAAKD,EAAQ,CAAC,EAAG,CAChC,OAAO,SAASE,EAAM,CAErB,YAAK,MAAM,QAAQ,KAAO,OAAO,OAAO,CACvC,UAAW,MACX,OAAQ,KACR,OAAS,CAACC,EAAEC,IAAM,CACjB,IAAMH,EAAO,KAAK,MAAM,QAAQ,KAC1BI,EAASJ,EAAK,OACpB,GAAI,CAACA,EAAK,OACT,MAAO,GAER,IAAMK,EAAYL,EAAK,eAAiBA,EAAK,WAAa,MACpDM,EAASD,GAAa,MAAQ,EAAI,GAClCE,EAAUF,GAAa,MAAQ,GAAK,EAC1C,OAAI,OAAOH,IAAIE,CAAM,EAAM,IACtB,OAAOD,IAAIC,CAAM,EAAM,IACnB,EAEDE,EAEJ,OAAOH,IAAIC,CAAM,EAAM,KAGvBF,EAAEE,CAAM,EAAED,EAAEC,CAAM,EACdG,EACGL,EAAEE,CAAM,EAAED,EAAEC,CAAM,EACrBE,EAEA,CAET,CACD,EAAGP,CAAO,EAGHS,EAAgB,IAAM,CAC5B,IAAMR,EAAO,KAAK,MAAM,QAAQ,KAC1BK,EAAYL,GAAM,eAAiBA,GAAM,UAC/C,GAAIA,GAAM,QAAUK,EAAW,CAG9B,IAAMI,EAAgBT,EAAK,OACrBU,EAASC,EAAIX,CAAI,EAAE,QAAUS,EACnC,OAAOR,EAAK,QAAQ,SAAS,CAAC,EAAGE,IAAMO,EAAO,KAAK,KAAM,EAAGP,CAAC,CAAC,CAC/D,CACA,OAAOF,EAAK,OACb,EAAG,EAAE,CACN,CACD,CAYO,SAASW,GAAOb,EAAQ,CAAC,EAAG,CAClC,OAAO,SAASE,EAAM,CAErB,YAAK,MAAM,QAAQ,OAAS,OAAO,OAAO,CACzC,KAAM,EACN,SAAU,GACV,IAAK,CACN,EAAGF,CAAO,EACHS,EAAgB,IACfK,EAAM,IAAM,CAClB,IAAMD,EAAS,KAAK,MAAM,QAAQ,OAC7BA,EAAO,WACXA,EAAO,SAAW,IAEnBA,EAAO,IAAM,KAAK,KAAKX,EAAK,QAAQ,OAASW,EAAO,QAAQ,EAC5DA,EAAO,KAAO,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAO,IAAKA,EAAO,IAAI,CAAC,EAE3D,IAAME,GAASF,EAAO,KAAK,GAAKA,EAAO,SACjCG,EAAMD,EAAQF,EAAO,SAC3B,OAAOX,EAAK,QAAQ,MAAMa,EAAOC,CAAG,CACrC,CAAC,EACC,EAAE,CACN,CACD,CAWO,SAASC,GAAOjB,EAAS,CAC/B,GAAI,CAACA,GAAS,MAAQ,OAAOA,EAAQ,MAAO,SAC3C,MAAM,IAAI,MAAM,6CAA6C,EAE9D,GAAI,CAACA,EAAQ,SAAW,OAAOA,EAAQ,SAAU,WAChD,MAAM,IAAI,MAAM,kDAAkD,EAEnE,OAAO,SAASE,EAAM,CACrB,GAAI,KAAK,MAAM,QAAQF,EAAQ,IAAI,EAClC,MAAM,IAAI,MAAM,sDAAsD,EAEvE,YAAK,MAAM,QAAQA,EAAQ,IAAI,EAAIA,EAC5BS,EAAgB,IAAM,CAC5B,IAAMS,EAAgB,KAAK,MAAM,QAAQlB,EAAQ,IAAI,EACrD,GAAIkB,EAAc,QAAS,CAK1B,IAAMC,EAAiBD,EAAc,QAC/BE,EAAUR,EAAIM,CAAa,EAAE,SAAWC,EAC9C,OAAOjB,EAAK,QAAQ,OAAOmB,GAAOD,EAAQ,KAAK,KAAMC,CAAG,CAAC,CAC1D,CACA,OAAOnB,EAAK,OACb,EAAG,EAAE,CACN,CACD,CAYO,SAASoB,GAAQtB,EAAQ,CAAC,EAAG,CACnC,IAAMuB,EAAgBvB,GAAS,SAAW,OAAOA,EAAQ,SAAY,SAClEA,EAAQ,QACRA,EACH,GAAI,CAACuB,GACD,OAAOA,GAAgB,UACvB,OAAO,KAAKA,CAAa,EAAE,SAAS,EACvC,MAAM,IAAI,MAAM,qEAAqE,EAEtF,OAAO,SAASrB,EAAM,CACrB,KAAK,MAAM,QAAQ,QAAUqB,EAC7B,IAAMC,EAAc,IAAI,QACxB,OAAOf,EAAgB,IAAM,CAC5B,IAAMgB,EAAc,CAAC,EACfC,EAAU,IAAI,IACdJ,EAAU,KAAK,MAAM,QAAQ,QAEnC,QAASK,KAAO,OAAO,KAAKL,CAAO,EAC9BA,EAAQK,CAAG,GAAG,UAAY,KAC7BF,EAAY,KAAKE,CAAG,EACpBD,EAAQ,IAAIC,CAAG,GAIjB,OAAOzB,EAAK,QAAQ,IAAI0B,GAAS,CAChC,IAAMC,EAASjB,EAAIgB,CAAK,EACpBE,EAASD,GAAU,OAAOA,GAAW,SACtCL,EAAY,IAAIK,CAAM,EACtB,KACEC,IACJA,EAAS,CAAC,EACND,GAAU,OAAOA,GAAW,UAC/BL,EAAY,IAAIK,EAAQC,CAAM,GAIhC,QAASH,KAAOF,EAAa,CAC5B,IAAMM,EAAQH,IAAQD,CAAG,GAAK,KAC1BG,EAAOH,CAAG,IAAMI,IACnBD,EAAOH,CAAG,EAAII,EAEhB,CACA,QAASJ,KAAO,OAAO,KAAKG,CAAM,EAC5BJ,EAAQ,IAAIC,CAAG,GACnB,OAAOG,EAAOH,CAAG,EAGnB,OAAOG,CACR,CAAC,CACF,EAAG,EAAE,CACN,CACD,CAkBO,SAASE,GAAOhC,EAAS,CAE/B,OAAO,SAASE,EAAM,CACrB,KAAK,MAAM,QAAQ,OAAS,OAAO,OAAO,CACzC,OAAQ,EACR,UAAW,GACX,SAAU,GACV,YAAa,EACb,KAAMA,EAAK,QAAQ,MACpB,EAAGF,CAAO,EACV,IAAMiC,EAAgB,KAAK,MAAM,QAAQ,OAEnCC,EAAYD,EAAc,WAC5BA,EAAc,WAAW,cAAc,uBAAuB,EAClE,OAAIC,IACCD,EAAc,WACjBA,EAAc,UAAU,iBAAiB,SAAWE,GAAQ,CAC3DF,EAAc,OAAS,KAAK,MAAMA,EAAc,UAAU,WACtDA,EAAc,UAAUA,EAAc,YAC1C,CACD,CAAC,EAGFxB,EAAgB,IAAM,CACrBwB,EAAc,KAAO/B,EAAK,QAAQ,OAAS+B,EAAc,UACzDC,EAAU,MAAM,OAASD,EAAc,KAAO,IAC/C,EAAG,EAAE,GAGCxB,EAAgB,IAAM,CACxBwB,EAAc,YAGjBA,EAAc,SAAW,KAAK,KAC7BA,EAAc,UAAU,sBAAsB,EAAE,OAC9CA,EAAc,SACjB,GAEDA,EAAc,KAAO/B,EAAK,QAC1B,IAAIa,EAAQ,KAAK,IAAIkB,EAAc,OAAQ/B,EAAK,QAAQ,OAAO,CAAC,EAC5Dc,EAAQD,EAAQkB,EAAc,SAClC,OAAIjB,EAAMd,EAAK,QAAQ,SACtBc,EAAQd,EAAK,QAAQ,OACrBa,EAAQC,EAAMiB,EAAc,UAEtB/B,EAAK,QAAQ,MAAMa,EAAOC,CAAG,CACrC,EAAG,EAAE,CACN,CACD,CC7TO,IAAMoB,GAAN,cAA2B,WAClC,CACI,aACA,CACI,MAAM,CACV,CAEA,mBACA,CACI,IAAIC,EAAa,KAAK,aAAa,KAAK,EACpCC,EAAW,SAAS,eAAeD,CAAU,EAEjD,GAAIC,EAAU,CACV,IAAIC,EAAUD,EAAS,QAAQ,UAAU,EAAI,EAC7C,QAAWE,KAAQD,EAAQ,WAAY,CACnC,IAAME,EAAQD,EAAK,UAAU,EAAI,EACjC,GAAIC,EAAM,UAAY,SAAS,eAC3BA,EAAM,iBAAiB,UAAU,EAAE,QAAQ,SAASC,EAAG,CACnDA,EAAE,aAAa,gBAAiB,EAAE,CACtC,CAAC,EACG,KAAK,YACL,QAAWC,KAAQ,KAAK,WAChBA,EAAK,MAAM,OACXF,EAAM,aAAaE,EAAK,KAAMA,EAAK,KAAK,EAKxD,KAAK,WAAW,aAAaF,EAAO,IAAI,CAC5C,CACA,KAAK,WAAW,YAAY,IAAI,CACpC,MACoB,IAAM,CAClB,IAAMG,EAAW,IAAI,iBAAiB,IAAM,CACxCN,EAAW,SAAS,eAAeD,CAAU,EACzCC,IACAM,EAAS,WAAW,EACpB,KAAK,YAAY,IAAI,EAE7B,CAAC,EACDA,EAAS,QAAQ,WAAW,SAAU,CAClC,QAAS,GACT,UAAW,EACf,CAAC,CACL,GAEQ,CAEhB,CACJ,EAEK,eAAe,IAAI,eAAe,GACnC,eAAe,OAAO,gBAAiBR,EAAY,ECtChD,SAASS,EAAQC,EAAMC,EAAS,CAAE,YAAAC,EAAc,EAAG,UAAAC,EAAY,CAAE,EAAI,CAAC,EAC7E,CACI,GAAIH,EAAK,OAASG,EACd,OAGJ,IAAIC,EACAC,EAAiB,IACrB,QAAWC,KAAUL,EAAS,CAC1B,IAAMM,EAAWC,GAAaR,EAAMM,EAAQJ,CAAW,EACnDK,EAAWF,IACXD,EAASE,EACTD,EAAiBE,EAEzB,CACA,OAAOF,GAAkBH,EAAcE,EAAS,MACpD,CAaO,SAASI,GAAaC,EAAGC,EAAGR,EAAc,EACjD,CACI,IAAMS,EAAST,EAAc,EAC7B,GAAI,KAAK,IAAIO,EAAE,OAASC,EAAE,MAAM,EAAIR,EAChC,OAAOS,EAGX,IAAMC,EAAW,MAAM,KAAK,CAAE,OAAQF,EAAE,OAAS,CAAE,EAAG,CAACG,EAAGC,IAAUA,CAAK,EACnEC,EAAU,IAAI,MAAML,EAAE,OAAS,CAAC,EAEtC,QAASM,EAAK,EAAGA,GAAMP,EAAE,OAAQO,IAAM,CACnCD,EAAQ,CAAC,EAAIC,EACb,QAASC,EAAK,EAAGA,GAAMP,EAAE,OAAQO,IAAM,CACnC,IAAMC,EAAOT,EAAEO,EAAK,CAAC,IAAMN,EAAEO,EAAK,CAAC,EAAI,EAAI,EAC3CF,EAAQE,CAAE,EAAI,KAAK,IACfL,EAASK,CAAE,EAAI,EACfF,EAAQE,EAAK,CAAC,EAAI,EAClBL,EAASK,EAAK,CAAC,EAAIC,CACvB,CACJ,CACAN,EAAS,OAAO,EAAGA,EAAS,OAAQ,GAAGG,CAAO,CAClD,CAEA,OAAOH,EAASF,EAAE,MAAM,CAC5B,CClEO,SAASS,GAAOC,EACvB,CACI,OAAO,IAAIC,GAAYD,CAAO,CAClC,CAEO,IAAMC,GAAN,KACP,CACI,YAAYD,EAAQ,CAAC,EACrB,CACI,KAAK,QAAUA,EACf,KAAK,QAAUA,EAAQ,SAAW,IAClC,KAAK,IAAMA,EAAQ,KAAO,CAAC,EAC3B,KAAK,gBAAkB,CAAC,CAACA,EAAQ,gBACjC,KAAK,WAAa,CAAC,CAACA,EAAQ,WAC5B,KAAK,YAAc,CAAC,CAACA,EAAQ,YAC7B,KAAK,MAAM,EACPA,EAAQ,QACR,KAAK,KAAKA,EAAQ,MAAM,CAEhC,CAEA,KAAKD,EACL,CACIG,GAAYH,EAAQ,KAAK,UAAW,KAAK,UAAU,CACvD,CAEA,OACA,CACI,KAAK,UAAY,CAAC,EAClB,KAAK,UAAY,CACb,MAAO,CAAC,EACR,KAAM,CAAC,EACP,KAAM,CAAC,EACP,OAAQ,CAAC,CACb,CACJ,CAEA,MAAMI,EAAMH,EACZ,CACI,IAAII,EAAO,CACP,KAAAD,EACA,QAAAH,CACJ,EACAI,EAAO,KAAK,aAAa,QAAQA,CAAI,EACrCD,EAAOC,EAAK,KAAOA,EAAK,KAAOD,EAE/B,IAAIE,EACJ,GAAKF,EASDE,EAAeC,GAAoBH,CAAI,MAThC,CACP,IAAMI,EAAc,SAAS,SAAS,SAAW,SAAS,SAAS,KAC/D,KAAK,IAAIA,CAAW,EACpBJ,EAAOI,EAEPJ,EAAO,SAAS,SAAS,SAE7BE,EAAe,IAAI,gBAAgB,SAAS,SAAS,MAAM,CAC/D,CAGAF,EAAOK,GAAQC,GAAUN,CAAI,EAAG,KAAK,OAAO,EAC5C,QAAUO,KAAS,KAAK,UAAW,CAC/B,IAAIC,EAASD,EAAM,QAAQ,MAAMP,CAAI,EACrC,GAAI,KAAK,iBAAmB,CAACQ,GACrBR,GAAQA,EAAKA,EAAK,OAAO,CAAC,GAAG,IAAK,CAClC,IAAMS,EAAgBT,EAAO,IAC7BQ,EAASD,EAAM,QAAQ,MAAME,CAAa,EACtCD,IACAR,EAAOS,EACP,QAAQ,aAAa,CAAC,EAAG,GAAIC,GAAOV,EAAM,KAAK,OAAO,CAAC,EAE/D,CAEJ,GAAIQ,EACA,cAAO,OAAOA,EAAQX,CAAO,EAC7BI,EAAK,MAAQM,EACbN,EAAK,OAASO,EACdP,EAAO,KAAK,aAAa,OAAQA,CAAI,EACrCO,EAASP,EAAK,OAASA,EAAK,OAASO,EACrCP,EAAK,aAAeC,EACpBD,EAAK,OAASU,GAAgB,KAAK,IAAKJ,EAAOC,EAAQN,CAAY,EACnE,KAAK,aAAa,SAAUD,CAAI,EACzBA,EAAK,MAEpB,CACA,MAAO,EACX,CAEA,aAAaW,EAAQJ,EACrB,CACI,GAAI,GAAC,KAAK,UAAUI,CAAM,GAAK,CAAC,OAAO,KAAK,KAAK,UAAUA,CAAM,CAAC,GAGlE,cAAO,KAAK,KAAK,UAAUA,CAAM,CAAC,EAAE,QAASL,GAAU,CAEnD,GADgBM,GAAoBN,CAAK,EAC7B,MAAMD,GAAUE,EAAO,IAAI,CAAC,EAAG,CACvC,IAAIM,EACJ,QAASC,KAAY,KAAK,UAAUH,CAAM,EAAEL,CAAK,EAC7CO,EAASC,EAAS,KAAK,KAAK,IAAKP,CAAM,EACnCM,IACAN,EAASM,EAGrB,CACJ,CAAC,EACMN,CACX,CAEA,cACA,CACI,KAAK,aAAa,EAClB,IAAMQ,EAAkB,IAAM,CAC1B,KAAK,MAAM,CACf,EACMC,EAAgBC,GAAQ,CAC1B,GAAI,CAAAA,EAAI,SAGJA,EAAI,OAAS,EAIjB,SADIC,EAAOD,EAAI,OACRC,GAAQA,EAAK,SAAS,KACzBA,EAAOA,EAAK,cAEhB,GAAIA,GACGA,EAAK,UACLA,EAAK,UAAU,WAAW,SAAS,UACnC,CAACA,EAAK,MACN,CAACA,EAAK,QAAQ,cACnB,CACE,IAAIC,EAAQ,CACR,CAAE,MAAOD,EAAK,KAAM,KAAMA,EAAK,IAAK,EACpC,CAAE,MAAOA,EAAK,SAAWA,EAAK,KAAM,KAAMA,EAAK,SAAWA,EAAK,OAASA,EAAK,IAAK,EAClF,CAAE,MAAOA,EAAK,SAAU,KAAMA,EAAK,SAAWA,EAAK,MAAO,CAC9D,EACIE,EACJ,GACIA,EAASD,EAAM,MAAM,EACrBC,EAAO,MAAQhB,GAAQgB,EAAO,MAAO,KAAK,OAAO,QAC7CD,EAAM,QAAU,CAAC,KAAK,IAAIC,EAAO,KAAK,GAC9C,GAAK,KAAK,IAAIA,EAAO,KAAK,EAAI,CAC1B,IAAIb,EAAS,KAAK,aAAa,OAAQ,CAAE,KAAMa,EAAO,IAAI,CAAC,EAC3D,GAAIb,EAAO,KAAM,CACb,IAAMc,EAAa,KAAK,KAAKd,EAAO,IAAI,EACxC,GAAI,CAACc,GAAe,KAAK,QAAQ,aAAeA,IAAa,GAEzD,OAAAJ,EAAI,eAAe,EACZ,EAEf,CACJ,CACJ,EACJ,EACA,WAAW,iBAAiB,WAAYF,CAAe,EACvD,KAAK,IAAI,UAAU,iBAAiB,QAASC,CAAY,EACzD,KAAK,cAAgB,CACjB,UAAW,KAAK,IAAI,UACpB,gBAAAD,EACA,aAAAC,CACJ,CACJ,CAEA,cACA,CACS,KAAK,gBAGV,WAAW,oBAAoB,WAAY,KAAK,cAAc,eAAe,EAC7E,KAAK,cAAc,UAAU,oBAAoB,QAAS,KAAK,cAAc,YAAY,EACzF,KAAK,cAAgB,OACzB,CAEA,SACA,CACI,KAAK,aAAa,CACtB,CAEA,KAAKjB,EACL,CACI,eAAQ,UAAU,CAAC,EAAE,GAAGU,GAAOV,EAAM,KAAK,OAAO,CAAC,EAC3C,KAAK,MAAMA,CAAI,CAC1B,CAEA,IAAIA,EACJ,CACIA,EAAOK,GAAQC,GAAUN,CAAI,EAAG,KAAK,OAAO,EAC5C,QAASO,KAAS,KAAK,UACnB,GAAIA,EAAM,QAAQ,MAAMP,CAAI,EACxB,MAAO,GAGf,MAAO,EACX,CAEA,YAAYY,EAAQL,EAAOQ,EAC3B,CACI,GAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ,EAAE,QAAQH,CAAM,GAAG,GAClD,MAAM,IAAI,UAAU,4CAA4CA,CAAM,GAAG,EAExE,KAAK,UAAUA,CAAM,EAAEL,CAAK,IAC7B,KAAK,UAAUK,CAAM,EAAEL,CAAK,EAAI,CAAC,GAErC,KAAK,UAAUK,CAAM,EAAEL,CAAK,EAAE,KAAKQ,CAAQ,CAC/C,CAEA,eAAeH,EAAQL,EAAOQ,EAC9B,CACI,GAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ,EAAE,QAAQH,CAAM,GAAG,GAClD,MAAM,IAAI,UAAU,4CAA4CA,CAAM,GAAG,EAExE,KAAK,UAAUA,CAAM,EAAEL,CAAK,IAGjC,KAAK,UAAUK,CAAM,EAAEL,CAAK,EAAI,KAAK,UAAUK,CAAM,EAAEL,CAAK,EAAE,OAAQgB,GAC3DA,GAAYR,CACtB,EACL,CAEA,KAAKlB,EACL,CACQA,EAAQ,UACR,KAAK,QAAUA,EAAQ,QAE/B,CACJ,EAEA,SAASc,GAAgBa,EAAKjB,EAAOC,EAAQN,EAC7C,CACI,GAAI,OAAOK,EAAM,QAAW,WACxB,OAAOA,EAAM,OAAO,KAAKiB,EAAKhB,EAAQN,CAAY,EAGtD,GAAI,OAAOK,EAAM,QAAW,SAAU,CAClC,IAAMK,EAASY,EAAI,UAAUjB,EAAM,MAAM,EACzC,GAAI,OAAOK,GAAW,WAClB,OAAOA,EAAO,KAAKY,EAAKC,GAAkBlB,EAAOC,EAAQN,CAAY,CAAC,EAE1E,MAAMwB,GAAwBnB,EAAOiB,EAAI,OAAO,CACpD,CAEA,MAAM,IAAI,UAAU,4BAA4BjB,EAAM,IAAI,sCAAsC,CACpG,CAEA,IAAMoB,GAA4B,IAAI,IAEtC,SAASF,GAAkBlB,EAAOC,EAAQN,EAC1C,CACI,IAAM0B,EAAQC,GAAY3B,CAAY,EACtC,QAAW4B,KAAO,OAAO,KAAKF,CAAK,EAC3B,OAAO,OAAOpB,EAAQsB,CAAG,GACzBC,GAAuBxB,EAAOuB,CAAG,EAKzC,OAAO,OAAO,OAAOF,EAAOpB,CAAM,CACtC,CAEA,SAASqB,GAAY3B,EACrB,CACI,IAAMM,EAAS,CAAC,EAChB,OAAW,CAACsB,EAAKE,CAAK,IAAK9B,EAAa,QAAQ,EACvC,OAAO,OAAOM,EAAQsB,CAAG,EAEnB,MAAM,QAAQtB,EAAOsB,CAAG,CAAC,EAChCtB,EAAOsB,CAAG,EAAE,KAAKE,CAAK,EAEtBxB,EAAOsB,CAAG,EAAI,CAACtB,EAAOsB,CAAG,EAAGE,CAAK,EAJjCxB,EAAOsB,CAAG,EAAIE,EAOtB,OAAOxB,CACX,CAEA,SAASuB,GAAuBxB,EAAOuB,EACvC,CACI,IAAMG,EAAa,GAAG1B,EAAM,IAAI,KAAKuB,CAAG,GACpCH,GAA0B,IAAIM,CAAU,IAG5CN,GAA0B,IAAIM,CAAU,EACxC,QAAQ,KAAK,sCAAsCH,CAAG,gCAAgCvB,EAAM,IAAI,sDAAsD,EAC1J,CAEA,SAASmB,GAAwBnB,EAAO2B,EACxC,CACI,IAAMC,EAAaC,EAAQ7B,EAAM,OAAQ,OAAO,KAAK2B,GAAW,CAAC,CAAC,CAAC,EAC7DG,EAAOF,EAAa,kBAAkBA,CAAU,KAAO,GAC7D,OAAO,IAAI,UAAU,4BAA4B5B,EAAM,IAAI,0BAA0BA,EAAM,MAAM,KAAK8B,CAAI,EAAE,CAChH,CAEA,SAASlC,GAAoBH,EAC7B,CACI,IAAMsC,EAAQ,OAAOtC,GAAS,SAAWA,EAAK,QAAQ,GAAG,EAAI,GAC7D,GAAIsC,IAAU,GACV,OAAO,IAAI,gBAEf,IAAMC,EAAYvC,EAAK,QAAQ,IAAKsC,CAAK,EACnCE,EAASD,IAAc,GAAKvC,EAAK,UAAUsC,CAAK,EAAItC,EAAK,UAAUsC,EAAOC,CAAS,EACzF,OAAO,IAAI,gBAAgBC,CAAM,CACrC,CAEA,SAASlC,GAAUN,EACnB,CACI,IAAMsC,EAAQ,OAAOtC,GAAS,SAAWA,EAAK,QAAQ,GAAG,EAAI,GAC7D,GAAIsC,IAAU,GACV,OAAOtC,EAEX,IAAMuC,EAAYvC,EAAK,QAAQ,IAAKsC,CAAK,EACzC,OAAIC,IAAc,GACPvC,EAAK,UAAU,EAAGsC,CAAK,EAE3BtC,EAAK,UAAU,EAAGsC,CAAK,EAAItC,EAAK,UAAUuC,CAAS,CAC9D,CAEA,SAASlC,GAAQL,EAAMyC,EAAQ,IAC/B,CACI,OAAIzC,EAAK,UAAU,EAAEyC,EAAQ,MAAM,GAAGA,GAEhCA,EAAQA,EAAQ,OAAO,CAAC,GAAG,KACtBzC,EAAK,QAASyC,EAAQ,OAAO,GAC7BzC,GAAQyC,EAAQ,UAAU,EAAEzC,EAAK,MAAM,KAG9CA,EAAOA,EAAK,UAAUyC,EAAQ,MAAM,GAEpCzC,EAAK,CAAC,GAAG,MACTA,EAAO,IAAIA,GAERA,CACX,CAEA,SAASU,GAAOV,EAAMyC,EACtB,CAKI,OAJAzC,EAAOK,GAAQL,EAAMyC,CAAO,EACxBA,EAAQA,EAAQ,OAAO,CAAC,IAAI,KAAOzC,EAAK,CAAC,IAAI,MAC7CA,EAAOA,EAAK,UAAU,CAAC,GAEvBA,EAAK,CAAC,GAAG,IACFA,EAEJyC,EAAUzC,CACrB,CAEA,SAASa,GAAoBb,EAAM0C,EAAM,GACzC,CACI,IAAMlC,EAAS,CAAC,EACVmC,EAASC,GAAY5C,EAAM0C,EAAOlC,CAAM,EAC9C,MAAO,CACH,KAAAR,EACA,OAAAQ,EACA,OAAAmC,EACA,MAAMX,EAAO,CACT,IAAMa,EAAUF,EAAO,KAAKX,CAAK,EACjC,GAAI,CAACa,EACD,OAAO,KAEX,IAAM/B,EAAS,CAAC,EAChB,OAAAN,EAAO,QAAQ,CAACsC,EAAMC,IAAM,CACxBjC,EAAOgC,CAAI,EAAID,EAAQE,EAAI,CAAC,CAChC,CAAC,EACMjC,CACX,CACJ,CACJ,CAEA,SAAS8B,GAAYrC,EAAOmC,EAAM,GAAOlC,EAAO,CAAC,EACjD,CACI,GAAID,EAAM,SAAS,IAAI,EACnB,MAAM,IAAI,UAAU,4BAA4BA,CAAK,kFAAkF,EAE3I,IAAMyC,EAASzC,EAAM,CAAC,IAAM,IAAM,GAAK,IACjC0C,EAASP,EAAQ,IAAM,GAC7B,OAAO,IAAI,OAAOM,EAASE,GAAkB3C,EAAOC,CAAM,EAAIyC,CAAM,CACxE,CAEA,SAASC,GAAkB3C,EAAOC,EAClC,CACI,IAAI2C,EAAS,GACTb,EAAQ,EACZ,KAAOA,EAAQ/B,EAAM,QAAQ,CACzB,GAAIA,EAAM+B,CAAK,IAAM,IAAK,CACtB,IAAMc,EAAQ,kCAAkC,KAAK7C,EAAM,UAAU+B,CAAK,CAAC,EAC3E,GAAI,CAACc,EACD,MAAM,IAAI,UAAU,iDAAiD7C,CAAK,GAAG,EAEjFC,EAAO,KAAK4C,EAAM,CAAC,CAAC,EACpBD,GAAUC,EAAM,CAAC,EAAI,OAAS,UAC9Bd,GAASc,EAAM,CAAC,EAAE,OAClB,QACJ,CACA,GAAI7C,EAAM+B,CAAK,IAAM,IAAK,CACtBa,GAAU,KACVb,IACA,QACJ,CACAa,GAAUE,GAAa9C,EAAM+B,CAAK,CAAC,EACnCA,GACJ,CACA,OAAOa,CACX,CAEA,SAASE,GAAarB,EACtB,CACI,OAAOA,EAAM,QAAQ,sBAAuB,MAAM,CACtD,CAEA,SAASjC,GAAYH,EAAQ0D,EAAWZ,EAAM,GAC9C,CACI,IAAMa,EAAQ,OAAO,KAAK3D,CAAM,EAChC,QAASI,KAAQuD,EACbD,EAAU,KAAK,CACX,KAAAtD,EACA,QAASa,GAAoBb,EAAM0C,CAAK,EACxC,OAAQ9C,EAAOI,CAAI,CACvB,CAAC,EAEL,OAAOsD,CACX,CCjaA,IAAME,EAAO,CACZ,IAAIC,EAASC,EAAS,CACrB,OAAI,OAAOA,GAAY,SACfA,EAEHA,EAGEA,EAAQ,MAAM,GAAG,EAAE,OAAO,SAASC,EAAKC,EAAM,CAI9C,OAHID,GAAO,MAGP,CAAC,QAAQ,IAAI,OAAOA,CAAG,EAAGC,CAAI,EACvB,KAEJD,EAAIC,CAAI,CACnB,EAAGH,CAAO,EAVLA,CAWT,EACA,IAAK,SAASA,EAASC,EAASG,EAAO,CACtC,IAAMC,EAASN,EAAK,IAAIC,EAASD,EAAK,OAAOE,CAAO,CAAC,EACrD,GAAII,GAAU,KACb,MAAM,IAAI,UAAU,gCAAgCJ,CAAO,0CAA0C,EAEtGI,EAAON,EAAK,IAAIE,CAAO,CAAC,EAAIG,CAC7B,EACA,IAAK,SAASH,EAAS,CACtB,OAAOA,EAAQ,MAAM,GAAG,EAAE,IAAI,CAC/B,EACA,KAAM,SAASA,EAASE,EAAM,CAC7B,OAAQF,EAAUA,EAAU,IAAM,IAAME,CACzC,EACA,OAAQ,SAASF,EAAS,CACzB,IAAMK,EAAQL,EAAQ,MAAM,GAAG,EAC/B,OAAAK,EAAM,IAAI,EACHA,EAAM,KAAK,GAAG,CACtB,EACA,QAAS,SAASN,EAASC,EAAS,CACnC,IAAIM,EAAS,CAAC,EACd,KAAON,GACNA,EAAUF,EAAK,OAAOE,CAAO,EAC7BM,EAAO,QAAQN,CAAO,EAEvB,OAAOM,CACR,CACD,EAEOC,GAAQT,EC3Cf,IAAMU,GAAe,IAAI,QACnBC,GAAkB,CACpB,WACA,WACA,MACA,WACJ,EAEMC,GAAN,KAAqB,CACpB,YAAYC,EAAQ,CAAC,EAAG,CAClBA,EAAQ,MACZA,EAAQ,IAAM,CAAC,GAEXA,EAAQ,IAAI,YAChBA,EAAQ,IAAI,UAAY,SAAS,MAE5B,KAAK,IAAMA,EAAQ,IACzB,KAAK,UAAYA,EAAQ,UAAYC,GAC3BD,EAAQ,UACd,OAAO,OAAO,KAAMA,EAAQ,QAAQ,EAGxC,IAAME,EAAkBC,GAAQ,CAC/B,IAAMC,EAAUC,GAAWF,EAAK,KAAK,UAAW,KAAK,GAAG,EACxD,GAAI,CAACC,EACJ,OAED,GAAI,CAAC,KAAKA,EAAQ,IAAI,EAAG,CACZE,GAAmB,KAAMF,EAAQ,KAAMA,EAAQ,MAAM,EACrD,MACb,CAES,GADuB,KAAKA,EAAQ,IAAI,EAAE,KAAKJ,EAAQ,IAAKI,EAAQ,OAAQA,EAAQ,MAAOD,CAAG,IACzE,GACjB,OAAAA,EAAI,eAAe,EACnBA,EAAI,gBAAgB,EACb,EAErB,EAEYI,EAAYP,EAAQ,IAAI,UAC9BO,EAAU,iBAAiB,QAASL,CAAc,EAClDK,EAAU,iBAAiB,SAAUL,CAAc,EACnDK,EAAU,iBAAiB,SAAUL,CAAc,EACnDK,EAAU,iBAAiB,QAASL,CAAc,EAClDL,GAAa,IAAI,KAAM,CAAE,UAAAU,EAAW,eAAAL,CAAe,CAAC,CAC3D,CAEG,KAAKE,EAASI,EAAIC,EAAOC,EAAO,CAC5B,GAAI,CAAC,KAAKN,CAAO,EAAG,CAChBE,GAAmB,KAAMF,EAASI,CAAE,EACpC,MACJ,CACA,OAAO,KAAKJ,CAAO,EAAE,KAAK,KAAK,IAAKI,EAAIC,EAAOC,CAAK,CACxD,CAEA,cAAcC,EAAS,CACnB,KAAK,UAAU,KAAKA,CAAO,CAC/B,CAEA,eAAeA,EAAS,CACpB,KAAK,UAAU,QAAQA,CAAO,CAClC,CACJ,EAEO,SAASC,GAASZ,EAAQ,CAAC,EAAG,CACpC,OAAO,IAAID,GAAeC,CAAO,CAClC,CAEO,SAASa,GAAgBC,EAChC,CACI,IAAMC,EAAQlB,GAAa,IAAIiB,CAAU,EACpCC,IAGLA,EAAM,UAAU,oBAAoB,QAASA,EAAM,cAAc,EACjEA,EAAM,UAAU,oBAAoB,SAAUA,EAAM,cAAc,EAClEA,EAAM,UAAU,oBAAoB,SAAUA,EAAM,cAAc,EAClEA,EAAM,UAAU,oBAAoB,QAASA,EAAM,cAAc,EACjElB,GAAa,OAAOiB,CAAU,EAClC,CAEA,SAAST,GAAWF,EAAKa,EAAUC,EAAK,CACpC,IAAIT,EAAKL,EAAI,OAAO,QAAQ,uBAAuB,EACnD,GAAIK,GACA,QAASG,KAAWK,EAChB,GAAIR,EAAG,QAAQG,EAAQ,KAAK,EACxB,OAAIA,EAAQ,MAAMH,EAAIL,CAAG,EACd,CACH,KAAQK,EAAG,QAAQ,cACnB,OAAQA,EACR,MAAQG,EAAQ,IAAIH,EAAIS,CAAG,CAC/B,EAEG,KAInB,OAAO,IACX,CAGA,SAASC,GAA0BV,EAAIS,EACvC,CACI,IAAME,EAAgB,kBACtB,OAAI,OAAO,OAAOX,EAAG,QAASW,CAAa,EAChC,CACH,MAAO,GACP,MAAOC,GAAK,IAAIH,GAAK,KAAMT,EAAG,QAAQW,CAAa,CAAC,CACxD,EAEA,OAAO,OAAOX,EAAG,QAAS,aAAa,EAChC,CAAE,MAAO,GAAM,MAAOA,EAAG,QAAQ,WAAY,EAEjD,CAAE,MAAO,GAAO,MAAO,MAAU,CAC5C,CAEA,IAAMP,GAAkB,CACpB,CACI,MAAO,wBACP,IAAK,SAASO,EAAIS,EAAK,CACnB,IAAMI,EAAkBH,GAA0BV,EAAIS,CAAG,EACzD,GAAII,EAAgB,MAChB,OAAOA,EAAgB,MAE3B,GAAIb,EAAG,UAAU,UAAYA,EAAG,SAAU,CACtC,IAAIc,EAAS,CAAC,EACd,QAASC,KAAUf,EAAG,QACde,EAAO,UACPD,EAAO,KAAKC,EAAO,KAAK,EAGhC,OAAOD,CACX,CACA,OAAOd,EAAG,KACd,EACA,MAAO,SAASA,EAAIL,EAAK,CACrB,OAAOA,EAAI,MAAM,UAAaK,EAAG,QAAQ,iBAAmBL,EAAI,MAAM,OAC1E,CACJ,EACA,CACI,MAAO,WACP,IAAK,SAASK,EAAIS,EAAK,CACnB,IAAMI,EAAkBH,GAA0BV,EAAIS,CAAG,EACzD,OAAII,EAAgB,MACTA,EAAgB,MAEpBb,EAAG,MAAQA,EAAG,KACzB,EACA,MAAO,SAASA,EAAGL,EAAK,CACpB,OAAOA,EAAI,MAAM,SAAWA,EAAI,SAAS,IAASA,EAAI,QAAQ,CAClE,CACJ,EACA,CACI,MAAO,OACP,IAAK,SAASK,EAAI,CACd,IAAIgB,EAAO,CAAC,EACZ,QAASC,KAAS,MAAM,KAAKjB,EAAG,QAAQ,EAAG,CACvC,GAAIiB,EAAM,SAAS,UACXA,EAAM,MAAM,YAAcA,EAAM,MAAM,UAEtC,CAACA,EAAM,QACP,OAGJD,EAAKC,EAAM,IAAI,GAAK,CAAC,MAAM,QAAQD,EAAKC,EAAM,IAAI,CAAC,IACnDD,EAAKC,EAAM,IAAI,EAAI,CAACD,EAAKC,EAAM,IAAI,CAAC,GAEpC,MAAM,QAAQD,EAAKC,EAAM,IAAI,CAAC,EAC9BD,EAAKC,EAAM,IAAI,EAAE,KAAKA,EAAM,KAAK,EAEjCD,EAAKC,EAAM,IAAI,EAAIA,EAAM,KAEjC,CACA,OAAOD,CACX,EACA,MAAO,SAAShB,EAAGL,EAAK,CACpB,OAAOA,EAAI,MAAM,QACrB,CACJ,EACA,CACC,MAAO,IACJ,IAAK,SAASK,EAAIS,EAAK,CACnB,OAAOC,GAA0BV,EAAIS,CAAG,EAAE,KAC9C,EACA,MAAO,SAAST,EAAIL,EAAK,CACrB,OAAOA,EAAI,MAAM,SAAWA,EAAI,SAAS,IAASA,EAAI,QAAQ,CAClE,CACJ,CACJ,EAEMuB,GAAyB,IAAI,QAEnC,SAASpB,GAAmBM,EAAUR,EAASuB,EAC/C,CACI,IAAIC,EAASF,GAAuB,IAAId,CAAQ,EAKhD,GAJKgB,IACDA,EAAS,IAAI,IACbF,GAAuB,IAAId,EAAUgB,CAAM,GAE3CA,EAAO,IAAIxB,CAAO,EAClB,OAEJwB,EAAO,IAAIxB,CAAO,EAElB,IAAMyB,EAAaC,EAAQ1B,EAAS2B,GAAanB,CAAQ,CAAC,EACpDoB,EAASH,EAAa,mBAAmBA,CAAU,KAAO,GAC5DF,EACA,QAAQ,KAAK,wCAAwCvB,CAAO,IAAI4B,CAAM,GAAI,CAAE,MAAOL,CAAO,CAAC,EAE3F,QAAQ,KAAK,wCAAwCvB,CAAO,IAAI4B,CAAM,EAAE,CAEhF,CAEA,SAASD,GAAanB,EACtB,CACI,OAAO,OAAO,KAAKA,CAAQ,EAAE,OAAOR,GACzB,CAACA,EAAQ,WAAW,GAAG,GAC1B,CAACN,GAAgB,SAASM,CAAO,GACjC,OAAOQ,EAASR,CAAO,GAAM,UACpC,CACL,CC7NA,IAAM6B,GAAuB,IAAI,QAE1B,SAASC,GAAQC,EACxB,CACC,GAAIA,EAAQ,IAAK,CAChB,IAAMC,EAAkB,CACvB,MAAMC,EAAQC,EAASC,EACvB,CACC,GAAI,CACH,IAAMC,EAASH,EAAO,GAAGE,CAAa,EACtC,OAAIC,aAAkB,QACdA,EAAO,MAAMC,GACZN,EAAQ,IAAI,QAAQ,KAAK,KAAMM,EAAKJ,CAAM,CACjD,EAEKG,CACR,OAAQC,EAAK,CACZ,OAAON,EAAQ,IAAI,QAAQ,KAAK,KAAMM,EAAKJ,CAAM,CAClD,CACD,CACD,EAEMK,EAAgB,CACrB,IAAIL,EAAQM,EACZ,CACC,GAAI,CAAC,OAAO,OAAON,EAAQM,CAAQ,EAAG,CACrCC,GAAkBP,EAAQM,CAAQ,EAClC,MACD,CACA,OAAIR,EAAQ,IAAI,QACR,IAAI,MAAME,EAAOM,CAAQ,EAAE,KAAKR,EAAQ,GAAG,EAAGC,CAAe,EAE7DC,EAAOM,CAAQ,EAAE,KAAKR,EAAQ,GAAG,CAE1C,CACD,EACA,OAAO,IAAI,MAAMA,EAAQ,QAASO,CAAa,CAChD,KACC,QAAOP,CAET,CAEA,SAASS,GAAkBV,EAASS,EACpC,CACC,GAAI,OAAOA,GAAa,SACvB,OAGD,IAAIE,EAASZ,GAAqB,IAAIC,CAAO,EAK7C,GAJKW,IACJA,EAAS,IAAI,IACbZ,GAAqB,IAAIC,EAASW,CAAM,GAErCA,EAAO,IAAIF,CAAQ,EACtB,OAEDE,EAAO,IAAIF,CAAQ,EAEnB,IAAMG,EAAaC,EAAQJ,EAAU,OAAO,KAAKT,CAAO,CAAC,EACnDc,EAASF,EAAa,mBAAmBA,CAAU,KAAO,GAChE,QAAQ,KAAK,sCAAsCH,CAAQ,IAAIK,CAAM,EAAE,CACxE,CC/DA,IAAMC,GAAgB,IAAI,QACpBC,GAAiB,IAAI,QAErBC,EAAM,OAAO,OAAO,CACzB,QAAS,IACT,QAAS,GACT,KAAS,IACT,IAAS,GACT,MAAS,EACV,CAAC,EAEKC,GAAN,KACA,CACC,YAAYC,EAAU,CAAC,EACvB,CACMA,EAAQ,MACZA,EAAQ,IAAM,CAAC,GAEXA,EAAQ,IAAI,YAChBA,EAAQ,IAAI,UAAY,SAAS,MAElC,OAAO,OAAO,KAAMA,EAAQ,SAAS,EAErC,IAAMC,EAAcC,GAAM,CACzB,IAAIC,EAAiB,CAAC,EAClBC,EAAkBF,EAAE,OAAO,QAAQ,yBAAyB,EAChE,KAAOE,GACND,EAAe,KAAKC,EAAgB,QAAQ,eAAe,EAC3DA,EAAkBA,EAAgB,WAAW,QAAQ,yBAAyB,EAE3ED,EAAeA,EAAe,OAAO,CAAC,GAAG,WAC5CA,EAAe,KAAK,SAAS,EAG9B,IAAIE,EACAC,EAAa,CAAC,IAAI,GAAG,EAEzB,QAASC,KAAaD,EAAY,CACjC,IAAME,EAAYC,GAAaP,EAAGK,CAAS,EAC3C,QAASG,KAAKP,EAAgB,CAE7B,GADAE,EAAgBF,EAAeO,CAAC,EAC5B,KAAKL,CAAa,GAAM,OAAO,KAAKA,CAAa,EAAEG,CAAS,GAAG,YAE9D,CADY,KAAKH,CAAa,EAAEG,CAAS,EAAE,KAAKR,EAAQ,IAAKE,CAAC,EAClD,CACfA,EAAE,eAAe,EACjB,MACD,CAED,GAAI,OAAO,KAAKG,EAAgB,IAAMG,CAAS,GAAK,YAE/C,CADY,KAAKH,EAAgB,IAAMG,CAAS,EAAE,KAAKR,EAAQ,IAAKE,CAAC,EACzD,CACfA,EAAE,eAAe,EACjB,MACD,CAED,GAAI,OAAO,KAAKM,CAAS,GAAK,YAEzB,CADY,KAAKA,CAAS,EAAE,KAAKR,EAAQ,IAAKE,CAAC,EACnC,CACfA,EAAE,eAAe,EACjB,MACD,CAEF,CACD,CACD,EAEMS,EAAYX,EAAQ,IAAI,UAC9BW,EAAU,iBAAiB,UAAWV,CAAU,EAChDL,GAAc,IAAI,KAAM,CAAE,UAAAe,EAAW,WAAAV,CAAW,CAAC,CAClD,CACD,EAEA,SAASQ,GAAa,EAAGF,EAAU,IACnC,CAOC,GANI,EAAE,aAAe,EAAE,UAAYT,EAAI,SAGnC,EAAE,kBAGF,CAAC,EAAE,OACH,OAGJ,IAAIc,EAAiB,CAAC,EACtB,OAAI,EAAE,SAAW,EAAE,SAASd,EAAI,SAC5Bc,EAAe,KAAK,SAAS,EAE7B,EAAE,SAAW,EAAE,SAASd,EAAI,MAC5Bc,EAAe,KAAK,MAAM,EAE1B,EAAE,QAAU,EAAE,SAASd,EAAI,KAC3Bc,EAAe,KAAK,KAAK,EAEzB,EAAE,UAAY,EAAE,SAASd,EAAI,OAC7Bc,EAAe,KAAK,OAAO,EAE/BA,EAAe,KAAK,EAAE,IAAI,YAAY,CAAC,EAChCA,EAAe,KAAKL,CAAS,CACrC,CAEO,SAASM,GAAUb,EAAQ,CAAC,EACnC,CACC,OAAO,IAAID,GAAgBC,CAAO,CACnC,CAEO,SAASc,GAAiBC,EACjC,CACC,IAAMC,EAAQpB,GAAc,IAAImB,CAAW,EACtCC,IAGLA,EAAM,UAAU,oBAAoB,UAAWA,EAAM,UAAU,EAC/DpB,GAAc,OAAOmB,CAAW,EACjC,CAEO,SAASE,GAAWjB,EAAQ,CAAC,EAAG,CACtC,IAAMW,EAAYX,EAAQ,WAAaA,EAAQ,KAAK,WAAa,SAAS,KACpEC,EAAcC,GAAM,CACzB,IAAMI,EAAa,CAAC,IAAK,GAAG,EAC5B,QAAWC,KAAaD,EAAY,CAEnC,IAAMY,EAAW,2BADCT,GAAaP,EAAGK,CAAS,EACe,KACpDY,EAAUR,EAAU,iBAAiBO,CAAQ,EAC/CC,EAAQ,QACXA,EAAQ,QAAQ,SAASC,EAAQ,CAChCA,EAAO,MAAM,CACd,CAAC,CAEH,CACD,EACAT,EAAU,iBAAiB,UAAWV,CAAU,EAChD,IAAMoB,EAAa,CAAC,EACpB,OAAAxB,GAAe,IAAIwB,EAAY,CAAE,UAAAV,EAAW,WAAAV,CAAW,CAAC,EACjDoB,CACR,CAEO,SAASC,GAAkBC,EAClC,CACC,IAAMP,EAAQnB,GAAe,IAAI0B,CAAY,EACxCP,IAGLA,EAAM,UAAU,oBAAoB,UAAWA,EAAM,UAAU,EAC/DnB,GAAe,OAAO0B,CAAY,EACnC,CC/IA,IAAMC,GAAoB,yBAEpBC,GAAN,KACA,CACI,YAAYC,EAAU,CAAC,EACvB,CACI,KAAK,IAAMA,EAAQ,IACnB,KAAK,UAAYA,EAAQ,WAAa,SAAS,KAC/C,KAAK,UAAYA,EAAQ,WAAa,CAAC,EACvC,KAAK,OAAS,IAAI,IAClB,KAAK,SAAW,IAAI,QACpB,KAAK,QAAU,IAAI,IAEnB,KAAK,SAAW,IAAI,iBAAkBC,GAAY,KAAK,cAAcA,CAAO,CAAC,EAC7E,KAAK,SAAS,QAAQ,KAAK,UAAW,CAClC,QAAS,GACT,UAAW,EACf,CAAC,EAED,QAAWC,KAAQC,GAAc,KAAK,SAAS,EAC3C,KAAK,MAAMD,CAAI,CAEvB,CAEA,MAAMA,EACN,CACI,GAAI,KAAK,OAAO,IAAIA,CAAI,EACpB,OAGJ,IAAME,EAAOF,GAAM,SAAS,eACtBG,EAAW,KAAK,UAAUD,CAAI,EACpC,GAAI,CAACA,GAAQ,OAAOC,GAAa,WAAY,CACzC,KAAK,YAAYD,EAAMF,CAAI,EAC3B,MACJ,CAEA,KAAK,OAAO,IAAIA,CAAI,EACpB,IAAMI,EAAUD,EAAS,KAAK,KAAK,KAAOH,EAAMA,CAAI,EAChD,OAAOI,GAAY,WACnB,KAAK,SAAS,IAAIJ,EAAMI,CAAO,EACxB,OAAOA,EAAY,KAC1B,QAAQ,KAAK,mEAAoE,CAAE,MAAOA,CAAQ,CAAC,CAE3G,CAEA,KAAKJ,EACL,CACI,GAAI,CAAC,KAAK,OAAO,IAAIA,CAAI,EACrB,OAEJ,KAAK,OAAO,OAAOA,CAAI,EAEvB,IAAMI,EAAU,KAAK,SAAS,IAAIJ,CAAI,EACtC,KAAK,SAAS,OAAOA,CAAI,EACrBI,GACAA,EAAQ,KAAK,KAAK,KAAOJ,EAAMA,CAAI,CAE3C,CAEA,cAAcD,EACd,CACI,IAAMM,EAAQ,CAAC,EACf,QAAWC,KAAUP,EACjB,GAAIO,EAAO,OAAS,YAGpB,SAAWN,KAAQM,EAAO,aACtB,QAAWC,KAAgBN,GAAcD,CAAI,EACzC,KAAK,KAAKO,CAAY,EAG9B,QAAWP,KAAQM,EAAO,WACtBD,EAAM,KAAK,GAAGJ,GAAcD,CAAI,CAAC,EAGzC,QAAWA,KAAQK,EACf,KAAK,MAAML,CAAI,CAEvB,CAEA,YAAYE,EAAMF,EAClB,CACI,GAAI,CAACE,GAAQ,KAAK,QAAQ,IAAIA,CAAI,EAC9B,OAEJ,KAAK,QAAQ,IAAIA,CAAI,EAErB,IAAMM,EAAaC,EAAQP,EAAM,OAAO,KAAK,KAAK,SAAS,CAAC,EACtDQ,EAASF,EAAa,mBAAmBA,CAAU,KAAO,GAChE,QAAQ,KAAK,0CAA0CN,CAAI,IAAIQ,CAAM,GAAI,CAAE,MAAOV,CAAK,CAAC,CAC5F,CAEA,SACA,CACI,KAAK,SAAS,WAAW,EACzB,QAAWA,KAAQ,MAAM,KAAK,KAAK,MAAM,EACrC,KAAK,KAAKA,CAAI,CAEtB,CACJ,EAEO,SAASW,GAAUb,EAAU,CAAC,EACrC,CACI,OAAO,IAAID,GAAgBC,CAAO,CACtC,CAEA,SAASG,GAAcW,EACvB,CACI,GAAI,CAACA,GAAM,iBACP,MAAO,CAAC,EAGZ,IAAMC,EAAQ,MAAM,KAAKD,EAAK,iBAAiBhB,EAAiB,CAAC,EACjE,OAAIgB,EAAK,UAAUhB,EAAiB,GAChCiB,EAAM,QAAQD,CAAI,EAEfC,CACX,CCxHA,SAASC,GAASC,EAAkBC,EACpC,CACI,IAAIC,EAAU,EACd,OAAO,YAA8BC,EAAQ,CACrCD,IAGJA,EAAU,WAAW,WAAW,IAAM,CAClCA,EAAU,EACVF,EAAiB,MAAM,KAAMG,CAAM,CACvC,EAAGF,CAAY,EACnB,CACJ,CAEA,IAAMG,GACE,WAAW,oBACHC,GAAa,CACjB,WAAW,oBAAoBA,EAAU,CAAC,QAAS,GAAG,CAAC,CAC3D,EAEG,WAAW,wBAA2BA,GAAa,WAAW,WAAWA,EAAU,CAAC,GAG/F,SAASC,GAAWC,EAAUC,EAAMC,EACpC,CACI,IAAMC,EAAM,IAAI,IAAIH,EAAUC,CAAI,EAClC,OAAIC,GACAC,EAAI,aAAa,IAAI,KAAMD,CAAW,EAEnCC,EAAI,IACf,CAEA,SAASC,GAAYC,EAAQJ,EAAMC,EACnC,CACI,IAAMI,EAAQ,WAAW,SAAS,cAAc,QAAQ,EACxD,QAAWC,KAAQF,EAAO,WACtBC,EAAM,aAAaC,EAAK,KAAMA,EAAK,KAAK,EAE5C,OAAAD,EAAM,gBAAgB,sBAAsB,EAExCA,EAAM,aAAa,KAAK,EACxBA,EAAM,IAAMP,GAAWO,EAAM,aAAa,KAAK,EAAGL,EAAMC,CAAW,EAEnEI,EAAM,YAAcD,EAAO,YAExBC,CACX,CAEA,SAASE,GAAaH,EAAQI,EAC9B,CACIA,EAAY,WAAW,aAAaJ,EAAQI,CAAW,EACvDA,EAAY,WAAW,YAAYA,CAAW,CAClD,CAEA,SAASC,GAAoBL,EAC7B,CAII,OAAOA,EAAO,aAAa,KAAK,GAAK,CAACA,EAAO,aAAa,OAAO,CACrE,CAEA,SAASM,GAAuBN,EAAQI,EACxC,CACI,OAAO,IAAI,QAASG,GAAY,CAC5B,IAAMC,EAAO,IAAM,CACfR,EAAO,oBAAoB,OAAQQ,CAAI,EACvCR,EAAO,oBAAoB,QAASQ,CAAI,EACxCD,EAAQ,CACZ,EACAP,EAAO,iBAAiB,OAAQQ,CAAI,EACpCR,EAAO,iBAAiB,QAASQ,CAAI,EACrCL,GAAaH,EAAQI,CAAW,CACpC,CAAC,CACL,CAEA,SAASK,GAAiBC,EAC1B,CACI,IAAMC,EAAW,6DACXC,EAAQ,MAAM,KAAKF,EAAU,iBAAiBC,CAAQ,CAAC,EAC7D,OAAID,EAAU,UAAUC,CAAQ,GAC5BC,EAAM,QAAQF,CAAS,EAEpBE,CACX,CAEA,IAAMC,GAAN,KACA,CACI,YAAYC,EAAQ,CAAC,EACrB,CACI,KAAK,UAAYA,EAAQ,WAAa,WAAW,SACjD,KAAK,YAAcA,EAAQ,aAAeC,GAC1C,KAAK,SAAW,OAAO,OAAO,IAAI,EAClC,KAAK,gBAAkB,CAAC,EACxB,KAAK,UAAY,GACjB,KAAK,cAAgB5B,GAAS,IAAM,CAChCK,GAAY,IAAM,CACT,KAAK,WACN,KAAK,aAAaiB,GAAiB,KAAK,SAAS,CAAC,CAE1D,CAAC,CACL,EAAG,EAAE,EACDK,EAAQ,UAAY,KACpB,KAAK,SAAW,IAAI,iBAAiB,KAAK,aAAa,EACvD,KAAK,SAAS,QAAQ,KAAK,UAAW,CAClC,QAAS,GACT,UAAW,EACf,CAAC,EACD,KAAK,cAAc,EAE3B,CAEA,MAAM,QAAQE,EAASpB,EACvB,CACI,IAAMqB,EAAMD,EAAQ,MAAM,EAC1B,QAAWhB,KAAUiB,EAAK,CACtB,GAAI,KAAK,UACL,OAEJ,IAAMhB,EAAQF,GAAYC,EAAQJ,EAAM,KAAK,WAAW,EAClDsB,EAAO,KAAK,gBAAgBlB,EAAO,QAAQ,cAAc,EAC/D,GAAI,CAACkB,GAAM,WACP,SAOgBb,GAAoBJ,CAAK,GAEzCA,EAAM,MAAQ,GACd,MAAMK,GAAuBL,EAAOiB,CAAI,GAExCf,GAAaF,EAAOiB,CAAI,CAEhC,CACJ,CAEA,KAAKC,EAAMC,EACX,CACI,IAAMC,EAAW,WAAW,SAAS,YAAY,EAAE,yBAAyBF,CAAI,EAC1EG,EAAcD,EAAS,iBAAiB,8BAA8B,EAC5E,QAAWE,KAAcD,EAAa,CAClC,IAAME,EAAOD,EAAW,aAAa,MAAM,EACvCC,IACAD,EAAW,KAAO7B,GAAW8B,EAAMJ,EAAK,KAAM,KAAK,WAAW,GAElE,WAAW,SAAS,KAAK,YAAYG,CAAU,CACnD,CAIA,IAAME,EAAkB,WAAW,SAAS,uBAAuB,EAC7DT,EAAUK,EAAS,iBAAiB,QAAQ,EAClD,GAAIL,EAAQ,OAAQ,CAChB,QAAWhB,KAAUgB,EAAS,CAC1B,IAAMZ,EAAc,WAAW,SAAS,cAAcJ,EAAO,KAAO,eAAe,EACnFA,EAAO,WAAW,aAAaI,EAAaJ,CAAM,EAClDA,EAAO,QAAQ,eAAiB,KAAK,gBAAgB,OACrD,KAAK,gBAAgB,KAAKI,CAAW,EACrCqB,EAAgB,YAAYzB,CAAM,CACtC,CACA,WAAW,WAAW,IAAM,CACxB,KAAK,QAAQ,MAAM,KAAKyB,EAAgB,QAAQ,EAAGL,EAAOA,EAAK,KAAO,WAAW,SAAS,IAAI,CAClG,EAAG,EAAE,CACT,CAEAA,EAAK,WAAW,aAAaC,EAAUD,CAAI,CAC/C,CAEA,MAAM,aAAaR,EACnB,CACI,IAAMc,EAAiBd,EAAM,OAAO,CAACe,EAAWP,KACxCA,EAAK,MAAQ,uBAAyB,KAAK,SAASA,EAAK,IAAI,EAC7DA,EAAK,WAAW,YAAYA,CAAI,GAEhC,KAAK,SAASA,EAAK,IAAI,EAAI,GAC3BA,EAAK,IAAM,yBACXO,EAAU,KAAKP,CAAI,GAEhBO,GACR,CAAC,CAAC,EAEL,QAAWP,KAAQM,EACf,GAAI,OAAK,WAAa,CAACN,EAAK,MAG5B,GAAI,CACA,IAAMQ,EAAW,MAAM,MAAMR,EAAK,IAAI,EACtC,GAAI,CAACQ,EAAS,GAAI,CACd,QAAQ,KAAK,uCAAuCR,EAAK,IAAI,MAAMQ,EAAS,MAAM,GAAG,EACrFR,EAAK,IAAM,uBACX,QACJ,CACA,IAAMD,EAAO,MAAMS,EAAS,KAAK,EACjC,GAAI,KAAK,WAAa,CAACR,EAAK,WACxB,SAEJ,KAAK,KAAKD,EAAMC,CAAI,EACpBA,EAAK,YAAY,YAAYA,CAAI,CACrC,OAASS,EAAO,CACZ,QAAQ,KAAK,uCAAuCT,EAAK,IAAI,IAAK,CAAE,MAAOS,CAAM,CAAC,EAClFT,EAAK,IAAM,sBACf,CAER,CAEA,SACA,CACI,KAAK,UAAY,GACjB,KAAK,UAAU,WAAW,EAC1B,KAAK,SAAW,MACpB,CACJ,EAEO,SAASU,GAAShB,EAAQ,CAAC,EAClC,CACI,OAAO,IAAID,GAAeC,CAAO,CACrC,CAEA,IAAIC,GAAqB,KACnBgB,GAAiB,IAAM,IAAIlB,GAAe,CAC5C,UAAW,WAAW,SACtB,YAAaE,GACb,QAAS,EACb,CAAC,EAEYiB,GAAU,CACnB,IAAI,aAAc,CACd,OAAOjB,EACX,EACA,IAAI,YAAYkB,EAAO,CACnBlB,GAAqBkB,CACzB,EACA,QAAS,CAACjB,EAASpB,IAASmC,GAAe,EAAE,QAAQf,EAASpB,CAAI,EAClE,KAAM,CAACuB,EAAMC,IAASW,GAAe,EAAE,KAAKZ,EAAMC,CAAI,EACtD,MAAQR,GAAUmB,GAAe,EAAE,aAAa,MAAM,KAAKnB,CAAK,CAAC,CACrE,ECpOA,IAAMsB,GAAc,CAChB,YACA,OACA,YACA,SACA,QACA,UACA,aACA,YACA,UACA,WACA,YACA,SACA,UACA,cACJ,EAEMC,GAAN,KACA,CACI,YAAYC,EAAQ,CAAC,EACrB,CACI,GAAIA,EAAQ,WAAY,CACpB,IAAMC,EAAgB,CAAC,EACvBC,GAAgBD,EAAeD,EAAQ,UAAU,EACjDG,GAAaF,EAAeD,CAAO,EACnCA,EAAUC,CACd,CAGA,KAAK,UAAYD,EAAQ,WAAa,SAAS,KAC/C,KAAK,UAAY,GACjB,KAAK,KAAOI,EAAOJ,EAAQ,MAAQ,CAAC,CAAC,EACrC,KAAK,MAAQA,EAAQ,MACrB,KAAK,QAAUA,EAAQ,QACvB,KAAK,WAAaA,EAAQ,WAC1B,KAAK,QAAUA,EAAQ,QACvB,KAAK,aAAeA,EAAQ,aAE5BK,GAAiB,KAAK,UAAWL,EAAQ,SAAS,EAClDM,GAAc,KAAK,UAAWN,EAAQ,MAAM,EAE5C,QAAWO,KAAO,OAAO,KAAKP,CAAO,EACjC,OAAOO,EAAK,CACR,IAAK,YACL,IAAK,OACL,IAAK,YACL,IAAK,SACL,IAAK,QACL,IAAK,UACL,IAAK,aACL,IAAK,UACL,IAAK,eACD,MACJ,IAAK,WACD,KAAK,SAAWC,GAAS,CAAE,IAAK,KAAM,UAAW,KAAK,UAAW,SAAUR,EAAQ,QAAQ,CAAC,EAC5F,MACJ,IAAK,YACD,KAAK,UAAYS,GAAU,CAAE,IAAK,KAAM,UAAWT,EAAQ,SAAU,CAAC,EACtE,MACJ,IAAK,YACD,KAAK,UAAYU,GAAU,CAAE,IAAK,KAAM,UAAW,KAAK,UAAW,UAAWV,EAAQ,SAAU,CAAC,EACjG,MACJ,IAAK,SACD,KAAK,OAASW,GAAO,CAAE,IAAK,KAAM,OAAQX,EAAQ,MAAM,CAAC,EACzD,MACJ,IAAK,UACD,KAAK,QAAUY,GAAQ,CAAC,IAAK,KAAM,QAASZ,EAAQ,OAAO,CAAC,EAC5D,MACJ,IAAK,YACL,IAAK,YAED,MACJ,QAGIa,GAAqBN,CAAG,EACxB,KAAKA,CAAG,EAAIP,EAAQO,CAAG,EACvB,KACR,CAGJ,KAAK,QAAUO,GAAK,CAChB,KAAM,KAAK,KACX,UAAW,KAAK,UAChB,UAAW,cACX,aAAc,KAAK,YACvB,CAAC,EAED,KAAK,SAAWC,GAAS,CAAE,UAAW,KAAK,SAAU,CAAC,EAEtD,KAAK,WAAaC,GAAW,CAAE,IAAK,KAAM,UAAW,KAAK,SAAU,CAAC,CACzE,CAEA,IAAI,KACJ,CACI,OAAO,IACX,CAEA,SACA,CACI,KAAK,UAAY,GACb,KAAK,UACL,KAAK,QAAQ,QAAQ,EACrB,KAAK,QAAU,QAEf,KAAK,UACLC,GAAgB,KAAK,QAAQ,EAE7B,KAAK,WACLC,GAAiB,KAAK,SAAS,EAE/B,KAAK,aACLC,GAAkB,KAAK,UAAU,EACjC,KAAK,WAAa,QAElB,KAAK,SACL,KAAK,OAAO,QAAQ,EACpB,KAAK,OAAS,QAEd,KAAK,YACL,KAAK,UAAU,QAAQ,EACvB,KAAK,UAAY,QAEjB,KAAK,WACL,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAW,OAExB,CACJ,EAEA,SAASd,GAAiBe,EAAWC,EACrC,CACI,GAAKA,EAGL,QAAWC,KAAQ,OAAO,KAAKD,CAAS,EAAG,CACvC,IAAME,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAYF,EAAUC,CAAI,EAClC,IAAIE,EAAWJ,EAAU,cAAc,YAAYE,CAAI,EAClDE,EAMDA,EAAS,QAAQ,gBAAgB,GAAGD,EAAQ,QAAQ,GALpDC,EAAW,SAAS,cAAc,UAAU,EAC5CA,EAAS,GAAKF,EACdE,EAAS,QAAQ,OAAO,GAAGD,EAAQ,QAAQ,EAC3CH,EAAU,YAAYI,CAAQ,EAItC,CACJ,CAEA,SAASlB,GAAcc,EAAWK,EAClC,CACI,GAAKA,EAGL,QAAWH,KAAQ,OAAO,KAAKG,CAAM,EAAG,CACpC,IAAIC,EAAQN,EAAU,cAAc,SAASE,EAAK,MAAM,EACnDI,IACDA,EAAQ,SAAS,cAAc,OAAO,EACtCA,EAAM,GAAKJ,EAAK,OAChBF,EAAU,YAAYM,CAAK,GAE/BA,EAAM,UAAYD,EAAOH,CAAI,CACjC,CACJ,CAGA,SAAST,GAAqBN,EAC9B,CACI,IAAMoB,EAAaC,EAAQrB,EAAKT,EAAW,EACvC6B,GACA,QAAQ,KAAK,mCAAmCpB,CAAG,oBAAoBoB,CAAU,oDAAoDpB,CAAG,IAAI,CAEpJ,CAEA,SAASsB,GAAWC,EAAK,CACjBA,EAAI,WAGJA,EAAI,SACAA,EAAI,SACJA,EAAI,OAAO,KAAK,CAAE,QAASA,EAAI,OAAQ,CAAC,EAE5CA,EAAI,OAAO,aAAa,EACxB,WAAW,WAAW,IAAM,CACpBA,EAAI,WAAa,CAACA,EAAI,SAGtBA,EAAI,OAAO,IAAI,WAAW,UAAU,IAAI,EACxCA,EAAI,OAAO,MAAM,WAAW,SAAS,IAAI,EAEzCA,EAAI,OAAO,MAAM,WAAW,UAAU,SAAS,WAAW,UAAU,IAAI,EAEhF,CAAC,EAET,CAGA,SAASC,GAAeD,EAAKE,EAAOC,EACpC,CACI,GAAIH,EAAI,QACJ,OAAOA,EAAI,QAAQ,KAAKA,EAAKE,EAAOC,CAAO,EAE/C,MAAMD,CACV,CAEO,SAASF,GAAI9B,EAAQ,CAAC,EAC7B,CACI,IAAM8B,EAAM,IAAI/B,GAAUC,CAAO,EACjC,GAAI,CAAC8B,EAAI,MACL,OAAAD,GAAWC,CAAG,EACPA,EAGX,GAAI,CACA,IAAMI,EAASJ,EAAI,MAAM,KAAKA,CAAG,EAC7BI,aAAkB,QAClBA,EAAO,KAAK,IAAML,GAAWC,CAAG,CAAC,EAAE,MAAME,GAASD,GAAeD,EAAKE,EAAOF,EAAI,KAAK,CAAC,EAEvFD,GAAWC,CAAG,CAEtB,OAASE,EAAO,CACZD,GAAeD,EAAKE,EAAOF,EAAI,KAAK,CACxC,CACA,OAAOA,CACX,CAGA,SAAS3B,GAAaH,EAASmC,EAC/B,CACI,QAAW5B,KAAO,OAAO,KAAK4B,CAAY,EACtC,OAAO,OAAOA,EAAa5B,CAAG,EAAG,CAC7B,IAAK,SACD,GAAI,CAAC4B,EAAa5B,CAAG,EACjB,SAECP,EAAQO,CAAG,EAGZJ,GAAaH,EAAQO,CAAG,EAAG4B,EAAa5B,CAAG,CAAC,EAF5CP,EAAQO,CAAG,EAAI4B,EAAa5B,CAAG,EAInC,MACJ,QACIP,EAAQO,CAAG,EAAI4B,EAAa5B,CAAG,CACvC,CAER,CAEA,SAASL,GAAgBF,EAASoC,EAAY,CAC1C,QAAWd,KAAQ,OAAO,KAAKc,CAAU,EAAG,CACxC,IAAMC,EAAYD,EAAWd,CAAI,EAC7Be,EAAU,YACVnC,GAAgBF,EAASqC,EAAU,UAAU,EAE5CrC,EAAQ,aACTA,EAAQ,WAAa,CAAC,GAE1BA,EAAQ,WAAWsB,CAAI,EAAIe,EAC3B,QAAW9B,KAAO,OAAO,KAAK8B,CAAS,EACnC,OAAO9B,EAAK,CACR,IAAK,QACL,IAAK,UAEL,IAAK,aAED,MACJ,QACSP,EAAQO,CAAG,IACZP,EAAQO,CAAG,EAAI,OAAO,OAAO,IAAI,GAErCJ,GAAaH,EAAQO,CAAG,EAAG8B,EAAU9B,CAAG,CAAC,EACzC,KACR,CAER,CACJ,CC7RO,SAAS+B,GAAKC,KAAYC,EAAQ,CAKvC,OAJoBA,EAAO,IACzB,CAACC,EAAOC,IACN,GAAGH,EAAQG,CAAK,CAAC,GAAGD,CAAK,EAC7B,EACmB,KAAK,EAAE,EAAIF,EAAQA,EAAQ,OAAS,CAAC,CAC1D,CAEO,SAASI,GAAIJ,KAAYC,EAAQ,CACvC,OAAOF,GAAKC,EAAS,GAAGC,CAAM,CAC/B,CCKK,WAAW,SACZ,WAAW,OAAS,CAAC,GAOzB,WAAW,KAAOI,GAClB,WAAW,IAAMC,GAEjB,IAAMC,GAAW,OAAO,OAAaC,GAAO,CACxC,MAAaA,GACb,KAAYC,GACZ,OAAcC,GACd,OAAcC,GACd,QAAeC,GACf,OAAcC,EAClB,CAAC,EAED,OAAO,OAAO,WAAW,OAAQ,CAC7B,IAAAC,GACA,KAAAC,GACA,MAAOR,GACP,MAAAS,GACA,OAAcC,EACd,OAAcC,GACd,MAAaC,EACb,MAAaC,GACb,QAAeC,EACf,UAAiBC,EACjB,gBAAuBC,EACvB,YAAmBC,EACnB,aAAoBC,EACpB,SAAgBC,EAChB,IAAWC,EACX,IAAAC,GACA,UAAAC,GACA,QAAAC,GACA,SAAAC,GACA,QAAAC,GACA,SAAAC,GACA,UAAAC,GACA,KAAAC,GACA,OAAAC,EACJ,CAAC,EAED,OAAO,WAAW,OAAO,SAqBzB,IAAOC,GAAQ,WAAW",
6
+ "names": ["src_exports", "__export", "addTracer", "batch", "clockEffect", "clone", "createSignal", "destroy", "effect", "getSignal", "isSignal", "makeContext", "notifyGet", "notifySet", "raw", "registerSignal", "signal", "signals", "throttledEffect", "trace", "untracked", "DEP", "MAP_READS_KEY", "MAP_READS_ITERATION", "MAP_WRITES", "SET_WRITES", "SET_ITERATION_PROPERTIES", "isObjectLike", "value", "isSignal", "DEP", "raw", "getSignal", "signals", "targetSignal", "target", "readTarget", "property", "bindMethod", "receiver", "collectRemovedArrayValues", "nextLength", "values", "index", "addArrayLengthChanges", "context", "oldLength", "removedValues", "oldValue", "notifyContext", "notifySet", "wrapArrayMethod", "args", "result", "makeContext", "addMapWriteChanges", "oldSize", "key", "nextValue", "hadKey", "oldEntries", "wrapMapMethod", "notifyGet", "addChanges", "addSetWriteChanges", "hadValue", "prop", "wrapSetMethod", "propertyValueChanged", "descriptor", "oldDescriptor", "newDescriptor", "newValue", "signalHandler", "signal", "hadOwn", "hasOwn", "assertSignalTarget", "name", "assertProxyHandler", "handler", "signalProxyHandler", "registerSignal", "proxy", "rawTarget", "existing", "createSignal", "init", "tracers", "tracing", "trace", "getListeners", "listener", "addTracer", "tracer", "callTracers", "kind", "params", "batchedListeners", "batchDepth", "self", "listeners", "change", "listenersFor", "addContextChange", "runListeners", "clearContext", "currentCompute", "computeStack", "setListeners", "listenersMap", "computeMap", "emptyListeners", "compute", "dependencies", "clearListeners", "effectStack", "signalStack", "effectMap", "assertFunction", "fn", "assertNotRecursive", "effectSignal", "connectedSignal", "setEffectResult", "runTracked", "effectType", "currentEffect", "effect", "destroy", "batch", "finish", "runBatchedListeners", "clocked", "ready", "throttledEffect", "throttleTime", "throttledUntil", "hasChange", "timeout", "now", "schedule", "delay", "clockQueues", "readClockTime", "clock", "getClockQueue", "queue", "time", "pending", "clockEffect", "detachClockEffect", "clockSignal", "untracked", "current", "cloneOptions", "options", "typeName", "isPlainObject", "prototype", "isTypedArray", "isIntegerKey", "hasToClone", "cannotClone", "path", "cloneDescriptorProperties", "source", "cloneValue", "skip", "descriptors", "cloneArrayBuffer", "cloneSharedArrayBuffer", "cloneErrorObject", "errors", "error", "clone", "deep", "seen", "cloneChild", "mapValue", "mapKey", "setValue", "buffer", "dom_exports", "__export", "findAttribute", "signal", "trackDomField", "trackDomList", "writesFromDom", "binding", "context", "field", "fieldByTemplates", "renderer", "list", "length", "arrayByTemplates", "map", "objectByTemplates", "isInt", "s", "setValueByPath", "root", "path", "value", "options", "batch", "parts", "curr", "part", "prev", "prevPart", "prevCurr", "intKey", "prop", "attribute", "attributes", "attrQuery", "keyAttribute", "items", "usedItems", "cursor", "index", "item", "nextUnusedItem", "newTemplate", "reusableItem", "DEP", "findReusableItem", "updateItemKey", "trackDomList", "start", "template", "key", "oldKey", "newKey", "oldPrefix", "newPrefix", "bindings", "attr", "bindPath", "findItemByKey", "stringKey", "rendered", "getParentPath", "clone", "el", "parentEl", "input", "setProperties", "checkboxIsChecked", "matchValue", "trackDomField", "checkboxEditValue", "radioEditValue", "selected", "currentValue", "values", "button", "element", "select", "option", "o", "setSelectOptions", "selectMultipleEditValue", "addOption", "anchor", "updateProperties", "image", "iframe", "meta", "extraprops", "valueIsString", "strValue", "props", "data", "properties", "property", "getProperties", "result", "a", "b", "domSignals", "observers", "domSignalHandler", "target", "property", "receiver", "value", "notifyGet", "signal", "current", "now", "notifySet", "makeContext", "getSignal", "DEP", "el", "options", "isSignal", "existing", "createSignal", "proxy", "domListen", "oldContentHTML", "oldContentText", "observer", "mutationList", "changes", "mutation", "prop", "prevValue", "prevChecked", "notifyFormValue", "trackDomList", "element", "path", "s", "throttledEffect", "children", "untracked", "batch", "key", "currentList", "getValueByPath", "source", "item", "setValueByPath", "trackDomField", "props", "valueIsString", "stringProperty", "getUpdateValue", "context", "updateValue", "getProperties", "currentValue", "findAttribute", "attr", "escape_html", "context", "next", "usesValueProperty", "escapeHTML", "unescapeHTML", "element", "value", "textarea", "fixed_content", "attributes", "names", "getAttributeNames", "setAttributes", "trackDomField", "readAttributes", "attribute", "configured", "data", "name", "SimplyBind", "options", "defaultTransformers", "escape_html", "fixed_content", "attributes", "defaultOptions", "field", "list", "map", "input", "button", "select", "anchor", "image", "iframe", "meta", "element", "attribute", "bindAttributes", "getBindingAttribute", "el", "foundAttribute", "attr", "renderElement", "throttledEffect", "untrack", "binding", "destroy", "context", "getValueByPath", "track", "runTransformers", "transformers", "transformer", "getTransformerPhase", "runTransformerStack", "applyBindings", "bindings", "bindingEl", "updateBindings", "changes", "selector", "change", "node", "error", "path", "parent", "templates", "index", "value", "template", "result", "clone", "bind", "DEP", "fragment", "links", "valueAttribute", "valuePathAttribute", "valueSelector", "elements", "resolved", "templateCommandValue", "link", "transformAttribute", "name", "currentValue", "extractContext", "templateMatches", "t", "currentItem", "strItem", "matches", "rel", "replacement", "phase", "next", "tracking", "track", "el", "context", "untrack", "tracking", "path", "list", "trackedPath", "templateCommandValue", "value", "index", "templateItemPath", "joinPath", "suffix", "getValueByPath", "root", "parts", "curr", "part", "prevPart", "src_exports", "__export", "columns", "filter", "model", "paging", "scroll", "sort", "SimplyFlowModel", "state", "signal", "fn", "dataSignal", "connectedSignal", "isSignal", "model", "options", "sort", "data", "a", "b", "sortBy", "direction", "larger", "smaller", "throttledEffect", "trackedSortFn", "sortFn", "raw", "paging", "batch", "start", "end", "filter", "filterOptions", "trackedMatches", "matches", "row", "columns", "columnOptions", "projections", "visibleKeys", "visible", "key", "input", "source", "result", "value", "scroll", "scrollOptions", "scrollbar", "evt", "SimplyRender", "templateId", "template", "content", "node", "clone", "t", "attr", "observer", "closest", "name", "options", "maxDistance", "minLength", "result", "resultDistance", "option", "distance", "editDistance", "a", "b", "tooFar", "previous", "_", "index", "current", "ai", "bi", "cost", "routes", "options", "SimplyRoute", "parseRoutes", "path", "args", "searchParams", "searchParamsForPath", "currentPath", "getPath", "routePath", "route", "params", "pathWithSlash", "getURL", "callRouteAction", "action", "compileRoutePattern", "result", "callback", "popstateHandler", "clickHandler", "evt", "link", "check", "target", "followLink", "listener", "app", "routeActionParams", "unknownRouteActionError", "warnedRouteQueryConflicts", "query", "queryParams", "key", "warnRouteQueryConflict", "value", "warningKey", "actions", "suggestion", "closest", "hint", "index", "hashIndex", "search", "baseURL", "exact", "regexp", "routeRegexp", "matches", "name", "i", "prefix", "suffix", "routeRegexpSource", "source", "match", "escapeRegexp", "routeInfo", "paths", "path", "dataset", "pointer", "acc", "name", "value", "parent", "names", "result", "path_default", "commandState", "COMMAND_OPTIONS", "SimplyCommands", "options", "defaultHandlers", "commandHandler", "evt", "command", "getCommand", "warnUnknownCommand", "container", "el", "value", "event", "handler", "commands", "destroyCommands", "commandApi", "state", "handlers", "app", "getConfiguredCommandValue", "pathAttribute", "path_default", "configuredValue", "values", "option", "data", "input", "unknownCommandWarnings", "source", "warned", "suggestion", "closest", "commandNames", "suffix", "warnedUnknownActions", "actions", "options", "functionHandler", "target", "thisArg", "argumentsList", "result", "err", "actionHandler", "property", "warnUnknownAction", "warned", "suggestion", "closest", "suffix", "shortcutState", "accesskeyState", "KEY", "SimplyShortcuts", "options", "keyHandler", "e", "shortcutScopes", "shortcutElement", "shortcutScope", "separators", "separator", "keyString", "getKeyString", "i", "container", "keyCombination", "shortcuts", "destroyShortcuts", "shortcutApi", "state", "accesskeys", "selector", "targets", "target", "controller", "destroyAccesskeys", "accesskeyApi", "BEHAVIOR_SELECTOR", "SimplyBehaviors", "options", "changes", "node", "behaviorNodes", "name", "behavior", "cleanup", "added", "change", "behaviorNode", "suggestion", "closest", "suffix", "behaviors", "root", "nodes", "throttle", "callbackFunction", "intervalTime", "eventId", "params", "runWhenIdle", "callback", "rebaseHref", "relative", "base", "cacheBuster", "url", "cloneScript", "script", "clone", "attr", "insertScript", "placeholder", "shouldWaitForScript", "insertAndWaitForScript", "resolve", "done", "findIncludeLinks", "container", "selector", "links", "SimplyIncludes", "options", "defaultCacheBuster", "scripts", "arr", "node", "html", "link", "fragment", "stylesheets", "stylesheet", "href", "scriptsFragment", "remainingLinks", "remainder", "response", "error", "includes", "defaultInclude", "include", "value", "APP_OPTIONS", "SimplyApp", "options", "mergedOptions", "mergeComponents", "mergeOptions", "signal", "installTemplates", "installStyles", "key", "commands", "shortcuts", "behaviors", "routes", "actions", "warnLikelyOptionTypo", "bind", "includes", "accesskeys", "destroyCommands", "destroyShortcuts", "destroyAccesskeys", "container", "templates", "name", "element", "template", "styles", "style", "suggestion", "closest", "initRoutes", "app", "handleAppError", "error", "context", "result", "otherOptions", "components", "component", "html", "strings", "values", "value", "index", "css", "html", "css", "modelApi", "model", "sort", "paging", "filter", "columns", "scroll", "app", "bind", "src_exports", "signal", "effect", "batch", "clone", "destroy", "untracked", "throttledEffect", "clockEffect", "createSignal", "isSignal", "raw", "dom_exports", "behaviors", "actions", "commands", "include", "includes", "shortcuts", "path_default", "routes", "index_default"]
7
7
  }