@opendaw/studio-core 0.0.112 → 0.0.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AudioUnitFreeze.d.ts +15 -0
- package/dist/AudioUnitFreeze.d.ts.map +1 -0
- package/dist/AudioUnitFreeze.js +129 -0
- package/dist/Engine.d.ts +1 -0
- package/dist/Engine.d.ts.map +1 -1
- package/dist/EngineFacade.d.ts +1 -0
- package/dist/EngineFacade.d.ts.map +1 -1
- package/dist/EngineFacade.js +3 -0
- package/dist/EngineWorklet.d.ts +1 -0
- package/dist/EngineWorklet.d.ts.map +1 -1
- package/dist/EngineWorklet.js +4 -0
- package/dist/OfflineEngineRenderer.d.ts.map +1 -1
- package/dist/OfflineEngineRenderer.js +1 -0
- package/dist/StudioPreferences.d.ts +1 -0
- package/dist/StudioPreferences.d.ts.map +1 -1
- package/dist/StudioSettings.d.ts +1 -0
- package/dist/StudioSettings.d.ts.map +1 -1
- package/dist/StudioSettings.js +4 -2
- package/dist/capture/CaptureDevices.d.ts.map +1 -1
- package/dist/capture/CaptureDevices.js +6 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/offline-engine.js.map +1 -1
- package/dist/processors.js +8 -8
- package/dist/processors.js.map +4 -4
- package/dist/project/Project.d.ts +2 -0
- package/dist/project/Project.d.ts.map +1 -1
- package/dist/project/Project.js +3 -0
- package/dist/ui/index.d.ts +1 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +1 -0
- package/dist/ui/renderer/audio.d.ts +9 -0
- package/dist/ui/renderer/audio.d.ts.map +1 -0
- package/dist/ui/renderer/audio.js +277 -0
- package/dist/ui/renderer/env.d.ts +5 -0
- package/dist/ui/renderer/env.d.ts.map +1 -0
- package/dist/ui/renderer/env.js +1 -0
- package/dist/ui/renderer/fading.d.ts +7 -0
- package/dist/ui/renderer/fading.d.ts.map +1 -0
- package/dist/ui/renderer/fading.js +55 -0
- package/dist/ui/renderer/index.d.ts +6 -0
- package/dist/ui/renderer/index.d.ts.map +1 -0
- package/dist/ui/renderer/index.js +5 -0
- package/dist/ui/renderer/notes.d.ts +7 -0
- package/dist/ui/renderer/notes.d.ts.map +1 -0
- package/dist/ui/renderer/notes.js +23 -0
- package/dist/ui/renderer/value.d.ts +7 -0
- package/dist/ui/renderer/value.d.ts.map +1 -0
- package/dist/ui/renderer/value.js +101 -0
- package/package.json +10 -10
|
@@ -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/iterables.js", "../../../lib/std/dist/terminable.js", "../../../lib/std/dist/notifier.js", "../../../lib/std/dist/time-span.js", "../../../lib/runtime/dist/communicator.js", "../../../lib/runtime/dist/messenger.js", "../../../lib/runtime/dist/wait.js", "../../../lib/dsp/dist/ppqn.js", "../../../lib/dsp/dist/constants.js", "../../../lib/dsp/dist/utils.js", "../../core-workers/src/worklet-env.ts", "../../core-workers/src/offline-engine-main.ts"],
|
|
4
|
-
"sourcesContent": ["// noinspection JSUnusedGlobalSymbols\nexport const identity = (value) => value;\nexport const isDefined = (value) => value !== undefined && value !== null;\nexport const isNull = (value) => value === null;\nexport const isNotNull = (value) => value !== null;\nexport const isUndefined = (value) => value === undefined;\nexport const isNotUndefined = (value) => value !== undefined;\nexport const isAbsent = (value) => value === undefined || value === null;\nexport const ifDefined = (value, procedure) => value !== undefined && value !== null ? procedure(value) : undefined;\nexport const asDefined = (value, fail = \"asDefined failed\") => value === null || value === undefined ? panic(getOrProvide(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) => {\n if (!(obj instanceof clazz)) {\n panic(`${obj} is not instance of ${clazz}`);\n }\n};\nexport const isSameClass = (a, b) => a.constructor === b.constructor;\nexport const tryProvide = (provider) => {\n try {\n return provider();\n }\n catch (reason) {\n return panic(String(reason));\n }\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 isRecord = (value) => isDefined(value) && typeof value === \"object\";\nexport const hasField = (record, key, type) => {\n if (!(key in record))\n return false;\n const value = record[key];\n return type === \"null\" ? value === null : typeof value === type;\n};\nexport const safeRead = (object, ...keys) => {\n let current = object;\n for (const key of keys) {\n if (!isRecord(current) || !(key in current)) {\n return undefined;\n }\n current = current[key];\n }\n return current;\n};\nexport const Unhandled = (empty) => { throw new Error(`Unhandled ${empty}`); };\nexport const panic = (issue) => {\n throw typeof issue === \"string\" ? new Error(issue) : issue;\n};\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 class SuccessResult {\n value;\n status = \"success\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when succeeded\");\n}\nexport class FailureResult {\n error;\n status = \"failure\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when failed\");\n}\nexport const tryCatch = (statement) => {\n try {\n return new SuccessResult(statement());\n }\n catch (error) {\n return new FailureResult(error);\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 asEnumValue = (value, enm) => {\n const keys = Object.keys(enm);\n if (keys.length === 0)\n return panic(\"Empty enum object (are you using `const enum`?)\");\n const values = Object.keys(enm)\n .filter(k => isNaN(Number(k)))\n .map(k => enm[k]);\n return values.includes(value) ? value : panic(`Invalid enum value: ${String(value)}`);\n};\nexport const EmptyExec = () => { };\nexport const EmptyProvider = () => { };\nexport const EmptyProcedure = (_) => { };\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 getPrev = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index - 1) % array.length), \"Internal Error\");\n };\n static getNext = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index + 1) % array.length), \"Internal Error\");\n };\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 removeIf = (array, predicate) => {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n array.splice(i, 1);\n }\n }\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 subtract(array, excludeArray, compareFn) {\n return array.filter(item => !excludeArray.some(excludeItem => compareFn(item, excludeItem)));\n }\n static intersect(array, other, compareFn) {\n return array.filter(item => other.some(includeItem => compareFn(item, includeItem)));\n }\n static merge(baseArray, mergeIntoArray, compareFn) {\n return [...(baseArray\n .filter(baseItem => !mergeIntoArray\n .some(mergeItem => compareFn(baseItem, mergeItem)))), ...mergeIntoArray];\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 *iterateAdjacent(array) {\n if (array.length <= 1) {\n return;\n }\n for (let i = 1, left = array[0]; i < array.length; i++) {\n const right = array[i];\n yield [left, right];\n left = right;\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 static toRecord(array, toKey) {\n return array.reduce((record, value) => {\n record[toKey(value)] = value;\n return record;\n }, {});\n }\n static concatArrayBuffers(a, b) {\n const result = new ArrayBuffer(a.byteLength + b.byteLength);\n const view = new Uint8Array(result);\n view.set(new Uint8Array(a), 0);\n view.set(new Uint8Array(b), a.byteLength);\n return result;\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.tryCatch = (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 ifAbsent(_func) { return undefined; }\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 ifAbsent = (exec) => exec(undefined);\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 { 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 { 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 isEmpty() { return this.#terminables.length === 0; }\n nonEmpty() { return this.#terminables.length > 0; }\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\";\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}\n", "import { Unhandled } from \"./lang\";\nexport class TimeSpan {\n static createEstimator = () => {\n const startTime = performance.now();\n let output = TimeSpan.millis(Number.POSITIVE_INFINITY);\n let seconds = 0 | 0;\n return (progress) => {\n if (progress === 0.0) {\n return TimeSpan.POSITIVE_INFINITY;\n }\n if (progress >= 1.0) {\n return TimeSpan.millis(0);\n }\n const elapsedTime = performance.now() - startTime;\n if (elapsedTime > seconds * 1000.0) {\n output = TimeSpan.millis(elapsedTime / progress - elapsedTime);\n seconds++;\n }\n return output;\n };\n };\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 toHHMMSS = (seconds) => ((seconds / 3600 | 0) + 100).toString().slice(1) + \":\" +\n (((seconds / 60 | 0) % 60) + 100).toString().slice(1) + \":\" +\n ((seconds % 60) + 100).toString().slice(1);\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 { 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 class Transfer {\n value;\n constructor(value) {\n this.value = value;\n }\n }\n Communicator.Transfer = Transfer;\n Communicator.makeTransferable = (value) => new Transfer(value);\n Communicator.sender = (messenger, bind) => bind(new Sender(messenger));\n Communicator.executor = (messenger, protocol) => new Executor(messenger, protocol);\n const extractTransferables = (args) => {\n const transferables = [];\n for (const arg of args) {\n if (arg instanceof Transfer) {\n transferables.push(arg.value);\n }\n else if (arg instanceof MessagePort) {\n transferables.push(arg);\n }\n else if (typeof ImageBitmap !== \"undefined\" && arg instanceof ImageBitmap) {\n transferables.push(arg);\n }\n else if (typeof OffscreenCanvas !== \"undefined\" && arg instanceof OffscreenCanvas) {\n transferables.push(arg);\n }\n }\n return transferables;\n };\n const unwrapArg = (arg) => arg instanceof Transfer ? arg.value : arg;\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) => {\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: false,\n func: func.name,\n args: Array.from(Iterables.map(args, arg => ({ value: unwrapArg(arg) })))\n }, transferables);\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 const transferables = extractTransferables(args);\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: unwrapArg(arg) })))\n }, transferables);\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 : 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) => \"value\" in arg\n ? arg.value : panic(`${message.func.toString()} has no promise.`)));\n }\n else {\n try {\n const promise = func.apply(this.#protocol, message.args\n .map(arg => \"callback\" in arg ? (...args) => this.#sendCallback(returnId, arg.callback, args) : arg.value));\n promise.then(value => {\n try {\n this.#sendResolve(returnId, value);\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }, 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 { isDefined, Notifier } from \"@opendaw/lib-std\";\nexport const Messenger = { for: (port) => new NativeMessenger(port) };\nconst EmptyTransferables = [];\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, transfer) {\n this.#port.postMessage(message, transfer ?? EmptyTransferables);\n }\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}\n// with '__id__' we put in a little security that we are only communicating with the messenger we created\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 (\"__id__\" in data && data.__id__ === \"42\" && \"message\" in data && \"channel\" in data && data.channel === name) {\n this.#notifier.notify(data.message);\n }\n });\n }\n send(message, transferrables) {\n this.#messages.send({ __id__: \"42\", channel: this.#name, message }, transferrables);\n }\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 { 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", "// Pulses per quarter note (PPQN)\n// 960 = 3*5*2^6\nconst Quarter = 960;\nconst Bar = Quarter << 2; // 3_840\nconst SemiQuaver = Quarter >>> 2; // 240\nconst fromSignature = (nominator, denominator) => Math.floor(Bar / denominator) * nominator;\nconst toParts = (ppqn, nominator = 4, denominator = 4) => {\n const lowerPulses = fromSignature(1, denominator);\n const beats = Math.floor(ppqn / lowerPulses);\n const bars = Math.floor(beats / nominator);\n const remainingPulses = Math.floor(ppqn) - fromSignature(bars * nominator, denominator);\n const ticks = remainingPulses % lowerPulses;\n const semiquavers = Math.floor(ticks / SemiQuaver);\n const remainingTicks = ticks % SemiQuaver;\n return {\n bars,\n beats: beats - bars * nominator,\n semiquavers,\n ticks: remainingTicks\n };\n};\nconst secondsToPulses = (seconds, bpm) => seconds * bpm / 60.0 * Quarter;\nconst pulsesToSeconds = (pulses, bpm) => (pulses * 60.0 / Quarter) / bpm;\nconst secondsToBpm = (seconds, pulses) => (pulses * 60.0 / Quarter) / seconds;\nconst samplesToPulses = (samples, bpm, sampleRate) => secondsToPulses(samples / sampleRate, bpm);\nconst pulsesToSamples = (pulses, bpm, sampleRate) => pulsesToSeconds(pulses, bpm) * sampleRate;\nexport const PPQN = {\n Bar,\n Quarter,\n SemiQuaver,\n fromSignature,\n toParts,\n secondsToPulses,\n pulsesToSeconds,\n secondsToBpm,\n samplesToPulses,\n pulsesToSamples,\n toString: (pulses, nominator = 4, denominator = 4) => {\n const { bars, beats, semiquavers, ticks } = toParts(pulses | 0, nominator, denominator);\n return `${bars + 1}.${beats + 1}.${semiquavers + 1}:${ticks}`;\n }\n};\n", "import { PPQN } from \"./ppqn\";\nexport const RenderQuantum = 128 | 0;\nexport const TempoChangeGrid = PPQN.fromSignature(1, 48); // make dynamic window 10ms\nexport const SILENCE_THRESHOLD = 1e-4; // \u2248 -80 dB\n", "const LogDb = Math.log(10.0) / 20.0;\nexport const midiToHz = (note = 60.0, baseFrequency = 440.0) => baseFrequency * Math.pow(2.0, (note + 3.0) / 12.0 - 6.0);\nexport const hzToMidi = (hz, baseFrequency = 440.0) => (12.0 * Math.log(hz / baseFrequency) + 69.0 * Math.LN2) / Math.LN2;\nexport const dbToGain = (db) => Math.exp(db * LogDb);\nexport const gainToDb = (gain) => Math.log(gain) / LogDb;\nexport const velocityToGain = (velocity) => dbToGain(20 * Math.log10(velocity));\nexport const barsToBpm = (bars, duration) => (bars * 240.0) / duration;\nexport const bpmToBars = (bpm, duration) => (bpm * duration) / 240.0;\nexport const estimateBpm = (duration, maxBpm = 180.0) => {\n const bpm = barsToBpm(Math.pow(2.0, Math.floor(Math.log(bpmToBars(maxBpm, duration)) / Math.LN2)), duration);\n return Math.round(bpm * 1000.0) / 1000.0;\n};\nexport const semitoneToHz = (semitones) => 440 * Math.pow(2.0, (semitones - 69.0) / 12.0);\nexport const hzToSemitone = (hz) => 69.0 + 12.0 * Math.log2(hz / 440.0);\n", "type WorkletProcessorConstructor = new (options: Record<string, unknown>) => AudioWorkletProcessor\n\nexport type WorkletGlobals = {\n sampleRate: number\n currentFrame: number\n currentTime: number\n AudioWorkletProcessor: typeof AudioWorkletProcessor\n registerProcessor: (name: string, ctor: WorkletProcessorConstructor) => void\n __registeredProcessors__: Record<string, WorkletProcessorConstructor>\n __workletPort__: MessagePort\n}\n\nconst globals = globalThis as unknown as WorkletGlobals\n\nexport class AudioWorkletProcessor {\n readonly port: MessagePort\n constructor() { this.port = globals.__workletPort__ }\n process(_inputs: Float32Array[][], _outputs: Float32Array[][]): boolean { return false }\n}\n\nexport const setupWorkletGlobals = (config: { sampleRate: number }): void => {\n globals.sampleRate = config.sampleRate\n globals.currentFrame = 0\n globals.currentTime = 0\n globals.AudioWorkletProcessor = AudioWorkletProcessor\n globals.registerProcessor = (name: string, ctor: WorkletProcessorConstructor) => {\n globals.__registeredProcessors__ = globals.__registeredProcessors__ || {}\n globals.__registeredProcessors__[name] = ctor\n }\n}\n\nexport const updateFrameTime = (frame: number, sampleRate: number): void => {\n globals.currentFrame = frame\n globals.currentTime = frame / sampleRate\n}", "import {Arrays, int, isDefined, Option, TimeSpan} from \"@opendaw/lib-std\"\nimport {Communicator, Messenger, Wait} from \"@opendaw/lib-runtime\"\nimport {dbToGain, RenderQuantum} from \"@opendaw/lib-dsp\"\nimport {OfflineEngineInitializeConfig, OfflineEngineProtocol, OfflineEngineRenderConfig} from \"@opendaw/studio-adapters\"\nimport {AudioWorkletProcessor, setupWorkletGlobals, updateFrameTime, WorkletGlobals} from \"./worklet-env\"\n\nconst globals = globalThis as unknown as WorkletGlobals\n\ntype EngineState = {\n readonly processor: AudioWorkletProcessor\n readonly progressPort: MessagePort\n readonly sampleRate: int\n readonly numberOfChannels: int\n totalFrames: int\n running: boolean\n}\n\nlet state: Option<EngineState> = Option.None\n\nCommunicator.executor<OfflineEngineProtocol>(\n Messenger.for(self).channel(\"offline-engine\"), {\n async initialize(enginePort: MessagePort, progressPort: MessagePort, config: OfflineEngineInitializeConfig) {\n setupWorkletGlobals({sampleRate: config.sampleRate})\n globals.__workletPort__ = enginePort\n await import(config.processorsUrl)\n const ProcessorClass = globals.__registeredProcessors__[\"engine-processor\"]\n state = Option.wrap({\n processor: new ProcessorClass({\n processorOptions: {\n syncStreamBuffer: config.syncStreamBuffer,\n controlFlagsBuffer: config.controlFlagsBuffer,\n hrClockBuffer: new SharedArrayBuffer(32),\n project: config.project,\n exportConfiguration: config.exportConfiguration\n }\n }),\n progressPort,\n sampleRate: config.sampleRate,\n numberOfChannels: config.numberOfChannels,\n totalFrames: 0,\n running: false\n })\n },\n async step(numSamples: int): Promise<Float32Array[]> {\n const engine = state.unwrap()\n const result: Float32Array[] = Arrays.create(() => new Float32Array(numSamples), engine.numberOfChannels)\n const outputChannels: Float32Array[] = Arrays.create(() => new Float32Array(RenderQuantum), engine.numberOfChannels)\n let offset = 0 | 0\n while (offset < numSamples) {\n const outputs: Float32Array[][] = [outputChannels]\n updateFrameTime(engine.totalFrames, engine.sampleRate)\n engine.processor.process([[]], outputs)\n engine.totalFrames += RenderQuantum\n const needed = numSamples - offset\n const toCopy = Math.min(needed, RenderQuantum)\n for (let ch = 0; ch < engine.numberOfChannels; ch++) {\n result[ch].set(outputs[0][ch].subarray(0, toCopy), offset)\n }\n offset += toCopy\n }\n return result\n },\n async render(config: OfflineEngineRenderConfig) {\n const engine = state.unwrap()\n const {silenceThresholdDb, silenceDurationSeconds, maxDurationSeconds} = config\n const threshold = dbToGain(silenceThresholdDb ?? -72.0)\n const silenceFramesNeeded = Math.ceil((silenceDurationSeconds ?? 10) * engine.sampleRate)\n const maxFrames = isDefined(maxDurationSeconds) ? Math.ceil(maxDurationSeconds * engine.sampleRate) : Infinity\n const chunks: Float32Array[][] = Arrays.create(() => [], engine.numberOfChannels)\n let consecutiveSilentFrames = 0\n let hasHadAudio = false\n let lastYield = 0\n engine.running = true\n await Wait.timeSpan(TimeSpan.seconds(0))\n while (engine.running && engine.totalFrames < maxFrames) {\n const outputChannels: Float32Array[] = Arrays.create(() => new Float32Array(RenderQuantum), engine.numberOfChannels)\n const outputs: Float32Array[][] = [outputChannels]\n updateFrameTime(engine.totalFrames, engine.sampleRate)\n const keepRunning = engine.processor.process([[]], outputs)\n let maxSample = 0\n for (const channel of outputs[0]) {\n for (const sample of channel) {\n const absoluteValue = Math.abs(sample)\n if (absoluteValue > maxSample) {maxSample = absoluteValue}\n }\n }\n const isSilent = maxSample <= threshold\n if (maxSample > threshold) {hasHadAudio = true}\n if (isSilent && hasHadAudio) {\n consecutiveSilentFrames += RenderQuantum\n if (consecutiveSilentFrames >= silenceFramesNeeded) {break}\n } else {\n consecutiveSilentFrames = 0\n }\n for (let ch = 0; ch < engine.numberOfChannels; ch++) {\n chunks[ch].push(outputs[0][ch].slice())\n }\n engine.totalFrames += RenderQuantum\n if (!keepRunning) {break}\n if (engine.totalFrames - lastYield >= engine.sampleRate) {\n lastYield = engine.totalFrames\n engine.progressPort.postMessage({frames: engine.totalFrames})\n await new Promise(resolve => setTimeout(resolve, 0))\n }\n }\n const framesToKeep = engine.totalFrames - consecutiveSilentFrames + Math.min(engine.sampleRate / 4, consecutiveSilentFrames)\n return Arrays.create(channelIndex => {\n const total = new Float32Array(framesToKeep)\n let offset = 0\n for (const chunk of chunks[channelIndex]) {\n if (offset >= framesToKeep) {break}\n const toCopy = Math.min(chunk.length, framesToKeep - offset)\n total.set(chunk.subarray(0, toCopy), offset)\n offset += toCopy\n }\n return total\n }, engine.numberOfChannels)\n },\n stop() { state.unwrap().running = false }\n }\n)\n"],
|
|
4
|
+
"sourcesContent": ["// noinspection JSUnusedGlobalSymbols\nexport const identity = (value) => value;\nexport const isDefined = (value) => value !== undefined && value !== null;\nexport const isNull = (value) => value === null;\nexport const isNotNull = (value) => value !== null;\nexport const isUndefined = (value) => value === undefined;\nexport const isNotUndefined = (value) => value !== undefined;\nexport const isAbsent = (value) => value === undefined || value === null;\nexport const ifDefined = (value, procedure) => value !== undefined && value !== null ? procedure(value) : undefined;\nexport const asDefined = (value, fail = \"asDefined failed\") => value === null || value === undefined ? panic(getOrProvide(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) => {\n if (!(obj instanceof clazz)) {\n panic(`${obj} is not instance of ${clazz}`);\n }\n};\nexport const isSameClass = (a, b) => a.constructor === b.constructor;\nexport const tryProvide = (provider) => {\n try {\n return provider();\n }\n catch (reason) {\n return panic(String(reason));\n }\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 isRecord = (value) => isDefined(value) && typeof value === \"object\";\nexport const hasField = (record, key, type) => {\n if (!(key in record))\n return false;\n const value = record[key];\n return type === \"null\" ? value === null : typeof value === type;\n};\nexport const safeRead = (object, ...keys) => {\n let current = object;\n for (const key of keys) {\n if (!isRecord(current) || !(key in current)) {\n return undefined;\n }\n current = current[key];\n }\n return current;\n};\nexport const Unhandled = (empty) => { throw new Error(`Unhandled ${empty}`); };\nexport const panic = (issue) => {\n throw typeof issue === \"string\" ? new Error(issue) : issue;\n};\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 class SuccessResult {\n value;\n status = \"success\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when succeeded\");\n}\nexport class FailureResult {\n error;\n status = \"failure\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when failed\");\n}\nexport const tryCatch = (statement) => {\n try {\n return new SuccessResult(statement());\n }\n catch (error) {\n return new FailureResult(error);\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 asEnumValue = (value, enm) => {\n const keys = Object.keys(enm);\n if (keys.length === 0)\n return panic(\"Empty enum object (are you using `const enum`?)\");\n const values = Object.keys(enm)\n .filter(k => isNaN(Number(k)))\n .map(k => enm[k]);\n return values.includes(value) ? value : panic(`Invalid enum value: ${String(value)}`);\n};\nexport const EmptyExec = () => { };\nexport const EmptyProvider = () => { };\nexport const EmptyProcedure = (_) => { };\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 getPrev = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index - 1) % array.length), \"Internal Error\");\n };\n static getNext = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index + 1) % array.length), \"Internal Error\");\n };\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 removeIf = (array, predicate) => {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n array.splice(i, 1);\n }\n }\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 subtract(array, excludeArray, compareFn) {\n return array.filter(item => !excludeArray.some(excludeItem => compareFn(item, excludeItem)));\n }\n static intersect(array, other, compareFn) {\n return array.filter(item => other.some(includeItem => compareFn(item, includeItem)));\n }\n static merge(baseArray, mergeIntoArray, compareFn) {\n return [...(baseArray\n .filter(baseItem => !mergeIntoArray\n .some(mergeItem => compareFn(baseItem, mergeItem)))), ...mergeIntoArray];\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 *iterateAdjacent(array) {\n if (array.length <= 1) {\n return;\n }\n for (let i = 1, left = array[0]; i < array.length; i++) {\n const right = array[i];\n yield [left, right];\n left = right;\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 static toRecord(array, toKey) {\n return array.reduce((record, value) => {\n record[toKey(value)] = value;\n return record;\n }, {});\n }\n static concatArrayBuffers(a, b) {\n const result = new ArrayBuffer(a.byteLength + b.byteLength);\n const view = new Uint8Array(result);\n view.set(new Uint8Array(a), 0);\n view.set(new Uint8Array(b), a.byteLength);\n return result;\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.tryCatch = (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 ifAbsent(_func) { return undefined; }\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 ifAbsent = (exec) => exec(undefined);\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 { 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 { 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 isEmpty() { return this.#terminables.length === 0; }\n nonEmpty() { return this.#terminables.length > 0; }\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\";\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}\n", "import { Unhandled } from \"./lang\";\nexport class TimeSpan {\n static createEstimator = () => {\n const startTime = performance.now();\n let output = TimeSpan.millis(Number.POSITIVE_INFINITY);\n let seconds = 0 | 0;\n return (progress) => {\n if (progress === 0.0) {\n return TimeSpan.POSITIVE_INFINITY;\n }\n if (progress >= 1.0) {\n return TimeSpan.millis(0);\n }\n const elapsedTime = performance.now() - startTime;\n if (elapsedTime > seconds * 1000.0) {\n output = TimeSpan.millis(elapsedTime / progress - elapsedTime);\n seconds++;\n }\n return output;\n };\n };\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 toHHMMSS = (seconds) => ((seconds / 3600 | 0) + 100).toString().slice(1) + \":\" +\n (((seconds / 60 | 0) % 60) + 100).toString().slice(1) + \":\" +\n ((seconds % 60) + 100).toString().slice(1);\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 { 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 class Transfer {\n value;\n constructor(value) {\n this.value = value;\n }\n }\n Communicator.Transfer = Transfer;\n Communicator.makeTransferable = (value) => new Transfer(value);\n Communicator.sender = (messenger, bind) => bind(new Sender(messenger));\n Communicator.executor = (messenger, protocol) => new Executor(messenger, protocol);\n const extractTransferables = (args) => {\n const transferables = [];\n for (const arg of args) {\n if (arg instanceof Transfer) {\n transferables.push(arg.value);\n }\n else if (arg instanceof MessagePort) {\n transferables.push(arg);\n }\n else if (typeof ImageBitmap !== \"undefined\" && arg instanceof ImageBitmap) {\n transferables.push(arg);\n }\n else if (typeof OffscreenCanvas !== \"undefined\" && arg instanceof OffscreenCanvas) {\n transferables.push(arg);\n }\n }\n return transferables;\n };\n const unwrapArg = (arg) => arg instanceof Transfer ? arg.value : arg;\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) => {\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: false,\n func: func.name,\n args: Array.from(Iterables.map(args, arg => ({ value: unwrapArg(arg) })))\n }, transferables);\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 const transferables = extractTransferables(args);\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: unwrapArg(arg) })))\n }, transferables);\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 : 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) => \"value\" in arg\n ? arg.value : panic(`${message.func.toString()} has no promise.`)));\n }\n else {\n try {\n const promise = func.apply(this.#protocol, message.args\n .map(arg => \"callback\" in arg ? (...args) => this.#sendCallback(returnId, arg.callback, args) : arg.value));\n promise.then(value => {\n try {\n this.#sendResolve(returnId, value);\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }, 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 { isDefined, Notifier } from \"@opendaw/lib-std\";\nexport const Messenger = { for: (port) => new NativeMessenger(port) };\nconst EmptyTransferables = [];\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, transfer) {\n this.#port.postMessage(message, transfer ?? EmptyTransferables);\n }\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}\n// with '__id__' we put in a little security that we are only communicating with the messenger we created\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 (\"__id__\" in data && data.__id__ === \"42\" && \"message\" in data && \"channel\" in data && data.channel === name) {\n this.#notifier.notify(data.message);\n }\n });\n }\n send(message, transferrables) {\n this.#messages.send({ __id__: \"42\", channel: this.#name, message }, transferrables);\n }\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 { 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", "// Pulses per quarter note (PPQN)\n// 960 = 3*5*2^6\nconst Quarter = 960;\nconst Bar = Quarter << 2; // 3_840\nconst SemiQuaver = Quarter >>> 2; // 240\nconst fromSignature = (nominator, denominator) => Math.floor(Bar / denominator) * nominator;\nconst toParts = (ppqn, nominator = 4, denominator = 4) => {\n const lowerPulses = fromSignature(1, denominator);\n const beats = Math.floor(ppqn / lowerPulses);\n const bars = Math.floor(beats / nominator);\n const remainingPulses = Math.floor(ppqn) - fromSignature(bars * nominator, denominator);\n const ticks = remainingPulses % lowerPulses;\n const semiquavers = Math.floor(ticks / SemiQuaver);\n const remainingTicks = ticks % SemiQuaver;\n return {\n bars,\n beats: beats - bars * nominator,\n semiquavers,\n ticks: remainingTicks\n };\n};\nconst secondsToPulses = (seconds, bpm) => seconds * bpm / 60.0 * Quarter;\nconst pulsesToSeconds = (pulses, bpm) => (pulses * 60.0 / Quarter) / bpm;\nconst secondsToBpm = (seconds, pulses) => (pulses * 60.0 / Quarter) / seconds;\nconst samplesToPulses = (samples, bpm, sampleRate) => secondsToPulses(samples / sampleRate, bpm);\nconst pulsesToSamples = (pulses, bpm, sampleRate) => pulsesToSeconds(pulses, bpm) * sampleRate;\nexport const PPQN = {\n Bar,\n Quarter,\n SemiQuaver,\n fromSignature,\n toParts,\n secondsToPulses,\n pulsesToSeconds,\n secondsToBpm,\n samplesToPulses,\n pulsesToSamples,\n toString: (pulses, nominator = 4, denominator = 4) => {\n const { bars, beats, semiquavers, ticks } = toParts(pulses | 0, nominator, denominator);\n return `${bars + 1}.${beats + 1}.${semiquavers + 1}:${ticks}`;\n }\n};\n", "import { PPQN } from \"./ppqn\";\nexport const RenderQuantum = 128 | 0;\nexport const TempoChangeGrid = PPQN.fromSignature(1, 48); // make dynamic window 10ms\nexport const SILENCE_THRESHOLD = 1e-4; // \u2248 -80 dB\n", "const LogDb = Math.log(10.0) / 20.0;\nexport const midiToHz = (note = 60.0, baseFrequency = 440.0) => baseFrequency * Math.pow(2.0, (note + 3.0) / 12.0 - 6.0);\nexport const hzToMidi = (hz, baseFrequency = 440.0) => (12.0 * Math.log(hz / baseFrequency) + 69.0 * Math.LN2) / Math.LN2;\nexport const dbToGain = (db) => Math.exp(db * LogDb);\nexport const gainToDb = (gain) => Math.log(gain) / LogDb;\nexport const velocityToGain = (velocity) => dbToGain(20 * Math.log10(velocity));\nexport const barsToBpm = (bars, duration) => (bars * 240.0) / duration;\nexport const bpmToBars = (bpm, duration) => (bpm * duration) / 240.0;\nexport const estimateBpm = (duration, maxBpm = 180.0) => {\n const bpm = barsToBpm(Math.pow(2.0, Math.floor(Math.log(bpmToBars(maxBpm, duration)) / Math.LN2)), duration);\n return Math.round(bpm * 1000.0) / 1000.0;\n};\nexport const semitoneToHz = (semitones, baseFrequency = 440.0) => baseFrequency * Math.pow(2.0, (semitones - 69.0) / 12.0);\nexport const hzToSemitone = (hz, baseFrequency = 440.0) => 69.0 + 12.0 * Math.log2(hz / baseFrequency);\n", "type WorkletProcessorConstructor = new (options: Record<string, unknown>) => AudioWorkletProcessor\n\nexport type WorkletGlobals = {\n sampleRate: number\n currentFrame: number\n currentTime: number\n AudioWorkletProcessor: typeof AudioWorkletProcessor\n registerProcessor: (name: string, ctor: WorkletProcessorConstructor) => void\n __registeredProcessors__: Record<string, WorkletProcessorConstructor>\n __workletPort__: MessagePort\n}\n\nconst globals = globalThis as unknown as WorkletGlobals\n\nexport class AudioWorkletProcessor {\n readonly port: MessagePort\n constructor() { this.port = globals.__workletPort__ }\n process(_inputs: Float32Array[][], _outputs: Float32Array[][]): boolean { return false }\n}\n\nexport const setupWorkletGlobals = (config: { sampleRate: number }): void => {\n globals.sampleRate = config.sampleRate\n globals.currentFrame = 0\n globals.currentTime = 0\n globals.AudioWorkletProcessor = AudioWorkletProcessor\n globals.registerProcessor = (name: string, ctor: WorkletProcessorConstructor) => {\n globals.__registeredProcessors__ = globals.__registeredProcessors__ || {}\n globals.__registeredProcessors__[name] = ctor\n }\n}\n\nexport const updateFrameTime = (frame: number, sampleRate: number): void => {\n globals.currentFrame = frame\n globals.currentTime = frame / sampleRate\n}", "import {Arrays, int, isDefined, Option, TimeSpan} from \"@opendaw/lib-std\"\nimport {Communicator, Messenger, Wait} from \"@opendaw/lib-runtime\"\nimport {dbToGain, RenderQuantum} from \"@opendaw/lib-dsp\"\nimport {OfflineEngineInitializeConfig, OfflineEngineProtocol, OfflineEngineRenderConfig} from \"@opendaw/studio-adapters\"\nimport {AudioWorkletProcessor, setupWorkletGlobals, updateFrameTime, WorkletGlobals} from \"./worklet-env\"\n\nconst globals = globalThis as unknown as WorkletGlobals\n\ntype EngineState = {\n readonly processor: AudioWorkletProcessor\n readonly progressPort: MessagePort\n readonly sampleRate: int\n readonly numberOfChannels: int\n totalFrames: int\n running: boolean\n}\n\nlet state: Option<EngineState> = Option.None\n\nCommunicator.executor<OfflineEngineProtocol>(\n Messenger.for(self).channel(\"offline-engine\"), {\n async initialize(enginePort: MessagePort, progressPort: MessagePort, config: OfflineEngineInitializeConfig) {\n setupWorkletGlobals({sampleRate: config.sampleRate})\n globals.__workletPort__ = enginePort\n await import(config.processorsUrl)\n const ProcessorClass = globals.__registeredProcessors__[\"engine-processor\"]\n state = Option.wrap({\n processor: new ProcessorClass({\n processorOptions: {\n syncStreamBuffer: config.syncStreamBuffer,\n controlFlagsBuffer: config.controlFlagsBuffer,\n hrClockBuffer: new SharedArrayBuffer(32),\n project: config.project,\n exportConfiguration: config.exportConfiguration\n }\n }),\n progressPort,\n sampleRate: config.sampleRate,\n numberOfChannels: config.numberOfChannels,\n totalFrames: 0,\n running: false\n })\n },\n async step(numSamples: int): Promise<Float32Array[]> {\n const engine = state.unwrap()\n const result: Float32Array[] = Arrays.create(() => new Float32Array(numSamples), engine.numberOfChannels)\n const outputChannels: Float32Array[] = Arrays.create(() => new Float32Array(RenderQuantum), engine.numberOfChannels)\n let offset = 0 | 0\n while (offset < numSamples) {\n const outputs: Float32Array[][] = [outputChannels]\n updateFrameTime(engine.totalFrames, engine.sampleRate)\n engine.processor.process([[]], outputs)\n engine.totalFrames += RenderQuantum\n const needed = numSamples - offset\n const toCopy = Math.min(needed, RenderQuantum)\n for (let ch = 0; ch < engine.numberOfChannels; ch++) {\n result[ch].set(outputs[0][ch].subarray(0, toCopy), offset)\n }\n offset += toCopy\n }\n return result\n },\n async render(config: OfflineEngineRenderConfig) {\n const engine = state.unwrap()\n const {silenceThresholdDb, silenceDurationSeconds, maxDurationSeconds} = config\n const threshold = dbToGain(silenceThresholdDb ?? -72.0)\n const silenceFramesNeeded = Math.ceil((silenceDurationSeconds ?? 10) * engine.sampleRate)\n const maxFrames = isDefined(maxDurationSeconds) ? Math.ceil(maxDurationSeconds * engine.sampleRate) : Infinity\n const chunks: Float32Array[][] = Arrays.create(() => [], engine.numberOfChannels)\n let consecutiveSilentFrames = 0\n let hasHadAudio = false\n let lastYield = 0\n engine.running = true\n await Wait.timeSpan(TimeSpan.seconds(0))\n while (engine.running && engine.totalFrames < maxFrames) {\n const outputChannels: Float32Array[] = Arrays.create(() => new Float32Array(RenderQuantum), engine.numberOfChannels)\n const outputs: Float32Array[][] = [outputChannels]\n updateFrameTime(engine.totalFrames, engine.sampleRate)\n const keepRunning = engine.processor.process([[]], outputs)\n let maxSample = 0\n for (const channel of outputs[0]) {\n for (const sample of channel) {\n const absoluteValue = Math.abs(sample)\n if (absoluteValue > maxSample) {maxSample = absoluteValue}\n }\n }\n const isSilent = maxSample <= threshold\n if (maxSample > threshold) {hasHadAudio = true}\n if (isSilent && hasHadAudio) {\n consecutiveSilentFrames += RenderQuantum\n if (consecutiveSilentFrames >= silenceFramesNeeded) {break}\n } else {\n consecutiveSilentFrames = 0\n }\n for (let ch = 0; ch < engine.numberOfChannels; ch++) {\n chunks[ch].push(outputs[0][ch].slice())\n }\n engine.totalFrames += RenderQuantum\n if (!keepRunning) {break}\n if (engine.totalFrames - lastYield >= engine.sampleRate) {\n lastYield = engine.totalFrames\n engine.progressPort.postMessage({frames: engine.totalFrames})\n await new Promise(resolve => setTimeout(resolve, 0))\n }\n }\n const framesToKeep = engine.totalFrames - consecutiveSilentFrames + Math.min(engine.sampleRate / 4, consecutiveSilentFrames)\n return Arrays.create(channelIndex => {\n const total = new Float32Array(framesToKeep)\n let offset = 0\n for (const chunk of chunks[channelIndex]) {\n if (offset >= framesToKeep) {break}\n const toCopy = Math.min(chunk.length, framesToKeep - offset)\n total.set(chunk.subarray(0, toCopy), offset)\n offset += toCopy\n }\n return total\n }, engine.numberOfChannels)\n },\n stop() { state.unwrap().running = false }\n }\n)\n"],
|
|
5
5
|
"mappings": "AAEO,IAAMA,EAAaC,GAAiCA,GAAU,KAO9D,IAAMC,EAAY,CAACC,EAAOC,EAAO,qBAAuBD,GAAwCE,EAAMC,EAAaF,CAAI,CAAC,EAiBxH,IAAMG,EAAgBC,GAAUA,aAAiB,SAAWA,EAAM,EAAIA,EAoBtE,IAAMC,EAAaC,GAAU,CAAE,MAAM,IAAI,MAAM,aAAaA,CAAK,EAAE,CAAG,EAChEC,EAASC,GAAU,CAC5B,MAAM,OAAOA,GAAU,SAAW,IAAI,MAAMA,CAAK,EAAIA,CACzD,EACaC,EAAS,CAACC,EAAWC,IAASD,EAAY,OAAYH,EAAMK,EAAaD,CAAI,CAAC,EAEpF,IAAME,EAAwBC,GAAgB,IAAI,MAAM,CAAC,EAAG,CAAE,KAAM,CAAE,OAAOC,EAAMD,CAAW,CAAG,CAAE,CAAC,EAmBpG,IAAME,EAAN,KAAoB,CACvB,MACA,OAAS,UACT,YAAYC,EAAO,CACf,KAAK,MAAQA,CACjB,CACA,MAAQC,EAAqB,oCAAoC,CACrE,EACaC,EAAN,KAAoB,CACvB,MACA,OAAS,UACT,YAAYC,EAAO,CACf,KAAK,MAAQA,CACjB,CACA,MAAQF,EAAqB,iCAAiC,CAClE,EACaG,EAAYC,GAAc,CACnC,GAAI,CACA,OAAO,IAAIN,EAAcM,EAAU,CAAC,CACxC,OACOF,EAAO,CACV,OAAO,IAAID,EAAcC,CAAK,CAClC,CACJ,EAYO,IAAMG,EAAY,IAAM,CAAE,ECzG1B,IAAIC,GACV,SAAUA,EAAS,CAChBA,EAAQA,EAAQ,UAAe,CAAC,EAAI,YACpCA,EAAQA,EAAQ,WAAgB,EAAE,EAAI,YAC1C,GAAGA,IAAYA,EAAU,CAAC,EAAE,EACrB,IAAMC,EAAN,KAAa,CAChB,MAAOC,GAAS,OAAO,OAAO,IAAI,MAAM,CAAC,CAAC,EAC1C,OAAO,MAAQ,IAAa,KAAKA,GACjC,OAAO,MAASC,GAAU,CAAEA,EAAM,OAAS,CAAG,EAC9C,OAAO,QAAU,CAACA,EAAOC,IAAc,CACnCD,EAAM,OAAS,EACfA,EAAM,KAAK,GAAGC,CAAS,CAC3B,EACA,OAAO,QAAU,CAACD,EAAOE,IAAc,CACnC,QAASC,EAAQ,EAAGA,EAAQH,EAAM,QAC1BE,EAAUF,EAAMG,CAAK,CAAC,EACtBH,EAAM,OAAOG,EAAO,CAAC,EAGrBA,GAGZ,EACA,OAAO,UAAaH,GAAUA,EAAM,GAAG,CAAC,GAAK,KAC7C,OAAO,SAAYA,GAAUA,EAAM,GAAG,EAAE,GAAK,KAC7C,OAAO,SAAW,CAACA,EAAOI,IAASC,EAAUL,EAAM,GAAG,CAAC,EAAGI,CAAI,EAC9D,OAAO,QAAU,CAACJ,EAAOI,IAASC,EAAUL,EAAM,GAAG,EAAE,EAAGI,CAAI,EAC9D,OAAO,QAAU,CAACJ,EAAOM,IAAY,CACjC,IAAMH,EAAQH,EAAM,QAAQM,CAAO,EACnC,OAAIH,IAAU,GACHI,EAAM,GAAGD,CAAO,iBAAiBN,CAAK,EAAE,EAE5CK,EAAUL,EAAM,IAAIG,EAAQ,GAAKH,EAAM,MAAM,EAAG,gBAAgB,CAC3E,EACA,OAAO,QAAU,CAACA,EAAOM,IAAY,CACjC,IAAMH,EAAQH,EAAM,QAAQM,CAAO,EACnC,OAAIH,IAAU,GACHI,EAAM,GAAGD,CAAO,iBAAiBN,CAAK,EAAE,EAE5CK,EAAUL,EAAM,IAAIG,EAAQ,GAAKH,EAAM,MAAM,EAAG,gBAAgB,CAC3E,EACA,OAAO,WAAa,CAACA,EAAOI,IAASC,EAAUL,EAAM,IAAI,EAAGI,CAAI,EAChE,OAAO,OAAS,CAACI,EAASC,IAAM,CAC5B,IAAMT,EAAQ,IAAI,MAAMS,CAAC,EACzB,QAASC,EAAI,EAAGA,EAAID,EAAGC,IACnBV,EAAMU,CAAC,EAAIF,EAAQE,CAAC,EAExB,OAAOV,CACX,EACA,OAAO,OAAS,CAACW,EAAGC,IAAM,CACtB,GAAID,EAAE,SAAWC,EAAE,OACf,MAAO,GAEX,QAASF,EAAI,EAAGA,EAAIC,EAAE,OAAQD,IAC1B,GAAIC,EAAED,CAAC,IAAME,EAAEF,CAAC,EACZ,MAAO,GAGf,MAAO,EACX,EASA,OAAO,QAAU,CAACV,EAAOa,IAAc,CACnC,GAAIb,EAAM,OAAS,EACf,MAAO,GAEX,IAAMc,EAAQd,EAAM,CAAC,EACrB,QAASU,EAAI,EAAGA,EAAIV,EAAM,OAAQU,IAC9B,GAAI,CAACG,EAAUC,EAAOd,EAAMU,CAAC,CAAC,EAC1B,MAAO,GAGf,MAAO,EACX,EACA,OAAO,OAAS,CAACV,EAAOM,IAAY,CAChC,IAAMH,EAAQH,EAAM,QAAQM,CAAO,EACnC,GAAIH,IAAU,GACV,OAAOI,EAAM,GAAGD,CAAO,iBAAiBN,CAAK,EAAE,EAEnDA,EAAM,OAAOG,EAAO,CAAC,CACzB,EACA,OAAO,SAAW,CAACH,EAAOa,IAAc,CACpC,QAASH,EAAIV,EAAM,OAAS,EAAGU,GAAK,EAAGA,IAC/BG,EAAUb,EAAMU,CAAC,CAAC,GAClBV,EAAM,OAAOU,EAAG,CAAC,CAG7B,EACA,OAAO,UAAY,CAACV,EAAOM,IAAY,CACnC,IAAMH,EAAQH,EAAM,QAAQM,CAAO,EACnC,OAAIH,IAAU,GACH,IAEXH,EAAM,OAAOG,EAAO,CAAC,EACd,GACX,EACA,OAAO,cAAiBH,GAAU,IAAI,IAAIA,CAAK,EAAE,KAAOA,EAAM,OAC9D,OAAO,iBAAoBA,GAAU,CACjC,IAAIG,EAAQ,EACNY,EAAS,IAAI,IACnB,QAAWT,KAAWN,EACbe,EAAO,IAAIT,CAAO,IACnBS,EAAO,IAAIT,CAAO,EAClBN,EAAMG,GAAO,EAAIG,GAGzB,OAAAN,EAAM,OAASG,EACRH,CACX,EACA,OAAO,oBAAsB,CAACA,EAAOgB,IAAQ,CACzC,IAAIb,EAAQ,EACNc,EAAO,IAAI,IACjB,QAAWX,KAAWN,EAAO,CACzB,IAAMkB,EAAQZ,EAAQU,CAAG,EACpBC,EAAK,IAAIC,CAAK,IACfD,EAAK,IAAIC,CAAK,EACdlB,EAAMG,GAAO,EAAIG,EAEzB,CACA,OAAAN,EAAM,OAASG,EACRH,CACX,EACA,OAAO,SAASA,EAAOmB,EAAcC,EAAW,CAC5C,OAAOpB,EAAM,OAAOqB,GAAQ,CAACF,EAAa,KAAKG,GAAeF,EAAUC,EAAMC,CAAW,CAAC,CAAC,CAC/F,CACA,OAAO,UAAUtB,EAAOuB,EAAOH,EAAW,CACtC,OAAOpB,EAAM,OAAOqB,GAAQE,EAAM,KAAKC,GAAeJ,EAAUC,EAAMG,CAAW,CAAC,CAAC,CACvF,CACA,OAAO,MAAMC,EAAWC,EAAgBN,EAAW,CAC/C,MAAO,CAAC,GAAIK,EACH,OAAOE,GAAY,CAACD,EACpB,KAAKE,GAAaR,EAAUO,EAAUC,CAAS,CAAC,CAAC,EAAI,GAAGF,CAAc,CACnF,CACA,OAAQ,QAAQ1B,EAAO,CACnB,QAASU,EAAI,EAAGA,EAAIV,EAAM,OAAQU,IAC9B,MAAMV,EAAMU,CAAC,CAErB,CACA,OAAQ,eAAeV,EAAO,CAC1B,QAASU,EAAIV,EAAM,OAAS,EAAGU,GAAK,EAAGA,IACnC,MAAMV,EAAMU,CAAC,CAErB,CACA,OAAQ,iBAAiBV,EAAO,CAC5B,IAAM6B,EAAW7B,EAAM,OAAS,EAChC,QAASU,EAAI,EAAGA,GAAKmB,EAAUnB,IAC3B,KAAM,CAAE,MAAOV,EAAMU,CAAC,EAAG,QAASA,IAAM,EAAG,OAAQA,IAAMmB,CAAS,CAE1E,CACA,OAAQ,gBAAgB7B,EAAO,CAC3B,GAAI,EAAAA,EAAM,QAAU,GAGpB,QAASU,EAAI,EAAGoB,EAAO9B,EAAM,CAAC,EAAGU,EAAIV,EAAM,OAAQU,IAAK,CACpD,IAAMqB,EAAQ/B,EAAMU,CAAC,EACrB,KAAM,CAACoB,EAAMC,CAAK,EAClBD,EAAOC,CACX,CACJ,CACA,OAAO,SAAS/B,EAAOgC,EAAUnC,EAAQ,UAAW,CAChD,GAAIG,EAAM,OAAS,EACf,MAAO,GAEX,IAAIiC,EAAOjC,EAAM,CAAC,EAClB,QAASU,EAAI,EAAGA,EAAIV,EAAM,OAAQU,IAAK,CACnC,IAAMwB,EAAOlC,EAAMU,CAAC,EACpB,GAAI,KAAK,KAAKuB,EAAOC,CAAI,IAAMF,EAC3B,MAAO,GAEXC,EAAOC,CACX,CACA,MAAO,EACX,CACA,OAAO,SAASlC,EAAOmC,EAAO,CAC1B,OAAOnC,EAAM,OAAO,CAACoC,EAAQlB,KACzBkB,EAAOD,EAAMjB,CAAK,CAAC,EAAIA,EAChBkB,GACR,CAAC,CAAC,CACT,CACA,OAAO,mBAAmBzB,EAAGC,EAAG,CAC5B,IAAMG,EAAS,IAAI,YAAYJ,EAAE,WAAaC,EAAE,UAAU,EACpDyB,EAAO,IAAI,WAAWtB,CAAM,EAClC,OAAAsB,EAAK,IAAI,IAAI,WAAW1B,CAAC,EAAG,CAAC,EAC7B0B,EAAK,IAAI,IAAI,WAAWzB,CAAC,EAAGD,EAAE,UAAU,EACjCI,CACX,CACJ,EChMO,IAAIuB,GACV,SAAUA,EAAQ,CACfA,EAAO,KAAQC,GAAUC,EAAUD,CAAK,EAAI,IAAIE,EAAKF,CAAK,EAAID,EAAO,KACrEA,EAAO,KAAQI,GAAaJ,EAAO,KAAKI,EAAS,CAAC,EAClDJ,EAAO,SAAYI,GAAa,CAC5B,GAAI,CACA,OAAOJ,EAAO,KAAKI,EAAS,CAAC,CACjC,MACe,CACX,OAAOJ,EAAO,IAClB,CACJ,EACAA,EAAO,QAAU,CAACK,KAASC,IAASN,EAAO,KAAKK,GAAM,MAAM,KAAMC,CAAI,CAAC,EACvEN,EAAO,MAASO,GAAYA,EAAQ,KAAKN,GAASD,EAAO,KAAKC,CAAK,EAAG,IAAMD,EAAO,IAAI,EACvF,MAAMG,CAAK,CACPK,GACA,YAAYP,EAAO,CAAE,KAAKO,GAASC,EAAUR,CAAK,CAAG,CACrD,QAAS,CAAE,OAAO,KAAKO,EAAQ,CAC/B,aAAaE,EAAG,CAAE,OAAO,KAAKF,EAAQ,CACtC,cAAe,CAAE,OAAO,KAAKA,EAAQ,CACrC,mBAAoB,CAAE,OAAO,KAAKA,EAAQ,CAC1C,SAASP,EAAO,CAAE,OAAOA,IAAU,KAAKO,EAAQ,CAChD,MAAMG,EAAW,CAAE,OAAOA,EAAU,KAAK,KAAKH,EAAM,CAAG,CACvD,OAAOI,EAAK,CAAE,OAAOA,EAAI,KAAKJ,EAAM,CAAG,CACvC,SAASK,EAAO,CAAoB,CACpC,SAAU,CAAE,MAAO,EAAO,CAC1B,UAAW,CAAE,MAAO,EAAM,CAC1B,IAAIC,EAAU,CAAE,OAAOd,EAAO,KAAKc,EAAS,KAAKN,EAAM,CAAC,CAAG,CAC3D,MAAMH,EAAMU,EAAK,CAAE,OAAOV,EAAK,KAAKG,EAAM,CAAG,CAC7C,QAAQM,EAAU,CAAE,OAAOA,EAAS,KAAKN,EAAM,CAAG,CAClD,OAAOQ,EAAO,CAAE,OAAO,KAAK,aAAa,IAAMA,EAAM,aAAa,CAAG,CACrE,OAAOC,EAAO,CAAE,OAAO,IAAM,CAC7B,UAAW,CAAE,MAAO,gBAAgB,KAAKT,EAAM,IAAM,CACrD,IAAK,OAAO,WAAW,GAAI,CAAE,OAAO,KAAK,SAAS,CAAG,CACzD,CACAR,EAAO,KAAOG,EACdH,EAAO,KAAO,IAAI,KAAM,CACpB,OAAUkB,GAASC,EAAMjB,EAAUgB,CAAI,EAAIE,EAAaF,CAAI,EAAI,eAAe,EAC/E,aAAgBjB,GAAUmB,EAAanB,CAAK,EAC5C,aAAe,IAAM,KACrB,kBAAoB,IAAG,GACvB,SAAYS,GAAM,GAClB,MAASC,GAAcA,EAAU,KAAK,EACtC,OAAUD,GAAM,CAAE,EAClB,SAAYW,GAASA,EAAK,MAAS,EACnC,QAAU,IAAM,GAChB,SAAW,IAAM,GACjB,IAAOX,GAAMV,EAAO,KACpB,MAAQ,CAACU,EAAGY,IAAOF,EAAaE,CAAE,EAClC,QAAWZ,GAAMV,EAAO,KACxB,OAAUgB,GAAUA,EAAM,QAAQ,EAClC,OAAUE,GAASC,EAAMC,EAAaF,CAAI,GAAK,eAAe,EAC9D,SAAW,IAAM,gBACjB,IAAK,OAAO,WAAW,GAAI,CAAE,OAAO,KAAK,SAAS,CAAG,CACzD,CACJ,GAAGlB,IAAWA,EAAS,CAAC,EAAE,ECvDnB,IAAMuB,EAAN,KAAgB,CACnB,OAAQ,OAAQ,CAAE,CAClB,OAAO,IAAIC,EAAO,CAAE,MAAO,CAACA,CAAK,CAAG,CACpC,OAAO,MAAMC,EAAU,CACnB,IAAIC,EAAQ,EACZ,QAAWC,KAAKF,EACZC,IAEJ,OAAOA,CACX,CACA,OAAO,KAAKD,EAAUG,EAAW,CAC7B,QAAWJ,KAASC,EAChB,GAAIG,EAAUJ,CAAK,EACf,MAAO,GAGf,MAAO,EACX,CACA,OAAO,MAAMC,EAAUG,EAAW,CAC9B,QAAWJ,KAASC,EAChB,GAAI,CAACG,EAAUJ,CAAK,EAChB,MAAO,GAGf,MAAO,EACX,CACA,OAAO,OAAOC,EAAUI,EAAUC,EAAc,CAC5C,IAAIC,EAAcD,EACdE,EAAQ,EACZ,QAAWR,KAASC,EAChBM,EAAcF,EAASE,EAAaP,EAAOQ,GAAO,EAEtD,OAAOD,CACX,CACA,OAAO,SAASN,EAAUQ,EAAS,CAC/B,QAAWT,KAASC,EAChB,GAAID,IAAUS,EACV,MAAO,GAGf,MAAO,EACX,CACA,OAAO,QAAQR,EAAUS,EAAW,CAChC,QAAWV,KAASC,EAChBS,EAAUV,CAAK,CAEvB,CACA,OAAQ,IAAIC,EAAUU,EAAK,CACvB,IAAIT,EAAQ,EACZ,QAAWF,KAASC,EAChB,MAAMU,EAAIX,EAAOE,GAAO,CAEhC,CACA,OAAQ,KAAKU,EAAUV,EAAO,CAC1B,IAAIW,EAAI,EACR,QAAWb,KAASY,EAAU,CAC1B,GAAIC,KAAOX,EACP,OAEJ,MAAMF,CACV,CACJ,CACA,OAAO,OAAOC,EAAUa,EAAI,CACxB,IAAMC,EAAS,CAAC,EAChB,QAAWf,KAASC,EACZa,EAAGd,CAAK,GACRe,EAAO,KAAKf,CAAK,EAGzB,OAAOe,CACX,CACA,OAAO,UAAUd,EAAUa,EAAI,CAC3B,IAAMC,EAAS,CAAC,EAChB,QAAWf,KAASC,EAAU,CAC1B,IAAMe,EAASF,EAAGd,CAAK,EACnBiB,EAAUD,CAAM,GAChBD,EAAO,KAAKC,CAAM,CAE1B,CACA,OAAOD,CACX,CACA,OAAO,QAAQd,EAAU,CACrB,IAAMc,EAAS,CAAC,EAChB,QAAWf,KAASC,EAChBc,EAAO,KAAKf,CAAK,EAErB,OAAOe,EAAO,QAAQ,CAC1B,CACA,OAAQ,SAASd,EAAU,CACvB,IAAMW,EAAWX,EAAS,OAAO,QAAQ,EAAE,EACrC,CAAE,KAAAiB,EAAM,MAAAlB,CAAM,EAAIY,EAAS,KAAK,EAClCO,EAAOnB,EACX,GAAIkB,IAAS,GAGb,OAAa,CACT,GAAM,CAAE,KAAAA,EAAM,MAAAlB,CAAM,EAAIY,EAAS,KAAK,EACtC,GAAIM,IAAS,GAAM,CACf,KAAM,CAACC,EAAM,IAAI,EACjB,MACJ,CACA,KAAM,CAACA,EAAMnB,CAAK,EAClBmB,EAAOnB,CACX,CACJ,CACJ,ECxGO,IAAMoB,EAAa,OAAO,OAAO,CACpC,MAAO,CAAE,UAAWC,CAAU,EAC9B,OAASC,IAAU,CAAE,UAAWA,CAAK,GACrC,KAAM,IAAIC,KAAiB,CAAE,UAAW,IAAM,CAAE,KAAOA,EAAY,OAAS,GACpEA,EAAY,IAAI,EAAE,UAAU,CAC9B,CAAE,EACZ,CAAC,ECPM,IAAMC,EAAN,KAAe,CAClB,OAAO,cAAcC,KAAaC,EAAa,CAC3C,OAAOC,EAAW,KAAK,GAAGD,EACrB,IAAIE,GAAcA,EAAW,UAAU,IAAMH,EAASG,CAAU,CAAC,CAAC,CAAC,CAC5E,CACAC,GAAa,IAAI,IACjB,UAAUJ,EAAU,CAChB,YAAKI,GAAW,IAAIJ,CAAQ,EACrB,CAAE,UAAW,IAAM,KAAKI,GAAW,OAAOJ,CAAQ,CAAE,CAC/D,CACA,SAAU,CAAE,OAAO,KAAKI,GAAW,OAAS,CAAG,CAC/C,OAAOC,EAAO,CAAE,KAAKD,GAAW,QAASJ,GAAaA,EAASK,CAAK,CAAC,CAAG,CACxE,WAAY,CAAE,OAAO,KAAKD,EAAY,CACtC,WAAY,CAAE,KAAKA,GAAW,MAAM,CAAG,CAC3C,ECdO,IAAME,EAAN,MAAMC,CAAS,CAClB,OAAO,gBAAkB,IAAM,CAC3B,IAAMC,EAAY,YAAY,IAAI,EAC9BC,EAASF,EAAS,OAAO,OAAO,iBAAiB,EACjDG,EAAU,EACd,OAAQC,GAAa,CACjB,GAAIA,IAAa,EACb,OAAOJ,EAAS,kBAEpB,GAAII,GAAY,EACZ,OAAOJ,EAAS,OAAO,CAAC,EAE5B,IAAMK,EAAc,YAAY,IAAI,EAAIJ,EACxC,OAAII,EAAcF,EAAU,MACxBD,EAASF,EAAS,OAAOK,EAAcD,EAAWC,CAAW,EAC7DF,KAEGD,CACX,CACJ,EACA,OAAO,kBAAoB,IAAIF,EAAS,OAAO,iBAAiB,EAChE,OAAO,OAAUM,GAAU,IAAIN,EAASM,CAAK,EAC7C,OAAO,QAAWA,GAAU,IAAIN,EAASM,EAAQN,EAASO,EAAyB,EACnF,OAAO,QAAWD,GAAU,IAAIN,EAASM,EAAQN,EAASQ,EAAyB,EACnF,OAAO,MAASF,GAAU,IAAIN,EAASM,EAAQN,EAASS,EAAuB,EAC/E,OAAO,KAAQH,GAAU,IAAIN,EAASM,EAAQN,EAASU,EAAsB,EAC7E,OAAO,SAAYP,KAAcA,EAAU,KAAO,GAAK,KAAK,SAAS,EAAE,MAAM,CAAC,EAAI,MAC3EA,EAAU,GAAK,GAAK,GAAM,KAAK,SAAS,EAAE,MAAM,CAAC,EAAI,KACtDA,EAAU,GAAM,KAAK,SAAS,EAAE,MAAM,CAAC,EAC7C,MAAOI,GAA4B,IACnC,MAAOC,GAA4B,IACnC,MAAOC,GAA0B,KACjC,MAAOC,GAAyB,MAChCC,GACA,YAAYC,EAAI,CAAE,KAAKD,GAAMC,CAAI,CACjC,QAAS,CAAE,OAAO,KAAKD,EAAK,CAC5B,YAAa,CAAE,OAAO,KAAK,IAAI,KAAKA,EAAG,EAAIX,EAASO,EAA2B,CAC/E,YAAa,CAAE,OAAO,KAAK,IAAI,KAAKI,EAAG,EAAIX,EAASQ,EAA2B,CAC/E,UAAW,CAAE,OAAO,KAAK,IAAI,KAAKG,EAAG,EAAIX,EAASS,EAAyB,CAC3E,SAAU,CAAE,OAAO,KAAK,IAAI,KAAKE,EAAG,EAAIX,EAASU,EAAwB,CACzE,OAAQ,CACJ,MAAO,CACH,EAAG,KAAK,MAAM,KAAK,QAAQ,CAAC,EAC5B,EAAG,KAAK,MAAM,KAAK,SAAS,CAAC,EAAI,GACjC,EAAG,KAAK,MAAM,KAAK,WAAW,CAAC,EAAI,GACnC,EAAG,KAAK,MAAM,KAAK,WAAW,CAAC,EAAI,EACvC,CACJ,CACA,OAAQ,CAAE,OAAO,KAAKC,KAAQ,CAAK,CACnC,QAAS,CAAE,OAAO,KAAKA,GAAM,CAAK,CAClC,UAAW,CAAE,OAAO,KAAKA,GAAM,CAAK,CACpC,cAAe,CACX,IAAIL,EAAOO,EACLV,EAAU,KAAK,MAAM,KAAK,IAAI,KAAKQ,EAAG,EAAI,GAAI,EAC9CG,EAAU,KAAK,MAAMX,EAAU,EAAE,EACjCY,EAAQ,KAAK,MAAMD,EAAU,EAAE,EAC/BE,EAAO,KAAK,MAAMD,EAAQ,EAAE,EAClC,OAAIZ,EAAU,IACVG,EAAQH,EACRU,EAAO,UAEFC,EAAU,IACfR,EAAQQ,EACRD,EAAO,UAEFE,EAAQ,IACbT,EAAQS,EACRF,EAAO,SAGPP,EAAQU,EACRH,EAAO,OAEJ,IAAI,KAAK,mBAAmB,KAAM,CAAE,QAAS,OAAQ,MAAO,MAAO,CAAC,EACtE,OAAOP,EAAQ,KAAK,KAAK,KAAKK,EAAG,EAAGE,CAAI,CACjD,CACA,UAAW,CACP,GAAI,MAAM,KAAKF,EAAG,EACd,MAAO,MAEX,GAAI,CAAC,SAAS,KAAKA,EAAG,EAClB,MAAO,SAEX,GAAM,CAAE,EAAAM,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,CAAE,EAAI,KAAK,MAAM,EAClC,OAAIH,EAAI,EACG,CACHjB,EAASqB,GAAU,IAAKJ,CAAC,EAAGjB,EAASqB,GAAU,IAAKH,CAAC,EACrDlB,EAASqB,GAAU,IAAKF,CAAC,EAAGnB,EAASqB,GAAU,IAAKD,CAAC,CACzD,EACK,KAAK,IAAI,EAETF,EAAI,EACF,CACHlB,EAASqB,GAAU,IAAKH,CAAC,EAAGlB,EAASqB,GAAU,IAAKF,CAAC,EACrDnB,EAASqB,GAAU,IAAKD,CAAC,CAC7B,EACK,KAAK,IAAI,EAETD,EAAI,EACF,CAACnB,EAASqB,GAAU,IAAKF,CAAC,EAAGnB,EAASqB,GAAU,IAAKD,CAAC,CAAC,EACzD,KAAK,IAAI,EAETA,EAAI,EACFpB,EAASqB,GAAU,IAAKD,CAAC,EAGzB,KAEf,CACA,MAAOC,GAAY,CAACC,EAAMC,IAAU,CAChC,OAAQD,EAAM,CACV,IAAK,IACD,MAAO,GAAGC,CAAK,IAAIA,EAAQ,EAAI,MAAQ,MAAM,GACjD,IAAK,IACD,MAAO,GAAGA,CAAK,IAAIA,EAAQ,EAAI,OAAS,OAAO,GACnD,IAAK,IACD,MAAO,GAAGA,CAAK,IAAIA,EAAQ,EAAI,SAAW,SAAS,GACvD,IAAK,IACD,MAAO,GAAGA,CAAK,IAAIA,EAAQ,EAAI,SAAW,SAAS,GACvD,QACI,OAAOC,EAAUF,CAAI,CAC7B,CACJ,CACJ,ECpHO,IAAIG,GACV,SAAUA,EAAc,CACrB,MAAMC,CAAS,CACX,MACA,YAAYC,EAAO,CACf,KAAK,MAAQA,CACjB,CACJ,CACAF,EAAa,SAAWC,EACxBD,EAAa,iBAAoBE,GAAU,IAAID,EAASC,CAAK,EAC7DF,EAAa,OAAS,CAACG,EAAWC,IAASA,EAAK,IAAIC,EAAOF,CAAS,CAAC,EACrEH,EAAa,SAAW,CAACG,EAAWG,IAAa,IAAIC,EAASJ,EAAWG,CAAQ,EACjF,IAAME,EAAwBC,GAAS,CACnC,IAAMC,EAAgB,CAAC,EACvB,QAAWC,KAAOF,EACVE,aAAeV,EACfS,EAAc,KAAKC,EAAI,KAAK,GAEvBA,aAAe,aAGf,OAAO,YAAgB,KAAeA,aAAe,aAGrD,OAAO,gBAAoB,KAAeA,aAAe,kBAC9DD,EAAc,KAAKC,CAAG,EAG9B,OAAOD,CACX,EACME,EAAaD,GAAQA,aAAeV,EAAWU,EAAI,MAAQA,EACjE,MAAMN,CAAO,CACTQ,GACAC,GAAY,IAAI,IAChBC,GACAC,GAAY,EACZ,YAAYb,EAAW,CACnB,KAAKU,GAAaV,EAClB,KAAKY,GAAgBZ,EAAU,UAAU,KAAKc,EAAe,CACjE,CACA,WAAY,CAAE,KAAKF,GAAc,UAAU,CAAG,CAC9C,kBAAoB,CAACG,KAAST,IAAS,CACnC,IAAMC,EAAgBF,EAAqBC,CAAI,EAC/C,KAAKI,GAAW,KAAK,CACjB,KAAM,OACN,SAAU,GACV,KAAMK,EAAK,KACX,KAAM,MAAM,KAAKC,EAAU,IAAIV,EAAME,IAAQ,CAAE,MAAOC,EAAUD,CAAG,CAAE,EAAE,CAAC,CAC5E,EAAGD,CAAa,CACpB,EACA,kBAAoB,CAACQ,KAAST,IAAS,IAAI,QAAQ,CAACW,EAASC,IAAW,CACpE,IAAMC,EAAUH,EAAU,OAAOV,EAAM,CAACc,EAAWZ,EAAKa,KAChD,OAAOb,GAAQ,YACfY,EAAU,KAAK,CAACC,EAAOb,CAAG,CAAC,EAExBY,GACR,CAAC,CAAC,EACL,KAAKT,GAAU,IAAI,KAAKE,GAAW,CAC/B,cAAe,CAAE,QAAAI,EAAS,OAAAC,CAAO,EACjC,UAAW,IAAI,IAAIC,CAAO,CAC9B,CAAC,EACD,IAAMZ,EAAgBF,EAAqBC,CAAI,EAC/C,KAAKI,GAAW,KAAK,CACjB,KAAM,OACN,SAAU,KAAKG,GACf,KAAME,EAAK,KACX,KAAM,MAAM,KAAKC,EAAU,IAAIV,EAAM,CAACE,EAAKa,IAAU,OAAOb,GAAQ,WAAc,CAAE,SAAUa,CAAM,EAAM,CAAE,MAAOZ,EAAUD,CAAG,CAAE,CAAE,CAAC,CACzI,EAAGD,CAAa,EAChB,KAAKM,IACT,CAAC,EACDC,GAAmBQ,GAAY,CAC3B,IAAMC,EAAU,KAAKZ,GAAU,IAAIW,EAAQ,QAAQ,EAC/CE,EAAUD,CAAO,EACbD,EAAQ,OAAS,WACjBC,EAAQ,cAAc,QAAQD,EAAQ,OAAO,EAC7C,KAAKX,GAAU,OAAOW,EAAQ,QAAQ,GAEjCA,EAAQ,OAAS,UACtBC,EAAQ,cAAc,OAAOD,EAAQ,MAAM,EAC3C,KAAKX,GAAU,OAAOW,EAAQ,QAAQ,GAEjCA,EAAQ,OAAS,YACtBC,EAAQ,WAAW,IAAID,EAAQ,MAAM,EAAE,MAAM,KAAMA,EAAQ,IAAI,EAInEG,EAAM,sCAAsC,KAAK,UAAUH,CAAO,CAAC,EAAE,CAE7E,CACJ,CACA,MAAMlB,CAAS,CACXM,GACAgB,GACAd,GACA,YAAYZ,EAAWG,EAAU,CAC7B,KAAKO,GAAaV,EAClB,KAAK0B,GAAYvB,EACjB,KAAKS,GAAgBZ,EAAU,UAAU,KAAKc,EAAe,CACjE,CACA,WAAY,CAAE,KAAKF,GAAc,UAAU,CAAG,CAC9CE,GAAmBQ,GAAY,CAC3BK,EAAOL,EAAQ,OAAS,OAAQ,IAAM,6BAA6B,EACnE,IAAMM,EAAS,OAAO,eAAe,KAAKF,EAAS,IAAM,OAAO,eAAe,CAAC,CAAC,EAC3E,KAAKA,GAAY,OAAO,eAAe,KAAKA,EAAS,EACrDX,EAAOc,EAAUD,EAAON,EAAQ,IAAI,EAAG,GAAGA,EAAQ,KAAK,SAAS,CAAC,uBAAuB,KAAKI,EAAS,EAAE,EACxGI,EAAWR,EAAQ,SACzB,GAAIQ,IAAa,GACbf,EAAK,MAAM,KAAKW,GAAWJ,EAAQ,KAAK,IAAKd,GAAQ,UAAWA,EAC1DA,EAAI,MAAQiB,EAAM,GAAGH,EAAQ,KAAK,SAAS,CAAC,kBAAkB,CAAC,CAAC,MAGtE,IAAI,CACgBP,EAAK,MAAM,KAAKW,GAAWJ,EAAQ,KAC9C,IAAId,GAAO,aAAcA,EAAM,IAAIF,IAAS,KAAKyB,GAAcD,EAAUtB,EAAI,SAAUF,CAAI,EAAIE,EAAI,KAAK,CAAC,EACtG,KAAKT,GAAS,CAClB,GAAI,CACA,KAAKiC,GAAaF,EAAU/B,CAAK,CACrC,OACOkC,EAAQ,CACX,KAAKC,GAAYJ,EAAUG,CAAM,CACrC,CACJ,EAAGA,GAAU,KAAKC,GAAYJ,EAAUG,CAAM,CAAC,CACnD,OACOA,EAAQ,CACX,KAAKC,GAAYJ,EAAUG,CAAM,CACrC,CAER,EACAD,GAAe,CAACF,EAAU/B,IAAU,KAAKW,GAAW,KAAK,CAAE,KAAM,UAAW,SAAAoB,EAAU,QAAS/B,CAAM,CAAC,EACtGmC,GAAc,CAACJ,EAAUG,IAAW,KAAKvB,GAAW,KAAK,CAAE,KAAM,SAAU,SAAAoB,EAAU,OAAQG,CAAO,CAAC,EACrGF,GAAgB,CAACD,EAAUf,EAAMT,IAAS,KAAKI,GAAW,KAAK,CAAE,KAAM,WAAY,SAAAoB,EAAU,OAAQf,EAAM,KAAAT,CAAK,CAAC,CACrH,CACAT,EAAa,SAAWO,CAC5B,GAAGP,IAAiBA,EAAe,CAAC,EAAE,EC5I/B,IAAMsC,EAAY,CAAE,IAAMC,GAAS,IAAIC,EAAgBD,CAAI,CAAE,EAC9DE,GAAqB,CAAC,EACtBD,EAAN,KAAsB,CAClBE,GACAC,GAAY,IAAIC,EAChB,YAAYL,EAAM,CAEd,GADA,KAAKG,GAAQH,EACTM,EAAUN,EAAK,SAAS,GAAKM,EAAUN,EAAK,cAAc,EAC1D,cAAQ,MAAMA,CAAI,EACZ,IAAI,MAAM,GAAGA,CAAI,sBAAsB,EAEjDA,EAAK,UAAaO,GAAU,KAAKH,GAAU,OAAOG,EAAM,IAAI,EAC5DP,EAAK,eAAkBO,GAAU,CAAE,MAAM,IAAI,MAAMA,EAAM,IAAI,CAAG,CACpE,CACA,KAAKC,EAASC,EAAU,CACpB,KAAKN,GAAM,YAAYK,EAASC,GAAYP,EAAkB,CAClE,CACA,QAAQQ,EAAM,CAAE,OAAO,IAAIC,EAAQ,KAAMD,CAAI,CAAG,CAChD,UAAUE,EAAU,CAAE,OAAO,KAAKR,GAAU,UAAUQ,CAAQ,CAAG,CACjE,WAAY,CACR,KAAKR,GAAU,UAAU,EACzB,KAAKD,GAAM,UAAY,KACvB,KAAKA,GAAM,eAAiB,IAChC,CACJ,EAEMQ,EAAN,MAAME,CAAQ,CACVC,GACAC,GACAX,GAAY,IAAIC,EAChBW,GACA,YAAYC,EAAUP,EAAM,CACxB,KAAKI,GAAYG,EACjB,KAAKF,GAAQL,EACb,KAAKM,GAAgBC,EAAS,UAAUC,GAAQ,CACxC,WAAYA,GAAQA,EAAK,SAAW,MAAQ,YAAaA,GAAQ,YAAaA,GAAQA,EAAK,UAAYR,GACvG,KAAKN,GAAU,OAAOc,EAAK,OAAO,CAE1C,CAAC,CACL,CACA,KAAKV,EAASW,EAAgB,CAC1B,KAAKL,GAAU,KAAK,CAAE,OAAQ,KAAM,QAAS,KAAKC,GAAO,QAAAP,CAAQ,EAAGW,CAAc,CACtF,CACA,QAAQT,EAAM,CAAE,OAAO,IAAIG,EAAQ,KAAMH,CAAI,CAAG,CAChD,UAAUE,EAAU,CAAE,OAAO,KAAKR,GAAU,UAAUQ,CAAQ,CAAG,CACjE,WAAY,CACR,KAAKI,GAAc,UAAU,EAC7B,KAAKZ,GAAU,UAAU,CAC7B,CACJ,ECjDO,IAAIgB,GACV,SAAUA,EAAM,CACbA,EAAK,MAAQ,IAAM,IAAI,QAAQC,GAAW,sBAAsB,IAAMA,EAAQ,CAAC,CAAC,EAChFD,EAAK,OAAUE,GAAc,IAAI,QAAQD,GAAW,CAChD,IAAIE,EAAQD,EACNE,EAAW,IAAM,CAAM,EAAED,GAAS,EACpCF,EAAQ,EAGR,sBAAsBG,CAAQ,CAChC,EACF,sBAAsBA,CAAQ,CAClC,CAAC,EACDJ,EAAK,SAAW,CAACK,KAASC,IAAS,IAAI,QAAQL,GAAW,WAAWA,EAASI,EAAK,OAAO,EAAG,GAAGC,CAAI,CAAC,EACrGN,EAAK,MAAQ,CAACO,EAAQC,IAAS,IAAI,QAAQP,GAAWM,EAAO,iBAAiBC,EAAMP,EAAS,CAAE,KAAM,EAAK,CAAC,CAAC,EAC5GD,EAAK,WAAcS,GAAe,IAAI,QAAQR,GAAW,CACrD,IAAMS,EAAaD,EAAW,UAAU,IAAM,CAC1CC,EAAW,UAAU,EACrBT,EAAQ,CACZ,CAAC,CACL,CAAC,EACDD,EAAK,SAAYW,GAAc,IAAI,QAAQ,CAACV,EAASW,IAAW,CAC5D,IAAMC,EAAW,YAAY,IAAM,CAC/B,GAAM,CAAE,OAAAC,EAAQ,MAAOC,EAAM,MAAAC,CAAM,EAAIC,EAAS,IAAMN,EAAU,KAAK,CAAC,EACtE,GAAIG,IAAW,UAAW,CACtB,GAAM,CAAE,KAAAI,EAAM,MAAAC,CAAM,EAAIJ,EACpBG,IACA,cAAcL,CAAQ,EACtBZ,EAAQkB,CAAK,EAErB,MAEI,cAAcN,CAAQ,EACtBD,EAAOI,CAAK,CAEpB,EAAG,CAAC,CACR,CAAC,CACL,GAAGhB,IAASA,EAAO,CAAC,EAAE,ECjCtB,IAAMoB,EAAgB,CAACC,EAAWC,IAAgB,KAAK,MAAM,KAAMA,CAAW,EAAID,EAC5EE,EAAU,CAACC,EAAMH,EAAY,EAAGC,EAAc,IAAM,CACtD,IAAMG,EAAcL,EAAc,EAAGE,CAAW,EAC1CI,EAAQ,KAAK,MAAMF,EAAOC,CAAW,EACrCE,EAAO,KAAK,MAAMD,EAAQL,CAAS,EAEnCO,GADkB,KAAK,MAAMJ,CAAI,EAAIJ,EAAcO,EAAON,EAAWC,CAAW,GACtDG,EAC1BI,EAAc,KAAK,MAAMD,EAAQ,GAAU,EAC3CE,EAAiBF,EAAQ,IAC/B,MAAO,CACH,KAAAD,EACA,MAAOD,EAAQC,EAAON,EACtB,YAAAQ,EACA,MAAOC,CACX,CACJ,EACMC,EAAkB,CAACC,EAASC,IAAQD,EAAUC,EAAM,GAAO,IAC3DC,EAAkB,CAACC,EAAQF,IAASE,EAAS,GAAO,IAAWF,EAC/DG,GAAe,CAACJ,EAASG,IAAYA,EAAS,GAAO,IAAWH,EAChEK,GAAkB,CAACC,EAASL,EAAKM,IAAeR,EAAgBO,EAAUC,EAAYN,CAAG,EACzFO,GAAkB,CAACL,EAAQF,EAAKM,IAAeL,EAAgBC,EAAQF,CAAG,EAAIM,EACvEE,EAAO,CAChB,SACA,YACA,eACA,cAAArB,EACA,QAAAG,EACA,gBAAAQ,EACA,gBAAAG,EACA,aAAAE,GACA,gBAAAC,GACA,gBAAAG,GACA,SAAU,CAACL,EAAQd,EAAY,EAAGC,EAAc,IAAM,CAClD,GAAM,CAAE,KAAAK,EAAM,MAAAD,EAAO,YAAAG,EAAa,MAAAD,CAAM,EAAIL,EAAQY,EAAS,EAAGd,EAAWC,CAAW,EACtF,MAAO,GAAGK,EAAO,CAAC,IAAID,EAAQ,CAAC,IAAIG,EAAc,CAAC,IAAID,CAAK,EAC/D,CACJ,ECxCO,IAAMc,EAAgB,IAChBC,GAAkBC,EAAK,cAAc,EAAG,EAAE,ECFvD,IAAMC,GAAQ,KAAK,IAAI,EAAI,EAAI,GAGxB,IAAMC,EAAYC,GAAO,KAAK,IAAIA,EAAKC,EAAK,ECSnD,IAAMC,EAAU,WAEHC,EAAN,KAA4B,CACtB,KACT,aAAc,CAAE,KAAK,KAAOD,EAAQ,eAAgB,CACpD,QAAQE,EAA2BC,EAAqC,CAAE,MAAO,EAAM,CAC3F,EAEaC,GAAuBC,GAAyC,CACzEL,EAAQ,WAAaK,EAAO,WAC5BL,EAAQ,aAAe,EACvBA,EAAQ,YAAc,EACtBA,EAAQ,sBAAwBC,EAChCD,EAAQ,kBAAoB,CAACM,EAAcC,IAAsC,CAC7EP,EAAQ,yBAA2BA,EAAQ,0BAA4B,CAAC,EACxEA,EAAQ,yBAAyBM,CAAI,EAAIC,CAC7C,CACJ,EAEaC,EAAkB,CAACC,EAAeC,IAA6B,CACxEV,EAAQ,aAAeS,EACvBT,EAAQ,YAAcS,EAAQC,CAClC,EC5BA,IAAMC,GAAU,WAWZC,EAA6BC,EAAO,KAExCC,EAAa,SACTC,EAAU,IAAI,IAAI,EAAE,QAAQ,gBAAgB,EAAG,CAC3C,MAAM,WAAWC,EAAyBC,EAA2BC,EAAuC,CACxGC,GAAoB,CAAC,WAAYD,EAAO,UAAU,CAAC,EACnDP,GAAQ,gBAAkBK,EAC1B,MAAM,OAAOE,EAAO,eACpB,IAAME,EAAiBT,GAAQ,yBAAyB,kBAAkB,EAC1EC,EAAQC,EAAO,KAAK,CAChB,UAAW,IAAIO,EAAe,CAC1B,iBAAkB,CACd,iBAAkBF,EAAO,iBACzB,mBAAoBA,EAAO,mBAC3B,cAAe,IAAI,kBAAkB,EAAE,EACvC,QAASA,EAAO,QAChB,oBAAqBA,EAAO,mBAChC,CACJ,CAAC,EACD,aAAAD,EACA,WAAYC,EAAO,WACnB,iBAAkBA,EAAO,iBACzB,YAAa,EACb,QAAS,EACb,CAAC,CACL,EACA,MAAM,KAAKG,EAA0C,CACjD,IAAMC,EAASV,EAAM,OAAO,EACtBW,EAAyBC,EAAO,OAAO,IAAM,IAAI,aAAaH,CAAU,EAAGC,EAAO,gBAAgB,EAClGG,EAAiCD,EAAO,OAAO,IAAM,IAAI,aAAaE,CAAa,EAAGJ,EAAO,gBAAgB,EAC/GK,EAAS,EACb,KAAOA,EAASN,GAAY,CACxB,IAAMO,EAA4B,CAACH,CAAc,EACjDI,EAAgBP,EAAO,YAAaA,EAAO,UAAU,EACrDA,EAAO,UAAU,QAAQ,CAAC,CAAC,CAAC,EAAGM,CAAO,EACtCN,EAAO,aAAeI,EACtB,IAAMI,EAAST,EAAaM,EACtBI,EAAS,KAAK,IAAID,EAAQJ,CAAa,EAC7C,QAASM,EAAK,EAAGA,EAAKV,EAAO,iBAAkBU,IAC3CT,EAAOS,CAAE,EAAE,IAAIJ,EAAQ,CAAC,EAAEI,CAAE,EAAE,SAAS,EAAGD,CAAM,EAAGJ,CAAM,EAE7DA,GAAUI,CACd,CACA,OAAOR,CACX,EACA,MAAM,OAAOL,EAAmC,CAC5C,IAAMI,EAASV,EAAM,OAAO,EACtB,CAAC,mBAAAqB,EAAoB,uBAAAC,EAAwB,mBAAAC,CAAkB,EAAIjB,EACnEkB,EAAYC,EAASJ,GAAsB,GAAK,EAChDK,EAAsB,KAAK,MAAMJ,GAA0B,IAAMZ,EAAO,UAAU,EAClFiB,EAAYC,EAAUL,CAAkB,EAAI,KAAK,KAAKA,EAAqBb,EAAO,UAAU,EAAI,IAChGmB,EAA2BjB,EAAO,OAAO,IAAM,CAAC,EAAGF,EAAO,gBAAgB,EAC5EoB,EAA0B,EAC1BC,EAAc,GACdC,EAAY,EAGhB,IAFAtB,EAAO,QAAU,GACjB,MAAMuB,EAAK,SAASC,EAAS,QAAQ,CAAC,CAAC,EAChCxB,EAAO,SAAWA,EAAO,YAAciB,GAAW,CAErD,IAAMX,EAA4B,CADKJ,EAAO,OAAO,IAAM,IAAI,aAAaE,CAAa,EAAGJ,EAAO,gBAAgB,CAClE,EACjDO,EAAgBP,EAAO,YAAaA,EAAO,UAAU,EACrD,IAAMyB,EAAczB,EAAO,UAAU,QAAQ,CAAC,CAAC,CAAC,EAAGM,CAAO,EACtDoB,EAAY,EAChB,QAAWC,KAAWrB,EAAQ,CAAC,EAC3B,QAAWsB,MAAUD,EAAS,CAC1B,IAAME,EAAgB,KAAK,IAAID,EAAM,EACjCC,EAAgBH,IAAYA,EAAYG,EAChD,CAEJ,IAAMC,EAAWJ,GAAaZ,EAE9B,GADIY,EAAYZ,IAAYO,EAAc,IACtCS,GAAYT,GAEZ,GADAD,GAA2BhB,EACvBgB,GAA2BJ,EAAsB,WAErDI,EAA0B,EAE9B,QAASV,EAAK,EAAGA,EAAKV,EAAO,iBAAkBU,IAC3CS,EAAOT,CAAE,EAAE,KAAKJ,EAAQ,CAAC,EAAEI,CAAE,EAAE,MAAM,CAAC,EAG1C,GADAV,EAAO,aAAeI,EAClB,CAACqB,EAAc,MACfzB,EAAO,YAAcsB,GAAatB,EAAO,aACzCsB,EAAYtB,EAAO,YACnBA,EAAO,aAAa,YAAY,CAAC,OAAQA,EAAO,WAAW,CAAC,EAC5D,MAAM,IAAI,QAAQ+B,GAAW,WAAWA,EAAS,CAAC,CAAC,EAE3D,CACA,IAAMC,EAAehC,EAAO,YAAcoB,EAA0B,KAAK,IAAIpB,EAAO,WAAa,EAAGoB,CAAuB,EAC3H,OAAOlB,EAAO,OAAO+B,GAAgB,CACjC,IAAMC,EAAQ,IAAI,aAAaF,CAAY,EACvC3B,EAAS,EACb,QAAW8B,KAAShB,EAAOc,CAAY,EAAG,CACtC,GAAI5B,GAAU2B,EAAe,MAC7B,IAAMvB,EAAS,KAAK,IAAI0B,EAAM,OAAQH,EAAe3B,CAAM,EAC3D6B,EAAM,IAAIC,EAAM,SAAS,EAAG1B,CAAM,EAAGJ,CAAM,EAC3CA,GAAUI,CACd,CACA,OAAOyB,CACX,EAAGlC,EAAO,gBAAgB,CAC9B,EACA,MAAO,CAAEV,EAAM,OAAO,EAAE,QAAU,EAAM,CAC5C,CACJ",
|
|
6
6
|
"names": ["isDefined", "value", "asDefined", "value", "fail", "panic", "getOrProvide", "getOrProvide", "value", "Unhandled", "empty", "panic", "issue", "assert", "condition", "fail", "getOrProvide", "InaccessibleProperty", "failMessage", "panic", "SuccessResult", "value", "InaccessibleProperty", "FailureResult", "error", "tryCatch", "statement", "EmptyExec", "Sorting", "Arrays", "#empty", "array", "newValues", "procedure", "index", "fail", "asDefined", "element", "panic", "factory", "n", "i", "a", "b", "predicate", "first", "result", "key", "seen", "value", "excludeArray", "compareFn", "item", "excludeItem", "other", "includeItem", "baseArray", "mergeIntoArray", "baseItem", "mergeItem", "maxIndex", "left", "right", "sorting", "prev", "next", "toKey", "record", "view", "Option", "value", "isDefined", "Some", "provider", "func", "args", "promise", "#value", "asDefined", "_", "matchable", "run", "_func", "callback", "_or", "other", "_fail", "fail", "panic", "getOrProvide", "exec", "or", "Iterables", "value", "iterable", "count", "_", "predicate", "callback", "initialValue", "accumulator", "index", "include", "procedure", "map", "iterator", "i", "fn", "result", "mapped", "isDefined", "done", "prev", "Terminable", "EmptyExec", "exec", "terminables", "Notifier", "observer", "observables", "Terminable", "observable", "#observers", "value", "TimeSpan", "_TimeSpan", "startTime", "output", "seconds", "progress", "elapsedTime", "value", "#MILLI_SECONDS_PER_SECOND", "#MILLI_SECONDS_PER_MINUTE", "#MILLI_SECONDS_PER_HOUR", "#MILLI_SECONDS_PER_DAY", "#ms", "ms", "unit", "minutes", "hours", "days", "d", "h", "m", "s", "#quantity", "name", "count", "Unhandled", "Communicator", "Transfer", "value", "messenger", "bind", "Sender", "protocol", "Executor", "extractTransferables", "args", "transferables", "arg", "unwrapArg", "#messenger", "#expected", "#subscription", "#returnId", "#messageHandler", "func", "Iterables", "resolve", "reject", "entries", "callbacks", "index", "message", "returns", "isDefined", "panic", "#protocol", "assert", "object", "asDefined", "returnId", "#sendCallback", "#sendResolve", "reason", "#sendReject", "Messenger", "port", "NativeMessenger", "EmptyTransferables", "#port", "#notifier", "Notifier", "isDefined", "event", "message", "transfer", "name", "Channel", "observer", "_Channel", "#messages", "#name", "#subscription", "messages", "data", "transferrables", "Wait", "resolve", "numFrames", "count", "callback", "time", "args", "target", "type", "observable", "terminable", "generator", "reject", "interval", "status", "next", "error", "tryCatch", "done", "value", "fromSignature", "nominator", "denominator", "toParts", "ppqn", "lowerPulses", "beats", "bars", "ticks", "semiquavers", "remainingTicks", "secondsToPulses", "seconds", "bpm", "pulsesToSeconds", "pulses", "secondsToBpm", "samplesToPulses", "samples", "sampleRate", "pulsesToSamples", "PPQN", "RenderQuantum", "TempoChangeGrid", "PPQN", "LogDb", "dbToGain", "db", "LogDb", "globals", "AudioWorkletProcessor", "_inputs", "_outputs", "setupWorkletGlobals", "config", "name", "ctor", "updateFrameTime", "frame", "sampleRate", "globals", "state", "Option", "Communicator", "Messenger", "enginePort", "progressPort", "config", "setupWorkletGlobals", "ProcessorClass", "numSamples", "engine", "result", "Arrays", "outputChannels", "RenderQuantum", "offset", "outputs", "updateFrameTime", "needed", "toCopy", "ch", "silenceThresholdDb", "silenceDurationSeconds", "maxDurationSeconds", "threshold", "dbToGain", "silenceFramesNeeded", "maxFrames", "isDefined", "chunks", "consecutiveSilentFrames", "hasHadAudio", "lastYield", "Wait", "TimeSpan", "keepRunning", "maxSample", "channel", "sample", "absoluteValue", "isSilent", "resolve", "framesToKeep", "channelIndex", "total", "chunk"]
|
|
7
7
|
}
|