@opendaw/studio-core 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../lib/std/dist/lang.js", "../../../lib/std/dist/arrays.js", "../../../lib/std/dist/option.js", "../../../lib/std/dist/attempts.js", "../../../lib/std/dist/binary-search.js", "../../../lib/std/dist/color.js", "../../../lib/std/dist/comparators.js", "../../../lib/std/dist/math.js", "../../../lib/std/dist/curve.js", "../../../lib/std/dist/numeric.js", "../../../lib/std/dist/iterables.js", "../../../lib/std/dist/data.js", "../../../lib/std/dist/decorators.js", "../../../lib/std/dist/generators.js", "../../../lib/std/dist/geom.js", "../../../lib/std/dist/hash.js", "../../../lib/std/dist/intervals.js", "../../../lib/std/dist/listeners.js", "../../../lib/std/dist/sets.js", "../../../lib/std/dist/objects.js", "../../../lib/std/dist/terminable.js", "../../../lib/std/dist/observers.js", "../../../lib/std/dist/value-mapping.js", "../../../lib/std/dist/string-mapping.js", "../../../lib/std/dist/predicates.js", "../../../lib/std/dist/progress.js", "../../../lib/std/dist/random.js", "../../../lib/std/dist/schema.js", "../../../lib/std/dist/sorted-set.js", "../../../lib/std/dist/strings.js", "../../../lib/std/dist/time-span.js", "../../../lib/std/dist/sync-stream.js", "../../../lib/std/dist/uuid.js", "../../../lib/std/dist/value-guides.js", "../../../lib/std/dist/index.js", "../../../lib/runtime/dist/communicator.js", "../../../lib/runtime/dist/fetch.js", "../../../lib/runtime/dist/runtime.js", "../../../lib/runtime/dist/messenger.js", "../../../lib/runtime/dist/promises.js", "../../../lib/runtime/dist/network.js", "../../../lib/runtime/dist/stopwatch.js", "../../../lib/runtime/dist/timespan.js", "../../../lib/runtime/dist/wait.js", "../../../lib/runtime/dist/index.js", "../../../lib/box/dist/address.js", "../../../lib/box/dist/pointer-hub.js", "../../../lib/box/dist/field.js", "../../../lib/box/dist/vertex.js", "../../../lib/box/dist/serializer.js", "../../../lib/box/dist/box.js", "../../../lib/box/dist/dispatchers.js", "../../../lib/box/dist/primitive.js", "../../../lib/box/dist/updates.js", "../../../lib/box/dist/pointer.js", "../../../lib/box/dist/index.js", "../../../lib/dom/dist/browser.js", "../../../lib/dom/dist/compression.js", "../../../lib/dom/dist/console-commands.js", "../../../lib/dom/dist/context-2d.js", "../../../lib/dom/dist/css-utils.js", "../../../lib/dom/dist/frames.js", "../../../lib/dom/dist/events.js", "../../../lib/dom/dist/keyboard.js", "../../../lib/dom/dist/dragging.js", "../../../lib/dom/dist/errors.js", "../../../lib/dom/dist/files.js", "../../../lib/dom/dist/html.js", "../../../lib/dom/dist/modfier-keys.js", "../../../lib/dom/dist/stream.js", "../../../lib/dom/dist/svg.js", "../../../lib/dom/dist/terminable.js", "../../../lib/dom/dist/index.js", "../../../lib/fusion/dist/live-stream/PackageType.js", "../../../lib/fusion/dist/live-stream/Lock.js", "../../../lib/fusion/dist/live-stream/Flags.js", "../../../lib/fusion/dist/peaks/Peaks.js", "../../../lib/fusion/dist/peaks/PeakWorker.js", "../../../lib/fusion/dist/peaks/PeaksPainter.js", "../../../lib/fusion/dist/opfs/OpfsWorker.js", "../../../lib/fusion/dist/index.js", "../../core-workers/src/Workers.ts"],
4
- "sourcesContent": ["export const identity = (value) => value;\nexport const isDefined = (value) => value !== undefined && value !== null;\nexport const ifDefined = (value, procedure) => { if (value !== undefined && value !== null) {\n procedure(value);\n} };\nexport const asDefined = (value, fail = \"asDefined failed\") => value === null || value === undefined ? panic(fail) : value;\nexport const isInstanceOf = (obj, clazz) => obj instanceof clazz;\nexport const asInstanceOf = (obj, clazz) => obj instanceof clazz ? obj : panic(`${obj} is not instance of ${clazz}`);\nexport const assertInstanceOf = (obj, clazz) => { if (!(obj instanceof clazz)) {\n panic(`${obj} is not instance of ${clazz}`);\n} };\nexport const tryProvide = (provider) => { try {\n return provider();\n}\ncatch (reason) {\n return panic(String(reason));\n} };\nexport const getOrProvide = (value) => value instanceof Function ? value() : value;\nexport const safeWrite = (object, property, value) => property in object ? object[property] = value : undefined;\nexport const safeExecute = (func, ...args) => func?.apply(null, args);\nexport const Unhandled = (empty) => { throw new Error(`Unhandled ${empty}`); };\nexport const panic = (issue) => { throw issue instanceof Error ? issue : new Error(issue); };\nexport const assert = (condition, fail) => condition ? undefined : panic(getOrProvide(fail));\nexport const checkIndex = (index, array) => index >= 0 && index < array.length ? index : panic(`Index ${index} is out of bounds`);\nexport const InaccessibleProperty = (failMessage) => new Proxy({}, { get() { return panic(failMessage); } });\nexport const canWrite = (obj, key) => {\n while (isDefined(obj)) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n if (isDefined(descriptor)) {\n return typeof descriptor.set === \"function\";\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n};\nexport const requireProperty = (object, key) => {\n const { status, value } = tryCatch(() => object instanceof Function ? object.name : object.constructor.name);\n const feature = status === \"failure\" ? `${object}.${String(key)}` : `${value}.${String(key)}`;\n console.debug(`%c${feature}%c available`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n if (!(key in object)) {\n throw feature;\n }\n};\nexport const tryCatch = (statement) => {\n try {\n return { error: null, value: statement(), status: \"success\" };\n }\n catch (error) {\n return { error, value: null, status: \"failure\" };\n }\n};\nexport const isValidIdentifier = (identifier) => /^[A-Za-z_$][A-Za-z0-9_]*$/.test(identifier);\nexport const asValidIdentifier = (identifier) => isValidIdentifier(identifier) ? identifier : panic(`'${identifier}' is not a valid identifier`);\nexport const EmptyExec = () => { };\nexport const EmptyProvider = () => { };\nexport const EmptyProcedure = (_) => { };\nexport const flipComparator = (comparator) => (a, b) => -comparator(a, b);\n", "import { asDefined, panic } from \"./lang\";\nexport var Sorting;\n(function (Sorting) {\n Sorting[Sorting[\"Ascending\"] = 1] = \"Ascending\";\n Sorting[Sorting[\"Descending\"] = -1] = \"Descending\";\n})(Sorting || (Sorting = {}));\nexport class Arrays {\n static #empty = Object.freeze(new Array(0));\n static empty = () => (() => this.#empty)();\n static clear = (array) => { array.length = 0; };\n static replace = (array, newValues) => {\n array.length = 0;\n array.push(...newValues);\n };\n static consume = (array, procedure) => {\n for (let index = 0; index < array.length;) {\n if (procedure(array[index])) {\n array.splice(index, 1);\n }\n else {\n index++;\n }\n }\n };\n static peekFirst = (array) => array.at(0) ?? null;\n static peekLast = (array) => array.at(-1) ?? null;\n static getFirst = (array, fail) => asDefined(array.at(0), fail);\n static getLast = (array, fail) => asDefined(array.at(-1), fail);\n static removeLast = (array, fail) => asDefined(array.pop(), fail);\n static create = (factory, n) => {\n const array = new Array(n);\n for (let i = 0; i < n; i++) {\n array[i] = factory(i);\n }\n return array;\n };\n static equals = (a, b) => {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n };\n /**\n * The satisfy method checks if all elements in a given array satisfy a provided predicate function\n * when compared with the first element of the array. That essentially means that all tested properties\n * in the predicate function are equal throughout the array.\n * [1, 1, 1, 1, 1] > (a, b) => a === b returns true\n * [1, 1, 1, 1, 2] > (a, b) => a === b returns false\n * [1, 1, 3, 2, 1] > (a, b) => a === b returns false\n */\n static satisfy = (array, predicate) => {\n if (array.length < 2) {\n return true;\n }\n const first = array[0];\n for (let i = 1; i < array.length; i++) {\n if (!predicate(first, array[i])) {\n return false;\n }\n }\n return true;\n };\n static remove = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n array.splice(index, 1);\n };\n static removeOpt = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return false;\n }\n array.splice(index, 1);\n return true;\n };\n static hasDuplicates = (array) => new Set(array).size < array.length;\n static removeDuplicates = (array) => {\n let index = 0 | 0;\n const result = new Set();\n for (const element of array) {\n if (!result.has(element)) {\n result.add(element);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static removeDuplicateKeys = (array, key) => {\n let index = 0 | 0;\n const seen = new Set();\n for (const element of array) {\n const value = element[key];\n if (!seen.has(value)) {\n seen.add(value);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static *iterate(array) {\n for (let i = 0; i < array.length; i++) {\n yield array[i];\n }\n }\n static *iterateReverse(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n yield array[i];\n }\n }\n static *iterateStateFull(array) {\n const maxIndex = array.length - 1;\n for (let i = 0; i <= maxIndex; i++) {\n yield { value: array[i], isFirst: i === 0, isLast: i === maxIndex };\n }\n }\n static isSorted(array, sorting = Sorting.Ascending) {\n if (array.length < 2) {\n return true;\n }\n let prev = array[0];\n for (let i = 1; i < array.length; i++) {\n const next = array[i];\n if (Math.sign(prev - next) === sorting) {\n return false;\n }\n prev = next;\n }\n return true;\n }\n}\n", "import { asDefined, getOrProvide, isDefined, panic } from \"./lang\";\nexport var Option;\n(function (Option) {\n Option.wrap = (value) => isDefined(value) ? new Some(value) : Option.None;\n Option.from = (provider) => Option.wrap(provider());\n Option.tryFrom = (provider) => {\n try {\n return Option.wrap(provider());\n }\n catch (_error) {\n return Option.None;\n }\n };\n Option.execute = (func, ...args) => Option.wrap(func?.apply(null, args));\n Option.async = (promise) => promise.then(value => Option.wrap(value), () => Option.None);\n class Some {\n #value;\n constructor(value) { this.#value = asDefined(value); }\n unwrap() { return this.#value; }\n unwrapOrElse(_) { return this.#value; }\n unwrapOrNull() { return this.#value; }\n unwrapOrUndefined() { return this.#value; }\n contains(value) { return value === this.#value; }\n match(matchable) { return matchable.some(this.#value); }\n ifSome(run) { return run(this.#value); }\n isEmpty() { return false; }\n nonEmpty() { return true; }\n map(callback) { return Option.wrap(callback(this.#value)); }\n mapOr(func, _or) { return func(this.#value); }\n flatMap(callback) { return callback(this.#value); }\n equals(other) { return this.unwrapOrNull() === other.unwrapOrNull(); }\n assert(_fail) { return this; }\n toString() { return `{Option.Some(${this.#value})}`; }\n get [Symbol.toStringTag]() { return this.toString(); }\n }\n Option.Some = Some;\n Option.None = new class {\n unwrap = (fail) => panic(isDefined(fail) ? getOrProvide(fail) : \"unwrap failed\");\n unwrapOrElse = (value) => getOrProvide(value);\n unwrapOrNull = () => null;\n unwrapOrUndefined = () => undefined;\n contains = (_) => false;\n match = (matchable) => matchable.none();\n ifSome = (_) => { };\n isEmpty = () => true;\n nonEmpty = () => false;\n map = (_) => Option.None;\n mapOr = (_, or) => getOrProvide(or);\n flatMap = (_) => Option.None;\n equals = (other) => other.isEmpty();\n assert = (fail) => panic(getOrProvide(fail) ?? \"assert failed\");\n toString = () => \"{Option.None}\";\n get [Symbol.toStringTag]() { return this.toString(); }\n };\n})(Option || (Option = {}));\n", "import { Option } from \"./option\";\nexport var Attempts;\n(function (Attempts) {\n Attempts.async = (promise) => promise.then(value => Attempts.ok(value), reason => Attempts.err(reason));\n Attempts.tryGet = (provider) => {\n try {\n return Attempts.ok(provider());\n }\n catch (reason) {\n return Attempts.err(reason);\n }\n };\n Attempts.ok = (result) => new class {\n value;\n constructor(value) {\n this.value = value;\n }\n asOption = () => Option.wrap(this.value);\n failureReason = () => { throw new Error(\"Attempt was successful.\"); };\n isFailure = () => false;\n isSuccess = () => true;\n result = () => this.value;\n map = (map) => {\n try {\n return Attempts.ok(map(this.value));\n }\n catch (reason) {\n return Attempts.err(reason);\n }\n };\n flatMap = (map) => map(this.value);\n match = (matchable) => matchable.ok(this.value);\n toVoid = () => Attempts.ok(undefined);\n failure = () => { throw new Error(\"Attempt was successful.\"); };\n toString = () => `{Success: ${this.value}`;\n get [Symbol.toStringTag]() { return \"Success\"; }\n }(result);\n Attempts.Ok = new class {\n constructor() { }\n asOption = () => Option.None;\n failureReason = () => { throw new Error(\"Attempt was successful.\"); };\n isFailure = () => false;\n isSuccess = () => true;\n result = () => undefined;\n map = (map) => Attempts.ok(map());\n flatMap = (map) => map();\n match = (matchable) => matchable.ok();\n toVoid = () => Attempts.ok(undefined);\n failure = () => { throw new Error(\"Attempt was successful.\"); };\n toString = () => `{Success: Ok`;\n get [Symbol.toStringTag]() { return \"Success\"; }\n }();\n Attempts.err = (reason) => new class {\n reason;\n constructor(reason) {\n this.reason = reason;\n }\n asOption = () => Option.None;\n failureReason = () => this.reason;\n isFailure = () => true;\n isSuccess = () => false;\n result = () => { throw new Error(`No result because '${this.reason}'`); };\n map = () => this;\n flatMap = () => this;\n match = (matchable) => matchable.err(this.reason);\n toVoid = () => Attempts.err(this.reason);\n failure = () => this;\n toString = () => `{Failure: ${this.reason}`;\n get [Symbol.toStringTag]() { return \"Failure\"; }\n }(reason);\n})(Attempts || (Attempts = {}));\n", "// https://en.wikipedia.org/wiki/Binary_search_algorithm\n//\nexport var BinarySearch;\n(function (BinarySearch) {\n BinarySearch.exact = (sorted, key, comparator) => {\n let l = 0 | 0;\n let r = sorted.length - 1;\n while (l <= r) {\n const m = (l + r) >>> 1;\n const cmp = comparator(sorted[m], key);\n if (cmp === 0) {\n return m;\n }\n if (cmp < 0) {\n l = m + 1;\n }\n else {\n r = m - 1;\n }\n }\n return -1;\n };\n BinarySearch.exactMapped = (sorted, key, comparator, map) => {\n let l = 0 | 0;\n let r = sorted.length - 1;\n while (l <= r) {\n const m = (l + r) >>> 1;\n const cmp = comparator(map(sorted[m]), key);\n if (cmp === 0) {\n return m;\n }\n if (cmp < 0) {\n l = m + 1;\n }\n else {\n r = m - 1;\n }\n }\n return -1;\n };\n BinarySearch.leftMost = (sorted, key, comparator) => {\n let l = 0 | 0;\n let r = sorted.length;\n while (l < r) {\n const m = (l + r) >>> 1;\n if (comparator(sorted[m], key) < 0) {\n l = m + 1;\n }\n else {\n r = m;\n }\n }\n return l;\n };\n BinarySearch.rightMost = (sorted, key, comparator) => {\n let l = 0 | 0;\n let r = sorted.length;\n while (l < r) {\n const m = (l + r) >>> 1;\n if (comparator(sorted[m], key) <= 0) {\n l = m + 1;\n }\n else {\n r = m;\n }\n }\n return r - 1;\n };\n BinarySearch.leftMostMapped = (sorted, key, comparator, map) => {\n let l = 0 | 0;\n let r = sorted.length;\n while (l < r) {\n const m = (l + r) >>> 1;\n if (comparator(map(sorted[m]), key) < 0) {\n l = m + 1;\n }\n else {\n r = m;\n }\n }\n return l;\n };\n BinarySearch.rightMostMapped = (sorted, key, comparator, map) => {\n let l = 0 | 0;\n let r = sorted.length;\n while (l < r) {\n const m = (l + r) >>> 1;\n if (comparator(map(sorted[m]), key) <= 0) {\n l = m + 1;\n }\n else {\n r = m;\n }\n }\n return r - 1;\n };\n BinarySearch.rangeMapped = (sorted, key, comparator, map) => [BinarySearch.leftMostMapped(sorted, key, comparator, map), BinarySearch.rightMostMapped(sorted, key, comparator, map)];\n})(BinarySearch || (BinarySearch = {}));\n", "import { isDefined } from \"./lang\";\nexport var Color;\n(function (Color) {\n Color.parseCssRgbOrRgba = (color) => {\n const colorValues = color.match(/\\(([^)]+)\\)/)?.at(1)?.split(\",\")?.map(Number);\n if (isDefined(colorValues) && colorValues.every(value => !isNaN(value))) {\n if (colorValues.length === 3) {\n return [\n colorValues[0] / 255.0,\n colorValues[1] / 255.0,\n colorValues[2] / 255.0,\n 1.0\n ];\n }\n else if (colorValues.length === 4) {\n return [\n colorValues[0] / 255.0,\n colorValues[1] / 255.0,\n colorValues[2] / 255.0,\n colorValues[3]\n ];\n }\n }\n throw new Error(`${color} is not proper formatted. Example: 'rgb(255, 255, 255)' or 'rgba(255, 255, 255, 1)'`);\n };\n})(Color || (Color = {}));\n", "export const StringComparator = (a, b) => a > b ? 1 : b > a ? -1 : 0;\nexport const NumberComparator = (a, b) => a - b;\nexport const NumberArrayComparator = (a, b) => {\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n const comparison = a[i] - b[i];\n if (comparison !== 0.0) {\n return comparison;\n }\n }\n return a.length - b.length;\n};\n", "// noinspection JSUnusedGlobalSymbols\nexport const TAU = Math.PI * 2.0;\nexport const PI_HALF = Math.PI / 2.0;\nexport const PI_QUART = Math.PI / 4.0;\nexport const INVERSE_SQRT_2 = 1.0 / Math.sqrt(2.0);\nexport const clamp = (value, min, max) => Math.max(min, Math.min(value, max));\nexport const clampUnit = (value) => Math.max(0.0, Math.min(value, 1.0));\nexport const squashUnit = (value, margin) => margin + (1.0 - 2.0 * margin) * Math.max(0.0, Math.min(value, 1.0));\nexport const quantizeFloor = (value, interval) => Math.floor(value / interval) * interval;\nexport const quantizeCeil = (value, interval) => Math.ceil(value / interval) * interval;\nexport const quantizeRound = (value, interval) => Math.round(value / interval) * interval;\nexport const linear = (y1, y2, mu) => y1 + (y2 - y1) * mu;\nexport const cosine = (y1, y2, mu) => {\n const mu2 = (1.0 - Math.cos(mu * Math.PI)) * 0.5;\n return y1 * (1.0 - mu2) + y2 * mu2;\n};\nexport const mod = (value, range) => fract(value / range) * range;\nexport const fract = (value) => value - Math.floor(value);\nexport const nextPowOf2 = (n) => Math.pow(2, Math.ceil(Math.log(n) / Math.log(2)));\nexport const radToDeg = (rad) => rad * 180.0 / Math.PI;\nexport const degToRad = (deg) => deg / 180.0 * Math.PI;\n// M\u00F6bius-Ease Curve\n// Only produces valid values between 0 and 1 (unitValues)\n// https://www.desmos.com/calculator/ht8cytaxsz\n// The inverse is h`=1-h\nexport const moebiusEase = (x, h) => (x * h) / ((2.0 * h - 1.0) * (x - 1.0) + h);\n", "import { clamp } from \"./math\";\n/**\n * original: http://werner.yellowcouch.org/Papers/fastenv12/index.html\n */\nexport var Curve;\n(function (Curve) {\n const EPLISON = 1.0e-15;\n Curve.valueAt = ({ slope, steps, y0, y1 }, x) => Curve.normalizedAt(x / steps, slope) * (y1 - y0) + y0;\n // https://www.desmos.com/calculator/9lwjajcfkw\n Curve.normalizedAt = (x, slope) => {\n if (slope > 0.499999 && slope < 0.500001) {\n return x;\n }\n else {\n const p = clamp(slope, EPLISON, 1.0 - EPLISON);\n return (p * p) / (1.0 - p * 2.0) * (Math.pow((1.0 - p) / p, 2.0 * x) - 1.0);\n }\n };\n Curve.inverseAt = (y, slope) => {\n const p = clamp(slope, EPLISON, 1.0 - EPLISON);\n return Math.log((y * (1.0 - 2.0 * p) / (p * p)) + 1.0) / (2.0 * Math.log((1.0 - p) / p));\n };\n Curve.coefficients = (definition) => {\n const f1 = Curve.valueAt(definition, 1.0);\n const f2 = Curve.valueAt(definition, 2.0);\n const m = (f2 - f1) / (f1 - definition.y0);\n const q = f1 - m * definition.y0;\n return { m, q };\n };\n function* walk(slope, steps, y0, y1) {\n const { m, q } = Curve.coefficients({ slope, steps, y0, y1 });\n for (let i = 0, v = y0; i < steps; i++) {\n yield v = m * v + q;\n }\n }\n Curve.walk = walk;\n function* walkNormalized(slope, steps) {\n const d = 1.0 / steps;\n const f1 = Curve.normalizedAt(d, slope);\n const f2 = Curve.normalizedAt(2.0 * d, slope);\n const m = (f2 - f1) / f1;\n for (let i = 0, v = 0.0; i < steps; i++) {\n yield v = m * v + f1;\n }\n }\n Curve.walkNormalized = walkNormalized;\n Curve.byHalf = (steps, y0, ym, y1) => ({\n slope: Curve.slopeByHalf(y0, ym, y1), steps, y0, y1\n });\n Curve.slopeByHalf = (y0, ym, y1) => Math.abs(y1 - y0) < 0.000001 ? 0.5 : (ym - y0) / (y1 - y0);\n})(Curve || (Curve = {}));\n", "const dataView = new DataView(new ArrayBuffer(8));\nexport var Integer;\n(function (Integer) {\n Integer.MIN_VALUE = -0x80000000;\n Integer.MAX_VALUE = 0x7fffffff;\n Integer.toByte = (value) => {\n dataView.setInt8(0, value);\n return dataView.getInt8(0);\n };\n Integer.toShort = (value) => {\n dataView.setInt16(0, value);\n return dataView.getInt16(0);\n };\n Integer.toInt = (value) => {\n dataView.setInt32(0, value);\n return dataView.getInt32(0);\n };\n})(Integer || (Integer = {}));\nexport var Float;\n(function (Float) {\n const EXP_BIT_MASK = 2139095040;\n const SIGNIFICANT_BIT_MASK = 8388607;\n const ARRAY_BUFFER = new ArrayBuffer(Float32Array.BYTES_PER_ELEMENT);\n const FLOAT_VIEW = new Float32Array(ARRAY_BUFFER);\n const INT_VIEW = new Int32Array(ARRAY_BUFFER);\n /**\n * Returns a representation of the specified floating-point value\n * according to the IEEE 754 floating-point \"single format\" bit layout.\n * @param value a floating-point number.\n * @returns the bits that represent the floating-point number.\n */\n Float.floatToIntBits = (value) => {\n const result = Float.floatToRawIntBits(value);\n if ((result & EXP_BIT_MASK) === EXP_BIT_MASK && (result & SIGNIFICANT_BIT_MASK) !== 0) {\n return 0x7fc00000;\n }\n return result;\n };\n Float.intBitsToFloat = (value) => {\n INT_VIEW[0] = value;\n return FLOAT_VIEW[0];\n };\n Float.floatToRawIntBits = (value) => {\n FLOAT_VIEW[0] = value;\n return INT_VIEW[0];\n };\n Float.toFloat32 = (value) => {\n dataView.setFloat32(0, value);\n return dataView.getFloat32(0);\n };\n})(Float || (Float = {}));\nexport var Float16;\n(function (Float16) {\n Float16.floatToIntBits = (value) => {\n const bits = Float.floatToIntBits(value);\n const sign = bits >>> 16 & 0x8000;\n let val = (bits & 0x7fffffff) + 0x1000;\n if (val >= 0x47800000) {\n if ((bits & 0x7fffffff) >= 0x47800000) {\n if (val < 0x7f800000) {\n return sign | 0x7c00;\n }\n return sign | 0x7c00 | (bits & 0x007fffff) >>> 13;\n }\n return sign | 0x7bff;\n }\n if (val >= 0x38800000) {\n return sign | val - 0x38000000 >>> 13;\n }\n if (val < 0x33000000) {\n return sign;\n }\n val = (bits & 0x7fffffff) >>> 23;\n return sign | ((bits & 0x7fffff | 0x800000) + (0x800000 >>> val - 102) >>> 126 - val);\n };\n Float16.intBitsToFloat = (bits) => {\n let mantissa = bits & 0x03ff;\n let exp = bits & 0x7c00;\n if (exp === 0x7c00) {\n exp = 0x3fc00;\n }\n else if (exp !== 0) {\n exp += 0x1c000;\n if (mantissa === 0 && exp > 0x1c400) {\n return Float.intBitsToFloat((bits & 0x8000) << 16 | exp << 13 | 0x3ff);\n }\n }\n else if (mantissa !== 0) {\n exp = 0x1c400;\n do {\n mantissa <<= 1;\n exp -= 0x400;\n } while ((mantissa & 0x400) === 0);\n mantissa &= 0x3ff;\n }\n return Float.intBitsToFloat((bits & 0x8000) << 16 | (exp | mantissa) << 13);\n };\n})(Float16 || (Float16 = {}));\nexport var Float64;\n(function (Float64) {\n const EXP_BIT_MASK = 9218868437227405312n;\n const SIGNIFICANT_BIT_MASK = 4503599627370495n;\n const ARRAY_BUFFER = new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT);\n const FLOAT64_VIEW = new Float64Array(ARRAY_BUFFER);\n const LONG_VIEW = new BigInt64Array(ARRAY_BUFFER);\n Float64.float64ToLongBits = (value) => {\n const result = Float64.float64ToRawLongBits(value);\n if ((result & EXP_BIT_MASK) === EXP_BIT_MASK && (result & SIGNIFICANT_BIT_MASK) !== 0n) {\n return 0x7ff8000000000000n;\n }\n return result;\n };\n Float64.longBitsToFloat64 = (value) => {\n LONG_VIEW[0] = value;\n return FLOAT64_VIEW[0];\n };\n Float64.float64ToRawLongBits = (value) => {\n FLOAT64_VIEW[0] = value;\n return LONG_VIEW[0];\n };\n Float64.clamp = (value) => {\n dataView.setFloat64(0, value);\n return dataView.getFloat64(0);\n };\n})(Float64 || (Float64 = {}));\n", "import { isDefined } from \"./lang\";\nexport class Iterables {\n static *empty() { }\n static one(value) { return [value]; }\n static count(iterable) {\n let count = 0 | 0;\n for (const _ of iterable) {\n count++;\n }\n return count;\n }\n static some(iterable, predicate) {\n for (const value of iterable) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n }\n static every(iterable, predicate) {\n for (const value of iterable) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n }\n static reduce(iterable, callback, initialValue) {\n let accumulator = initialValue;\n let index = 0;\n for (const value of iterable) {\n accumulator = callback(accumulator, value, index++);\n }\n return accumulator;\n }\n static includes(iterable, include) {\n for (const value of iterable) {\n if (value === include) {\n return true;\n }\n }\n return false;\n }\n static forEach(iterable, procedure) {\n for (const value of iterable) {\n procedure(value);\n }\n }\n static *map(iterable, map) {\n let count = 0 | 0;\n for (const value of iterable) {\n yield map(value, count++);\n }\n }\n static *take(iterator, count) {\n let i = 0;\n for (const value of iterator) {\n if (i++ >= count) {\n return;\n }\n yield value;\n }\n }\n static filter(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n if (fn(value)) {\n result.push(value);\n }\n }\n return result;\n }\n static filterMap(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n const mapped = fn(value);\n if (isDefined(mapped)) {\n result.push(mapped);\n }\n }\n return result;\n }\n static reverse(iterable) {\n const result = [];\n for (const value of iterable) {\n result.push(value);\n }\n return result.reverse();\n }\n static *pairWise(iterable) {\n const iterator = iterable[Symbol.iterator]();\n const { done, value } = iterator.next();\n let prev = value;\n if (done === true) {\n return;\n }\n while (true) {\n const { done, value } = iterator.next();\n if (done === true) {\n yield [prev, null];\n return;\n }\n yield [prev, value];\n prev = value;\n }\n }\n}\n", "import { panic } from \"./lang\";\nimport { nextPowOf2 } from \"./math\";\nimport { Float, Float64 } from \"./numeric\";\nimport { Iterables } from \"./iterables\";\nexport class ByteArrayOutput {\n static create(initialCapacity = 1024) {\n return this.use(new ArrayBuffer(initialCapacity));\n }\n static use(buffer, byteOffset = 0 | 0) {\n return new ByteArrayOutput(new DataView(buffer, byteOffset));\n }\n littleEndian = false;\n #view;\n #position = 0;\n constructor(view) { this.#view = view; }\n get remaining() { return this.#view.byteLength - this.#position; }\n get position() { return this.#position; }\n set position(value) {\n if (value < 0) {\n panic(`position(${value}) cannot be negative.`);\n }\n else if (value > this.#view.byteLength) {\n panic(`position(${value}) is outside range (${this.#view.byteLength}).`);\n }\n else {\n this.#position = value;\n }\n }\n writeBoolean(value) { this.writeByte(value ? 1 : 0); }\n writeByte(value) {\n this.#ensureSpace(1);\n this.#view.setInt8(this.#position++, value);\n }\n writeShort(value) {\n this.#ensureSpace(Int16Array.BYTES_PER_ELEMENT);\n this.#view.setInt16(this.#position, value, this.littleEndian);\n this.#position += Int16Array.BYTES_PER_ELEMENT;\n }\n writeInt(value) {\n this.#ensureSpace(Int32Array.BYTES_PER_ELEMENT);\n this.#view.setInt32(this.#position, value, this.littleEndian);\n this.#position += Int32Array.BYTES_PER_ELEMENT;\n }\n writeLong(value) {\n this.#ensureSpace(BigInt64Array.BYTES_PER_ELEMENT);\n this.#view.setBigInt64(this.#position, value, this.littleEndian);\n this.#position += BigInt64Array.BYTES_PER_ELEMENT;\n }\n writeFloat(value) {\n this.#ensureSpace(Float32Array.BYTES_PER_ELEMENT);\n this.#view.setFloat32(this.#position, value, this.littleEndian);\n this.#position += Float32Array.BYTES_PER_ELEMENT;\n }\n writeDouble(value) {\n this.#ensureSpace(Float64Array.BYTES_PER_ELEMENT);\n this.#view.setFloat64(this.#position, value, this.littleEndian);\n this.#position += Float64Array.BYTES_PER_ELEMENT;\n }\n writeBytes(bytes) {\n this.#ensureSpace(bytes.length);\n for (let i = 0; i < bytes.length; ++i) {\n this.#view.setInt8(this.#position++, bytes[i]);\n }\n }\n writeString(value) {\n const length = value.length;\n this.#ensureSpace(Int32Array.BYTES_PER_ELEMENT + length * Int16Array.BYTES_PER_ELEMENT);\n this.writeInt(length);\n for (let i = 0; i < length; i++) {\n this.writeShort(value.charCodeAt(i));\n }\n }\n toArrayBuffer() { return this.#view.buffer.slice(0, this.#position); }\n #ensureSpace(count) {\n const capacity = this.#view.byteLength;\n if (this.#position + count > capacity) {\n const o = this.#view;\n this.#view = new DataView(new ArrayBuffer(nextPowOf2(capacity + count)));\n for (let i = 0; i < this.#position; i++) {\n this.#view.setInt8(i, o.getInt8(i));\n }\n }\n }\n}\nexport class ByteCounter {\n #count = 0 | 0;\n writeByte(_) { this.#count++; }\n writeShort(_) { this.#count += 2; }\n writeInt(_) { this.#count += 4; }\n writeLong(_) { this.#count += 8; }\n writeFloat(_) { this.#count += 4; }\n writeDouble(_) { this.#count += 8; }\n writeBoolean(_) { this.#count++; }\n writeBytes(bytes) { this.#count += bytes.length; }\n writeString(value) { this.#count += value.length + 4; }\n get count() { return this.#count; }\n}\nexport class Checksum {\n #result;\n #cursor = 0;\n constructor(length = 32) {\n this.#result = new Int8Array(length);\n }\n result() { return this.#result; }\n equals(other) {\n if (other === this) {\n return true;\n }\n return this.#result.every((value, index) => other.#result[index] === value);\n }\n writeBoolean(value) {\n this.writeByte(value ? 31 : 11);\n }\n writeShort(value) {\n this.writeByte(value & 0xff);\n this.writeByte((value >>> 8) & 0xff);\n }\n writeByte(value) {\n if (this.#cursor >= this.#result.length) {\n this.#cursor = 0;\n }\n this.#result[this.#cursor++] ^= value;\n }\n writeInt(value) {\n this.writeByte(value & 0xff);\n this.writeByte((value >>> 8) & 0xff);\n this.writeByte((value >>> 16) & 0xff);\n this.writeByte((value >>> 24) & 0xff);\n }\n writeBytes(bytes) {\n bytes.forEach(value => this.writeByte(value));\n }\n writeFloat(value) {\n this.writeInt(Float.floatToIntBits(value));\n }\n writeDouble(value) {\n this.writeLong(Float64.float64ToLongBits(value));\n }\n writeLong(value) {\n this.writeByte(Number(value) & 0xff);\n this.writeByte(Number(value >> 8n) & 0xff);\n this.writeByte(Number(value >> 16n) & 0xff);\n this.writeByte(Number(value >> 24n) & 0xff);\n this.writeByte(Number(value >> 32n) & 0xff);\n this.writeByte(Number(value >> 40n) & 0xff);\n this.writeByte(Number(value >> 48n) & 0xff);\n this.writeByte(Number(value >> 56n) & 0xff);\n }\n writeString(value) {\n for (let i = 0; i < value.length; i++) {\n this.writeShort(value.charCodeAt(i));\n }\n }\n toHexString() {\n return Array.from(Iterables.map(this.#result.values(), value => (value & 0xff).toString(16).padStart(2, \"0\"))).join(\"\");\n }\n}\nexport class ByteArrayInput {\n littleEndian = false;\n #view;\n #position = 0;\n constructor(buffer, byteOffset = 0) { this.#view = new DataView(buffer, byteOffset); }\n get position() { return this.#position; }\n set position(value) {\n if (value < 0) {\n panic(`position(${value}) cannot be negative.`);\n }\n else if (value > this.#view.byteLength) {\n panic(`position(${value}) is outside range (${this.#view.byteLength}).`);\n }\n else {\n this.#position = value;\n }\n }\n readByte() { return this.#view.getInt8(this.#position++); }\n readShort() {\n const read = this.#view.getInt16(this.#position, this.littleEndian);\n this.#position += Int16Array.BYTES_PER_ELEMENT;\n return read;\n }\n readInt() {\n const read = this.#view.getInt32(this.#position, this.littleEndian);\n this.#position += Int32Array.BYTES_PER_ELEMENT;\n return read;\n }\n readLong() {\n const read = this.#view.getBigInt64(this.#position, this.littleEndian);\n this.#position += BigInt64Array.BYTES_PER_ELEMENT;\n return read;\n }\n readFloat() {\n const read = this.#view.getFloat32(this.#position, this.littleEndian);\n this.#position += Float32Array.BYTES_PER_ELEMENT;\n return read;\n }\n readDouble() {\n const read = this.#view.getFloat64(this.#position, this.littleEndian);\n this.#position += Float64Array.BYTES_PER_ELEMENT;\n return read;\n }\n readBoolean() { return this.readByte() === 1; }\n readBytes(array) {\n for (let i = 0; i < array.length; i++) {\n array[i] = this.readByte();\n }\n }\n readString() {\n const length = this.readInt();\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += String.fromCharCode(this.readShort());\n }\n return result;\n }\n available(count) { return this.#position + count <= this.#view.byteLength; }\n remaining() { return this.#view.byteLength - this.#position; }\n skip(count) { this.position += count; }\n}\n", "import { asDefined, isDefined, panic } from \"./lang\";\nconst findMethodType = (descriptor) => {\n if (!isDefined(descriptor)) {\n return panic(\"Cannot resolve method key of undefined descriptor\");\n }\n if (descriptor.value !== undefined) {\n return \"value\";\n }\n if (descriptor.get !== undefined) {\n return \"get\";\n }\n return panic(`Cannot resolve method key of ${descriptor}`);\n};\nexport const Lazy = (_, property, descriptor) => {\n // For stage 3 decorators, we need to handle the case where the descriptor might be undefined\n // and return a proper descriptor or function\n if (!isDefined(descriptor)) {\n // This is likely a stage 3 decorator call - return a function that returns the descriptor\n return function (_, context) {\n if (context && context.kind === \"getter\") {\n return function () {\n const originalDescriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this), property);\n if (!isDefined(originalDescriptor?.get)) {\n return panic(`Cannot find getter for property '${property}'`);\n }\n const value = originalDescriptor.get.apply(this);\n Object.defineProperty(this, property, {\n value: value,\n configurable: false,\n writable: false,\n enumerable: false\n });\n return value;\n };\n }\n // Fallback for other cases\n return undefined;\n };\n }\n const methodType = findMethodType(descriptor);\n const element = asDefined(descriptor[methodType]);\n return {\n [methodType]: function (...args) {\n if (args.length > 0) {\n return panic(\"lazy accessory must not have any construction parameters\");\n }\n const value = element.apply(this);\n Object.defineProperty(this, property, {\n value: methodType === \"get\" ? value : () => value,\n configurable: false,\n writable: false,\n enumerable: false\n });\n return value;\n }\n };\n};\n", "export var Generators;\n(function (Generators) {\n function* empty() { return; }\n Generators.empty = empty;\n Generators.next = (generator) => {\n const { value, done } = generator.next();\n return done ? null : value;\n };\n function* flatten(...generators) {\n for (const generator of generators) {\n for (const value of generator) {\n yield value;\n }\n }\n }\n Generators.flatten = flatten;\n})(Generators || (Generators = {}));\n", "import { Unhandled } from \"./lang\";\nimport { clamp } from \"./math\";\nexport var Axis;\n(function (Axis) {\n Axis[Axis[\"T\"] = 0] = \"T\";\n Axis[Axis[\"R\"] = 1] = \"R\";\n Axis[Axis[\"B\"] = 2] = \"B\";\n Axis[Axis[\"L\"] = 3] = \"L\";\n})(Axis || (Axis = {}));\nexport var Corner;\n(function (Corner) {\n Corner[Corner[\"TL\"] = 0] = \"TL\";\n Corner[Corner[\"TR\"] = 1] = \"TR\";\n Corner[Corner[\"BR\"] = 2] = \"BR\";\n Corner[Corner[\"BL\"] = 3] = \"BL\";\n})(Corner || (Corner = {}));\nexport var Geom;\n(function (Geom) {\n Geom.outerTangentPoints = (a, b) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const angle = Math.atan2(dy, dx) + Math.acos((a.r - b.r) / Math.sqrt(dx * dx + dy * dy));\n const cs = Math.cos(angle);\n const sn = Math.sin(angle);\n return [\n { x: a.x + a.r * cs, y: a.y + a.r * sn },\n { x: b.x + b.r * cs, y: b.y + b.r * sn }\n ];\n };\n})(Geom || (Geom = {}));\nexport var Point;\n(function (Point) {\n Point.zero = () => ({ x: 0, y: 0 });\n Point.create = (x, y) => ({ x, y });\n Point.clone = (point) => ({ ...point });\n Point.floor = (point) => ({ x: Math.floor(point.x), y: Math.floor(point.y) });\n Point.length = (point) => Math.sqrt(point.x * point.x + point.y * point.y);\n Point.distance = (a, b) => Math.sqrt((b.x - a.x) ** 2 + (b.y - a.y) ** 2);\n Point.add = (a, b) => ({ x: a.x + b.x, y: a.y + b.y });\n Point.subtract = (a, b) => ({ x: a.x - b.x, y: a.y - b.y });\n Point.scaleBy = (point, scale) => ({ x: point.x * scale, y: point.y * scale });\n Point.scaleTo = (point, scale) => {\n const multiplier = scale / Point.length(point);\n return { x: point.x * multiplier, y: point.y * multiplier };\n };\n Point.fromClient = (object) => ({\n x: object.clientX,\n y: object.clientY\n });\n})(Point || (Point = {}));\nexport var Rect;\n(function (Rect) {\n Rect.Empty = Object.freeze({ x: 0, y: 0, width: 0, height: 0 });\n Rect.corners = (rectangle) => {\n const x0 = rectangle.x;\n const y0 = rectangle.y;\n const x1 = x0 + rectangle.width;\n const y1 = y0 + rectangle.height;\n return [{ x: x0, y: y0 }, { x: x1, y: y0 }, { x: x1, y: y1 }, { x: x0, y: y1 }];\n };\n Rect.inflate = (rect, amount) => {\n return {\n x: rect.x - amount,\n y: rect.y - amount,\n width: rect.width + amount * 2.0,\n height: rect.height + amount * 2.0\n };\n };\n Rect.contains = (outer, inner) => {\n const topLeftInside = inner.x >= outer.x && inner.y >= outer.y;\n const bottomRightInside = (inner.x + inner.width) <= (outer.x + outer.width)\n && (inner.y + inner.height) <= (outer.y + outer.height);\n return topLeftInside && bottomRightInside;\n };\n Rect.isPointInside = (point, rect) => point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height;\n Rect.intersect = (a, b) => {\n const xMin = Math.max(a.x, b.x);\n const xMax = Math.min(a.x + a.width, b.x + b.width);\n const yMax = Math.min(a.y + a.height, b.y + b.height);\n const yMin = Math.max(a.y, b.y);\n return xMax > xMin && yMax > yMin;\n };\n Rect.axis = (rectangle, axis) => {\n switch (axis) {\n case Axis.T:\n return rectangle.y;\n case Axis.R:\n return rectangle.x + rectangle.width;\n case Axis.B:\n return rectangle.y + rectangle.height;\n case Axis.L:\n return rectangle.x;\n default:\n return Unhandled(axis);\n }\n };\n Rect.corner = (rectangle, corner) => {\n switch (corner) {\n case Corner.TL:\n return { x: rectangle.x, y: rectangle.y };\n case Corner.TR:\n return { x: rectangle.x + rectangle.width, y: rectangle.y };\n case Corner.BR:\n return { x: rectangle.x + rectangle.width, y: rectangle.y + rectangle.height };\n case Corner.BL:\n return { x: rectangle.x, y: rectangle.y + rectangle.height };\n default:\n return Unhandled(corner);\n }\n };\n Rect.center = (rectangle) => ({\n x: rectangle.x + rectangle.width * 0.5,\n y: rectangle.y + rectangle.height * 0.5\n });\n Rect.isEmpty = (rectangle) => rectangle.width === 0 || rectangle.height === 0;\n Rect.union = (a, b) => {\n if (Rect.isEmpty(a)) {\n if (!Rect.isEmpty(b)) {\n a.x = b.x;\n a.y = b.y;\n a.width = b.width;\n a.height = b.height;\n }\n }\n else if (!Rect.isEmpty(b)) {\n const bx = b.x;\n const by = b.y;\n const ux = Math.min(a.x, bx);\n const uy = Math.min(a.y, by);\n a.width = Math.max(a.x + a.width, bx + b.width) - ux;\n a.height = Math.max(a.y + a.height, by + b.height) - uy;\n a.x = ux;\n a.y = uy;\n }\n };\n})(Rect || (Rect = {}));\nexport var AABB;\n(function (AABB) {\n AABB.width = (aabb) => aabb.xMax - aabb.xMin;\n AABB.height = (aabb) => aabb.yMax - aabb.yMin;\n AABB.from = (aabb, that) => {\n aabb.xMin = that.xMin;\n aabb.xMax = that.xMax;\n aabb.yMin = that.yMin;\n aabb.yMax = that.yMax;\n };\n AABB.extend = (aabb, offset) => {\n aabb.xMin -= offset;\n aabb.yMin -= offset;\n aabb.xMax += offset;\n aabb.yMax += offset;\n };\n AABB.padding = (aabb, [top, right, bottom, left]) => {\n aabb.xMin += left;\n aabb.yMin += top;\n aabb.xMax -= right;\n aabb.yMax -= bottom;\n return aabb;\n };\n AABB.intersectPoint = (aabb, point) => aabb.xMin <= point.x && point.x < aabb.xMax && aabb.yMin <= point.y && point.y < aabb.yMax;\n AABB.intersectThat = (aabb, that) => that.xMin < aabb.xMax && that.xMax > aabb.xMin && that.yMin < aabb.yMax && that.yMax > aabb.yMin;\n AABB.center = (aabb) => ({ x: (aabb.xMin + aabb.xMax) * 0.5, y: (aabb.yMin + aabb.yMax) * 0.5 });\n})(AABB || (AABB = {}));\nexport var Padding;\n(function (Padding) {\n Padding.Identity = Object.freeze([0.0, 0.0, 0.0, 0.0]);\n})(Padding || (Padding = {}));\nexport var CohenSutherland;\n(function (CohenSutherland) {\n CohenSutherland.intersects = (xMin, xMax, yMin, yMax, x0, y0, x1, y1) => {\n const c0 = code(xMin, xMax, yMin, yMax, x0, y0);\n const c1 = code(xMin, xMax, yMin, yMax, x1, y1);\n if ((c0 | c1) === 0) {\n return false;\n }\n if ((c0 & c1) !== 0) {\n return false;\n }\n const s = sign(x0, y0, x1, y1, xMin, yMin);\n return (s !== sign(x0, y0, x1, y1, xMax, yMin) ||\n s !== sign(x0, y0, x1, y1, xMax, yMax) ||\n s !== sign(x0, y0, x1, y1, xMin, yMax));\n };\n const code = (xMin, xMax, yMin, yMax, x, y) => {\n let code = 0;\n if (x <= xMin) {\n code |= 1;\n }\n else if (x >= xMax) {\n code |= 2;\n }\n if (y <= yMin) {\n code |= 8;\n }\n else if (y >= yMax) {\n code |= 4;\n }\n return code;\n };\n const sign = (x0, y0, x1, y1, x2, y2) => (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0) >= 0;\n})(CohenSutherland || (CohenSutherland = {}));\nexport var ValueAxis;\n(function (ValueAxis) {\n ValueAxis.Identity = {\n valueToAxis: (value) => value,\n axisToValue: (axis) => axis\n };\n ValueAxis.toClamped = (valueAxis, min, max) => ({\n valueToAxis: (value) => valueAxis.valueToAxis(clamp(value, min, max)),\n axisToValue: (axis) => clamp(valueAxis.axisToValue(axis), min, max)\n });\n ValueAxis.createClamped = (min, max) => ({\n valueToAxis: (value) => clamp(value, min, max),\n axisToValue: (axis) => clamp(axis, min, max)\n });\n})(ValueAxis || (ValueAxis = {}));\n", "import { assert } from \"./lang\";\n//\n// SHA-256\n//\nexport var Hash;\n(function (Hash) {\n Hash.fromBuffers = async (...buffers) => {\n const totalLength = buffers.reduce((sum, buf) => sum + buf.byteLength, 0);\n const mergedArray = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n mergedArray.set(new Uint8Array(buffer), offset);\n offset += buffer.byteLength;\n }\n return await crypto.subtle.digest(\"SHA-256\", mergedArray);\n };\n Hash.equals = (a, b) => {\n assert(a.byteLength === 32, \"First hash has invalid length\");\n assert(b.byteLength === 32, \"Second hash has invalid length\");\n const viewA = new Uint8Array(a);\n const viewB = new Uint8Array(b);\n for (let i = 0; i < 32; i++) {\n if (viewA[i] !== viewB[i]) {\n return false;\n }\n }\n return true;\n };\n Hash.toString = (buffer) => Array.from(new Uint8Array(buffer)).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n})(Hash || (Hash = {}));\n", "export var Intervals;\n(function (Intervals) {\n Intervals.intersect1D = (min0, max0, min1, max1) => Math.max(min0, min1) <= Math.min(max0, max1);\n})(Intervals || (Intervals = {}));\n", "import { safeExecute } from \"./lang\";\nexport class Listeners {\n #set = new Set();\n #proxy;\n constructor() {\n this.#proxy = new Proxy({}, {\n get: (_, func) => (...args) => this.#set.forEach((listener) => {\n if (Object.getPrototypeOf(listener) === Object.getPrototypeOf({})) {\n return safeExecute(listener[func], ...args);\n }\n return listener[func]?.apply(listener, args);\n })\n });\n }\n get proxy() { return this.#proxy; }\n get size() { return this.#set.size; }\n subscribe(listener) {\n this.#set.add(listener);\n return { terminate: () => this.#set.delete(listener) };\n }\n forEach(procedure) { this.#set.forEach(procedure); }\n terminate() { this.#set.clear(); }\n}\n", "export class Sets {\n static #EMPTY = Object.freeze(new Set());\n static empty = () => Sets.#EMPTY;\n}\n", "import { panic } from \"./lang\";\nexport var Objects;\n(function (Objects) {\n Objects.mergeNoOverlap = (u, v) => {\n const keys = new Set(Object.keys(u));\n for (const key of Object.keys(v)) {\n if (keys.has(key)) {\n return panic(`'${key}' is an overlapping key`);\n }\n }\n return ({ ...u, ...v });\n };\n Objects.include = (obj, ...keys) => keys.reduce((result, key) => {\n result[key] = obj[key];\n return result;\n }, {});\n Objects.exclude = (obj, ...keys) => {\n const exclude = new Set(keys);\n return Object.entries(obj).reduce((result, [key, value]) => {\n if (!exclude.has(key)) {\n result[key] = value;\n }\n return result;\n }, {});\n };\n Objects.overwrite = (target, patch) => Object.assign(target, patch);\n})(Objects || (Objects = {}));\n", "import { Arrays } from \"./arrays\";\nimport { EmptyExec } from \"./lang\";\nexport const Terminable = Object.freeze({\n Empty: { terminate: EmptyExec },\n create: (exec) => ({ terminate: exec }),\n many: (...terminables) => ({ terminate: () => { while (terminables.length > 0) {\n terminables.pop().terminate();\n } } })\n});\nexport class Terminator {\n #terminables = [];\n own(terminable) {\n this.#terminables.push(terminable);\n return terminable;\n }\n ownAll(...terminables) {\n for (const terminable of terminables) {\n this.#terminables.push(terminable);\n }\n }\n spawn() {\n const terminator = new Terminator();\n terminator.own({ terminate: () => Arrays.removeOpt(this.#terminables, terminator) });\n return this.own(terminator);\n }\n terminate() { while (this.#terminables.length > 0) {\n this.#terminables.pop().terminate();\n } }\n}\nexport class VitalSigns {\n #terminated = false;\n get isTerminated() { return this.#terminated; }\n terminate() { this.#terminated = true; }\n}\nexport class CascadingSubscriptions {\n #current;\n constructor() { this.#current = new Terminator(); }\n next() {\n const current = this.#current;\n const nested = current.own(new Terminator());\n this.#current = nested;\n return {\n own: (subscription) => {\n current.own(subscription);\n return current;\n },\n toObserver: (fn) => (value) => {\n nested.terminate();\n nested.own(fn(value));\n }\n };\n }\n append(subscribe, observer) {\n const current = this.#current;\n const nested = current.own(new Terminator());\n current.own(subscribe((value) => {\n nested.terminate();\n nested.own(observer(value));\n }));\n this.#current = nested;\n return current;\n }\n}\n", "import { Terminable } from \"./terminable\";\nimport { Option } from \"./option\";\nexport class Notifier {\n static subscribeMany(observer, ...observables) {\n return Terminable.many(...observables\n .map(observable => observable.subscribe(() => observer(observable))));\n }\n #observers = new Set(); // A set allows us to remove while iterating\n subscribe(observer) {\n this.#observers.add(observer);\n return { terminate: () => this.#observers.delete(observer) };\n }\n isEmpty() { return this.#observers.size === 0; }\n notify(value) { this.#observers.forEach((observer) => observer(value)); }\n observers() { return this.#observers; }\n terminate() { this.#observers.clear(); }\n}\nexport var ObservableValue;\n(function (ObservableValue) {\n ObservableValue.make = (value) => new class {\n getValue() { return value; }\n subscribe(_observer) { return Terminable.Empty; }\n catchupAndSubscribe(observer) {\n observer(this);\n return Terminable.Empty;\n }\n };\n})(ObservableValue || (ObservableValue = {}));\nexport var MutableObservableValue;\n(function (MutableObservableValue) {\n MutableObservableValue.False = new class {\n getValue() { return false; }\n setValue(_) { }\n subscribe(_) { return Terminable.Empty; }\n catchupAndSubscribe(observer) {\n observer(this);\n return Terminable.Empty;\n }\n };\n MutableObservableValue.inverseBoolean = (observableValue) => new class {\n getValue() { return !observableValue.getValue(); }\n setValue(value) { observableValue.setValue(!value); }\n subscribe(observer) { return observableValue.subscribe(observer); }\n catchupAndSubscribe(observer) {\n observer(this);\n return this.subscribe(observer);\n }\n };\n})(MutableObservableValue || (MutableObservableValue = {}));\nexport class DefaultObservableValue {\n #notifier;\n #guard = Option.None;\n #value;\n constructor(value, guard) {\n this.#notifier = new Notifier();\n this.#value = guard?.guard(value) ?? value;\n this.#guard = Option.wrap(guard);\n }\n setValue(value) {\n if (this.#guard.nonEmpty()) {\n value = this.#guard.unwrap().guard(value);\n }\n if (this.#value === value) {\n return;\n }\n this.#value = value;\n this.#notifier.notify(this);\n }\n getValue() { return this.#value; }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n catchupAndSubscribe(observer) {\n observer(this);\n return this.#notifier.subscribe(observer);\n }\n terminate() { this.#notifier.terminate(); }\n toString() { return `{DefaultObservableValue value: ${this.#value}`; }\n}\n", "import { asDefined, panic } from \"./lang\";\nimport { clamp } from \"./math\";\nimport { Integer } from \"./numeric\";\nclass Linear {\n #min;\n #max;\n #range;\n constructor(min, max) {\n this.#min = min;\n this.#max = max;\n this.#range = max - min;\n }\n x(y) { return (this.clamp(y) - this.#min) / this.#range; }\n y(x) { return this.#min + clamp(x, 0.0, 1.0) * this.#range; }\n clamp(y) { return clamp(y, this.#min, this.#max); }\n floating() { return true; }\n}\nclass LinearInteger {\n #min;\n #max;\n #range;\n constructor(min, max) {\n this.#min = clamp(Math.round(min), Integer.MIN_VALUE, Integer.MAX_VALUE);\n this.#max = clamp(Math.round(max), Integer.MIN_VALUE, Integer.MAX_VALUE);\n this.#range = this.#max - this.#min;\n }\n x(y) { return (this.clamp(y) - this.#min) / this.#range; }\n y(x) { return this.#min + Math.round(clamp(x, 0.0, 1.0) * this.#range); }\n clamp(y) { return clamp(Math.round(y), this.#min, this.#max); }\n floating() { return false; }\n}\nclass Exponential {\n #min;\n #max;\n #range;\n constructor(min, max) {\n this.#min = min;\n this.#max = max;\n this.#range = Math.log(max / min);\n }\n x(y) { return Math.log(clamp(y, this.#min, this.#max) / this.#min) / this.#range; }\n y(x) { return this.#min * Math.exp(clamp(x, 0.0, 1.0) * this.#range); }\n clamp(y) { return Math.min(this.#max, Math.max(this.#min, y)); }\n floating() { return true; }\n}\nclass Values {\n #values;\n constructor(values) {\n this.#values = values;\n }\n x(y) {\n const index = this.#values.findIndex(value => value === y);\n return index === -1\n ? panic(`Could not find index for ${y}`)\n : index / (this.#values.length - 1);\n }\n y(x) {\n const index = Math.round(clamp(x, 0.0, 1.0) * (this.#values.length - 1));\n return index > -1\n ? asDefined(this.#values.at(index), `Could not find value for ${x}`)\n : panic(`Index ${index} is out of box.`);\n }\n clamp(y) { return y; }\n floating() { return false; }\n}\nclass Decibel {\n #min;\n #max;\n #a;\n #b;\n #c;\n /**\n * @param min The lowest decibel value\n * @param mid The decibel value in the center\n * @param max The highest decibel value\n */\n constructor(min, mid, max) {\n this.#min = min;\n this.#max = max;\n const min2 = min * min;\n const max2 = max * max;\n const mid2 = mid * mid;\n const tmp0 = min + max - 2.0 * mid;\n const tmp1 = max - mid;\n this.#a = ((2.0 * max - mid) * min - mid * max) / tmp0;\n this.#b = (tmp1 * min2 + (mid2 - max2) * min + mid * max2 - mid2 * max)\n / (min2 + (2.0 * max - 4.0 * mid) * min + max2 - 4.0 * mid * max + 4.0 * mid2);\n this.#c = -tmp1 / tmp0;\n }\n y(x) {\n if (x <= 0.0) {\n return Number.NEGATIVE_INFINITY;\n }\n if (x >= 1.0) {\n return this.#max;\n }\n return this.#a - this.#b / (x + this.#c);\n }\n x(y) {\n if (this.#min >= y) {\n return 0.0;\n }\n if (this.#max <= y) {\n return 1.0;\n }\n return -this.#b / (y - this.#a) - this.#c;\n }\n clamp(y) { return Math.min(this.#max, y); }\n floating() { return true; }\n}\nexport var ValueMapping;\n(function (ValueMapping) {\n ValueMapping.linear = (min, max) => new Linear(min, max);\n ValueMapping.linearInteger = (min, max) => new LinearInteger(min, max);\n ValueMapping.exponential = (min, max) => new Exponential(min, max);\n ValueMapping.values = (values) => new Values(values);\n ValueMapping.decibel = (min, mid, max) => new Decibel(min, mid, max);\n const Bool = new class {\n x(y) { return y ? 1.0 : 0.0; }\n y(x) { return x >= 0.5; }\n clamp(y) { return y; }\n floating() { return false; }\n };\n const Unipolar = ValueMapping.linear(0.0, 1.0);\n const Bipolar = ValueMapping.linear(-1.0, 1.0);\n ValueMapping.bool = Bool;\n const DefaultDecibelInstance = ValueMapping.decibel(-72.0, -12.0, 0.0);\n ValueMapping.unipolar = () => Unipolar;\n ValueMapping.bipolar = () => Bipolar;\n ValueMapping.DefaultDecibel = DefaultDecibelInstance;\n})(ValueMapping || (ValueMapping = {}));\n", "import { isDefined } from \"./lang\";\nimport { clamp } from \"./math\";\nexport var StringMapping;\n(function (StringMapping) {\n StringMapping.percent = ({ bipolar, fractionDigits } = {}) => new Numeric(\"%\", fractionDigits, false, bipolar);\n StringMapping.numeric = ({ unit, fractionDigits, unitPrefix, bipolar } = {}) => new Numeric(unit, fractionDigits, unitPrefix, bipolar);\n StringMapping.indices = (unit, values) => new class {\n x(y) {\n return { unit, value: values[y] };\n }\n y(x) {\n const index = values.indexOf(x);\n return index === -1 ? { type: \"unknown\", value: \"\uD83D\uDCA3\" } : { type: \"explicit\", value: index };\n }\n };\n StringMapping.values = (unit, values, strings) => new class {\n x(y) {\n return { unit, value: strings.at(values.indexOf(y)) ?? \"N/A\" };\n }\n y(x) {\n const index = strings.indexOf(x);\n return index === -1 ? { type: \"unknown\", value: \"\uD83D\uDCA3\" } : { type: \"explicit\", value: values[index] };\n }\n };\n StringMapping.bool = new class {\n y(x) {\n switch (x.trim()) {\n case \"on\":\n case \"yes\":\n case \"true\":\n return { type: \"explicit\", value: true };\n default:\n return { type: \"explicit\", value: false };\n }\n }\n x(y) {\n return { value: String(y), unit: \"\" };\n }\n };\n class Numeric {\n #unit;\n #fractionDigits;\n #unitPrefix;\n #bipolar;\n constructor(unit, fractionDigits, unitPrefix, bipolar) {\n this.#unit = unit ?? \"\";\n this.#fractionDigits = fractionDigits ?? 0;\n this.#unitPrefix = unitPrefix ?? false;\n this.#bipolar = bipolar ?? false;\n }\n y(x) {\n let value = x.trim();\n const float = parseFloat(value);\n if (isNaN(float)) {\n return { type: \"unknown\", value: value };\n }\n else if (this.#unit === \"%\") {\n return {\n type: \"explicit\",\n value: float / 100.0\n };\n }\n else if (value.endsWith(\"%\")) {\n return {\n type: \"unitValue\",\n value: this.#bipolar\n ? clamp(float / 200.0 + 0.5, 0.0, 1.0)\n : clamp(float / 100.0, 0.0, 1.0)\n };\n }\n else {\n if (value.endsWith(this.#unit) && this.#unit.length > 0) {\n // remove unit\n value = value.slice(0, -this.#unit.length);\n }\n const regex = /(\\d+)(\\D+)/;\n const match = regex.exec(value);\n const last = match?.at(2)?.at(0);\n if (isDefined(last)) {\n const index = prefixes.indexOf(last);\n if (index > -1) {\n return { type: \"explicit\", value: float * Math.pow(10.0, (index - 4) * 3.0) };\n }\n }\n return { type: \"explicit\", value: float };\n }\n }\n x(y) {\n if (Number.isNaN(y)) {\n return { value: \"\uD83D\uDCA3\", unit: this.#unit };\n }\n else if (Number.isFinite(y)) {\n if (this.#unit === \"%\") {\n return this.#bipolar\n ? { value: (y * 200 - 100).toFixed(this.#fractionDigits), unit: this.#unit }\n : { value: (y * 100).toFixed(this.#fractionDigits), unit: this.#unit };\n }\n if (this.#unitPrefix) {\n const { value, prefix } = computePrefix(y);\n return { value: value.toFixed(this.#fractionDigits), unit: `${prefix}${this.#unit}` };\n }\n else {\n return { value: y.toFixed(this.#fractionDigits), unit: this.#unit };\n }\n }\n else {\n return { value: y === Number.POSITIVE_INFINITY ? \"\u221E\" : \"-\u221E\", unit: this.#unit };\n }\n }\n }\n const prefixes = Object.freeze([\"p\", \"n\", \"\u03BC\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\"]);\n // this magic number rounds the result perfectly to integers, while the mathematically correct 10 doesn't:\n // computeBase10(1000) = 3\n // computeBase10(0.001) = -3\n const computeBase10 = (value) => Math.log(value) / Math.log(9.999999999999999);\n const computePrefix = (value) => {\n const location = Math.floor(computeBase10(value) / 3.0);\n const prefix = prefixes[location + 4];\n return isDefined(prefix) ? { value: value * Math.pow(10.0, location * -3.0), prefix } : { value, prefix: \"\" };\n };\n StringMapping.decible = StringMapping.numeric({ unit: \"db\", fractionDigits: 1 });\n StringMapping.panning = StringMapping.percent({ unit: \"%\", fractionDigits: 0 });\n})(StringMapping || (StringMapping = {}));\n", "export var Predicates;\n(function (Predicates) {\n Predicates.alwaysTrue = () => true;\n Predicates.alwaysFalse = () => false;\n Predicates.definedPredicate = (value) => value !== null && value !== undefined;\n})(Predicates || (Predicates = {}));\n", "import { Arrays } from \"./arrays\";\nexport const SilentProgressHandler = _ => { };\nexport var Progress;\n(function (Progress) {\n Progress.split = (progress, count) => {\n const collect = new Float32Array(count);\n return Arrays.create(index => (value) => {\n collect[index] = value;\n progress(collect.reduce((total, value) => total + value, 0.0) / count);\n }, count);\n };\n})(Progress || (Progress = {}));\n", "import { panic } from \"./lang\";\nexport var Random;\n(function (Random) {\n Random.create = (seed = 0xF123F42) => new Mulberry32(seed);\n /**\n * Generates a monotone ascending sequence of random unitValue numbers.\n * @param target The target array to fill with random values.\n * @param noise Tell the method how noisy the sequence should be. 0 leads to a linear sequence.\n * @param random The random number generator to use.\n * @returns The target array.\n */\n Random.monotoneAscending = (target, noise = 128, random = Random.create()) => {\n const length = target.length;\n if (length < 2) {\n return panic(\"Array must have at least 2 elements\");\n }\n let sum = 0.0;\n for (let i = 1; i < length; i++) {\n const value = Math.floor(random.uniform() * (1.0 + noise)) + 1.0;\n target[i] = value;\n sum += value;\n }\n let acc = 0.0;\n target[0] = 0.0;\n for (let i = 1; i < length; i++) {\n acc += target[i];\n target[i] = acc / sum;\n }\n return target;\n };\n})(Random || (Random = {}));\nexport class Mulberry32 {\n #seed = 0;\n constructor(seed) { this.setSeed(seed); }\n setSeed(value) { this.#seed = value & 0xFFFFFFFF; }\n nextDouble(min, max) { return min + this.uniform() * (max - min); }\n nextInt(min, max) { return min + Math.floor(this.uniform() * (max - min)); }\n nextElement(array) { return array[Math.floor(this.uniform() * array.length)]; }\n nextBoolean() { return this.uniform() < 0.5; }\n uniform() {\n let t = this.#seed += 0x6D2B79F5;\n t = Math.imul(t ^ t >>> 15, t | 1);\n t ^= t + Math.imul(t ^ t >>> 7, t | 61);\n return ((t ^ t >>> 14) >>> 0) / 4294967296.0;\n }\n}\n", "import { ByteCounter } from \"./data\";\n/**\n * Schema defines a fixed structure for numbers and boolean\n */\nexport var Schema;\n(function (Schema) {\n class Serializer {\n }\n Schema.createBuilder = (schema) => {\n const replace = (schema) => {\n const clone = schema instanceof Array ? [] : {};\n Object.entries(schema).forEach(([key, value]) => {\n if (value instanceof Serializer) {\n clone[key] = value.initialValue();\n }\n else if (typeof value === \"object\") {\n clone[key] = replace(value);\n }\n });\n return clone;\n };\n return () => new IOImpl(schema, Object.seal(replace(schema)));\n };\n Schema.bool = new class extends Serializer {\n read(input) { return input.readByte() === 1; }\n write(output, value) { output.writeByte(value ? 1 : 0); }\n initialValue() { return false; }\n };\n Schema.int8 = new class extends Serializer {\n read(input) { return input.readByte(); }\n write(output, value) { output.writeByte(value); }\n initialValue() { return 0; }\n };\n Schema.int16 = new class extends Serializer {\n read(input) { return input.readShort(); }\n write(output, value) { output.writeShort(value); }\n initialValue() { return 0; }\n };\n Schema.int32 = new class extends Serializer {\n read(input) { return input.readInt(); }\n write(output, value) { output.writeInt(value); }\n initialValue() { return 0; }\n };\n Schema.float = new class extends Serializer {\n read(input) { return input.readFloat(); }\n write(output, value) { output.writeFloat(value); }\n initialValue() { return 0.0; }\n };\n Schema.double = new class extends Serializer {\n read(input) { return input.readDouble(); }\n write(output, value) { output.writeDouble(value); }\n initialValue() { return 0.0; }\n };\n Schema.int64 = new class extends Serializer {\n read(input) { return input.readLong(); }\n write(output, value) { output.writeLong(value); }\n initialValue() { return 0n; }\n };\n Schema.floats = (length) => new class extends Serializer {\n read(input, values) {\n for (let i = 0; i < values.length; i++) {\n values[i] = input.readFloat();\n }\n return values;\n }\n write(output, values) {\n for (let i = 0; i < values.length; i++) {\n output.writeFloat(values[i]);\n }\n }\n initialValue() { return new Float32Array(length); }\n };\n Schema.doubles = (length) => new class extends Serializer {\n read(input, values) {\n for (let i = 0; i < values.length; i++) {\n values[i] = input.readDouble();\n }\n return values;\n }\n write(output, values) {\n for (let i = 0; i < values.length; i++) {\n output.writeDouble(values[i]);\n }\n }\n initialValue() { return new Float64Array(length); }\n };\n class IOImpl {\n #schema;\n #object;\n #bytesTotal;\n constructor(schema, object) {\n this.#schema = schema;\n this.#object = object;\n this.#bytesTotal = this.#count();\n }\n get object() { return this.#object; }\n get bytesTotal() { return this.#bytesTotal; }\n read(input) {\n const collector = (schema, object) => {\n Object.entries(schema).forEach(([key, value]) => {\n const data = object;\n if (value instanceof Serializer) {\n data[key] = value.read(input, data[key]);\n }\n else if (typeof value === \"object\") {\n collector(value, data[key]);\n }\n });\n };\n collector(this.#schema, this.#object);\n }\n write(output) {\n const collector = (schema, object) => {\n Object.entries(schema).forEach(([key, value]) => {\n const data = object;\n if (value instanceof Serializer) {\n value.write(output, data[key]);\n }\n else if (typeof value === \"object\") {\n collector(value, data[key]);\n }\n });\n };\n collector(this.#schema, this.#object);\n }\n #count() {\n const counter = new ByteCounter();\n this.write(counter);\n return counter.count;\n }\n }\n})(Schema || (Schema = {}));\n", "import { isDefined, panic } from \"./lang\";\nimport { Arrays } from \"./arrays\";\nimport { Option } from \"./option\";\nimport { BinarySearch } from \"./binary-search\";\n/**\n * SortedSet\n * ---------------------------\n * Advantages Over Native Set\n * ---------------------------\n * Custom Key Extraction: Allows using complex keys (like UUID) with custom comparison logic\n * Ordered Iteration: Elements are always iterated in sorted order (not necessarily favored)\n * Efficient Lookups: O(log n) lookups using binary search\n * Flexible Duplicate Handling: Control whether to replace or duplicates or throw an error\n * -----------------------------\n * Disadvantages Over Native Set\n * -----------------------------\n * No Range Operations: No efficient range-based operations\n * Losing insert order: Elements get sorted by key and not insert order\n */\nexport class SortedSet {\n #extractor;\n #comparator;\n #array;\n constructor(extractor, comparator) {\n this.#extractor = extractor;\n this.#comparator = comparator;\n this.#array = [];\n }\n add(value, replace = false) {\n const key = this.#extractor(value);\n const insertIndex = BinarySearch.leftMostMapped(this.#array, key, this.#comparator, this.#extractor);\n const current = this.#array[insertIndex];\n if (isDefined(current) && this.#comparator(this.#extractor(current), key) === 0) {\n if (replace) {\n this.#array.splice(insertIndex, 1, value);\n return true;\n }\n return false;\n }\n this.#array.splice(insertIndex, 0, value);\n return true;\n }\n getOrCreate(key, factory) {\n const insertIndex = BinarySearch.leftMostMapped(this.#array, key, this.#comparator, this.#extractor);\n const current = this.#array[insertIndex];\n if (isDefined(current) && this.#comparator(this.#extractor(current), key) === 0) {\n return current;\n }\n const value = factory(key);\n this.#array.splice(insertIndex, 0, value);\n return value;\n }\n addMany(values) {\n for (const value of values) {\n this.#array.push(value);\n }\n try {\n this.#array.sort((a, b) => {\n const delta = this.#comparator(this.#extractor(a), this.#extractor(b));\n if (delta === 0) {\n throw \"cancel\";\n }\n return delta;\n });\n return true;\n }\n catch (reason) {\n if (reason === \"cancel\") {\n const uniqueKeys = new Map(this.entries());\n this.#array.splice(0, this.#array.length, ...uniqueKeys.values());\n this.#array.sort((a, b) => this.#comparator(this.#extractor(a), this.#extractor(b)));\n return false;\n }\n return panic(reason);\n }\n }\n removeByValue(value) { return this.removeByKey(this.#extractor(value)); }\n removeByKey(key) {\n const deleteIndex = BinarySearch.leftMostMapped(this.#array, key, this.#comparator, this.#extractor);\n const candidate = this.#array[deleteIndex];\n if (isDefined(candidate) && this.#comparator(this.#extractor(candidate), key) === 0) {\n this.#array.splice(deleteIndex, 1);\n return candidate;\n }\n return panic(`Could not remove ${key}`);\n }\n removeRange(startIndex, endIndex) {\n this.#array.splice(startIndex, (endIndex ?? this.#array.length) - startIndex);\n }\n removeByPredicate(predicate) {\n let count = 0 | 0;\n let index = this.#array.length;\n while (--index >= 0) {\n if (predicate(this.#array[index])) {\n this.#array.splice(index, 1);\n count++;\n }\n }\n return count;\n }\n get(key) {\n const candidate = this.#lookup(key);\n if (isDefined(candidate)) {\n return candidate;\n }\n else {\n return panic(`Unknown key: ${key}`);\n }\n }\n getOrThrow(key, provider) {\n const candidate = this.#lookup(key);\n if (isDefined(candidate)) {\n return candidate;\n }\n else {\n throw provider();\n }\n }\n opt(key) { return Option.wrap(this.#lookup(key)); }\n getOrNull(key) { return this.#lookup(key) ?? null; }\n getByIndex(index) { return this.#array[index]; }\n hasKey(key) { return isDefined(this.#lookup(key)); }\n hasValue(value) { return isDefined(this.#lookup(this.#extractor(value))); }\n size() { return this.#array.length; }\n isEmpty() { return this.#array.length === 0; }\n forEach(procedure) { this.values().forEach(procedure); }\n values() { return this.#array; }\n entries() { return this.#array.map((entry) => [this.#extractor(entry), entry]); }\n clear() { Arrays.clear(this.#array); }\n [Symbol.iterator]() { return this.#array.values(); }\n #lookup(key) {\n const index = BinarySearch.leftMostMapped(this.#array, key, this.#comparator, this.#extractor);\n const candidate = this.#array[index];\n return isDefined(candidate) && this.#comparator(this.#extractor(candidate), key) === 0 ? candidate : undefined;\n }\n}\n", "import { isDefined } from \"./lang\";\nexport var Strings;\n(function (Strings) {\n Strings.hyphenToCamelCase = (value) => value\n .replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n Strings.fallback = (value, fallback) => isDefined(value) && value.length > 0 ? value : fallback;\n Strings.endsWithDigit = (str) => /\\d$/.test(str);\n Strings.nonEmpty = (str, fallback) => isDefined(str) && str.trim().length > 0 ? str : fallback;\n // UTF-8\n Strings.toArrayBuffer = (str) => {\n const buffer = new ArrayBuffer(str.length);\n const view = new Uint8Array(buffer);\n for (let i = 0; i < str.length; i++) {\n view[i] = str.charCodeAt(i);\n }\n return buffer;\n };\n Strings.getUniqueName = (existingNames, desiredName) => {\n const existingSet = new Set(existingNames);\n let test = desiredName;\n let counter = 1;\n if (existingSet.has(desiredName) || existingSet.has(`${desiredName} 1`)) {\n counter = 2;\n }\n else {\n return desiredName;\n }\n while (existingSet.has(test = `${desiredName} ${counter++}`)) { }\n return test;\n };\n})(Strings || (Strings = {}));\n", "import { Unhandled } from \"./lang\";\nexport class TimeSpan {\n static POSITIVE_INFINITY = new TimeSpan(Number.POSITIVE_INFINITY);\n static millis = (value) => new TimeSpan(value);\n static seconds = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_SECOND);\n static minutes = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_MINUTE);\n static hours = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_HOUR);\n static days = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_DAY);\n static #MILLI_SECONDS_PER_SECOND = 1_000;\n static #MILLI_SECONDS_PER_MINUTE = 60_000;\n static #MILLI_SECONDS_PER_HOUR = 3_600_000;\n static #MILLI_SECONDS_PER_DAY = 86_400_000;\n #ms;\n constructor(ms) { this.#ms = ms; }\n millis() { return this.#ms; }\n absSeconds() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_SECOND; }\n absMinutes() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_MINUTE; }\n absHours() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_HOUR; }\n absDays() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_DAY; }\n split() {\n return {\n d: Math.floor(this.absDays()),\n h: Math.floor(this.absHours()) % 24,\n m: Math.floor(this.absMinutes()) % 60,\n s: Math.floor(this.absSeconds()) % 60\n };\n }\n isNow() { return this.#ms === 0.0; }\n isPast() { return this.#ms < 0.0; }\n isFuture() { return this.#ms > 0.0; }\n toUnitString() {\n let value, unit;\n const seconds = Math.floor(Math.abs(this.#ms) / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n if (seconds < 60) {\n value = seconds;\n unit = \"second\";\n }\n else if (minutes < 60) {\n value = minutes;\n unit = \"minute\";\n }\n else if (hours < 24) {\n value = hours;\n unit = \"hour\";\n }\n else {\n value = days;\n unit = \"day\";\n }\n return new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\", style: \"long\" })\n .format(value * Math.sign(this.#ms), unit);\n }\n toString() {\n if (isNaN(this.#ms)) {\n return \"NaN\";\n }\n if (!isFinite(this.#ms)) {\n return \"\u221E\";\n }\n const { d, h, m, s } = this.split();\n if (d > 0) {\n return [\n TimeSpan.#quantity(\"d\", d), TimeSpan.#quantity(\"h\", h),\n TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (h > 0) {\n return [\n TimeSpan.#quantity(\"h\", h), TimeSpan.#quantity(\"m\", m),\n TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (m > 0) {\n return [TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)]\n .join(\", \");\n }\n else if (s > 0) {\n return TimeSpan.#quantity(\"s\", s);\n }\n else {\n return \"now\";\n }\n }\n static #quantity = (name, count) => {\n switch (name) {\n case \"d\":\n return `${count} ${count < 2 ? \"day\" : \"days\"}`;\n case \"h\":\n return `${count} ${count < 2 ? \"hour\" : \"hours\"}`;\n case \"m\":\n return `${count} ${count < 2 ? \"minute\" : \"minutes\"}`;\n case \"s\":\n return `${count} ${count < 2 ? \"second\" : \"seconds\"}`;\n default:\n return Unhandled(name);\n }\n };\n}\n", "import { ByteArrayInput, ByteArrayOutput } from \"./data\";\nimport { panic } from \"./lang\";\nexport var SyncStream;\n(function (SyncStream) {\n let State;\n (function (State) {\n State[State[\"READING\"] = 0] = \"READING\";\n State[State[\"READ\"] = 1] = \"READ\";\n State[State[\"WRITING\"] = 2] = \"WRITING\";\n State[State[\"WRITTEN\"] = 3] = \"WRITTEN\";\n })(State || (State = {}));\n SyncStream.writer = (io, buffer, populate) => {\n if (io.bytesTotal + 1 > buffer.byteLength) {\n return panic(\"Insufficient memory allocated.\");\n }\n const array = new Uint8Array(buffer);\n const output = ByteArrayOutput.use(buffer, 1);\n Atomics.store(array, 0, State.READ);\n return {\n tryWrite: () => {\n if (Atomics.compareExchange(array, 0, State.READ, State.WRITING) === State.WRITING) {\n populate(io.object);\n output.position = 0;\n io.write(output);\n Atomics.store(array, 0, State.WRITTEN);\n return true;\n }\n return false;\n }\n };\n };\n SyncStream.reader = (io, procedure) => {\n const buffer = new SharedArrayBuffer(io.bytesTotal + 1);\n const array = new Uint8Array(buffer);\n const input = new ByteArrayInput(buffer, 1);\n return {\n buffer,\n tryRead: () => {\n if (Atomics.compareExchange(array, 0, State.WRITTEN, State.READING) === State.READING) {\n input.position = 0;\n io.read(input);\n procedure(io.object);\n Atomics.store(array, 0, State.READ);\n return true;\n }\n return false;\n }\n };\n };\n})(SyncStream || (SyncStream = {}));\n", "import { Arrays } from \"./arrays\";\nimport { assert, panic } from \"./lang\";\nimport { SortedSet } from \"./sorted-set\";\nexport var UUID;\n(function (UUID) {\n UUID.length = 16;\n UUID.generate = () => {\n return fromUint8Array(crypto.getRandomValues(new Uint8Array(UUID.length)));\n };\n UUID.sha256 = async (buffer) => {\n return crypto.subtle.digest(\"SHA-256\", buffer)\n .then(buffer => fromUint8Array(new Uint8Array(buffer.slice(0, UUID.length))));\n };\n UUID.validate = (uuid) => UUID.parse(UUID.toString(uuid));\n UUID.fromDataInput = (input) => {\n const arr = new Uint8Array(UUID.length);\n input.readBytes(new Int8Array(arr.buffer));\n return arr;\n };\n UUID.toDataOutput = (output, uuid) => output.writeBytes(new Int8Array(uuid.buffer));\n UUID.toString = (format) => {\n const hex = Arrays.create(index => (index + 0x100).toString(16).substring(1), 256);\n return hex[format[0]] + hex[format[1]] +\n hex[format[2]] + hex[format[3]] + \"-\" +\n hex[format[4]] + hex[format[5]] + \"-\" +\n hex[format[6]] + hex[format[7]] + \"-\" +\n hex[format[8]] + hex[format[9]] + \"-\" +\n hex[format[10]] + hex[format[11]] +\n hex[format[12]] + hex[format[13]] +\n hex[format[14]] + hex[format[15]];\n };\n UUID.parse = (string) => {\n const cleanUuid = string.replace(/-/g, \"\").toLowerCase();\n if (cleanUuid.length !== 32) {\n return panic(\"Invalid UUID format\");\n }\n const bytes = new Uint8Array(UUID.length);\n for (let i = 0, j = 0; i < 32; i += 2, j++) {\n bytes[j] = parseInt(cleanUuid.slice(i, i + 2), 16);\n }\n return bytes;\n };\n UUID.Comparator = (a, b) => {\n if (a.length !== UUID.length || b.length !== UUID.length) {\n return panic(\"Unexpected array length for uuid(v4)\");\n }\n for (let i = 0; i < UUID.length; i++) {\n const delta = a[i] - b[i];\n if (delta !== 0) {\n return delta;\n }\n }\n return 0;\n };\n UUID.equals = (a, b) => UUID.Comparator(a, b) === 0;\n UUID.newSet = (key) => new SortedSet(key, UUID.Comparator);\n UUID.Lowest = UUID.parse(\"00000000-0000-4000-8000-000000000000\");\n UUID.Highest = UUID.parse(\"FFFFFFFF-FFFF-4FFF-BFFF-FFFFFFFFFFFF\");\n UUID.fromInt = (value) => {\n const result = new Uint8Array(UUID.Lowest);\n const array = new Uint8Array(new Uint32Array([value]).buffer);\n for (let i = 0; i < 4; i++) {\n result[i] = array[i];\n }\n return result;\n };\n const fromUint8Array = (arr) => {\n assert(arr.length === UUID.length, \"UUID must be 16 bytes long\");\n arr[6] = (arr[6] & 0x0f) | 0x40; // Version 4 (random)\n arr[8] = (arr[8] & 0x3f) | 0x80; // Variant 10xx for UUID\n return arr;\n };\n})(UUID || (UUID = {}));\n", "import { Arrays } from \"./arrays\";\nimport { NumberComparator } from \"./comparators\";\nimport { assert, isDefined } from \"./lang\";\nimport { clamp } from \"./math\";\nimport { BinarySearch } from \"./binary-search\";\nexport var ValueGuide;\n(function (ValueGuide) {\n ValueGuide.create = (option) => {\n if (isDefined(option)) {\n if (isDefined(option?.snap)) {\n return ValueGuide.snap(option?.trackLength, option?.snap?.snapLength, Array.isArray(option?.snap?.threshold)\n ? option?.snap.threshold\n : [option?.snap?.threshold]);\n }\n else {\n return ValueGuide.identity(option?.trackLength);\n }\n }\n else {\n return ValueGuide.identity();\n }\n };\n ValueGuide.snap = (trackLength = DEFAULT_TRACK_LENGTH, snapLength = DEFAULT_SNAP_LENGTH, thresholds) => new Snap(trackLength, snapLength / trackLength, thresholds);\n ValueGuide.identity = (trackLength = DEFAULT_TRACK_LENGTH) => new Identity(trackLength);\n const DEFAULT_TRACK_LENGTH = 128;\n const DEFAULT_SNAP_LENGTH = 24;\n class Identity {\n length;\n #x = NaN;\n #value = NaN;\n #ratio = 1.0;\n constructor(length) {\n this.length = length;\n }\n begin(value) { this.#value = this.#x = value; }\n moveBy(delta) {\n assert(!isNaN(this.#value), () => \"value has never been set\");\n this.#x += delta / this.length * this.#ratio;\n this.#value = clamp(this.#x, 0.0, 1.0);\n }\n ratio(value) { this.#ratio = value; }\n value() {\n assert(!isNaN(this.#value), () => \"value has never been set\");\n return this.#value;\n }\n disable() { }\n enable() { }\n }\n class Snap {\n #length;\n #margin;\n #thresholds;\n #ranges;\n #x = NaN; // unhinged floating value including the snapping margin\n #value = NaN; // clamped normalised, exposable value\n #ratio = 1.0;\n #enabled = true;\n constructor(length, margin, thresholds) {\n assert(margin > 0.0, () => `margin(${margin}) must be greater then 0`);\n assert(Arrays.isSorted(thresholds), () => \"thresholds are not sorted\");\n assert(margin < length, () => `margin(${margin}) must be lower then length(${length})`);\n this.#length = length;\n this.#margin = margin;\n this.#thresholds = thresholds;\n this.#ranges = thresholds.map((x, index) => x + index * this.#margin);\n }\n begin(value) {\n if (this.#enabled) {\n this.#x = this.valueToX(value);\n }\n this.#value = value;\n }\n moveBy(delta) {\n assert(!isNaN(this.#value), () => \"value has never been set\");\n this.#x += delta / this.#length * this.#ratio;\n this.#value = this.#enabled ? this.xToValue(this.#x) : clamp(this.#x, 0.0, 1.0);\n }\n ratio(value) { this.#ratio = value; }\n value() {\n assert(!isNaN(this.#value), () => \"value has never been set\");\n return this.#value;\n }\n disable() {\n if (!this.#enabled) {\n return;\n }\n this.#enabled = false;\n this.#x = this.xToValue(this.#x);\n }\n enable() {\n if (this.#enabled) {\n return;\n }\n this.#enabled = true;\n this.#x = this.valueToX(this.#x);\n }\n valueToX(value) {\n const index = BinarySearch.rightMost(this.#thresholds, value, NumberComparator);\n if (index < 0) {\n return value;\n }\n else {\n const range = this.#ranges[index];\n const threshold = this.#thresholds[index];\n return value === threshold ? range + this.#margin / 2.0 : range + this.#margin + (value - threshold);\n }\n }\n xToValue(x) {\n const clamped = clamp(x, 0.0, 1.0 + this.#margin * this.#thresholds.length);\n const index = BinarySearch.rightMost(this.#ranges, clamped, NumberComparator);\n if (index < 0) {\n return clamped;\n }\n else {\n const range = this.#ranges[index];\n const threshold = this.#thresholds[index];\n if (clamped > range + this.#margin) {\n return clamped - (range + this.#margin) + threshold;\n }\n else {\n return threshold;\n }\n }\n }\n get margin() { return this.#margin; }\n }\n})(ValueGuide || (ValueGuide = {}));\n", "const key = Symbol.for(\"@openDAW/lib-std\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nexport * from \"./arrays\";\nexport * from \"./attempts\";\nexport * from \"./bijective\";\nexport * from \"./binary-search\";\nexport * from \"./bits\";\nexport * from \"./cache\";\nexport * from \"./color\";\nexport * from \"./comparators\";\nexport * from \"./curve\";\nexport * from \"./data\";\nexport * from \"./decorators\";\nexport * from \"./generators\";\nexport * from \"./geom\";\nexport * from \"./hash\";\nexport * from \"./intervals\";\nexport * from \"./iterables\";\nexport * from \"./lang\";\nexport * from \"./listeners\";\nexport * from \"./math\";\nexport * from \"./maps\";\nexport * from \"./multimap\";\nexport * from \"./numeric\";\nexport * from \"./objects\";\nexport * from \"./observers\";\nexport * from \"./option\";\nexport * from \"./parameters\";\nexport * from \"./predicates\";\nexport * from \"./progress\";\nexport * from \"./random\";\nexport * from \"./range\";\nexport * from \"./schema\";\nexport * from \"./selection\";\nexport * from \"./sets\";\nexport * from \"./sorted-set\";\nexport * from \"./string-mapping\";\nexport * from \"./strings\";\nexport * from \"./terminable\";\nexport * from \"./time-span\";\nexport * from \"./sync-stream\";\nexport * from \"./uuid\";\nexport * from \"./value-guides\";\nexport * from \"./value-mapping\";\n", "import { asDefined, assert, isDefined, Iterables, panic } from \"@opendaw/lib-std\";\n/**\n * Communicator provides type-safe communication between Window, Worker, MessagePort, BroadcastChannel.\n * Passed objects are structured cloned: https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n * It is highly advised not to pass classes with methods and or real private properties (starting with #).\n * They will lose their prototype and private property inheritance, and it is cumbersome to patch that up later.\n * Also read: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain\n */\nexport var Communicator;\n(function (Communicator) {\n Communicator.sender = (messenger, bind) => bind(new Sender(messenger));\n Communicator.executor = (messenger, protocol) => new Executor(messenger, protocol);\n class Sender {\n #messenger;\n #expected = new Map();\n #subscription;\n #returnId = 0;\n constructor(messenger) {\n this.#messenger = messenger;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n dispatchAndForget = (func, ...args) => this.#messenger.send({\n type: \"send\",\n returnId: false,\n func: func.name,\n args: Array.from(Iterables.map(args, arg => ({ value: arg })))\n });\n dispatchAndReturn = (func, ...args) => new Promise((resolve, reject) => {\n const entries = Iterables.reduce(args, (callbacks, arg, index) => {\n if (typeof arg === \"function\") {\n callbacks.push([index, arg]);\n }\n return callbacks;\n }, []);\n this.#expected.set(this.#returnId, {\n executorTuple: { resolve, reject },\n callbacks: new Map(entries)\n });\n this.#messenger.send({\n type: \"send\",\n returnId: this.#returnId,\n func: func.name,\n args: Array.from(Iterables.map(args, (arg, index) => typeof arg === \"function\" ? ({ callback: index }) : ({ value: arg })))\n });\n this.#returnId++;\n });\n #messageHandler = (message) => {\n const returns = this.#expected.get(message.returnId);\n if (isDefined(returns)) {\n if (message.type === \"resolve\") {\n returns.executorTuple.resolve(message.resolve);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"reject\") {\n returns.executorTuple.reject(message.reject);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"callback\") {\n returns.callbacks?.get(message.funcAt).apply(this, message.args);\n }\n }\n else {\n panic(`Promise has already been resolved. ${JSON.stringify(message)}`);\n }\n };\n }\n class Executor {\n #messenger;\n #protocol;\n #subscription;\n constructor(messenger, protocol) {\n this.#messenger = messenger;\n this.#protocol = protocol;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n #messageHandler = (message) => {\n assert(message.type === \"send\", () => \"Message type must be 'send'\");\n const object = Object.getPrototypeOf(this.#protocol) === Object.getPrototypeOf({})\n ? this.#protocol\n : Object.getPrototypeOf(this.#protocol);\n const func = asDefined(object[message.func], `${message.func.toString()} does not exists on ${this.#protocol}`);\n const returnId = message.returnId;\n if (returnId === false) {\n func.apply(this.#protocol, message.args.map((arg) => {\n return \"value\" in arg\n ? arg.value\n : panic(`${message.func.toString()} has no promise.`);\n }));\n }\n else {\n try {\n const promise = func.apply(this.#protocol, message.args\n .map(arg => \"callback\" in arg\n ? (...args) => this.#sendCallback(returnId, arg.callback, args)\n : arg.value));\n promise.then(value => this.#sendResolve(returnId, value), reason => this.#sendReject(returnId, reason));\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }\n };\n #sendResolve = (returnId, value) => this.#messenger.send({ type: \"resolve\", returnId, resolve: value });\n #sendReject = (returnId, reason) => this.#messenger.send({ type: \"reject\", returnId, reject: reason });\n #sendCallback = (returnId, func, args) => this.#messenger.send({ type: \"callback\", returnId, funcAt: func, args });\n }\n Communicator.Executor = Executor;\n})(Communicator || (Communicator = {}));\n", "import { asDefined, ByteArrayOutput } from \"@opendaw/lib-std\";\nexport var Fetch;\n(function (Fetch) {\n Fetch.ProgressArrayBuffer = (progress) => async (response) => {\n if (!response.headers.has(\"Content-Length\")) {\n console.debug(\"No Content-Length\");\n return response.arrayBuffer();\n }\n const length = parseInt(response.headers.get(\"Content-Length\"));\n console.debug(`Content-Length: ${length}b`);\n if (isNaN(length) || length < 4096) {\n return response.arrayBuffer();\n } // smaller sizes do not need progress\n progress(0.0);\n const output = ByteArrayOutput.create(length);\n const reader = asDefined(response.body, \"response.body is empty\").getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n value.forEach((value) => output.writeByte(value));\n progress(output.position / length);\n }\n progress(1.0);\n return output.toArrayBuffer();\n };\n})(Fetch || (Fetch = {}));\n", "export var Runtime;\n(function (Runtime) {\n // Debounces execution by delaying the call until after the timeout has passed without new invocations.\n Runtime.debounce = (() => {\n let id = undefined;\n return (exec, timeout = 1000) => {\n clearTimeout(id);\n id = setTimeout(exec, timeout);\n };\n })();\n Runtime.scheduleInterval = (exec, time, ...args) => {\n const id = setInterval(exec, time, ...args);\n return { terminate: () => clearInterval(id) };\n };\n Runtime.scheduleTimeout = (exec, time, ...args) => {\n const id = setTimeout(exec, time, ...args);\n return { terminate: () => clearTimeout(id) };\n };\n})(Runtime || (Runtime = {}));\n", "import { isDefined, Notifier } from \"@opendaw/lib-std\";\nexport const Messenger = { for: (port) => new NativeMessenger(port) };\nclass NativeMessenger {\n #port;\n #notifier = new Notifier();\n constructor(port) {\n this.#port = port;\n if (isDefined(port.onmessage) || isDefined(port.onmessageerror)) {\n console.error(port);\n throw new Error(`${port} is already wrapped.`);\n }\n port.onmessage = (event) => this.#notifier.notify(event.data);\n port.onmessageerror = (event) => { throw new Error(event.type); };\n }\n send(message) { this.#port.postMessage(message); }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#notifier.terminate();\n this.#port.onmessage = null;\n this.#port.onmessageerror = null;\n }\n}\nclass Channel {\n #messages;\n #name;\n #notifier = new Notifier();\n #subscription;\n constructor(messages, name) {\n this.#messages = messages;\n this.#name = name;\n this.#subscription = messages.subscribe(data => {\n if (\"message\" in data && \"channel\" in data && data.channel === name) {\n this.#notifier.notify(data.message);\n }\n });\n }\n send(message) { this.#messages.send({ channel: this.#name, message }); }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#subscription.terminate();\n this.#notifier.terminate();\n }\n}\n", "import { assert, InaccessibleProperty, Option, safeExecute, Terminable, TimeSpan } from \"@opendaw/lib-std\";\nexport class IntervalRetryOption {\n maxRetry;\n timeSpan;\n #count = 0 | 0;\n constructor(maxRetry, timeSpan) {\n this.maxRetry = maxRetry;\n this.timeSpan = timeSpan;\n }\n retry(reason, exec) {\n if (++this.#count === this.maxRetry) {\n return false;\n }\n console.debug(`${reason} > will retry in ${this.timeSpan.toString()}`);\n setTimeout(exec, this.timeSpan.millis());\n return true;\n }\n}\nexport var Promises;\n(function (Promises) {\n class ResolveResult {\n value;\n status = \"resolved\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when promise is resolved\");\n }\n class RejectedResult {\n error;\n status = \"rejected\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when promise is rejected\");\n }\n Promises.makeAbortable = async (owner, promise) => {\n let running = true;\n owner.own(Terminable.create(() => running = false));\n return new Promise((resolve, reject) => promise.then(value => { if (running) {\n resolve(value);\n } }, reason => { if (running) {\n reject(reason);\n } }));\n };\n Promises.tryCatch = (promise) => promise.then(value => new ResolveResult(value), error => new RejectedResult(error));\n Promises.retry = (call, retryOption = new IntervalRetryOption(3, TimeSpan.seconds(3))) => call().catch(reason => new Promise((resolve, reject) => {\n const onFailure = (reason) => {\n if (!retryOption.retry(reason, () => call().then((value) => resolve(value), onFailure))) {\n reject(reason);\n }\n };\n onFailure(reason);\n }));\n // this is for testing the catch branch\n Promises.fail = (after, thenUse) => {\n let use = () => new Promise((_, reject) => setTimeout(() => reject(\"fails first\"), after.millis()));\n return () => {\n const promise = use();\n use = thenUse;\n return promise;\n };\n };\n Promises.timeout = (promise, timeSpan, fail) => {\n return new Promise((resolve, reject) => {\n let running = true;\n const timeout = setTimeout(() => {\n running = false;\n reject(new Error(fail ?? \"timeout\"));\n }, timeSpan.millis());\n promise\n .then((value) => { if (running) {\n resolve(value);\n } }, reason => { if (running) {\n reject(reason);\n } })\n .finally(() => clearTimeout(timeout));\n });\n };\n Promises.sequential = (fn) => {\n let lastPromise = Promise.resolve(null);\n return (arg) => lastPromise = lastPromise.then(() => fn(arg));\n };\n class Limit {\n max;\n #waiting;\n #running = 0 | 0;\n constructor(max = 1) {\n this.max = max;\n this.#waiting = [];\n }\n async add(provider) {\n if (this.#running < this.max) {\n this.#running++;\n return provider().finally(() => this.#continue());\n }\n else {\n const resolvers = Promise.withResolvers();\n this.#waiting.push([provider, resolvers]);\n return resolvers.promise.finally(() => this.#continue());\n }\n }\n #continue() {\n assert(this.#running > 0, \"Internal Error in Promises.Limit\");\n if (--this.#running < this.max) {\n if (this.#waiting.length > 0) {\n const [provider, { resolve, reject }] = this.#waiting.shift();\n this.#running++;\n provider().then(resolve, reject);\n }\n }\n }\n }\n Promises.Limit = Limit;\n class Latest {\n #onResolve;\n #onReject;\n #onFinally;\n #latest = Option.None;\n constructor(onResolve, onReject, onFinally) {\n this.#onResolve = onResolve;\n this.#onReject = onReject;\n this.#onFinally = onFinally;\n }\n update(promise) {\n this.#latest = Option.wrap(promise);\n promise\n .then(value => { if (this.#latest.contains(promise)) {\n this.#onResolve(value);\n } })\n .catch(reason => { if (this.#latest.contains(promise)) {\n this.#onReject(reason);\n } })\n .finally(() => {\n if (this.#latest.contains(promise)) {\n this.terminate();\n safeExecute(this.#onFinally);\n }\n });\n }\n terminate() { this.#latest = Option.None; }\n }\n Promises.Latest = Latest;\n})(Promises || (Promises = {}));\n", "import { Promises } from \"./promises\";\nexport var network;\n(function (network) {\n const limit = new Promises.Limit(4);\n network.limitFetch = (input, init) => limit.add(() => fetch(input, init));\n})(network || (network = {}));\n", "export const stopwatch = (level = \"debug\") => {\n const startTime = performance.now();\n return {\n lab: (label) => console[level].call(console, `${label} in ${(performance.now() - startTime).toFixed(1)}ms`)\n };\n};\n", "import { TimeSpan } from \"@opendaw/lib-std\";\nexport var TimeSpanUtils;\n(function (TimeSpanUtils) {\n TimeSpanUtils.startEstimator = () => {\n const startTime = performance.now();\n return (progress) => {\n if (progress === 0.0) {\n return TimeSpan.POSITIVE_INFINITY;\n }\n const runtime = (performance.now() - startTime);\n return TimeSpan.millis(runtime / progress - runtime);\n };\n };\n})(TimeSpanUtils || (TimeSpanUtils = {}));\n", "import { tryCatch } from \"@opendaw/lib-std\";\nexport var Wait;\n(function (Wait) {\n Wait.frame = () => new Promise(resolve => requestAnimationFrame(() => resolve()));\n Wait.frames = (numFrames) => new Promise(resolve => {\n let count = numFrames;\n const callback = () => { if (--count <= 0) {\n resolve();\n }\n else {\n requestAnimationFrame(callback);\n } };\n requestAnimationFrame(callback);\n });\n Wait.timeSpan = (time, ...args) => new Promise(resolve => setTimeout(resolve, time.millis(), ...args));\n Wait.event = (target, type) => new Promise(resolve => target.addEventListener(type, resolve, { once: true }));\n Wait.observable = (observable) => new Promise(resolve => {\n const terminable = observable.subscribe(() => {\n terminable.terminate();\n resolve();\n });\n });\n Wait.complete = (generator) => new Promise((resolve, reject) => {\n const interval = setInterval(() => {\n const { status, value: next, error } = tryCatch(() => generator.next());\n if (status === \"success\") {\n const { done, value } = next;\n if (done) {\n clearInterval(interval);\n resolve(value);\n }\n }\n else {\n clearInterval(interval);\n reject(error);\n }\n }, 0);\n });\n})(Wait || (Wait = {}));\n", "const key = Symbol.for(\"@openDAW/lib-runtime\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nexport * from \"./communicator\";\nexport * from \"./fetch\";\nexport * from \"./runtime\";\nexport * from \"./messenger\";\nexport * from \"./network\";\nexport * from \"./promises\";\nexport * from \"./stopwatch\";\nexport * from \"./timespan\";\nexport * from \"./wait\";\n", "import { Arrays, assert, BinarySearch, SortedSet, UUID } from \"@opendaw/lib-std\";\nexport class Address {\n static newSet(keyExtractor) {\n return new SortedSet(keyExtractor, Address.Comparator);\n }\n static compose = (uuid, ...fieldKeys) => {\n const keys = fieldKeys.length === 0 ? this.#EMPTY_FIELD_KEYS : new Int16Array(fieldKeys);\n assert(keys.every((value, index) => value === fieldKeys[index]), `fieldKeys (${keys.join(\",\")}) only allows i16`);\n return new Address(uuid, keys);\n };\n static decode(str) {\n const parts = str.split(\"/\");\n assert(parts.length > 0, \"Unable to parse Address\");\n return Address.compose(UUID.parse(parts[0]), ...parts.slice(1).map(x => parseInt(x)));\n }\n static reconstruct(layout) { return this.compose(layout[0], ...layout[1]); }\n static boxRange(set, id, map) {\n const sorted = set.values();\n const startIndex = BinarySearch.leftMostMapped(sorted, id, UUID.Comparator, map);\n const length = sorted.length;\n if (startIndex < 0 || startIndex >= length) {\n return null;\n }\n for (let endIndex = startIndex; endIndex < length; endIndex++) {\n if (UUID.Comparator(map(sorted[endIndex]), id) !== 0) {\n if (startIndex < endIndex) {\n return [startIndex, endIndex];\n }\n else {\n return null;\n }\n }\n }\n return [startIndex, length];\n }\n static Comparator = (a, b) => {\n const compareId = UUID.Comparator(a.#uuid, b.#uuid);\n if (compareId !== 0) {\n return compareId;\n }\n const n = Math.min(a.#fieldKeys.length, b.#fieldKeys.length);\n for (let i = 0; i < n; i++) {\n const comparison = (a.#fieldKeys)[i] - (b.#fieldKeys)[i];\n if (comparison !== 0) {\n return comparison;\n }\n }\n return a.#fieldKeys.length - b.#fieldKeys.length;\n };\n static MinimalComparator = (a, b) => {\n const compareId = UUID.Comparator(a.#uuid, b.#uuid);\n if (compareId !== 0) {\n return compareId;\n }\n const n = Math.min(a.#fieldKeys.length, b.#fieldKeys.length);\n for (let i = 0; i < n; i++) {\n const comparison = (a.#fieldKeys)[i] - (b.#fieldKeys)[i];\n if (comparison !== 0) {\n return comparison;\n }\n }\n return 0;\n };\n static LengthComparator = (a, b) => {\n const compareId = UUID.Comparator(a.#uuid, b.#uuid);\n if (compareId !== 0) {\n return compareId;\n }\n return b.#fieldKeys.length - a.#fieldKeys.length;\n };\n static #EMPTY_FIELD_KEYS = new Int16Array(0);\n #uuid;\n #fieldKeys;\n constructor(uuid, fieldKeys) {\n this.#uuid = uuid;\n this.#fieldKeys = fieldKeys;\n }\n get uuid() { return this.#uuid; }\n get fieldKeys() { return this.#fieldKeys; }\n isBox() { return this.#fieldKeys.length === 0; }\n isContent() { return !this.isBox(); }\n equals(other) { return Address.Comparator(this, other) === 0; }\n compareTo(other) { return Address.Comparator(this, other); }\n append(key) {\n return new Address(this.#uuid, new Int16Array([...this.#fieldKeys, key]));\n }\n startsWith(other) {\n return UUID.Comparator(other.#uuid, this.#uuid) === 0\n && other.#fieldKeys.length <= this.#fieldKeys.length\n && other.#fieldKeys.every((value, index) => this.#fieldKeys[index] === value);\n }\n write(output) {\n output.writeBytes(new Int8Array(this.#uuid.buffer));\n output.writeByte(this.#fieldKeys.length);\n this.#fieldKeys.forEach(key => output.writeShort(key));\n }\n decompose() { return [this.#uuid, this.#fieldKeys]; }\n toJSON() { return { uuid: Array.from(this.#uuid.values()), fields: Array.from(this.#fieldKeys.values()) }; }\n toArrayBuffer() {\n const array = new Uint8Array(UUID.length + this.#fieldKeys.length);\n array.set(this.#uuid, 0);\n array.set(this.#fieldKeys, UUID.length);\n return array.buffer;\n }\n toString() { return [UUID.toString(this.#uuid), ...this.#fieldKeys].join(\"/\"); }\n static read(input) {\n const uuidBytes = UUID.fromDataInput(input);\n const numFields = input.readByte();\n return Address.compose(uuidBytes, ...Arrays.create(() => input.readShort(), numFields));\n }\n}\nexport var Addressable;\n(function (Addressable) {\n Addressable.AddressReader = (addressable) => addressable.address;\n Addressable.Comparator = ({ address: a }, { address: b }) => Address.Comparator(a, b);\n Addressable.equals = (address, sorted) => {\n const [l, r] = BinarySearch.rangeMapped(sorted, address, Address.Comparator, Addressable.AddressReader);\n return sorted.slice(l, r + 1);\n };\n Addressable.startsWith = (address, sorted) => {\n const [l, r] = BinarySearch.rangeMapped(sorted, address, Address.MinimalComparator, Addressable.AddressReader);\n return sorted\n .slice(l, r + 1)\n .filter((addressable) => addressable.address.startsWith(address));\n };\n Addressable.endsWith = (address, sorted) => {\n const l = BinarySearch.leftMostMapped(sorted, address, Address.LengthComparator, Addressable.AddressReader);\n const r = BinarySearch.rightMostMapped(sorted, address, Address.MinimalComparator, Addressable.AddressReader);\n return sorted\n .slice(l, r + 1)\n .filter((addressable) => address.startsWith(addressable.address));\n };\n})(Addressable || (Addressable = {}));\n", "import { Iterables, Listeners, Option, panic } from \"@opendaw/lib-std\";\nimport { Address } from \"./address\";\nexport class PointerHub {\n static validate(pointer, target) {\n if (pointer.address.equals(target.address)) {\n return Option.wrap(`PointerField cannot point to itself: ${pointer}`);\n }\n if (!target.pointerRules.accepts.some((type) => type === pointer.pointerType)) {\n console.warn(target.pointerRules);\n return Option.wrap(`${pointer.toString()} does not satisfy any of the allowed types (${(target.pointerRules)}).`);\n }\n return Option.None;\n }\n #vertex;\n #immediateListeners;\n #transactualListeners;\n #inTransaction = Option.None;\n constructor(vertex) {\n this.#vertex = vertex;\n this.#immediateListeners = new Listeners();\n this.#transactualListeners = new Listeners();\n }\n subscribeImmediate(listener, ...filter) {\n return this.#addFilteredListener(this.#immediateListeners, listener, filter);\n }\n subscribeTransactual(listener, ...filter) {\n return this.#addFilteredListener(this.#transactualListeners, listener, filter);\n }\n catchupAndSubscribeTransactual(listener, ...filter) {\n const added = Address.newSet(pointer => pointer.address);\n added.addMany(this.filter(...filter));\n added.forEach(pointer => listener.onAdd(pointer));\n // This takes track of the listeners notification state.\n // It is possible that the pointer has been added, but it has not been notified yet.\n // That would cause the listener.onAdd method to be involked twice.\n return this.subscribeTransactual({\n onAdd: (pointer) => {\n if (added.add(pointer)) {\n listener.onAdd(pointer);\n }\n },\n onRemove: (pointer) => {\n added.removeByKey(pointer.address);\n listener.onRemove(pointer);\n }\n }, ...filter);\n }\n filter(...types) {\n return (types.length === 0 ? this.incoming() : Iterables.filter(this, (pointerField) => types.some((type) => type === pointerField.pointerType)));\n }\n size() { return this.incoming().length; }\n isEmpty() { return this.size() === 0; }\n nonEmpty() { return this.size() > 0; }\n contains(pointer) { return this.incoming().some(incoming => pointer.address.equals(incoming.address)); }\n incoming() { return this.#vertex.graph.edges().incomingEdgesOf(this.#vertex); }\n onAdded(pointerField) {\n const issue = PointerHub.validate(pointerField, this.#vertex);\n if (issue.nonEmpty()) {\n return panic(issue.unwrap());\n }\n if (this.#inTransaction.isEmpty()) {\n this.#vertex.graph.subscribeEndTransaction(this.#onEndTransaction);\n this.#inTransaction = Option.wrap(new Set(this));\n }\n this.#immediateListeners.proxy.onAdd(pointerField);\n }\n onRemoved(pointerField) {\n if (this.#inTransaction.isEmpty()) {\n this.#vertex.graph.subscribeEndTransaction(this.#onEndTransaction);\n this.#inTransaction = Option.wrap(new Set(this));\n }\n this.#immediateListeners.proxy.onRemove(pointerField);\n }\n [Symbol.iterator]() { return this.incoming().values(); }\n toString() {\n return `{Pointers ${this.#vertex.address}, pointers: ${Array.from(this)\n .map((pointerField) => pointerField.toString())}}`;\n }\n #addFilteredListener(listeners, listener, filter) {\n return listeners.subscribe({\n onAdd: (pointer) => {\n if (filter.length === 0 || filter.some((type) => type === pointer.pointerType)) {\n listener.onAdd(pointer);\n }\n },\n onRemove: (pointer) => {\n if (filter.length === 0 || filter.some((type) => type === pointer.pointerType)) {\n listener.onRemove(pointer);\n }\n }\n });\n }\n #onEndTransaction = () => {\n if (this.#vertex.isAttached()) {\n const beforeState = this.#inTransaction.unwrap(\"Callback without transaction\");\n const afterState = new Set(this);\n beforeState.forEach(pointer => {\n if (!afterState.has(pointer)) {\n this.#transactualListeners.proxy.onRemove(pointer);\n }\n });\n afterState.forEach(pointer => {\n if (!beforeState.has(pointer)) {\n this.#transactualListeners.proxy.onAdd(pointer);\n }\n });\n }\n this.#inTransaction = Option.None;\n };\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nimport { Iterables, Lazy, Option, panic, safeExecute } from \"@opendaw/lib-std\";\nimport { Address } from \"./address\";\nimport { PointerHub } from \"./pointer-hub\";\nexport class Field {\n static hook(construct) {\n return new Field(construct);\n }\n #parent;\n #fieldKey;\n #fieldName;\n #pointerRules;\n constructor({ parent, fieldKey, fieldName, pointerRules }) {\n this.#parent = parent;\n this.#fieldKey = fieldKey;\n this.#fieldName = fieldName;\n this.#pointerRules = pointerRules;\n if (pointerRules.mandatory) {\n this.graph.edges().watchVertex(this);\n }\n }\n accept(visitor) {\n return safeExecute(visitor.visitField, this);\n }\n get box() { return this.#parent.box; }\n get graph() { return this.#parent.graph; }\n get parent() { return this.#parent; }\n get fieldKey() { return this.#fieldKey; }\n get fieldName() { return this.#fieldName; }\n get pointerRules() { return this.#pointerRules; }\n get pointerHub() { return new PointerHub(this); }\n get address() { return this.#parent.address.append(this.#fieldKey); }\n get debugPath() {\n return `${this.box.name}:${this.box.mapFields(field => field.fieldName, ...this.address.fieldKeys).join(\"/\")}`;\n }\n isBox() { return false; }\n isField() { return true; }\n isAttached() { return this.graph.findBox(this.address.uuid).nonEmpty(); }\n fields() { return Iterables.empty(); }\n getField(_key) { return panic(); }\n optField(_key) { return Option.None; }\n read(_input) { }\n write(_output) { }\n disconnect() {\n if (this.pointerHub.isEmpty()) {\n return;\n }\n const incoming = this.pointerHub.incoming();\n incoming.forEach(pointer => {\n pointer.defer();\n if (pointer.mandatory || (this.pointerRules.mandatory && incoming.length === 1)) {\n pointer.box.delete();\n }\n });\n }\n toString() { return `{${this.box.constructor.name}:${this.constructor.name} (${this.fieldName}) ${this.address.toString()}`; }\n}\n__decorate([\n Lazy,\n __metadata(\"design:type\", PointerHub),\n __metadata(\"design:paramtypes\", [])\n], Field.prototype, \"pointerHub\", null);\n__decorate([\n Lazy,\n __metadata(\"design:type\", Address),\n __metadata(\"design:paramtypes\", [])\n], Field.prototype, \"address\", null);\n__decorate([\n Lazy,\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], Field.prototype, \"debugPath\", null);\n", "export const NoPointers = Object.freeze({ mandatory: false, accepts: [] });\n", "import { assert, ByteArrayInput, ByteArrayOutput } from \"@opendaw/lib-std\";\nexport var Serializer;\n(function (Serializer) {\n const MAGIC_HEADER = 0x464c4453;\n Serializer.writeFields = (output, fields) => {\n const entries = Object.entries(fields);\n output.writeInt(MAGIC_HEADER);\n output.writeShort(entries.length);\n entries.forEach(([key, field]) => {\n const bytes = ByteArrayOutput.create();\n field.write(bytes);\n const buffer = new Int8Array(bytes.toArrayBuffer());\n output.writeShort(Number(key));\n output.writeInt(buffer.length);\n output.writeBytes(buffer);\n });\n };\n Serializer.readFields = (input, fields) => {\n assert(input.readInt() === MAGIC_HEADER, \"Serializer header is corrupt\");\n const numFields = input.readShort();\n for (let fieldIndex = 0; fieldIndex < numFields; fieldIndex++) {\n const key = input.readShort();\n const byteLength = input.readInt();\n const bytes = new Int8Array(byteLength);\n input.readBytes(bytes);\n fields[key]?.read(new ByteArrayInput(bytes.buffer));\n }\n };\n})(Serializer || (Serializer = {}));\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nimport { Address } from \"./address\";\nimport { Arrays, asDefined, asInstanceOf, ByteArrayOutput, ByteCounter, Lazy, Option } from \"@opendaw/lib-std\";\nimport { PointerHub } from \"./pointer-hub\";\nimport { Serializer } from \"./serializer\";\nexport class Box {\n static DEBUG_DELETION = false;\n static Index = 0 | 0;\n #address;\n #graph;\n #name;\n #pointerRules;\n #fields;\n #creationIndex = Box.Index++;\n constructor({ uuid, graph, name, pointerRules }) {\n this.#address = Address.compose(uuid);\n this.#graph = graph;\n this.#name = name;\n this.#pointerRules = pointerRules;\n this.#fields = this.initializeFields();\n if (pointerRules.mandatory) {\n this.graph.edges().watchVertex(this);\n }\n }\n fields() { return Object.values(this.#fields); }\n getField(key) { return asDefined(this.#fields[key]); }\n optField(key) { return Option.wrap(this.#fields[key]); }\n subscribe(propagation, procedure) {\n return this.graph.subscribeVertexUpdates(propagation, this.address, procedure);\n }\n get box() { return this; }\n get name() { return this.#name; }\n get graph() { return this.#graph; }\n get parent() { return this; }\n get address() { return this.#address; }\n get pointerRules() { return this.#pointerRules; }\n get creationIndex() { return this.#creationIndex; }\n get pointerHub() { return new PointerHub(this); }\n estimateMemory() {\n const byteCounter = new ByteCounter();\n this.write(byteCounter);\n return byteCounter.count;\n }\n isBox() { return true; }\n asBox(type) { return asInstanceOf(this, type); }\n isField() { return false; }\n isAttached() { return this.#graph.findBox(this.address.uuid).nonEmpty(); }\n read(input) { Serializer.readFields(input, this.#fields); }\n write(output) { Serializer.writeFields(output, this.#fields); }\n serialize() {\n const output = ByteArrayOutput.create();\n output.writeInt(this.#creationIndex); // allows to re-load the boxes in the same order as created\n output.writeString(this.name);\n output.writeBytes(new Int8Array(this.address.uuid.buffer));\n this.write(output);\n return output.toArrayBuffer();\n }\n toArrayBuffer() {\n const output = ByteArrayOutput.create();\n this.write(output);\n return output.toArrayBuffer();\n }\n incomingEdges() { return this.graph.edges().incomingEdgesOf(this); }\n outgoingEdges() { return this.graph.edges().outgoingEdgesOf(this); }\n mapFields(map, ...keys) {\n if (keys.length === 0) {\n return Arrays.empty();\n }\n let parent = this.getField(keys[0]);\n const result = [map(parent)];\n for (let index = 1; index < keys.length; index++) {\n parent = parent.getField(keys[index]);\n result.push(map(parent));\n }\n return result;\n }\n searchVertex(keys) {\n if (keys.length === 0) {\n return Option.wrap(this);\n }\n let parent = this.optField(keys[0]);\n if (parent.isEmpty()) {\n return Option.None;\n }\n for (let index = 1; index < keys.length; index++) {\n parent = parent.unwrap().optField(keys[index]);\n if (parent.isEmpty()) {\n return Option.None;\n }\n }\n return parent;\n }\n delete() {\n const { boxes, pointers } = this.graph.dependenciesOf(this);\n if (Box.DEBUG_DELETION) {\n console.debug(`Delete ${this.toString()}`);\n console.debug(\"\\tunplugs\", [...pointers].map(x => x.toString()).join(\"\\n\"));\n console.debug(\"\\tunstages\", [...boxes].map(x => x.toString()).join(\"\\n\"), this);\n }\n for (const pointer of pointers) {\n pointer.defer();\n }\n for (const box of boxes) {\n box.unstage();\n }\n this.unstage();\n }\n unstage() { this.graph.unstageBox(this); }\n toString() { return `${this.constructor.name} ${this.address.toString()}`; }\n}\n__decorate([\n Lazy,\n __metadata(\"design:type\", PointerHub),\n __metadata(\"design:paramtypes\", [])\n], Box.prototype, \"pointerHub\", null);\n", "import { Terminator, Unhandled } from \"@opendaw/lib-std\";\nimport { Addressable } from \"./address\";\nexport var Propagation;\n(function (Propagation) {\n Propagation[Propagation[\"This\"] = 0] = \"This\";\n Propagation[Propagation[\"Parent\"] = 1] = \"Parent\";\n Propagation[Propagation[\"Children\"] = 2] = \"Children\";\n})(Propagation || (Propagation = {}));\nexport var Dispatchers;\n(function (Dispatchers) {\n Dispatchers.create = () => new DispatchersImpl();\n})(Dispatchers || (Dispatchers = {}));\nclass DispatchersImpl {\n #thisDispatcher = new Dispatcher(Addressable.equals);\n #parentDispatcher = new Dispatcher(Addressable.startsWith);\n #childrenDispatcher = new Dispatcher(Addressable.endsWith);\n #deferredStations = [];\n #order = 0 | 0;\n #dispatching = false;\n subscribe(propagation, address, procedure) {\n const monitor = new Monitor(address, propagation, this.#order++, procedure);\n if (this.#dispatching) {\n const deferred = new DeferredMonitor(monitor, propagation);\n this.#deferredStations.push(deferred);\n return deferred;\n }\n else {\n return this.subscribeMonitor(monitor, propagation);\n }\n }\n dispatch(target) {\n this.#dispatching = true;\n const invoked = [\n ...this.#thisDispatcher.filter(target),\n ...this.#parentDispatcher.filter(target),\n ...this.#childrenDispatcher.filter(target)\n ];\n invoked\n .sort(({ order: a }, { order: b }) => a - b)\n .forEach((station) => station.procedure(target));\n this.#dispatching = false;\n this.#deferredStations.forEach((station) => station.subscribe(this));\n this.#deferredStations.length = 0;\n }\n subscribeMonitor(monitor, propagation) {\n switch (propagation) {\n case Propagation.This:\n return this.#thisDispatcher.subscribe(monitor);\n case Propagation.Parent:\n return this.#parentDispatcher.subscribe(monitor);\n case Propagation.Children:\n return this.#childrenDispatcher.subscribe(monitor);\n default:\n return Unhandled(propagation);\n }\n }\n countStations() {\n return this.#thisDispatcher.count() + this.#parentDispatcher.count() + this.#childrenDispatcher.count();\n }\n}\nclass Monitor {\n address;\n propagation;\n order;\n procedure;\n constructor(address, propagation, order, procedure) {\n this.address = address;\n this.propagation = propagation;\n this.order = order;\n this.procedure = procedure;\n }\n toString() {\n return `{ Monitor address: ${this.address}, propagation: ${Propagation[this.propagation]}, order: ${this.order} }`;\n }\n}\nclass Dispatcher {\n filterStrategy;\n #monitors = [];\n #sorted = true;\n constructor(filterStrategy) {\n this.filterStrategy = filterStrategy;\n }\n subscribe(monitor) {\n this.#monitors.push(monitor);\n this.#sorted = this.#monitors.length < 2;\n return {\n terminate: () => {\n let index = this.#monitors.length;\n while (--index >= 0) {\n if (this.#monitors[index] === monitor) {\n this.#monitors.splice(index, 1);\n }\n }\n }\n };\n }\n stations() {\n if (!this.#sorted) {\n this.#monitors.sort(Addressable.Comparator);\n this.#sorted = true;\n }\n return this.#monitors;\n }\n filter(target) { return this.filterStrategy(target.address, this.stations()); }\n count() { return this.#monitors.length; }\n}\nclass DeferredMonitor {\n monitor;\n propagation;\n #terminator = new Terminator();\n #terminated = false;\n constructor(monitor, propagation) {\n this.monitor = monitor;\n this.propagation = propagation;\n }\n subscribe(dispatchers) {\n if (this.#terminated) {\n return;\n }\n this.#terminator.terminate();\n this.#terminator.own(dispatchers.subscribeMonitor(this.monitor, this.propagation));\n }\n terminate() {\n this.#terminated = true;\n this.#terminator.terminate();\n }\n}\n", "import { Field } from \"./field\";\nimport { assert, Float, Integer, safeExecute } from \"@opendaw/lib-std\";\nimport { Propagation } from \"./dispatchers\";\nexport var PrimitiveType;\n(function (PrimitiveType) {\n PrimitiveType[\"Boolean\"] = \"boolean\";\n PrimitiveType[\"Float32\"] = \"float32\";\n PrimitiveType[\"Int32\"] = \"int32\";\n PrimitiveType[\"String\"] = \"string\";\n PrimitiveType[\"Bytes\"] = \"bytes\";\n})(PrimitiveType || (PrimitiveType = {}));\nexport const ValueSerialization = {\n [PrimitiveType.Boolean]: {\n type: PrimitiveType.Boolean,\n encode: (output, value) => output.writeBoolean(value),\n decode: (input) => input.readBoolean()\n },\n [PrimitiveType.Float32]: {\n type: PrimitiveType.Float32,\n encode: (output, value) => output.writeFloat(value),\n decode: (input) => input.readFloat()\n },\n [PrimitiveType.Int32]: {\n type: PrimitiveType.Int32,\n encode: (output, value) => output.writeInt(value),\n decode: (input) => input.readInt()\n },\n [PrimitiveType.String]: {\n type: PrimitiveType.String,\n encode: (output, value) => output.writeString(value),\n decode: (input) => input.readString()\n },\n [PrimitiveType.Bytes]: {\n type: PrimitiveType.Bytes,\n encode: (output, value) => {\n output.writeInt(value.length);\n output.writeBytes(value);\n },\n decode: (input) => {\n const array = new Int8Array(input.readInt());\n input.readBytes(array);\n return array;\n }\n }\n};\nexport class PrimitiveField extends Field {\n #type;\n #initValue;\n #value;\n constructor(field, type, value) {\n super(field);\n this.#type = type;\n this.#initValue = this.clamp(value);\n this.#value = this.#initValue;\n }\n accept(visitor) {\n return safeExecute(visitor.visitPrimitiveField, this);\n }\n subscribe(observer) {\n return this.graph.subscribeVertexUpdates(Propagation.This, this.address, () => observer(this));\n }\n catchupAndSubscribe(observer) {\n observer(this);\n return this.subscribe(observer);\n }\n get type() { return this.#type; }\n get initValue() { return this.#initValue; }\n setInitValue(value) {\n assert(this.graph.constructingBox(), \"Cannot change initial value at runtime\");\n this.setValue(this.#initValue = value);\n }\n getValue() { return this.#value; }\n setValue(value) {\n const oldValue = this.#value;\n const newValue = this.clamp(value);\n if (this.equals(newValue)) {\n return;\n }\n this.#value = value;\n this.graph.onPrimitiveValueUpdate(this, oldValue, newValue);\n }\n writeValue(output, value) { this.serialization().encode(output, value); }\n readValue(input) { return this.serialization().decode(input); }\n reset() { this.setValue(this.#initValue); }\n}\nexport class BooleanField extends PrimitiveField {\n static create(construct, value = false) {\n return new BooleanField(construct, value);\n }\n constructor(construct, value) { super(construct, PrimitiveType.Boolean, value); }\n toggle() { this.setValue(!this.getValue()); }\n serialization() { return ValueSerialization[PrimitiveType.Boolean]; }\n equals(value) { return this.getValue() === value; }\n clamp(value) { return value; }\n read(input) { this.setValue(input.readBoolean()); }\n write(output) { output.writeBoolean(this.getValue()); }\n}\nexport class Float32Field extends PrimitiveField {\n static create(construct, value = 0.0) {\n return new Float32Field(construct, value);\n }\n constructor(construct, value) { super(construct, PrimitiveType.Float32, value); }\n serialization() { return ValueSerialization[PrimitiveType.Float32]; }\n equals(value) { return this.getValue() === value; }\n clamp(value) { return Float.toFloat32(value); }\n read(input) { this.setValue(input.readFloat()); }\n write(output) { output.writeFloat(this.getValue()); }\n}\nexport class Int32Field extends PrimitiveField {\n static create(construct, value = 0) {\n return new Int32Field(construct, value);\n }\n constructor(construct, value) { super(construct, PrimitiveType.Int32, value); }\n serialization() { return ValueSerialization[PrimitiveType.Int32]; }\n equals(value) { return this.getValue() === value; }\n clamp(value) { return Integer.toInt(value); }\n read(input) { this.setValue(input.readInt()); }\n write(output) { output.writeInt(this.getValue()); }\n}\nexport class StringField extends PrimitiveField {\n static create(construct, value = \"\") {\n return new StringField(construct, value);\n }\n constructor(construct, value) { super(construct, PrimitiveType.String, value); }\n serialization() { return ValueSerialization[PrimitiveType.String]; }\n equals(value) { return this.getValue() === value; }\n clamp(value) { return value; }\n read(input) { this.setValue(input.readString()); }\n write(output) { output.writeString(this.getValue()); }\n}\nexport class ByteArrayField extends PrimitiveField {\n static create(construct, value = this.#empty) {\n return new ByteArrayField(construct, value);\n }\n static #empty = Object.freeze(new Int8Array(0));\n constructor(construct, value) { super(construct, PrimitiveType.Bytes, value); }\n serialization() { return ValueSerialization[PrimitiveType.Bytes]; }\n equals(value) {\n return this.getValue().length === value.length && this.getValue().every((x, index) => value[index] === x);\n }\n clamp(value) { return value; }\n read(input) {\n const bytes = new Int8Array(input.readInt());\n input.readBytes(bytes);\n this.setValue(bytes);\n }\n write(output) {\n const bytes = this.getValue();\n output.writeInt(bytes.length);\n output.writeBytes(bytes);\n }\n}\n", "import { ValueSerialization } from \"./primitive\";\nimport { Address } from \"./address\";\nimport { Arrays, ByteArrayInput, Option, UUID } from \"@opendaw/lib-std\";\nexport var Updates;\n(function (Updates) {\n Updates.decode = (input) => {\n const numBlocks = input.readInt();\n return Arrays.create(() => {\n const type = input.readString();\n switch (type) {\n case \"new\": {\n const uuid = UUID.fromDataInput(input);\n const name = input.readString();\n const settings = new Int8Array(input.readInt());\n input.readBytes(settings);\n return new NewUpdate(uuid, name, settings.buffer);\n }\n case \"pointer\": {\n const address = Address.read(input);\n const oldAddress = input.readBoolean() ? Option.wrap(Address.read(input)) : Option.None;\n const newAddress = input.readBoolean() ? Option.wrap(Address.read(input)) : Option.None;\n return new PointerUpdate(address, oldAddress, newAddress);\n }\n case \"primitive\": {\n const address = Address.read(input);\n const type = input.readString();\n const serializer = ValueSerialization[type];\n const oldValue = serializer.decode(input);\n const newValue = serializer.decode(input);\n return new PrimitiveUpdate(address, serializer, oldValue, newValue);\n }\n case \"delete\": {\n const uuid = UUID.fromDataInput(input);\n const name = input.readString();\n const settings = new Int8Array(input.readInt());\n input.readBytes(settings);\n return new DeleteUpdate(uuid, name, settings.buffer);\n }\n }\n }, numBlocks);\n };\n})(Updates || (Updates = {}));\nexport class NewUpdate {\n type = \"new\";\n #uuid;\n #name;\n #settings;\n constructor(uuid, name, settings) {\n this.#uuid = uuid;\n this.#name = name;\n this.#settings = settings;\n }\n get uuid() { return this.#uuid; }\n get name() { return this.#name; }\n get settings() { return this.#settings; }\n forward(graph) {\n graph.createBox(this.#name, this.#uuid, box => box.read(new ByteArrayInput(this.#settings)));\n }\n inverse(graph) {\n graph.findBox(this.#uuid).unwrap(() => `Could not find ${this.#name}`).unstage();\n }\n write(output) {\n output.writeString(this.type);\n UUID.toDataOutput(output, this.#uuid);\n output.writeString(this.#name);\n output.writeInt(this.#settings.byteLength);\n output.writeBytes(new Int8Array(this.#settings));\n }\n toString() {\n return `{NewUpdate uuid: ${UUID.toString(this.#uuid)}, attachment: ${this.settings.byteLength}b`;\n }\n toDebugString(_graph) { return this.toString(); }\n}\nexport class PrimitiveUpdate {\n type = \"primitive\";\n #address;\n #serialization;\n #oldValue;\n #newValue;\n constructor(address, serialization, oldValue, newValue) {\n this.#address = address;\n this.#serialization = serialization;\n this.#oldValue = oldValue;\n this.#newValue = newValue;\n }\n get address() { return this.#address; }\n get oldValue() { return this.#oldValue; }\n get newValue() { return this.#newValue; }\n matches(field) { return field.address.equals(this.address); }\n inverse(graph) { this.field(graph).setValue(this.#oldValue); }\n forward(graph) { this.field(graph).setValue(this.#newValue); }\n field(graph) {\n return graph.findVertex(this.#address)\n .unwrap(() => `Could not find PrimitiveField at ${this.#address}`);\n }\n write(output) {\n output.writeString(this.type);\n this.#address.write(output);\n output.writeString(this.#serialization.type);\n this.#serialization.encode(output, this.#oldValue);\n this.#serialization.encode(output, this.#newValue);\n }\n toString() {\n return `{PrimitiveUpdate oldValue: ${this.#oldValue}, newValue: ${this.#newValue}`;\n }\n}\nexport class PointerUpdate {\n type = \"pointer\";\n #address;\n #oldValue;\n #newValue;\n constructor(address, oldValue, newValue) {\n this.#address = address;\n this.#oldValue = oldValue;\n this.#newValue = newValue;\n }\n get address() { return this.#address; }\n get oldValue() { return this.#oldValue; }\n get newValue() { return this.#newValue; }\n matches(field) { return field.address.equals(this.address); }\n inverse(graph) { this.field(graph).targetAddress = this.#oldValue; }\n forward(graph) { this.field(graph).targetAddress = this.#newValue; }\n field(graph) {\n return graph.findVertex(this.#address)\n .unwrap(() => `Could not find PointerField at ${this.#address}`);\n }\n write(output) {\n output.writeString(this.type);\n this.#address.write(output);\n this.#oldValue.match({\n none: () => output.writeBoolean(false),\n some: address => {\n output.writeBoolean(true);\n address.write(output);\n }\n });\n this.#newValue.match({\n none: () => output.writeBoolean(false),\n some: address => {\n output.writeBoolean(true);\n address.write(output);\n }\n });\n }\n toString() {\n return `{PointerUpdate oldValue: ${this.#oldValue.unwrapOrNull()}, newValue: ${this.#newValue.unwrapOrNull()}`;\n }\n}\nexport class DeleteUpdate {\n type = \"delete\";\n #uuid;\n #name;\n #settings;\n constructor(uuid, name, settings) {\n this.#uuid = uuid;\n this.#name = name;\n this.#settings = settings;\n }\n get uuid() { return this.#uuid; }\n get name() { return this.#name; }\n get settings() { return this.#settings; }\n forward(graph) {\n graph.findBox(this.#uuid).unwrap(() => `Could not find ${this.#name}`).unstage();\n }\n inverse(graph) {\n graph.createBox(this.#name, this.#uuid, box => box.read(new ByteArrayInput(this.#settings)));\n }\n write(output) {\n output.writeString(this.type);\n UUID.toDataOutput(output, this.#uuid);\n output.writeString(this.#name);\n output.writeInt(this.#settings.byteLength);\n output.writeBytes(new Int8Array(this.#settings));\n }\n toString() {\n return `{DeleteUpdate uuid: ${UUID.toString(this.#uuid)}, attachment: ${this.settings.byteLength}b`;\n }\n}\n", "import { Option, panic, safeExecute } from \"@opendaw/lib-std\";\nimport { Address } from \"./address\";\nimport { PointerHub } from \"./pointer-hub\";\nimport { Field } from \"./field\";\nimport { Propagation } from \"./dispatchers\";\nconst _Unreferenceable = Symbol(\"Unreferenceable\");\nexport class PointerField extends Field {\n static create(construct, pointerType, mandatory) {\n return new PointerField(construct, pointerType, mandatory);\n }\n #pointerType;\n #mandatory;\n #targetVertex = Option.None;\n #targetAddress = Option.None;\n constructor(field, pointerType, mandatory) {\n super(field);\n this.#pointerType = pointerType;\n this.#mandatory = mandatory;\n if (mandatory) {\n this.graph.edges().watchVertex(this);\n }\n }\n get pointerHub() { return panic(`${this} cannot be pointed to`); }\n get pointerType() { return this.#pointerType; }\n get mandatory() { return this.#mandatory; }\n accept(visitor) {\n return safeExecute(visitor.visitPointerField, this);\n }\n subscribe(observer) {\n return this.graph.subscribeVertexUpdates(Propagation.This, this.address, () => observer(this));\n }\n catchupAndSubscribe(observer) {\n observer(this);\n return this.graph.subscribeVertexUpdates(Propagation.This, this.address, () => this.graph.subscribeEndTransaction(() => observer(this)));\n }\n refer(vertex) {\n this.targetVertex = Option.wrap(vertex);\n }\n defer() { this.targetVertex = Option.None; }\n get targetVertex() { return this.#targetVertex; }\n set targetVertex(option) {\n if (option.nonEmpty()) {\n const issue = PointerHub.validate(this, option.unwrap());\n if (issue.nonEmpty()) {\n panic(issue.unwrap());\n }\n }\n this.targetAddress = option.map(vertex => vertex.address);\n }\n get targetAddress() { return this.#targetAddress; }\n set targetAddress(newValue) {\n const oldValue = this.#targetAddress;\n if ((oldValue.isEmpty() && newValue.isEmpty())\n || (newValue.nonEmpty() && oldValue.unwrapOrNull()?.equals(newValue.unwrap())) === true) {\n return;\n }\n this.#targetAddress = newValue;\n this.graph.onPointerAddressUpdated(this, oldValue, newValue);\n }\n isEmpty() { return this.targetAddress.isEmpty(); }\n nonEmpty() { return this.targetAddress.nonEmpty(); }\n resolve() {\n const targetAddress = this.targetAddress;\n const target = targetAddress.flatMap((address) => this.graph.findVertex(address));\n if (targetAddress.nonEmpty() && target.isEmpty()) {\n return panic(`${targetAddress.unwrapOrNull()?.toString()} could not be resolved`);\n }\n this.#targetVertex = target;\n }\n read(input) {\n this.targetAddress = input.readBoolean() ? Option.wrap(Address.read(input)) : Option.None;\n }\n write(output) {\n this.#targetAddress.match({\n none: () => output.writeBoolean(false),\n some: address => {\n output.writeBoolean(true);\n address.write(output);\n }\n });\n }\n}\n", "const key = Symbol.for(\"@openDAW/lib-box\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nexport * from \"./address\";\nexport * from \"./array\";\nexport * from \"./box\";\nexport * from \"./dispatchers\";\nexport * from \"./editing\";\nexport * from \"./field\";\nexport * from \"./graph\";\nexport * from \"./graph-edges\";\nexport * from \"./object\";\nexport * from \"./pointer\";\nexport * from \"./pointer-hub\";\nexport * from \"./primitive\";\nexport * from \"./sync\";\nexport * from \"./sync-source\";\nexport * from \"./sync-target\";\nexport * from \"./updates\";\nexport * from \"./vertex\";\n", "// noinspection PlatformDetectionJS\nexport var Browser;\n(function (Browser) {\n const hasLocation = typeof self !== \"undefined\" && \"location\" in self && typeof self.location !== undefined;\n const hasNavigator = typeof self !== \"undefined\" && \"navigator\" in self && typeof self.navigator !== undefined;\n Browser.isLocalHost = () => hasLocation && location.host.includes(\"localhost\");\n Browser.isMacOS = () => hasNavigator && navigator.userAgent.includes(\"Mac OS X\");\n Browser.isWindows = () => hasNavigator && navigator.userAgent.includes(\"Windows\");\n Browser.isFirefox = () => hasNavigator && navigator.userAgent.toLowerCase().includes(\"firefox\");\n Browser.isWeb = () => !Browser.isTauriApp();\n Browser.isTauriApp = () => \"__TAURI__\" in window;\n Browser.userAgent = hasNavigator ? navigator.userAgent\n .replace(/^Mozilla\\/[\\d.]+\\s*/, \"\")\n .replace(/\\bAppleWebKit\\/[\\d.]+\\s*/g, \"\")\n .replace(/\\(KHTML, like Gecko\\)\\s*/g, \"\")\n .replace(/\\bSafari\\/[\\d.]+\\s*/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim() : \"N/A\";\n})(Browser || (Browser = {}));\n", "export var Compression;\n(function (Compression) {\n Compression.encode = async (buffer, format = \"gzip\") => {\n const stream = new CompressionStream(format);\n const writer = stream.writable.getWriter();\n writer.write(new Uint8Array(buffer));\n writer.close();\n return new Response(stream.readable).arrayBuffer();\n };\n Compression.decode = async (buffer, format = \"gzip\") => {\n const stream = new DecompressionStream(format);\n const writer = stream.writable.getWriter();\n writer.write(new Uint8Array(buffer));\n writer.close();\n return new Response(stream.readable).arrayBuffer();\n };\n})(Compression || (Compression = {}));\n", "import { DefaultObservableValue, EmptyProcedure } from \"@opendaw/lib-std\";\nexport var ConsoleCommands;\n(function (ConsoleCommands) {\n ConsoleCommands.exportMethod = (path, callback) => store(path, { value: callback });\n ConsoleCommands.exportBoolean = (path, init = false) => {\n const observableValue = new DefaultObservableValue(init);\n ConsoleCommands.exportAccessor(path, () => observableValue.getValue(), input => {\n const value = Boolean(input);\n console.debug(`set to ${value}`);\n observableValue.setValue(value);\n });\n return observableValue;\n };\n ConsoleCommands.exportAccessor = (path, getter, setter = EmptyProcedure) => store(path, {\n get: () => {\n try {\n console.debug(getter());\n return 0;\n }\n catch (error) {\n console.error(error);\n return 1;\n }\n },\n set: (value) => {\n try {\n setter(value);\n return getter();\n }\n catch (error) {\n console.error(error);\n return 1;\n }\n },\n enumerable: false,\n configurable: false\n });\n const global = (() => { try {\n return self;\n }\n catch (_) {\n return {};\n } })();\n const scope = (global[\"opendaw\"] ??= {});\n const store = (path, attributes) => {\n const levels = path.split(\".\");\n const name = levels.splice(-1)[0];\n let current = scope;\n for (const level of levels) {\n current = (current[level] ??= {});\n }\n Object.defineProperty(current, name, attributes);\n console.debug(`Console command 'opendaw.${path}' exported`);\n };\n})(ConsoleCommands || (ConsoleCommands = {}));\n", "const ellipsis = \"\u2026\";\nexport var Context2d;\n(function (Context2d) {\n Context2d.truncateText = (context, text, maxWidth) => {\n if (text.length === 0) {\n return { text: \"\", width: 0 };\n }\n let width = context.measureText(text).width;\n if (width <= maxWidth) {\n return { text, width };\n }\n const ellipseWidth = context.measureText(ellipsis).width;\n let l = 0 | 0;\n let r = text.length | 0;\n while (l < r) {\n const mid = (r + l) >>> 1;\n width = context.measureText(text.substring(0, mid + 1)).width + ellipseWidth;\n if (width <= maxWidth) {\n l = mid + 1;\n }\n else {\n r = mid;\n }\n }\n if (l === 0) {\n return { text: \"\", width: 0 };\n }\n const result = text.substring(0, l);\n return { text: result + ellipsis, width: context.measureText(result).width + ellipseWidth };\n };\n})(Context2d || (Context2d = {}));\n", "import { panic } from \"@opendaw/lib-std\";\nexport var CssUtils;\n(function (CssUtils) {\n CssUtils.calc = (term, size, em) => {\n const regex = /([0-9]*\\.?[0-9]+)([a-zA-Z%]*)/g;\n let result = term;\n result.split(/\\+|(?<!\\d)-/)\n .flatMap(result => Array.from(result.matchAll(regex)))\n .forEach(([replace, digits, unit]) => {\n const number = parseFloat(digits);\n if (isNaN(number)) {\n return panic(`${replace} does not contain a number`);\n }\n if (unit === \"em\") {\n result = result.replaceAll(replace, `${number * em}`);\n }\n else if (unit === \"%\") {\n result = result.replaceAll(replace, `${number / 100.0 * size}`);\n }\n else if (unit === \"px\") {\n result = result.replaceAll(replace, `${number}`);\n }\n else {\n return panic(`Unknown unit '${unit}'`);\n }\n });\n return Function(`return ${result}`)();\n };\n const customCursors = new Map();\n CssUtils.registerCustomCursor = (identifier, data) => customCursors.set(identifier, data);\n CssUtils.setCursor = (identifier, doc = document) => {\n doc.documentElement.style.cursor = typeof identifier === \"number\"\n ? customCursors.get(identifier) ?? \"auto\"\n : identifier;\n };\n})(CssUtils || (CssUtils = {}));\n", "export var AnimationFrame;\n(function (AnimationFrame) {\n const nonrecurring = new Set();\n const recurring = new Set();\n const queue = new Array();\n let id = -1;\n AnimationFrame.add = (exec) => {\n recurring.add(exec);\n return { terminate: () => recurring.delete(exec) };\n };\n AnimationFrame.once = (exec) => { nonrecurring.add(exec); };\n AnimationFrame.start = () => {\n console.debug(\"AnimationFrame start\");\n const exe = () => {\n if (recurring.size > 0 || nonrecurring.size > 0) {\n recurring.forEach((exec) => queue.push(exec));\n nonrecurring.forEach((exec) => queue.push(exec));\n nonrecurring.clear();\n queue.forEach((exec) => exec());\n queue.length = 0;\n }\n id = requestAnimationFrame(exe);\n };\n id = requestAnimationFrame(exe);\n };\n AnimationFrame.terminate = () => {\n console.debug(\"AnimationFrame terminate\");\n nonrecurring.clear();\n recurring.clear();\n queue.length = 0;\n cancelAnimationFrame(id);\n };\n})(AnimationFrame || (AnimationFrame = {}));\nexport const deferNextFrame = (exec) => new DeferExec(exec);\nexport class DeferExec {\n #exec;\n #requested = false;\n #disabled = false;\n constructor(exec) { this.#exec = exec; }\n request = () => {\n if (this.#requested || this.#disabled) {\n return;\n }\n this.#requested = true;\n AnimationFrame.once(this.#fire);\n };\n immediate = () => {\n if (this.#disabled) {\n return;\n }\n this.#requested = true;\n this.#fire();\n };\n cancel() { this.#requested = false; }\n terminate() { this.#disabled = true; }\n #fire = () => {\n if (this.#disabled || !this.#requested) {\n return;\n }\n this.#requested = false;\n this.#exec();\n };\n}\n", "import { isDefined } from \"@opendaw/lib-std\";\nexport class Events {\n static subscribe(eventTarget, type, listener, options) {\n eventTarget.addEventListener(type, listener, options);\n return { terminate: () => eventTarget.removeEventListener(type, listener, options) };\n }\n static subscribeAny(eventTarget, type, listener, options) {\n eventTarget.addEventListener(type, listener, options);\n return { terminate: () => eventTarget.removeEventListener(type, listener, options) };\n }\n static DOUBLE_DOWN_THRESHOLD = 200;\n static subscribeDblDwn = (eventTarget, listener) => {\n let lastDownTime = 0.0;\n return this.subscribe(eventTarget, \"pointerdown\", event => {\n const now = performance.now();\n if (now - lastDownTime < this.DOUBLE_DOWN_THRESHOLD) {\n listener(event);\n }\n lastDownTime = now;\n }, { capture: true });\n };\n static PreventDefault = event => event.preventDefault();\n static isTextInput = (target) => target instanceof HTMLInputElement\n || target instanceof HTMLTextAreaElement\n || (target instanceof HTMLElement && isDefined(target.getAttribute(\"contenteditable\")));\n}\n", "import { Browser } from \"./browser\";\nimport { Events } from \"./events\";\nexport var Keyboard;\n(function (Keyboard) {\n Keyboard.isControlKey = ({ ctrlKey, metaKey }) => Browser.isMacOS() ? metaKey : ctrlKey;\n Keyboard.isCopyKey = ({ altKey }) => altKey;\n Keyboard.GlobalShortcut = Object.freeze({\n isDelete: (event) => !Events.isTextInput(event.target) && (event.code === \"Delete\" || event.code === \"Backspace\"),\n isSelectAll: (event) => Keyboard.isControlKey(event) && !event.shiftKey && event.code === \"KeyA\",\n isDeselectAll: (event) => Keyboard.isControlKey(event) && event.shiftKey && event.code === \"KeyA\"\n });\n})(Keyboard || (Keyboard = {}));\n", "import { Terminable, Terminator } from \"@opendaw/lib-std\";\nimport { Browser } from \"./browser\";\nimport { AnimationFrame } from \"./frames\";\nimport { Events } from \"./events\";\nimport { Keyboard } from \"./keyboard\";\nexport var Dragging;\n(function (Dragging) {\n Dragging.attach = (target, factory, options) => {\n const processCycle = new Terminator();\n return Terminable.many(processCycle, Events.subscribe(target, \"pointerdown\", (event) => {\n if (options?.multiTouch !== true && !event.isPrimary) {\n return;\n }\n if (event.buttons !== 1 || (Browser.isMacOS() && event.ctrlKey)) {\n return;\n }\n const option = factory(event);\n if (option.isEmpty()) {\n return;\n }\n const process = option.unwrap();\n const pointerId = event.pointerId;\n event.stopPropagation();\n event.stopImmediatePropagation();\n target.setPointerCapture(pointerId);\n const moveEvent = {\n clientX: event.clientX,\n clientY: event.clientY,\n altKey: event.altKey,\n shiftKey: event.shiftKey,\n ctrlKey: Keyboard.isControlKey(event)\n };\n if (options?.immediate === true) {\n process.update(moveEvent);\n }\n if (options?.permanentUpdates === true) {\n processCycle.own(AnimationFrame.add(() => process.update(moveEvent)));\n processCycle.own(Events.subscribe(target, \"pointermove\", (event) => {\n if (event.pointerId === pointerId) {\n moveEvent.clientX = event.clientX;\n moveEvent.clientY = event.clientY;\n moveEvent.altKey = event.altKey;\n moveEvent.shiftKey = event.shiftKey;\n moveEvent.ctrlKey = Keyboard.isControlKey(event);\n }\n }));\n }\n else {\n processCycle.own(Events.subscribe(target, \"pointermove\", (event) => {\n if (event.pointerId === pointerId) {\n moveEvent.clientX = event.clientX;\n moveEvent.clientY = event.clientY;\n moveEvent.altKey = event.altKey;\n moveEvent.shiftKey = event.shiftKey;\n moveEvent.ctrlKey = Keyboard.isControlKey(event);\n process.update(moveEvent);\n }\n }));\n }\n const cancel = () => {\n process.cancel?.call(process);\n process.finally?.call(process);\n processCycle.terminate();\n };\n processCycle.ownAll(Events.subscribe(target, \"pointerup\", (event) => {\n if (event.pointerId === pointerId) {\n process.approve?.call(process);\n process.finally?.call(process);\n processCycle.terminate();\n }\n }, { capture: true }), Events.subscribe(target, \"pointercancel\", (event) => {\n console.debug(event.type);\n if (event.pointerId === pointerId) {\n target.releasePointerCapture(pointerId);\n cancel();\n }\n }, { capture: true }), Events.subscribe(self, \"beforeunload\", (_event) => {\n // Workaround for Chrome (does not release or cancel pointer)\n target.releasePointerCapture(pointerId);\n cancel();\n }, { capture: true }), Events.subscribe(window, \"keydown\", (event) => {\n moveEvent.altKey = event.altKey;\n moveEvent.shiftKey = event.shiftKey;\n moveEvent.ctrlKey = Keyboard.isControlKey(event);\n if (event.key === \"Escape\") {\n cancel();\n }\n else {\n process.update(moveEvent);\n }\n }), Events.subscribe(window, \"keyup\", (event) => {\n moveEvent.altKey = event.altKey;\n moveEvent.shiftKey = event.shiftKey;\n moveEvent.ctrlKey = Keyboard.isControlKey(event);\n process.update(moveEvent);\n }));\n if (process.abortSignal) {\n processCycle.own(Events.subscribe(process.abortSignal, \"abort\", () => {\n target.releasePointerCapture(pointerId);\n cancel();\n }));\n }\n }));\n };\n})(Dragging || (Dragging = {}));\n", "export var Errors;\n(function (Errors) {\n Errors.AbortError = typeof DOMException === \"undefined\"\n ? NaN : Object.freeze(new DOMException(\"AbortError\"));\n Errors.isAbort = (error) => error === Errors.AbortError || (error instanceof DOMException && error.name === \"AbortError\");\n})(Errors || (Errors = {}));\n", "import { Arrays, asDefined, isDefined } from \"@opendaw/lib-std\";\nimport { Promises } from \"@opendaw/lib-runtime\";\nexport var Files;\n(function (Files) {\n Files.save = async (arrayBuffer, options) => {\n if (isDefined(window.showSaveFilePicker)) {\n const handle = await window.showSaveFilePicker(options);\n const writable = await handle.createWritable();\n await writable.truncate(0);\n await writable.write(arrayBuffer);\n await writable.close();\n return handle.name ?? \"unknown\";\n }\n else {\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = options?.suggestedName ?? `unknown`;\n anchor.click();\n URL.revokeObjectURL(url);\n return options?.suggestedName ?? \"Unknown\";\n }\n };\n Files.open = async (options) => {\n if (isDefined(window.showOpenFilePicker)) {\n const { status, value: fileHandles, error } = await Promises.tryCatch(window.showOpenFilePicker(options));\n if (status === \"rejected\") {\n return Promise.reject(error);\n }\n return Promise.all(fileHandles.map(fileHandle => fileHandle.getFile()));\n }\n else {\n return new Promise((resolve, reject) => {\n if (isDefined(options)) {\n console.warn(\"FileApi.showOpenFilePicker is emulated in this browser. OpenFilePickerOptions are ignored.\");\n }\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.multiple = options?.multiple ?? false;\n fileInput.style.display = \"none\";\n fileInput.addEventListener(\"cancel\", async () => {\n fileInput.remove();\n reject(new DOMException(\"cancel\", \"AbortError\"));\n });\n fileInput.addEventListener(\"change\", async (event) => {\n const target = event.target;\n const files = target.files;\n if (isDefined(files)) {\n resolve(Arrays.create(index => asDefined(files.item(index), `No file at index ${index}`), files.length));\n }\n else {\n reject(new DOMException(\"cancel\", \"AbortError\"));\n }\n fileInput.remove();\n });\n document.body.appendChild(fileInput);\n fileInput.click();\n });\n }\n };\n})(Files || (Files = {}));\n", "import { asDefined, assert, Color, isDefined, panic, Rect } from \"@opendaw/lib-std\";\nexport var Html;\n(function (Html) {\n Html.parse = (source) => {\n const template = document.createElement(\"div\");\n template.innerHTML = source;\n if (template.childElementCount !== 1) {\n return panic(`Source html has more than one root elements: '${source}'`);\n }\n const child = template.firstChild;\n return child instanceof HTMLElement || child instanceof SVGSVGElement\n ? child\n : panic(`Cannot parse to HTMLOrSVGElement from '${source}'`);\n };\n Html.empty = (element) => { while (element.firstChild !== null) {\n element.firstChild.remove();\n } };\n Html.replace = (element, ...elements) => {\n Html.empty(element);\n element.append(...elements);\n };\n Html.query = (selectors, parent = document) => asDefined(parent.querySelector(selectors));\n Html.queryAll = (selectors, parent = document) => Array.from(parent.querySelectorAll(selectors));\n Html.nextID = (() => {\n let id = 0 | 0;\n return () => (++id).toString(16).padStart(4, \"0\");\n })();\n Html.adoptStyleSheet = (classDefinition, prefix) => {\n assert(classDefinition.includes(\"component\"), `No 'component' found in: ${classDefinition}`);\n const className = `${prefix ?? \"C\"}${Html.nextID()}`;\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(classDefinition.replaceAll(\"component\", `.${className}`));\n if (sheet.cssRules.length === 0) {\n return panic(`No cssRules found in: ${classDefinition}`);\n }\n document.adoptedStyleSheets.push(sheet);\n return className;\n };\n // Allows conditional accumulation of classNames\n Html.buildClassList = (...input) => input.filter(x => x !== false && x !== undefined).join(\" \");\n Html.readCssVarColor = (...cssValues) => {\n const element = document.createElement(\"div\");\n document.body.appendChild(element);\n const colors = cssValues.map(value => {\n element.style.color = value;\n return Color.parseCssRgbOrRgba(getComputedStyle(element).color);\n });\n element.remove();\n return colors;\n };\n Html.watchResize = (target, callback, options) => {\n const observer = new ResizeObserver(([first], observer) => callback(first, observer));\n observer.observe(target, options);\n return { terminate: () => observer.disconnect() };\n };\n Html.watchIntersection = (target, callback, options) => {\n const observer = new IntersectionObserver(callback, options);\n observer.observe(target);\n return { terminate: () => observer.disconnect() };\n };\n // handles cases like 'display: contents', where the bounding box is always empty, although the children have dimensions\n Html.secureBoundingBox = (element) => {\n let elemRect = element.getBoundingClientRect();\n if (!Rect.isEmpty(elemRect)) {\n return elemRect;\n }\n for (const child of element.children) {\n Rect.union(elemRect, Html.secureBoundingBox(child));\n }\n return elemRect;\n };\n Html.unfocus = (owner = self) => {\n const element = owner.document.activeElement;\n if (element !== null && \"blur\" in element && typeof element.blur === \"function\") {\n element.blur();\n }\n };\n Html.selectContent = (element) => {\n const range = document.createRange();\n const selection = window.getSelection();\n if (isDefined(selection)) {\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n };\n Html.unselectContent = (element) => {\n const selection = window.getSelection();\n if (!isDefined(selection) || selection.rangeCount === 0) {\n return;\n }\n if (element.contains(selection.getRangeAt(0).commonAncestorContainer)) {\n selection.removeAllRanges();\n }\n };\n Html.limitChars = (element, property, limit) => {\n if (!(property in element))\n return panic(`${property} not found in ${element}`);\n if (typeof element[property] !== \"string\")\n return panic(`${property} in ${element} is not a string`);\n if (element[property].length > limit) {\n element[property] = element[property].substring(0, limit);\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n element.setSelectionRange(limit, limit);\n }\n else {\n const document = element.ownerDocument;\n const range = document.createRange();\n const selection = document.defaultView?.getSelection();\n if (!isDefined(selection)) {\n return;\n }\n range.selectNodeContents(element);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n };\n Html.EmptyGif = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\";\n})(Html || (Html = {}));\n", "import { Browser } from \"./browser\";\nexport const ModfierKeys = (() => {\n const Mac = { Cmd: \"\u2318\", Opt: \"\u2325\", Shift: \"\u21E7\" };\n const Win = { Cmd: \"Ctrl\", Opt: \"Alt\", Shift: \"\u21E7\" };\n return Object.freeze({ Mac, Win, System: Browser.isMacOS() ? Mac : Win });\n})();\n", "export var Stream;\n(function (Stream) {\n Stream.read = async (reader) => {\n const chunks = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n chunks.push(value);\n }\n const length = chunks.reduce((acc, val) => acc + val.length, 0);\n const output = new Uint8Array(length);\n let position = 0 | 0;\n for (let chunk of chunks) {\n output.set(chunk, position);\n position += chunk.length;\n }\n return output.buffer;\n };\n})(Stream || (Stream = {}));\n", "export var Svg;\n(function (Svg) {\n Svg.pathBuilder = () => new class {\n #d = \"\";\n moveTo(x, y) {\n this.#d += `M${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n lineTo(x, y) {\n this.#d += `L${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n quadratic(x1, y1, x, y) {\n this.#d += `Q${x1.toFixed(3)} ${y1.toFixed(3)} ${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n quadraticTo(x, y) {\n this.#d += `T${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n cubic(x1, y1, x2, y2, x, y) {\n this.#d += `Q${x1.toFixed(3)} ${y1.toFixed(3)} ${x2.toFixed(3)} ${y2.toFixed(3)} ${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n arc(rx, ry, deg, largeArc, sweep, x, y) {\n this.#d += `A${rx} ${ry} ${deg} ${largeArc ? 1 : 0} ${sweep ? 1 : 0} ${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n circleSegment(cx, cy, radius, a0, a1) {\n const x0 = cx + Math.cos(a0) * radius;\n const y0 = cy + Math.sin(a0) * radius;\n const x1 = cx + Math.cos(a1) * radius;\n const y1 = cy + Math.sin(a1) * radius;\n let range = a1 - a0;\n while (range < 0.0)\n range += Math.PI * 2.0;\n return this.moveTo(x0, y0).arc(radius, radius, 0, range > Math.PI, true, x1, y1);\n }\n close() {\n this.#d += \"Z\";\n return this;\n }\n get() { return this.#d; }\n };\n})(Svg || (Svg = {}));\n", "export var TerminatorUtils;\n(function (TerminatorUtils) {\n const weakRefs = new Array();\n /**\n * Terminates if the key is no longer referenced to.\n * Make sure that the Terminable does not include other references\n * that would prevent the key from being gc collected.\n * That means the key must not appear in the Terminable!\n * @param key WeakKey\n * @param subscribe Sends a WeakRef to be able to be gc collected\n */\n TerminatorUtils.watchWeak = (key, subscribe) => {\n const weakRef = new WeakRef(key);\n const terminable = subscribe(weakRef);\n weakRefs.push([weakRef, terminable]);\n if (weakRefs.length === 1) {\n startWatchWeak();\n }\n return key;\n };\n const startWatchWeak = () => {\n console.debug(\"start weak watching\");\n const id = setInterval(() => {\n let index = weakRefs.length;\n while (--index >= 0) {\n const entry = weakRefs[index];\n if (entry[0].deref() === undefined) {\n entry[1].terminate();\n weakRefs.splice(index, 1);\n if (weakRefs.length === 0) {\n console.debug(\"stop weak watching\");\n clearInterval(id);\n }\n }\n }\n }, 1000);\n };\n})(TerminatorUtils || (TerminatorUtils = {}));\n", "const key = Symbol.for(\"@openDAW/lib-dom\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nexport * from \"./browser\";\nexport * from \"./compression\";\nexport * from \"./console-commands\";\nexport * from \"./context-2d\";\nexport * from \"./css-utils\";\nexport * from \"./dragging\";\nexport * from \"./events\";\nexport * from \"./errors\";\nexport * from \"./files\";\nexport * from \"./fonts\";\nexport * from \"./frames\";\nexport * from \"./html\";\nexport * from \"./keyboard\";\nexport * from \"./modfier-keys\";\nexport * from \"./stream\";\nexport * from \"./svg\";\nexport * from \"./terminable\";\n", "export var PackageType;\n(function (PackageType) {\n PackageType[PackageType[\"Float\"] = 0] = \"Float\";\n PackageType[PackageType[\"FloatArray\"] = 1] = \"FloatArray\";\n PackageType[PackageType[\"Integer\"] = 2] = \"Integer\";\n PackageType[PackageType[\"IntegerArray\"] = 3] = \"IntegerArray\";\n PackageType[PackageType[\"ByteArray\"] = 4] = \"ByteArray\";\n})(PackageType || (PackageType = {}));\n", "export var Lock;\n(function (Lock) {\n Lock[Lock[\"WRITE\"] = 0] = \"WRITE\";\n Lock[Lock[\"READ\"] = 1] = \"READ\";\n})(Lock || (Lock = {}));\n", "export var Flags;\n(function (Flags) {\n Flags[Flags[\"ID\"] = 15793935] = \"ID\";\n Flags[Flags[\"START\"] = 15790320] = \"START\";\n Flags[Flags[\"END\"] = 986895] = \"END\";\n})(Flags || (Flags = {}));\n", "import { Arrays, assert, ByteArrayOutput, Float16, Unhandled } from \"@opendaw/lib-std\";\nexport class Peaks {\n stages;\n data;\n numFrames;\n numChannels;\n static from(input) {\n assert(input.readString() === \"PEAKS\", \"Wrong header\");\n const numStages = input.readInt();\n const stages = [];\n for (let i = 0; i < numStages; i++) {\n const dataOffset = input.readInt();\n const numPeaks = input.readInt();\n const shift = input.readInt();\n const mask = input.readInt();\n stages[i] = new Peaks.Stage(mask, shift, numPeaks, dataOffset);\n }\n const numData = input.readInt();\n const data = [];\n for (let i = 0; i < numData; i++) {\n const array = new Int8Array(input.readInt());\n input.readBytes(array);\n data[i] = new Int32Array(array.buffer);\n }\n const numFrames = input.readInt();\n const numChannels = input.readInt();\n return new Peaks(stages, data, numFrames, numChannels);\n }\n static None = new Peaks([], [], 0, 0);\n constructor(stages, data, numFrames, numChannels) {\n this.stages = stages;\n this.data = data;\n this.numFrames = numFrames;\n this.numChannels = numChannels;\n }\n nearest(unitsPerPixel) {\n if (this.stages.length === 0) {\n return null;\n }\n const shift = Math.floor(Math.log(Math.abs(unitsPerPixel)) / Math.LN2);\n let i = this.stages.length;\n while (--i > -1) {\n if (shift >= this.stages[i].shift) {\n return this.stages[i];\n }\n }\n return this.stages[0];\n }\n toArrayBuffer() {\n const output = ByteArrayOutput.create();\n output.writeString(\"PEAKS\");\n output.writeInt(this.stages.length);\n for (let i = 0; i < this.stages.length; i++) {\n const { dataOffset, numPeaks, shift, mask } = this.stages[i];\n output.writeInt(dataOffset);\n output.writeInt(numPeaks);\n output.writeInt(shift);\n output.writeInt(mask);\n }\n output.writeInt(this.data.length);\n for (let i = 0; i < this.data.length; i++) {\n const array = new Int8Array(this.data[i].buffer);\n output.writeInt(array.length);\n output.writeBytes(array);\n }\n output.writeInt(this.numFrames);\n output.writeInt(this.numChannels);\n return output.toArrayBuffer();\n }\n toString() { return `{Peaks num-stages: ${this.stages.length}}`; }\n}\n(function (Peaks) {\n Peaks.findBestFit = (numFrames, width = 1200) => {\n const ratio = numFrames / width;\n if (ratio <= 1.0) {\n return new Uint8Array(0);\n }\n const ShiftPadding = 3;\n const maxShift = Math.floor(Math.log(ratio) / Math.LN2);\n const numStages = Math.max(1, Math.floor(maxShift / ShiftPadding));\n return new Uint8Array(Arrays.create(index => ShiftPadding * (index + 1), numStages));\n };\n class Stage {\n mask;\n shift;\n numPeaks;\n dataOffset;\n constructor(mask, shift, numPeaks, dataOffset) {\n this.mask = mask;\n this.shift = shift;\n this.numPeaks = numPeaks;\n this.dataOffset = dataOffset;\n }\n unitsEachPeak() { return 1 << this.shift; }\n }\n Peaks.Stage = Stage;\n Peaks.unpack = (bits, index) => {\n switch (index) {\n case 0:\n return Float16.intBitsToFloat(bits);\n case 1:\n return Float16.intBitsToFloat(bits >> 16);\n default:\n return Unhandled(index);\n }\n };\n})(Peaks || (Peaks = {}));\n", "import { Arrays, Float16, panic } from \"@opendaw/lib-std\";\nimport { Communicator, stopwatch } from \"@opendaw/lib-runtime\";\nimport { Peaks } from \"./Peaks\";\nexport var PeakWorker;\n(function (PeakWorker) {\n PeakWorker.install = (messenger) => Communicator.executor(messenger.channel(\"peaks\"), new class {\n async generateAsync(progress, shifts, frames, numFrames, numChannels) {\n return generatePeaks(progress, shifts, frames, numFrames, numChannels).toArrayBuffer();\n }\n });\n const generatePeaks = (progress, shifts, frames, numFrames, numChannels) => {\n if (frames.length !== numChannels) {\n return panic(`Invalid numberOfChannels. Expected: ${numChannels}. Got ${frames.length}`);\n }\n class State {\n min = Number.POSITIVE_INFINITY;\n max = Number.NEGATIVE_INFINITY;\n index = 0;\n }\n const time = stopwatch();\n const numShifts = shifts.length;\n const [stages, dataOffset] = initStages(shifts, numFrames);\n const data = Arrays.create(() => new Int32Array(dataOffset), numChannels);\n const minMask = stages[0].mask;\n const total = numChannels * numFrames;\n let count = 0;\n for (let channel = 0; channel < numChannels; ++channel) {\n const channelData = data[channel];\n const channelFrames = frames[channel];\n const states = Arrays.create(() => new State(), numShifts);\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n let position = 0;\n for (let i = 0; i < numFrames; ++i) {\n const frame = channelFrames[i];\n min = Math.min(frame, min);\n max = Math.max(frame, max);\n if ((++position & minMask) === 0) {\n for (let j = 0; j < numShifts; ++j) {\n const stage = stages[j];\n const state = states[j];\n state.min = Math.min(state.min, min);\n state.max = Math.max(state.max, max);\n if ((stage.mask & position) === 0) {\n channelData[stage.dataOffset + state.index++] = pack(state.min, state.max);\n state.min = Number.POSITIVE_INFINITY;\n state.max = Number.NEGATIVE_INFINITY;\n }\n }\n min = Number.POSITIVE_INFINITY;\n max = Number.NEGATIVE_INFINITY;\n }\n if ((++count & 0xFFFF) === 0) {\n progress(count / total);\n }\n }\n }\n progress(1.0);\n time.lab(`Peak-Gen '${self.constructor.name}'`);\n return new Peaks(stages, data, numFrames, numChannels);\n };\n const initStages = (shifts, numFrames) => {\n let dataOffset = 0;\n const stages = Arrays.create((index) => {\n const shift = shifts[index];\n const numPeaks = Math.ceil(numFrames / (1 << shift));\n const stage = new Peaks.Stage((1 << shift) - 1, shift, numPeaks, dataOffset);\n dataOffset += numPeaks;\n return stage;\n }, shifts.length);\n return [stages, dataOffset];\n };\n const pack = (f0, f1) => {\n const bits0 = Float16.floatToIntBits(f0);\n const bits1 = Float16.floatToIntBits(f1);\n return bits0 | (bits1 << 16);\n };\n})(PeakWorker || (PeakWorker = {}));\n", "import { Peaks } from \"./Peaks\";\nexport var PeaksPainter;\n(function (PeaksPainter) {\n PeaksPainter.renderBlocks = (path, peaks, channelIndex, { u0, u1, v0, v1, x0, x1, y0, y1 }) => {\n const unitsEachPixel = (u1 - u0) / (x1 - x0);\n const stage = peaks.nearest(unitsEachPixel);\n if (stage === null) {\n return;\n }\n const scale = (y1 - y0 - 1.0) / (v1 - v0);\n const unitsEachPeak = stage.unitsEachPeak();\n const pixelOverFlow = x0 - Math.floor(x0);\n const peaksEachPixel = unitsEachPixel / unitsEachPeak;\n let from = (u0 - pixelOverFlow * unitsEachPixel) / unitsEachPixel * peaksEachPixel;\n let indexFrom = Math.floor(from);\n let min = 0.0;\n let max = 0.0;\n const data = peaks.data[channelIndex];\n for (let x = Math.floor(x0); x < Math.floor(x1); x++) {\n const to = from + peaksEachPixel;\n const indexTo = Math.floor(to);\n let swap = false;\n while (indexFrom < indexTo) {\n const bits = data[stage.dataOffset + indexFrom++];\n min = Math.min(Peaks.unpack(bits, 0), min);\n max = Math.max(Peaks.unpack(bits, 1), max);\n swap = true;\n }\n const yMin = y0 + Math.floor((min - v0) * scale);\n const yMax = y0 + Math.floor((max - v0) * scale);\n const ry0 = Math.max(y0, Math.min(yMin, yMax));\n const ry1 = Math.min(y1, Math.max(yMin, yMax));\n path.fillRect(x, ry0, 1, ry1 === ry0 ? 1 : ry1 - ry0);\n if (swap) {\n const tmp = max;\n max = min;\n min = tmp;\n }\n from = to;\n indexFrom = indexTo;\n }\n };\n})(PeaksPainter || (PeaksPainter = {}));\n", "import { Arrays, asDefined } from \"@opendaw/lib-std\";\nimport { Communicator, Promises } from \"@opendaw/lib-runtime\";\nimport \"../types\";\nexport var OpfsWorker;\n(function (OpfsWorker) {\n const DEBUG = false;\n const readLimiter = new Promises.Limit(1);\n const writeLimiter = new Promises.Limit(1);\n OpfsWorker.init = (messenger) => Communicator.executor(messenger.channel(\"opfs\"), new class {\n async write(path, data) {\n if (DEBUG) {\n console.debug(`write ${data.length}b to ${path}`);\n }\n return writeLimiter.add(() => this.#resolveFile(path, { create: true })\n .then(handle => {\n handle.truncate(data.length);\n handle.write(data, { at: 0 });\n handle.flush();\n handle.close();\n }));\n }\n async read(path) {\n if (DEBUG) {\n console.debug(`read ${path}`);\n }\n return readLimiter.add(() => this.#resolveFile(path)\n .then(handle => {\n const size = handle.getSize();\n const buffer = new Uint8Array(size);\n handle.read(buffer);\n handle.close();\n return buffer;\n }));\n }\n async delete(path) {\n const segments = pathToSegments(path);\n return this.#resolveFolder(segments.slice(0, -1))\n .then(folder => folder.removeEntry(asDefined(segments.at(-1)), { recursive: true }));\n }\n async list(path) {\n const segments = pathToSegments(path);\n const { status, value: folder } = await Promises.tryCatch(this.#resolveFolder(segments));\n if (status === \"rejected\") {\n return Arrays.empty();\n }\n const result = [];\n for await (const { name, kind } of folder.values()) {\n result.push({ name, kind });\n }\n return result;\n }\n async #resolveFile(path, options) {\n const segments = pathToSegments(path);\n return this.#resolveFolder(segments.slice(0, -1), options)\n .then((folder) => folder.getFileHandle(asDefined(segments.at(-1)), options)\n .then(handle => handle.createSyncAccessHandle()));\n }\n async #resolveFolder(segments, options) {\n let folder = await navigator.storage.getDirectory();\n for (const segment of segments) {\n folder = await folder.getDirectoryHandle(segment, options);\n }\n return folder;\n }\n });\n const pathToSegments = (path) => {\n const noSlashes = path.replace(/^\\/+|\\/+$/g, \"\");\n return noSlashes === \"\" ? [] : noSlashes.split(\"/\");\n };\n})(OpfsWorker || (OpfsWorker = {}));\n", "const key = Symbol.for(\"@openDAW/lib-fusion\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nimport './types';\nexport * from \"./live-stream/LiveStreamReceiver\";\nexport * from \"./live-stream/LiveStreamBroadcaster\";\nexport * from \"./peaks/Peaks\";\nexport * from \"./peaks/PeakWorker\";\nexport * from \"./peaks/PeakProtocol\";\nexport * from \"./peaks/PeaksPainter\";\nexport * from \"./opfs/OpfsWorker\";\nexport * from \"./opfs/OpfsProtocol\";\n", "import {Messenger} from \"@opendaw/lib-runtime\"\nimport {OpfsWorker, PeakWorker} from \"@opendaw/lib-fusion\"\n\nconst messenger: Messenger = Messenger.for(self)\n\nOpfsWorker.init(messenger)\nPeakWorker.install(messenger)"],
4
+ "sourcesContent": ["export const identity = (value) => value;\nexport const isDefined = (value) => value !== undefined && value !== null;\nexport const ifDefined = (value, procedure) => { if (value !== undefined && value !== null) {\n procedure(value);\n} };\nexport const asDefined = (value, fail = \"asDefined failed\") => value === null || value === undefined ? panic(fail) : value;\nexport const isInstanceOf = (obj, clazz) => obj instanceof clazz;\nexport const asInstanceOf = (obj, clazz) => obj instanceof clazz ? obj : panic(`${obj} is not instance of ${clazz}`);\nexport const assertInstanceOf = (obj, clazz) => { if (!(obj instanceof clazz)) {\n panic(`${obj} is not instance of ${clazz}`);\n} };\nexport const tryProvide = (provider) => { try {\n return provider();\n}\ncatch (reason) {\n return panic(String(reason));\n} };\nexport const getOrProvide = (value) => value instanceof Function ? value() : value;\nexport const safeWrite = (object, property, value) => property in object ? object[property] = value : undefined;\nexport const safeExecute = (func, ...args) => func?.apply(null, args);\nexport const Unhandled = (empty) => { throw new Error(`Unhandled ${empty}`); };\nexport const panic = (issue) => { throw issue instanceof Error ? issue : new Error(issue); };\nexport const assert = (condition, fail) => condition ? undefined : panic(getOrProvide(fail));\nexport const checkIndex = (index, array) => index >= 0 && index < array.length ? index : panic(`Index ${index} is out of bounds`);\nexport const InaccessibleProperty = (failMessage) => new Proxy({}, { get() { return panic(failMessage); } });\nexport const canWrite = (obj, key) => {\n while (isDefined(obj)) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n if (isDefined(descriptor)) {\n return typeof descriptor.set === \"function\";\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n};\nexport const requireProperty = (object, key) => {\n const { status, value } = tryCatch(() => object instanceof Function ? object.name : object.constructor.name);\n const feature = status === \"failure\" ? `${object}.${String(key)}` : `${value}.${String(key)}`;\n console.debug(`%c${feature}%c available`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n if (!(key in object)) {\n throw feature;\n }\n};\nexport const tryCatch = (statement) => {\n try {\n return { error: null, value: statement(), status: \"success\" };\n }\n catch (error) {\n return { error, value: null, status: \"failure\" };\n }\n};\nexport const isValidIdentifier = (identifier) => /^[A-Za-z_$][A-Za-z0-9_]*$/.test(identifier);\nexport const asValidIdentifier = (identifier) => isValidIdentifier(identifier) ? identifier : panic(`'${identifier}' is not a valid identifier`);\nexport const EmptyExec = () => { };\nexport const EmptyProvider = () => { };\nexport const EmptyProcedure = (_) => { };\nexport const flipComparator = (comparator) => (a, b) => -comparator(a, b);\n", "import { asDefined, panic } from \"./lang\";\nexport var Sorting;\n(function (Sorting) {\n Sorting[Sorting[\"Ascending\"] = 1] = \"Ascending\";\n Sorting[Sorting[\"Descending\"] = -1] = \"Descending\";\n})(Sorting || (Sorting = {}));\nexport class Arrays {\n static #empty = Object.freeze(new Array(0));\n static empty = () => (() => this.#empty)();\n static clear = (array) => { array.length = 0; };\n static replace = (array, newValues) => {\n array.length = 0;\n array.push(...newValues);\n };\n static consume = (array, procedure) => {\n for (let index = 0; index < array.length;) {\n if (procedure(array[index])) {\n array.splice(index, 1);\n }\n else {\n index++;\n }\n }\n };\n static peekFirst = (array) => array.at(0) ?? null;\n static peekLast = (array) => array.at(-1) ?? null;\n static getFirst = (array, fail) => asDefined(array.at(0), fail);\n static getLast = (array, fail) => asDefined(array.at(-1), fail);\n static removeLast = (array, fail) => asDefined(array.pop(), fail);\n static create = (factory, n) => {\n const array = new Array(n);\n for (let i = 0; i < n; i++) {\n array[i] = factory(i);\n }\n return array;\n };\n static equals = (a, b) => {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n };\n /**\n * The satisfy method checks if all elements in a given array satisfy a provided predicate function\n * when compared with the first element of the array. That essentially means that all tested properties\n * in the predicate function are equal throughout the array.\n * [1, 1, 1, 1, 1] > (a, b) => a === b returns true\n * [1, 1, 1, 1, 2] > (a, b) => a === b returns false\n * [1, 1, 3, 2, 1] > (a, b) => a === b returns false\n */\n static satisfy = (array, predicate) => {\n if (array.length < 2) {\n return true;\n }\n const first = array[0];\n for (let i = 1; i < array.length; i++) {\n if (!predicate(first, array[i])) {\n return false;\n }\n }\n return true;\n };\n static remove = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n array.splice(index, 1);\n };\n static removeOpt = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return false;\n }\n array.splice(index, 1);\n return true;\n };\n static hasDuplicates = (array) => new Set(array).size < array.length;\n static removeDuplicates = (array) => {\n let index = 0 | 0;\n const result = new Set();\n for (const element of array) {\n if (!result.has(element)) {\n result.add(element);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static removeDuplicateKeys = (array, key) => {\n let index = 0 | 0;\n const seen = new Set();\n for (const element of array) {\n const value = element[key];\n if (!seen.has(value)) {\n seen.add(value);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static *iterate(array) {\n for (let i = 0; i < array.length; i++) {\n yield array[i];\n }\n }\n static *iterateReverse(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n yield array[i];\n }\n }\n static *iterateStateFull(array) {\n const maxIndex = array.length - 1;\n for (let i = 0; i <= maxIndex; i++) {\n yield { value: array[i], isFirst: i === 0, isLast: i === maxIndex };\n }\n }\n static isSorted(array, sorting = Sorting.Ascending) {\n if (array.length < 2) {\n return true;\n }\n let prev = array[0];\n for (let i = 1; i < array.length; i++) {\n const next = array[i];\n if (Math.sign(prev - next) === sorting) {\n return false;\n }\n prev = next;\n }\n return true;\n }\n}\n", "import { asDefined, getOrProvide, isDefined, panic } from \"./lang\";\nexport var Option;\n(function (Option) {\n Option.wrap = (value) => isDefined(value) ? new Some(value) : Option.None;\n Option.from = (provider) => Option.wrap(provider());\n Option.tryFrom = (provider) => {\n try {\n return Option.wrap(provider());\n }\n catch (_error) {\n return Option.None;\n }\n };\n Option.execute = (func, ...args) => Option.wrap(func?.apply(null, args));\n Option.async = (promise) => promise.then(value => Option.wrap(value), () => Option.None);\n class Some {\n #value;\n constructor(value) { this.#value = asDefined(value); }\n unwrap() { return this.#value; }\n unwrapOrElse(_) { return this.#value; }\n unwrapOrNull() { return this.#value; }\n unwrapOrUndefined() { return this.#value; }\n contains(value) { return value === this.#value; }\n match(matchable) { return matchable.some(this.#value); }\n ifSome(run) { return run(this.#value); }\n isEmpty() { return false; }\n nonEmpty() { return true; }\n map(callback) { return Option.wrap(callback(this.#value)); }\n mapOr(func, _or) { return func(this.#value); }\n flatMap(callback) { return callback(this.#value); }\n equals(other) { return this.unwrapOrNull() === other.unwrapOrNull(); }\n assert(_fail) { return this; }\n toString() { return `{Option.Some(${this.#value})}`; }\n get [Symbol.toStringTag]() { return this.toString(); }\n }\n Option.Some = Some;\n Option.None = new class {\n unwrap = (fail) => panic(isDefined(fail) ? getOrProvide(fail) : \"unwrap failed\");\n unwrapOrElse = (value) => getOrProvide(value);\n unwrapOrNull = () => null;\n unwrapOrUndefined = () => undefined;\n contains = (_) => false;\n match = (matchable) => matchable.none();\n ifSome = (_) => { };\n isEmpty = () => true;\n nonEmpty = () => false;\n map = (_) => Option.None;\n mapOr = (_, or) => getOrProvide(or);\n flatMap = (_) => Option.None;\n equals = (other) => other.isEmpty();\n assert = (fail) => panic(getOrProvide(fail) ?? \"assert failed\");\n toString = () => \"{Option.None}\";\n get [Symbol.toStringTag]() { return this.toString(); }\n };\n})(Option || (Option = {}));\n", "import { Option } from \"./option\";\nexport var Attempts;\n(function (Attempts) {\n Attempts.async = (promise) => promise.then(value => Attempts.ok(value), reason => Attempts.err(reason));\n Attempts.tryGet = (provider) => {\n try {\n return Attempts.ok(provider());\n }\n catch (reason) {\n return Attempts.err(reason);\n }\n };\n Attempts.ok = (result) => new class {\n value;\n constructor(value) {\n this.value = value;\n }\n asOption = () => Option.wrap(this.value);\n failureReason = () => { throw new Error(\"Attempt was successful.\"); };\n isFailure = () => false;\n isSuccess = () => true;\n result = () => this.value;\n map = (map) => {\n try {\n return Attempts.ok(map(this.value));\n }\n catch (reason) {\n return Attempts.err(reason);\n }\n };\n flatMap = (map) => map(this.value);\n match = (matchable) => matchable.ok(this.value);\n toVoid = () => Attempts.ok(undefined);\n failure = () => { throw new Error(\"Attempt was successful.\"); };\n toString = () => `{Success: ${this.value}`;\n get [Symbol.toStringTag]() { return \"Success\"; }\n }(result);\n Attempts.Ok = new class {\n constructor() { }\n asOption = () => Option.None;\n failureReason = () => { throw new Error(\"Attempt was successful.\"); };\n isFailure = () => false;\n isSuccess = () => true;\n result = () => undefined;\n map = (map) => Attempts.ok(map());\n flatMap = (map) => map();\n match = (matchable) => matchable.ok();\n toVoid = () => Attempts.ok(undefined);\n failure = () => { throw new Error(\"Attempt was successful.\"); };\n toString = () => `{Success: Ok`;\n get [Symbol.toStringTag]() { return \"Success\"; }\n }();\n Attempts.err = (reason) => new class {\n reason;\n constructor(reason) {\n this.reason = reason;\n }\n asOption = () => Option.None;\n failureReason = () => this.reason;\n isFailure = () => true;\n isSuccess = () => false;\n result = () => { throw new Error(`No result because '${this.reason}'`); };\n map = () => this;\n flatMap = () => this;\n match = (matchable) => matchable.err(this.reason);\n toVoid = () => Attempts.err(this.reason);\n failure = () => this;\n toString = () => `{Failure: ${this.reason}`;\n get [Symbol.toStringTag]() { return \"Failure\"; }\n }(reason);\n})(Attempts || (Attempts = {}));\n", "// https://en.wikipedia.org/wiki/Binary_search_algorithm\n//\nexport var BinarySearch;\n(function (BinarySearch) {\n BinarySearch.exact = (sorted, key, comparator) => {\n let l = 0 | 0;\n let r = sorted.length - 1;\n while (l <= r) {\n const m = (l + r) >>> 1;\n const cmp = comparator(sorted[m], key);\n if (cmp === 0) {\n return m;\n }\n if (cmp < 0) {\n l = m + 1;\n }\n else {\n r = m - 1;\n }\n }\n return -1;\n };\n BinarySearch.exactMapped = (sorted, key, comparator, map) => {\n let l = 0 | 0;\n let r = sorted.length - 1;\n while (l <= r) {\n const m = (l + r) >>> 1;\n const cmp = comparator(map(sorted[m]), key);\n if (cmp === 0) {\n return m;\n }\n if (cmp < 0) {\n l = m + 1;\n }\n else {\n r = m - 1;\n }\n }\n return -1;\n };\n BinarySearch.leftMost = (sorted, key, comparator) => {\n let l = 0 | 0;\n let r = sorted.length;\n while (l < r) {\n const m = (l + r) >>> 1;\n if (comparator(sorted[m], key) < 0) {\n l = m + 1;\n }\n else {\n r = m;\n }\n }\n return l;\n };\n BinarySearch.rightMost = (sorted, key, comparator) => {\n let l = 0 | 0;\n let r = sorted.length;\n while (l < r) {\n const m = (l + r) >>> 1;\n if (comparator(sorted[m], key) <= 0) {\n l = m + 1;\n }\n else {\n r = m;\n }\n }\n return r - 1;\n };\n BinarySearch.leftMostMapped = (sorted, key, comparator, map) => {\n let l = 0 | 0;\n let r = sorted.length;\n while (l < r) {\n const m = (l + r) >>> 1;\n if (comparator(map(sorted[m]), key) < 0) {\n l = m + 1;\n }\n else {\n r = m;\n }\n }\n return l;\n };\n BinarySearch.rightMostMapped = (sorted, key, comparator, map) => {\n let l = 0 | 0;\n let r = sorted.length;\n while (l < r) {\n const m = (l + r) >>> 1;\n if (comparator(map(sorted[m]), key) <= 0) {\n l = m + 1;\n }\n else {\n r = m;\n }\n }\n return r - 1;\n };\n BinarySearch.rangeMapped = (sorted, key, comparator, map) => [BinarySearch.leftMostMapped(sorted, key, comparator, map), BinarySearch.rightMostMapped(sorted, key, comparator, map)];\n})(BinarySearch || (BinarySearch = {}));\n", "import { isDefined } from \"./lang\";\nexport var Color;\n(function (Color) {\n Color.parseCssRgbOrRgba = (color) => {\n const colorValues = color.match(/\\(([^)]+)\\)/)?.at(1)?.split(\",\")?.map(Number);\n if (isDefined(colorValues) && colorValues.every(value => !isNaN(value))) {\n if (colorValues.length === 3) {\n return [\n colorValues[0] / 255.0,\n colorValues[1] / 255.0,\n colorValues[2] / 255.0,\n 1.0\n ];\n }\n else if (colorValues.length === 4) {\n return [\n colorValues[0] / 255.0,\n colorValues[1] / 255.0,\n colorValues[2] / 255.0,\n colorValues[3]\n ];\n }\n }\n throw new Error(`${color} is not proper formatted. Example: 'rgb(255, 255, 255)' or 'rgba(255, 255, 255, 1)'`);\n };\n})(Color || (Color = {}));\n", "export const StringComparator = (a, b) => a > b ? 1 : b > a ? -1 : 0;\nexport const NumberComparator = (a, b) => a - b;\nexport const NumberArrayComparator = (a, b) => {\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n const comparison = a[i] - b[i];\n if (comparison !== 0.0) {\n return comparison;\n }\n }\n return a.length - b.length;\n};\n", "// noinspection JSUnusedGlobalSymbols\nexport const TAU = Math.PI * 2.0;\nexport const PI_HALF = Math.PI / 2.0;\nexport const PI_QUART = Math.PI / 4.0;\nexport const INVERSE_SQRT_2 = 1.0 / Math.sqrt(2.0);\nexport const clamp = (value, min, max) => Math.max(min, Math.min(value, max));\nexport const clampUnit = (value) => Math.max(0.0, Math.min(value, 1.0));\nexport const squashUnit = (value, margin) => margin + (1.0 - 2.0 * margin) * Math.max(0.0, Math.min(value, 1.0));\nexport const quantizeFloor = (value, interval) => Math.floor(value / interval) * interval;\nexport const quantizeCeil = (value, interval) => Math.ceil(value / interval) * interval;\nexport const quantizeRound = (value, interval) => Math.round(value / interval) * interval;\nexport const linear = (y1, y2, mu) => y1 + (y2 - y1) * mu;\nexport const cosine = (y1, y2, mu) => {\n const mu2 = (1.0 - Math.cos(mu * Math.PI)) * 0.5;\n return y1 * (1.0 - mu2) + y2 * mu2;\n};\nexport const mod = (value, range) => fract(value / range) * range;\nexport const fract = (value) => value - Math.floor(value);\nexport const nextPowOf2 = (n) => Math.pow(2, Math.ceil(Math.log(n) / Math.log(2)));\nexport const radToDeg = (rad) => rad * 180.0 / Math.PI;\nexport const degToRad = (deg) => deg / 180.0 * Math.PI;\n// M\u00F6bius-Ease Curve\n// Only produces valid values between 0 and 1 (unitValues)\n// https://www.desmos.com/calculator/ht8cytaxsz\n// The inverse is h`=1-h\nexport const moebiusEase = (x, h) => (x * h) / ((2.0 * h - 1.0) * (x - 1.0) + h);\n", "import { clamp } from \"./math\";\n/**\n * original: http://werner.yellowcouch.org/Papers/fastenv12/index.html\n */\nexport var Curve;\n(function (Curve) {\n const EPLISON = 1.0e-15;\n Curve.valueAt = ({ slope, steps, y0, y1 }, x) => Curve.normalizedAt(x / steps, slope) * (y1 - y0) + y0;\n // https://www.desmos.com/calculator/9lwjajcfkw\n Curve.normalizedAt = (x, slope) => {\n if (slope > 0.499999 && slope < 0.500001) {\n return x;\n }\n else {\n const p = clamp(slope, EPLISON, 1.0 - EPLISON);\n return (p * p) / (1.0 - p * 2.0) * (Math.pow((1.0 - p) / p, 2.0 * x) - 1.0);\n }\n };\n Curve.inverseAt = (y, slope) => {\n const p = clamp(slope, EPLISON, 1.0 - EPLISON);\n return Math.log((y * (1.0 - 2.0 * p) / (p * p)) + 1.0) / (2.0 * Math.log((1.0 - p) / p));\n };\n Curve.coefficients = (definition) => {\n const f1 = Curve.valueAt(definition, 1.0);\n const f2 = Curve.valueAt(definition, 2.0);\n const m = (f2 - f1) / (f1 - definition.y0);\n const q = f1 - m * definition.y0;\n return { m, q };\n };\n function* walk(slope, steps, y0, y1) {\n const { m, q } = Curve.coefficients({ slope, steps, y0, y1 });\n for (let i = 0, v = y0; i < steps; i++) {\n yield v = m * v + q;\n }\n }\n Curve.walk = walk;\n function* walkNormalized(slope, steps) {\n const d = 1.0 / steps;\n const f1 = Curve.normalizedAt(d, slope);\n const f2 = Curve.normalizedAt(2.0 * d, slope);\n const m = (f2 - f1) / f1;\n for (let i = 0, v = 0.0; i < steps; i++) {\n yield v = m * v + f1;\n }\n }\n Curve.walkNormalized = walkNormalized;\n Curve.byHalf = (steps, y0, ym, y1) => ({\n slope: Curve.slopeByHalf(y0, ym, y1), steps, y0, y1\n });\n Curve.slopeByHalf = (y0, ym, y1) => Math.abs(y1 - y0) < 0.000001 ? 0.5 : (ym - y0) / (y1 - y0);\n})(Curve || (Curve = {}));\n", "const dataView = new DataView(new ArrayBuffer(8));\nexport var Integer;\n(function (Integer) {\n Integer.MIN_VALUE = -0x80000000;\n Integer.MAX_VALUE = 0x7fffffff;\n Integer.toByte = (value) => {\n dataView.setInt8(0, value);\n return dataView.getInt8(0);\n };\n Integer.toShort = (value) => {\n dataView.setInt16(0, value);\n return dataView.getInt16(0);\n };\n Integer.toInt = (value) => {\n dataView.setInt32(0, value);\n return dataView.getInt32(0);\n };\n})(Integer || (Integer = {}));\nexport var Float;\n(function (Float) {\n const EXP_BIT_MASK = 2139095040;\n const SIGNIFICANT_BIT_MASK = 8388607;\n const ARRAY_BUFFER = new ArrayBuffer(Float32Array.BYTES_PER_ELEMENT);\n const FLOAT_VIEW = new Float32Array(ARRAY_BUFFER);\n const INT_VIEW = new Int32Array(ARRAY_BUFFER);\n /**\n * Returns a representation of the specified floating-point value\n * according to the IEEE 754 floating-point \"single format\" bit layout.\n * @param value a floating-point number.\n * @returns the bits that represent the floating-point number.\n */\n Float.floatToIntBits = (value) => {\n const result = Float.floatToRawIntBits(value);\n if ((result & EXP_BIT_MASK) === EXP_BIT_MASK && (result & SIGNIFICANT_BIT_MASK) !== 0) {\n return 0x7fc00000;\n }\n return result;\n };\n Float.intBitsToFloat = (value) => {\n INT_VIEW[0] = value;\n return FLOAT_VIEW[0];\n };\n Float.floatToRawIntBits = (value) => {\n FLOAT_VIEW[0] = value;\n return INT_VIEW[0];\n };\n Float.toFloat32 = (value) => {\n dataView.setFloat32(0, value);\n return dataView.getFloat32(0);\n };\n})(Float || (Float = {}));\nexport var Float16;\n(function (Float16) {\n Float16.floatToIntBits = (value) => {\n const bits = Float.floatToIntBits(value);\n const sign = bits >>> 16 & 0x8000;\n let val = (bits & 0x7fffffff) + 0x1000;\n if (val >= 0x47800000) {\n if ((bits & 0x7fffffff) >= 0x47800000) {\n if (val < 0x7f800000) {\n return sign | 0x7c00;\n }\n return sign | 0x7c00 | (bits & 0x007fffff) >>> 13;\n }\n return sign | 0x7bff;\n }\n if (val >= 0x38800000) {\n return sign | val - 0x38000000 >>> 13;\n }\n if (val < 0x33000000) {\n return sign;\n }\n val = (bits & 0x7fffffff) >>> 23;\n return sign | ((bits & 0x7fffff | 0x800000) + (0x800000 >>> val - 102) >>> 126 - val);\n };\n Float16.intBitsToFloat = (bits) => {\n let mantissa = bits & 0x03ff;\n let exp = bits & 0x7c00;\n if (exp === 0x7c00) {\n exp = 0x3fc00;\n }\n else if (exp !== 0) {\n exp += 0x1c000;\n if (mantissa === 0 && exp > 0x1c400) {\n return Float.intBitsToFloat((bits & 0x8000) << 16 | exp << 13 | 0x3ff);\n }\n }\n else if (mantissa !== 0) {\n exp = 0x1c400;\n do {\n mantissa <<= 1;\n exp -= 0x400;\n } while ((mantissa & 0x400) === 0);\n mantissa &= 0x3ff;\n }\n return Float.intBitsToFloat((bits & 0x8000) << 16 | (exp | mantissa) << 13);\n };\n})(Float16 || (Float16 = {}));\nexport var Float64;\n(function (Float64) {\n const EXP_BIT_MASK = 9218868437227405312n;\n const SIGNIFICANT_BIT_MASK = 4503599627370495n;\n const ARRAY_BUFFER = new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT);\n const FLOAT64_VIEW = new Float64Array(ARRAY_BUFFER);\n const LONG_VIEW = new BigInt64Array(ARRAY_BUFFER);\n Float64.float64ToLongBits = (value) => {\n const result = Float64.float64ToRawLongBits(value);\n if ((result & EXP_BIT_MASK) === EXP_BIT_MASK && (result & SIGNIFICANT_BIT_MASK) !== 0n) {\n return 0x7ff8000000000000n;\n }\n return result;\n };\n Float64.longBitsToFloat64 = (value) => {\n LONG_VIEW[0] = value;\n return FLOAT64_VIEW[0];\n };\n Float64.float64ToRawLongBits = (value) => {\n FLOAT64_VIEW[0] = value;\n return LONG_VIEW[0];\n };\n Float64.clamp = (value) => {\n dataView.setFloat64(0, value);\n return dataView.getFloat64(0);\n };\n})(Float64 || (Float64 = {}));\n", "import { isDefined } from \"./lang\";\nexport class Iterables {\n static *empty() { }\n static one(value) { return [value]; }\n static count(iterable) {\n let count = 0 | 0;\n for (const _ of iterable) {\n count++;\n }\n return count;\n }\n static some(iterable, predicate) {\n for (const value of iterable) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n }\n static every(iterable, predicate) {\n for (const value of iterable) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n }\n static reduce(iterable, callback, initialValue) {\n let accumulator = initialValue;\n let index = 0;\n for (const value of iterable) {\n accumulator = callback(accumulator, value, index++);\n }\n return accumulator;\n }\n static includes(iterable, include) {\n for (const value of iterable) {\n if (value === include) {\n return true;\n }\n }\n return false;\n }\n static forEach(iterable, procedure) {\n for (const value of iterable) {\n procedure(value);\n }\n }\n static *map(iterable, map) {\n let count = 0 | 0;\n for (const value of iterable) {\n yield map(value, count++);\n }\n }\n static *take(iterator, count) {\n let i = 0;\n for (const value of iterator) {\n if (i++ >= count) {\n return;\n }\n yield value;\n }\n }\n static filter(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n if (fn(value)) {\n result.push(value);\n }\n }\n return result;\n }\n static filterMap(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n const mapped = fn(value);\n if (isDefined(mapped)) {\n result.push(mapped);\n }\n }\n return result;\n }\n static reverse(iterable) {\n const result = [];\n for (const value of iterable) {\n result.push(value);\n }\n return result.reverse();\n }\n static *pairWise(iterable) {\n const iterator = iterable[Symbol.iterator]();\n const { done, value } = iterator.next();\n let prev = value;\n if (done === true) {\n return;\n }\n while (true) {\n const { done, value } = iterator.next();\n if (done === true) {\n yield [prev, null];\n return;\n }\n yield [prev, value];\n prev = value;\n }\n }\n}\n", "import { panic } from \"./lang\";\nimport { nextPowOf2 } from \"./math\";\nimport { Float, Float64 } from \"./numeric\";\nimport { Iterables } from \"./iterables\";\nexport class ByteArrayOutput {\n static create(initialCapacity = 1024) {\n return this.use(new ArrayBuffer(initialCapacity));\n }\n static use(buffer, byteOffset = 0 | 0) {\n return new ByteArrayOutput(new DataView(buffer, byteOffset));\n }\n littleEndian = false;\n #view;\n #position = 0;\n constructor(view) { this.#view = view; }\n get remaining() { return this.#view.byteLength - this.#position; }\n get position() { return this.#position; }\n set position(value) {\n if (value < 0) {\n panic(`position(${value}) cannot be negative.`);\n }\n else if (value > this.#view.byteLength) {\n panic(`position(${value}) is outside range (${this.#view.byteLength}).`);\n }\n else {\n this.#position = value;\n }\n }\n writeBoolean(value) { this.writeByte(value ? 1 : 0); }\n writeByte(value) {\n this.#ensureSpace(1);\n this.#view.setInt8(this.#position++, value);\n }\n writeShort(value) {\n this.#ensureSpace(Int16Array.BYTES_PER_ELEMENT);\n this.#view.setInt16(this.#position, value, this.littleEndian);\n this.#position += Int16Array.BYTES_PER_ELEMENT;\n }\n writeInt(value) {\n this.#ensureSpace(Int32Array.BYTES_PER_ELEMENT);\n this.#view.setInt32(this.#position, value, this.littleEndian);\n this.#position += Int32Array.BYTES_PER_ELEMENT;\n }\n writeLong(value) {\n this.#ensureSpace(BigInt64Array.BYTES_PER_ELEMENT);\n this.#view.setBigInt64(this.#position, value, this.littleEndian);\n this.#position += BigInt64Array.BYTES_PER_ELEMENT;\n }\n writeFloat(value) {\n this.#ensureSpace(Float32Array.BYTES_PER_ELEMENT);\n this.#view.setFloat32(this.#position, value, this.littleEndian);\n this.#position += Float32Array.BYTES_PER_ELEMENT;\n }\n writeDouble(value) {\n this.#ensureSpace(Float64Array.BYTES_PER_ELEMENT);\n this.#view.setFloat64(this.#position, value, this.littleEndian);\n this.#position += Float64Array.BYTES_PER_ELEMENT;\n }\n writeBytes(bytes) {\n this.#ensureSpace(bytes.length);\n for (let i = 0; i < bytes.length; ++i) {\n this.#view.setInt8(this.#position++, bytes[i]);\n }\n }\n writeString(value) {\n const length = value.length;\n this.#ensureSpace(Int32Array.BYTES_PER_ELEMENT + length * Int16Array.BYTES_PER_ELEMENT);\n this.writeInt(length);\n for (let i = 0; i < length; i++) {\n this.writeShort(value.charCodeAt(i));\n }\n }\n toArrayBuffer() { return this.#view.buffer.slice(0, this.#position); }\n #ensureSpace(count) {\n const capacity = this.#view.byteLength;\n if (this.#position + count > capacity) {\n const o = this.#view;\n this.#view = new DataView(new ArrayBuffer(nextPowOf2(capacity + count)));\n for (let i = 0; i < this.#position; i++) {\n this.#view.setInt8(i, o.getInt8(i));\n }\n }\n }\n}\nexport class ByteCounter {\n #count = 0 | 0;\n writeByte(_) { this.#count++; }\n writeShort(_) { this.#count += 2; }\n writeInt(_) { this.#count += 4; }\n writeLong(_) { this.#count += 8; }\n writeFloat(_) { this.#count += 4; }\n writeDouble(_) { this.#count += 8; }\n writeBoolean(_) { this.#count++; }\n writeBytes(bytes) { this.#count += bytes.length; }\n writeString(value) { this.#count += value.length + 4; }\n get count() { return this.#count; }\n}\nexport class Checksum {\n #result;\n #cursor = 0;\n constructor(length = 32) {\n this.#result = new Int8Array(length);\n }\n result() { return this.#result; }\n equals(other) {\n if (other === this) {\n return true;\n }\n return this.#result.every((value, index) => other.#result[index] === value);\n }\n writeBoolean(value) {\n this.writeByte(value ? 31 : 11);\n }\n writeShort(value) {\n this.writeByte(value & 0xff);\n this.writeByte((value >>> 8) & 0xff);\n }\n writeByte(value) {\n if (this.#cursor >= this.#result.length) {\n this.#cursor = 0;\n }\n this.#result[this.#cursor++] ^= value;\n }\n writeInt(value) {\n this.writeByte(value & 0xff);\n this.writeByte((value >>> 8) & 0xff);\n this.writeByte((value >>> 16) & 0xff);\n this.writeByte((value >>> 24) & 0xff);\n }\n writeBytes(bytes) {\n bytes.forEach(value => this.writeByte(value));\n }\n writeFloat(value) {\n this.writeInt(Float.floatToIntBits(value));\n }\n writeDouble(value) {\n this.writeLong(Float64.float64ToLongBits(value));\n }\n writeLong(value) {\n this.writeByte(Number(value) & 0xff);\n this.writeByte(Number(value >> 8n) & 0xff);\n this.writeByte(Number(value >> 16n) & 0xff);\n this.writeByte(Number(value >> 24n) & 0xff);\n this.writeByte(Number(value >> 32n) & 0xff);\n this.writeByte(Number(value >> 40n) & 0xff);\n this.writeByte(Number(value >> 48n) & 0xff);\n this.writeByte(Number(value >> 56n) & 0xff);\n }\n writeString(value) {\n for (let i = 0; i < value.length; i++) {\n this.writeShort(value.charCodeAt(i));\n }\n }\n toHexString() {\n return Array.from(Iterables.map(this.#result.values(), value => (value & 0xff).toString(16).padStart(2, \"0\"))).join(\"\");\n }\n}\nexport class ByteArrayInput {\n littleEndian = false;\n #view;\n #position = 0;\n constructor(buffer, byteOffset = 0) { this.#view = new DataView(buffer, byteOffset); }\n get position() { return this.#position; }\n set position(value) {\n if (value < 0) {\n panic(`position(${value}) cannot be negative.`);\n }\n else if (value > this.#view.byteLength) {\n panic(`position(${value}) is outside range (${this.#view.byteLength}).`);\n }\n else {\n this.#position = value;\n }\n }\n readByte() { return this.#view.getInt8(this.#position++); }\n readShort() {\n const read = this.#view.getInt16(this.#position, this.littleEndian);\n this.#position += Int16Array.BYTES_PER_ELEMENT;\n return read;\n }\n readInt() {\n const read = this.#view.getInt32(this.#position, this.littleEndian);\n this.#position += Int32Array.BYTES_PER_ELEMENT;\n return read;\n }\n readLong() {\n const read = this.#view.getBigInt64(this.#position, this.littleEndian);\n this.#position += BigInt64Array.BYTES_PER_ELEMENT;\n return read;\n }\n readFloat() {\n const read = this.#view.getFloat32(this.#position, this.littleEndian);\n this.#position += Float32Array.BYTES_PER_ELEMENT;\n return read;\n }\n readDouble() {\n const read = this.#view.getFloat64(this.#position, this.littleEndian);\n this.#position += Float64Array.BYTES_PER_ELEMENT;\n return read;\n }\n readBoolean() { return this.readByte() === 1; }\n readBytes(array) {\n for (let i = 0; i < array.length; i++) {\n array[i] = this.readByte();\n }\n }\n readString() {\n const length = this.readInt();\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += String.fromCharCode(this.readShort());\n }\n return result;\n }\n available(count) { return this.#position + count <= this.#view.byteLength; }\n remaining() { return this.#view.byteLength - this.#position; }\n skip(count) { this.position += count; }\n}\n", "import { asDefined, isDefined, panic } from \"./lang\";\nconst findMethodType = (descriptor) => {\n if (!isDefined(descriptor)) {\n return panic(\"Cannot resolve method key of undefined descriptor\");\n }\n if (descriptor.value !== undefined) {\n return \"value\";\n }\n if (descriptor.get !== undefined) {\n return \"get\";\n }\n return panic(`Cannot resolve method key of ${descriptor}`);\n};\nexport const Lazy = (_, property, descriptor) => {\n // For stage 3 decorators, we need to handle the case where the descriptor might be undefined\n // and return a proper descriptor or function\n if (!isDefined(descriptor)) {\n // This is likely a stage 3 decorator call - return a function that returns the descriptor\n return function (_, context) {\n if (context && context.kind === \"getter\") {\n return function () {\n const originalDescriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this), property);\n if (!isDefined(originalDescriptor?.get)) {\n return panic(`Cannot find getter for property '${property}'`);\n }\n const value = originalDescriptor.get.apply(this);\n Object.defineProperty(this, property, {\n value: value,\n configurable: false,\n writable: false,\n enumerable: false\n });\n return value;\n };\n }\n // Fallback for other cases\n return undefined;\n };\n }\n const methodType = findMethodType(descriptor);\n const element = asDefined(descriptor[methodType]);\n return {\n [methodType]: function (...args) {\n if (args.length > 0) {\n return panic(\"lazy accessory must not have any construction parameters\");\n }\n const value = element.apply(this);\n Object.defineProperty(this, property, {\n value: methodType === \"get\" ? value : () => value,\n configurable: false,\n writable: false,\n enumerable: false\n });\n return value;\n }\n };\n};\n", "export var Generators;\n(function (Generators) {\n function* empty() { return; }\n Generators.empty = empty;\n Generators.next = (generator) => {\n const { value, done } = generator.next();\n return done ? null : value;\n };\n function* flatten(...generators) {\n for (const generator of generators) {\n for (const value of generator) {\n yield value;\n }\n }\n }\n Generators.flatten = flatten;\n})(Generators || (Generators = {}));\n", "import { Unhandled } from \"./lang\";\nimport { clamp } from \"./math\";\nexport var Axis;\n(function (Axis) {\n Axis[Axis[\"T\"] = 0] = \"T\";\n Axis[Axis[\"R\"] = 1] = \"R\";\n Axis[Axis[\"B\"] = 2] = \"B\";\n Axis[Axis[\"L\"] = 3] = \"L\";\n})(Axis || (Axis = {}));\nexport var Corner;\n(function (Corner) {\n Corner[Corner[\"TL\"] = 0] = \"TL\";\n Corner[Corner[\"TR\"] = 1] = \"TR\";\n Corner[Corner[\"BR\"] = 2] = \"BR\";\n Corner[Corner[\"BL\"] = 3] = \"BL\";\n})(Corner || (Corner = {}));\nexport var Geom;\n(function (Geom) {\n Geom.outerTangentPoints = (a, b) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const angle = Math.atan2(dy, dx) + Math.acos((a.r - b.r) / Math.sqrt(dx * dx + dy * dy));\n const cs = Math.cos(angle);\n const sn = Math.sin(angle);\n return [\n { x: a.x + a.r * cs, y: a.y + a.r * sn },\n { x: b.x + b.r * cs, y: b.y + b.r * sn }\n ];\n };\n})(Geom || (Geom = {}));\nexport var Point;\n(function (Point) {\n Point.zero = () => ({ x: 0, y: 0 });\n Point.create = (x, y) => ({ x, y });\n Point.clone = (point) => ({ ...point });\n Point.floor = (point) => ({ x: Math.floor(point.x), y: Math.floor(point.y) });\n Point.length = (point) => Math.sqrt(point.x * point.x + point.y * point.y);\n Point.distance = (a, b) => Math.sqrt((b.x - a.x) ** 2 + (b.y - a.y) ** 2);\n Point.add = (a, b) => ({ x: a.x + b.x, y: a.y + b.y });\n Point.subtract = (a, b) => ({ x: a.x - b.x, y: a.y - b.y });\n Point.scaleBy = (point, scale) => ({ x: point.x * scale, y: point.y * scale });\n Point.scaleTo = (point, scale) => {\n const multiplier = scale / Point.length(point);\n return { x: point.x * multiplier, y: point.y * multiplier };\n };\n Point.fromClient = (object) => ({\n x: object.clientX,\n y: object.clientY\n });\n})(Point || (Point = {}));\nexport var Rect;\n(function (Rect) {\n Rect.Empty = Object.freeze({ x: 0, y: 0, width: 0, height: 0 });\n Rect.corners = (rectangle) => {\n const x0 = rectangle.x;\n const y0 = rectangle.y;\n const x1 = x0 + rectangle.width;\n const y1 = y0 + rectangle.height;\n return [{ x: x0, y: y0 }, { x: x1, y: y0 }, { x: x1, y: y1 }, { x: x0, y: y1 }];\n };\n Rect.inflate = (rect, amount) => {\n return {\n x: rect.x - amount,\n y: rect.y - amount,\n width: rect.width + amount * 2.0,\n height: rect.height + amount * 2.0\n };\n };\n Rect.contains = (outer, inner) => {\n const topLeftInside = inner.x >= outer.x && inner.y >= outer.y;\n const bottomRightInside = (inner.x + inner.width) <= (outer.x + outer.width)\n && (inner.y + inner.height) <= (outer.y + outer.height);\n return topLeftInside && bottomRightInside;\n };\n Rect.isPointInside = (point, rect) => point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height;\n Rect.intersect = (a, b) => {\n const xMin = Math.max(a.x, b.x);\n const xMax = Math.min(a.x + a.width, b.x + b.width);\n const yMax = Math.min(a.y + a.height, b.y + b.height);\n const yMin = Math.max(a.y, b.y);\n return xMax > xMin && yMax > yMin;\n };\n Rect.axis = (rectangle, axis) => {\n switch (axis) {\n case Axis.T:\n return rectangle.y;\n case Axis.R:\n return rectangle.x + rectangle.width;\n case Axis.B:\n return rectangle.y + rectangle.height;\n case Axis.L:\n return rectangle.x;\n default:\n return Unhandled(axis);\n }\n };\n Rect.corner = (rectangle, corner) => {\n switch (corner) {\n case Corner.TL:\n return { x: rectangle.x, y: rectangle.y };\n case Corner.TR:\n return { x: rectangle.x + rectangle.width, y: rectangle.y };\n case Corner.BR:\n return { x: rectangle.x + rectangle.width, y: rectangle.y + rectangle.height };\n case Corner.BL:\n return { x: rectangle.x, y: rectangle.y + rectangle.height };\n default:\n return Unhandled(corner);\n }\n };\n Rect.center = (rectangle) => ({\n x: rectangle.x + rectangle.width * 0.5,\n y: rectangle.y + rectangle.height * 0.5\n });\n Rect.isEmpty = (rectangle) => rectangle.width === 0 || rectangle.height === 0;\n Rect.union = (a, b) => {\n if (Rect.isEmpty(a)) {\n if (!Rect.isEmpty(b)) {\n a.x = b.x;\n a.y = b.y;\n a.width = b.width;\n a.height = b.height;\n }\n }\n else if (!Rect.isEmpty(b)) {\n const bx = b.x;\n const by = b.y;\n const ux = Math.min(a.x, bx);\n const uy = Math.min(a.y, by);\n a.width = Math.max(a.x + a.width, bx + b.width) - ux;\n a.height = Math.max(a.y + a.height, by + b.height) - uy;\n a.x = ux;\n a.y = uy;\n }\n };\n})(Rect || (Rect = {}));\nexport var AABB;\n(function (AABB) {\n AABB.width = (aabb) => aabb.xMax - aabb.xMin;\n AABB.height = (aabb) => aabb.yMax - aabb.yMin;\n AABB.from = (aabb, that) => {\n aabb.xMin = that.xMin;\n aabb.xMax = that.xMax;\n aabb.yMin = that.yMin;\n aabb.yMax = that.yMax;\n };\n AABB.extend = (aabb, offset) => {\n aabb.xMin -= offset;\n aabb.yMin -= offset;\n aabb.xMax += offset;\n aabb.yMax += offset;\n };\n AABB.padding = (aabb, [top, right, bottom, left]) => {\n aabb.xMin += left;\n aabb.yMin += top;\n aabb.xMax -= right;\n aabb.yMax -= bottom;\n return aabb;\n };\n AABB.intersectPoint = (aabb, point) => aabb.xMin <= point.x && point.x < aabb.xMax && aabb.yMin <= point.y && point.y < aabb.yMax;\n AABB.intersectThat = (aabb, that) => that.xMin < aabb.xMax && that.xMax > aabb.xMin && that.yMin < aabb.yMax && that.yMax > aabb.yMin;\n AABB.center = (aabb) => ({ x: (aabb.xMin + aabb.xMax) * 0.5, y: (aabb.yMin + aabb.yMax) * 0.5 });\n})(AABB || (AABB = {}));\nexport var Padding;\n(function (Padding) {\n Padding.Identity = Object.freeze([0.0, 0.0, 0.0, 0.0]);\n})(Padding || (Padding = {}));\nexport var CohenSutherland;\n(function (CohenSutherland) {\n CohenSutherland.intersects = (xMin, xMax, yMin, yMax, x0, y0, x1, y1) => {\n const c0 = code(xMin, xMax, yMin, yMax, x0, y0);\n const c1 = code(xMin, xMax, yMin, yMax, x1, y1);\n if ((c0 | c1) === 0) {\n return false;\n }\n if ((c0 & c1) !== 0) {\n return false;\n }\n const s = sign(x0, y0, x1, y1, xMin, yMin);\n return (s !== sign(x0, y0, x1, y1, xMax, yMin) ||\n s !== sign(x0, y0, x1, y1, xMax, yMax) ||\n s !== sign(x0, y0, x1, y1, xMin, yMax));\n };\n const code = (xMin, xMax, yMin, yMax, x, y) => {\n let code = 0;\n if (x <= xMin) {\n code |= 1;\n }\n else if (x >= xMax) {\n code |= 2;\n }\n if (y <= yMin) {\n code |= 8;\n }\n else if (y >= yMax) {\n code |= 4;\n }\n return code;\n };\n const sign = (x0, y0, x1, y1, x2, y2) => (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0) >= 0;\n})(CohenSutherland || (CohenSutherland = {}));\nexport var ValueAxis;\n(function (ValueAxis) {\n ValueAxis.Identity = {\n valueToAxis: (value) => value,\n axisToValue: (axis) => axis\n };\n ValueAxis.toClamped = (valueAxis, min, max) => ({\n valueToAxis: (value) => valueAxis.valueToAxis(clamp(value, min, max)),\n axisToValue: (axis) => clamp(valueAxis.axisToValue(axis), min, max)\n });\n ValueAxis.createClamped = (min, max) => ({\n valueToAxis: (value) => clamp(value, min, max),\n axisToValue: (axis) => clamp(axis, min, max)\n });\n})(ValueAxis || (ValueAxis = {}));\n", "import { assert } from \"./lang\";\n//\n// SHA-256\n//\nexport var Hash;\n(function (Hash) {\n Hash.fromBuffers = async (...buffers) => {\n const totalLength = buffers.reduce((sum, buf) => sum + buf.byteLength, 0);\n const mergedArray = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n mergedArray.set(new Uint8Array(buffer), offset);\n offset += buffer.byteLength;\n }\n return await crypto.subtle.digest(\"SHA-256\", mergedArray);\n };\n Hash.equals = (a, b) => {\n assert(a.byteLength === 32, \"First hash has invalid length\");\n assert(b.byteLength === 32, \"Second hash has invalid length\");\n const viewA = new Uint8Array(a);\n const viewB = new Uint8Array(b);\n for (let i = 0; i < 32; i++) {\n if (viewA[i] !== viewB[i]) {\n return false;\n }\n }\n return true;\n };\n Hash.toString = (buffer) => Array.from(new Uint8Array(buffer)).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n})(Hash || (Hash = {}));\n", "export var Intervals;\n(function (Intervals) {\n Intervals.intersect1D = (min0, max0, min1, max1) => Math.max(min0, min1) <= Math.min(max0, max1);\n})(Intervals || (Intervals = {}));\n", "import { safeExecute } from \"./lang\";\nexport class Listeners {\n #set = new Set();\n #proxy;\n constructor() {\n this.#proxy = new Proxy({}, {\n get: (_, func) => (...args) => this.#set.forEach((listener) => {\n if (Object.getPrototypeOf(listener) === Object.getPrototypeOf({})) {\n return safeExecute(listener[func], ...args);\n }\n return listener[func]?.apply(listener, args);\n })\n });\n }\n get proxy() { return this.#proxy; }\n get size() { return this.#set.size; }\n subscribe(listener) {\n this.#set.add(listener);\n return { terminate: () => this.#set.delete(listener) };\n }\n forEach(procedure) { this.#set.forEach(procedure); }\n terminate() { this.#set.clear(); }\n}\n", "export class Sets {\n static #EMPTY = Object.freeze(new Set());\n static empty = () => Sets.#EMPTY;\n}\n", "import { panic } from \"./lang\";\nexport var Objects;\n(function (Objects) {\n Objects.mergeNoOverlap = (u, v) => {\n const keys = new Set(Object.keys(u));\n for (const key of Object.keys(v)) {\n if (keys.has(key)) {\n return panic(`'${key}' is an overlapping key`);\n }\n }\n return ({ ...u, ...v });\n };\n Objects.include = (obj, ...keys) => keys.reduce((result, key) => {\n result[key] = obj[key];\n return result;\n }, {});\n Objects.exclude = (obj, ...keys) => {\n const exclude = new Set(keys);\n return Object.entries(obj).reduce((result, [key, value]) => {\n if (!exclude.has(key)) {\n result[key] = value;\n }\n return result;\n }, {});\n };\n Objects.overwrite = (target, patch) => Object.assign(target, patch);\n})(Objects || (Objects = {}));\n", "import { Arrays } from \"./arrays\";\nimport { EmptyExec } from \"./lang\";\nexport const Terminable = Object.freeze({\n Empty: { terminate: EmptyExec },\n create: (exec) => ({ terminate: exec }),\n many: (...terminables) => ({ terminate: () => { while (terminables.length > 0) {\n terminables.pop().terminate();\n } } })\n});\nexport class Terminator {\n #terminables = [];\n own(terminable) {\n this.#terminables.push(terminable);\n return terminable;\n }\n ownAll(...terminables) {\n for (const terminable of terminables) {\n this.#terminables.push(terminable);\n }\n }\n spawn() {\n const terminator = new Terminator();\n terminator.own({ terminate: () => Arrays.removeOpt(this.#terminables, terminator) });\n return this.own(terminator);\n }\n terminate() { while (this.#terminables.length > 0) {\n this.#terminables.pop().terminate();\n } }\n}\nexport class VitalSigns {\n #terminated = false;\n get isTerminated() { return this.#terminated; }\n terminate() { this.#terminated = true; }\n}\nexport class CascadingSubscriptions {\n #current;\n constructor() { this.#current = new Terminator(); }\n next() {\n const current = this.#current;\n const nested = current.own(new Terminator());\n this.#current = nested;\n return {\n own: (subscription) => {\n current.own(subscription);\n return current;\n },\n toObserver: (fn) => (value) => {\n nested.terminate();\n nested.own(fn(value));\n }\n };\n }\n append(subscribe, observer) {\n const current = this.#current;\n const nested = current.own(new Terminator());\n current.own(subscribe((value) => {\n nested.terminate();\n nested.own(observer(value));\n }));\n this.#current = nested;\n return current;\n }\n}\n", "import { Terminable } from \"./terminable\";\nimport { Option } from \"./option\";\nexport class Notifier {\n static subscribeMany(observer, ...observables) {\n return Terminable.many(...observables\n .map(observable => observable.subscribe(() => observer(observable))));\n }\n #observers = new Set(); // A set allows us to remove while iterating\n subscribe(observer) {\n this.#observers.add(observer);\n return { terminate: () => this.#observers.delete(observer) };\n }\n isEmpty() { return this.#observers.size === 0; }\n notify(value) { this.#observers.forEach((observer) => observer(value)); }\n observers() { return this.#observers; }\n terminate() { this.#observers.clear(); }\n}\nexport var ObservableValue;\n(function (ObservableValue) {\n ObservableValue.make = (value) => new class {\n getValue() { return value; }\n subscribe(_observer) { return Terminable.Empty; }\n catchupAndSubscribe(observer) {\n observer(this);\n return Terminable.Empty;\n }\n };\n})(ObservableValue || (ObservableValue = {}));\nexport var MutableObservableValue;\n(function (MutableObservableValue) {\n MutableObservableValue.False = new class {\n getValue() { return false; }\n setValue(_) { }\n subscribe(_) { return Terminable.Empty; }\n catchupAndSubscribe(observer) {\n observer(this);\n return Terminable.Empty;\n }\n };\n MutableObservableValue.inverseBoolean = (observableValue) => new class {\n getValue() { return !observableValue.getValue(); }\n setValue(value) { observableValue.setValue(!value); }\n subscribe(observer) { return observableValue.subscribe(observer); }\n catchupAndSubscribe(observer) {\n observer(this);\n return this.subscribe(observer);\n }\n };\n})(MutableObservableValue || (MutableObservableValue = {}));\nexport class DefaultObservableValue {\n #notifier;\n #guard = Option.None;\n #value;\n constructor(value, guard) {\n this.#notifier = new Notifier();\n this.#value = guard?.guard(value) ?? value;\n this.#guard = Option.wrap(guard);\n }\n setValue(value) {\n if (this.#guard.nonEmpty()) {\n value = this.#guard.unwrap().guard(value);\n }\n if (this.#value === value) {\n return;\n }\n this.#value = value;\n this.#notifier.notify(this);\n }\n getValue() { return this.#value; }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n catchupAndSubscribe(observer) {\n observer(this);\n return this.#notifier.subscribe(observer);\n }\n terminate() { this.#notifier.terminate(); }\n toString() { return `{DefaultObservableValue value: ${this.#value}`; }\n}\n", "import { asDefined, panic } from \"./lang\";\nimport { clamp } from \"./math\";\nimport { Integer } from \"./numeric\";\nclass Linear {\n #min;\n #max;\n #range;\n constructor(min, max) {\n this.#min = min;\n this.#max = max;\n this.#range = max - min;\n }\n x(y) { return (this.clamp(y) - this.#min) / this.#range; }\n y(x) { return this.#min + clamp(x, 0.0, 1.0) * this.#range; }\n clamp(y) { return clamp(y, this.#min, this.#max); }\n floating() { return true; }\n}\nclass LinearInteger {\n #min;\n #max;\n #range;\n constructor(min, max) {\n this.#min = clamp(Math.round(min), Integer.MIN_VALUE, Integer.MAX_VALUE);\n this.#max = clamp(Math.round(max), Integer.MIN_VALUE, Integer.MAX_VALUE);\n this.#range = this.#max - this.#min;\n }\n x(y) { return (this.clamp(y) - this.#min) / this.#range; }\n y(x) { return this.#min + Math.round(clamp(x, 0.0, 1.0) * this.#range); }\n clamp(y) { return clamp(Math.round(y), this.#min, this.#max); }\n floating() { return false; }\n}\nclass Exponential {\n #min;\n #max;\n #range;\n constructor(min, max) {\n this.#min = min;\n this.#max = max;\n this.#range = Math.log(max / min);\n }\n x(y) { return Math.log(clamp(y, this.#min, this.#max) / this.#min) / this.#range; }\n y(x) { return this.#min * Math.exp(clamp(x, 0.0, 1.0) * this.#range); }\n clamp(y) { return Math.min(this.#max, Math.max(this.#min, y)); }\n floating() { return true; }\n}\nclass Values {\n #values;\n constructor(values) {\n this.#values = values;\n }\n x(y) {\n const index = this.#values.findIndex(value => value === y);\n return index === -1\n ? panic(`Could not find index for ${y}`)\n : index / (this.#values.length - 1);\n }\n y(x) {\n const index = Math.round(clamp(x, 0.0, 1.0) * (this.#values.length - 1));\n return index > -1\n ? asDefined(this.#values.at(index), `Could not find value for ${x}`)\n : panic(`Index ${index} is out of box.`);\n }\n clamp(y) { return y; }\n floating() { return false; }\n}\nclass Decibel {\n #min;\n #max;\n #a;\n #b;\n #c;\n /**\n * @param min The lowest decibel value\n * @param mid The decibel value in the center\n * @param max The highest decibel value\n */\n constructor(min, mid, max) {\n this.#min = min;\n this.#max = max;\n const min2 = min * min;\n const max2 = max * max;\n const mid2 = mid * mid;\n const tmp0 = min + max - 2.0 * mid;\n const tmp1 = max - mid;\n this.#a = ((2.0 * max - mid) * min - mid * max) / tmp0;\n this.#b = (tmp1 * min2 + (mid2 - max2) * min + mid * max2 - mid2 * max)\n / (min2 + (2.0 * max - 4.0 * mid) * min + max2 - 4.0 * mid * max + 4.0 * mid2);\n this.#c = -tmp1 / tmp0;\n }\n y(x) {\n if (x <= 0.0) {\n return Number.NEGATIVE_INFINITY;\n }\n if (x >= 1.0) {\n return this.#max;\n }\n return this.#a - this.#b / (x + this.#c);\n }\n x(y) {\n if (this.#min >= y) {\n return 0.0;\n }\n if (this.#max <= y) {\n return 1.0;\n }\n return -this.#b / (y - this.#a) - this.#c;\n }\n clamp(y) { return Math.min(this.#max, y); }\n floating() { return true; }\n}\nexport var ValueMapping;\n(function (ValueMapping) {\n ValueMapping.linear = (min, max) => new Linear(min, max);\n ValueMapping.linearInteger = (min, max) => new LinearInteger(min, max);\n ValueMapping.exponential = (min, max) => new Exponential(min, max);\n ValueMapping.values = (values) => new Values(values);\n ValueMapping.decibel = (min, mid, max) => new Decibel(min, mid, max);\n const Bool = new class {\n x(y) { return y ? 1.0 : 0.0; }\n y(x) { return x >= 0.5; }\n clamp(y) { return y; }\n floating() { return false; }\n };\n const Unipolar = ValueMapping.linear(0.0, 1.0);\n const Bipolar = ValueMapping.linear(-1.0, 1.0);\n ValueMapping.bool = Bool;\n const DefaultDecibelInstance = ValueMapping.decibel(-72.0, -12.0, 0.0);\n ValueMapping.unipolar = () => Unipolar;\n ValueMapping.bipolar = () => Bipolar;\n ValueMapping.DefaultDecibel = DefaultDecibelInstance;\n})(ValueMapping || (ValueMapping = {}));\n", "import { isDefined } from \"./lang\";\nimport { clamp } from \"./math\";\nexport var StringMapping;\n(function (StringMapping) {\n StringMapping.percent = ({ bipolar, fractionDigits } = {}) => new Numeric(\"%\", fractionDigits, false, bipolar);\n StringMapping.numeric = ({ unit, fractionDigits, unitPrefix, bipolar } = {}) => new Numeric(unit, fractionDigits, unitPrefix, bipolar);\n StringMapping.indices = (unit, values) => new class {\n x(y) {\n return { unit, value: values[y] };\n }\n y(x) {\n const index = values.indexOf(x);\n return index === -1 ? { type: \"unknown\", value: \"\uD83D\uDCA3\" } : { type: \"explicit\", value: index };\n }\n };\n StringMapping.values = (unit, values, strings) => new class {\n x(y) {\n return { unit, value: strings.at(values.indexOf(y)) ?? \"N/A\" };\n }\n y(x) {\n const index = strings.indexOf(x);\n return index === -1 ? { type: \"unknown\", value: \"\uD83D\uDCA3\" } : { type: \"explicit\", value: values[index] };\n }\n };\n StringMapping.bool = new class {\n y(x) {\n switch (x.trim()) {\n case \"on\":\n case \"yes\":\n case \"true\":\n return { type: \"explicit\", value: true };\n default:\n return { type: \"explicit\", value: false };\n }\n }\n x(y) {\n return { value: String(y), unit: \"\" };\n }\n };\n class Numeric {\n #unit;\n #fractionDigits;\n #unitPrefix;\n #bipolar;\n constructor(unit, fractionDigits, unitPrefix, bipolar) {\n this.#unit = unit ?? \"\";\n this.#fractionDigits = fractionDigits ?? 0;\n this.#unitPrefix = unitPrefix ?? false;\n this.#bipolar = bipolar ?? false;\n }\n y(x) {\n let value = x.trim();\n const float = parseFloat(value);\n if (isNaN(float)) {\n return { type: \"unknown\", value: value };\n }\n else if (this.#unit === \"%\") {\n return {\n type: \"explicit\",\n value: float / 100.0\n };\n }\n else if (value.endsWith(\"%\")) {\n return {\n type: \"unitValue\",\n value: this.#bipolar\n ? clamp(float / 200.0 + 0.5, 0.0, 1.0)\n : clamp(float / 100.0, 0.0, 1.0)\n };\n }\n else {\n if (value.endsWith(this.#unit) && this.#unit.length > 0) {\n // remove unit\n value = value.slice(0, -this.#unit.length);\n }\n const regex = /(\\d+)(\\D+)/;\n const match = regex.exec(value);\n const last = match?.at(2)?.at(0);\n if (isDefined(last)) {\n const index = prefixes.indexOf(last);\n if (index > -1) {\n return { type: \"explicit\", value: float * Math.pow(10.0, (index - 4) * 3.0) };\n }\n }\n return { type: \"explicit\", value: float };\n }\n }\n x(y) {\n if (Number.isNaN(y)) {\n return { value: \"\uD83D\uDCA3\", unit: this.#unit };\n }\n else if (Number.isFinite(y)) {\n if (this.#unit === \"%\") {\n return this.#bipolar\n ? { value: (y * 200 - 100).toFixed(this.#fractionDigits), unit: this.#unit }\n : { value: (y * 100).toFixed(this.#fractionDigits), unit: this.#unit };\n }\n if (this.#unitPrefix) {\n const { value, prefix } = computePrefix(y);\n return { value: value.toFixed(this.#fractionDigits), unit: `${prefix}${this.#unit}` };\n }\n else {\n return { value: y.toFixed(this.#fractionDigits), unit: this.#unit };\n }\n }\n else {\n return { value: y === Number.POSITIVE_INFINITY ? \"\u221E\" : \"-\u221E\", unit: this.#unit };\n }\n }\n }\n const prefixes = Object.freeze([\"p\", \"n\", \"\u03BC\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\"]);\n // this magic number rounds the result perfectly to integers, while the mathematically correct 10 doesn't:\n // computeBase10(1000) = 3\n // computeBase10(0.001) = -3\n const computeBase10 = (value) => Math.log(value) / Math.log(9.999999999999999);\n const computePrefix = (value) => {\n const location = Math.floor(computeBase10(value) / 3.0);\n const prefix = prefixes[location + 4];\n return isDefined(prefix) ? { value: value * Math.pow(10.0, location * -3.0), prefix } : { value, prefix: \"\" };\n };\n StringMapping.decible = StringMapping.numeric({ unit: \"db\", fractionDigits: 1 });\n StringMapping.panning = StringMapping.percent({ unit: \"%\", fractionDigits: 0 });\n})(StringMapping || (StringMapping = {}));\n", "export var Predicates;\n(function (Predicates) {\n Predicates.alwaysTrue = () => true;\n Predicates.alwaysFalse = () => false;\n Predicates.definedPredicate = (value) => value !== null && value !== undefined;\n})(Predicates || (Predicates = {}));\n", "import { Arrays } from \"./arrays\";\nexport const SilentProgressHandler = _ => { };\nexport var Progress;\n(function (Progress) {\n Progress.split = (progress, count) => {\n const collect = new Float32Array(count);\n return Arrays.create(index => (value) => {\n collect[index] = value;\n progress(collect.reduce((total, value) => total + value, 0.0) / count);\n }, count);\n };\n})(Progress || (Progress = {}));\n", "import { panic } from \"./lang\";\nexport var Random;\n(function (Random) {\n Random.create = (seed = 0xF123F42) => new Mulberry32(seed);\n /**\n * Generates a monotone ascending sequence of random unitValue numbers.\n * @param target The target array to fill with random values.\n * @param noise Tell the method how noisy the sequence should be. 0 leads to a linear sequence.\n * @param random The random number generator to use.\n * @returns The target array.\n */\n Random.monotoneAscending = (target, noise = 128, random = Random.create()) => {\n const length = target.length;\n if (length < 2) {\n return panic(\"Array must have at least 2 elements\");\n }\n let sum = 0.0;\n for (let i = 1; i < length; i++) {\n const value = Math.floor(random.uniform() * (1.0 + noise)) + 1.0;\n target[i] = value;\n sum += value;\n }\n let acc = 0.0;\n target[0] = 0.0;\n for (let i = 1; i < length; i++) {\n acc += target[i];\n target[i] = acc / sum;\n }\n return target;\n };\n})(Random || (Random = {}));\nexport class Mulberry32 {\n #seed = 0;\n constructor(seed) { this.setSeed(seed); }\n setSeed(value) { this.#seed = value & 0xFFFFFFFF; }\n nextDouble(min, max) { return min + this.uniform() * (max - min); }\n nextInt(min, max) { return min + Math.floor(this.uniform() * (max - min)); }\n nextElement(array) { return array[Math.floor(this.uniform() * array.length)]; }\n nextBoolean() { return this.uniform() < 0.5; }\n uniform() {\n let t = this.#seed += 0x6D2B79F5;\n t = Math.imul(t ^ t >>> 15, t | 1);\n t ^= t + Math.imul(t ^ t >>> 7, t | 61);\n return ((t ^ t >>> 14) >>> 0) / 4294967296.0;\n }\n}\n", "import { ByteCounter } from \"./data\";\n/**\n * Schema defines a fixed structure for numbers and boolean\n */\nexport var Schema;\n(function (Schema) {\n class Serializer {\n }\n Schema.createBuilder = (schema) => {\n const replace = (schema) => {\n const clone = schema instanceof Array ? [] : {};\n Object.entries(schema).forEach(([key, value]) => {\n if (value instanceof Serializer) {\n clone[key] = value.initialValue();\n }\n else if (typeof value === \"object\") {\n clone[key] = replace(value);\n }\n });\n return clone;\n };\n return () => new IOImpl(schema, Object.seal(replace(schema)));\n };\n Schema.bool = new class extends Serializer {\n read(input) { return input.readByte() === 1; }\n write(output, value) { output.writeByte(value ? 1 : 0); }\n initialValue() { return false; }\n };\n Schema.int8 = new class extends Serializer {\n read(input) { return input.readByte(); }\n write(output, value) { output.writeByte(value); }\n initialValue() { return 0; }\n };\n Schema.int16 = new class extends Serializer {\n read(input) { return input.readShort(); }\n write(output, value) { output.writeShort(value); }\n initialValue() { return 0; }\n };\n Schema.int32 = new class extends Serializer {\n read(input) { return input.readInt(); }\n write(output, value) { output.writeInt(value); }\n initialValue() { return 0; }\n };\n Schema.float = new class extends Serializer {\n read(input) { return input.readFloat(); }\n write(output, value) { output.writeFloat(value); }\n initialValue() { return 0.0; }\n };\n Schema.double = new class extends Serializer {\n read(input) { return input.readDouble(); }\n write(output, value) { output.writeDouble(value); }\n initialValue() { return 0.0; }\n };\n Schema.int64 = new class extends Serializer {\n read(input) { return input.readLong(); }\n write(output, value) { output.writeLong(value); }\n initialValue() { return 0n; }\n };\n Schema.floats = (length) => new class extends Serializer {\n read(input, values) {\n for (let i = 0; i < values.length; i++) {\n values[i] = input.readFloat();\n }\n return values;\n }\n write(output, values) {\n for (let i = 0; i < values.length; i++) {\n output.writeFloat(values[i]);\n }\n }\n initialValue() { return new Float32Array(length); }\n };\n Schema.doubles = (length) => new class extends Serializer {\n read(input, values) {\n for (let i = 0; i < values.length; i++) {\n values[i] = input.readDouble();\n }\n return values;\n }\n write(output, values) {\n for (let i = 0; i < values.length; i++) {\n output.writeDouble(values[i]);\n }\n }\n initialValue() { return new Float64Array(length); }\n };\n class IOImpl {\n #schema;\n #object;\n #bytesTotal;\n constructor(schema, object) {\n this.#schema = schema;\n this.#object = object;\n this.#bytesTotal = this.#count();\n }\n get object() { return this.#object; }\n get bytesTotal() { return this.#bytesTotal; }\n read(input) {\n const collector = (schema, object) => {\n Object.entries(schema).forEach(([key, value]) => {\n const data = object;\n if (value instanceof Serializer) {\n data[key] = value.read(input, data[key]);\n }\n else if (typeof value === \"object\") {\n collector(value, data[key]);\n }\n });\n };\n collector(this.#schema, this.#object);\n }\n write(output) {\n const collector = (schema, object) => {\n Object.entries(schema).forEach(([key, value]) => {\n const data = object;\n if (value instanceof Serializer) {\n value.write(output, data[key]);\n }\n else if (typeof value === \"object\") {\n collector(value, data[key]);\n }\n });\n };\n collector(this.#schema, this.#object);\n }\n #count() {\n const counter = new ByteCounter();\n this.write(counter);\n return counter.count;\n }\n }\n})(Schema || (Schema = {}));\n", "import { isDefined, panic } from \"./lang\";\nimport { Arrays } from \"./arrays\";\nimport { Option } from \"./option\";\nimport { BinarySearch } from \"./binary-search\";\n/**\n * SortedSet\n * ---------------------------\n * Advantages Over Native Set\n * ---------------------------\n * Custom Key Extraction: Allows using complex keys (like UUID) with custom comparison logic\n * Ordered Iteration: Elements are always iterated in sorted order (not necessarily favored)\n * Efficient Lookups: O(log n) lookups using binary search\n * Flexible Duplicate Handling: Control whether to replace or duplicates or throw an error\n * -----------------------------\n * Disadvantages Over Native Set\n * -----------------------------\n * No Range Operations: No efficient range-based operations\n * Losing insert order: Elements get sorted by key and not insert order\n */\nexport class SortedSet {\n #extractor;\n #comparator;\n #array;\n constructor(extractor, comparator) {\n this.#extractor = extractor;\n this.#comparator = comparator;\n this.#array = [];\n }\n add(value, replace = false) {\n const key = this.#extractor(value);\n const insertIndex = BinarySearch.leftMostMapped(this.#array, key, this.#comparator, this.#extractor);\n const current = this.#array[insertIndex];\n if (isDefined(current) && this.#comparator(this.#extractor(current), key) === 0) {\n if (replace) {\n this.#array.splice(insertIndex, 1, value);\n return true;\n }\n return false;\n }\n this.#array.splice(insertIndex, 0, value);\n return true;\n }\n getOrCreate(key, factory) {\n const insertIndex = BinarySearch.leftMostMapped(this.#array, key, this.#comparator, this.#extractor);\n const current = this.#array[insertIndex];\n if (isDefined(current) && this.#comparator(this.#extractor(current), key) === 0) {\n return current;\n }\n const value = factory(key);\n this.#array.splice(insertIndex, 0, value);\n return value;\n }\n addMany(values) {\n for (const value of values) {\n this.#array.push(value);\n }\n try {\n this.#array.sort((a, b) => {\n const delta = this.#comparator(this.#extractor(a), this.#extractor(b));\n if (delta === 0) {\n throw \"cancel\";\n }\n return delta;\n });\n return true;\n }\n catch (reason) {\n if (reason === \"cancel\") {\n const uniqueKeys = new Map(this.entries());\n this.#array.splice(0, this.#array.length, ...uniqueKeys.values());\n this.#array.sort((a, b) => this.#comparator(this.#extractor(a), this.#extractor(b)));\n return false;\n }\n return panic(reason);\n }\n }\n removeByValue(value) { return this.removeByKey(this.#extractor(value)); }\n removeByKey(key) {\n const deleteIndex = BinarySearch.leftMostMapped(this.#array, key, this.#comparator, this.#extractor);\n const candidate = this.#array[deleteIndex];\n if (isDefined(candidate) && this.#comparator(this.#extractor(candidate), key) === 0) {\n this.#array.splice(deleteIndex, 1);\n return candidate;\n }\n return panic(`Could not remove ${key}`);\n }\n removeRange(startIndex, endIndex) {\n this.#array.splice(startIndex, (endIndex ?? this.#array.length) - startIndex);\n }\n removeByPredicate(predicate) {\n let count = 0 | 0;\n let index = this.#array.length;\n while (--index >= 0) {\n if (predicate(this.#array[index])) {\n this.#array.splice(index, 1);\n count++;\n }\n }\n return count;\n }\n get(key) {\n const candidate = this.#lookup(key);\n if (isDefined(candidate)) {\n return candidate;\n }\n else {\n return panic(`Unknown key: ${key}`);\n }\n }\n getOrThrow(key, provider) {\n const candidate = this.#lookup(key);\n if (isDefined(candidate)) {\n return candidate;\n }\n else {\n throw provider();\n }\n }\n opt(key) { return Option.wrap(this.#lookup(key)); }\n getOrNull(key) { return this.#lookup(key) ?? null; }\n getByIndex(index) { return this.#array[index]; }\n hasKey(key) { return isDefined(this.#lookup(key)); }\n hasValue(value) { return isDefined(this.#lookup(this.#extractor(value))); }\n size() { return this.#array.length; }\n isEmpty() { return this.#array.length === 0; }\n forEach(procedure) { this.values().forEach(procedure); }\n values() { return this.#array; }\n entries() { return this.#array.map((entry) => [this.#extractor(entry), entry]); }\n clear() { Arrays.clear(this.#array); }\n [Symbol.iterator]() { return this.#array.values(); }\n #lookup(key) {\n const index = BinarySearch.leftMostMapped(this.#array, key, this.#comparator, this.#extractor);\n const candidate = this.#array[index];\n return isDefined(candidate) && this.#comparator(this.#extractor(candidate), key) === 0 ? candidate : undefined;\n }\n}\n", "import { isDefined } from \"./lang\";\nexport var Strings;\n(function (Strings) {\n Strings.hyphenToCamelCase = (value) => value\n .replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n Strings.fallback = (value, fallback) => isDefined(value) && value.length > 0 ? value : fallback;\n Strings.endsWithDigit = (str) => /\\d$/.test(str);\n Strings.nonEmpty = (str, fallback) => isDefined(str) && str.trim().length > 0 ? str : fallback;\n // UTF-8\n Strings.toArrayBuffer = (str) => {\n const buffer = new ArrayBuffer(str.length);\n const view = new Uint8Array(buffer);\n for (let i = 0; i < str.length; i++) {\n view[i] = str.charCodeAt(i);\n }\n return buffer;\n };\n Strings.getUniqueName = (existingNames, desiredName) => {\n const existingSet = new Set(existingNames);\n let test = desiredName;\n let counter = 1;\n if (existingSet.has(desiredName) || existingSet.has(`${desiredName} 1`)) {\n counter = 2;\n }\n else {\n return desiredName;\n }\n while (existingSet.has(test = `${desiredName} ${counter++}`)) { }\n return test;\n };\n})(Strings || (Strings = {}));\n", "import { Unhandled } from \"./lang\";\nexport class TimeSpan {\n static POSITIVE_INFINITY = new TimeSpan(Number.POSITIVE_INFINITY);\n static millis = (value) => new TimeSpan(value);\n static seconds = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_SECOND);\n static minutes = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_MINUTE);\n static hours = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_HOUR);\n static days = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_DAY);\n static #MILLI_SECONDS_PER_SECOND = 1_000;\n static #MILLI_SECONDS_PER_MINUTE = 60_000;\n static #MILLI_SECONDS_PER_HOUR = 3_600_000;\n static #MILLI_SECONDS_PER_DAY = 86_400_000;\n #ms;\n constructor(ms) { this.#ms = ms; }\n millis() { return this.#ms; }\n absSeconds() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_SECOND; }\n absMinutes() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_MINUTE; }\n absHours() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_HOUR; }\n absDays() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_DAY; }\n split() {\n return {\n d: Math.floor(this.absDays()),\n h: Math.floor(this.absHours()) % 24,\n m: Math.floor(this.absMinutes()) % 60,\n s: Math.floor(this.absSeconds()) % 60\n };\n }\n isNow() { return this.#ms === 0.0; }\n isPast() { return this.#ms < 0.0; }\n isFuture() { return this.#ms > 0.0; }\n toUnitString() {\n let value, unit;\n const seconds = Math.floor(Math.abs(this.#ms) / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n if (seconds < 60) {\n value = seconds;\n unit = \"second\";\n }\n else if (minutes < 60) {\n value = minutes;\n unit = \"minute\";\n }\n else if (hours < 24) {\n value = hours;\n unit = \"hour\";\n }\n else {\n value = days;\n unit = \"day\";\n }\n return new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\", style: \"long\" })\n .format(value * Math.sign(this.#ms), unit);\n }\n toString() {\n if (isNaN(this.#ms)) {\n return \"NaN\";\n }\n if (!isFinite(this.#ms)) {\n return \"\u221E\";\n }\n const { d, h, m, s } = this.split();\n if (d > 0) {\n return [\n TimeSpan.#quantity(\"d\", d), TimeSpan.#quantity(\"h\", h),\n TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (h > 0) {\n return [\n TimeSpan.#quantity(\"h\", h), TimeSpan.#quantity(\"m\", m),\n TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (m > 0) {\n return [TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)]\n .join(\", \");\n }\n else if (s > 0) {\n return TimeSpan.#quantity(\"s\", s);\n }\n else {\n return \"now\";\n }\n }\n static #quantity = (name, count) => {\n switch (name) {\n case \"d\":\n return `${count} ${count < 2 ? \"day\" : \"days\"}`;\n case \"h\":\n return `${count} ${count < 2 ? \"hour\" : \"hours\"}`;\n case \"m\":\n return `${count} ${count < 2 ? \"minute\" : \"minutes\"}`;\n case \"s\":\n return `${count} ${count < 2 ? \"second\" : \"seconds\"}`;\n default:\n return Unhandled(name);\n }\n };\n}\n", "import { ByteArrayInput, ByteArrayOutput } from \"./data\";\nimport { panic } from \"./lang\";\nexport var SyncStream;\n(function (SyncStream) {\n let State;\n (function (State) {\n State[State[\"READING\"] = 0] = \"READING\";\n State[State[\"READ\"] = 1] = \"READ\";\n State[State[\"WRITING\"] = 2] = \"WRITING\";\n State[State[\"WRITTEN\"] = 3] = \"WRITTEN\";\n })(State || (State = {}));\n SyncStream.writer = (io, buffer, populate) => {\n if (io.bytesTotal + 1 > buffer.byteLength) {\n return panic(\"Insufficient memory allocated.\");\n }\n const array = new Uint8Array(buffer);\n const output = ByteArrayOutput.use(buffer, 1);\n Atomics.store(array, 0, State.READ);\n return {\n tryWrite: () => {\n if (Atomics.compareExchange(array, 0, State.READ, State.WRITING) === State.WRITING) {\n populate(io.object);\n output.position = 0;\n io.write(output);\n Atomics.store(array, 0, State.WRITTEN);\n return true;\n }\n return false;\n }\n };\n };\n SyncStream.reader = (io, procedure) => {\n const buffer = new SharedArrayBuffer(io.bytesTotal + 1);\n const array = new Uint8Array(buffer);\n const input = new ByteArrayInput(buffer, 1);\n return {\n buffer,\n tryRead: () => {\n if (Atomics.compareExchange(array, 0, State.WRITTEN, State.READING) === State.READING) {\n input.position = 0;\n io.read(input);\n procedure(io.object);\n Atomics.store(array, 0, State.READ);\n return true;\n }\n return false;\n }\n };\n };\n})(SyncStream || (SyncStream = {}));\n", "import { Arrays } from \"./arrays\";\nimport { assert, panic } from \"./lang\";\nimport { SortedSet } from \"./sorted-set\";\nexport var UUID;\n(function (UUID) {\n UUID.length = 16;\n UUID.generate = () => {\n return fromUint8Array(crypto.getRandomValues(new Uint8Array(UUID.length)));\n };\n UUID.sha256 = async (buffer) => {\n return crypto.subtle.digest(\"SHA-256\", buffer)\n .then(buffer => fromUint8Array(new Uint8Array(buffer.slice(0, UUID.length))));\n };\n UUID.validate = (uuid) => UUID.parse(UUID.toString(uuid));\n UUID.fromDataInput = (input) => {\n const arr = new Uint8Array(UUID.length);\n input.readBytes(new Int8Array(arr.buffer));\n return arr;\n };\n UUID.toDataOutput = (output, uuid) => output.writeBytes(new Int8Array(uuid.buffer));\n UUID.toString = (format) => {\n const hex = Arrays.create(index => (index + 0x100).toString(16).substring(1), 256);\n return hex[format[0]] + hex[format[1]] +\n hex[format[2]] + hex[format[3]] + \"-\" +\n hex[format[4]] + hex[format[5]] + \"-\" +\n hex[format[6]] + hex[format[7]] + \"-\" +\n hex[format[8]] + hex[format[9]] + \"-\" +\n hex[format[10]] + hex[format[11]] +\n hex[format[12]] + hex[format[13]] +\n hex[format[14]] + hex[format[15]];\n };\n UUID.parse = (string) => {\n const cleanUuid = string.replace(/-/g, \"\").toLowerCase();\n if (cleanUuid.length !== 32) {\n return panic(\"Invalid UUID format\");\n }\n const bytes = new Uint8Array(UUID.length);\n for (let i = 0, j = 0; i < 32; i += 2, j++) {\n bytes[j] = parseInt(cleanUuid.slice(i, i + 2), 16);\n }\n return bytes;\n };\n UUID.Comparator = (a, b) => {\n if (a.length !== UUID.length || b.length !== UUID.length) {\n return panic(\"Unexpected array length for uuid(v4)\");\n }\n for (let i = 0; i < UUID.length; i++) {\n const delta = a[i] - b[i];\n if (delta !== 0) {\n return delta;\n }\n }\n return 0;\n };\n UUID.equals = (a, b) => UUID.Comparator(a, b) === 0;\n UUID.newSet = (key) => new SortedSet(key, UUID.Comparator);\n UUID.Lowest = UUID.parse(\"00000000-0000-4000-8000-000000000000\");\n UUID.Highest = UUID.parse(\"FFFFFFFF-FFFF-4FFF-BFFF-FFFFFFFFFFFF\");\n UUID.fromInt = (value) => {\n const result = new Uint8Array(UUID.Lowest);\n const array = new Uint8Array(new Uint32Array([value]).buffer);\n for (let i = 0; i < 4; i++) {\n result[i] = array[i];\n }\n return result;\n };\n const fromUint8Array = (arr) => {\n assert(arr.length === UUID.length, \"UUID must be 16 bytes long\");\n arr[6] = (arr[6] & 0x0f) | 0x40; // Version 4 (random)\n arr[8] = (arr[8] & 0x3f) | 0x80; // Variant 10xx for UUID\n return arr;\n };\n})(UUID || (UUID = {}));\n", "import { Arrays } from \"./arrays\";\nimport { NumberComparator } from \"./comparators\";\nimport { assert, isDefined } from \"./lang\";\nimport { clamp } from \"./math\";\nimport { BinarySearch } from \"./binary-search\";\nexport var ValueGuide;\n(function (ValueGuide) {\n ValueGuide.create = (option) => {\n if (isDefined(option)) {\n if (isDefined(option?.snap)) {\n return ValueGuide.snap(option?.trackLength, option?.snap?.snapLength, Array.isArray(option?.snap?.threshold)\n ? option?.snap.threshold\n : [option?.snap?.threshold]);\n }\n else {\n return ValueGuide.identity(option?.trackLength);\n }\n }\n else {\n return ValueGuide.identity();\n }\n };\n ValueGuide.snap = (trackLength = DEFAULT_TRACK_LENGTH, snapLength = DEFAULT_SNAP_LENGTH, thresholds) => new Snap(trackLength, snapLength / trackLength, thresholds);\n ValueGuide.identity = (trackLength = DEFAULT_TRACK_LENGTH) => new Identity(trackLength);\n const DEFAULT_TRACK_LENGTH = 128;\n const DEFAULT_SNAP_LENGTH = 24;\n class Identity {\n length;\n #x = NaN;\n #value = NaN;\n #ratio = 1.0;\n constructor(length) {\n this.length = length;\n }\n begin(value) { this.#value = this.#x = value; }\n moveBy(delta) {\n assert(!isNaN(this.#value), () => \"value has never been set\");\n this.#x += delta / this.length * this.#ratio;\n this.#value = clamp(this.#x, 0.0, 1.0);\n }\n ratio(value) { this.#ratio = value; }\n value() {\n assert(!isNaN(this.#value), () => \"value has never been set\");\n return this.#value;\n }\n disable() { }\n enable() { }\n }\n class Snap {\n #length;\n #margin;\n #thresholds;\n #ranges;\n #x = NaN; // unhinged floating value including the snapping margin\n #value = NaN; // clamped normalised, exposable value\n #ratio = 1.0;\n #enabled = true;\n constructor(length, margin, thresholds) {\n assert(margin > 0.0, () => `margin(${margin}) must be greater then 0`);\n assert(Arrays.isSorted(thresholds), () => \"thresholds are not sorted\");\n assert(margin < length, () => `margin(${margin}) must be lower then length(${length})`);\n this.#length = length;\n this.#margin = margin;\n this.#thresholds = thresholds;\n this.#ranges = thresholds.map((x, index) => x + index * this.#margin);\n }\n begin(value) {\n if (this.#enabled) {\n this.#x = this.valueToX(value);\n }\n this.#value = value;\n }\n moveBy(delta) {\n assert(!isNaN(this.#value), () => \"value has never been set\");\n this.#x += delta / this.#length * this.#ratio;\n this.#value = this.#enabled ? this.xToValue(this.#x) : clamp(this.#x, 0.0, 1.0);\n }\n ratio(value) { this.#ratio = value; }\n value() {\n assert(!isNaN(this.#value), () => \"value has never been set\");\n return this.#value;\n }\n disable() {\n if (!this.#enabled) {\n return;\n }\n this.#enabled = false;\n this.#x = this.xToValue(this.#x);\n }\n enable() {\n if (this.#enabled) {\n return;\n }\n this.#enabled = true;\n this.#x = this.valueToX(this.#x);\n }\n valueToX(value) {\n const index = BinarySearch.rightMost(this.#thresholds, value, NumberComparator);\n if (index < 0) {\n return value;\n }\n else {\n const range = this.#ranges[index];\n const threshold = this.#thresholds[index];\n return value === threshold ? range + this.#margin / 2.0 : range + this.#margin + (value - threshold);\n }\n }\n xToValue(x) {\n const clamped = clamp(x, 0.0, 1.0 + this.#margin * this.#thresholds.length);\n const index = BinarySearch.rightMost(this.#ranges, clamped, NumberComparator);\n if (index < 0) {\n return clamped;\n }\n else {\n const range = this.#ranges[index];\n const threshold = this.#thresholds[index];\n if (clamped > range + this.#margin) {\n return clamped - (range + this.#margin) + threshold;\n }\n else {\n return threshold;\n }\n }\n }\n get margin() { return this.#margin; }\n }\n})(ValueGuide || (ValueGuide = {}));\n", "const key = Symbol.for(\"@openDAW/lib-std\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nexport * from \"./arrays\";\nexport * from \"./attempts\";\nexport * from \"./bijective\";\nexport * from \"./binary-search\";\nexport * from \"./bits\";\nexport * from \"./cache\";\nexport * from \"./color\";\nexport * from \"./comparators\";\nexport * from \"./curve\";\nexport * from \"./data\";\nexport * from \"./decorators\";\nexport * from \"./generators\";\nexport * from \"./geom\";\nexport * from \"./hash\";\nexport * from \"./intervals\";\nexport * from \"./iterables\";\nexport * from \"./lang\";\nexport * from \"./listeners\";\nexport * from \"./math\";\nexport * from \"./maps\";\nexport * from \"./multimap\";\nexport * from \"./numeric\";\nexport * from \"./objects\";\nexport * from \"./observers\";\nexport * from \"./option\";\nexport * from \"./parameters\";\nexport * from \"./predicates\";\nexport * from \"./progress\";\nexport * from \"./random\";\nexport * from \"./range\";\nexport * from \"./schema\";\nexport * from \"./selection\";\nexport * from \"./sets\";\nexport * from \"./sorted-set\";\nexport * from \"./string-mapping\";\nexport * from \"./strings\";\nexport * from \"./terminable\";\nexport * from \"./time-span\";\nexport * from \"./sync-stream\";\nexport * from \"./uuid\";\nexport * from \"./value-guides\";\nexport * from \"./value-mapping\";\n", "import { asDefined, assert, isDefined, Iterables, panic } from \"@opendaw/lib-std\";\n/**\n * Communicator provides type-safe communication between Window, Worker, MessagePort, BroadcastChannel.\n * Passed objects are structured cloned: https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n * It is highly advised not to pass classes with methods and or real private properties (starting with #).\n * They will lose their prototype and private property inheritance, and it is cumbersome to patch that up later.\n * Also read: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain\n */\nexport var Communicator;\n(function (Communicator) {\n Communicator.sender = (messenger, bind) => bind(new Sender(messenger));\n Communicator.executor = (messenger, protocol) => new Executor(messenger, protocol);\n class Sender {\n #messenger;\n #expected = new Map();\n #subscription;\n #returnId = 0;\n constructor(messenger) {\n this.#messenger = messenger;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n dispatchAndForget = (func, ...args) => this.#messenger.send({\n type: \"send\",\n returnId: false,\n func: func.name,\n args: Array.from(Iterables.map(args, arg => ({ value: arg })))\n });\n dispatchAndReturn = (func, ...args) => new Promise((resolve, reject) => {\n const entries = Iterables.reduce(args, (callbacks, arg, index) => {\n if (typeof arg === \"function\") {\n callbacks.push([index, arg]);\n }\n return callbacks;\n }, []);\n this.#expected.set(this.#returnId, {\n executorTuple: { resolve, reject },\n callbacks: new Map(entries)\n });\n this.#messenger.send({\n type: \"send\",\n returnId: this.#returnId,\n func: func.name,\n args: Array.from(Iterables.map(args, (arg, index) => typeof arg === \"function\" ? ({ callback: index }) : ({ value: arg })))\n });\n this.#returnId++;\n });\n #messageHandler = (message) => {\n const returns = this.#expected.get(message.returnId);\n if (isDefined(returns)) {\n if (message.type === \"resolve\") {\n returns.executorTuple.resolve(message.resolve);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"reject\") {\n returns.executorTuple.reject(message.reject);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"callback\") {\n returns.callbacks?.get(message.funcAt).apply(this, message.args);\n }\n }\n else {\n panic(`Promise has already been resolved. ${JSON.stringify(message)}`);\n }\n };\n }\n class Executor {\n #messenger;\n #protocol;\n #subscription;\n constructor(messenger, protocol) {\n this.#messenger = messenger;\n this.#protocol = protocol;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n #messageHandler = (message) => {\n assert(message.type === \"send\", () => \"Message type must be 'send'\");\n const object = Object.getPrototypeOf(this.#protocol) === Object.getPrototypeOf({})\n ? this.#protocol\n : Object.getPrototypeOf(this.#protocol);\n const func = asDefined(object[message.func], `${message.func.toString()} does not exists on ${this.#protocol}`);\n const returnId = message.returnId;\n if (returnId === false) {\n func.apply(this.#protocol, message.args.map((arg) => {\n return \"value\" in arg\n ? arg.value\n : panic(`${message.func.toString()} has no promise.`);\n }));\n }\n else {\n try {\n const promise = func.apply(this.#protocol, message.args\n .map(arg => \"callback\" in arg\n ? (...args) => this.#sendCallback(returnId, arg.callback, args)\n : arg.value));\n promise.then(value => this.#sendResolve(returnId, value), reason => this.#sendReject(returnId, reason));\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }\n };\n #sendResolve = (returnId, value) => this.#messenger.send({ type: \"resolve\", returnId, resolve: value });\n #sendReject = (returnId, reason) => this.#messenger.send({ type: \"reject\", returnId, reject: reason });\n #sendCallback = (returnId, func, args) => this.#messenger.send({ type: \"callback\", returnId, funcAt: func, args });\n }\n Communicator.Executor = Executor;\n})(Communicator || (Communicator = {}));\n", "import { asDefined, ByteArrayOutput } from \"@opendaw/lib-std\";\nexport var Fetch;\n(function (Fetch) {\n Fetch.ProgressArrayBuffer = (progress) => async (response) => {\n if (!response.headers.has(\"Content-Length\")) {\n console.debug(\"No Content-Length\");\n return response.arrayBuffer();\n }\n const length = parseInt(response.headers.get(\"Content-Length\"));\n console.debug(`Content-Length: ${length}b`);\n if (isNaN(length) || length < 4096) {\n return response.arrayBuffer();\n } // smaller sizes do not need progress\n progress(0.0);\n const output = ByteArrayOutput.create(length);\n const reader = asDefined(response.body, \"response.body is empty\").getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n value.forEach((value) => output.writeByte(value));\n progress(output.position / length);\n }\n progress(1.0);\n return output.toArrayBuffer();\n };\n})(Fetch || (Fetch = {}));\n", "export var Runtime;\n(function (Runtime) {\n // Debounces execution by delaying the call until after the timeout has passed without new invocations.\n Runtime.debounce = (() => {\n let id = undefined;\n return (exec, timeout = 1000) => {\n clearTimeout(id);\n id = setTimeout(exec, timeout);\n };\n })();\n Runtime.scheduleInterval = (exec, time, ...args) => {\n const id = setInterval(exec, time, ...args);\n return { terminate: () => clearInterval(id) };\n };\n Runtime.scheduleTimeout = (exec, time, ...args) => {\n const id = setTimeout(exec, time, ...args);\n return { terminate: () => clearTimeout(id) };\n };\n})(Runtime || (Runtime = {}));\n", "import { isDefined, Notifier } from \"@opendaw/lib-std\";\nexport const Messenger = { for: (port) => new NativeMessenger(port) };\nclass NativeMessenger {\n #port;\n #notifier = new Notifier();\n constructor(port) {\n this.#port = port;\n if (isDefined(port.onmessage) || isDefined(port.onmessageerror)) {\n console.error(port);\n throw new Error(`${port} is already wrapped.`);\n }\n port.onmessage = (event) => this.#notifier.notify(event.data);\n port.onmessageerror = (event) => { throw new Error(event.type); };\n }\n send(message) { this.#port.postMessage(message); }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#notifier.terminate();\n this.#port.onmessage = null;\n this.#port.onmessageerror = null;\n }\n}\nclass Channel {\n #messages;\n #name;\n #notifier = new Notifier();\n #subscription;\n constructor(messages, name) {\n this.#messages = messages;\n this.#name = name;\n this.#subscription = messages.subscribe(data => {\n if (\"message\" in data && \"channel\" in data && data.channel === name) {\n this.#notifier.notify(data.message);\n }\n });\n }\n send(message) { this.#messages.send({ channel: this.#name, message }); }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#subscription.terminate();\n this.#notifier.terminate();\n }\n}\n", "import { assert, InaccessibleProperty, Option, safeExecute, Terminable, TimeSpan } from \"@opendaw/lib-std\";\nexport class IntervalRetryOption {\n maxRetry;\n timeSpan;\n #count = 0 | 0;\n constructor(maxRetry, timeSpan) {\n this.maxRetry = maxRetry;\n this.timeSpan = timeSpan;\n }\n retry(reason, exec) {\n if (++this.#count === this.maxRetry) {\n return false;\n }\n console.debug(`${reason} > will retry in ${this.timeSpan.toString()}`);\n setTimeout(exec, this.timeSpan.millis());\n return true;\n }\n}\nexport var Promises;\n(function (Promises) {\n class ResolveResult {\n value;\n status = \"resolved\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when promise is resolved\");\n }\n class RejectedResult {\n error;\n status = \"rejected\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when promise is rejected\");\n }\n Promises.makeAbortable = async (owner, promise) => {\n let running = true;\n owner.own(Terminable.create(() => running = false));\n return new Promise((resolve, reject) => promise.then(value => { if (running) {\n resolve(value);\n } }, reason => { if (running) {\n reject(reason);\n } }));\n };\n Promises.tryCatch = (promise) => promise.then(value => new ResolveResult(value), error => new RejectedResult(error));\n Promises.retry = (call, retryOption = new IntervalRetryOption(3, TimeSpan.seconds(3))) => call().catch(reason => new Promise((resolve, reject) => {\n const onFailure = (reason) => {\n if (!retryOption.retry(reason, () => call().then((value) => resolve(value), onFailure))) {\n reject(reason);\n }\n };\n onFailure(reason);\n }));\n // this is for testing the catch branch\n Promises.fail = (after, thenUse) => {\n let use = () => new Promise((_, reject) => setTimeout(() => reject(\"fails first\"), after.millis()));\n return () => {\n const promise = use();\n use = thenUse;\n return promise;\n };\n };\n Promises.timeout = (promise, timeSpan, fail) => {\n return new Promise((resolve, reject) => {\n let running = true;\n const timeout = setTimeout(() => {\n running = false;\n reject(new Error(fail ?? \"timeout\"));\n }, timeSpan.millis());\n promise\n .then((value) => { if (running) {\n resolve(value);\n } }, reason => { if (running) {\n reject(reason);\n } })\n .finally(() => clearTimeout(timeout));\n });\n };\n Promises.sequential = (fn) => {\n let lastPromise = Promise.resolve(null);\n return (arg) => lastPromise = lastPromise.then(() => fn(arg));\n };\n class Limit {\n max;\n #waiting;\n #running = 0 | 0;\n constructor(max = 1) {\n this.max = max;\n this.#waiting = [];\n }\n async add(provider) {\n if (this.#running < this.max) {\n this.#running++;\n return provider().finally(() => this.#continue());\n }\n else {\n const resolvers = Promise.withResolvers();\n this.#waiting.push([provider, resolvers]);\n return resolvers.promise.finally(() => this.#continue());\n }\n }\n #continue() {\n assert(this.#running > 0, \"Internal Error in Promises.Limit\");\n if (--this.#running < this.max) {\n if (this.#waiting.length > 0) {\n const [provider, { resolve, reject }] = this.#waiting.shift();\n this.#running++;\n provider().then(resolve, reject);\n }\n }\n }\n }\n Promises.Limit = Limit;\n class Latest {\n #onResolve;\n #onReject;\n #onFinally;\n #latest = Option.None;\n constructor(onResolve, onReject, onFinally) {\n this.#onResolve = onResolve;\n this.#onReject = onReject;\n this.#onFinally = onFinally;\n }\n update(promise) {\n this.#latest = Option.wrap(promise);\n promise\n .then(value => { if (this.#latest.contains(promise)) {\n this.#onResolve(value);\n } })\n .catch(reason => { if (this.#latest.contains(promise)) {\n this.#onReject(reason);\n } })\n .finally(() => {\n if (this.#latest.contains(promise)) {\n this.terminate();\n safeExecute(this.#onFinally);\n }\n });\n }\n terminate() { this.#latest = Option.None; }\n }\n Promises.Latest = Latest;\n})(Promises || (Promises = {}));\n", "import { Promises } from \"./promises\";\nexport var network;\n(function (network) {\n const limit = new Promises.Limit(4);\n network.limitFetch = (input, init) => limit.add(() => fetch(input, init));\n})(network || (network = {}));\n", "export const stopwatch = (level = \"debug\") => {\n const startTime = performance.now();\n return {\n lab: (label) => console[level].call(console, `${label} in ${(performance.now() - startTime).toFixed(1)}ms`)\n };\n};\n", "import { TimeSpan } from \"@opendaw/lib-std\";\nexport var TimeSpanUtils;\n(function (TimeSpanUtils) {\n TimeSpanUtils.startEstimator = () => {\n const startTime = performance.now();\n return (progress) => {\n if (progress === 0.0) {\n return TimeSpan.POSITIVE_INFINITY;\n }\n const runtime = (performance.now() - startTime);\n return TimeSpan.millis(runtime / progress - runtime);\n };\n };\n})(TimeSpanUtils || (TimeSpanUtils = {}));\n", "import { tryCatch } from \"@opendaw/lib-std\";\nexport var Wait;\n(function (Wait) {\n Wait.frame = () => new Promise(resolve => requestAnimationFrame(() => resolve()));\n Wait.frames = (numFrames) => new Promise(resolve => {\n let count = numFrames;\n const callback = () => { if (--count <= 0) {\n resolve();\n }\n else {\n requestAnimationFrame(callback);\n } };\n requestAnimationFrame(callback);\n });\n Wait.timeSpan = (time, ...args) => new Promise(resolve => setTimeout(resolve, time.millis(), ...args));\n Wait.event = (target, type) => new Promise(resolve => target.addEventListener(type, resolve, { once: true }));\n Wait.observable = (observable) => new Promise(resolve => {\n const terminable = observable.subscribe(() => {\n terminable.terminate();\n resolve();\n });\n });\n Wait.complete = (generator) => new Promise((resolve, reject) => {\n const interval = setInterval(() => {\n const { status, value: next, error } = tryCatch(() => generator.next());\n if (status === \"success\") {\n const { done, value } = next;\n if (done) {\n clearInterval(interval);\n resolve(value);\n }\n }\n else {\n clearInterval(interval);\n reject(error);\n }\n }, 0);\n });\n})(Wait || (Wait = {}));\n", "const key = Symbol.for(\"@openDAW/lib-runtime\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nexport * from \"./communicator\";\nexport * from \"./fetch\";\nexport * from \"./runtime\";\nexport * from \"./messenger\";\nexport * from \"./network\";\nexport * from \"./promises\";\nexport * from \"./stopwatch\";\nexport * from \"./timespan\";\nexport * from \"./wait\";\n", "import { Arrays, assert, BinarySearch, SortedSet, UUID } from \"@opendaw/lib-std\";\nexport class Address {\n static newSet(keyExtractor) {\n return new SortedSet(keyExtractor, Address.Comparator);\n }\n static compose = (uuid, ...fieldKeys) => {\n const keys = fieldKeys.length === 0 ? this.#EMPTY_FIELD_KEYS : new Int16Array(fieldKeys);\n assert(keys.every((value, index) => value === fieldKeys[index]), `fieldKeys (${keys.join(\",\")}) only allows i16`);\n return new Address(uuid, keys);\n };\n static decode(str) {\n const parts = str.split(\"/\");\n assert(parts.length > 0, \"Unable to parse Address\");\n return Address.compose(UUID.parse(parts[0]), ...parts.slice(1).map(x => parseInt(x)));\n }\n static reconstruct(layout) { return this.compose(layout[0], ...layout[1]); }\n static boxRange(set, id, map) {\n const sorted = set.values();\n const startIndex = BinarySearch.leftMostMapped(sorted, id, UUID.Comparator, map);\n const length = sorted.length;\n if (startIndex < 0 || startIndex >= length) {\n return null;\n }\n for (let endIndex = startIndex; endIndex < length; endIndex++) {\n if (UUID.Comparator(map(sorted[endIndex]), id) !== 0) {\n if (startIndex < endIndex) {\n return [startIndex, endIndex];\n }\n else {\n return null;\n }\n }\n }\n return [startIndex, length];\n }\n static Comparator = (a, b) => {\n const compareId = UUID.Comparator(a.#uuid, b.#uuid);\n if (compareId !== 0) {\n return compareId;\n }\n const n = Math.min(a.#fieldKeys.length, b.#fieldKeys.length);\n for (let i = 0; i < n; i++) {\n const comparison = (a.#fieldKeys)[i] - (b.#fieldKeys)[i];\n if (comparison !== 0) {\n return comparison;\n }\n }\n return a.#fieldKeys.length - b.#fieldKeys.length;\n };\n static MinimalComparator = (a, b) => {\n const compareId = UUID.Comparator(a.#uuid, b.#uuid);\n if (compareId !== 0) {\n return compareId;\n }\n const n = Math.min(a.#fieldKeys.length, b.#fieldKeys.length);\n for (let i = 0; i < n; i++) {\n const comparison = (a.#fieldKeys)[i] - (b.#fieldKeys)[i];\n if (comparison !== 0) {\n return comparison;\n }\n }\n return 0;\n };\n static LengthComparator = (a, b) => {\n const compareId = UUID.Comparator(a.#uuid, b.#uuid);\n if (compareId !== 0) {\n return compareId;\n }\n return b.#fieldKeys.length - a.#fieldKeys.length;\n };\n static #EMPTY_FIELD_KEYS = new Int16Array(0);\n #uuid;\n #fieldKeys;\n constructor(uuid, fieldKeys) {\n this.#uuid = uuid;\n this.#fieldKeys = fieldKeys;\n }\n get uuid() { return this.#uuid; }\n get fieldKeys() { return this.#fieldKeys; }\n isBox() { return this.#fieldKeys.length === 0; }\n isContent() { return !this.isBox(); }\n equals(other) { return Address.Comparator(this, other) === 0; }\n compareTo(other) { return Address.Comparator(this, other); }\n append(key) {\n return new Address(this.#uuid, new Int16Array([...this.#fieldKeys, key]));\n }\n startsWith(other) {\n return UUID.Comparator(other.#uuid, this.#uuid) === 0\n && other.#fieldKeys.length <= this.#fieldKeys.length\n && other.#fieldKeys.every((value, index) => this.#fieldKeys[index] === value);\n }\n write(output) {\n output.writeBytes(new Int8Array(this.#uuid.buffer));\n output.writeByte(this.#fieldKeys.length);\n this.#fieldKeys.forEach(key => output.writeShort(key));\n }\n decompose() { return [this.#uuid, this.#fieldKeys]; }\n toJSON() { return { uuid: Array.from(this.#uuid.values()), fields: Array.from(this.#fieldKeys.values()) }; }\n toArrayBuffer() {\n const array = new Uint8Array(UUID.length + this.#fieldKeys.length);\n array.set(this.#uuid, 0);\n array.set(this.#fieldKeys, UUID.length);\n return array.buffer;\n }\n toString() { return [UUID.toString(this.#uuid), ...this.#fieldKeys].join(\"/\"); }\n static read(input) {\n const uuidBytes = UUID.fromDataInput(input);\n const numFields = input.readByte();\n return Address.compose(uuidBytes, ...Arrays.create(() => input.readShort(), numFields));\n }\n}\nexport var Addressable;\n(function (Addressable) {\n Addressable.AddressReader = (addressable) => addressable.address;\n Addressable.Comparator = ({ address: a }, { address: b }) => Address.Comparator(a, b);\n Addressable.equals = (address, sorted) => {\n const [l, r] = BinarySearch.rangeMapped(sorted, address, Address.Comparator, Addressable.AddressReader);\n return sorted.slice(l, r + 1);\n };\n Addressable.startsWith = (address, sorted) => {\n const [l, r] = BinarySearch.rangeMapped(sorted, address, Address.MinimalComparator, Addressable.AddressReader);\n return sorted\n .slice(l, r + 1)\n .filter((addressable) => addressable.address.startsWith(address));\n };\n Addressable.endsWith = (address, sorted) => {\n const l = BinarySearch.leftMostMapped(sorted, address, Address.LengthComparator, Addressable.AddressReader);\n const r = BinarySearch.rightMostMapped(sorted, address, Address.MinimalComparator, Addressable.AddressReader);\n return sorted\n .slice(l, r + 1)\n .filter((addressable) => address.startsWith(addressable.address));\n };\n})(Addressable || (Addressable = {}));\n", "import { Iterables, Listeners, Option, panic } from \"@opendaw/lib-std\";\nimport { Address } from \"./address\";\nexport class PointerHub {\n static validate(pointer, target) {\n if (pointer.address.equals(target.address)) {\n return Option.wrap(`PointerField cannot point to itself: ${pointer}`);\n }\n if (!target.pointerRules.accepts.some((type) => type === pointer.pointerType)) {\n console.warn(target.pointerRules);\n return Option.wrap(`${pointer.toString()} does not satisfy any of the allowed types (${(target.pointerRules)}).`);\n }\n return Option.None;\n }\n #vertex;\n #immediateListeners;\n #transactualListeners;\n #inTransaction = Option.None;\n constructor(vertex) {\n this.#vertex = vertex;\n this.#immediateListeners = new Listeners();\n this.#transactualListeners = new Listeners();\n }\n subscribeImmediate(listener, ...filter) {\n return this.#addFilteredListener(this.#immediateListeners, listener, filter);\n }\n subscribeTransactual(listener, ...filter) {\n return this.#addFilteredListener(this.#transactualListeners, listener, filter);\n }\n catchupAndSubscribeTransactual(listener, ...filter) {\n const added = Address.newSet(pointer => pointer.address);\n added.addMany(this.filter(...filter));\n added.forEach(pointer => listener.onAdd(pointer));\n // This takes track of the listeners notification state.\n // It is possible that the pointer has been added, but it has not been notified yet.\n // That would cause the listener.onAdd method to be involked twice.\n return this.subscribeTransactual({\n onAdd: (pointer) => {\n if (added.add(pointer)) {\n listener.onAdd(pointer);\n }\n },\n onRemove: (pointer) => {\n added.removeByKey(pointer.address);\n listener.onRemove(pointer);\n }\n }, ...filter);\n }\n filter(...types) {\n return (types.length === 0 ? this.incoming() : Iterables.filter(this, (pointerField) => types.some((type) => type === pointerField.pointerType)));\n }\n size() { return this.incoming().length; }\n isEmpty() { return this.size() === 0; }\n nonEmpty() { return this.size() > 0; }\n contains(pointer) { return this.incoming().some(incoming => pointer.address.equals(incoming.address)); }\n incoming() { return this.#vertex.graph.edges().incomingEdgesOf(this.#vertex); }\n onAdded(pointerField) {\n const issue = PointerHub.validate(pointerField, this.#vertex);\n if (issue.nonEmpty()) {\n return panic(issue.unwrap());\n }\n if (this.#inTransaction.isEmpty()) {\n this.#vertex.graph.subscribeEndTransaction(this.#onEndTransaction);\n this.#inTransaction = Option.wrap(new Set(this));\n }\n this.#immediateListeners.proxy.onAdd(pointerField);\n }\n onRemoved(pointerField) {\n if (this.#inTransaction.isEmpty()) {\n this.#vertex.graph.subscribeEndTransaction(this.#onEndTransaction);\n this.#inTransaction = Option.wrap(new Set(this));\n }\n this.#immediateListeners.proxy.onRemove(pointerField);\n }\n [Symbol.iterator]() { return this.incoming().values(); }\n toString() {\n return `{Pointers ${this.#vertex.address}, pointers: ${Array.from(this)\n .map((pointerField) => pointerField.toString())}}`;\n }\n #addFilteredListener(listeners, listener, filter) {\n return listeners.subscribe({\n onAdd: (pointer) => {\n if (filter.length === 0 || filter.some((type) => type === pointer.pointerType)) {\n listener.onAdd(pointer);\n }\n },\n onRemove: (pointer) => {\n if (filter.length === 0 || filter.some((type) => type === pointer.pointerType)) {\n listener.onRemove(pointer);\n }\n }\n });\n }\n #onEndTransaction = () => {\n if (this.#vertex.isAttached()) {\n const beforeState = this.#inTransaction.unwrap(\"Callback without transaction\");\n const afterState = new Set(this);\n beforeState.forEach(pointer => {\n if (!afterState.has(pointer)) {\n this.#transactualListeners.proxy.onRemove(pointer);\n }\n });\n afterState.forEach(pointer => {\n if (!beforeState.has(pointer)) {\n this.#transactualListeners.proxy.onAdd(pointer);\n }\n });\n }\n this.#inTransaction = Option.None;\n };\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nimport { Iterables, Lazy, Option, panic, safeExecute } from \"@opendaw/lib-std\";\nimport { Address } from \"./address\";\nimport { PointerHub } from \"./pointer-hub\";\nexport class Field {\n static hook(construct) {\n return new Field(construct);\n }\n #parent;\n #fieldKey;\n #fieldName;\n #pointerRules;\n constructor({ parent, fieldKey, fieldName, pointerRules }) {\n this.#parent = parent;\n this.#fieldKey = fieldKey;\n this.#fieldName = fieldName;\n this.#pointerRules = pointerRules;\n if (pointerRules.mandatory) {\n this.graph.edges().watchVertex(this);\n }\n }\n accept(visitor) {\n return safeExecute(visitor.visitField, this);\n }\n get box() { return this.#parent.box; }\n get graph() { return this.#parent.graph; }\n get parent() { return this.#parent; }\n get fieldKey() { return this.#fieldKey; }\n get fieldName() { return this.#fieldName; }\n get pointerRules() { return this.#pointerRules; }\n get pointerHub() { return new PointerHub(this); }\n get address() { return this.#parent.address.append(this.#fieldKey); }\n get debugPath() {\n return `${this.box.name}:${this.box.mapFields(field => field.fieldName, ...this.address.fieldKeys).join(\"/\")}`;\n }\n isBox() { return false; }\n isField() { return true; }\n isAttached() { return this.graph.findBox(this.address.uuid).nonEmpty(); }\n fields() { return Iterables.empty(); }\n getField(_key) { return panic(); }\n optField(_key) { return Option.None; }\n read(_input) { }\n write(_output) { }\n disconnect() {\n if (this.pointerHub.isEmpty()) {\n return;\n }\n const incoming = this.pointerHub.incoming();\n incoming.forEach(pointer => {\n pointer.defer();\n if (pointer.mandatory || (this.pointerRules.mandatory && incoming.length === 1)) {\n pointer.box.delete();\n }\n });\n }\n toString() { return `{${this.box.constructor.name}:${this.constructor.name} (${this.fieldName}) ${this.address.toString()}`; }\n}\n__decorate([\n Lazy,\n __metadata(\"design:type\", PointerHub),\n __metadata(\"design:paramtypes\", [])\n], Field.prototype, \"pointerHub\", null);\n__decorate([\n Lazy,\n __metadata(\"design:type\", Address),\n __metadata(\"design:paramtypes\", [])\n], Field.prototype, \"address\", null);\n__decorate([\n Lazy,\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], Field.prototype, \"debugPath\", null);\n", "export const NoPointers = Object.freeze({ mandatory: false, accepts: [] });\n", "import { assert, ByteArrayInput, ByteArrayOutput } from \"@opendaw/lib-std\";\nexport var Serializer;\n(function (Serializer) {\n const MAGIC_HEADER = 0x464c4453;\n Serializer.writeFields = (output, fields) => {\n const entries = Object.entries(fields);\n output.writeInt(MAGIC_HEADER);\n output.writeShort(entries.length);\n entries.forEach(([key, field]) => {\n const bytes = ByteArrayOutput.create();\n field.write(bytes);\n const buffer = new Int8Array(bytes.toArrayBuffer());\n output.writeShort(Number(key));\n output.writeInt(buffer.length);\n output.writeBytes(buffer);\n });\n };\n Serializer.readFields = (input, fields) => {\n assert(input.readInt() === MAGIC_HEADER, \"Serializer header is corrupt\");\n const numFields = input.readShort();\n for (let fieldIndex = 0; fieldIndex < numFields; fieldIndex++) {\n const key = input.readShort();\n const byteLength = input.readInt();\n const bytes = new Int8Array(byteLength);\n input.readBytes(bytes);\n fields[key]?.read(new ByteArrayInput(bytes.buffer));\n }\n };\n})(Serializer || (Serializer = {}));\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nimport { Address } from \"./address\";\nimport { Arrays, asDefined, asInstanceOf, ByteArrayOutput, ByteCounter, Lazy, Option } from \"@opendaw/lib-std\";\nimport { PointerHub } from \"./pointer-hub\";\nimport { Serializer } from \"./serializer\";\nexport class Box {\n static DEBUG_DELETION = false;\n static Index = 0 | 0;\n #address;\n #graph;\n #name;\n #pointerRules;\n #fields;\n #creationIndex = Box.Index++;\n constructor({ uuid, graph, name, pointerRules }) {\n this.#address = Address.compose(uuid);\n this.#graph = graph;\n this.#name = name;\n this.#pointerRules = pointerRules;\n this.#fields = this.initializeFields();\n if (pointerRules.mandatory) {\n this.graph.edges().watchVertex(this);\n }\n }\n fields() { return Object.values(this.#fields); }\n getField(key) { return asDefined(this.#fields[key]); }\n optField(key) { return Option.wrap(this.#fields[key]); }\n subscribe(propagation, procedure) {\n return this.graph.subscribeVertexUpdates(propagation, this.address, procedure);\n }\n get box() { return this; }\n get name() { return this.#name; }\n get graph() { return this.#graph; }\n get parent() { return this; }\n get address() { return this.#address; }\n get pointerRules() { return this.#pointerRules; }\n get creationIndex() { return this.#creationIndex; }\n get pointerHub() { return new PointerHub(this); }\n estimateMemory() {\n const byteCounter = new ByteCounter();\n this.write(byteCounter);\n return byteCounter.count;\n }\n isBox() { return true; }\n asBox(type) { return asInstanceOf(this, type); }\n isField() { return false; }\n isAttached() { return this.#graph.findBox(this.address.uuid).nonEmpty(); }\n read(input) { Serializer.readFields(input, this.#fields); }\n write(output) { Serializer.writeFields(output, this.#fields); }\n serialize() {\n const output = ByteArrayOutput.create();\n output.writeInt(this.#creationIndex); // allows to re-load the boxes in the same order as created\n output.writeString(this.name);\n output.writeBytes(new Int8Array(this.address.uuid.buffer));\n this.write(output);\n return output.toArrayBuffer();\n }\n toArrayBuffer() {\n const output = ByteArrayOutput.create();\n this.write(output);\n return output.toArrayBuffer();\n }\n incomingEdges() { return this.graph.edges().incomingEdgesOf(this); }\n outgoingEdges() { return this.graph.edges().outgoingEdgesOf(this); }\n mapFields(map, ...keys) {\n if (keys.length === 0) {\n return Arrays.empty();\n }\n let parent = this.getField(keys[0]);\n const result = [map(parent)];\n for (let index = 1; index < keys.length; index++) {\n parent = parent.getField(keys[index]);\n result.push(map(parent));\n }\n return result;\n }\n searchVertex(keys) {\n if (keys.length === 0) {\n return Option.wrap(this);\n }\n let parent = this.optField(keys[0]);\n if (parent.isEmpty()) {\n return Option.None;\n }\n for (let index = 1; index < keys.length; index++) {\n parent = parent.unwrap().optField(keys[index]);\n if (parent.isEmpty()) {\n return Option.None;\n }\n }\n return parent;\n }\n delete() {\n const { boxes, pointers } = this.graph.dependenciesOf(this);\n if (Box.DEBUG_DELETION) {\n console.debug(`Delete ${this.toString()}`);\n console.debug(\"\\tunplugs\", [...pointers].map(x => x.toString()).join(\"\\n\"));\n console.debug(\"\\tunstages\", [...boxes].map(x => x.toString()).join(\"\\n\"), this);\n }\n for (const pointer of pointers) {\n pointer.defer();\n }\n for (const box of boxes) {\n box.unstage();\n }\n this.unstage();\n }\n unstage() { this.graph.unstageBox(this); }\n toString() { return `${this.constructor.name} ${this.address.toString()}`; }\n}\n__decorate([\n Lazy,\n __metadata(\"design:type\", PointerHub),\n __metadata(\"design:paramtypes\", [])\n], Box.prototype, \"pointerHub\", null);\n", "import { Terminator, Unhandled } from \"@opendaw/lib-std\";\nimport { Addressable } from \"./address\";\nexport var Propagation;\n(function (Propagation) {\n Propagation[Propagation[\"This\"] = 0] = \"This\";\n Propagation[Propagation[\"Parent\"] = 1] = \"Parent\";\n Propagation[Propagation[\"Children\"] = 2] = \"Children\";\n})(Propagation || (Propagation = {}));\nexport var Dispatchers;\n(function (Dispatchers) {\n Dispatchers.create = () => new DispatchersImpl();\n})(Dispatchers || (Dispatchers = {}));\nclass DispatchersImpl {\n #thisDispatcher = new Dispatcher(Addressable.equals);\n #parentDispatcher = new Dispatcher(Addressable.startsWith);\n #childrenDispatcher = new Dispatcher(Addressable.endsWith);\n #deferredStations = [];\n #order = 0 | 0;\n #dispatching = false;\n subscribe(propagation, address, procedure) {\n const monitor = new Monitor(address, propagation, this.#order++, procedure);\n if (this.#dispatching) {\n const deferred = new DeferredMonitor(monitor, propagation);\n this.#deferredStations.push(deferred);\n return deferred;\n }\n else {\n return this.subscribeMonitor(monitor, propagation);\n }\n }\n dispatch(target) {\n this.#dispatching = true;\n const invoked = [\n ...this.#thisDispatcher.filter(target),\n ...this.#parentDispatcher.filter(target),\n ...this.#childrenDispatcher.filter(target)\n ];\n invoked\n .sort(({ order: a }, { order: b }) => a - b)\n .forEach((station) => station.procedure(target));\n this.#dispatching = false;\n this.#deferredStations.forEach((station) => station.subscribe(this));\n this.#deferredStations.length = 0;\n }\n subscribeMonitor(monitor, propagation) {\n switch (propagation) {\n case Propagation.This:\n return this.#thisDispatcher.subscribe(monitor);\n case Propagation.Parent:\n return this.#parentDispatcher.subscribe(monitor);\n case Propagation.Children:\n return this.#childrenDispatcher.subscribe(monitor);\n default:\n return Unhandled(propagation);\n }\n }\n countStations() {\n return this.#thisDispatcher.count() + this.#parentDispatcher.count() + this.#childrenDispatcher.count();\n }\n}\nclass Monitor {\n address;\n propagation;\n order;\n procedure;\n constructor(address, propagation, order, procedure) {\n this.address = address;\n this.propagation = propagation;\n this.order = order;\n this.procedure = procedure;\n }\n toString() {\n return `{ Monitor address: ${this.address}, propagation: ${Propagation[this.propagation]}, order: ${this.order} }`;\n }\n}\nclass Dispatcher {\n filterStrategy;\n #monitors = [];\n #sorted = true;\n constructor(filterStrategy) {\n this.filterStrategy = filterStrategy;\n }\n subscribe(monitor) {\n this.#monitors.push(monitor);\n this.#sorted = this.#monitors.length < 2;\n return {\n terminate: () => {\n let index = this.#monitors.length;\n while (--index >= 0) {\n if (this.#monitors[index] === monitor) {\n this.#monitors.splice(index, 1);\n }\n }\n }\n };\n }\n stations() {\n if (!this.#sorted) {\n this.#monitors.sort(Addressable.Comparator);\n this.#sorted = true;\n }\n return this.#monitors;\n }\n filter(target) { return this.filterStrategy(target.address, this.stations()); }\n count() { return this.#monitors.length; }\n}\nclass DeferredMonitor {\n monitor;\n propagation;\n #terminator = new Terminator();\n #terminated = false;\n constructor(monitor, propagation) {\n this.monitor = monitor;\n this.propagation = propagation;\n }\n subscribe(dispatchers) {\n if (this.#terminated) {\n return;\n }\n this.#terminator.terminate();\n this.#terminator.own(dispatchers.subscribeMonitor(this.monitor, this.propagation));\n }\n terminate() {\n this.#terminated = true;\n this.#terminator.terminate();\n }\n}\n", "import { Field } from \"./field\";\nimport { assert, Float, Integer, safeExecute } from \"@opendaw/lib-std\";\nimport { Propagation } from \"./dispatchers\";\nexport var PrimitiveType;\n(function (PrimitiveType) {\n PrimitiveType[\"Boolean\"] = \"boolean\";\n PrimitiveType[\"Float32\"] = \"float32\";\n PrimitiveType[\"Int32\"] = \"int32\";\n PrimitiveType[\"String\"] = \"string\";\n PrimitiveType[\"Bytes\"] = \"bytes\";\n})(PrimitiveType || (PrimitiveType = {}));\nexport const ValueSerialization = {\n [PrimitiveType.Boolean]: {\n type: PrimitiveType.Boolean,\n encode: (output, value) => output.writeBoolean(value),\n decode: (input) => input.readBoolean()\n },\n [PrimitiveType.Float32]: {\n type: PrimitiveType.Float32,\n encode: (output, value) => output.writeFloat(value),\n decode: (input) => input.readFloat()\n },\n [PrimitiveType.Int32]: {\n type: PrimitiveType.Int32,\n encode: (output, value) => output.writeInt(value),\n decode: (input) => input.readInt()\n },\n [PrimitiveType.String]: {\n type: PrimitiveType.String,\n encode: (output, value) => output.writeString(value),\n decode: (input) => input.readString()\n },\n [PrimitiveType.Bytes]: {\n type: PrimitiveType.Bytes,\n encode: (output, value) => {\n output.writeInt(value.length);\n output.writeBytes(value);\n },\n decode: (input) => {\n const array = new Int8Array(input.readInt());\n input.readBytes(array);\n return array;\n }\n }\n};\nexport class PrimitiveField extends Field {\n #type;\n #initValue;\n #value;\n constructor(field, type, value) {\n super(field);\n this.#type = type;\n this.#initValue = this.clamp(value);\n this.#value = this.#initValue;\n }\n accept(visitor) {\n return safeExecute(visitor.visitPrimitiveField, this);\n }\n subscribe(observer) {\n return this.graph.subscribeVertexUpdates(Propagation.This, this.address, () => observer(this));\n }\n catchupAndSubscribe(observer) {\n observer(this);\n return this.subscribe(observer);\n }\n get type() { return this.#type; }\n get initValue() { return this.#initValue; }\n setInitValue(value) {\n assert(this.graph.constructingBox(), \"Cannot change initial value at runtime\");\n this.setValue(this.#initValue = value);\n }\n getValue() { return this.#value; }\n setValue(value) {\n const oldValue = this.#value;\n const newValue = this.clamp(value);\n if (this.equals(newValue)) {\n return;\n }\n this.#value = value;\n this.graph.onPrimitiveValueUpdate(this, oldValue, newValue);\n }\n writeValue(output, value) { this.serialization().encode(output, value); }\n readValue(input) { return this.serialization().decode(input); }\n reset() { this.setValue(this.#initValue); }\n}\nexport class BooleanField extends PrimitiveField {\n static create(construct, value = false) {\n return new BooleanField(construct, value);\n }\n constructor(construct, value) { super(construct, PrimitiveType.Boolean, value); }\n toggle() { this.setValue(!this.getValue()); }\n serialization() { return ValueSerialization[PrimitiveType.Boolean]; }\n equals(value) { return this.getValue() === value; }\n clamp(value) { return value; }\n read(input) { this.setValue(input.readBoolean()); }\n write(output) { output.writeBoolean(this.getValue()); }\n}\nexport class Float32Field extends PrimitiveField {\n static create(construct, value = 0.0) {\n return new Float32Field(construct, value);\n }\n constructor(construct, value) { super(construct, PrimitiveType.Float32, value); }\n serialization() { return ValueSerialization[PrimitiveType.Float32]; }\n equals(value) { return this.getValue() === value; }\n clamp(value) { return Float.toFloat32(value); }\n read(input) { this.setValue(input.readFloat()); }\n write(output) { output.writeFloat(this.getValue()); }\n}\nexport class Int32Field extends PrimitiveField {\n static create(construct, value = 0) {\n return new Int32Field(construct, value);\n }\n constructor(construct, value) { super(construct, PrimitiveType.Int32, value); }\n serialization() { return ValueSerialization[PrimitiveType.Int32]; }\n equals(value) { return this.getValue() === value; }\n clamp(value) { return Integer.toInt(value); }\n read(input) { this.setValue(input.readInt()); }\n write(output) { output.writeInt(this.getValue()); }\n}\nexport class StringField extends PrimitiveField {\n static create(construct, value = \"\") {\n return new StringField(construct, value);\n }\n constructor(construct, value) { super(construct, PrimitiveType.String, value); }\n serialization() { return ValueSerialization[PrimitiveType.String]; }\n equals(value) { return this.getValue() === value; }\n clamp(value) { return value; }\n read(input) { this.setValue(input.readString()); }\n write(output) { output.writeString(this.getValue()); }\n}\nexport class ByteArrayField extends PrimitiveField {\n static create(construct, value = this.#empty) {\n return new ByteArrayField(construct, value);\n }\n static #empty = Object.freeze(new Int8Array(0));\n constructor(construct, value) { super(construct, PrimitiveType.Bytes, value); }\n serialization() { return ValueSerialization[PrimitiveType.Bytes]; }\n equals(value) {\n return this.getValue().length === value.length && this.getValue().every((x, index) => value[index] === x);\n }\n clamp(value) { return value; }\n read(input) {\n const bytes = new Int8Array(input.readInt());\n input.readBytes(bytes);\n this.setValue(bytes);\n }\n write(output) {\n const bytes = this.getValue();\n output.writeInt(bytes.length);\n output.writeBytes(bytes);\n }\n}\n", "import { ValueSerialization } from \"./primitive\";\nimport { Address } from \"./address\";\nimport { Arrays, ByteArrayInput, Option, UUID } from \"@opendaw/lib-std\";\nexport var Updates;\n(function (Updates) {\n Updates.decode = (input) => {\n const numBlocks = input.readInt();\n return Arrays.create(() => {\n const type = input.readString();\n switch (type) {\n case \"new\": {\n const uuid = UUID.fromDataInput(input);\n const name = input.readString();\n const settings = new Int8Array(input.readInt());\n input.readBytes(settings);\n return new NewUpdate(uuid, name, settings.buffer);\n }\n case \"pointer\": {\n const address = Address.read(input);\n const oldAddress = input.readBoolean() ? Option.wrap(Address.read(input)) : Option.None;\n const newAddress = input.readBoolean() ? Option.wrap(Address.read(input)) : Option.None;\n return new PointerUpdate(address, oldAddress, newAddress);\n }\n case \"primitive\": {\n const address = Address.read(input);\n const type = input.readString();\n const serializer = ValueSerialization[type];\n const oldValue = serializer.decode(input);\n const newValue = serializer.decode(input);\n return new PrimitiveUpdate(address, serializer, oldValue, newValue);\n }\n case \"delete\": {\n const uuid = UUID.fromDataInput(input);\n const name = input.readString();\n const settings = new Int8Array(input.readInt());\n input.readBytes(settings);\n return new DeleteUpdate(uuid, name, settings.buffer);\n }\n }\n }, numBlocks);\n };\n})(Updates || (Updates = {}));\nexport class NewUpdate {\n type = \"new\";\n #uuid;\n #name;\n #settings;\n constructor(uuid, name, settings) {\n this.#uuid = uuid;\n this.#name = name;\n this.#settings = settings;\n }\n get uuid() { return this.#uuid; }\n get name() { return this.#name; }\n get settings() { return this.#settings; }\n forward(graph) {\n graph.createBox(this.#name, this.#uuid, box => box.read(new ByteArrayInput(this.#settings)));\n }\n inverse(graph) {\n graph.findBox(this.#uuid).unwrap(() => `Could not find ${this.#name}`).unstage();\n }\n write(output) {\n output.writeString(this.type);\n UUID.toDataOutput(output, this.#uuid);\n output.writeString(this.#name);\n output.writeInt(this.#settings.byteLength);\n output.writeBytes(new Int8Array(this.#settings));\n }\n toString() {\n return `{NewUpdate uuid: ${UUID.toString(this.#uuid)}, attachment: ${this.settings.byteLength}b`;\n }\n toDebugString(_graph) { return this.toString(); }\n}\nexport class PrimitiveUpdate {\n type = \"primitive\";\n #address;\n #serialization;\n #oldValue;\n #newValue;\n constructor(address, serialization, oldValue, newValue) {\n this.#address = address;\n this.#serialization = serialization;\n this.#oldValue = oldValue;\n this.#newValue = newValue;\n }\n get address() { return this.#address; }\n get oldValue() { return this.#oldValue; }\n get newValue() { return this.#newValue; }\n matches(field) { return field.address.equals(this.address); }\n inverse(graph) { this.field(graph).setValue(this.#oldValue); }\n forward(graph) { this.field(graph).setValue(this.#newValue); }\n field(graph) {\n return graph.findVertex(this.#address)\n .unwrap(() => `Could not find PrimitiveField at ${this.#address}`);\n }\n write(output) {\n output.writeString(this.type);\n this.#address.write(output);\n output.writeString(this.#serialization.type);\n this.#serialization.encode(output, this.#oldValue);\n this.#serialization.encode(output, this.#newValue);\n }\n toString() {\n return `{PrimitiveUpdate oldValue: ${this.#oldValue}, newValue: ${this.#newValue}`;\n }\n}\nexport class PointerUpdate {\n type = \"pointer\";\n #address;\n #oldValue;\n #newValue;\n constructor(address, oldValue, newValue) {\n this.#address = address;\n this.#oldValue = oldValue;\n this.#newValue = newValue;\n }\n get address() { return this.#address; }\n get oldValue() { return this.#oldValue; }\n get newValue() { return this.#newValue; }\n matches(field) { return field.address.equals(this.address); }\n inverse(graph) { this.field(graph).targetAddress = this.#oldValue; }\n forward(graph) { this.field(graph).targetAddress = this.#newValue; }\n field(graph) {\n return graph.findVertex(this.#address)\n .unwrap(() => `Could not find PointerField at ${this.#address}`);\n }\n write(output) {\n output.writeString(this.type);\n this.#address.write(output);\n this.#oldValue.match({\n none: () => output.writeBoolean(false),\n some: address => {\n output.writeBoolean(true);\n address.write(output);\n }\n });\n this.#newValue.match({\n none: () => output.writeBoolean(false),\n some: address => {\n output.writeBoolean(true);\n address.write(output);\n }\n });\n }\n toString() {\n return `{PointerUpdate oldValue: ${this.#oldValue.unwrapOrNull()}, newValue: ${this.#newValue.unwrapOrNull()}`;\n }\n}\nexport class DeleteUpdate {\n type = \"delete\";\n #uuid;\n #name;\n #settings;\n constructor(uuid, name, settings) {\n this.#uuid = uuid;\n this.#name = name;\n this.#settings = settings;\n }\n get uuid() { return this.#uuid; }\n get name() { return this.#name; }\n get settings() { return this.#settings; }\n forward(graph) {\n graph.findBox(this.#uuid).unwrap(() => `Could not find ${this.#name}`).unstage();\n }\n inverse(graph) {\n graph.createBox(this.#name, this.#uuid, box => box.read(new ByteArrayInput(this.#settings)));\n }\n write(output) {\n output.writeString(this.type);\n UUID.toDataOutput(output, this.#uuid);\n output.writeString(this.#name);\n output.writeInt(this.#settings.byteLength);\n output.writeBytes(new Int8Array(this.#settings));\n }\n toString() {\n return `{DeleteUpdate uuid: ${UUID.toString(this.#uuid)}, attachment: ${this.settings.byteLength}b`;\n }\n}\n", "import { Option, panic, safeExecute } from \"@opendaw/lib-std\";\nimport { Address } from \"./address\";\nimport { PointerHub } from \"./pointer-hub\";\nimport { Field } from \"./field\";\nimport { Propagation } from \"./dispatchers\";\nconst _Unreferenceable = Symbol(\"Unreferenceable\");\nexport class PointerField extends Field {\n static create(construct, pointerType, mandatory) {\n return new PointerField(construct, pointerType, mandatory);\n }\n #pointerType;\n #mandatory;\n #targetVertex = Option.None;\n #targetAddress = Option.None;\n constructor(field, pointerType, mandatory) {\n super(field);\n this.#pointerType = pointerType;\n this.#mandatory = mandatory;\n if (mandatory) {\n this.graph.edges().watchVertex(this);\n }\n }\n get pointerHub() { return panic(`${this} cannot be pointed to`); }\n get pointerType() { return this.#pointerType; }\n get mandatory() { return this.#mandatory; }\n accept(visitor) {\n return safeExecute(visitor.visitPointerField, this);\n }\n subscribe(observer) {\n return this.graph.subscribeVertexUpdates(Propagation.This, this.address, () => observer(this));\n }\n catchupAndSubscribe(observer) {\n observer(this);\n return this.graph.subscribeVertexUpdates(Propagation.This, this.address, () => this.graph.subscribeEndTransaction(() => observer(this)));\n }\n refer(vertex) {\n this.targetVertex = Option.wrap(vertex);\n }\n defer() { this.targetVertex = Option.None; }\n get targetVertex() {\n return this.graph.inTransaction()\n ? this.#targetAddress.flatMap((address) => this.graph.findVertex(address))\n : this.#targetVertex;\n }\n set targetVertex(option) {\n if (option.nonEmpty()) {\n const issue = PointerHub.validate(this, option.unwrap());\n if (issue.nonEmpty()) {\n panic(issue.unwrap());\n }\n }\n this.targetAddress = option.map(vertex => vertex.address);\n }\n get targetAddress() { return this.#targetAddress; }\n set targetAddress(newValue) {\n const oldValue = this.#targetAddress;\n if ((oldValue.isEmpty() && newValue.isEmpty())\n || (newValue.nonEmpty() && oldValue.unwrapOrNull()?.equals(newValue.unwrap())) === true) {\n return;\n }\n this.#targetAddress = newValue;\n this.graph.onPointerAddressUpdated(this, oldValue, newValue);\n }\n isEmpty() { return this.targetAddress.isEmpty(); }\n nonEmpty() { return this.targetAddress.nonEmpty(); }\n resolve() {\n const targetAddress = this.targetAddress;\n const target = targetAddress.flatMap((address) => this.graph.findVertex(address));\n if (targetAddress.nonEmpty() && target.isEmpty()) {\n return panic(`${targetAddress.unwrapOrNull()?.toString()} could not be resolved`);\n }\n this.#targetVertex = target;\n }\n read(input) {\n this.targetAddress = input.readBoolean() ? Option.wrap(Address.read(input)) : Option.None;\n }\n write(output) {\n this.#targetAddress.match({\n none: () => output.writeBoolean(false),\n some: address => {\n output.writeBoolean(true);\n address.write(output);\n }\n });\n }\n}\n", "const key = Symbol.for(\"@openDAW/lib-box\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nexport * from \"./address\";\nexport * from \"./array\";\nexport * from \"./box\";\nexport * from \"./dispatchers\";\nexport * from \"./editing\";\nexport * from \"./field\";\nexport * from \"./graph\";\nexport * from \"./graph-edges\";\nexport * from \"./object\";\nexport * from \"./pointer\";\nexport * from \"./pointer-hub\";\nexport * from \"./primitive\";\nexport * from \"./sync\";\nexport * from \"./sync-source\";\nexport * from \"./sync-target\";\nexport * from \"./updates\";\nexport * from \"./vertex\";\n", "// noinspection PlatformDetectionJS\nexport var Browser;\n(function (Browser) {\n const hasLocation = typeof self !== \"undefined\" && \"location\" in self && typeof self.location !== undefined;\n const hasNavigator = typeof self !== \"undefined\" && \"navigator\" in self && typeof self.navigator !== undefined;\n Browser.isLocalHost = () => hasLocation && location.host.includes(\"localhost\");\n Browser.isMacOS = () => hasNavigator && navigator.userAgent.includes(\"Mac OS X\");\n Browser.isWindows = () => hasNavigator && navigator.userAgent.includes(\"Windows\");\n Browser.isFirefox = () => hasNavigator && navigator.userAgent.toLowerCase().includes(\"firefox\");\n Browser.isWeb = () => !Browser.isTauriApp();\n Browser.isTauriApp = () => \"__TAURI__\" in window;\n Browser.userAgent = hasNavigator ? navigator.userAgent\n .replace(/^Mozilla\\/[\\d.]+\\s*/, \"\")\n .replace(/\\bAppleWebKit\\/[\\d.]+\\s*/g, \"\")\n .replace(/\\(KHTML, like Gecko\\)\\s*/g, \"\")\n .replace(/\\bSafari\\/[\\d.]+\\s*/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim() : \"N/A\";\n})(Browser || (Browser = {}));\n", "export var Compression;\n(function (Compression) {\n Compression.encode = async (buffer, format = \"gzip\") => {\n const stream = new CompressionStream(format);\n const writer = stream.writable.getWriter();\n writer.write(new Uint8Array(buffer));\n writer.close();\n return new Response(stream.readable).arrayBuffer();\n };\n Compression.decode = async (buffer, format = \"gzip\") => {\n const stream = new DecompressionStream(format);\n const writer = stream.writable.getWriter();\n writer.write(new Uint8Array(buffer));\n writer.close();\n return new Response(stream.readable).arrayBuffer();\n };\n})(Compression || (Compression = {}));\n", "import { DefaultObservableValue, EmptyProcedure } from \"@opendaw/lib-std\";\nexport var ConsoleCommands;\n(function (ConsoleCommands) {\n ConsoleCommands.exportMethod = (path, callback) => store(path, { value: callback });\n ConsoleCommands.exportBoolean = (path, init = false) => {\n const observableValue = new DefaultObservableValue(init);\n ConsoleCommands.exportAccessor(path, () => observableValue.getValue(), input => {\n const value = Boolean(input);\n console.debug(`set to ${value}`);\n observableValue.setValue(value);\n });\n return observableValue;\n };\n ConsoleCommands.exportAccessor = (path, getter, setter = EmptyProcedure) => store(path, {\n get: () => {\n try {\n console.debug(getter());\n return 0;\n }\n catch (error) {\n console.error(error);\n return 1;\n }\n },\n set: (value) => {\n try {\n setter(value);\n return getter();\n }\n catch (error) {\n console.error(error);\n return 1;\n }\n },\n enumerable: false,\n configurable: false\n });\n const global = (() => { try {\n return self;\n }\n catch (_) {\n return {};\n } })();\n const scope = (global[\"opendaw\"] ??= {});\n const store = (path, attributes) => {\n const levels = path.split(\".\");\n const name = levels.splice(-1)[0];\n let current = scope;\n for (const level of levels) {\n current = (current[level] ??= {});\n }\n Object.defineProperty(current, name, attributes);\n console.debug(`Console command 'opendaw.${path}' exported`);\n };\n})(ConsoleCommands || (ConsoleCommands = {}));\n", "const ellipsis = \"\u2026\";\nexport var Context2d;\n(function (Context2d) {\n Context2d.truncateText = (context, text, maxWidth) => {\n if (text.length === 0) {\n return { text: \"\", width: 0 };\n }\n let width = context.measureText(text).width;\n if (width <= maxWidth) {\n return { text, width };\n }\n const ellipseWidth = context.measureText(ellipsis).width;\n let l = 0 | 0;\n let r = text.length | 0;\n while (l < r) {\n const mid = (r + l) >>> 1;\n width = context.measureText(text.substring(0, mid + 1)).width + ellipseWidth;\n if (width <= maxWidth) {\n l = mid + 1;\n }\n else {\n r = mid;\n }\n }\n if (l === 0) {\n return { text: \"\", width: 0 };\n }\n const result = text.substring(0, l);\n return { text: result + ellipsis, width: context.measureText(result).width + ellipseWidth };\n };\n})(Context2d || (Context2d = {}));\n", "import { panic } from \"@opendaw/lib-std\";\nexport var CssUtils;\n(function (CssUtils) {\n CssUtils.calc = (term, size, em) => {\n const regex = /([0-9]*\\.?[0-9]+)([a-zA-Z%]*)/g;\n let result = term;\n result.split(/\\+|(?<!\\d)-/)\n .flatMap(result => Array.from(result.matchAll(regex)))\n .forEach(([replace, digits, unit]) => {\n const number = parseFloat(digits);\n if (isNaN(number)) {\n return panic(`${replace} does not contain a number`);\n }\n if (unit === \"em\") {\n result = result.replaceAll(replace, `${number * em}`);\n }\n else if (unit === \"%\") {\n result = result.replaceAll(replace, `${number / 100.0 * size}`);\n }\n else if (unit === \"px\") {\n result = result.replaceAll(replace, `${number}`);\n }\n else {\n return panic(`Unknown unit '${unit}'`);\n }\n });\n return Function(`return ${result}`)();\n };\n const customCursors = new Map();\n CssUtils.registerCustomCursor = (identifier, data) => customCursors.set(identifier, data);\n CssUtils.setCursor = (identifier, doc = document) => {\n doc.documentElement.style.cursor = typeof identifier === \"number\"\n ? customCursors.get(identifier) ?? \"auto\"\n : identifier;\n };\n})(CssUtils || (CssUtils = {}));\n", "export var AnimationFrame;\n(function (AnimationFrame) {\n const nonrecurring = new Set();\n const recurring = new Set();\n const queue = new Array();\n let id = -1;\n AnimationFrame.add = (exec) => {\n recurring.add(exec);\n return { terminate: () => recurring.delete(exec) };\n };\n AnimationFrame.once = (exec) => { nonrecurring.add(exec); };\n AnimationFrame.start = () => {\n console.debug(\"AnimationFrame start\");\n const exe = () => {\n if (recurring.size > 0 || nonrecurring.size > 0) {\n recurring.forEach((exec) => queue.push(exec));\n nonrecurring.forEach((exec) => queue.push(exec));\n nonrecurring.clear();\n queue.forEach((exec) => exec());\n queue.length = 0;\n }\n id = requestAnimationFrame(exe);\n };\n id = requestAnimationFrame(exe);\n };\n AnimationFrame.terminate = () => {\n console.debug(\"AnimationFrame terminate\");\n nonrecurring.clear();\n recurring.clear();\n queue.length = 0;\n cancelAnimationFrame(id);\n };\n})(AnimationFrame || (AnimationFrame = {}));\nexport const deferNextFrame = (exec) => new DeferExec(exec);\nexport class DeferExec {\n #exec;\n #requested = false;\n #disabled = false;\n constructor(exec) { this.#exec = exec; }\n request = () => {\n if (this.#requested || this.#disabled) {\n return;\n }\n this.#requested = true;\n AnimationFrame.once(this.#fire);\n };\n immediate = () => {\n if (this.#disabled) {\n return;\n }\n this.#requested = true;\n this.#fire();\n };\n cancel() { this.#requested = false; }\n terminate() { this.#disabled = true; }\n #fire = () => {\n if (this.#disabled || !this.#requested) {\n return;\n }\n this.#requested = false;\n this.#exec();\n };\n}\n", "import { isDefined } from \"@opendaw/lib-std\";\nexport class Events {\n static subscribe(eventTarget, type, listener, options) {\n eventTarget.addEventListener(type, listener, options);\n return { terminate: () => eventTarget.removeEventListener(type, listener, options) };\n }\n static subscribeAny(eventTarget, type, listener, options) {\n eventTarget.addEventListener(type, listener, options);\n return { terminate: () => eventTarget.removeEventListener(type, listener, options) };\n }\n static DOUBLE_DOWN_THRESHOLD = 200;\n static subscribeDblDwn = (eventTarget, listener) => {\n let lastDownTime = 0.0;\n return this.subscribe(eventTarget, \"pointerdown\", event => {\n const now = performance.now();\n if (now - lastDownTime < this.DOUBLE_DOWN_THRESHOLD) {\n listener(event);\n }\n lastDownTime = now;\n }, { capture: true });\n };\n static PreventDefault = event => event.preventDefault();\n static isTextInput = (target) => target instanceof HTMLInputElement\n || target instanceof HTMLTextAreaElement\n || (target instanceof HTMLElement && isDefined(target.getAttribute(\"contenteditable\")));\n}\n", "import { Browser } from \"./browser\";\nimport { Events } from \"./events\";\nexport var Keyboard;\n(function (Keyboard) {\n Keyboard.isControlKey = ({ ctrlKey, metaKey }) => Browser.isMacOS() ? metaKey : ctrlKey;\n Keyboard.isCopyKey = ({ altKey }) => altKey;\n Keyboard.GlobalShortcut = Object.freeze({\n isDelete: (event) => !Events.isTextInput(event.target) && (event.code === \"Delete\" || event.code === \"Backspace\"),\n isSelectAll: (event) => Keyboard.isControlKey(event) && !event.shiftKey && event.code === \"KeyA\",\n isDeselectAll: (event) => Keyboard.isControlKey(event) && event.shiftKey && event.code === \"KeyA\"\n });\n})(Keyboard || (Keyboard = {}));\n", "import { Terminable, Terminator } from \"@opendaw/lib-std\";\nimport { Browser } from \"./browser\";\nimport { AnimationFrame } from \"./frames\";\nimport { Events } from \"./events\";\nimport { Keyboard } from \"./keyboard\";\nexport var Dragging;\n(function (Dragging) {\n Dragging.attach = (target, factory, options) => {\n const processCycle = new Terminator();\n return Terminable.many(processCycle, Events.subscribe(target, \"pointerdown\", (event) => {\n if (options?.multiTouch !== true && !event.isPrimary) {\n return;\n }\n if (event.buttons !== 1 || (Browser.isMacOS() && event.ctrlKey)) {\n return;\n }\n const option = factory(event);\n if (option.isEmpty()) {\n return;\n }\n const process = option.unwrap();\n const pointerId = event.pointerId;\n event.stopPropagation();\n event.stopImmediatePropagation();\n target.setPointerCapture(pointerId);\n const moveEvent = {\n clientX: event.clientX,\n clientY: event.clientY,\n altKey: event.altKey,\n shiftKey: event.shiftKey,\n ctrlKey: Keyboard.isControlKey(event)\n };\n if (options?.immediate === true) {\n process.update(moveEvent);\n }\n if (options?.permanentUpdates === true) {\n processCycle.own(AnimationFrame.add(() => process.update(moveEvent)));\n processCycle.own(Events.subscribe(target, \"pointermove\", (event) => {\n if (event.pointerId === pointerId) {\n moveEvent.clientX = event.clientX;\n moveEvent.clientY = event.clientY;\n moveEvent.altKey = event.altKey;\n moveEvent.shiftKey = event.shiftKey;\n moveEvent.ctrlKey = Keyboard.isControlKey(event);\n }\n }));\n }\n else {\n processCycle.own(Events.subscribe(target, \"pointermove\", (event) => {\n if (event.pointerId === pointerId) {\n moveEvent.clientX = event.clientX;\n moveEvent.clientY = event.clientY;\n moveEvent.altKey = event.altKey;\n moveEvent.shiftKey = event.shiftKey;\n moveEvent.ctrlKey = Keyboard.isControlKey(event);\n process.update(moveEvent);\n }\n }));\n }\n const cancel = () => {\n process.cancel?.call(process);\n process.finally?.call(process);\n processCycle.terminate();\n };\n processCycle.ownAll(Events.subscribe(target, \"pointerup\", (event) => {\n if (event.pointerId === pointerId) {\n process.approve?.call(process);\n process.finally?.call(process);\n processCycle.terminate();\n }\n }, { capture: true }), Events.subscribe(target, \"pointercancel\", (event) => {\n console.debug(event.type);\n if (event.pointerId === pointerId) {\n target.releasePointerCapture(pointerId);\n cancel();\n }\n }, { capture: true }), Events.subscribe(self, \"beforeunload\", (_event) => {\n // Workaround for Chrome (does not release or cancel pointer)\n target.releasePointerCapture(pointerId);\n cancel();\n }, { capture: true }), Events.subscribe(window, \"keydown\", (event) => {\n moveEvent.altKey = event.altKey;\n moveEvent.shiftKey = event.shiftKey;\n moveEvent.ctrlKey = Keyboard.isControlKey(event);\n if (event.key === \"Escape\") {\n cancel();\n }\n else {\n process.update(moveEvent);\n }\n }), Events.subscribe(window, \"keyup\", (event) => {\n moveEvent.altKey = event.altKey;\n moveEvent.shiftKey = event.shiftKey;\n moveEvent.ctrlKey = Keyboard.isControlKey(event);\n process.update(moveEvent);\n }));\n if (process.abortSignal) {\n processCycle.own(Events.subscribe(process.abortSignal, \"abort\", () => {\n target.releasePointerCapture(pointerId);\n cancel();\n }));\n }\n }));\n };\n})(Dragging || (Dragging = {}));\n", "export var Errors;\n(function (Errors) {\n Errors.AbortError = typeof DOMException === \"undefined\"\n ? NaN : Object.freeze(new DOMException(\"AbortError\"));\n Errors.isAbort = (error) => error === Errors.AbortError || (error instanceof DOMException && error.name === \"AbortError\");\n})(Errors || (Errors = {}));\n", "import { Arrays, asDefined, isDefined } from \"@opendaw/lib-std\";\nimport { Promises } from \"@opendaw/lib-runtime\";\nexport var Files;\n(function (Files) {\n Files.save = async (arrayBuffer, options) => {\n if (isDefined(window.showSaveFilePicker)) {\n const handle = await window.showSaveFilePicker(options);\n const writable = await handle.createWritable();\n await writable.truncate(0);\n await writable.write(arrayBuffer);\n await writable.close();\n return handle.name ?? \"unknown\";\n }\n else {\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = options?.suggestedName ?? `unknown`;\n anchor.click();\n URL.revokeObjectURL(url);\n return options?.suggestedName ?? \"Unknown\";\n }\n };\n Files.open = async (options) => {\n if (isDefined(window.showOpenFilePicker)) {\n const { status, value: fileHandles, error } = await Promises.tryCatch(window.showOpenFilePicker(options));\n if (status === \"rejected\") {\n return Promise.reject(error);\n }\n return Promise.all(fileHandles.map(fileHandle => fileHandle.getFile()));\n }\n else {\n return new Promise((resolve, reject) => {\n if (isDefined(options)) {\n console.warn(\"FileApi.showOpenFilePicker is emulated in this browser. OpenFilePickerOptions are ignored.\");\n }\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.multiple = options?.multiple ?? false;\n fileInput.style.display = \"none\";\n fileInput.addEventListener(\"cancel\", async () => {\n fileInput.remove();\n reject(new DOMException(\"cancel\", \"AbortError\"));\n });\n fileInput.addEventListener(\"change\", async (event) => {\n const target = event.target;\n const files = target.files;\n if (isDefined(files)) {\n resolve(Arrays.create(index => asDefined(files.item(index), `No file at index ${index}`), files.length));\n }\n else {\n reject(new DOMException(\"cancel\", \"AbortError\"));\n }\n fileInput.remove();\n });\n document.body.appendChild(fileInput);\n fileInput.click();\n });\n }\n };\n})(Files || (Files = {}));\n", "import { asDefined, assert, Color, isDefined, panic, Rect } from \"@opendaw/lib-std\";\nexport var Html;\n(function (Html) {\n Html.parse = (source) => {\n const template = document.createElement(\"div\");\n template.innerHTML = source;\n if (template.childElementCount !== 1) {\n return panic(`Source html has more than one root elements: '${source}'`);\n }\n const child = template.firstChild;\n return child instanceof HTMLElement || child instanceof SVGSVGElement\n ? child\n : panic(`Cannot parse to HTMLOrSVGElement from '${source}'`);\n };\n Html.empty = (element) => { while (element.firstChild !== null) {\n element.firstChild.remove();\n } };\n Html.replace = (element, ...elements) => {\n Html.empty(element);\n element.append(...elements);\n };\n Html.query = (selectors, parent = document) => asDefined(parent.querySelector(selectors));\n Html.queryAll = (selectors, parent = document) => Array.from(parent.querySelectorAll(selectors));\n Html.nextID = (() => {\n let id = 0 | 0;\n return () => (++id).toString(16).padStart(4, \"0\");\n })();\n Html.adoptStyleSheet = (classDefinition, prefix) => {\n assert(classDefinition.includes(\"component\"), `No 'component' found in: ${classDefinition}`);\n const className = `${prefix ?? \"C\"}${Html.nextID()}`;\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(classDefinition.replaceAll(\"component\", `.${className}`));\n if (sheet.cssRules.length === 0) {\n return panic(`No cssRules found in: ${classDefinition}`);\n }\n document.adoptedStyleSheets.push(sheet);\n return className;\n };\n // Allows conditional accumulation of classNames\n Html.buildClassList = (...input) => input.filter(x => x !== false && x !== undefined).join(\" \");\n Html.readCssVarColor = (...cssValues) => {\n const element = document.createElement(\"div\");\n document.body.appendChild(element);\n const colors = cssValues.map(value => {\n element.style.color = value;\n return Color.parseCssRgbOrRgba(getComputedStyle(element).color);\n });\n element.remove();\n return colors;\n };\n Html.watchResize = (target, callback, options) => {\n const observer = new ResizeObserver(([first], observer) => callback(first, observer));\n observer.observe(target, options);\n return { terminate: () => observer.disconnect() };\n };\n Html.watchIntersection = (target, callback, options) => {\n const observer = new IntersectionObserver(callback, options);\n observer.observe(target);\n return { terminate: () => observer.disconnect() };\n };\n // handles cases like 'display: contents', where the bounding box is always empty, although the children have dimensions\n Html.secureBoundingBox = (element) => {\n let elemRect = element.getBoundingClientRect();\n if (!Rect.isEmpty(elemRect)) {\n return elemRect;\n }\n for (const child of element.children) {\n Rect.union(elemRect, Html.secureBoundingBox(child));\n }\n return elemRect;\n };\n Html.unfocus = (owner = self) => {\n const element = owner.document.activeElement;\n if (element !== null && \"blur\" in element && typeof element.blur === \"function\") {\n element.blur();\n }\n };\n Html.selectContent = (element) => {\n const range = document.createRange();\n const selection = window.getSelection();\n if (isDefined(selection)) {\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n };\n Html.unselectContent = (element) => {\n const selection = window.getSelection();\n if (!isDefined(selection) || selection.rangeCount === 0) {\n return;\n }\n if (element.contains(selection.getRangeAt(0).commonAncestorContainer)) {\n selection.removeAllRanges();\n }\n };\n Html.limitChars = (element, property, limit) => {\n if (!(property in element))\n return panic(`${property} not found in ${element}`);\n if (typeof element[property] !== \"string\")\n return panic(`${property} in ${element} is not a string`);\n if (element[property].length > limit) {\n element[property] = element[property].substring(0, limit);\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n element.setSelectionRange(limit, limit);\n }\n else {\n const document = element.ownerDocument;\n const range = document.createRange();\n const selection = document.defaultView?.getSelection();\n if (!isDefined(selection)) {\n return;\n }\n range.selectNodeContents(element);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n };\n Html.EmptyGif = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=\";\n})(Html || (Html = {}));\n", "import { Browser } from \"./browser\";\nexport const ModfierKeys = (() => {\n const Mac = { Cmd: \"\u2318\", Opt: \"\u2325\", Shift: \"\u21E7\" };\n const Win = { Cmd: \"Ctrl\", Opt: \"Alt\", Shift: \"\u21E7\" };\n return Object.freeze({ Mac, Win, System: Browser.isMacOS() ? Mac : Win });\n})();\n", "export var Stream;\n(function (Stream) {\n Stream.read = async (reader) => {\n const chunks = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n chunks.push(value);\n }\n const length = chunks.reduce((acc, val) => acc + val.length, 0);\n const output = new Uint8Array(length);\n let position = 0 | 0;\n for (let chunk of chunks) {\n output.set(chunk, position);\n position += chunk.length;\n }\n return output.buffer;\n };\n})(Stream || (Stream = {}));\n", "export var Svg;\n(function (Svg) {\n Svg.pathBuilder = () => new class {\n #d = \"\";\n moveTo(x, y) {\n this.#d += `M${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n lineTo(x, y) {\n this.#d += `L${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n quadratic(x1, y1, x, y) {\n this.#d += `Q${x1.toFixed(3)} ${y1.toFixed(3)} ${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n quadraticTo(x, y) {\n this.#d += `T${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n cubic(x1, y1, x2, y2, x, y) {\n this.#d += `Q${x1.toFixed(3)} ${y1.toFixed(3)} ${x2.toFixed(3)} ${y2.toFixed(3)} ${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n arc(rx, ry, deg, largeArc, sweep, x, y) {\n this.#d += `A${rx} ${ry} ${deg} ${largeArc ? 1 : 0} ${sweep ? 1 : 0} ${x.toFixed(3)} ${y.toFixed(3)}`;\n return this;\n }\n circleSegment(cx, cy, radius, a0, a1) {\n const x0 = cx + Math.cos(a0) * radius;\n const y0 = cy + Math.sin(a0) * radius;\n const x1 = cx + Math.cos(a1) * radius;\n const y1 = cy + Math.sin(a1) * radius;\n let range = a1 - a0;\n while (range < 0.0)\n range += Math.PI * 2.0;\n return this.moveTo(x0, y0).arc(radius, radius, 0, range > Math.PI, true, x1, y1);\n }\n close() {\n this.#d += \"Z\";\n return this;\n }\n get() { return this.#d; }\n };\n})(Svg || (Svg = {}));\n", "export var TerminatorUtils;\n(function (TerminatorUtils) {\n const weakRefs = new Array();\n /**\n * Terminates if the key is no longer referenced to.\n * Make sure that the Terminable does not include other references\n * that would prevent the key from being gc collected.\n * That means the key must not appear in the Terminable!\n * @param key WeakKey\n * @param subscribe Sends a WeakRef to be able to be gc collected\n */\n TerminatorUtils.watchWeak = (key, subscribe) => {\n const weakRef = new WeakRef(key);\n const terminable = subscribe(weakRef);\n weakRefs.push([weakRef, terminable]);\n if (weakRefs.length === 1) {\n startWatchWeak();\n }\n return key;\n };\n const startWatchWeak = () => {\n console.debug(\"start weak watching\");\n const id = setInterval(() => {\n let index = weakRefs.length;\n while (--index >= 0) {\n const entry = weakRefs[index];\n if (entry[0].deref() === undefined) {\n entry[1].terminate();\n weakRefs.splice(index, 1);\n if (weakRefs.length === 0) {\n console.debug(\"stop weak watching\");\n clearInterval(id);\n }\n }\n }\n }, 1000);\n };\n})(TerminatorUtils || (TerminatorUtils = {}));\n", "const key = Symbol.for(\"@openDAW/lib-dom\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nexport * from \"./browser\";\nexport * from \"./compression\";\nexport * from \"./console-commands\";\nexport * from \"./context-2d\";\nexport * from \"./css-utils\";\nexport * from \"./dragging\";\nexport * from \"./events\";\nexport * from \"./errors\";\nexport * from \"./files\";\nexport * from \"./fonts\";\nexport * from \"./frames\";\nexport * from \"./html\";\nexport * from \"./keyboard\";\nexport * from \"./modfier-keys\";\nexport * from \"./stream\";\nexport * from \"./svg\";\nexport * from \"./terminable\";\n", "export var PackageType;\n(function (PackageType) {\n PackageType[PackageType[\"Float\"] = 0] = \"Float\";\n PackageType[PackageType[\"FloatArray\"] = 1] = \"FloatArray\";\n PackageType[PackageType[\"Integer\"] = 2] = \"Integer\";\n PackageType[PackageType[\"IntegerArray\"] = 3] = \"IntegerArray\";\n PackageType[PackageType[\"ByteArray\"] = 4] = \"ByteArray\";\n})(PackageType || (PackageType = {}));\n", "export var Lock;\n(function (Lock) {\n Lock[Lock[\"WRITE\"] = 0] = \"WRITE\";\n Lock[Lock[\"READ\"] = 1] = \"READ\";\n})(Lock || (Lock = {}));\n", "export var Flags;\n(function (Flags) {\n Flags[Flags[\"ID\"] = 15793935] = \"ID\";\n Flags[Flags[\"START\"] = 15790320] = \"START\";\n Flags[Flags[\"END\"] = 986895] = \"END\";\n})(Flags || (Flags = {}));\n", "import { Arrays, assert, ByteArrayOutput, Float16, Unhandled } from \"@opendaw/lib-std\";\nexport class Peaks {\n stages;\n data;\n numFrames;\n numChannels;\n static from(input) {\n assert(input.readString() === \"PEAKS\", \"Wrong header\");\n const numStages = input.readInt();\n const stages = [];\n for (let i = 0; i < numStages; i++) {\n const dataOffset = input.readInt();\n const numPeaks = input.readInt();\n const shift = input.readInt();\n const mask = input.readInt();\n stages[i] = new Peaks.Stage(mask, shift, numPeaks, dataOffset);\n }\n const numData = input.readInt();\n const data = [];\n for (let i = 0; i < numData; i++) {\n const array = new Int8Array(input.readInt());\n input.readBytes(array);\n data[i] = new Int32Array(array.buffer);\n }\n const numFrames = input.readInt();\n const numChannels = input.readInt();\n return new Peaks(stages, data, numFrames, numChannels);\n }\n static None = new Peaks([], [], 0, 0);\n constructor(stages, data, numFrames, numChannels) {\n this.stages = stages;\n this.data = data;\n this.numFrames = numFrames;\n this.numChannels = numChannels;\n }\n nearest(unitsPerPixel) {\n if (this.stages.length === 0) {\n return null;\n }\n const shift = Math.floor(Math.log(Math.abs(unitsPerPixel)) / Math.LN2);\n let i = this.stages.length;\n while (--i > -1) {\n if (shift >= this.stages[i].shift) {\n return this.stages[i];\n }\n }\n return this.stages[0];\n }\n toArrayBuffer() {\n const output = ByteArrayOutput.create();\n output.writeString(\"PEAKS\");\n output.writeInt(this.stages.length);\n for (let i = 0; i < this.stages.length; i++) {\n const { dataOffset, numPeaks, shift, mask } = this.stages[i];\n output.writeInt(dataOffset);\n output.writeInt(numPeaks);\n output.writeInt(shift);\n output.writeInt(mask);\n }\n output.writeInt(this.data.length);\n for (let i = 0; i < this.data.length; i++) {\n const array = new Int8Array(this.data[i].buffer);\n output.writeInt(array.length);\n output.writeBytes(array);\n }\n output.writeInt(this.numFrames);\n output.writeInt(this.numChannels);\n return output.toArrayBuffer();\n }\n toString() { return `{Peaks num-stages: ${this.stages.length}}`; }\n}\n(function (Peaks) {\n Peaks.findBestFit = (numFrames, width = 1200) => {\n const ratio = numFrames / width;\n if (ratio <= 1.0) {\n return new Uint8Array(0);\n }\n const ShiftPadding = 3;\n const maxShift = Math.floor(Math.log(ratio) / Math.LN2);\n const numStages = Math.max(1, Math.floor(maxShift / ShiftPadding));\n return new Uint8Array(Arrays.create(index => ShiftPadding * (index + 1), numStages));\n };\n class Stage {\n mask;\n shift;\n numPeaks;\n dataOffset;\n constructor(mask, shift, numPeaks, dataOffset) {\n this.mask = mask;\n this.shift = shift;\n this.numPeaks = numPeaks;\n this.dataOffset = dataOffset;\n }\n unitsEachPeak() { return 1 << this.shift; }\n }\n Peaks.Stage = Stage;\n Peaks.unpack = (bits, index) => {\n switch (index) {\n case 0:\n return Float16.intBitsToFloat(bits);\n case 1:\n return Float16.intBitsToFloat(bits >> 16);\n default:\n return Unhandled(index);\n }\n };\n})(Peaks || (Peaks = {}));\n", "import { Arrays, Float16, panic } from \"@opendaw/lib-std\";\nimport { Communicator, stopwatch } from \"@opendaw/lib-runtime\";\nimport { Peaks } from \"./Peaks\";\nexport var PeakWorker;\n(function (PeakWorker) {\n PeakWorker.install = (messenger) => Communicator.executor(messenger.channel(\"peaks\"), new class {\n async generateAsync(progress, shifts, frames, numFrames, numChannels) {\n return generatePeaks(progress, shifts, frames, numFrames, numChannels).toArrayBuffer();\n }\n });\n const generatePeaks = (progress, shifts, frames, numFrames, numChannels) => {\n if (frames.length !== numChannels) {\n return panic(`Invalid numberOfChannels. Expected: ${numChannels}. Got ${frames.length}`);\n }\n class State {\n min = Number.POSITIVE_INFINITY;\n max = Number.NEGATIVE_INFINITY;\n index = 0;\n }\n const time = stopwatch();\n const numShifts = shifts.length;\n const [stages, dataOffset] = initStages(shifts, numFrames);\n const data = Arrays.create(() => new Int32Array(dataOffset), numChannels);\n const minMask = stages[0].mask;\n const total = numChannels * numFrames;\n let count = 0;\n for (let channel = 0; channel < numChannels; ++channel) {\n const channelData = data[channel];\n const channelFrames = frames[channel];\n const states = Arrays.create(() => new State(), numShifts);\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n let position = 0;\n for (let i = 0; i < numFrames; ++i) {\n const frame = channelFrames[i];\n min = Math.min(frame, min);\n max = Math.max(frame, max);\n if ((++position & minMask) === 0) {\n for (let j = 0; j < numShifts; ++j) {\n const stage = stages[j];\n const state = states[j];\n state.min = Math.min(state.min, min);\n state.max = Math.max(state.max, max);\n if ((stage.mask & position) === 0) {\n channelData[stage.dataOffset + state.index++] = pack(state.min, state.max);\n state.min = Number.POSITIVE_INFINITY;\n state.max = Number.NEGATIVE_INFINITY;\n }\n }\n min = Number.POSITIVE_INFINITY;\n max = Number.NEGATIVE_INFINITY;\n }\n if ((++count & 0xFFFF) === 0) {\n progress(count / total);\n }\n }\n }\n progress(1.0);\n time.lab(`Peak-Gen '${self.constructor.name}'`);\n return new Peaks(stages, data, numFrames, numChannels);\n };\n const initStages = (shifts, numFrames) => {\n let dataOffset = 0;\n const stages = Arrays.create((index) => {\n const shift = shifts[index];\n const numPeaks = Math.ceil(numFrames / (1 << shift));\n const stage = new Peaks.Stage((1 << shift) - 1, shift, numPeaks, dataOffset);\n dataOffset += numPeaks;\n return stage;\n }, shifts.length);\n return [stages, dataOffset];\n };\n const pack = (f0, f1) => {\n const bits0 = Float16.floatToIntBits(f0);\n const bits1 = Float16.floatToIntBits(f1);\n return bits0 | (bits1 << 16);\n };\n})(PeakWorker || (PeakWorker = {}));\n", "import { Peaks } from \"./Peaks\";\nexport var PeaksPainter;\n(function (PeaksPainter) {\n PeaksPainter.renderBlocks = (path, peaks, channelIndex, { u0, u1, v0, v1, x0, x1, y0, y1 }) => {\n const unitsEachPixel = (u1 - u0) / (x1 - x0);\n const stage = peaks.nearest(unitsEachPixel);\n if (stage === null) {\n return;\n }\n const scale = (y1 - y0 - 1.0) / (v1 - v0);\n const unitsEachPeak = stage.unitsEachPeak();\n const pixelOverFlow = x0 - Math.floor(x0);\n const peaksEachPixel = unitsEachPixel / unitsEachPeak;\n let from = (u0 - pixelOverFlow * unitsEachPixel) / unitsEachPixel * peaksEachPixel;\n let indexFrom = Math.floor(from);\n let min = 0.0;\n let max = 0.0;\n const data = peaks.data[channelIndex];\n for (let x = Math.floor(x0); x < Math.floor(x1); x++) {\n const to = from + peaksEachPixel;\n const indexTo = Math.floor(to);\n let swap = false;\n while (indexFrom < indexTo) {\n const bits = data[stage.dataOffset + indexFrom++];\n min = Math.min(Peaks.unpack(bits, 0), min);\n max = Math.max(Peaks.unpack(bits, 1), max);\n swap = true;\n }\n const yMin = y0 + Math.floor((min - v0) * scale);\n const yMax = y0 + Math.floor((max - v0) * scale);\n const ry0 = Math.max(y0, Math.min(yMin, yMax));\n const ry1 = Math.min(y1, Math.max(yMin, yMax));\n path.fillRect(x, ry0, 1, ry1 === ry0 ? 1 : ry1 - ry0);\n if (swap) {\n const tmp = max;\n max = min;\n min = tmp;\n }\n from = to;\n indexFrom = indexTo;\n }\n };\n})(PeaksPainter || (PeaksPainter = {}));\n", "import { Arrays, asDefined } from \"@opendaw/lib-std\";\nimport { Communicator, Promises } from \"@opendaw/lib-runtime\";\nimport \"../types\";\nexport var OpfsWorker;\n(function (OpfsWorker) {\n const DEBUG = false;\n const readLimiter = new Promises.Limit(1);\n const writeLimiter = new Promises.Limit(1);\n OpfsWorker.init = (messenger) => Communicator.executor(messenger.channel(\"opfs\"), new class {\n async write(path, data) {\n if (DEBUG) {\n console.debug(`write ${data.length}b to ${path}`);\n }\n return writeLimiter.add(() => this.#resolveFile(path, { create: true })\n .then(handle => {\n handle.truncate(data.length);\n handle.write(data, { at: 0 });\n handle.flush();\n handle.close();\n }));\n }\n async read(path) {\n if (DEBUG) {\n console.debug(`read ${path}`);\n }\n return readLimiter.add(() => this.#resolveFile(path)\n .then(handle => {\n const size = handle.getSize();\n const buffer = new Uint8Array(size);\n handle.read(buffer);\n handle.close();\n return buffer;\n }));\n }\n async delete(path) {\n const segments = pathToSegments(path);\n return this.#resolveFolder(segments.slice(0, -1))\n .then(folder => folder.removeEntry(asDefined(segments.at(-1)), { recursive: true }));\n }\n async list(path) {\n const segments = pathToSegments(path);\n const { status, value: folder } = await Promises.tryCatch(this.#resolveFolder(segments));\n if (status === \"rejected\") {\n return Arrays.empty();\n }\n const result = [];\n for await (const { name, kind } of folder.values()) {\n result.push({ name, kind });\n }\n return result;\n }\n async #resolveFile(path, options) {\n const segments = pathToSegments(path);\n return this.#resolveFolder(segments.slice(0, -1), options)\n .then((folder) => folder.getFileHandle(asDefined(segments.at(-1)), options)\n .then(handle => handle.createSyncAccessHandle()));\n }\n async #resolveFolder(segments, options) {\n let folder = await navigator.storage.getDirectory();\n for (const segment of segments) {\n folder = await folder.getDirectoryHandle(segment, options);\n }\n return folder;\n }\n });\n const pathToSegments = (path) => {\n const noSlashes = path.replace(/^\\/+|\\/+$/g, \"\");\n return noSlashes === \"\" ? [] : noSlashes.split(\"/\");\n };\n})(OpfsWorker || (OpfsWorker = {}));\n", "const key = Symbol.for(\"@openDAW/lib-fusion\");\nif (globalThis[key]) {\n console.debug(`%c${key.description}%c is already available in ${globalThis.constructor.name}.`, \"color: hsl(10, 83%, 60%)\", \"color: inherit\");\n}\nelse {\n globalThis[key] = true;\n console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n}\nimport './types';\nexport * from \"./live-stream/LiveStreamReceiver\";\nexport * from \"./live-stream/LiveStreamBroadcaster\";\nexport * from \"./peaks/Peaks\";\nexport * from \"./peaks/PeakWorker\";\nexport * from \"./peaks/PeakProtocol\";\nexport * from \"./peaks/PeaksPainter\";\nexport * from \"./opfs/OpfsWorker\";\nexport * from \"./opfs/OpfsProtocol\";\n", "import {Messenger} from \"@opendaw/lib-runtime\"\nimport {OpfsWorker, PeakWorker} from \"@opendaw/lib-fusion\"\n\nconst messenger: Messenger = Messenger.for(self)\n\nOpfsWorker.init(messenger)\nPeakWorker.install(messenger)"],
5
5
  "mappings": "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",
6
6
  "names": ["isDefined", "value", "asDefined", "value", "fail", "panic", "asInstanceOf", "obj", "clazz", "panic", "getOrProvide", "value", "safeExecute", "func", "args", "Unhandled", "empty", "panic", "issue", "assert", "condition", "fail", "getOrProvide", "InaccessibleProperty", "failMessage", "panic", "tryCatch", "statement", "error", "EmptyExec", "EmptyProcedure", "_", "Sorting", "Arrays", "#empty", "array", "newValues", "procedure", "index", "fail", "asDefined", "factory", "n", "i", "a", "b", "predicate", "first", "element", "panic", "result", "key", "seen", "value", "maxIndex", "sorting", "prev", "next", "Option", "value", "isDefined", "Some", "provider", "func", "args", "promise", "#value", "asDefined", "_", "matchable", "run", "callback", "_or", "other", "_fail", "fail", "panic", "getOrProvide", "or", "Attempts", "promise", "value", "reason", "provider", "result", "Option", "map", "matchable", "BinarySearch", "sorted", "key", "comparator", "l", "r", "m", "cmp", "map", "Color", "color", "colorValues", "isDefined", "value", "NumberComparator", "a", "b", "TAU", "PI_HALF", "PI_QUART", "INVERSE_SQRT_2", "clamp", "value", "min", "max", "nextPowOf2", "n", "Curve", "slope", "steps", "y0", "y1", "x", "p", "clamp", "y", "definition", "f1", "m", "q", "walk", "i", "v", "walkNormalized", "d", "ym", "dataView", "Integer", "value", "Float", "ARRAY_BUFFER", "FLOAT_VIEW", "INT_VIEW", "result", "Float16", "bits", "sign", "val", "mantissa", "exp", "Float64", "EXP_BIT_MASK", "SIGNIFICANT_BIT_MASK", "FLOAT64_VIEW", "LONG_VIEW", "Iterables", "value", "iterable", "count", "_", "predicate", "callback", "initialValue", "accumulator", "index", "include", "procedure", "map", "iterator", "i", "fn", "result", "mapped", "isDefined", "done", "prev", "ByteArrayOutput", "_ByteArrayOutput", "initialCapacity", "buffer", "byteOffset", "#view", "#position", "view", "value", "panic", "#ensureSpace", "bytes", "i", "length", "count", "capacity", "o", "nextPowOf2", "ByteCounter", "#count", "_", "ByteArrayInput", "#view", "#position", "buffer", "byteOffset", "value", "panic", "read", "array", "i", "length", "result", "count", "findMethodType", "descriptor", "isDefined", "panic", "Lazy", "_", "property", "context", "originalDescriptor", "value", "methodType", "element", "asDefined", "args", "Generators", "empty", "generator", "value", "done", "flatten", "generators", "Axis", "Corner", "Geom", "a", "b", "dx", "dy", "angle", "cs", "sn", "Point", "x", "y", "point", "scale", "multiplier", "object", "Rect", "rectangle", "x0", "y0", "x1", "y1", "rect", "amount", "outer", "inner", "topLeftInside", "bottomRightInside", "xMin", "xMax", "yMax", "yMin", "axis", "Unhandled", "corner", "bx", "by", "ux", "uy", "AABB", "aabb", "that", "offset", "top", "right", "bottom", "left", "Padding", "CohenSutherland", "c0", "code", "c1", "s", "sign", "x2", "y2", "ValueAxis", "value", "valueAxis", "min", "max", "clamp", "Hash", "buffers", "totalLength", "sum", "buf", "mergedArray", "offset", "buffer", "a", "b", "assert", "viewA", "viewB", "Intervals", "min0", "max0", "min1", "max1", "Listeners", "#set", "#proxy", "_", "func", "args", "listener", "safeExecute", "procedure", "Sets", "_Sets", "#EMPTY", "Objects", "u", "v", "keys", "key", "panic", "obj", "result", "exclude", "value", "target", "patch", "Terminable", "EmptyExec", "exec", "terminables", "Terminator", "_Terminator", "#terminables", "terminable", "terminator", "Arrays", "Notifier", "observer", "observables", "Terminable", "observable", "#observers", "value", "ObservableValue", "_observer", "MutableObservableValue", "_", "observableValue", "DefaultObservableValue", "#notifier", "#guard", "Option", "#value", "guard", "Linear", "#min", "#max", "#range", "min", "max", "y", "x", "clamp", "LinearInteger", "Integer", "Exponential", "Values", "#values", "values", "index", "value", "panic", "asDefined", "Decibel", "#a", "#b", "#c", "mid", "min2", "max2", "mid2", "tmp0", "tmp1", "ValueMapping", "Bool", "Unipolar", "Bipolar", "DefaultDecibelInstance", "StringMapping", "bipolar", "fractionDigits", "Numeric", "unit", "unitPrefix", "values", "y", "x", "index", "strings", "#unit", "#fractionDigits", "#unitPrefix", "#bipolar", "value", "float", "clamp", "last", "isDefined", "prefixes", "prefix", "computePrefix", "computeBase10", "location", "Predicates", "value", "Progress", "progress", "count", "collect", "Arrays", "index", "value", "total", "Random", "seed", "Mulberry32", "target", "noise", "random", "length", "panic", "sum", "i", "value", "acc", "#seed", "min", "max", "array", "Schema", "Serializer", "schema", "replace", "clone", "key", "value", "IOImpl", "input", "output", "length", "values", "i", "#schema", "#object", "#bytesTotal", "object", "#count", "collector", "data", "counter", "ByteCounter", "SortedSet", "#extractor", "#comparator", "#array", "extractor", "comparator", "value", "replace", "key", "insertIndex", "BinarySearch", "current", "isDefined", "factory", "values", "a", "b", "delta", "reason", "uniqueKeys", "panic", "deleteIndex", "candidate", "startIndex", "endIndex", "predicate", "count", "index", "#lookup", "provider", "Option", "procedure", "entry", "Arrays", "Strings", "value", "g", "fallback", "isDefined", "str", "buffer", "view", "i", "existingNames", "desiredName", "existingSet", "test", "counter", "TimeSpan", "_TimeSpan", "value", "#MILLI_SECONDS_PER_SECOND", "#MILLI_SECONDS_PER_MINUTE", "#MILLI_SECONDS_PER_HOUR", "#MILLI_SECONDS_PER_DAY", "#ms", "ms", "unit", "seconds", "minutes", "hours", "days", "d", "h", "m", "s", "#quantity", "name", "count", "Unhandled", "SyncStream", "State", "io", "buffer", "populate", "panic", "array", "output", "ByteArrayOutput", "procedure", "input", "ByteArrayInput", "UUID", "fromUint8Array", "buffer", "uuid", "input", "arr", "output", "format", "hex", "Arrays", "index", "string", "cleanUuid", "panic", "bytes", "j", "a", "b", "i", "delta", "key", "SortedSet", "value", "result", "array", "assert", "ValueGuide", "option", "isDefined", "trackLength", "DEFAULT_TRACK_LENGTH", "snapLength", "DEFAULT_SNAP_LENGTH", "thresholds", "Snap", "Identity", "#x", "#value", "#ratio", "length", "value", "delta", "assert", "clamp", "#length", "#margin", "#thresholds", "#ranges", "#enabled", "margin", "Arrays", "x", "index", "BinarySearch", "NumberComparator", "range", "threshold", "clamped", "key", "Communicator", "messenger", "bind", "Sender", "protocol", "Executor", "#messenger", "#expected", "#subscription", "#returnId", "#messageHandler", "func", "args", "Iterables", "arg", "resolve", "reject", "entries", "callbacks", "index", "message", "returns", "isDefined", "panic", "#protocol", "assert", "object", "asDefined", "returnId", "#sendCallback", "value", "#sendResolve", "reason", "#sendReject", "Fetch", "progress", "response", "length", "output", "ByteArrayOutput", "reader", "asDefined", "done", "value", "Runtime", "id", "exec", "timeout", "time", "args", "Messenger", "port", "NativeMessenger", "#port", "#notifier", "Notifier", "isDefined", "event", "message", "name", "Channel", "observer", "_Channel", "#messages", "#name", "#subscription", "messages", "data", "IntervalRetryOption", "#count", "maxRetry", "timeSpan", "reason", "exec", "Promises", "ResolveResult", "value", "InaccessibleProperty", "RejectedResult", "error", "owner", "promise", "running", "Terminable", "resolve", "reject", "call", "retryOption", "TimeSpan", "onFailure", "after", "thenUse", "use", "_", "fail", "timeout", "fn", "lastPromise", "arg", "Limit", "#waiting", "#running", "max", "provider", "#continue", "resolvers", "assert", "Latest", "#onResolve", "#onReject", "#onFinally", "#latest", "Option", "onResolve", "onReject", "onFinally", "safeExecute", "network", "limit", "Promises", "input", "init", "stopwatch", "level", "startTime", "label", "TimeSpanUtils", "startTime", "progress", "TimeSpan", "runtime", "Wait", "resolve", "numFrames", "count", "callback", "time", "args", "target", "type", "observable", "terminable", "generator", "reject", "interval", "status", "next", "error", "tryCatch", "done", "value", "key", "Address", "_Address", "keyExtractor", "SortedSet", "uuid", "fieldKeys", "keys", "#EMPTY_FIELD_KEYS", "assert", "value", "index", "str", "parts", "UUID", "x", "layout", "set", "id", "map", "sorted", "startIndex", "BinarySearch", "length", "endIndex", "a", "b", "compareId", "#uuid", "#fieldKeys", "comparison", "other", "key", "output", "array", "input", "uuidBytes", "numFields", "Arrays", "Addressable", "addressable", "address", "l", "r", "PointerHub", "_PointerHub", "pointer", "target", "Option", "type", "#vertex", "#immediateListeners", "#transactualListeners", "#inTransaction", "vertex", "Listeners", "listener", "filter", "#addFilteredListener", "added", "Address", "types", "Iterables", "pointerField", "incoming", "issue", "panic", "#onEndTransaction", "listeners", "beforeState", "afterState", "__decorate", "decorators", "target", "key", "desc", "c", "r", "d", "i", "__metadata", "k", "v", "Field", "_Field", "construct", "#parent", "#fieldKey", "#fieldName", "#pointerRules", "parent", "fieldKey", "fieldName", "pointerRules", "visitor", "safeExecute", "PointerHub", "field", "Iterables", "_key", "panic", "Option", "_input", "_output", "incoming", "pointer", "Lazy", "Address", "NoPointers", "Serializer", "output", "fields", "entries", "key", "field", "bytes", "ByteArrayOutput", "buffer", "input", "assert", "numFields", "fieldIndex", "byteLength", "ByteArrayInput", "__decorate", "decorators", "target", "key", "desc", "c", "r", "d", "i", "__metadata", "k", "v", "Box", "_Box", "#address", "#graph", "#name", "#pointerRules", "#fields", "#creationIndex", "uuid", "graph", "name", "pointerRules", "Address", "asDefined", "Option", "propagation", "procedure", "PointerHub", "byteCounter", "ByteCounter", "type", "asInstanceOf", "input", "Serializer", "output", "ByteArrayOutput", "map", "keys", "Arrays", "parent", "result", "index", "boxes", "pointers", "x", "pointer", "box", "Lazy", "Propagation", "Dispatchers", "DispatchersImpl", "#thisDispatcher", "Dispatcher", "Addressable", "#parentDispatcher", "#childrenDispatcher", "#deferredStations", "#order", "#dispatching", "propagation", "address", "procedure", "monitor", "Monitor", "deferred", "DeferredMonitor", "target", "a", "b", "station", "Unhandled", "order", "#monitors", "#sorted", "filterStrategy", "index", "#terminator", "Terminator", "#terminated", "dispatchers", "PrimitiveType", "ValueSerialization", "output", "value", "input", "array", "PrimitiveField", "Field", "#type", "#initValue", "#value", "field", "type", "visitor", "safeExecute", "observer", "Propagation", "assert", "oldValue", "newValue", "ByteArrayField", "_ByteArrayField", "PrimitiveField", "construct", "value", "#empty", "PrimitiveType", "ValueSerialization", "x", "index", "input", "bytes", "output", "Updates", "input", "numBlocks", "Arrays", "uuid", "UUID", "name", "settings", "NewUpdate", "address", "Address", "oldAddress", "Option", "newAddress", "PointerUpdate", "type", "serializer", "ValueSerialization", "oldValue", "newValue", "PrimitiveUpdate", "DeleteUpdate", "#uuid", "#name", "#settings", "graph", "box", "ByteArrayInput", "output", "_graph", "#address", "#serialization", "#oldValue", "#newValue", "serialization", "field", "_Unreferenceable", "key", "Browser", "hasLocation", "hasNavigator", "Compression", "buffer", "format", "stream", "writer", "ConsoleCommands", "path", "callback", "store", "init", "observableValue", "DefaultObservableValue", "input", "value", "getter", "setter", "EmptyProcedure", "error", "global", "scope", "attributes", "levels", "name", "current", "level", "ellipsis", "Context2d", "context", "text", "maxWidth", "width", "ellipseWidth", "l", "r", "mid", "result", "CssUtils", "term", "size", "em", "regex", "result", "replace", "digits", "unit", "number", "panic", "customCursors", "identifier", "data", "doc", "AnimationFrame", "nonrecurring", "recurring", "queue", "id", "exec", "exe", "Events", "eventTarget", "type", "listener", "options", "lastDownTime", "event", "now", "target", "isDefined", "Keyboard", "ctrlKey", "metaKey", "Browser", "altKey", "event", "Events", "Dragging", "target", "factory", "options", "processCycle", "Terminator", "Terminable", "Events", "event", "Browser", "option", "process", "pointerId", "moveEvent", "Keyboard", "AnimationFrame", "cancel", "_event", "Errors", "error", "Files", "arrayBuffer", "options", "isDefined", "handle", "writable", "blob", "url", "anchor", "status", "fileHandles", "error", "Promises", "fileHandle", "resolve", "reject", "fileInput", "event", "files", "Arrays", "index", "asDefined", "Html", "source", "template", "panic", "child", "element", "elements", "selectors", "parent", "asDefined", "id", "classDefinition", "prefix", "assert", "className", "sheet", "input", "x", "cssValues", "colors", "value", "Color", "target", "callback", "options", "observer", "first", "elemRect", "Rect", "owner", "range", "selection", "isDefined", "property", "limit", "document", "ModfierKeys", "Mac", "Win", "Browser", "Stream", "reader", "chunks", "done", "value", "length", "acc", "val", "output", "position", "chunk", "Svg", "#d", "x", "y", "x1", "y1", "x2", "y2", "rx", "ry", "deg", "largeArc", "sweep", "cx", "cy", "radius", "a0", "a1", "x0", "y0", "range", "TerminatorUtils", "weakRefs", "key", "subscribe", "weakRef", "terminable", "startWatchWeak", "id", "index", "entry", "key", "PackageType", "Lock", "Flags", "Peaks", "_Peaks", "input", "assert", "numStages", "stages", "i", "dataOffset", "numPeaks", "shift", "mask", "numData", "data", "array", "numFrames", "numChannels", "unitsPerPixel", "output", "ByteArrayOutput", "width", "ratio", "ShiftPadding", "maxShift", "Arrays", "index", "Stage", "bits", "Float16", "Unhandled", "PeakWorker", "messenger", "Communicator", "progress", "shifts", "frames", "numFrames", "numChannels", "generatePeaks", "panic", "State", "time", "stopwatch", "numShifts", "stages", "dataOffset", "initStages", "data", "Arrays", "minMask", "total", "count", "channel", "channelData", "channelFrames", "states", "min", "max", "position", "i", "frame", "j", "stage", "state", "pack", "Peaks", "index", "shift", "numPeaks", "f0", "f1", "bits0", "Float16", "bits1", "PeaksPainter", "path", "peaks", "channelIndex", "u0", "u1", "v0", "v1", "x0", "x1", "y0", "y1", "unitsEachPixel", "stage", "scale", "unitsEachPeak", "pixelOverFlow", "peaksEachPixel", "from", "indexFrom", "min", "max", "data", "x", "to", "indexTo", "swap", "bits", "Peaks", "yMin", "yMax", "ry0", "ry1", "tmp", "OpfsWorker", "readLimiter", "Promises", "writeLimiter", "messenger", "Communicator", "path", "data", "#resolveFile", "handle", "size", "buffer", "segments", "pathToSegments", "#resolveFolder", "folder", "asDefined", "status", "Arrays", "result", "name", "kind", "options", "segment", "noSlashes", "key", "messenger", "Messenger", "OpfsWorker", "PeakWorker"]
7
7
  }