@manyducks.co/dolla 2.0.0-alpha.17 → 2.0.0-alpha.19

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passthrough-DcOD0Wf3.js","sources":["../node_modules/simple-color-hash/lib/index.js","../src/typeChecking.ts","../src/utils.ts","../src/state.ts","../node_modules/htm/mini/index.module.js","../src/nodes/cond.ts","../node_modules/nanoid/url-alphabet/index.js","../node_modules/nanoid/index.browser.js","../src/nodes/html.ts","../src/nodes/observer.ts","../src/nodes/outlet.ts","../src/nodes/portal.ts","../src/view.ts","../src/nodes/repeat.ts","../src/nodes/text.ts","../src/markup.ts","../src/views/passthrough.ts"],"sourcesContent":["\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:!0});var _slicedToArray=function(){function a(a,b){var c=[],d=!0,e=!1,f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!(b&&c.length===b));d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h[\"return\"]&&h[\"return\"]()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}(),rgbToHex=function(a){return a.reduce(function(a,b){return 16>b?a+\"0\"+b.toString(16):a+b.toString(16)},\"#\")},hslToRgb=function(a,b,c){var d=.5>c?c*(1+b):c+b-c*b,e=2*c-d,f=function(a,b,c){var d=Math.round,e=0>c?c+1:1<c?c-1:c;return e=e<1/6?a+6*(b-a)*e:e<1/2?b:e<2/3?a+6*(b-a)*(2/3-e):a,d(255*e)},g=f(e,d,a+1/3),h=f(e,d,a),i=f(e,d,a-1/3);return[g,h,i]},hslGeneration=function(a,b,c,d){var e=a%1007/1007,f=function(a,b,c){return a*(c-b)+b},g=f(e,b.min,b.max),h=f(e,c.min,c.max),i=f(e,d.max,d.min);// 1007 is a prime\nreturn[g,h,i]},standardHashFunction=function(a){return a.split(\"\").reduce(function(a,b,c){return a*b.charCodeAt(0)*c+1},1)},generateColorHash=function(a){var b=a.str,c=a.hue,d=c===void 0?{min:0,max:360}:c,e=a.sat,f=e===void 0?{min:.35,max:.65}:e,g=a.light,h=g===void 0?{min:.3,max:.7}:g,i=a.hashFunction,j=i===void 0?standardHashFunction:i,k=a.scheme,l=k===void 0?\"hex\":k,m=hslGeneration(j(b),d,f,h),n=_slicedToArray(m,3),o=n[0],p=n[1],q=n[2],r=hslToRgb(o/360,p,q),s=rgbToHex(r);if(\"hsl\"===l)return[o,p,q];return\"rgb\"===l?r:s};/**\n *\n * @param {Array} RGBArray\n *//**\n *\n * @param {number} H Hue\n * @param {number} S Saturation\n * @param {number} L Lightness\n *//**\n *\n * @param {string} hash generated hash\n * @param {number} hue Hue\n * @param {number} sat Saturation\n * @param {number} light Lightness\n *//**\n *\n * @param {string} str string to hash\n *//**\n *\n * @param {Object} {\n * str: String to be hashed,\n * hue: { min, max } values (in deg)\n * sat: { min, max } values (0 to 1)\n * light: { min, max } values (0 to 1),\n * hashFunction: Custom hash function,\n * scheme: return scheme\n * }\n */exports.default=generateColorHash,module.exports=exports.default;","type TypeNames =\n // These values can be returned by `typeof`.\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\"\n // These values are more specific ones that `Type.of` can return.\n | \"null\"\n | \"array\"\n | \"class\"\n | \"promise\"\n | \"NaN\";\n\n/**\n * Extends `typeof` operator with more specific and useful type distinctions.\n */\nexport function typeOf(value: unknown): TypeNames {\n if (value === undefined) {\n return \"undefined\";\n }\n\n if (value === null) {\n return \"null\";\n }\n\n const type = typeof value;\n\n switch (type) {\n case \"number\":\n if (isNaN(value as any)) {\n return \"NaN\";\n }\n return \"number\";\n case \"function\":\n if (isClass(value)) {\n return \"class\";\n }\n\n return type;\n case \"object\":\n if (isArray(value)) {\n return \"array\";\n }\n\n if (isPromise(value)) {\n return \"promise\";\n }\n\n return type;\n default:\n return type;\n }\n}\n\n/**\n * Throws a TypeError unless `condition` is truthy.\n *\n * @param condition - Value whose truthiness is in question.\n * @param errorMessage - Optional message for the thrown TypeError.\n */\nexport function assert(condition: any, errorMessage?: string): void {\n if (!condition) {\n throw new TypeError(\n formatError(condition, errorMessage || \"Failed assertion. Value is not truthy. Got type: %t, value: %v\"),\n );\n }\n}\n\n/**\n * Returns true if `value` is an array.\n */\nexport function isArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value);\n}\n\n/**\n * Throws an error if `value` is not an array.\n */\nexport function assertArray(value: unknown, errorMessage?: string): value is Array<unknown> {\n if (isArray(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage || \"Expected array. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns a function that takes a `value` and ensures that it is an array for which `check` returns true for every item.\n *\n * @param check - Function to check items against.\n */\nexport function isArrayOf<T>(check: (item: unknown) => boolean): (value: unknown) => value is T[];\n\n/**\n * Returns true when `value` is an array and `check` returns true for every item.\n *\n * @param check - Function to check items against.\n * @param value - A possible array.\n */\nexport function isArrayOf<T>(check: (item: unknown) => boolean, value: unknown): value is T[];\n\nexport function isArrayOf<T>(...args: unknown[]) {\n const check = args[0] as (item: unknown) => boolean;\n\n const test = (value: unknown): value is T[] => {\n return isArray(value) && value.every((item) => check(item));\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns a function that takes a `value` and throws a TypeError unless it is an array for which `check` returns true for every item.\n *\n * @param check - Function to check items against.\n */\nexport function assertArrayOf<T>(check: (item: unknown) => boolean): (value: unknown) => value is T[];\n\n/**\n * Throws a TypeError unless `value` is an array and `check` returns true for every item.\n *\n * @param check - Function to check items against.\n * @param value - A possible array.\n * @param errorMessage - A custom error message.\n */\nexport function assertArrayOf<T>(\n check: (item: unknown) => boolean,\n value: unknown,\n errorMessage?: string,\n): value is T[];\n\nexport function assertArrayOf<T>(...args: unknown[]) {\n const check = args[0] as (item: unknown) => boolean;\n const message = isString(args[2]) ? args[2] : \"Expected an array of valid items. Got type: %t, value: %v\";\n\n const test = (value: unknown): value is T[] => {\n if (isArray(value) && value.every((item) => check(item))) {\n return true;\n }\n\n throw new TypeError(formatError(value, message));\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns true if `value` is equal to `true` or `false`.\n */\nexport function isBoolean(value: unknown): value is boolean {\n return value === true || value === false;\n}\n\n/**\n * Throws a TypeError unless `value` is equal to `true` or `false`.\n */\nexport function assertBoolean(value: unknown, errorMessage?: string): value is boolean {\n if (isBoolean(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a boolean. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a string.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Throws a TypeError unless `value` is a string.\n */\nexport function assertString(value: unknown, errorMessage?: string): value is string {\n if (isString(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a string. Got type: %t, value: %v\"));\n}\n\n// TODO: More specific validation for common types of strings? Email address, URL, UUID, etc?\n\n/**\n * Returns true if `value` is a function (but not a class).\n */\nexport function isFunction<T = (...args: unknown[]) => unknown>(value: unknown): value is T {\n return typeof value === \"function\" && !isClass(value);\n}\n\n/**\n * Throws a TypeError unless `value` is a function.\n */\nexport function assertFunction<T = (...args: unknown[]) => unknown>(value: unknown, errorMessage?: string): value is T {\n if (isFunction(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a function. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a number.\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === \"number\" && !isNaN(value);\n}\n\n/**\n * Throws a TypeError unless `value` is a number.\n */\nexport function assertNumber(value: unknown, errorMessage?: string): value is number {\n if (isNumber(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a number. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` implements the Promise protocol.\n * This matches true instances of Promise as well as any object that\n * implements `next`, `catch` and `finally` methods.\n *\n * To strictly match instances of Promise, use `isInstanceOf(Promise)`.\n */\nexport function isPromise<T = unknown>(value: unknown): value is Promise<T> {\n if (value == null) return false;\n\n const obj = value as any;\n\n return obj instanceof Promise || (isFunction(obj.then) && isFunction(obj.catch) && isFunction(obj.finally));\n}\n\n/**\n * Throws a TypeError unless `value` implements the Promise protocol.\n * This matches true instances of Promise as well as any object that\n * implements `next`, `catch` and `finally` methods.\n *\n * To strictly allow only instances of Promise, use `Type.assertInstanceOf(Promise)`.\n */\nexport function assertPromise<T = unknown>(value: unknown, errorMessage?: string): value is Promise<T> {\n if (isPromise(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a promise. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a class.\n */\nexport function isClass(value: unknown): value is { new (): unknown } {\n return typeof value === \"function\" && /^\\s*class\\s+/.test(value.toString());\n}\n\n/**\n * Throws a TypeError unless `value` is a class.\n */\nexport function assertClass(value: unknown, errorMessage?: string): value is { new (): unknown } {\n if (isClass(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a class. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns a function that takes a `value` and returns true if `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor a value must be an instance of to match.\n */\nexport function isInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;\n\n/**\n * Returns `true` if `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor `value` must be an instance of.\n * @param value - A value that may be an instance of `constructor`.\n */\nexport function isInstanceOf<T extends Function>(constructor: T, value: unknown): value is T;\n\nexport function isInstanceOf<T extends Function>(...args: unknown[]) {\n const constructor = args[0] as T;\n\n const test = (value: unknown): value is T => {\n return value instanceof constructor;\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns a function that takes a `value` and throws a TypeError unless `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor a value must be an instance of to match.\n */\nexport function assertInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;\n\n/**\n * Throws a TypeError unless `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor `value` must be an instance of.\n * @param value - A value that may be an instance of `constructor`.\n * @param errorMessage - A custom error message for when the assertion fails.\n */\nexport function assertInstanceOf<T extends Function>(constructor: T, value: unknown, errorMessage?: string): value is T;\n\nexport function assertInstanceOf<T extends Function>(...args: unknown[]) {\n const constructor = args[0] as T;\n const errorMessage = isString(args[2])\n ? args[2]\n : `Expected instance of ${constructor.name}. Got type: %t, value: %v`;\n\n const test = (value: unknown): value is T => {\n if (value instanceof constructor) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage));\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns true if `value` is a Map.\n */\nexport function isMap<K = unknown, V = unknown>(value: any): value is Map<K, V> {\n return value instanceof Map;\n}\n\n/**\n * Throws a TypeError unless `value` is a Map.\n */\nexport function assertMap<K = unknown, V = unknown>(value: any, errorMessage?: string): value is Map<K, V> {\n if (isMap(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a Map. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a Set.\n */\nexport function isSet<T = unknown>(value: any): value is Set<T> {\n return value instanceof Set;\n}\n\n/**\n * Throws a TypeError if `value` is not a Set.\n */\nexport function assertSet<T = unknown>(value: any, errorMessage?: string): value is Set<T> {\n if (isSet(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a Set. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` implements the Iterable protocol.\n */\nexport function isIterable<T>(value: any): value is Iterable<T> {\n if (value == null) {\n return false;\n }\n\n // Must have a [Symbol.iterator] function that returns an iterator.\n if (!isFunction(value[Symbol.iterator])) {\n return false;\n }\n\n const iterator = value[Symbol.iterator]();\n\n // Iterator must implement the iterator protocol.\n if (!isFunction(iterator.next)) {\n return false;\n }\n\n // We have to assume next() returns the correct object.\n // We can't call it to make sure because we don't want to cause side effects.\n return true;\n}\n\n/**\n * Throws a TypeError unless `value` implements the Iterable protocol.\n */\nexport function assertIterable<T>(value: any, errorMessage?: string): value is Iterable<T> {\n if (isIterable(value)) {\n return true;\n }\n\n throw new TypeError(\n formatError(\n value,\n errorMessage ?? \"Expected an object that implements the iterable protocol. Got type: %t, value: %v\",\n ),\n );\n}\n\n/**\n * Returns true if `value` is a plain JavaScript object.\n */\nexport function isObject(value: unknown): value is Record<string | number | symbol, unknown> {\n return value != null && typeof value === \"object\" && !isArray(value);\n}\n\n/**\n * Throws a TypeError unless `value` is a plain JavaScript object.\n */\nexport function assertObject(value: unknown, errorMessage?: string): value is object {\n if (isObject(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected an object. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is equal to `null`.\n */\nexport function isNull(value: unknown): value is null {\n return value === null;\n}\n\n/**\n * Throws a TypeError unless `value` is equal to `null`.\n */\nexport function assertNull(value: unknown, errorMessage?: string): value is null {\n if (value === null) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected null. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is equal to `undefined`.\n */\nexport function isUndefined(value: unknown): value is undefined {\n return value === undefined;\n}\n\n/**\n * Throws a TypeError unless `value` is equal to `undefined`.\n */\nexport function assertUndefined(value: unknown, errorMessage?: string): value is undefined {\n if (value === undefined) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected undefined. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is equal to `null` or `undefined`.\n */\nexport function isEmpty(value: unknown): value is void {\n return value === null || value === undefined;\n}\n\n/**\n * Throws a TypeError unless `value` is equal to `null` or `undefined`.\n */\nexport function assertEmpty(value: unknown, errorMessage?: string): value is void {\n if (value == null) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected null or undefined. Got type: %t, value: %v\"));\n}\n\n/**\n * Replaces `%t` and `%v` placeholders in a message with real values.\n */\nfunction formatError(value: unknown, message: string) {\n const typeName = typeOf(value);\n\n // TODO: Pretty format value as string based on type.\n const valueString = value?.toString?.() || String(value);\n\n return message.replaceAll(\"%t\", typeName).replaceAll(\"%v\", valueString);\n}\n","import colorHash from \"simple-color-hash\";\nimport { isObject } from \"./typeChecking.js\";\n\nexport const noOp = () => {};\n\n/**\n * Takes an old value and a new value. Returns a merged copy if both are objects, otherwise returns the new value.\n */\nexport function merge(one: unknown, two: unknown) {\n if (isObject(one)) {\n if (!isObject(two)) {\n return two;\n }\n\n const merged = Object.assign({}, one) as any;\n\n for (const key in two) {\n merged[key] = merge(merged[key], two[key]);\n }\n\n return merged;\n } else {\n return two;\n }\n}\n\n/**\n * Returns a new object without the specified keys.\n * If called without object, returns a function that takes an object\n * and returns a version with the original keys omitted.\n *\n * @param keys - An array of keys to omit.\n * @param object - An object to clone without the omitted keys.\n */\nexport function omit<O extends Record<any, any>>(keys: (keyof O)[], object: O): Record<any, any> {\n const process = (object: Record<any, any>) => {\n const newObject: Record<any, any> = {};\n\n for (const key in object) {\n if (!keys.includes(key)) {\n newObject[key] = object[key];\n }\n }\n\n return newObject;\n };\n\n if (object == null) {\n return process;\n }\n\n return process(object);\n}\n\nexport function getDefaultConsole() {\n if (typeof window !== \"undefined\" && window.console) {\n return window.console;\n }\n\n if (typeof global !== \"undefined\" && global.console) {\n return global.console;\n }\n}\n\nexport function colorFromString(value: string) {\n return colorHash({\n str: value,\n sat: { min: 0.35, max: 0.55 },\n light: { min: 0.6, max: 0.6 },\n });\n}\n\nexport type MatcherFunction = (value: string) => boolean;\n\n/**\n * Parses a filter string into a matcher function.\n *\n * @param pattern - A string or regular expression that specifies a pattern for names of loggers whose messages you want to display.\n */\nexport function createMatcher(pattern: string | RegExp): MatcherFunction {\n if (pattern instanceof RegExp) {\n return (value: string) => pattern.test(value);\n }\n\n const matchers: Record<\"positive\" | \"negative\", MatcherFunction[]> = {\n positive: [],\n negative: [],\n };\n\n const parts = pattern\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\");\n\n for (let part of parts) {\n let section: \"positive\" | \"negative\" = \"positive\";\n\n if (part.startsWith(\"-\")) {\n section = \"negative\";\n part = part.slice(1);\n }\n\n if (part === \"*\") {\n matchers[section].push(function () {\n return true;\n });\n } else if (part.endsWith(\"*\")) {\n matchers[section].push(function (value) {\n return value.startsWith(part.slice(0, part.length - 1));\n });\n } else {\n matchers[section].push(function (value) {\n return value === part;\n });\n }\n }\n\n return function (name: string) {\n const { positive, negative } = matchers;\n\n // Matching any negative matcher disqualifies.\n if (negative.some((fn) => fn(name))) {\n return false;\n }\n\n // Matching at least one positive matcher is required if any are specified.\n if (positive.length > 0 && !positive.some((fn) => fn(name))) {\n return false;\n }\n\n return true;\n };\n}\n","import { colorFromString, noOp } from \"./utils\";\n\n/**\n * Counts total active state watchers for the purpose of tracking memory leaks.\n */\nconst tracker = {\n watcherCount: 0,\n increment() {\n this.watcherCount++;\n this._log();\n },\n decrement() {\n this.watcherCount--;\n this._log();\n },\n\n _label: \"dolla/state-tracker\",\n _timeout: null as any,\n _log() {\n if ((window as any).DOLLA_DEV_DEBUG === true && !this._timeout) {\n this._timeout = setTimeout(() => {\n console.log(\n `%c[DOLLA_DEV_DEBUG] %c${this._label}%c%c%c`,\n `color:#e44c4c;font-weight:bold`,\n `color:${colorFromString(this._label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n { watcherCount: this.watcherCount },\n );\n this._timeout = null;\n }, 200);\n }\n },\n};\n\n/*==============================*\\\n|| Types ||\n\\*==============================*/\n\n/**\n * Stops the observer that created it when called.\n */\nexport type StopFunction = () => void;\n\ntype Unwrapped<T> = T extends State<infer V> ? V : T;\n\n/**\n * Extracts value types from an array of states.\n */\nexport type StateValues<T extends MaybeState<any>[]> = {\n [K in keyof T]: Unwrapped<T[K]>;\n};\n\nexport interface CreateStateOptions<T> {\n /**\n * Determines if the `next` value is equal to the `current` value.\n * If this function returns true, watchers will be notified of changes. If it returns false, watchers will not be notified.\n * Default equals check is `===` (strict) equality.\n *\n * @param next - The new value being set.\n * @param current - The current value being replaced.\n */\n equals?: (next: T, current: T) => boolean;\n}\n\nexport interface WatchOptions<T> {\n /**\n * If true the watch callback will be called for the first time on the next change.\n * By default the callback is called immediately with the state's current value.\n */\n lazy?: boolean;\n}\n\nexport interface State<T> {\n /**\n * Returns the current value.\n */\n get(): T;\n\n /**\n * Watch this state's value with a `callback` function.\n * The `callback` is only called if the value is not equal to the current value.\n *\n * > NOTE: If watching a state inside a view, use the `.watch` method on the `ViewContext`. That method will automatically\n * clean up all watchers when the view is disconnected. Watchers created here must be cleaned up manually.\n */\n watch(callback: (value: T) => void, options?: WatchOptions<T>): StopFunction;\n}\n\n/** A new value for a state, or a callback that receives the current value and returns a new one. */\nexport type SetAction<I, O = I> = O | SetFunction<I, O>;\nexport type SetFunction<I, O = I> = (current: I) => O;\n\n/** Callback that updates the value of a state. */\nexport type Setter<I, O = I> = (value: SetAction<I, O>) => void;\n\nexport type MaybeState<T> = State<T> | T;\n\n/**\n * A state and setter in one. Useful for passing states that are intended to be updated by subviews.\n */\nexport interface SettableState<I, O = I> extends State<I> {\n /**\n * Updates the state's value.\n */\n set(next: O): void;\n\n /**\n * Takes a callback that recieves the state's current value and returns a new one.\n */\n set(callback: (current: I) => O): void;\n}\n\nexport interface Ref<T extends Node> extends State<T | undefined> {\n node: T | undefined;\n}\n\n/*==============================*\\\n|| Utils ||\n\\*==============================*/\n\nconst TYPE_STATE = Symbol(\"State\");\nconst TYPE_SETTABLE_STATE = Symbol(\"SettableState\");\nconst TYPE_REF = Symbol(\"Ref\");\n\nexport function isState<T>(value: any): value is State<T> {\n return value?.[TYPE_STATE] === true;\n}\n\nexport function isSettableState<T>(value: any): value is SettableState<T> {\n return value?.[TYPE_SETTABLE_STATE] === true;\n}\n\nexport function isRef<T extends Node>(value: any): value is Ref<T> {\n return value?.[TYPE_REF] === true;\n}\n\n/**\n * Retrieves a plain value from a variable that may be a state.\n */\nexport function valueOf<T>(value: MaybeState<T>): T {\n if (isState(value)) {\n return value.get();\n } else {\n return value;\n }\n}\n\n/**\n * Ensures a variable that may be a state or plain value is a state.\n */\nexport function toState<T>(value: MaybeState<T>): State<T> {\n if (isSettableState<T>(value)) {\n return new Signal(value);\n } else if (isState<T>(value)) {\n return value;\n } else {\n return new Signal({\n get() {\n return value;\n },\n watch(callback, options = {}) {\n if (!options?.lazy) {\n callback(value);\n }\n return noOp;\n },\n });\n }\n}\n\n/*==============================*\\\n|| State ||\n\\*==============================*/\n\nexport class ValueHolder<T> implements State<T> {\n static defaultEquals(next: any, current: any): boolean {\n return next === current;\n }\n\n value: T;\n watchers: ((value: T) => void)[] = [];\n equals = ValueHolder.defaultEquals;\n\n constructor(value: T, options?: CreateStateOptions<T>) {\n this.value = value;\n if (options?.equals) {\n this.equals = options.equals;\n }\n }\n\n get() {\n return this.value;\n }\n\n set(action: T | SetFunction<T>) {\n if (typeof action === \"function\") {\n action = (action as SetFunction<T>)(this.value);\n }\n\n if (!this.equals(action, this.value)) {\n this.value = action;\n\n try {\n for (const watcher of this.watchers) {\n watcher(action);\n }\n } catch (err) {\n console.error(\"Error in watcher\", err);\n throw err;\n }\n }\n }\n\n watch(callback: (value: T) => void, options?: WatchOptions<T>) {\n this.watchers.push(callback);\n\n if (!options?.lazy) {\n callback(this.value);\n }\n\n tracker.increment();\n\n return () => {\n const index = this.watchers.indexOf(callback);\n if (index > -1) {\n this.watchers.splice(index, 1);\n }\n\n tracker.decrement();\n };\n }\n}\n\nexport class Signal<T> implements State<T> {\n // Instances will pass isState() with this symbol\n [TYPE_STATE] = true;\n\n __value: State<T>;\n\n constructor(value: State<T>) {\n if (value == null) {\n throw new TypeError(`Value is null`);\n }\n this.__value = value;\n }\n\n get() {\n return this.__value.get();\n }\n\n watch(callback: (value: T) => void, options?: WatchOptions<T>) {\n return this.__value.watch(callback, options);\n }\n}\n\n/**\n * Creates a state and setter.\n */\nexport function createState<T>(initialValue: T, options?: CreateStateOptions<T>): [State<T>, Setter<T>];\n\n/**\n * Creates a state and setter.\n */\nexport function createState<T>(\n initialValue?: T,\n options?: CreateStateOptions<T | undefined>,\n): [State<T | undefined>, Setter<T | undefined>];\n\n/**\n * Creates a state and setter.\n */\nexport function createState<T>(initialValue: T, options?: CreateStateOptions<T>): [State<T>, Setter<T>] {\n const value = new ValueHolder(initialValue, options);\n const signal = new Signal(value);\n\n return [signal, (action) => value.set(action)];\n}\n\n/*==============================*\\\n|| Settable States ||\n\\*==============================*/\n\nexport class SettableSignal<T> implements State<T>, SettableState<T> {\n // Instances will pass isState() and isSettableState() with these symbols\n [TYPE_STATE] = true;\n [TYPE_SETTABLE_STATE] = true;\n\n __value: ValueHolder<T>;\n\n constructor(value: ValueHolder<T>) {\n if (value == null) {\n throw new TypeError(`Value is null`);\n }\n this.__value = value;\n }\n\n get() {\n return this.__value.get();\n }\n\n set(action: T | ((value: T) => T)) {\n this.__value.set(action);\n }\n\n watch(callback: (value: T) => void, options?: WatchOptions<T>) {\n return this.__value.watch(callback, options);\n }\n}\n\n/**\n * Creates a SettableState.\n */\nexport function createSettableState<T>(initialValue: T, options?: CreateStateOptions<T>): SettableState<T>;\n\n/**\n * Creates a SettableState.\n */\nexport function createSettableState<T>(\n initialValue?: T,\n options?: CreateStateOptions<T | undefined>,\n): SettableState<T | undefined>;\n\nexport function createSettableState<T>(initialValue?: T, options?: CreateStateOptions<T>) {\n return new SettableSignal<any>(new ValueHolder(initialValue!, options));\n}\n\n/**\n * Join a state and its setter into a single SettableState object.\n */\nexport function toSettableState<I, O = I>($state: State<I>, setter: Setter<I, O>): SettableState<I, O> {\n return {\n [TYPE_STATE]: true,\n [TYPE_SETTABLE_STATE]: true,\n\n get: $state.get.bind($state),\n watch: $state.watch.bind($state),\n set: setter,\n } as any;\n}\n\n/**\n * Creates a Setter with custom logic provided by `callback`.\n */\nexport function createSetter<I, O = I>($state: State<I>, callback: (next: O, current: I) => void): Setter<I, O> {\n return function setValue(nextOrCallback) {\n const current = $state.get();\n let next: O;\n\n if (typeof nextOrCallback === \"function\") {\n next = (nextOrCallback as (current: I) => O)(current);\n } else {\n next = nextOrCallback;\n }\n\n callback(next, current);\n };\n}\n\n/*==============================*\\\n|| Derived States ||\n\\*==============================*/\n\nconst EMPTY = Symbol(\"EMPTY\");\n\nclass DerivedValueHolder<I extends MaybeState<any>[], O> implements State<O> {\n equals = ValueHolder.defaultEquals;\n\n /**\n * Array of states this holder's value is derived from.\n */\n sources: State<any>[] = [];\n /**\n * The function that does the deriving. Receives source values and returns a derived value.\n */\n fn: (...values: StateValues<I>) => MaybeState<O>;\n /**\n *\n */\n sourceWatcher = createWatcher();\n /**\n * Array of functions awaiting notification when this holder's value changes.\n */\n watchers: ((value: O) => void)[] = [];\n /**\n * True when this holder is actively watching sources.\n */\n isWatchingSources = false;\n\n /**\n * Latest values as received from sources.\n */\n previousSourceValues: StateValues<I>;\n\n /**\n * The current value as returned from `fn` (may be a State)\n */\n value: typeof EMPTY | MaybeState<O> = EMPTY;\n /**\n * The current unwrapped value.\n */\n rawValue!: O;\n\n /**\n * When value is a State, this function will stop watching its value.\n */\n stopWatchingCurrentValue?: StopFunction;\n\n constructor(states: [...I], fn: (...values: StateValues<I>) => MaybeState<O>, options?: DeriveOptions) {\n this.sources = states.map(toState);\n this.fn = fn;\n\n if (options?.equals) {\n this.equals = options.equals;\n }\n\n this.previousSourceValues = new Array(states.length).fill(EMPTY, 0, states.length) as StateValues<I>;\n }\n\n /*==========================*\\\n || \"Public\" methods ||\n \\*==========================*/\n\n get(): O {\n return this.getValue();\n }\n\n watch(callback: (value: O) => void, options?: WatchOptions<O>): StopFunction {\n if (!this.isWatchingSources) {\n this.startWatchingSources();\n }\n\n const watchers = this.watchers;\n\n watchers.push(callback);\n\n if (!options?.lazy) {\n callback(this.rawValue);\n }\n\n tracker.increment();\n\n return () => {\n watchers.splice(watchers.indexOf(callback), 1);\n\n if (this.isWatchingSources && watchers.length === 0) {\n this.stopWatchingSources();\n }\n\n tracker.decrement();\n };\n }\n\n /*==========================*\\\n || Internal ||\n \\*==========================*/\n\n notify(value: O) {\n for (const watcher of this.watchers) {\n watcher(value);\n }\n }\n\n update() {\n const sources = this.sources;\n const sourceValues = this.previousSourceValues;\n let changed = false;\n let value: any;\n\n for (let i = 0; i < sources.length; i++) {\n value = sources[i].get();\n if (!changed && !this.equals(value, sourceValues[i])) {\n changed = true;\n }\n sourceValues[i] = value;\n }\n\n // We are assuming purity of `fn`, wherein a change in source values means a different output and vice versa.\n if (changed) {\n this.setValue(this.fn(...sourceValues));\n }\n }\n\n getValue() {\n // Current value will always be up to date when watching sources.\n if (!this.isWatchingSources) {\n this.update();\n }\n return this.rawValue;\n }\n\n setValue(value: O | State<O>) {\n // Stop watching current value if it was a state.\n if (this.stopWatchingCurrentValue) {\n this.stopWatchingCurrentValue();\n this.stopWatchingCurrentValue = undefined;\n }\n\n this.value = value;\n this.rawValue = valueOf(value);\n\n if (this.isWatchingSources && isState(value)) {\n this.stopWatchingCurrentValue = value.watch((current) => {\n this.rawValue = current;\n this.notify(current);\n });\n } else {\n this.notify(this.rawValue);\n }\n }\n\n startWatchingSources() {\n const sourceValues = this.previousSourceValues;\n\n for (let i = 0; i < this.sources.length; i++) {\n this.sourceWatcher.watch([this.sources[i] as State<any>], (next) => {\n sourceValues[i] = next;\n\n // This boolean is set after all sources have been watched.\n // We want to update previousSourceValues, but not actually run `fn` yet.\n if (this.isWatchingSources) {\n const value = this.fn(...sourceValues);\n if (!this.equals(value, this.value)) {\n this.setValue(value);\n }\n }\n });\n }\n\n this.isWatchingSources = true;\n\n const value = this.fn(...sourceValues);\n if (!this.equals(value, this.value)) {\n this.setValue(value);\n }\n }\n\n stopWatchingSources() {\n this.sourceWatcher.stopAll();\n\n // Stop watching current value if it was a state.\n if (this.stopWatchingCurrentValue) {\n this.stopWatchingCurrentValue();\n this.stopWatchingCurrentValue = undefined;\n }\n\n this.isWatchingSources = false;\n }\n}\n\nexport interface DeriveOptions {\n equals?: (next: unknown, current: unknown) => boolean;\n}\n\nexport function derive<Inputs extends MaybeState<any>[], T>(\n states: [...Inputs],\n fn: (...currentValues: StateValues<Inputs>) => T | State<T>,\n options?: DeriveOptions,\n): State<T> {\n const value = new DerivedValueHolder(states, fn, options);\n return new Signal(value);\n}\n\n/*===========================*\\\n|| Ref ||\n\\*===========================*/\n\nclass RefSignal<T extends Node> implements State<T | undefined> {\n // Instances will pass isRef() and isState() with these symbols\n [TYPE_REF] = true;\n [TYPE_STATE] = true;\n\n __value: ValueHolder<T | undefined>;\n\n constructor(value: ValueHolder<T | undefined>) {\n this.__value = value;\n }\n\n get() {\n return this.__value.get();\n }\n\n watch(callback: (value: T | undefined) => void, options?: WatchOptions<T>) {\n return this.__value.watch(callback, options);\n }\n\n get node() {\n return this.__value.get();\n }\n\n set node(value) {\n this.__value.set(value);\n }\n}\n\n/**\n * A special kind of State exclusively for storing references to DOM nodes.\n */\nexport function createRef<T extends Node>(): Ref<T> {\n return new RefSignal<T>(new ValueHolder<T | undefined>(undefined));\n}\n\n/*===========================*\\\n|| Watcher ||\n\\*===========================*/\n\nexport interface StateWatcher {\n /**\n * Watch one or more states, calling the provided `fn` each time one of their values changes.\n *\n * @param states - An array of states or plain values. States will be unwrapped before being passed to `fn`.\n * @param fn - A function that takes the values of `states` in the same order they were passed.\n */\n watch<I extends MaybeState<any>[]>(states: [...I], fn: (...currentValues: StateValues<I>) => void): StopFunction;\n\n /**\n * Stop all watch callbacks registered to this watcher.\n */\n stopAll(): void;\n}\n\nexport function createWatcher(): StateWatcher {\n const stopFns: StopFunction[] = [];\n\n return {\n watch(states, fn) {\n if (states.length === 0) {\n throw new TypeError(`Expected at least one state to watch.`);\n }\n states = states.map(toState) as any;\n\n let stop: StopFunction;\n\n if (states.length > 1) {\n stop = derive(states, fn).watch(() => null);\n } else {\n stop = states[0].watch(fn);\n }\n\n stopFns.push(stop);\n\n return () => {\n let index = stopFns.indexOf(stop);\n if (index > -1) {\n stopFns.splice(index, 1);\n }\n stop();\n };\n },\n\n stopAll() {\n while (stopFns.length > 0) {\n const stop = stopFns.pop()!;\n stop();\n }\n },\n };\n}\n","export default function(n){for(var l,e,s=arguments,t=1,r=\"\",u=\"\",a=[0],c=function(n){1===t&&(n||(r=r.replace(/^\\s*\\n\\s*|\\s*\\n\\s*$/g,\"\")))?a.push(n?s[n]:r):3===t&&(n||r)?(a[1]=n?s[n]:r,t=2):2===t&&\"...\"===r&&n?a[2]=Object.assign(a[2]||{},s[n]):2===t&&r&&!n?(a[2]=a[2]||{})[r]=!0:t>=5&&(5===t?((a[2]=a[2]||{})[e]=n?r?r+s[n]:s[n]:r,t=6):(n||r)&&(a[2][e]+=n?r+s[n]:r)),r=\"\"},h=0;h<n.length;h++){h&&(1===t&&c(),c(h));for(var i=0;i<n[h].length;i++)l=n[h][i],1===t?\"<\"===l?(c(),a=[a,\"\",null],t=3):r+=l:4===t?\"--\"===r&&\">\"===l?(t=1,r=\"\"):r=l+r[0]:u?l===u?u=\"\":r+=l:'\"'===l||\"'\"===l?u=l:\">\"===l?(c(),t=1):t&&(\"=\"===l?(t=5,e=r,r=\"\"):\"/\"===l&&(t<5||\">\"===n[h][i+1])?(c(),3===t&&(a=a[0]),t=a,(a=a[0]).push(this.apply(null,t.slice(1))),t=0):\" \"===l||\"\\t\"===l||\"\\n\"===l||\"\\r\"===l?(c(),t=2):r+=l),3===t&&\"!--\"===r&&(t=4,a=a[0])}return c(),a.length>2?a.slice(1):a[1]}\n","import { constructMarkup, toMarkup, type MarkupElement, type ElementContext, type Markup } from \"../markup.js\";\nimport { type State, type StopFunction } from \"../state.js\";\nimport { type Renderable } from \"../types.js\";\n\nexport interface ConditionalConfig {\n $predicate: State<any>;\n thenContent?: Renderable;\n elseContent?: Renderable;\n elementContext: ElementContext;\n}\n\nexport class Conditional implements MarkupElement {\n node: Node;\n endNode: Node;\n $predicate: State<any>;\n stopCallback?: StopFunction;\n thenContent?: Markup[];\n elseContent?: Markup[];\n connectedContent: MarkupElement[] = [];\n elementContext: ElementContext;\n\n initialUpdateHappened = false;\n previousValue?: any;\n\n constructor(config: ConditionalConfig) {\n this.$predicate = config.$predicate;\n this.thenContent = config.thenContent ? toMarkup(config.thenContent) : undefined;\n this.elseContent = config.elseContent ? toMarkup(config.elseContent) : undefined;\n this.elementContext = config.elementContext;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node = document.createComment(\"Conditional\");\n this.endNode = document.createComment(\"/Conditional\");\n } else {\n this.node = document.createTextNode(\"\");\n this.endNode = document.createTextNode(\"\");\n }\n }\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n mount(parent: Node, after?: Node | undefined): void {\n if (!this.isMounted) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n if (this.elementContext.root.getEnv() === \"development\") {\n parent.insertBefore(this.endNode, this.node.nextSibling);\n }\n\n this.stopCallback = this.$predicate.watch((value) => {\n // Only update if value changed between truthy and falsy.\n if (!this.initialUpdateHappened || (value && !this.previousValue) || (!value && this.previousValue)) {\n this.update(value);\n this.initialUpdateHappened = true;\n this.previousValue = value;\n }\n });\n }\n }\n\n unmount(): void {\n if (this.stopCallback) {\n this.stopCallback();\n this.stopCallback = undefined;\n }\n\n for (const handle of this.connectedContent) {\n handle.unmount();\n }\n this.connectedContent = [];\n\n if (this.isMounted) {\n this.node.parentNode?.removeChild(this.node);\n this.endNode.parentNode?.removeChild(this.endNode);\n }\n }\n\n update(value: any) {\n for (const handle of this.connectedContent) {\n handle.unmount();\n }\n this.connectedContent = [];\n\n if (this.node.parentNode == null) {\n return;\n }\n\n if (value && this.thenContent) {\n this.connectedContent = constructMarkup(this.elementContext, this.thenContent);\n } else if (!value && this.elseContent) {\n this.connectedContent = constructMarkup(this.elementContext, this.elseContent);\n }\n\n for (let i = 0; i < this.connectedContent.length; i++) {\n const handle = this.connectedContent[i];\n const previous = this.connectedContent[i - 1]?.node ?? this.node;\n handle.mount(this.node.parentNode, previous);\n }\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node.textContent = `Conditional (${value ? \"truthy\" : \"falsy\"})`;\n }\n }\n}\n","export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","import { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","import { nanoid } from \"nanoid\";\nimport { constructMarkup, type ElementContext, type Markup, type MarkupElement } from \"../markup.js\";\nimport { isRef, isSettableState, isState, SettableState, type Ref, type State, type StopFunction } from \"../state.js\";\nimport { isFunction, isObject, isString } from \"../typeChecking.js\";\nimport { omit } from \"../utils.js\";\n\n//const eventHandlerProps = Object.values(eventPropsToEventNames).map((event) => \"on\" + event);\nconst isCamelCaseEventName = (key: string) => /^on[A-Z]/.test(key);\n\ntype HTMLOptions = {\n elementContext: ElementContext;\n tag: string;\n props: Record<string, any>;\n children?: Markup[];\n};\n\nexport class HTML implements MarkupElement {\n node;\n props: Record<string, any>;\n children: MarkupElement[];\n stopCallbacks: StopFunction[] = [];\n elementContext;\n uniqueId = nanoid();\n\n // Track the ref so we can nullify it on unmount.\n ref?: Ref<any>;\n\n // Prevents 'onClickOutside' handlers from firing in the same cycle in which the element is connected.\n canClickAway = false;\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor({ tag, props, children, elementContext }: HTMLOptions) {\n elementContext = { ...elementContext };\n\n // This and all nested views will be created as SVG elements.\n if (tag.toLowerCase() === \"svg\") {\n elementContext.isSVG = true;\n }\n\n // Create node with the appropriate constructor.\n if (elementContext.isSVG) {\n this.node = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n } else {\n this.node = document.createElement(tag);\n }\n\n // Add unique ID to attributes for debugging purposes.\n if (elementContext.root.getEnv() === \"development\") {\n this.node.dataset.uniqueId = this.uniqueId;\n }\n\n // Store ref if present. Refs are set on mount.\n if (props.ref) {\n if (isRef(props.ref)) {\n this.ref = props.ref;\n } else {\n throw new Error(\"Expected ref to be a Ref object. Got: \" + props.ref);\n }\n }\n\n this.props = {\n ...omit([\"ref\", \"class\", \"className\"], props),\n class: props.className ?? props.class,\n };\n this.children = children ? constructMarkup(elementContext, children) : [];\n this.elementContext = elementContext;\n }\n\n mount(parent: Node, after?: Node) {\n if (parent == null) {\n throw new Error(`HTML element requires a parent element as the first argument to connect. Got: ${parent}`);\n }\n\n if (!this.isMounted) {\n for (const child of this.children) {\n child.mount(this.node);\n }\n\n this.applyProps(this.node, this.props);\n if (this.props.style) this.applyStyles(this.node, this.props.style, this.stopCallbacks);\n if (this.props.class) this.applyClasses(this.node, this.props.class, this.stopCallbacks);\n }\n\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n\n if (this.ref) {\n this.ref.node = this.node;\n }\n\n setTimeout(() => {\n this.canClickAway = true;\n }, 0);\n }\n\n unmount() {\n if (this.isMounted) {\n for (const child of this.children) {\n child.unmount();\n }\n\n if (this.ref) {\n this.ref.node = undefined;\n }\n\n this.node.parentNode?.removeChild(this.node);\n\n this.canClickAway = false;\n\n for (const stop of this.stopCallbacks) {\n stop();\n }\n this.stopCallbacks = [];\n }\n }\n\n getUpdateKey(type: string, value: string | number) {\n return `${this.uniqueId}:${type}:${value}`;\n }\n\n attachProp<T>(value: State<T> | T, callback: (value: T) => void, updateKey: string) {\n if (isState(value)) {\n this.stopCallbacks.push(\n value.watch((current) => {\n this.elementContext.root.render.write(() => {\n callback(current);\n }, updateKey);\n }),\n );\n } else {\n this.elementContext.root.render.write(() => {\n callback(value);\n }, updateKey);\n }\n }\n\n applyProps(element: HTMLElement | SVGElement, props: Record<string, unknown>) {\n for (const key in props) {\n const value = props[key];\n\n if (key === \"attributes\") {\n const values = value as Record<string, any>;\n // Set attributes directly without mapping props\n for (const name in values) {\n this.attachProp(\n values[name],\n (current) => {\n if (current == null) {\n (element as any).removeAttribute(name);\n } else {\n (element as any).setAttribute(name, String(current));\n }\n },\n this.getUpdateKey(\"attr\", name),\n );\n }\n } else if (key === \"eventListeners\") {\n const values = value as Record<string, any>;\n\n for (const name in values) {\n const listener: (e: Event) => void = isState<(e: Event) => void>(value)\n ? (e: Event) => value.get()(e)\n : (value as (e: Event) => void);\n\n element.addEventListener(name, listener);\n\n this.stopCallbacks.push(() => {\n element.removeEventListener(name, listener);\n });\n }\n } else if (key === \"onClickOutside\" || key === \"onclickoutside\") {\n const listener = (e: Event) => {\n if (this.canClickAway && !element.contains(e.target as any)) {\n if (isState<(e: Event) => void>(value)) {\n value.get()(e);\n } else {\n (value as (e: Event) => void)(e);\n }\n }\n };\n\n const options = { capture: true };\n\n window.addEventListener(\"click\", listener, options);\n\n this.stopCallbacks.push(() => {\n window.removeEventListener(\"click\", listener, options);\n });\n } else if (key === \"$$value\") {\n // Two-way binding for input values.\n if (!isSettableState(value)) {\n throw new TypeError(`$$value attribute must be a settable state. Got: ${value}`);\n }\n\n // Read value from state.\n this.attachProp(\n value,\n (current) => {\n if (current == null) {\n (element as HTMLInputElement).value = \"\";\n } else {\n (element as HTMLInputElement).value = String(current);\n }\n },\n this.getUpdateKey(\"attr\", \"value\"),\n );\n\n // Propagate value to state.\n const listener: EventListener = (e) => {\n // Attempt to cast value back to the same type stored in the state.\n const updated = toTypeOf(value.get(), (e.currentTarget as HTMLInputElement).value);\n (value as SettableState<any>).set(updated);\n };\n\n element.addEventListener(\"input\", listener);\n\n this.stopCallbacks.push(() => {\n element.removeEventListener(\"input\", listener);\n });\n } else if (isCamelCaseEventName(key)) {\n const eventName = key.slice(2).toLowerCase();\n\n const listener: (e: Event) => void = isState<(e: Event) => void>(value)\n ? (e: Event) => value.get()(e)\n : (value as (e: Event) => void);\n\n element.addEventListener(eventName, listener);\n\n this.stopCallbacks.push(() => {\n element.removeEventListener(eventName, listener);\n });\n } else if (key.includes(\"-\")) {\n // Names with dashes in them are not valid prop names, so they are treated as attributes.\n this.attachProp(\n value,\n (current) => {\n if (current == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(current));\n }\n },\n this.getUpdateKey(\"attr\", key),\n );\n } else if (!privateProps.includes(key)) {\n if (this.elementContext.isSVG) {\n this.attachProp(\n value,\n (current) => {\n if (current != null) {\n element.setAttribute(key, String(props[key]));\n } else {\n element.removeAttribute(key);\n }\n },\n this.getUpdateKey(\"attr\", key),\n );\n } else {\n switch (key) {\n case \"contentEditable\":\n case \"value\":\n this.attachProp(\n value,\n (current) => {\n (element as any)[key] = String(current);\n },\n this.getUpdateKey(\"prop\", key),\n );\n break;\n\n case \"for\":\n this.attachProp(\n value,\n (current) => {\n (element as any).htmlFor = current;\n },\n this.getUpdateKey(\"prop\", \"htmlFor\"),\n );\n break;\n\n case \"checked\":\n this.attachProp(\n value,\n (current) => {\n (element as any).checked = current;\n\n // Set attribute also or styles don't take effect.\n if (current) {\n element.setAttribute(\"checked\", \"\");\n } else {\n element.removeAttribute(\"checked\");\n }\n },\n this.getUpdateKey(\"prop\", \"checked\"),\n );\n break;\n\n // Attribute-aliased props\n case \"exportParts\":\n case \"part\":\n case \"translate\":\n case \"type\":\n case \"title\": {\n const _key = key.toLowerCase();\n this.attachProp(\n value,\n (current) => {\n if (current == undefined) {\n element.removeAttribute(_key);\n } else {\n element.setAttribute(_key, String(current));\n }\n },\n this.getUpdateKey(\"attr\", _key),\n );\n break;\n }\n\n case \"autocomplete\":\n case \"autocapitalize\":\n this.attachProp(\n value,\n (current) => {\n if (typeof current === \"string\") {\n (element as any).autocomplete = current;\n } else if (current) {\n (element as any).autocomplete = \"on\";\n } else {\n (element as any).autocomplete = \"off\";\n }\n },\n this.getUpdateKey(\"prop\", key),\n );\n break;\n\n default: {\n this.attachProp(\n value,\n (current) => {\n (element as any)[key] = current;\n },\n this.getUpdateKey(\"prop\", key),\n );\n break;\n }\n }\n }\n }\n }\n }\n\n applyStyles(element: HTMLElement | SVGElement, styles: unknown, stopCallbacks: StopFunction[]) {\n const propStopCallbacks: StopFunction[] = [];\n\n if (isState(styles)) {\n let unapply: () => void;\n\n const stop = styles.watch((current) => {\n this.elementContext.root.render.write(\n () => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.style.cssText = \"\";\n unapply = this.applyStyles(element, current, stopCallbacks);\n },\n this.getUpdateKey(\"styles\", \"*\"),\n );\n });\n\n stopCallbacks.push(stop);\n propStopCallbacks.push(stop);\n } else {\n const mapped = getStyleMap(styles);\n\n for (const name in mapped) {\n const { value, priority } = mapped[name];\n\n if (isState(value)) {\n const stop = value.watch((current) => {\n this.elementContext.root.render.write(() => {\n if (current) {\n element.style.setProperty(name, String(current), priority);\n } else {\n element.style.removeProperty(name);\n }\n }); // NOTE: Not keyed; all update callbacks must run to apply all properties.\n });\n\n stopCallbacks.push(stop);\n propStopCallbacks.push(stop);\n } else if (value != undefined) {\n element.style.setProperty(name, String(value));\n }\n }\n }\n\n return function unapply() {\n for (const stop of propStopCallbacks) {\n stop();\n stopCallbacks.splice(stopCallbacks.indexOf(stop), 1);\n }\n };\n }\n\n applyClasses(element: HTMLElement | SVGElement, classes: unknown, stopCallbacks: StopFunction[]) {\n const classStopCallbacks: StopFunction[] = [];\n\n if (isState(classes)) {\n let unapply: () => void;\n\n const stop = classes.watch((current) => {\n this.elementContext.root.render.write(\n () => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.removeAttribute(\"class\");\n unapply = this.applyClasses(element, current, stopCallbacks);\n },\n this.getUpdateKey(\"attr\", \"class\"),\n );\n });\n\n stopCallbacks.push(stop);\n classStopCallbacks.push(stop);\n } else {\n const mapped = getClassMap(classes);\n\n for (const name in mapped) {\n const value = mapped[name];\n\n if (isState(value)) {\n const stop = value.watch((current) => {\n this.elementContext.root.render.write(() => {\n if (current) {\n element.classList.add(name);\n } else {\n element.classList.remove(name);\n }\n }); // NOTE: Not keyed; all update callbacks must run to apply all classes.\n });\n\n stopCallbacks.push(stop);\n classStopCallbacks.push(stop);\n } else if (value) {\n element.classList.add(name);\n }\n }\n }\n\n return function unapply() {\n for (const stop of classStopCallbacks) {\n stop();\n stopCallbacks.splice(stopCallbacks.indexOf(stop), 1);\n }\n };\n }\n}\n\n/**\n * Parse classes into a single object. Classes can be passed as a string, an object with class keys can boolean values, or an array with a mix of both.\n */\nfunction getClassMap(classes: unknown) {\n let mapped: Record<string, boolean> = {};\n\n if (isString(classes)) {\n // Support multiple classes in one string like HTML.\n const names = classes.split(\" \");\n for (const name of names) {\n mapped[name] = true;\n }\n } else if (isObject(classes)) {\n Object.assign(mapped, classes);\n } else if (Array.isArray(classes)) {\n Array.from(classes)\n .filter(Boolean)\n .forEach((item) => {\n Object.assign(mapped, getClassMap(item));\n });\n }\n\n // Delete undefined keys. These are usually the result of a class that is not specified in the stylesheet and would have no effect on appearance.\n delete mapped[\"undefined\"];\n\n return mapped;\n}\n\n/**\n * Parse styles into a single object.\n */\nfunction getStyleMap(styles: unknown) {\n let mapped: Record<string, { value: unknown; priority?: string }> = {};\n\n if (isString(styles)) {\n const lines = styles.split(\";\").filter((line) => line.trim() !== \"\");\n for (const line of lines) {\n const [key, _value] = line.split(\":\");\n const entry: { value: unknown; priority?: string } = {\n value: _value,\n };\n if (_value.includes(\"!important\")) {\n entry.priority = \"important\";\n entry.value = _value.replace(\"!important\", \"\").trim();\n } else {\n entry.value = _value.trim();\n }\n mapped[camelToKebab(key.trim())] = entry;\n }\n }\n if (isObject(styles)) {\n for (const key in styles) {\n if (key.startsWith(\"--\")) {\n // Pass through variable names without processing.\n mapped[key] = { value: styles[key] };\n } else {\n mapped[camelToKebab(key)] = { value: styles[key] };\n }\n }\n } else if (Array.isArray(styles)) {\n Array.from(styles)\n .filter((item) => item != null)\n .forEach((item) => {\n Object.assign(mapped, getStyleMap(item));\n });\n }\n\n return mapped;\n}\n\n/**\n * Converts a camelCase string to kebab-case.\n */\nexport function camelToKebab(value: string): string {\n return value.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? \"-\" : \"\") + $.toLowerCase());\n}\n\n/**\n * Attempts to convert `source` to the same type as `target`.\n * Returns `source` as-is if conversion is not possible.\n */\nfunction toTypeOf<T>(target: T, source: unknown): T | unknown {\n const type = typeof target;\n\n if (type === \"string\") {\n return String(source);\n }\n\n if (type === \"number\") {\n return Number(source);\n }\n\n if (type === \"boolean\") {\n return Boolean(source);\n }\n\n return source;\n}\n\n// Attributes in this list will not be forwarded to the DOM node.\nconst privateProps = [\"ref\", \"children\", \"class\", \"style\", \"data\"];\n","import {\n constructMarkup,\n isMarkup,\n isMarkupElement,\n isRenderable,\n mergeElements,\n toMarkup,\n type ElementContext,\n type MarkupElement,\n} from \"../markup.js\";\nimport { createWatcher, type State, type StopFunction } from \"../state.js\";\nimport { typeOf } from \"../typeChecking.js\";\nimport type { Renderable } from \"../types.js\";\n\ninterface ObserverOptions {\n elementContext: ElementContext;\n states: State<any>[];\n renderFn: (...values: any) => Renderable;\n}\n\n/**\n * Displays dynamic children without a parent element.\n */\nexport class Observer implements MarkupElement {\n node: Node;\n endNode: Node;\n connectedViews: MarkupElement[] = [];\n renderFn: (...values: any) => Renderable;\n elementContext;\n observerControls;\n watcher = createWatcher();\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor({ states, renderFn, elementContext }: ObserverOptions) {\n this.elementContext = elementContext;\n this.renderFn = renderFn;\n\n this.node = document.createComment(\"Observer\");\n this.endNode = document.createComment(\"/Observer\");\n\n let _stop: StopFunction | undefined;\n\n this.observerControls = {\n start: () => {\n if (_stop != null) return;\n\n _stop = this.watcher.watch(states, (...values) => {\n const rendered = this.renderFn(...values);\n\n if (!isRenderable(rendered)) {\n console.error(rendered);\n throw new TypeError(\n `Observer received invalid value to render. Got type: ${typeOf(rendered)}, value: ${rendered}`,\n );\n }\n\n if (Array.isArray(rendered)) {\n this.update(...rendered);\n } else {\n this.update(rendered);\n }\n });\n },\n stop: () => {\n if (_stop == null) return;\n\n _stop();\n _stop = undefined;\n },\n };\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n this.observerControls.start();\n }\n }\n\n unmount() {\n this.observerControls.stop();\n this.watcher.stopAll();\n\n if (this.isMounted) {\n this.cleanup();\n this.node.parentNode?.removeChild(this.node);\n }\n }\n\n cleanup() {\n while (this.connectedViews.length > 0) {\n this.connectedViews.pop()?.unmount();\n }\n }\n\n update(...children: Renderable[]) {\n this.cleanup();\n\n if (children == null || !this.isMounted) {\n return;\n }\n\n const nodes: MarkupElement[] = children.map((c) => {\n if (isMarkupElement(c)) {\n return c;\n } else if (isMarkup(c)) {\n return mergeElements(constructMarkup(this.elementContext, c));\n } else {\n return mergeElements(constructMarkup(this.elementContext, toMarkup(c)));\n }\n });\n\n for (const node of nodes) {\n const previous = this.connectedViews.at(-1)?.node || this.node;\n\n node.mount(this.node.parentNode!, previous);\n\n this.connectedViews.push(node);\n }\n\n // Move marker comment node to after last sibling in dev mode.\n if (this.elementContext.root.getEnv() === \"development\") {\n const lastNode = this.connectedViews.at(-1)?.node;\n if (this.endNode.previousSibling !== lastNode) {\n this.node.parentNode!.insertBefore(this.endNode, lastNode?.nextSibling ?? null);\n }\n }\n }\n}\n","import { type MarkupElement, type ElementContext } from \"../markup.js\";\nimport { type State, type StopFunction } from \"../state.js\";\n\nexport interface OutletConfig {\n $children: State<MarkupElement[]>;\n elementContext: ElementContext;\n}\n\n/**\n * Manages an array of DOMHandles.\n */\nexport class Outlet implements MarkupElement {\n node: Node;\n endNode: Node;\n $children: State<MarkupElement[]>;\n stopCallback?: StopFunction;\n mountedChildren: MarkupElement[] = [];\n elementContext: ElementContext;\n\n constructor(config: OutletConfig) {\n this.$children = config.$children;\n this.elementContext = config.elementContext;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node = document.createComment(\"Outlet\");\n this.endNode = document.createComment(\"/Outlet\");\n } else {\n this.node = document.createTextNode(\"\");\n this.endNode = document.createTextNode(\"\");\n }\n }\n\n get isMounted() {\n return this.node?.parentNode != null;\n }\n\n mount(parent: Node, after?: Node | undefined) {\n if (!this.isMounted) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n\n this.stopCallback = this.$children.watch((children) => {\n this.update(children);\n });\n }\n }\n\n unmount() {\n if (this.stopCallback) {\n this.stopCallback();\n this.stopCallback = undefined;\n }\n\n if (this.isMounted) {\n for (const child of this.mountedChildren) {\n child.unmount();\n }\n this.mountedChildren = [];\n this.endNode.parentNode?.removeChild(this.endNode);\n }\n }\n\n update(newChildren: MarkupElement[]) {\n for (const child of this.mountedChildren) {\n child.unmount();\n }\n\n for (let i = 0; i < newChildren.length; i++) {\n const child = newChildren[i];\n const previous = i > 0 ? newChildren[i] : undefined;\n child.mount(this.node.parentElement!, previous?.node);\n }\n\n this.mountedChildren = newChildren;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node.textContent = `Outlet (${newChildren.length} ${newChildren.length === 1 ? \"child\" : \"children\"})`;\n this.node.parentElement?.insertBefore(\n this.endNode,\n this.mountedChildren[this.mountedChildren.length - 1]?.node?.nextSibling ?? null,\n );\n }\n }\n}\n","import {\n mergeElements as mergeElements,\n isMarkupElement,\n isMarkup,\n constructMarkup,\n toMarkup,\n type MarkupElement,\n type ElementContext,\n} from \"../markup.js\";\nimport { type Renderable } from \"../types.js\";\n\ninterface PortalConfig {\n content: Renderable;\n parent: Node;\n elementContext: ElementContext;\n}\n\n/**\n * Renders content into a specified parent node.\n */\nexport class Portal implements MarkupElement {\n config: PortalConfig;\n element?: MarkupElement;\n\n get isMounted() {\n if (!this.element) {\n return false;\n }\n return this.element.isMounted;\n }\n\n constructor(config: PortalConfig) {\n this.config = config;\n }\n\n mount(_parent: Node, _after?: Node) {\n const { content, parent } = this.config;\n\n if (isMarkupElement(content)) {\n this.element = content;\n } else if (isMarkup(content)) {\n this.element = mergeElements(constructMarkup(this.config.elementContext, content));\n } else {\n this.element = mergeElements(constructMarkup(this.config.elementContext, toMarkup(content)));\n }\n\n this.element.mount(parent);\n }\n\n unmount() {\n if (this.element?.isMounted) {\n this.element.unmount();\n }\n }\n}\n","import { nanoid } from \"nanoid\";\nimport {\n type MarkupElement,\n type ElementContext,\n mergeElements,\n isMarkup,\n createMarkup,\n type Markup,\n constructMarkup,\n} from \"./markup.js\";\nimport type { Logger } from \"./modules/dolla.js\";\nimport {\n createState,\n createWatcher,\n isState,\n type MaybeState,\n Setter,\n State,\n type StateValues,\n type StopFunction,\n} from \"./state.js\";\nimport { isArrayOf, typeOf } from \"./typeChecking.js\";\n\n/*=====================================*\\\n|| Types ||\n\\*=====================================*/\n\n/**\n * Any valid value that a View can return.\n */\nexport type ViewResult = Node | State<any> | Markup | Markup[] | null;\n\nexport type ViewFunction<P> = (props: P, context: ViewContext) => ViewResult;\n\n/**\n * A view that has been constructed into DOM nodes.\n */\nexport interface ViewElement extends MarkupElement {\n /**\n * Take a ViewFunction and render it as a child of this view.\n */\n setChildView(view: ViewFunction<{}>): ViewElement;\n}\n\nexport interface ViewContext extends Logger {\n /**\n * A string ID unique to this view.\n */\n readonly uid: string;\n\n /**\n * Sets a context variable and returns its value. Context variables are accessible on the same context and from those of child views.\n */\n set<T>(key: string | symbol, value: T): T;\n\n /**\n * Gets the value of a context variable. Returns null if the variable is not set.\n */\n get<T>(key: string | symbol): T | null;\n\n /**\n * Returns an object of all variables stored on this context.\n */\n getAll(): Record<string | symbol, unknown>;\n\n /**\n * Sets the name of the view's built in logger.\n */\n setName(name: string): ViewContext;\n\n /**\n * Registers a callback to run just before this view is mounted. DOM nodes are not yet attached to the page.\n */\n beforeMount(callback: () => void): void;\n\n /**\n * Registers a callback to run just after this view is mounted.\n */\n onMount(callback: () => void): void;\n\n /**\n * Registers a callback to run just before this view is unmounted. DOM nodes are still attached to the page.\n */\n beforeUnmount(callback: () => void): void;\n\n /**\n * Registers a callback to run just after this view is unmounted.\n */\n onUnmount(callback: () => void): void;\n\n /**\n * Watch a set of states. The callback is called when any of the states receive a new value.\n * Watchers will be automatically stopped when this view is unmounted.\n */\n watch<T extends MaybeState<any>[]>(states: [...T], callback: (...values: StateValues<T>) => void): StopFunction;\n\n /**\n * Returns a Markup element that displays this view's children.\n */\n outlet(): Markup;\n}\n\n/*=====================================*\\\n|| View Init ||\n\\*=====================================*/\n\n// Defines logger methods on context.\ninterface Context extends Logger {}\n\nclass Context implements ViewContext {\n __view;\n\n constructor(view: View<any>) {\n this.__view = view;\n\n // Copy logger methods from logger.\n const descriptors = Object.getOwnPropertyDescriptors(this.__view._logger);\n for (const key in descriptors) {\n if (key !== \"getName\") {\n Object.defineProperty(this, key, descriptors[key]);\n }\n }\n }\n\n get uid() {\n return this.__view.uniqueId;\n }\n\n setName(name: string): ViewContext {\n this.__view._logger.setName(name);\n return this;\n }\n\n set<T>(key: string | symbol, value: T): T {\n this.__view._elementContext.data[key] = value;\n return value;\n }\n\n get<T>(key: string | symbol): T | null {\n let ctx = this.__view._elementContext;\n\n while (true) {\n if (key in ctx.data) {\n return ctx.data[key] as T;\n } else if (ctx.parent) {\n ctx = ctx.parent;\n } else {\n break;\n }\n }\n\n return null;\n }\n\n getAll(): Record<string | symbol, unknown> {\n const contexts: Record<string | symbol, unknown>[] = [];\n\n let ctx = this.__view._elementContext;\n while (true) {\n contexts.push(ctx.data);\n\n if (ctx.parent) {\n ctx = ctx.parent;\n } else {\n break;\n }\n }\n\n const data: Record<string | symbol, unknown> = {};\n\n // Iterate data objects in top -> bottom order.\n for (const context of contexts.reverse()) {\n Object.assign(data, context);\n }\n\n return data;\n }\n\n beforeMount(callback: () => void): void {\n this.__view._beforeMountCallbacks.push(callback);\n }\n\n onMount(callback: () => void): void {\n this.__view._onMountCallbacks.push(callback);\n }\n\n beforeUnmount(callback: () => void): void {\n this.__view._beforeUnmountCallbacks.push(callback);\n }\n\n onUnmount(callback: () => void): void {\n this.__view._onUnmountCallbacks.push(callback);\n }\n\n watch<T extends MaybeState<any>[]>(states: [...T], callback: (...values: StateValues<T>) => void): StopFunction {\n const view = this.__view;\n\n if (view.isMounted) {\n // If called when the component is connected, we assume this code is in a lifecycle hook\n // where it will be triggered at some point again after the component is reconnected.\n return view._watcher.watch(states, callback);\n } else {\n // This should only happen if called in the body of the component function.\n // This code is not always re-run between when a component is unmounted and remounted.\n let stop: StopFunction | undefined;\n let isStopped = false;\n view._onMountCallbacks.push(() => {\n if (!isStopped) {\n stop = view._watcher.watch(states, callback);\n }\n });\n return () => {\n if (stop != null) {\n isStopped = true;\n stop();\n }\n };\n }\n }\n\n outlet(): Markup {\n return createMarkup(\"$outlet\", { $children: this.__view._$children });\n }\n}\n\nexport class View<P> implements ViewElement {\n uniqueId = nanoid();\n\n _elementContext: ElementContext;\n _logger;\n _view;\n _props;\n\n _element?: MarkupElement;\n\n _$children;\n _setChildren;\n\n _watcher = createWatcher();\n _beforeMountCallbacks: (() => any)[] = [];\n _onMountCallbacks: (() => any)[] = [];\n _beforeUnmountCallbacks: (() => any)[] = [];\n _onUnmountCallbacks: (() => any)[] = [];\n\n constructor(elementContext: ElementContext, view: ViewFunction<P>, props: P, children: Markup[] = []) {\n this._elementContext = { ...elementContext, data: {}, parent: elementContext };\n this._logger = elementContext.root.createLogger(view.name, { uid: this.uniqueId });\n this._view = view;\n this._props = props;\n\n const [$children, setChildren] = createState<MarkupElement[]>(constructMarkup(elementContext, children));\n this._$children = $children;\n this._setChildren = setChildren;\n }\n\n /*===============================*\\\n || \"Public\" API ||\n \\*===============================*/\n\n get node() {\n return this._element?.node!;\n }\n\n isMounted = false;\n\n mount(parent: Node, after?: Node) {\n // Don't run lifecycle hooks or initialize if already connected.\n // Calling connect again can be used to re-order elements that are already connected to the DOM.\n const wasConnected = this.isMounted;\n\n if (!wasConnected) {\n this.initialize();\n while (this._beforeMountCallbacks.length > 0) {\n const callback = this._beforeMountCallbacks.shift()!;\n callback();\n }\n }\n\n if (this._element) {\n this._element.mount(parent, after);\n }\n\n if (!wasConnected) {\n this.isMounted = true;\n\n requestAnimationFrame(() => {\n while (this._onMountCallbacks.length > 0) {\n const callback = this._onMountCallbacks.shift()!;\n callback();\n }\n });\n }\n }\n\n unmount() {\n while (this._beforeUnmountCallbacks.length > 0) {\n const callback = this._beforeUnmountCallbacks.shift()!;\n callback();\n }\n\n if (this._element) {\n this._element.unmount();\n }\n\n this.isMounted = false;\n\n while (this._onUnmountCallbacks.length > 0) {\n const callback = this._onUnmountCallbacks.shift()!;\n callback();\n }\n\n this._watcher.stopAll();\n }\n\n setChildView(fn: ViewFunction<{}>) {\n const node = new View(this._elementContext, fn, {});\n this._setChildren([node]);\n return node;\n }\n\n /*===============================*\\\n || Internal ||\n \\*===============================*/\n\n initialize() {\n const context = new Context(this);\n\n let result: ViewResult;\n try {\n result = this._view(this._props, context);\n } catch (error) {\n if (error instanceof Error) {\n this._logger.crash(error);\n }\n throw error;\n }\n\n if (result === null) {\n // Do nothing.\n } else if (result instanceof Node) {\n this._element = mergeElements(constructMarkup(this._elementContext, createMarkup(\"$node\", { value: result })));\n } else if (isMarkup(result) || isArrayOf<Markup>(isMarkup, result)) {\n this._element = mergeElements(constructMarkup(this._elementContext, result));\n } else if (isState(result)) {\n this._element = mergeElements(\n constructMarkup(this._elementContext, createMarkup(\"$observer\", { states: [result], renderFn: (x) => x })),\n );\n } else {\n const error = new TypeError(\n `Expected '${\n this._view.name\n }' function to return a DOM node, Markup element, Readable or null. Got: ${typeOf(result)}`,\n );\n this._logger.crash(error);\n }\n }\n}\n","import { type MarkupElement, type ElementContext } from \"../markup.js\";\nimport { createState, type State, type Setter, type StopFunction } from \"../state.js\";\nimport { View, type ViewContext, type ViewResult } from \"../view.js\";\n\n// ----- Types ----- //\n\ninterface RepeatOptions<T> {\n elementContext: ElementContext;\n $items: State<T[]>;\n keyFn: (value: T, index: number) => string | number | symbol;\n renderFn: ($value: State<T>, $index: State<number>, ctx: ViewContext) => ViewResult;\n}\n\ntype ConnectedItem<T> = {\n key: any;\n $value: State<T>;\n setValue: Setter<T>;\n $index: State<number>;\n setIndex: Setter<number>;\n element: MarkupElement;\n};\n\n// ----- Code ----- //\n\nexport class Repeat<T> implements MarkupElement {\n node: Node;\n endNode: Node;\n $items: State<T[]>;\n stopCallback?: StopFunction;\n connectedItems: ConnectedItem<T>[] = [];\n elementContext;\n renderFn: ($value: State<T>, $index: State<number>, ctx: ViewContext) => ViewResult;\n keyFn: (value: T, index: number) => string | number | symbol;\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor({ elementContext, $items, renderFn, keyFn }: RepeatOptions<T>) {\n this.elementContext = elementContext;\n\n this.$items = $items;\n this.renderFn = renderFn;\n this.keyFn = keyFn;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node = document.createComment(\"Repeat\");\n this.endNode = document.createComment(\"/Repeat\");\n } else {\n this.node = document.createTextNode(\"\");\n this.endNode = document.createTextNode(\"\");\n }\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n\n this.stopCallback = this.$items.watch((value) => {\n this._update(Array.from(value));\n });\n }\n }\n\n unmount() {\n if (this.stopCallback) {\n this.stopCallback();\n this.stopCallback = undefined;\n }\n\n if (this.isMounted) {\n this.node.parentNode?.removeChild(this.node);\n this.endNode.parentNode?.removeChild(this.endNode);\n }\n\n this._cleanup();\n }\n\n _cleanup() {\n for (const item of this.connectedItems) {\n item.element.unmount();\n }\n this.connectedItems = [];\n }\n\n _update(value: T[]) {\n if (value.length === 0 || !this.isMounted) {\n return this._cleanup();\n }\n\n type UpdateItem = { key: string | number | symbol; value: T; index: number };\n\n const potentialItems: UpdateItem[] = [];\n let index = 0;\n\n for (const item of value) {\n potentialItems.push({\n key: this.keyFn(item, index),\n value: item,\n index: index++,\n });\n }\n\n const newItems: ConnectedItem<T>[] = [];\n\n // Remove views for items that no longer exist in the new list.\n for (const connected of this.connectedItems) {\n const potentialItem = potentialItems.find((p) => p.key === connected.key);\n\n if (!potentialItem) {\n connected.element.unmount();\n }\n }\n\n // Add new views and update state for existing ones.\n for (const potential of potentialItems) {\n const connected = this.connectedItems.find((item) => item.key === potential.key);\n\n if (connected) {\n connected.setValue(potential.value);\n connected.setIndex(potential.index);\n newItems[potential.index] = connected;\n } else {\n const [$value, setValue] = createState<T>(potential.value);\n const [$index, setIndex] = createState(potential.index);\n\n newItems[potential.index] = {\n key: potential.key,\n $value,\n setValue,\n $index,\n setIndex,\n element: new View(this.elementContext, RepeatItemView, {\n $value,\n $index,\n renderFn: this.renderFn,\n }),\n };\n }\n }\n\n // Reconnect to ensure order. Lifecycle hooks won't be run again if the view is already connected.\n for (let i = 0; i < newItems.length; i++) {\n const item = newItems[i];\n const previous = newItems[i - 1]?.element.node ?? this.node;\n item.element.mount(this.node.parentNode!, previous);\n }\n\n this.connectedItems = newItems;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node.textContent = `Repeat (${newItems.length} item${newItems.length === 1 ? \"\" : \"s\"})`;\n\n const lastItem = newItems.at(-1)?.element.node ?? this.node;\n this.node.parentNode?.insertBefore(this.endNode, lastItem.nextSibling);\n }\n }\n}\n\ninterface RepeatItemProps {\n $value: State<any>;\n $index: State<number>;\n renderFn: ($value: State<any>, $index: State<number>, ctx: ViewContext) => ViewResult;\n}\n\nfunction RepeatItemView({ $value, $index, renderFn }: RepeatItemProps, ctx: ViewContext) {\n return renderFn($value, $index, ctx);\n}\n","import { type MarkupElement } from \"../markup.js\";\nimport { isState, type MaybeState, type StopFunction } from \"../state.js\";\n\ninterface Stringable {\n toString(): string;\n}\n\ninterface TextOptions {\n value: MaybeState<Stringable>;\n}\n\nexport class Text implements MarkupElement {\n node = document.createTextNode(\"\");\n value: MaybeState<Stringable> = \"\";\n stopCallback?: StopFunction;\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor({ value }: TextOptions) {\n this.value = value;\n }\n\n async mount(parent: Node, after: Node | null = null) {\n if (!this.isMounted) {\n if (isState<Stringable>(this.value)) {\n this.stopCallback = this.value.watch((value) => {\n this.update(value);\n });\n } else {\n this.update(this.value);\n }\n }\n\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n }\n\n async unmount() {\n if (this.isMounted) {\n if (this.stopCallback) {\n this.stopCallback();\n this.stopCallback = undefined;\n }\n\n this.node.parentNode!.removeChild(this.node);\n }\n }\n\n update(value?: Stringable) {\n if (value != null) {\n this.node.textContent = value.toString();\n } else {\n this.node.textContent = \"\";\n }\n }\n}\n","import htm from \"htm/mini\";\n\nimport type { Dolla } from \"./modules/dolla.js\";\nimport { Conditional } from \"./nodes/cond.js\";\nimport { HTML } from \"./nodes/html.js\";\nimport { Observer } from \"./nodes/observer.js\";\nimport { Outlet } from \"./nodes/outlet.js\";\nimport { Portal } from \"./nodes/portal.js\";\nimport { Repeat } from \"./nodes/repeat.js\";\nimport { Text } from \"./nodes/text.js\";\nimport { MaybeState, isRef, isSettableState, isState, toState, type State } from \"./state.js\";\nimport { isArray, isArrayOf, isFunction, isNumber, isObject, isString } from \"./typeChecking.js\";\nimport type { Renderable, Stringable } from \"./types.js\";\nimport { View, type ViewContext, type ViewFunction, type ViewResult } from \"./view.js\";\n\n/*===========================*\\\n|| ElementContext ||\n\\*===========================*/\n\nexport interface ElementContext {\n /**\n * The root Dolla instance this element belongs to.\n */\n root: Dolla;\n /**\n * Storage for context variables.\n */\n data: Record<string | symbol, unknown>;\n /**\n * A reference to the parent context.\n */\n parent?: ElementContext;\n /**\n * Whether to create DOM nodes in the SVG namespace. An `<svg>` element will set this to true and pass it down to children.\n */\n isSVG?: boolean;\n}\n\n/*===========================*\\\n|| Markup ||\n\\*===========================*/\n\n/**\n * Markup is a set of element metadata that hasn't been constructed into a MarkupElement yet.\n */\nexport interface Markup {\n /**\n * In the case of a view, type will be the View function itself. It can also hold an identifier for special nodes like \"$cond\", \"$repeat\", etc.\n * DOM nodes can be created by name, such as HTML elements like \"div\", \"ul\" or \"span\", SVG elements like \"\"\n */\n type: string | ViewFunction<any>;\n /**\n * Data that will be passed to a new MarkupElement instance when it is constructed.\n */\n props?: Record<string, any>;\n /**\n *\n */\n children?: Markup[];\n}\n\n/**\n * A DOM node that has been constructed from a Markup object.\n */\nexport interface MarkupElement {\n readonly node?: Node;\n\n readonly isMounted: boolean;\n\n mount(parent: Node, after?: Node): void;\n\n unmount(): void;\n}\n\nexport function isMarkup(value: unknown): value is Markup {\n return (\n isObject(value) &&\n (typeof value.type === \"string\" || typeof value.type === \"function\") &&\n Array.isArray(value.children)\n );\n}\n\nexport function isMarkupElement(value: unknown): value is MarkupElement {\n return isObject(value) && isFunction(value.connect) && isFunction(value.disconnect);\n}\n\nexport function toMarkup(renderables: Renderable | Renderable[]): Markup[] {\n if (!isArray(renderables)) {\n renderables = [renderables];\n }\n\n return renderables\n .flat(Infinity)\n .filter((x) => x !== null && x !== undefined && x !== false)\n .map((x) => {\n if (x instanceof Node) {\n return createMarkup(\"$node\", { value: x });\n }\n\n if (x instanceof DOMNode) {\n return createMarkup(\"$node\", { value: x.node });\n }\n\n if (isMarkup(x)) {\n return x;\n }\n\n if (isString(x) || isNumber(x)) {\n return createMarkup(\"$text\", { value: x });\n }\n\n if (isState(x)) {\n return createMarkup(\"$observer\", {\n states: [x],\n renderFn: (x) => x,\n });\n }\n\n console.error(x);\n throw new TypeError(`Unexpected child type. Got: ${x}`);\n });\n}\n\nexport interface MarkupAttributes {\n $text: { value: MaybeState<Stringable> };\n $cond: { $predicate: State<any>; thenContent?: Renderable; elseContent?: Renderable };\n $repeat: {\n $items: State<any[]>;\n keyFn: (value: any, index: number) => string | number | symbol;\n renderFn: ($item: State<any>, $index: State<number>, c: ViewContext) => ViewResult;\n };\n $observer: {\n states: State<any>[];\n renderFn: (...items: any) => Renderable;\n };\n $outlet: {\n $children: State<MarkupElement[]>;\n };\n $node: {\n value: Node;\n };\n $portal: {\n content: Renderable;\n parent: Node;\n };\n\n [tag: string]: Record<string, any>;\n}\n\nexport function createMarkup<T extends keyof MarkupAttributes>(\n type: T,\n attributes: MarkupAttributes[T],\n ...children: Renderable[]\n): Markup;\n\nexport function createMarkup<I>(type: ViewFunction<I>, attributes?: I, ...children: Renderable[]): Markup;\n\nexport function createMarkup<P>(type: string | ViewFunction<P>, props?: P, ...children: Renderable[]) {\n if (props != null) {\n _assertPropTypes(props as Record<string, any>);\n }\n\n return {\n type,\n props,\n children: toMarkup(children),\n };\n}\n\n/**\n * Throws an error if expectations based on naming conventions aren't met.\n */\nfunction _assertPropTypes(props: Record<string, any>) {\n if (props.ref) {\n if (!isRef(props.ref)) {\n console.warn(props.ref);\n throw new TypeError(`Prop 'ref' must be a Ref object. Got: ${props.ref}`);\n }\n }\n\n for (const key in props) {\n if (key.startsWith(\"$$\") && props[key] !== undefined) {\n if (!isSettableState(props[key])) {\n throw new TypeError(`Prop '${key}' is named as a SettableState but value is not. Got: ${props[key]}`);\n }\n } else if (key.startsWith(\"$\") && props[key] !== undefined) {\n if (!isState(props[key])) {\n throw new TypeError(`Prop '${key}' is named as a State but value is not. Got: ${props[key]}`);\n }\n }\n }\n}\n\n/*===========================*\\\n|| View Helpers ||\n\\*===========================*/\n\n/**\n * Generate markup with HTML in a tagged template literal.\n */\nexport const html = htm.bind(createMarkup);\n\n/**\n * Displays content conditionally. When `predicate` holds a truthy value, `thenContent` is displayed; when `predicate` holds a falsy value, `elseContent` is displayed.\n */\nexport function cond(predicate: MaybeState<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n const $predicate = toState(predicate);\n\n return createMarkup(\"$cond\", {\n $predicate,\n thenContent,\n elseContent,\n });\n}\n\n/**\n * Calls `renderFn` for each item in `items`. Dynamically adds and removes views as items change.\n * The result of `keyFn` is used to compare items and decide if item was added, removed or updated.\n */\nexport function repeat<T>(\n items: MaybeState<T[]>,\n keyFn: (value: T, index: number) => string | number | symbol,\n renderFn: ($value: State<T>, $index: State<number>, ctx: ViewContext) => ViewResult,\n): Markup {\n const $items = toState(items);\n\n return createMarkup(\"$repeat\", { $items, keyFn, renderFn });\n}\n\n/**\n * Render `content` into a `parent` node anywhere in the page, rather than at its position in the view.\n */\nexport function portal(parent: Node, content: Renderable) {\n return createMarkup(\"$portal\", { parent, content });\n}\n\n/*===========================*\\\n|| Render ||\n\\*===========================*/\n\n/**\n * Wraps any plain DOM node in a MarkupElement interface.\n */\nclass DOMNode implements MarkupElement {\n node: Node;\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor(node: Node) {\n this.node = node;\n }\n\n async mount(parent: Node, after?: Node) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n }\n\n async unmount() {\n if (this.node.parentNode) {\n this.node.parentNode.removeChild(this.node);\n }\n }\n}\n\n/**\n * Construct Markup metadata into a set of MarkupElements.\n */\nexport function constructMarkup(elementContext: ElementContext, markup: Markup | Markup[]): MarkupElement[] {\n const items = isArray(markup) ? markup : [markup];\n\n return items.map((item) => {\n if (isFunction(item.type)) {\n return new View(elementContext, item.type as ViewFunction<any>, item.props, item.children);\n } else if (isString(item.type)) {\n switch (item.type) {\n case \"$node\": {\n const attrs = item.props! as MarkupAttributes[\"$node\"];\n return new DOMNode(attrs.value);\n }\n case \"$text\": {\n const attrs = item.props! as MarkupAttributes[\"$text\"];\n return new Text({\n value: attrs.value,\n });\n }\n case \"$cond\": {\n const attrs = item.props! as MarkupAttributes[\"$cond\"];\n return new Conditional({\n $predicate: attrs.$predicate,\n thenContent: attrs.thenContent,\n elseContent: attrs.elseContent,\n elementContext,\n });\n }\n case \"$repeat\": {\n const attrs = item.props! as MarkupAttributes[\"$repeat\"];\n return new Repeat({\n $items: attrs.$items,\n keyFn: attrs.keyFn,\n renderFn: attrs.renderFn,\n elementContext,\n });\n }\n case \"$observer\": {\n const attrs = item.props! as MarkupAttributes[\"$observer\"];\n return new Observer({\n states: attrs.states,\n renderFn: attrs.renderFn,\n elementContext,\n });\n }\n case \"$outlet\": {\n const attrs = item.props! as MarkupAttributes[\"$outlet\"];\n return new Outlet({\n $children: attrs.$children,\n elementContext,\n });\n }\n case \"$portal\": {\n const attrs = item.props! as MarkupAttributes[\"$portal\"];\n return new Portal({\n content: attrs.content,\n parent: attrs.parent,\n elementContext,\n });\n }\n default:\n if (item.type.startsWith(\"$\")) {\n throw new Error(`Unknown markup type: ${item.type}`);\n }\n return new HTML({\n tag: item.type,\n props: item.props ?? {},\n children: item.children,\n elementContext,\n });\n }\n } else {\n throw new TypeError(`Expected a string or view function. Got: ${item.type}`);\n }\n });\n}\n\n/**\n * Combines one or more MarkupElements into a single MarkupElement.\n */\nexport function mergeElements(nodes: MarkupElement[]): MarkupElement {\n if (nodes.length === 1) {\n return nodes[0];\n }\n\n const node = document.createComment(\"Fragment\");\n\n let isConnected = false;\n\n return {\n get node() {\n return node;\n },\n get isMounted() {\n return isConnected;\n },\n mount(parent: Node, after?: Node) {\n parent.insertBefore(node, after ? after : null);\n\n for (const handle of nodes) {\n const previous = nodes[nodes.length - 1]?.node ?? node;\n handle.mount(parent, previous);\n }\n\n isConnected = true;\n },\n unmount() {\n if (isConnected) {\n for (const handle of nodes) {\n handle.unmount();\n }\n\n node.remove();\n }\n\n isConnected = false;\n },\n };\n}\n\nexport function isRenderable(value: unknown): value is Renderable {\n return (\n value == null ||\n value === false ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n isMarkup(value) ||\n isState(value) ||\n isArrayOf(isRenderable, value)\n );\n}\n","import { type ViewContext } from \"../view.js\";\n\n/**\n * A utility view that simply displays its children.\n */\nexport function Passthrough(_: {}, ctx: ViewContext) {\n return ctx.outlet();\n}\n"],"names":["exports","_slicedToArray","a","b","c","d","e","f","g","h","rgbToHex","hslToRgb","i","hslGeneration","standardHashFunction","generateColorHash","j","l","m","n","o","p","q","r","s","module","typeOf","value","type","isClass","isArray","isPromise","isArrayOf","args","check","test","item","assertArrayOf","message","isString","formatError","assertString","errorMessage","isFunction","isNumber","obj","assertInstanceOf","constructor","isObject","typeName","valueString","_a","noOp","omit","keys","object","process","newObject","key","getDefaultConsole","colorFromString","colorHash","createMatcher","pattern","matchers","parts","part","section","name","positive","negative","fn","tracker","TYPE_STATE","TYPE_SETTABLE_STATE","TYPE_REF","isState","isSettableState","isRef","valueOf","toState","Signal","callback","options","ValueHolder","__publicField","next","current","action","watcher","err","index","createState","initialValue","_b","SettableSignal","createSettableState","toSettableState","$state","setter","createSetter","nextOrCallback","EMPTY","DerivedValueHolder","states","createWatcher","watchers","sources","sourceValues","changed","derive","RefSignal","createRef","stopFns","stop","htm","t","Conditional","config","toMarkup","parent","after","handle","constructMarkup","previous","urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","isCamelCaseEventName","HTML","tag","props","children","elementContext","child","updateKey","element","values","listener","updated","toTypeOf","eventName","privateProps","_key","styles","stopCallbacks","propStopCallbacks","unapply","mapped","getStyleMap","priority","classes","classStopCallbacks","getClassMap","names","lines","line","_value","entry","camelToKebab","$","ofs","target","source","Observer","renderFn","_stop","rendered","isRenderable","nodes","isMarkupElement","isMarkup","mergeElements","node","lastNode","Outlet","newChildren","_c","Portal","_parent","_after","content","Context","view","descriptors","ctx","contexts","data","context","isStopped","createMarkup","View","$children","setChildren","wasConnected","result","error","x","Repeat","$items","keyFn","potentialItems","newItems","connected","potential","$value","setValue","$index","setIndex","RepeatItemView","lastItem","Text","renderables","DOMNode","_assertPropTypes","html","cond","predicate","thenContent","elseContent","$predicate","repeat","items","portal","markup","attrs","isConnected","Passthrough","_"],"mappings":";;;;;;;;;AAAa,WAAO,eAAuBA,GAAA,cAAa,EAAC,OAAM,GAAE,CAAC;AAAE,QAAIC,IAAe,2BAAU;AAAC,eAASC,EAAEA,GAAEC,GAAE;AAAC,YAAIC,IAAE,CAAE,GAACC,IAAE,IAAGC,IAAE,IAAGC,IAAE;AAAO,YAAG;AAAC,mBAAQC,GAAEC,IAAEP,EAAE,OAAO,QAAQ,EAAG,GAAC,EAAEG,KAAGG,IAAEC,EAAE,KAAI,GAAI,UAAQL,EAAE,KAAKI,EAAE,KAAK,GAAE,EAAEL,KAAGC,EAAE,WAASD,KAAIE,IAAE,GAAG;AAAA,QAAC,SAAOH,GAAE;AAAC,UAAAI,IAAE,IAAGC,IAAEL;AAAA,QAAC,UAAC;AAAQ,cAAG;AAAC,aAACG,KAAGI,EAAE,UAAWA,EAAE,OAAS;AAAA,UAAE,UAAC;AAAQ,gBAAGH,EAAE,OAAMC;AAAA,UAAC;AAAA,QAAC;AAAC,eAAOH;AAAA,MAAC;AAAC,aAAO,SAASD,GAAEC,GAAE;AAAC,YAAG,MAAM,QAAQD,CAAC,EAAE,QAAOA;AAAE,YAAG,OAAO,YAAY,OAAOA,CAAC,EAAE,QAAOD,EAAEC,GAAEC,CAAC;AAAE,cAAM,IAAI,UAAU,sDAAsD;AAAA,MAAC;AAAA,IAAC,EAAC,GAAGM,IAAS,SAASR,GAAE;AAAC,aAAOA,EAAE,OAAO,SAASA,GAAEC,GAAE;AAAC,eAAO,KAAGA,IAAED,IAAE,MAAIC,EAAE,SAAS,EAAE,IAAED,IAAEC,EAAE,SAAS,EAAE;AAAA,MAAC,GAAE,GAAG;AAAA,IAAC,GAAEQ,IAAS,SAAST,GAAEC,GAAEC,GAAE;AAAC,UAAI,IAAE,MAAGA,IAAEA,KAAG,IAAED,KAAGC,IAAED,IAAEC,IAAED,GAAEG,IAAE,IAAEF,IAAE,GAAEG,IAAE,SAASL,GAAEC,GAAEC,GAAE;AAAC,YAAIC,IAAE,KAAK,OAAMC,IAAE,IAAEF,IAAEA,IAAE,IAAE,IAAEA,IAAEA,IAAE,IAAEA;AAAE,eAAOE,IAAEA,IAAE,IAAE,IAAEJ,IAAE,KAAGC,IAAED,KAAGI,IAAEA,IAAE,IAAE,IAAEH,IAAEG,IAAE,IAAE,IAAEJ,IAAE,KAAGC,IAAED,MAAI,IAAE,IAAEI,KAAGJ,GAAEG,EAAE,MAAIC,CAAC;AAAA,MAAC,GAAEE,IAAED,EAAED,GAAE,GAAEJ,IAAE,IAAE,CAAC,GAAEO,IAAEF,EAAED,GAAE,GAAEJ,CAAC,GAAEU,IAAEL,EAAED,GAAE,GAAEJ,IAAE,IAAE,CAAC;AAAE,aAAM,CAACM,GAAEC,GAAEG,CAAC;AAAA,IAAC,GAAEC,IAAc,SAASX,GAAEC,GAAEC,GAAE,GAAE;AAAC,UAAIE,IAAEJ,IAAE,OAAK,MAAKK,IAAE,SAASL,GAAEC,GAAEC,GAAE;AAAC,eAAOF,KAAGE,IAAED,KAAGA;AAAA,MAAC,GAAEK,IAAED,EAAED,GAAEH,EAAE,KAAIA,EAAE,GAAG,GAAEM,IAAEF,EAAED,GAAEF,EAAE,KAAIA,EAAE,GAAG,GAAEQ,IAAEL,EAAED,GAAE,EAAE,KAAI,EAAE,GAAG;AAC9+B,aAAM,CAACE,GAAEC,GAAEG,CAAC;AAAA,IAAC,GAAEE,IAAqB,SAASZ,GAAE;AAAC,aAAOA,EAAE,MAAM,EAAE,EAAE,OAAO,SAASA,GAAEC,GAAEC,GAAE;AAAC,eAAOF,IAAEC,EAAE,WAAW,CAAC,IAAEC,IAAE;AAAA,MAAC,GAAE,CAAC;AAAA,IAAC,GAAEW,IAAkB,SAASb,GAAE;AAAC,UAAIC,IAAED,EAAE,KAAIE,IAAEF,EAAE,KAAI,IAAEE,MAAI,SAAO,EAAC,KAAI,GAAE,KAAI,IAAG,IAAEA,GAAEE,IAAEJ,EAAE,KAAIK,IAAED,MAAI,SAAO,EAAC,KAAI,MAAI,KAAI,KAAG,IAAEA,GAAEE,IAAEN,EAAE,OAAMO,IAAED,MAAI,SAAO,EAAC,KAAI,KAAG,KAAI,IAAE,IAAEA,GAAEI,IAAEV,EAAE,cAAac,IAAEJ,MAAI,SAAOE,IAAqBF,GAAE,IAAEV,EAAE,QAAOe,IAAE,MAAI,SAAO,QAAM,GAAEC,IAAEL,EAAcG,EAAEb,CAAC,GAAE,GAAEI,GAAEE,CAAC,GAAEU,IAAElB,EAAeiB,GAAE,CAAC,GAAEE,IAAED,EAAE,CAAC,GAAEE,IAAEF,EAAE,CAAC,GAAEG,IAAEH,EAAE,CAAC,GAAEI,IAAEZ,EAASS,IAAE,KAAIC,GAAEC,CAAC,GAAEE,KAAEd,EAASa,CAAC;AAAE,aAAWN,MAAR,QAAgB,CAACG,GAAEC,GAAEC,CAAC,IAAgBL,MAAR,QAAUM,IAAEC;AAAA,IAAC;AA2B1gB,IAAAxB,YAAgBe,GAAkBU,EAAe,UAAAzB,EAAQ;AAAA;;;;ACRrD,SAAS0B,EAAOC,GAA2B;AAChD,MAAIA,MAAU;AACL,WAAA;AAGT,MAAIA,MAAU;AACL,WAAA;AAGT,QAAMC,IAAO,OAAOD;AAEpB,UAAQC,GAAM;AAAA,IACZ,KAAK;AACC,aAAA,MAAMD,CAAY,IACb,QAEF;AAAA,IACT,KAAK;AACC,aAAAE,GAAQF,CAAK,IACR,UAGFC;AAAA,IACT,KAAK;AACC,aAAAE,EAAQH,CAAK,IACR,UAGLI,GAAUJ,CAAK,IACV,YAGFC;AAAA,IACT;AACS,aAAAA;AAAA,EAAA;AAEb;AAmBO,SAASE,EAAQH,GAAyC;AACxD,SAAA,MAAM,QAAQA,CAAK;AAC5B;AA4BO,SAASK,MAAgBC,GAAiB;AACzC,QAAAC,IAAQD,EAAK,CAAC,GAEdE,IAAO,CAACR,MACLG,EAAQH,CAAK,KAAKA,EAAM,MAAM,CAACS,MAASF,EAAME,CAAI,CAAC;AAGxD,SAAAH,EAAK,SAAS,IACTE,IAEAA,EAAKF,EAAK,CAAC,CAAC;AAEvB;AAsBO,SAASI,MAAoBJ,GAAiB;AAC7C,QAAAC,IAAQD,EAAK,CAAC,GACdK,IAAUC,EAASN,EAAK,CAAC,CAAC,IAAIA,EAAK,CAAC,IAAI,6DAExCE,IAAO,CAACR,MAAiC;AACzC,QAAAG,EAAQH,CAAK,KAAKA,EAAM,MAAM,CAACS,MAASF,EAAME,CAAI,CAAC;AAC9C,aAAA;AAGT,UAAM,IAAI,UAAUI,EAAYb,GAAOW,CAAO,CAAC;AAAA,EACjD;AAEI,SAAAL,EAAK,SAAS,IACTE,IAEAA,EAAKF,EAAK,CAAC,CAAC;AAEvB;AAuBO,SAASM,EAASZ,GAAiC;AACxD,SAAO,OAAOA,KAAU;AAC1B;AAKgB,SAAAc,GAAad,GAAgBe,GAAwC;AAC/E,MAAAH,EAASZ,CAAK;AACT,WAAA;AAGT,QAAM,IAAI,UAAUa,EAAYb,GAAOe,KAAgB,4CAA4C,CAAC;AACtG;AAOO,SAASC,EAAgDhB,GAA4B;AAC1F,SAAO,OAAOA,KAAU,cAAc,CAACE,GAAQF,CAAK;AACtD;AAgBO,SAASiB,GAASjB,GAAiC;AACxD,SAAO,OAAOA,KAAU,YAAY,CAAC,MAAMA,CAAK;AAClD;AAoBO,SAASI,GAAuBJ,GAAqC;AACtE,MAAAA,KAAS,KAAa,QAAA;AAE1B,QAAMkB,IAAMlB;AAEZ,SAAOkB,aAAe,WAAYF,EAAWE,EAAI,IAAI,KAAKF,EAAWE,EAAI,KAAK,KAAKF,EAAWE,EAAI,OAAO;AAC3G;AAoBO,SAAShB,GAAQF,GAA8C;AACpE,SAAO,OAAOA,KAAU,cAAc,eAAe,KAAKA,EAAM,UAAU;AAC5E;AA0DO,SAASmB,MAAwCb,GAAiB;AACjE,QAAAc,IAAcd,EAAK,CAAC,GACpBS,IAAeH,EAASN,EAAK,CAAC,CAAC,IACjCA,EAAK,CAAC,IACN,wBAAwBc,EAAY,IAAI,6BAEtCZ,IAAO,CAACR,MAA+B;AAC3C,QAAIA,aAAiBoB;AACZ,aAAA;AAGT,UAAM,IAAI,UAAUP,EAAYb,GAAOe,CAAY,CAAC;AAAA,EACtD;AAEI,SAAAT,EAAK,SAAS,IACTE,IAEAA,EAAKF,EAAK,CAAC,CAAC;AAEvB;AAkFO,SAASe,EAASrB,GAAoE;AAC3F,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAY,CAACG,EAAQH,CAAK;AACrE;AAsEA,SAASa,EAAYb,GAAgBW,GAAiB;;AAC9C,QAAAW,IAAWvB,EAAOC,CAAK,GAGvBuB,MAAcC,IAAAxB,KAAA,gBAAAA,EAAO,aAAP,gBAAAwB,EAAA,KAAAxB,OAAuB,OAAOA,CAAK;AAEvD,SAAOW,EAAQ,WAAW,MAAMW,CAAQ,EAAE,WAAW,MAAMC,CAAW;AACxE;ACtfO,MAAME,KAAO,MAAM;AAAC;AA+BX,SAAAC,GAAiCC,GAAmBC,GAA6B;AACzF,QAAAC,IAAU,CAACD,MAA6B;AAC5C,UAAME,IAA8B,CAAC;AAErC,eAAWC,KAAOH;AAChB,MAAKD,EAAK,SAASI,CAAG,MACVD,EAAAC,CAAG,IAAIH,EAAOG,CAAG;AAIxB,WAAAD;AAAA,EACT;AAEA,SAAIF,KAAU,OACLC,IAGFA,EAAQD,CAAM;AACvB;AAEO,SAASI,KAAoB;AAClC,MAAI,OAAO,SAAW,OAAe,OAAO;AAC1C,WAAO,OAAO;AAGhB,MAAI,OAAO,SAAW,OAAe,OAAO;AAC1C,WAAO,OAAO;AAElB;AAEO,SAASC,GAAgBjC,GAAe;AAC7C,SAAOkC,GAAU;AAAA,IACf,KAAKlC;AAAA,IACL,KAAK,EAAE,KAAK,MAAM,KAAK,KAAK;AAAA,IAC5B,OAAO,EAAE,KAAK,KAAK,KAAK,IAAI;AAAA,EAAA,CAC7B;AACH;AASO,SAASmC,GAAcC,GAA2C;AACvE,MAAIA,aAAmB;AACrB,WAAO,CAACpC,MAAkBoC,EAAQ,KAAKpC,CAAK;AAG9C,QAAMqC,IAA+D;AAAA,IACnE,UAAU,CAAC;AAAA,IACX,UAAU,CAAA;AAAA,EACZ,GAEMC,IAAQF,EACX,MAAM,GAAG,EACT,IAAI,CAAC1C,MAAMA,EAAE,KAAM,CAAA,EACnB,OAAO,CAACA,MAAMA,MAAM,EAAE;AAEzB,WAAS6C,KAAQD,GAAO;AACtB,QAAIE,IAAmC;AAEnC,IAAAD,EAAK,WAAW,GAAG,MACXC,IAAA,YACHD,IAAAA,EAAK,MAAM,CAAC,IAGjBA,MAAS,MACFF,EAAAG,CAAO,EAAE,KAAK,WAAY;AAC1B,aAAA;AAAA,IAAA,CACR,IACQD,EAAK,SAAS,GAAG,IAC1BF,EAASG,CAAO,EAAE,KAAK,SAAUxC,GAAO;AAC/B,aAAAA,EAAM,WAAWuC,EAAK,MAAM,GAAGA,EAAK,SAAS,CAAC,CAAC;AAAA,IAAA,CACvD,IAEDF,EAASG,CAAO,EAAE,KAAK,SAAUxC,GAAO;AACtC,aAAOA,MAAUuC;AAAA,IAAA,CAClB;AAAA,EACH;AAGF,SAAO,SAAUE,GAAc;AACvB,UAAA,EAAE,UAAAC,GAAU,UAAAC,EAAA,IAAaN;AAQ3B,WALA,EAAAM,EAAS,KAAK,CAACC,MAAOA,EAAGH,CAAI,CAAC,KAK9BC,EAAS,SAAS,KAAK,CAACA,EAAS,KAAK,CAACE,MAAOA,EAAGH,CAAI,CAAC;AAAA,EAK5D;AACF;AC/HA,MAAMI,IAAU;AAAA,EACd,cAAc;AAAA,EACd,YAAY;AACL,SAAA,gBACL,KAAK,KAAK;AAAA,EACZ;AAAA,EACA,YAAY;AACL,SAAA,gBACL,KAAK,KAAK;AAAA,EACZ;AAAA,EAEA,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AACL,IAAK,OAAe,oBAAoB,MAAQ,CAAC,KAAK,aAC/C,KAAA,WAAW,WAAW,MAAM;AACvB,cAAA;AAAA,QACN,yBAAyB,KAAK,MAAM;AAAA,QACpC;AAAA,QACA,SAASZ,GAAgB,KAAK,MAAM,CAAC;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,cAAc,KAAK,aAAa;AAAA,MACpC,GACA,KAAK,WAAW;AAAA,OACf,GAAG;AAAA,EACR;AAEJ,GAwFMa,IAAa,OAAO,OAAO,GAC3BC,IAAsB,OAAO,eAAe,GAC5CC,KAAW,OAAO,KAAK;AAEtB,SAASC,EAAWjD,GAA+B;AACjD,UAAAA,KAAA,gBAAAA,EAAQ8C,QAAgB;AACjC;AAEO,SAASI,EAAmBlD,GAAuC;AACjE,UAAAA,KAAA,gBAAAA,EAAQ+C,QAAyB;AAC1C;AAEO,SAASI,GAAsBnD,GAA6B;AAC1D,UAAAA,KAAA,gBAAAA,EAAQgD,SAAc;AAC/B;AAKO,SAASI,GAAWpD,GAAyB;AAC9C,SAAAiD,EAAQjD,CAAK,IACRA,EAAM,IAAI,IAEVA;AAEX;AAKO,SAASqD,EAAWrD,GAAgC;AACrD,SAAAkD,EAAmBlD,CAAK,IACnB,IAAIsD,EAAOtD,CAAK,IACdiD,EAAWjD,CAAK,IAClBA,IAEA,IAAIsD,EAAO;AAAA,IAChB,MAAM;AACG,aAAAtD;AAAA,IACT;AAAA,IACA,MAAMuD,GAAUC,IAAU,IAAI;AACxB,aAACA,KAAA,QAAAA,EAAS,QACZD,EAASvD,CAAK,GAETyB;AAAA,IAAA;AAAA,EACT,CACD;AAEL;AAMO,MAAMgC,EAAmC;AAAA,EAS9C,YAAYzD,GAAUwD,GAAiC;AAJvD,IAAAE,EAAA;AACA,IAAAA,EAAA,kBAAmC,CAAC;AACpC,IAAAA,EAAA,gBAASD,EAAY;AAGnB,SAAK,QAAQzD,GACTwD,KAAA,QAAAA,EAAS,WACX,KAAK,SAASA,EAAQ;AAAA,EACxB;AAAA,EAZF,OAAO,cAAcG,GAAWC,GAAuB;AACrD,WAAOD,MAASC;AAAA,EAAA;AAAA,EAclB,MAAM;AACJ,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,IAAIC,GAA4B;AAK9B,QAJI,OAAOA,KAAW,eACVA,IAAAA,EAA0B,KAAK,KAAK,IAG5C,CAAC,KAAK,OAAOA,GAAQ,KAAK,KAAK,GAAG;AACpC,WAAK,QAAQA;AAET,UAAA;AACS,mBAAAC,KAAW,KAAK;AACzB,UAAAA,EAAQD,CAAM;AAAA,eAETE,GAAK;AACJ,sBAAA,MAAM,oBAAoBA,CAAG,GAC/BA;AAAA,MAAA;AAAA,IACR;AAAA,EACF;AAAA,EAGF,MAAMR,GAA8BC,GAA2B;AACxD,gBAAA,SAAS,KAAKD,CAAQ,GAEtBC,KAAA,QAAAA,EAAS,QACZD,EAAS,KAAK,KAAK,GAGrBV,EAAQ,UAAU,GAEX,MAAM;AACX,YAAMmB,IAAQ,KAAK,SAAS,QAAQT,CAAQ;AAC5C,MAAIS,IAAQ,MACL,KAAA,SAAS,OAAOA,GAAO,CAAC,GAG/BnB,EAAQ,UAAU;AAAA,IACpB;AAAA,EAAA;AAEJ;;AAIGrB,IAAAsB;AAFI,MAAMQ,EAA8B;AAAA,EAMzC,YAAYtD,GAAiB;AAJ7B;AAAA,IAAA0D,EAAA,MAAClC,GAAc;AAEf,IAAAkC,EAAA;AAGE,QAAI1D,KAAS;AACL,YAAA,IAAI,UAAU,eAAe;AAErC,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGjB,MAAM;AACG,WAAA,KAAK,QAAQ,IAAI;AAAA,EAAA;AAAA,EAG1B,MAAMuD,GAA8BC,GAA2B;AAC7D,WAAO,KAAK,QAAQ,MAAMD,GAAUC,CAAO;AAAA,EAAA;AAE/C;AAkBgB,SAAAS,EAAeC,GAAiBV,GAAwD;AACtG,QAAMxD,IAAQ,IAAIyD,EAAYS,GAAcV,CAAO;AAGnD,SAAO,CAFQ,IAAIF,EAAOtD,CAAK,GAEf,CAAC6D,MAAW7D,EAAM,IAAI6D,CAAM,CAAC;AAC/C;;AAQGM,KAAArB,GACAtB,KAAAuB;AAHI,MAAMqB,GAAwD;AAAA,EAOnE,YAAYpE,GAAuB;AALnC;AAAA,IAAA0D,EAAA,MAACS,IAAc;AACf,IAAAT,EAAA,MAAClC,IAAuB;AAExB,IAAAkC,EAAA;AAGE,QAAI1D,KAAS;AACL,YAAA,IAAI,UAAU,eAAe;AAErC,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGjB,MAAM;AACG,WAAA,KAAK,QAAQ,IAAI;AAAA,EAAA;AAAA,EAG1B,IAAI6D,GAA+B;AAC5B,SAAA,QAAQ,IAAIA,CAAM;AAAA,EAAA;AAAA,EAGzB,MAAMN,GAA8BC,GAA2B;AAC7D,WAAO,KAAK,QAAQ,MAAMD,GAAUC,CAAO;AAAA,EAAA;AAE/C;AAegB,SAAAa,GAAuBH,GAAkBV,GAAiC;AACxF,SAAO,IAAIY,GAAoB,IAAIX,EAAYS,GAAeV,CAAO,CAAC;AACxE;AAKgB,SAAAc,GAA0BC,GAAkBC,GAA2C;AAC9F,SAAA;AAAA,IACL,CAAC1B,CAAU,GAAG;AAAA,IACd,CAACC,CAAmB,GAAG;AAAA,IAEvB,KAAKwB,EAAO,IAAI,KAAKA,CAAM;AAAA,IAC3B,OAAOA,EAAO,MAAM,KAAKA,CAAM;AAAA,IAC/B,KAAKC;AAAA,EACP;AACF;AAKgB,SAAAC,GAAuBF,GAAkBhB,GAAuD;AACvG,SAAA,SAAkBmB,GAAgB;AACjC,UAAAd,IAAUW,EAAO,IAAI;AACvB,QAAAZ;AAEA,IAAA,OAAOe,KAAmB,aAC5Bf,IAAQe,EAAqCd,CAAO,IAE7CD,IAAAe,GAGTnB,EAASI,GAAMC,CAAO;AAAA,EACxB;AACF;AAMA,MAAMe,IAAQ,OAAO,OAAO;AAE5B,MAAMC,GAAuE;AAAA,EA2C3E,YAAYC,GAAgBjC,GAAkDY,GAAyB;AA1CvG,IAAAE,EAAA,gBAASD,EAAY;AAKrB;AAAA;AAAA;AAAA,IAAAC,EAAA,iBAAwB,CAAC;AAIzB;AAAA;AAAA;AAAA,IAAAA,EAAA;AAIA;AAAA;AAAA;AAAA,IAAAA,EAAA,uBAAgBoB,EAAc;AAI9B;AAAA;AAAA;AAAA,IAAApB,EAAA,kBAAmC,CAAC;AAIpC;AAAA;AAAA;AAAA,IAAAA,EAAA,2BAAoB;AAKpB;AAAA;AAAA;AAAA,IAAAA,EAAA;AAKA;AAAA;AAAA;AAAA,IAAAA,EAAA,eAAsCiB;AAItC;AAAA;AAAA;AAAA,IAAAjB,EAAA;AAKA;AAAA;AAAA;AAAA,IAAAA,EAAA;AAGO,SAAA,UAAUmB,EAAO,IAAIxB,CAAO,GACjC,KAAK,KAAKT,GAENY,KAAA,QAAAA,EAAS,WACX,KAAK,SAASA,EAAQ,SAGnB,KAAA,uBAAuB,IAAI,MAAMqB,EAAO,MAAM,EAAE,KAAKF,GAAO,GAAGE,EAAO,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAOnF,MAAS;AACP,WAAO,KAAK,SAAS;AAAA,EAAA;AAAA,EAGvB,MAAMtB,GAA8BC,GAAyC;AACvE,IAAC,KAAK,qBACR,KAAK,qBAAqB;AAG5B,UAAMuB,IAAW,KAAK;AAEtB,WAAAA,EAAS,KAAKxB,CAAQ,GAEjBC,KAAA,QAAAA,EAAS,QACZD,EAAS,KAAK,QAAQ,GAGxBV,EAAQ,UAAU,GAEX,MAAM;AACX,MAAAkC,EAAS,OAAOA,EAAS,QAAQxB,CAAQ,GAAG,CAAC,GAEzC,KAAK,qBAAqBwB,EAAS,WAAW,KAChD,KAAK,oBAAoB,GAG3BlC,EAAQ,UAAU;AAAA,IACpB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAOF,OAAO7C,GAAU;AACJ,eAAA8D,KAAW,KAAK;AACzB,MAAAA,EAAQ9D,CAAK;AAAA,EACf;AAAA,EAGF,SAAS;AACP,UAAMgF,IAAU,KAAK,SACfC,IAAe,KAAK;AAC1B,QAAIC,IAAU,IACVlF;AAEJ,aAASf,IAAI,GAAGA,IAAI+F,EAAQ,QAAQ/F;AAC1B,MAAAe,IAAAgF,EAAQ/F,CAAC,EAAE,IAAI,GACnB,CAACiG,KAAW,CAAC,KAAK,OAAOlF,GAAOiF,EAAahG,CAAC,CAAC,MACvCiG,IAAA,KAEZD,EAAahG,CAAC,IAAIe;AAIpB,IAAIkF,KACF,KAAK,SAAS,KAAK,GAAG,GAAGD,CAAY,CAAC;AAAA,EACxC;AAAA,EAGF,WAAW;AAEL,WAAC,KAAK,qBACR,KAAK,OAAO,GAEP,KAAK;AAAA,EAAA;AAAA,EAGd,SAASjF,GAAqB;AAE5B,IAAI,KAAK,6BACP,KAAK,yBAAyB,GAC9B,KAAK,2BAA2B,SAGlC,KAAK,QAAQA,GACR,KAAA,WAAWoD,GAAQpD,CAAK,GAEzB,KAAK,qBAAqBiD,EAAQjD,CAAK,IACzC,KAAK,2BAA2BA,EAAM,MAAM,CAAC4D,MAAY;AACvD,WAAK,WAAWA,GAChB,KAAK,OAAOA,CAAO;AAAA,IAAA,CACpB,IAEI,KAAA,OAAO,KAAK,QAAQ;AAAA,EAC3B;AAAA,EAGF,uBAAuB;AACrB,UAAMqB,IAAe,KAAK;AAE1B,aAAShG,IAAI,GAAGA,IAAI,KAAK,QAAQ,QAAQA;AAClC,WAAA,cAAc,MAAM,CAAC,KAAK,QAAQA,CAAC,CAAe,GAAG,CAAC0E,MAAS;AAKlE,YAJAsB,EAAahG,CAAC,IAAI0E,GAId,KAAK,mBAAmB;AAC1B,gBAAM3D,IAAQ,KAAK,GAAG,GAAGiF,CAAY;AACrC,UAAK,KAAK,OAAOjF,GAAO,KAAK,KAAK,KAChC,KAAK,SAASA,CAAK;AAAA,QACrB;AAAA,MACF,CACD;AAGH,SAAK,oBAAoB;AAEzB,UAAMA,IAAQ,KAAK,GAAG,GAAGiF,CAAY;AACrC,IAAK,KAAK,OAAOjF,GAAO,KAAK,KAAK,KAChC,KAAK,SAASA,CAAK;AAAA,EACrB;AAAA,EAGF,sBAAsB;AACpB,SAAK,cAAc,QAAQ,GAGvB,KAAK,6BACP,KAAK,yBAAyB,GAC9B,KAAK,2BAA2B,SAGlC,KAAK,oBAAoB;AAAA,EAAA;AAE7B;AAMgB,SAAAmF,GACdN,GACAjC,GACAY,GACU;AACV,QAAMxD,IAAQ,IAAI4E,GAAmBC,GAAQjC,GAAIY,CAAO;AACjD,SAAA,IAAIF,EAAOtD,CAAK;AACzB;;AAQGmE,KAAAnB,IACAxB,KAAAsB;AAHH,MAAMsC,GAA0D;AAAA,EAO9D,YAAYpF,GAAmC;AAL/C;AAAA,IAAA0D,EAAA,MAACS,IAAY;AACb,IAAAT,EAAA,MAAClC,IAAc;AAEf,IAAAkC,EAAA;AAGE,SAAK,UAAU1D;AAAA,EAAA;AAAA,EAGjB,MAAM;AACG,WAAA,KAAK,QAAQ,IAAI;AAAA,EAAA;AAAA,EAG1B,MAAMuD,GAA0CC,GAA2B;AACzE,WAAO,KAAK,QAAQ,MAAMD,GAAUC,CAAO;AAAA,EAAA;AAAA,EAG7C,IAAI,OAAO;AACF,WAAA,KAAK,QAAQ,IAAI;AAAA,EAAA;AAAA,EAG1B,IAAI,KAAKxD,GAAO;AACT,SAAA,QAAQ,IAAIA,CAAK;AAAA,EAAA;AAE1B;AAKO,SAASqF,KAAoC;AAClD,SAAO,IAAID,GAAa,IAAI3B,EAA2B,MAAS,CAAC;AACnE;AAqBO,SAASqB,IAA8B;AAC5C,QAAMQ,IAA0B,CAAC;AAE1B,SAAA;AAAA,IACL,MAAMT,GAAQjC,GAAI;AACZ,UAAAiC,EAAO,WAAW;AACd,cAAA,IAAI,UAAU,uCAAuC;AAEpD,MAAAA,IAAAA,EAAO,IAAIxB,CAAO;AAEvB,UAAAkC;AAEA,aAAAV,EAAO,SAAS,IAClBU,IAAOJ,GAAON,GAAQjC,CAAE,EAAE,MAAM,MAAM,IAAI,IAE1C2C,IAAOV,EAAO,CAAC,EAAE,MAAMjC,CAAE,GAG3B0C,EAAQ,KAAKC,CAAI,GAEV,MAAM;AACP,YAAAvB,IAAQsB,EAAQ,QAAQC,CAAI;AAChC,QAAIvB,IAAQ,MACFsB,EAAA,OAAOtB,GAAO,CAAC,GAEpBuB,EAAA;AAAA,MACP;AAAA,IACF;AAAA,IAEA,UAAU;AACD,aAAAD,EAAQ,SAAS;AAEjB,QADQA,EAAQ,IAAI,EACpB;AAAA,IACP;AAAA,EAEJ;AACF;AClpBe,SAAAE,GAAS,GAAE;AAAC,WAAQlG,GAAEX,GAAE,IAAE,WAAU8G,IAAE,GAAE7F,IAAE,IAAG,IAAE,IAAG,IAAE,CAAC,CAAC,GAAEnB,IAAE,SAASe,GAAE;AAAC,IAAIiG,MAAJ,MAAQjG,MAAII,IAAEA,EAAE,QAAQ,wBAAuB,EAAE,MAAI,EAAE,KAAKJ,IAAE,EAAEA,CAAC,IAAEI,CAAC,IAAM6F,MAAJ,MAAQjG,KAAGI,MAAI,EAAE,CAAC,IAAEJ,IAAE,EAAEA,CAAC,IAAEI,GAAE6F,IAAE,KAAOA,MAAJ,KAAe7F,MAAR,SAAWJ,IAAE,EAAE,CAAC,IAAE,OAAO,OAAO,EAAE,CAAC,KAAG,CAAA,GAAG,EAAEA,CAAC,CAAC,IAAMiG,MAAJ,KAAO7F,KAAG,CAACJ,KAAG,EAAE,CAAC,IAAE,EAAE,CAAC,KAAG,CAAA,GAAII,CAAC,IAAE,KAAG6F,KAAG,MAAQA,MAAJ,MAAQ,EAAE,CAAC,IAAE,EAAE,CAAC,KAAG,CAAE,GAAE9G,CAAC,IAAEa,IAAEI,IAAEA,IAAE,EAAEJ,CAAC,IAAE,EAAEA,CAAC,IAAEI,GAAE6F,IAAE,MAAIjG,KAAGI,OAAK,EAAE,CAAC,EAAEjB,CAAC,KAAGa,IAAEI,IAAE,EAAEJ,CAAC,IAAEI,KAAIA,IAAE;AAAA,EAAE,GAAEd,IAAE,GAAEA,IAAE,EAAE,QAAOA,KAAI;AAAC,IAAAA,MAAQ2G,MAAJ,KAAOhH,EAAG,GAACA,EAAEK,CAAC;AAAG,aAAQG,IAAE,GAAEA,IAAE,EAAEH,CAAC,EAAE,QAAOG,IAAI,CAAAK,IAAE,EAAER,CAAC,EAAEG,CAAC,GAAMwG,MAAJ,IAAYnG,MAAN,OAASb,EAAC,GAAG,IAAE,CAAC,GAAE,IAAG,IAAI,GAAEgH,IAAE,KAAG7F,KAAGN,IAAMmG,MAAJ,IAAa7F,MAAP,QAAgBN,MAAN,OAASmG,IAAE,GAAE7F,IAAE,MAAIA,IAAEN,IAAEM,EAAE,CAAC,IAAE,IAAEN,MAAI,IAAE,IAAE,KAAGM,KAAGN,IAAQA,MAAN,OAAeA,MAAN,MAAQ,IAAEA,IAAQA,MAAN,OAASb,EAAG,GAACgH,IAAE,KAAGA,MAAUnG,MAAN,OAASmG,IAAE,GAAE9G,IAAEiB,GAAEA,IAAE,MAAUN,MAAN,QAAUmG,IAAE,KAAS,EAAE3G,CAAC,EAAEG,IAAE,CAAC,MAAd,QAAkBR,EAAC,GAAOgH,MAAJ,MAAQ,IAAE,EAAE,CAAC,IAAGA,IAAE,IAAG,IAAE,EAAE,CAAC,GAAG,KAAK,KAAK,MAAM,MAAKA,EAAE,MAAM,CAAC,CAAC,CAAC,GAAEA,IAAE,KAASnG,MAAN,OAAgBA,MAAP,OAAiBA,MAAP;AAAA,KAAiBA,MAAP,QAAUb,EAAC,GAAGgH,IAAE,KAAG7F,KAAGN,IAAOmG,MAAJ,KAAe7F,MAAR,UAAY6F,IAAE,GAAE,IAAE,EAAE,CAAC;AAAA,EAAE;AAAC,SAAOhH,EAAG,GAAC,EAAE,SAAO,IAAE,EAAE,MAAM,CAAC,IAAE,EAAE,CAAC;AAAC;ACW30B,MAAMiH,GAAqC;AAAA,EAahD,YAAYC,GAA2B;AAZvC,IAAAjC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,0BAAoC,CAAC;AACrC,IAAAA,EAAA;AAEA,IAAAA,EAAA,+BAAwB;AACxB,IAAAA,EAAA;AAGE,SAAK,aAAaiC,EAAO,YACzB,KAAK,cAAcA,EAAO,cAAcC,EAASD,EAAO,WAAW,IAAI,QACvE,KAAK,cAAcA,EAAO,cAAcC,EAASD,EAAO,WAAW,IAAI,QACvE,KAAK,iBAAiBA,EAAO,gBAEzB,KAAK,eAAe,KAAK,OAAA,MAAa,iBACnC,KAAA,OAAO,SAAS,cAAc,aAAa,GAC3C,KAAA,UAAU,SAAS,cAAc,cAAc,MAE/C,KAAA,OAAO,SAAS,eAAe,EAAE,GACjC,KAAA,UAAU,SAAS,eAAe,EAAE;AAAA,EAC3C;AAAA,EAGF,IAAI,YAAY;AACP,WAAA,KAAK,KAAK,cAAc;AAAA,EAAA;AAAA,EAGjC,MAAME,GAAcC,GAAgC;AAC9C,IAAC,KAAK,cACRD,EAAO,aAAa,KAAK,OAAMC,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GACrD,KAAK,eAAe,KAAK,OAAA,MAAa,iBACxCD,EAAO,aAAa,KAAK,SAAS,KAAK,KAAK,WAAW,GAGzD,KAAK,eAAe,KAAK,WAAW,MAAM,CAAC7F,MAAU;AAE/C,OAAA,CAAC,KAAK,yBAA0BA,KAAS,CAAC,KAAK,iBAAmB,CAACA,KAAS,KAAK,mBACnF,KAAK,OAAOA,CAAK,GACjB,KAAK,wBAAwB,IAC7B,KAAK,gBAAgBA;AAAA,IACvB,CACD;AAAA,EACH;AAAA,EAGF,UAAgB;;AACd,IAAI,KAAK,iBACP,KAAK,aAAa,GAClB,KAAK,eAAe;AAGX,eAAA+F,KAAU,KAAK;AACxB,MAAAA,EAAO,QAAQ;AAEjB,SAAK,mBAAmB,CAAC,GAErB,KAAK,eACPvE,IAAA,KAAK,KAAK,eAAV,QAAAA,EAAsB,YAAY,KAAK,QACvC2C,IAAA,KAAK,QAAQ,eAAb,QAAAA,EAAyB,YAAY,KAAK;AAAA,EAC5C;AAAA,EAGF,OAAOnE,GAAY;;AACN,eAAA+F,KAAU,KAAK;AACxB,MAAAA,EAAO,QAAQ;AAIb,QAFJ,KAAK,mBAAmB,CAAC,GAErB,KAAK,KAAK,cAAc,MAIxB;AAAA,MAAA/F,KAAS,KAAK,cAChB,KAAK,mBAAmBgG,EAAgB,KAAK,gBAAgB,KAAK,WAAW,IACpE,CAAChG,KAAS,KAAK,gBACxB,KAAK,mBAAmBgG,EAAgB,KAAK,gBAAgB,KAAK,WAAW;AAG/E,eAAS/G,IAAI,GAAGA,IAAI,KAAK,iBAAiB,QAAQA,KAAK;AAC/C,cAAA8G,IAAS,KAAK,iBAAiB9G,CAAC,GAChCgH,MAAWzE,IAAA,KAAK,iBAAiBvC,IAAI,CAAC,MAA3B,gBAAAuC,EAA8B,SAAQ,KAAK;AAC5D,QAAAuE,EAAO,MAAM,KAAK,KAAK,YAAYE,CAAQ;AAAA,MAAA;AAG7C,MAAI,KAAK,eAAe,KAAK,OAAA,MAAa,kBACxC,KAAK,KAAK,cAAc,gBAAgBjG,IAAQ,WAAW,OAAO;AAAA;AAAA,EACpE;AAEJ;ACxGO,MAAMkG,KACX;ACmBK,IAAIC,KAAS,CAACC,IAAO,OAAO;AACjC,MAAIC,IAAK,IACLC,IAAQ,OAAO,gBAAgB,IAAI,WAAYF,KAAQ,CAAG,CAAA;AAC9D,SAAOA;AACL,IAAAC,KAAME,GAAkBD,EAAMF,CAAI,IAAI,EAAE;AAE1C,SAAOC;AACT;ACpBA,MAAMG,KAAuB,CAACzE,MAAgB,WAAW,KAAKA,CAAG;AAS1D,MAAM0E,GAA8B;AAAA,EAkBzC,YAAY,EAAE,KAAAC,GAAK,OAAAC,GAAO,UAAAC,GAAU,gBAAAC,KAA+B;AAjBnE,IAAAnD,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,uBAAgC,CAAC;AACjC,IAAAA,EAAA;AACA,IAAAA,EAAA,kBAAWyC,GAAO;AAGlB;AAAA,IAAAzC,EAAA;AAGA;AAAA,IAAAA,EAAA,sBAAe;AA2Bb,QApBiBmD,IAAA,EAAE,GAAGA,EAAe,GAGjCH,EAAI,YAAY,MAAM,UACxBG,EAAe,QAAQ,KAIrBA,EAAe,QACjB,KAAK,OAAO,SAAS,gBAAgB,8BAA8BH,CAAG,IAEjE,KAAA,OAAO,SAAS,cAAcA,CAAG,GAIpCG,EAAe,KAAK,OAAO,MAAM,kBAC9B,KAAA,KAAK,QAAQ,WAAW,KAAK,WAIhCF,EAAM;AACJ,UAAAxD,GAAMwD,EAAM,GAAG;AACjB,aAAK,MAAMA,EAAM;AAAA;AAEjB,cAAM,IAAI,MAAM,2CAA2CA,EAAM,GAAG;AAIxE,SAAK,QAAQ;AAAA,MACX,GAAGjF,GAAK,CAAC,OAAO,SAAS,WAAW,GAAGiF,CAAK;AAAA,MAC5C,OAAOA,EAAM,aAAaA,EAAM;AAAA,IAClC,GACA,KAAK,WAAWC,IAAWZ,EAAgBa,GAAgBD,CAAQ,IAAI,CAAC,GACxE,KAAK,iBAAiBC;AAAA,EAAA;AAAA,EAtCxB,IAAI,YAAY;AACP,WAAA,KAAK,KAAK,cAAc;AAAA,EAAA;AAAA,EAwCjC,MAAMhB,GAAcC,GAAc;AAChC,QAAID,KAAU;AACZ,YAAM,IAAI,MAAM,iFAAiFA,CAAM,EAAE;AAGvG,QAAA,CAAC,KAAK,WAAW;AACR,iBAAAiB,KAAS,KAAK;AACjB,QAAAA,EAAA,MAAM,KAAK,IAAI;AAGvB,WAAK,WAAW,KAAK,MAAM,KAAK,KAAK,GACjC,KAAK,MAAM,SAAY,KAAA,YAAY,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK,aAAa,GAClF,KAAK,MAAM,SAAY,KAAA,aAAa,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK,aAAa;AAAA,IAAA;AAGzF,IAAAjB,EAAO,aAAa,KAAK,OAAMC,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAErD,KAAK,QACF,KAAA,IAAI,OAAO,KAAK,OAGvB,WAAW,MAAM;AACf,WAAK,eAAe;AAAA,OACnB,CAAC;AAAA,EAAA;AAAA,EAGN,UAAU;;AACR,QAAI,KAAK,WAAW;AACP,iBAAAgB,KAAS,KAAK;AACvB,QAAAA,EAAM,QAAQ;AAGhB,MAAI,KAAK,QACP,KAAK,IAAI,OAAO,UAGlBtF,IAAA,KAAK,KAAK,eAAV,QAAAA,EAAsB,YAAY,KAAK,OAEvC,KAAK,eAAe;AAET,iBAAA+D,KAAQ,KAAK;AACjB,QAAAA,EAAA;AAEP,WAAK,gBAAgB,CAAC;AAAA,IAAA;AAAA,EACxB;AAAA,EAGF,aAAatF,GAAcD,GAAwB;AACjD,WAAO,GAAG,KAAK,QAAQ,IAAIC,CAAI,IAAID,CAAK;AAAA,EAAA;AAAA,EAG1C,WAAcA,GAAqBuD,GAA8BwD,GAAmB;AAC9E,IAAA9D,EAAQjD,CAAK,IACf,KAAK,cAAc;AAAA,MACjBA,EAAM,MAAM,CAAC4D,MAAY;AACvB,aAAK,eAAe,KAAK,OAAO,MAAM,MAAM;AAC1C,UAAAL,EAASK,CAAO;AAAA,WACfmD,CAAS;AAAA,MACb,CAAA;AAAA,IACH,IAEA,KAAK,eAAe,KAAK,OAAO,MAAM,MAAM;AAC1C,MAAAxD,EAASvD,CAAK;AAAA,OACb+G,CAAS;AAAA,EACd;AAAA,EAGF,WAAWC,GAAmCL,GAAgC;AAC5E,eAAW5E,KAAO4E,GAAO;AACjB,YAAA3G,IAAQ2G,EAAM5E,CAAG;AAEvB,UAAIA,MAAQ,cAAc;AACxB,cAAMkF,IAASjH;AAEf,mBAAWyC,KAAQwE;AACZ,eAAA;AAAA,YACHA,EAAOxE,CAAI;AAAA,YACX,CAACmB,MAAY;AACX,cAAIA,KAAW,OACZoD,EAAgB,gBAAgBvE,CAAI,IAEpCuE,EAAgB,aAAavE,GAAM,OAAOmB,CAAO,CAAC;AAAA,YAEvD;AAAA,YACA,KAAK,aAAa,QAAQnB,CAAI;AAAA,UAChC;AAAA,MACF,WACSV,MAAQ,kBAAkB;AACnC,cAAMkF,IAASjH;AAEf,mBAAWyC,KAAQwE,GAAQ;AACnB,gBAAAC,IAA+BjE,EAA4BjD,CAAK,IAClE,CAACrB,MAAaqB,EAAM,IAAA,EAAMrB,CAAC,IAC1BqB;AAEG,UAAAgH,EAAA,iBAAiBvE,GAAMyE,CAAQ,GAElC,KAAA,cAAc,KAAK,MAAM;AACpB,YAAAF,EAAA,oBAAoBvE,GAAMyE,CAAQ;AAAA,UAAA,CAC3C;AAAA,QAAA;AAAA,MAEM,WAAAnF,MAAQ,oBAAoBA,MAAQ,kBAAkB;AACzD,cAAAmF,IAAW,CAACvI,MAAa;AAC7B,UAAI,KAAK,gBAAgB,CAACqI,EAAQ,SAASrI,EAAE,MAAa,MACpDsE,EAA4BjD,CAAK,IAC7BA,EAAA,MAAMrB,CAAC,IAEZqB,EAA6BrB,CAAC;AAAA,QAGrC,GAEM6E,IAAU,EAAE,SAAS,GAAK;AAEzB,eAAA,iBAAiB,SAAS0D,GAAU1D,CAAO,GAE7C,KAAA,cAAc,KAAK,MAAM;AACrB,iBAAA,oBAAoB,SAAS0D,GAAU1D,CAAO;AAAA,QAAA,CACtD;AAAA,MAAA,WACQzB,MAAQ,WAAW;AAExB,YAAA,CAACmB,EAAgBlD,CAAK;AACxB,gBAAM,IAAI,UAAU,oDAAoDA,CAAK,EAAE;AAI5E,aAAA;AAAA,UACHA;AAAA,UACA,CAAC4D,MAAY;AACX,YAAIA,KAAW,OACZoD,EAA6B,QAAQ,KAErCA,EAA6B,QAAQ,OAAOpD,CAAO;AAAA,UAExD;AAAA,UACA,KAAK,aAAa,QAAQ,OAAO;AAAA,QACnC;AAGM,cAAAsD,IAA0B,CAACvI,MAAM;AAErC,gBAAMwI,IAAUC,GAASpH,EAAM,OAAQrB,EAAE,cAAmC,KAAK;AAChF,UAAAqB,EAA6B,IAAImH,CAAO;AAAA,QAC3C;AAEQ,QAAAH,EAAA,iBAAiB,SAASE,CAAQ,GAErC,KAAA,cAAc,KAAK,MAAM;AACpB,UAAAF,EAAA,oBAAoB,SAASE,CAAQ;AAAA,QAAA,CAC9C;AAAA,MAAA,WACQV,GAAqBzE,CAAG,GAAG;AACpC,cAAMsF,IAAYtF,EAAI,MAAM,CAAC,EAAE,YAAY,GAErCmF,IAA+BjE,EAA4BjD,CAAK,IAClE,CAACrB,MAAaqB,EAAM,IAAA,EAAMrB,CAAC,IAC1BqB;AAEG,QAAAgH,EAAA,iBAAiBK,GAAWH,CAAQ,GAEvC,KAAA,cAAc,KAAK,MAAM;AACpB,UAAAF,EAAA,oBAAoBK,GAAWH,CAAQ;AAAA,QAAA,CAChD;AAAA,MACQ,WAAAnF,EAAI,SAAS,GAAG;AAEpB,aAAA;AAAA,UACH/B;AAAA,UACA,CAAC4D,MAAY;AACX,YAAIA,KAAW,OACboD,EAAQ,gBAAgBjF,CAAG,IAE3BiF,EAAQ,aAAajF,GAAK,OAAO6B,CAAO,CAAC;AAAA,UAE7C;AAAA,UACA,KAAK,aAAa,QAAQ7B,CAAG;AAAA,QAC/B;AAAA,eACS,CAACuF,GAAa,SAASvF,CAAG;AAC/B,YAAA,KAAK,eAAe;AACjB,eAAA;AAAA,YACH/B;AAAA,YACA,CAAC4D,MAAY;AACX,cAAIA,KAAW,OACboD,EAAQ,aAAajF,GAAK,OAAO4E,EAAM5E,CAAG,CAAC,CAAC,IAE5CiF,EAAQ,gBAAgBjF,CAAG;AAAA,YAE/B;AAAA,YACA,KAAK,aAAa,QAAQA,CAAG;AAAA,UAC/B;AAAA;AAEA,kBAAQA,GAAK;AAAA,YACX,KAAK;AAAA,YACL,KAAK;AACE,mBAAA;AAAA,gBACH/B;AAAA,gBACA,CAAC4D,MAAY;AACV,kBAAAoD,EAAgBjF,CAAG,IAAI,OAAO6B,CAAO;AAAA,gBACxC;AAAA,gBACA,KAAK,aAAa,QAAQ7B,CAAG;AAAA,cAC/B;AACA;AAAA,YAEF,KAAK;AACE,mBAAA;AAAA,gBACH/B;AAAA,gBACA,CAAC4D,MAAY;AACV,kBAAAoD,EAAgB,UAAUpD;AAAA,gBAC7B;AAAA,gBACA,KAAK,aAAa,QAAQ,SAAS;AAAA,cACrC;AACA;AAAA,YAEF,KAAK;AACE,mBAAA;AAAA,gBACH5D;AAAA,gBACA,CAAC4D,MAAY;AACV,kBAAAoD,EAAgB,UAAUpD,GAGvBA,IACMoD,EAAA,aAAa,WAAW,EAAE,IAElCA,EAAQ,gBAAgB,SAAS;AAAA,gBAErC;AAAA,gBACA,KAAK,aAAa,QAAQ,SAAS;AAAA,cACrC;AACA;AAAA;AAAA,YAGF,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK,SAAS;AACN,oBAAAO,IAAOxF,EAAI,YAAY;AACxB,mBAAA;AAAA,gBACH/B;AAAA,gBACA,CAAC4D,MAAY;AACX,kBAAIA,KAAW,OACboD,EAAQ,gBAAgBO,CAAI,IAE5BP,EAAQ,aAAaO,GAAM,OAAO3D,CAAO,CAAC;AAAA,gBAE9C;AAAA,gBACA,KAAK,aAAa,QAAQ2D,CAAI;AAAA,cAChC;AACA;AAAA,YAAA;AAAA,YAGF,KAAK;AAAA,YACL,KAAK;AACE,mBAAA;AAAA,gBACHvH;AAAA,gBACA,CAAC4D,MAAY;AACP,kBAAA,OAAOA,KAAY,WACpBoD,EAAgB,eAAepD,IACvBA,IACRoD,EAAgB,eAAe,OAE/BA,EAAgB,eAAe;AAAA,gBAEpC;AAAA,gBACA,KAAK,aAAa,QAAQjF,CAAG;AAAA,cAC/B;AACA;AAAA,YAEF,SAAS;AACF,mBAAA;AAAA,gBACH/B;AAAA,gBACA,CAAC4D,MAAY;AACV,kBAAAoD,EAAgBjF,CAAG,IAAI6B;AAAA,gBAC1B;AAAA,gBACA,KAAK,aAAa,QAAQ7B,CAAG;AAAA,cAC/B;AACA;AAAA,YAAA;AAAA,UACF;AAAA,IAGN;AAAA,EACF;AAAA,EAGF,YAAYiF,GAAmCQ,GAAiBC,GAA+B;AAC7F,UAAMC,IAAoC,CAAC;AAEvC,QAAAzE,EAAQuE,CAAM,GAAG;AACf,UAAAG;AAEJ,YAAMpC,IAAOiC,EAAO,MAAM,CAAC5D,MAAY;AAChC,aAAA,eAAe,KAAK,OAAO;AAAA,UAC9B,MAAM;AACA,YAAA5C,EAAW2G,CAAO,KACZA,EAAA,GAEVX,EAAQ,MAAM,UAAU,IACxBW,IAAU,KAAK,YAAYX,GAASpD,GAAS6D,CAAa;AAAA,UAC5D;AAAA,UACA,KAAK,aAAa,UAAU,GAAG;AAAA,QACjC;AAAA,MAAA,CACD;AAED,MAAAA,EAAc,KAAKlC,CAAI,GACvBmC,EAAkB,KAAKnC,CAAI;AAAA,IAAA,OACtB;AACC,YAAAqC,IAASC,GAAYL,CAAM;AAEjC,iBAAW/E,KAAQmF,GAAQ;AACzB,cAAM,EAAE,OAAA5H,GAAO,UAAA8H,MAAaF,EAAOnF,CAAI;AAEnC,YAAAQ,EAAQjD,CAAK,GAAG;AAClB,gBAAMuF,IAAOvF,EAAM,MAAM,CAAC4D,MAAY;AACpC,iBAAK,eAAe,KAAK,OAAO,MAAM,MAAM;AAC1C,cAAIA,IACFoD,EAAQ,MAAM,YAAYvE,GAAM,OAAOmB,CAAO,GAAGkE,CAAQ,IAEjDd,EAAA,MAAM,eAAevE,CAAI;AAAA,YACnC,CACD;AAAA,UAAA,CACF;AAED,UAAAgF,EAAc,KAAKlC,CAAI,GACvBmC,EAAkB,KAAKnC,CAAI;AAAA,QAAA,MAC7B,CAAWvF,KAAS,QAClBgH,EAAQ,MAAM,YAAYvE,GAAM,OAAOzC,CAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAGF,WAAO,WAAmB;AACxB,iBAAWuF,KAAQmC;AACZ,QAAAnC,EAAA,GACLkC,EAAc,OAAOA,EAAc,QAAQlC,CAAI,GAAG,CAAC;AAAA,IAEvD;AAAA,EAAA;AAAA,EAGF,aAAayB,GAAmCe,GAAkBN,GAA+B;AAC/F,UAAMO,IAAqC,CAAC;AAExC,QAAA/E,EAAQ8E,CAAO,GAAG;AAChB,UAAAJ;AAEJ,YAAMpC,IAAOwC,EAAQ,MAAM,CAACnE,MAAY;AACjC,aAAA,eAAe,KAAK,OAAO;AAAA,UAC9B,MAAM;AACA,YAAA5C,EAAW2G,CAAO,KACZA,EAAA,GAEVX,EAAQ,gBAAgB,OAAO,GAC/BW,IAAU,KAAK,aAAaX,GAASpD,GAAS6D,CAAa;AAAA,UAC7D;AAAA,UACA,KAAK,aAAa,QAAQ,OAAO;AAAA,QACnC;AAAA,MAAA,CACD;AAED,MAAAA,EAAc,KAAKlC,CAAI,GACvByC,EAAmB,KAAKzC,CAAI;AAAA,IAAA,OACvB;AACC,YAAAqC,IAASK,GAAYF,CAAO;AAElC,iBAAWtF,KAAQmF,GAAQ;AACnB,cAAA5H,IAAQ4H,EAAOnF,CAAI;AAErB,YAAAQ,EAAQjD,CAAK,GAAG;AAClB,gBAAMuF,IAAOvF,EAAM,MAAM,CAAC4D,MAAY;AACpC,iBAAK,eAAe,KAAK,OAAO,MAAM,MAAM;AAC1C,cAAIA,IACMoD,EAAA,UAAU,IAAIvE,CAAI,IAElBuE,EAAA,UAAU,OAAOvE,CAAI;AAAA,YAC/B,CACD;AAAA,UAAA,CACF;AAED,UAAAgF,EAAc,KAAKlC,CAAI,GACvByC,EAAmB,KAAKzC,CAAI;AAAA,eACnBvF,KACDgH,EAAA,UAAU,IAAIvE,CAAI;AAAA,MAC5B;AAAA,IACF;AAGF,WAAO,WAAmB;AACxB,iBAAW8C,KAAQyC;AACZ,QAAAzC,EAAA,GACLkC,EAAc,OAAOA,EAAc,QAAQlC,CAAI,GAAG,CAAC;AAAA,IAEvD;AAAA,EAAA;AAEJ;AAKA,SAAS0C,GAAYF,GAAkB;AACrC,MAAIH,IAAkC,CAAC;AAEnC,MAAAhH,EAASmH,CAAO,GAAG;AAEf,UAAAG,IAAQH,EAAQ,MAAM,GAAG;AAC/B,eAAWtF,KAAQyF;AACjB,MAAAN,EAAOnF,CAAI,IAAI;AAAA,EACjB,MACF,CAAWpB,EAAS0G,CAAO,IAClB,OAAA,OAAOH,GAAQG,CAAO,IACpB,MAAM,QAAQA,CAAO,KACxB,MAAA,KAAKA,CAAO,EACf,OAAO,OAAO,EACd,QAAQ,CAACtH,MAAS;AACjB,WAAO,OAAOmH,GAAQK,GAAYxH,CAAI,CAAC;AAAA,EAAA,CACxC;AAIL,gBAAOmH,EAAO,WAEPA;AACT;AAKA,SAASC,GAAYL,GAAiB;AACpC,MAAII,IAAgE,CAAC;AAEjE,MAAAhH,EAAS4G,CAAM,GAAG;AACd,UAAAW,IAAQX,EAAO,MAAM,GAAG,EAAE,OAAO,CAACY,MAASA,EAAK,KAAK,MAAM,EAAE;AACnE,eAAWA,KAAQD,GAAO;AACxB,YAAM,CAACpG,GAAKsG,CAAM,IAAID,EAAK,MAAM,GAAG,GAC9BE,IAA+C;AAAA,QACnD,OAAOD;AAAA,MACT;AACI,MAAAA,EAAO,SAAS,YAAY,KAC9BC,EAAM,WAAW,aACjBA,EAAM,QAAQD,EAAO,QAAQ,cAAc,EAAE,EAAE,KAAK,KAE9CC,EAAA,QAAQD,EAAO,KAAK,GAE5BT,EAAOW,EAAaxG,EAAI,KAAM,CAAA,CAAC,IAAIuG;AAAA,IAAA;AAAA,EACrC;AAEE,MAAAjH,EAASmG,CAAM;AACjB,eAAWzF,KAAOyF;AACZ,MAAAzF,EAAI,WAAW,IAAI,IAErB6F,EAAO7F,CAAG,IAAI,EAAE,OAAOyF,EAAOzF,CAAG,EAAE,IAE5B6F,EAAAW,EAAaxG,CAAG,CAAC,IAAI,EAAE,OAAOyF,EAAOzF,CAAG,EAAE;AAAA,MAG5C,CAAA,MAAM,QAAQyF,CAAM,KACvB,MAAA,KAAKA,CAAM,EACd,OAAO,CAAC/G,MAASA,KAAQ,IAAI,EAC7B,QAAQ,CAACA,MAAS;AACjB,WAAO,OAAOmH,GAAQC,GAAYpH,CAAI,CAAC;AAAA,EAAA,CACxC;AAGE,SAAAmH;AACT;AAKO,SAASW,EAAavI,GAAuB;AAC3C,SAAAA,EAAM,QAAQ,0BAA0B,CAACwI,GAAGC,OAASA,IAAM,MAAM,MAAMD,EAAE,YAAA,CAAa;AAC/F;AAMA,SAASpB,GAAYsB,GAAWC,GAA8B;AAC5D,QAAM1I,IAAO,OAAOyI;AAEpB,SAAIzI,MAAS,WACJ,OAAO0I,CAAM,IAGlB1I,MAAS,WACJ,OAAO0I,CAAM,IAGlB1I,MAAS,YACJ,EAAQ0I,IAGVA;AACT;AAGA,MAAMrB,KAAe,CAAC,OAAO,YAAY,SAAS,SAAS,MAAM;AC3hB1D,MAAMsB,GAAkC;AAAA,EAa7C,YAAY,EAAE,QAAA/D,GAAQ,UAAAgE,GAAU,gBAAAhC,KAAmC;AAZnE,IAAAnD,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,wBAAkC,CAAC;AACnC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,iBAAUoB,EAAc;AAOtB,SAAK,iBAAiB+B,GACtB,KAAK,WAAWgC,GAEX,KAAA,OAAO,SAAS,cAAc,UAAU,GACxC,KAAA,UAAU,SAAS,cAAc,WAAW;AAE7C,QAAAC;AAEJ,SAAK,mBAAmB;AAAA,MACtB,OAAO,MAAM;AACX,QAAIA,KAAS,SAEbA,IAAQ,KAAK,QAAQ,MAAMjE,GAAQ,IAAIoC,MAAW;AAChD,gBAAM8B,IAAW,KAAK,SAAS,GAAG9B,CAAM;AAEpC,cAAA,CAAC+B,GAAaD,CAAQ;AACxB,0BAAQ,MAAMA,CAAQ,GAChB,IAAI;AAAA,cACR,wDAAwDhJ,EAAOgJ,CAAQ,CAAC,YAAYA,CAAQ;AAAA,YAC9F;AAGE,UAAA,MAAM,QAAQA,CAAQ,IACnB,KAAA,OAAO,GAAGA,CAAQ,IAEvB,KAAK,OAAOA,CAAQ;AAAA,QACtB,CACD;AAAA,MACH;AAAA,MACA,MAAM,MAAM;AACV,QAAID,KAAS,SAEPA,EAAA,GACEA,IAAA;AAAA,MAAA;AAAA,IAEZ;AAAA,EAAA;AAAA,EAxCF,IAAI,YAAY;AACP,WAAA,KAAK,KAAK,cAAc;AAAA,EAAA;AAAA,EA0CjC,MAAMjD,GAAcC,GAAc;AAC5B,IAAC,KAAK,cACRD,EAAO,aAAa,KAAK,OAAMC,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GACzD,KAAK,iBAAiB,MAAM;AAAA,EAC9B;AAAA,EAGF,UAAU;;AACR,SAAK,iBAAiB,KAAK,GAC3B,KAAK,QAAQ,QAAQ,GAEjB,KAAK,cACP,KAAK,QAAQ,IACbtE,IAAA,KAAK,KAAK,eAAV,QAAAA,EAAsB,YAAY,KAAK;AAAA,EACzC;AAAA,EAGF,UAAU;;AACD,WAAA,KAAK,eAAe,SAAS;AAC7B,OAAAA,IAAA,KAAA,eAAe,IAAI,MAAnB,QAAAA,EAAsB;AAAA,EAC7B;AAAA,EAGF,UAAUoF,GAAwB;;AAGhC,QAFA,KAAK,QAAQ,GAETA,KAAY,QAAQ,CAAC,KAAK;AAC5B;AAGF,UAAMqC,IAAyBrC,EAAS,IAAI,CAACnI,MACvCyK,GAAgBzK,CAAC,IACZA,IACE0K,EAAS1K,CAAC,IACZ2K,EAAcpD,EAAgB,KAAK,gBAAgBvH,CAAC,CAAC,IAErD2K,EAAcpD,EAAgB,KAAK,gBAAgBJ,EAASnH,CAAC,CAAC,CAAC,CAEzE;AAED,eAAW4K,KAAQJ,GAAO;AACxB,YAAMhD,MAAWzE,IAAA,KAAK,eAAe,GAAG,EAAE,MAAzB,gBAAAA,EAA4B,SAAQ,KAAK;AAE1D,MAAA6H,EAAK,MAAM,KAAK,KAAK,YAAapD,CAAQ,GAErC,KAAA,eAAe,KAAKoD,CAAI;AAAA,IAAA;AAI/B,QAAI,KAAK,eAAe,KAAK,OAAA,MAAa,eAAe;AACvD,YAAMC,KAAWnF,IAAA,KAAK,eAAe,GAAG,EAAE,MAAzB,gBAAAA,EAA4B;AACzC,MAAA,KAAK,QAAQ,oBAAoBmF,KACnC,KAAK,KAAK,WAAY,aAAa,KAAK,UAASA,KAAA,gBAAAA,EAAU,gBAAe,IAAI;AAAA,IAChF;AAAA,EACF;AAEJ;ACxHO,MAAMC,GAAgC;AAAA,EAQ3C,YAAY5D,GAAsB;AAPlC,IAAAjC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,yBAAmC,CAAC;AACpC,IAAAA,EAAA;AAGE,SAAK,YAAYiC,EAAO,WACxB,KAAK,iBAAiBA,EAAO,gBAEzB,KAAK,eAAe,KAAK,OAAA,MAAa,iBACnC,KAAA,OAAO,SAAS,cAAc,QAAQ,GACtC,KAAA,UAAU,SAAS,cAAc,SAAS,MAE1C,KAAA,OAAO,SAAS,eAAe,EAAE,GACjC,KAAA,UAAU,SAAS,eAAe,EAAE;AAAA,EAC3C;AAAA,EAGF,IAAI,YAAY;;AACP,aAAAnE,IAAA,KAAK,SAAL,gBAAAA,EAAW,eAAc;AAAA,EAAA;AAAA,EAGlC,MAAMqE,GAAcC,GAA0B;AACxC,IAAC,KAAK,cACRD,EAAO,aAAa,KAAK,OAAMC,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAEzD,KAAK,eAAe,KAAK,UAAU,MAAM,CAACc,MAAa;AACrD,WAAK,OAAOA,CAAQ;AAAA,IAAA,CACrB;AAAA,EACH;AAAA,EAGF,UAAU;;AAMR,QALI,KAAK,iBACP,KAAK,aAAa,GAClB,KAAK,eAAe,SAGlB,KAAK,WAAW;AACP,iBAAAE,KAAS,KAAK;AACvB,QAAAA,EAAM,QAAQ;AAEhB,WAAK,kBAAkB,CAAC,IACxBtF,IAAA,KAAK,QAAQ,eAAb,QAAAA,EAAyB,YAAY,KAAK;AAAA,IAAO;AAAA,EACnD;AAAA,EAGF,OAAOgI,GAA8B;;AACxB,eAAA1C,KAAS,KAAK;AACvB,MAAAA,EAAM,QAAQ;AAGhB,aAAS7H,IAAI,GAAGA,IAAIuK,EAAY,QAAQvK,KAAK;AACrC,YAAA6H,IAAQ0C,EAAYvK,CAAC,GACrBgH,IAAWhH,IAAI,IAAIuK,EAAYvK,CAAC,IAAI;AAC1C,MAAA6H,EAAM,MAAM,KAAK,KAAK,eAAgBb,KAAA,gBAAAA,EAAU,IAAI;AAAA,IAAA;AAGtD,SAAK,kBAAkBuD,GAEnB,KAAK,eAAe,KAAK,OAAA,MAAa,kBACnC,KAAA,KAAK,cAAc,WAAWA,EAAY,MAAM,IAAIA,EAAY,WAAW,IAAI,UAAU,UAAU,MACxGC,IAAA,KAAK,KAAK,kBAAV,QAAAA,EAAyB;AAAA,MACvB,KAAK;AAAA,QACLtF,KAAA3C,IAAA,KAAK,gBAAgB,KAAK,gBAAgB,SAAS,CAAC,MAApD,gBAAAA,EAAuD,SAAvD,gBAAA2C,EAA6D,gBAAe;AAAA;AAAA,EAEhF;AAEJ;AC9DO,MAAMuF,GAAgC;AAAA,EAW3C,YAAY/D,GAAsB;AAVlC,IAAAjC,EAAA;AACA,IAAAA,EAAA;AAUE,SAAK,SAASiC;AAAA,EAAA;AAAA,EARhB,IAAI,YAAY;AACV,WAAC,KAAK,UAGH,KAAK,QAAQ,YAFX;AAAA,EAEW;AAAA,EAOtB,MAAMgE,GAAeC,GAAe;AAClC,UAAM,EAAE,SAAAC,GAAS,QAAAhE,EAAO,IAAI,KAAK;AAE7B,IAAAqD,GAAgBW,CAAO,IACzB,KAAK,UAAUA,IACNV,EAASU,CAAO,IACzB,KAAK,UAAUT,EAAcpD,EAAgB,KAAK,OAAO,gBAAgB6D,CAAO,CAAC,IAE5E,KAAA,UAAUT,EAAcpD,EAAgB,KAAK,OAAO,gBAAgBJ,EAASiE,CAAO,CAAC,CAAC,GAGxF,KAAA,QAAQ,MAAMhE,CAAM;AAAA,EAAA;AAAA,EAG3B,UAAU;;AACJ,KAAArE,IAAA,KAAK,YAAL,QAAAA,EAAc,aAChB,KAAK,QAAQ,QAAQ;AAAA,EACvB;AAEJ;ACuDA,MAAMsI,GAA+B;AAAA,EAGnC,YAAYC,GAAiB;AAF7B,IAAArG,EAAA;AAGE,SAAK,SAASqG;AAGd,UAAMC,IAAc,OAAO,0BAA0B,KAAK,OAAO,OAAO;AACxE,eAAWjI,KAAOiI;AAChB,MAAIjI,MAAQ,aACV,OAAO,eAAe,MAAMA,GAAKiI,EAAYjI,CAAG,CAAC;AAAA,EAErD;AAAA,EAGF,IAAI,MAAM;AACR,WAAO,KAAK,OAAO;AAAA,EAAA;AAAA,EAGrB,QAAQU,GAA2B;AAC5B,gBAAA,OAAO,QAAQ,QAAQA,CAAI,GACzB;AAAA,EAAA;AAAA,EAGT,IAAOV,GAAsB/B,GAAa;AACxC,gBAAK,OAAO,gBAAgB,KAAK+B,CAAG,IAAI/B,GACjCA;AAAA,EAAA;AAAA,EAGT,IAAO+B,GAAgC;AACjC,QAAAkI,IAAM,KAAK,OAAO;AAEtB,eAAa;AACP,UAAAlI,KAAOkI,EAAI;AACN,eAAAA,EAAI,KAAKlI,CAAG;AACrB,UAAWkI,EAAI;AACb,QAAAA,IAAMA,EAAI;AAAA;AAEV;AAAA,IACF;AAGK,WAAA;AAAA,EAAA;AAAA,EAGT,SAA2C;AACzC,UAAMC,IAA+C,CAAC;AAElD,QAAAD,IAAM,KAAK,OAAO;AACtB,WACWC,EAAA,KAAKD,EAAI,IAAI,GAElBA,EAAI;AACN,MAAAA,IAAMA,EAAI;AAMd,UAAME,IAAyC,CAAC;AAGrC,eAAAC,KAAWF,EAAS;AACtB,aAAA,OAAOC,GAAMC,CAAO;AAGtB,WAAAD;AAAA,EAAA;AAAA,EAGT,YAAY5G,GAA4B;AACjC,SAAA,OAAO,sBAAsB,KAAKA,CAAQ;AAAA,EAAA;AAAA,EAGjD,QAAQA,GAA4B;AAC7B,SAAA,OAAO,kBAAkB,KAAKA,CAAQ;AAAA,EAAA;AAAA,EAG7C,cAAcA,GAA4B;AACnC,SAAA,OAAO,wBAAwB,KAAKA,CAAQ;AAAA,EAAA;AAAA,EAGnD,UAAUA,GAA4B;AAC/B,SAAA,OAAO,oBAAoB,KAAKA,CAAQ;AAAA,EAAA;AAAA,EAG/C,MAAmCsB,GAAgBtB,GAA6D;AAC9G,UAAMwG,IAAO,KAAK;AAElB,QAAIA,EAAK;AAGP,aAAOA,EAAK,SAAS,MAAMlF,GAAQtB,CAAQ;AACtC;AAGD,UAAAgC,GACA8E,IAAY;AACX,aAAAN,EAAA,kBAAkB,KAAK,MAAM;AAChC,QAAKM,MACH9E,IAAOwE,EAAK,SAAS,MAAMlF,GAAQtB,CAAQ;AAAA,MAC7C,CACD,GACM,MAAM;AACX,QAAIgC,KAAQ,SACE8E,IAAA,IACP9E,EAAA;AAAA,MAET;AAAA,IAAA;AAAA,EACF;AAAA,EAGF,SAAiB;AACf,WAAO+E,EAAa,WAAW,EAAE,WAAW,KAAK,OAAO,YAAY;AAAA,EAAA;AAExE;AAEO,MAAMC,EAA+B;AAAA,EAmB1C,YAAY1D,GAAgCkD,GAAuBpD,GAAUC,IAAqB,CAAA,GAAI;AAlBtG,IAAAlD,EAAA,kBAAWyC,GAAO;AAElB,IAAAzC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,kBAAWoB,EAAc;AACzB,IAAApB,EAAA,+BAAuC,CAAC;AACxC,IAAAA,EAAA,2BAAmC,CAAC;AACpC,IAAAA,EAAA,iCAAyC,CAAC;AAC1C,IAAAA,EAAA,6BAAqC,CAAC;AAqBtC,IAAAA,EAAA,mBAAY;AAlBL,SAAA,kBAAkB,EAAE,GAAGmD,GAAgB,MAAM,CAAC,GAAG,QAAQA,EAAe,GACxE,KAAA,UAAUA,EAAe,KAAK,aAAakD,EAAK,MAAM,EAAE,KAAK,KAAK,SAAA,CAAU,GACjF,KAAK,QAAQA,GACb,KAAK,SAASpD;AAER,UAAA,CAAC6D,GAAWC,CAAW,IAAIxG,EAA6B+B,EAAgBa,GAAgBD,CAAQ,CAAC;AACvG,SAAK,aAAa4D,GAClB,KAAK,eAAeC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAOtB,IAAI,OAAO;;AACT,YAAOjJ,IAAA,KAAK,aAAL,gBAAAA,EAAe;AAAA,EAAA;AAAA,EAKxB,MAAMqE,GAAcC,GAAc;AAGhC,UAAM4E,IAAe,KAAK;AAE1B,QAAI,CAACA;AAEI,WADP,KAAK,WAAW,GACT,KAAK,sBAAsB,SAAS;AAEhC,QADQ,KAAK,sBAAsB,MAAM,EACzC;AAIb,IAAI,KAAK,YACF,KAAA,SAAS,MAAM7E,GAAQC,CAAK,GAG9B4E,MACH,KAAK,YAAY,IAEjB,sBAAsB,MAAM;AACnB,aAAA,KAAK,kBAAkB,SAAS;AAE5B,QADQ,KAAK,kBAAkB,MAAM,EACrC;AAAA,IACX,CACD;AAAA,EACH;AAAA,EAGF,UAAU;AACD,WAAA,KAAK,wBAAwB,SAAS;AAElC,MADQ,KAAK,wBAAwB,MAAM,EAC3C;AASJ,SANH,KAAK,YACP,KAAK,SAAS,QAAQ,GAGxB,KAAK,YAAY,IAEV,KAAK,oBAAoB,SAAS;AAE9B,MADQ,KAAK,oBAAoB,MAAM,EACvC;AAGX,SAAK,SAAS,QAAQ;AAAA,EAAA;AAAA,EAGxB,aAAa9H,GAAsB;AACjC,UAAMyG,IAAO,IAAIkB,EAAK,KAAK,iBAAiB3H,GAAI,EAAE;AAC7C,gBAAA,aAAa,CAACyG,CAAI,CAAC,GACjBA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAOT,aAAa;AACL,UAAAe,IAAU,IAAIN,GAAQ,IAAI;AAE5B,QAAAa;AACA,QAAA;AACF,MAAAA,IAAS,KAAK,MAAM,KAAK,QAAQP,CAAO;AAAA,aACjCQ,GAAO;AACd,YAAIA,aAAiB,SACd,KAAA,QAAQ,MAAMA,CAAK,GAEpBA;AAAA,IAAA;AAGR,QAAID,MAAW,KAEf,KAAWA,aAAkB;AAC3B,WAAK,WAAWvB,EAAcpD,EAAgB,KAAK,iBAAiBsE,EAAa,SAAS,EAAE,OAAOK,EAAA,CAAQ,CAAC,CAAC;AAAA,aACpGxB,EAASwB,CAAM,KAAKtK,GAAkB8I,GAAUwB,CAAM;AAC/D,WAAK,WAAWvB,EAAcpD,EAAgB,KAAK,iBAAiB2E,CAAM,CAAC;AAAA,aAClE1H,EAAQ0H,CAAM;AACvB,WAAK,WAAWvB;AAAA,QACdpD,EAAgB,KAAK,iBAAiBsE,EAAa,aAAa,EAAE,QAAQ,CAACK,CAAM,GAAG,UAAU,CAACE,MAAMA,EAAA,CAAG,CAAC;AAAA,MAC3G;AAAA,SACK;AACL,YAAMD,IAAQ,IAAI;AAAA,QAChB,aACE,KAAK,MAAM,IACb,2EAA2E7K,EAAO4K,CAAM,CAAC;AAAA,MAC3F;AACK,WAAA,QAAQ,MAAMC,CAAK;AAAA,IAAA;AAAA,EAC1B;AAEJ;AC5UO,MAAME,GAAmC;AAAA,EAc9C,YAAY,EAAE,gBAAAjE,GAAgB,QAAAkE,GAAQ,UAAAlC,GAAU,OAAAmC,KAA2B;AAb3E,IAAAtH,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,wBAAqC,CAAC;AACtC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAOE,SAAK,iBAAiBmD,GAEtB,KAAK,SAASkE,GACd,KAAK,WAAWlC,GAChB,KAAK,QAAQmC,GAET,KAAK,eAAe,KAAK,OAAA,MAAa,iBACnC,KAAA,OAAO,SAAS,cAAc,QAAQ,GACtC,KAAA,UAAU,SAAS,cAAc,SAAS,MAE1C,KAAA,OAAO,SAAS,eAAe,EAAE,GACjC,KAAA,UAAU,SAAS,eAAe,EAAE;AAAA,EAC3C;AAAA,EAjBF,IAAI,YAAY;AACP,WAAA,KAAK,KAAK,cAAc;AAAA,EAAA;AAAA,EAmBjC,MAAMnF,GAAcC,GAAc;AAC5B,IAAC,KAAK,cACRD,EAAO,aAAa,KAAK,OAAMC,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAEzD,KAAK,eAAe,KAAK,OAAO,MAAM,CAAC9F,MAAU;AAC/C,WAAK,QAAQ,MAAM,KAAKA,CAAK,CAAC;AAAA,IAAA,CAC/B;AAAA,EACH;AAAA,EAGF,UAAU;;AACR,IAAI,KAAK,iBACP,KAAK,aAAa,GAClB,KAAK,eAAe,SAGlB,KAAK,eACPwB,IAAA,KAAK,KAAK,eAAV,QAAAA,EAAsB,YAAY,KAAK,QACvC2C,IAAA,KAAK,QAAQ,eAAb,QAAAA,EAAyB,YAAY,KAAK,WAG5C,KAAK,SAAS;AAAA,EAAA;AAAA,EAGhB,WAAW;AACE,eAAA1D,KAAQ,KAAK;AACtB,MAAAA,EAAK,QAAQ,QAAQ;AAEvB,SAAK,iBAAiB,CAAC;AAAA,EAAA;AAAA,EAGzB,QAAQT,GAAY;;AAClB,QAAIA,EAAM,WAAW,KAAK,CAAC,KAAK;AAC9B,aAAO,KAAK,SAAS;AAKvB,UAAMiL,IAA+B,CAAC;AACtC,QAAIjH,IAAQ;AAEZ,eAAWvD,KAAQT;AACjB,MAAAiL,EAAe,KAAK;AAAA,QAClB,KAAK,KAAK,MAAMxK,GAAMuD,CAAK;AAAA,QAC3B,OAAOvD;AAAA,QACP,OAAOuD;AAAA,MAAA,CACR;AAGH,UAAMkH,IAA+B,CAAC;AAG3B,eAAAC,KAAa,KAAK;AAG3B,MAFsBF,EAAe,KAAK,CAACvL,MAAMA,EAAE,QAAQyL,EAAU,GAAG,KAGtEA,EAAU,QAAQ,QAAQ;AAK9B,eAAWC,KAAaH,GAAgB;AAChC,YAAAE,IAAY,KAAK,eAAe,KAAK,CAAC1K,MAASA,EAAK,QAAQ2K,EAAU,GAAG;AAE/E,UAAID;AACQ,QAAAA,EAAA,SAASC,EAAU,KAAK,GACxBD,EAAA,SAASC,EAAU,KAAK,GACzBF,EAAAE,EAAU,KAAK,IAAID;AAAA,WACvB;AACL,cAAM,CAACE,GAAQC,CAAQ,IAAIrH,EAAemH,EAAU,KAAK,GACnD,CAACG,GAAQC,CAAQ,IAAIvH,EAAYmH,EAAU,KAAK;AAE7C,QAAAF,EAAAE,EAAU,KAAK,IAAI;AAAA,UAC1B,KAAKA,EAAU;AAAA,UACf,QAAAC;AAAA,UACA,UAAAC;AAAA,UACA,QAAAC;AAAA,UACA,UAAAC;AAAA,UACA,SAAS,IAAIjB,EAAK,KAAK,gBAAgBkB,IAAgB;AAAA,YACrD,QAAAJ;AAAA,YACA,QAAAE;AAAA,YACA,UAAU,KAAK;AAAA,UAChB,CAAA;AAAA,QACH;AAAA,MAAA;AAAA,IACF;AAIF,aAAStM,IAAI,GAAGA,IAAIiM,EAAS,QAAQjM,KAAK;AAClC,YAAAwB,IAAOyK,EAASjM,CAAC,GACjBgH,MAAWzE,IAAA0J,EAASjM,IAAI,CAAC,MAAd,gBAAAuC,EAAiB,QAAQ,SAAQ,KAAK;AACvD,MAAAf,EAAK,QAAQ,MAAM,KAAK,KAAK,YAAawF,CAAQ;AAAA,IAAA;AAKpD,QAFA,KAAK,iBAAiBiF,GAElB,KAAK,eAAe,KAAK,OAAA,MAAa,eAAe;AAClD,WAAA,KAAK,cAAc,WAAWA,EAAS,MAAM,QAAQA,EAAS,WAAW,IAAI,KAAK,GAAG;AAE1F,YAAMQ,MAAWvH,IAAA+G,EAAS,GAAG,EAAE,MAAd,gBAAA/G,EAAiB,QAAQ,SAAQ,KAAK;AACvD,OAAAsF,IAAA,KAAK,KAAK,eAAV,QAAAA,EAAsB,aAAa,KAAK,SAASiC,EAAS;AAAA,IAAW;AAAA,EACvE;AAEJ;AAQA,SAASD,GAAe,EAAE,QAAAJ,GAAQ,QAAAE,GAAQ,UAAA1C,EAAA,GAA6BoB,GAAkB;AAChF,SAAApB,EAASwC,GAAQE,GAAQtB,CAAG;AACrC;AC5JO,MAAM0B,GAA8B;AAAA,EASzC,YAAY,EAAE,OAAA3L,KAAsB;AARpC,IAAA0D,EAAA,cAAO,SAAS,eAAe,EAAE;AACjC,IAAAA,EAAA,eAAgC;AAChC,IAAAA,EAAA;AAOE,SAAK,QAAQ1D;AAAA,EAAA;AAAA,EALf,IAAI,YAAY;AACP,WAAA,KAAK,KAAK,cAAc;AAAA,EAAA;AAAA,EAOjC,MAAM,MAAM6F,GAAcC,IAAqB,MAAM;AAC/C,IAAC,KAAK,cACJ7C,EAAoB,KAAK,KAAK,IAChC,KAAK,eAAe,KAAK,MAAM,MAAM,CAACjD,MAAU;AAC9C,WAAK,OAAOA,CAAK;AAAA,IAAA,CAClB,IAEI,KAAA,OAAO,KAAK,KAAK,IAI1B6F,EAAO,aAAa,KAAK,OAAMC,KAAA,gBAAAA,EAAO,gBAAe,IAAI;AAAA,EAAA;AAAA,EAG3D,MAAM,UAAU;AACd,IAAI,KAAK,cACH,KAAK,iBACP,KAAK,aAAa,GAClB,KAAK,eAAe,SAGtB,KAAK,KAAK,WAAY,YAAY,KAAK,IAAI;AAAA,EAC7C;AAAA,EAGF,OAAO9F,GAAoB;AACzB,IAAIA,KAAS,OACN,KAAA,KAAK,cAAcA,EAAM,SAAS,IAEvC,KAAK,KAAK,cAAc;AAAA,EAC1B;AAEJ;ACkBO,SAASmJ,EAASnJ,GAAiC;AACxD,SACEqB,EAASrB,CAAK,MACb,OAAOA,EAAM,QAAS,YAAY,OAAOA,EAAM,QAAS,eACzD,MAAM,QAAQA,EAAM,QAAQ;AAEhC;AAEO,SAASkJ,GAAgBlJ,GAAwC;AAC/D,SAAAqB,EAASrB,CAAK,KAAKgB,EAAWhB,EAAM,OAAO,KAAKgB,EAAWhB,EAAM,UAAU;AACpF;AAEO,SAAS4F,EAASgG,GAAkD;AACrE,SAACzL,EAAQyL,CAAW,MACtBA,IAAc,CAACA,CAAW,IAGrBA,EACJ,KAAK,KAAQ,EACb,OAAO,CAACf,MAAMA,KAAM,QAA2BA,MAAM,EAAK,EAC1D,IAAI,CAACA,MAAM;AACV,QAAIA,aAAa;AACf,aAAOP,EAAa,SAAS,EAAE,OAAOO,GAAG;AAG3C,QAAIA,aAAagB;AACf,aAAOvB,EAAa,SAAS,EAAE,OAAOO,EAAE,MAAM;AAG5C,QAAA1B,EAAS0B,CAAC;AACL,aAAAA;AAGT,QAAIjK,EAASiK,CAAC,KAAK5J,GAAS4J,CAAC;AAC3B,aAAOP,EAAa,SAAS,EAAE,OAAOO,GAAG;AAGvC,QAAA5H,EAAQ4H,CAAC;AACX,aAAOP,EAAa,aAAa;AAAA,QAC/B,QAAQ,CAACO,CAAC;AAAA,QACV,UAAU,CAACA,MAAMA;AAAAA,MAAA,CAClB;AAGH,kBAAQ,MAAMA,CAAC,GACT,IAAI,UAAU,+BAA+BA,CAAC,EAAE;AAAA,EAAA,CACvD;AACL;AAoCgB,SAAAP,EAAgBrK,GAAgC0G,MAAcC,GAAwB;AACpG,SAAID,KAAS,QACXmF,GAAiBnF,CAA4B,GAGxC;AAAA,IACL,MAAA1G;AAAA,IACA,OAAA0G;AAAA,IACA,UAAUf,EAASgB,CAAQ;AAAA,EAC7B;AACF;AAKA,SAASkF,GAAiBnF,GAA4B;AACpD,MAAIA,EAAM,OACJ,CAACxD,GAAMwD,EAAM,GAAG;AACV,kBAAA,KAAKA,EAAM,GAAG,GAChB,IAAI,UAAU,yCAAyCA,EAAM,GAAG,EAAE;AAI5E,aAAW5E,KAAO4E;AAChB,QAAI5E,EAAI,WAAW,IAAI,KAAK4E,EAAM5E,CAAG,MAAM;AACzC,UAAI,CAACmB,EAAgByD,EAAM5E,CAAG,CAAC;AACvB,cAAA,IAAI,UAAU,SAASA,CAAG,wDAAwD4E,EAAM5E,CAAG,CAAC,EAAE;AAAA,eAE7FA,EAAI,WAAW,GAAG,KAAK4E,EAAM5E,CAAG,MAAM,UAC3C,CAACkB,EAAQ0D,EAAM5E,CAAG,CAAC;AACf,YAAA,IAAI,UAAU,SAASA,CAAG,gDAAgD4E,EAAM5E,CAAG,CAAC,EAAE;AAIpG;AASa,MAAAgK,KAAOvG,GAAI,KAAK8E,CAAY;AAKzB,SAAA0B,GAAKC,GAA4BC,GAA0BC,GAAkC;AACrG,QAAAC,IAAa/I,EAAQ4I,CAAS;AAEpC,SAAO3B,EAAa,SAAS;AAAA,IAC3B,YAAA8B;AAAA,IACA,aAAAF;AAAA,IACA,aAAAC;AAAA,EAAA,CACD;AACH;AAMgB,SAAAE,GACdC,GACAtB,GACAnC,GACQ;AACF,QAAAkC,IAAS1H,EAAQiJ,CAAK;AAE5B,SAAOhC,EAAa,WAAW,EAAE,QAAAS,GAAQ,OAAAC,GAAO,UAAAnC,GAAU;AAC5D;AAKgB,SAAA0D,GAAO1G,GAAcgE,GAAqB;AACxD,SAAOS,EAAa,WAAW,EAAE,QAAAzE,GAAQ,SAAAgE,GAAS;AACpD;AASA,MAAMgC,GAAiC;AAAA,EAOrC,YAAYxC,GAAY;AANxB,IAAA3F,EAAA;AAOE,SAAK,OAAO2F;AAAA,EAAA;AAAA,EALd,IAAI,YAAY;AACP,WAAA,KAAK,KAAK,cAAc;AAAA,EAAA;AAAA,EAOjC,MAAM,MAAMxD,GAAcC,GAAc;AACtC,IAAAD,EAAO,aAAa,KAAK,OAAMC,KAAA,gBAAAA,EAAO,gBAAe,IAAI;AAAA,EAAA;AAAA,EAG3D,MAAM,UAAU;AACV,IAAA,KAAK,KAAK,cACZ,KAAK,KAAK,WAAW,YAAY,KAAK,IAAI;AAAA,EAC5C;AAEJ;AAKgB,SAAAE,EAAgBa,GAAgC2F,GAA4C;AAGnG,UAFOrM,EAAQqM,CAAM,IAAIA,IAAS,CAACA,CAAM,GAEnC,IAAI,CAAC/L,MAAS;AACrB,QAAAO,EAAWP,EAAK,IAAI;AACf,aAAA,IAAI8J,EAAK1D,GAAgBpG,EAAK,MAA2BA,EAAK,OAAOA,EAAK,QAAQ;AAChF,QAAAG,EAASH,EAAK,IAAI;AAC3B,cAAQA,EAAK,MAAM;AAAA,QACjB,KAAK,SAAS;AACZ,gBAAMgM,IAAQhM,EAAK;AACZ,iBAAA,IAAIoL,GAAQY,EAAM,KAAK;AAAA,QAAA;AAAA,QAEhC,KAAK,SAAS;AACZ,gBAAMA,IAAQhM,EAAK;AACnB,iBAAO,IAAIkL,GAAK;AAAA,YACd,OAAOc,EAAM;AAAA,UAAA,CACd;AAAA,QAAA;AAAA,QAEH,KAAK,SAAS;AACZ,gBAAMA,IAAQhM,EAAK;AACnB,iBAAO,IAAIiF,GAAY;AAAA,YACrB,YAAY+G,EAAM;AAAA,YAClB,aAAaA,EAAM;AAAA,YACnB,aAAaA,EAAM;AAAA,YACnB,gBAAA5F;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,KAAK,WAAW;AACd,gBAAM4F,IAAQhM,EAAK;AACnB,iBAAO,IAAIqK,GAAO;AAAA,YAChB,QAAQ2B,EAAM;AAAA,YACd,OAAOA,EAAM;AAAA,YACb,UAAUA,EAAM;AAAA,YAChB,gBAAA5F;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,KAAK,aAAa;AAChB,gBAAM4F,IAAQhM,EAAK;AACnB,iBAAO,IAAImI,GAAS;AAAA,YAClB,QAAQ6D,EAAM;AAAA,YACd,UAAUA,EAAM;AAAA,YAChB,gBAAA5F;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,KAAK,WAAW;AACd,gBAAM4F,IAAQhM,EAAK;AACnB,iBAAO,IAAI8I,GAAO;AAAA,YAChB,WAAWkD,EAAM;AAAA,YACjB,gBAAA5F;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,KAAK,WAAW;AACd,gBAAM4F,IAAQhM,EAAK;AACnB,iBAAO,IAAIiJ,GAAO;AAAA,YAChB,SAAS+C,EAAM;AAAA,YACf,QAAQA,EAAM;AAAA,YACd,gBAAA5F;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH;AACE,cAAIpG,EAAK,KAAK,WAAW,GAAG;AAC1B,kBAAM,IAAI,MAAM,wBAAwBA,EAAK,IAAI,EAAE;AAErD,iBAAO,IAAIgG,GAAK;AAAA,YACd,KAAKhG,EAAK;AAAA,YACV,OAAOA,EAAK,SAAS,CAAC;AAAA,YACtB,UAAUA,EAAK;AAAA,YACf,gBAAAoG;AAAA,UAAA,CACD;AAAA,MAAA;AAAA;AAGL,YAAM,IAAI,UAAU,4CAA4CpG,EAAK,IAAI,EAAE;AAAA,EAC7E,CACD;AACH;AAKO,SAAS2I,EAAcH,GAAuC;AAC/D,MAAAA,EAAM,WAAW;AACnB,WAAOA,EAAM,CAAC;AAGV,QAAAI,IAAO,SAAS,cAAc,UAAU;AAE9C,MAAIqD,IAAc;AAEX,SAAA;AAAA,IACL,IAAI,OAAO;AACF,aAAArD;AAAA,IACT;AAAA,IACA,IAAI,YAAY;AACP,aAAAqD;AAAA,IACT;AAAA,IACA,MAAM7G,GAAcC,GAAc;;AAChC,MAAAD,EAAO,aAAawD,GAAMvD,KAAgB,IAAI;AAE9C,iBAAWC,KAAUkD,GAAO;AAC1B,cAAMhD,MAAWzE,IAAAyH,EAAMA,EAAM,SAAS,CAAC,MAAtB,gBAAAzH,EAAyB,SAAQ6H;AAC3C,QAAAtD,EAAA,MAAMF,GAAQI,CAAQ;AAAA,MAAA;AAGjB,MAAAyG,IAAA;AAAA,IAChB;AAAA,IACA,UAAU;AACR,UAAIA,GAAa;AACf,mBAAW3G,KAAUkD;AACnB,UAAAlD,EAAO,QAAQ;AAGjB,QAAAsD,EAAK,OAAO;AAAA,MAAA;AAGA,MAAAqD,IAAA;AAAA,IAAA;AAAA,EAElB;AACF;AAEO,SAAS1D,GAAahJ,GAAqC;AAChE,SACEA,KAAS,QACTA,MAAU,MACV,OAAOA,KAAU,YACjB,OAAOA,KAAU,YACjBmJ,EAASnJ,CAAK,KACdiD,EAAQjD,CAAK,KACbK,GAAU2I,IAAchJ,CAAK;AAEjC;ACxYgB,SAAA2M,GAAYC,GAAO3C,GAAkB;AACnD,SAAOA,EAAI,OAAO;AACpB;","x_google_ignoreList":[0,4,6,7]}
package/notes/scratch.md CHANGED
@@ -165,7 +165,7 @@ debug.warn("THIS IS A SCOPED LOGGER");
165
165
  Dolla.render.read(() => {
166
166
  // Reference DOM nodes
167
167
  });
168
- Dolla.render.update(() => {
168
+ Dolla.render.write(() => {
169
169
  // Mutate the DOM as part of Dolla's next batch
170
170
  }, "some-key");
171
171
 
package/package.json CHANGED
@@ -1,12 +1,15 @@
1
1
  {
2
2
  "name": "@manyducks.co/dolla",
3
- "version": "2.0.0-alpha.17",
3
+ "version": "2.0.0-alpha.19",
4
4
  "description": "Front-end components, routing and state management.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "type": "module",
8
8
  "sideEffects": false,
9
- "repository": "https://github.com/manyducksco/dolla",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/manyducksco/dolla.git"
12
+ },
10
13
  "scripts": {
11
14
  "test": "npm run build && node --test",
12
15
  "build:esbuild": "tsc && node build.js",