@hazae41/piscine
Version:
Create async pools with automatic retry
1 lines • 22.1 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../../../src/mods/pool/index.ts"],"sourcesContent":["import { Arrays } from \"@hazae41/arrays\";\nimport { Box, Deferred, Disposer, Stack } from \"@hazae41/box\";\nimport { Future } from \"@hazae41/future\";\nimport { Nullable } from \"@hazae41/option\";\nimport { Plume, SuperEventTarget } from \"@hazae41/plume\";\nimport { Catched, Err, Ok, Result } from \"@hazae41/result\";\n\nexport class EmptyPoolError extends Error {\n readonly #class = EmptyPoolError\n readonly name = this.#class.name\n\n constructor() {\n super(`Empty pool`)\n }\n\n}\n\nexport class EmptySlotError extends Error {\n readonly #class = EmptySlotError\n readonly name = this.#class.name\n\n constructor() {\n super(`Empty slot`)\n }\n\n}\n\nexport class Indexed<T extends Disposable> {\n\n constructor(\n readonly index: number,\n readonly value: T,\n ) { }\n\n [Symbol.dispose]() {\n this.value[Symbol.dispose]()\n }\n\n get() {\n return this.value\n }\n\n}\n\nexport class PoolItem<T extends Disposable> extends Box<Indexed<T>> {\n\n constructor(\n readonly pool: Pool<T>,\n readonly value: Indexed<T>,\n readonly clean: Deferred,\n ) {\n super(value)\n }\n\n [Symbol.dispose]() {\n if (this.dropped)\n return\n this.clean[Symbol.dispose]()\n\n super[Symbol.dispose]()\n\n this.pool.delete(this.value.index)\n }\n\n moveOrNull() {\n const box = super.moveOrNull()\n\n if (box == null)\n return\n this.clean[Symbol.dispose]()\n this.pool.delete(this.value.index)\n\n return box\n }\n\n moveOrThrow() {\n const box = super.moveOrThrow()\n\n this.clean[Symbol.dispose]()\n this.pool.delete(this.value.index)\n\n return box\n }\n\n unwrapOrNull() {\n const value = super.unwrapOrNull()\n\n if (value == null)\n return\n this.clean[Symbol.dispose]()\n this.pool.delete(this.value.index)\n\n return value\n }\n\n unwrapOrThrow() {\n const value = super.unwrapOrThrow()\n\n this.clean[Symbol.dispose]()\n this.pool.delete(this.value.index)\n\n return value\n }\n\n returnOrThrow(): void {\n super.returnOrThrow()\n\n if (!this.owned)\n return\n\n this.pool.update(this.value.index)\n }\n\n}\n\nexport type PoolEvents = {\n update: (index: number) => void\n}\n\nexport class Pool<T extends Disposable> {\n\n readonly events = new SuperEventTarget<PoolEvents>()\n\n /**\n * Sparse entries by index\n */\n readonly #entries = new Array<Result<PoolItem<T>>>()\n\n /**\n * A pool of disposable items\n */\n constructor() { }\n\n [Symbol.iterator]() {\n return this.#entries.values()\n }\n\n [Symbol.dispose]() {\n for (const entry of this.#entries) {\n if (entry == null)\n continue\n if (entry.isErr())\n continue\n using _ = entry.get()\n }\n\n this.#entries.length = 0\n }\n\n #delete(index: number) {\n const previous = this.#entries.at(index)\n\n if (previous == null)\n return\n\n delete this.#entries[index]\n\n if (previous.isErr())\n return previous\n\n using _ = previous.get()\n\n return previous\n }\n\n /**\n * Set the entry at the given index and return it\n * @param index \n * @param result \n * @returns \n */\n #set(index: number, result: Result<Disposer<T>, Error>) {\n if (result.isOk()) {\n const { value, clean } = result.get()\n\n const indexed = new Indexed(index, value)\n const item = new PoolItem(this, indexed, clean)\n const entry = new Ok(item)\n\n this.#delete(index)\n\n this.#entries[index] = entry\n\n this.events.emit(\"update\", index).catch(console.error)\n\n return entry\n } else {\n const value = result.getErr()\n const entry = new Err(value)\n\n this.#delete(index)\n\n this.#entries[index] = entry\n\n this.events.emit(\"update\", index).catch(console.error)\n\n return entry\n }\n }\n\n /**\n * Set the entry at the given index and return it\n * @param index \n * @param result \n * @returns \n */\n set(index: number, result: Result<Disposer<T>, Error>) {\n this.#set(index, result)\n }\n\n /**\n * Delete the entry at the given index and return it\n * @param index \n * @returns \n */\n delete(index: number) {\n this.#delete(index)\n }\n\n update(index: number) {\n const entry = this.#entries.at(index)\n\n if (entry == null)\n return\n\n this.events.emit(\"update\", index).catch(console.error)\n }\n\n /**\n * Get the entry at the given index or null if empty\n * @param index \n * @returns \n */\n getAnyOrNull(index: number): Nullable<Result<PoolItem<T>>> {\n return this.#entries.at(index)\n }\n\n /**\n * Get the entry at the given index or throw if empty\n * @param index \n * @returns \n */\n getAnyOrThrow(index: number): Result<PoolItem<T>> {\n const entry = this.#entries.at(index)\n\n if (entry == null)\n throw new EmptySlotError()\n\n return entry\n }\n\n /**\n * Get the item at the given index or null if empty or errored\n * @param index \n * @returns \n */\n getOrNull(index: number): Nullable<PoolItem<T>> {\n const entry = this.#entries.at(index)\n\n if (entry == null)\n return\n if (entry.isErr())\n return\n\n return entry.get()\n }\n\n /**\n * Get the item at the given index or throw if empty or errored\n * @param index \n * @returns \n */\n getOrThrow(index: number): PoolItem<T> {\n const entry = this.#entries.at(index)\n\n if (entry == null)\n throw new EmptySlotError()\n\n return entry.getOrThrow()\n }\n\n /**\n * Get a random item or null if none available\n * @returns \n */\n getRandomOrNull<U>(filter: (x: Result<PoolItem<T>>) => Nullable<U>): Nullable<U> {\n return Arrays.random(this.#entries.map(filter).filter(x => x != null))\n }\n\n /**\n * Get a random item or throw if none available\n * @returns \n */\n getRandomOrThrow<U>(filter: (x: Result<PoolItem<T>>) => Nullable<U>): U {\n const value = Arrays.random(this.#entries.map(filter).filter(x => x != null))\n\n if (value == null)\n throw new EmptyPoolError()\n\n return value\n }\n\n /**\n * Get a crypto-random item or null if none available\n * @returns \n */\n getCryptoRandomOrNull<U>(filter: (x: Result<PoolItem<T>>) => Nullable<U>): Nullable<U> {\n return Arrays.cryptoRandom(this.#entries.map(filter).filter(x => x != null))\n }\n\n /**\n * Get a crypto-random item or throw if none available\n * @returns \n */\n getCryptoRandomOrThrow<U>(filter: (x: Result<PoolItem<T>>) => Nullable<U>): U {\n const value = Arrays.cryptoRandom(this.#entries.map(filter).filter(x => x != null))\n\n if (value == null)\n throw new EmptyPoolError()\n\n return value\n }\n\n async waitOrThrow<U>(index: number, filter: (x: Nullable<Result<PoolItem<T>>>) => Nullable<U>, signal: AbortSignal = new AbortController().signal): Promise<U> {\n while (!signal.aborted) {\n const entry = this.#entries.at(index)\n const value = filter(entry)\n\n if (value != null)\n return value\n\n await Plume.waitOrThrow(this.events, \"update\", (f: Future<void>, i) => {\n if (i !== index)\n return\n f.resolve()\n }, signal)\n }\n\n throw signal.reason\n }\n\n async waitRandomOrThrow<U>(filter: (x: Nullable<Result<PoolItem<T>>>) => Nullable<U>, signal: AbortSignal = new AbortController().signal): Promise<U> {\n while (!signal.aborted) {\n const entry = Arrays.random(this.#entries)\n const value = filter(entry)\n\n if (value != null)\n return value\n\n await Plume.waitOrThrow(this.events, \"update\", (f: Future<void>) => {\n f.resolve()\n }, signal)\n }\n\n throw signal.reason\n }\n\n async waitCryptoRandomOrThrow<U>(filter: (x: Nullable<Result<PoolItem<T>>>) => Nullable<U>, signal: AbortSignal = new AbortController().signal): Promise<U> {\n while (!signal.aborted) {\n const entry = Arrays.cryptoRandom(this.#entries)\n const value = filter(entry)\n\n if (value != null)\n return value\n\n await Plume.waitOrThrow(this.events, \"update\", (f: Future<void>) => {\n f.resolve()\n }, signal)\n }\n\n throw signal.reason\n }\n\n}\n\nexport type PoolCreator<T> = (\n index: number,\n signal: AbortSignal,\n) => Promise<Disposer<T>>\n\nexport class StartPool<T extends Disposable> extends Pool<T> {\n\n /**\n * Sparse aborters by index\n */\n readonly #aborters = new Array<AbortController>()\n\n /**\n * A pool of startable items\n */\n constructor() {\n super()\n }\n\n [Symbol.dispose]() {\n super[Symbol.dispose]()\n\n for (const aborter of this.#aborters)\n aborter?.abort()\n\n this.#aborters.length = 0\n }\n\n async #create(index: number, creator: PoolCreator<T>, signal: AbortSignal) {\n try {\n const disposer = await creator(index, signal)\n\n using stack = new Stack()\n\n stack.push(disposer)\n stack.push(disposer.get())\n\n if (signal.aborted)\n return\n delete this.#aborters[index]\n\n stack.array.length = 0\n\n super.set(index, new Ok(disposer))\n } catch (e: unknown) {\n if (signal.aborted)\n return\n delete this.#aborters[index]\n\n const value = Catched.wrap(e)\n\n super.set(index, new Err(value))\n }\n }\n\n #start(index: number, creator: PoolCreator<T>) {\n this.#abort(index)\n\n const aborter = new AbortController()\n this.#aborters[index] = aborter\n const { signal } = aborter\n\n this.#create(index, creator, signal)\n }\n\n #abort(index: number) {\n const aborter = this.#aborters.at(index)\n\n if (aborter != null)\n aborter.abort()\n\n delete this.#aborters[index]\n }\n\n /**\n * Start the given index\n * @param index \n * @returns \n */\n start(index: number, creator: PoolCreator<T>) {\n this.#start(index, creator)\n }\n\n /**\n * Abort the given index\n * @param index \n * @returns \n */\n abort(index: number) {\n this.#abort(index)\n }\n\n}\n\nexport class AutoPool<T extends Disposable> extends StartPool<T> {\n\n #state = \"started\"\n\n /**\n * An automatic pool or startable items\n * @param creator \n * @param capacity \n * @returns \n */\n constructor(\n readonly creator: PoolCreator<T>,\n readonly capacity: number\n ) {\n super()\n\n for (let i = 0; i < capacity; i++)\n this.delete(i)\n\n return this\n }\n\n [Symbol.dispose]() {\n this.#state = \"stopped\"\n super[Symbol.dispose]()\n }\n\n set(index: number, result: Result<Disposer<T>, Error>): never {\n throw new Error(\"Disallowed\")\n }\n\n start(index: number, creator: PoolCreator<T>): never {\n throw new Error(\"Disallowed\")\n }\n\n abort(index: number): never {\n throw new Error(\"Disallowed\")\n }\n\n delete(index: number): void {\n if (index >= this.capacity)\n return\n\n super.set(index, new Err(new EmptySlotError()))\n\n if (this.#state === \"stopped\")\n return\n\n super.start(index, this.creator)\n }\n\n}"],"names":["Box","SuperEventTarget","__addDisposableResource","result","Ok","Err","Arrays","Plume","Stack","Catched"],"mappings":";;;;;;;;;AAOM,MAAO,cAAe,SAAQ,KAAK,CAAA;IAC9B,MAAM,GAAG,EAAc,CAAA;AACvB,IAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;AAEhC,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,CAAY,UAAA,CAAA,CAAC,CAAA;KACpB;AAEF,CAAA;;AAEK,MAAO,cAAe,SAAQ,KAAK,CAAA;IAC9B,MAAM,GAAG,EAAc,CAAA;AACvB,IAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;AAEhC,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,CAAY,UAAA,CAAA,CAAC,CAAA;KACpB;AAEF,CAAA;;MAEY,OAAO,CAAA;AAGP,IAAA,KAAA,CAAA;AACA,IAAA,KAAA,CAAA;IAFX,WACW,CAAA,KAAa,EACb,KAAQ,EAAA;QADR,IAAK,CAAA,KAAA,GAAL,KAAK,CAAQ;QACb,IAAK,CAAA,KAAA,GAAL,KAAK,CAAG;KACd;IAEL,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;QACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;KAC7B;IAED,GAAG,GAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;KAClB;AAEF,CAAA;AAEK,MAAO,QAA+B,SAAQA,OAAe,CAAA;AAGtD,IAAA,IAAA,CAAA;AACA,IAAA,KAAA,CAAA;AACA,IAAA,KAAA,CAAA;AAHX,IAAA,WAAA,CACW,IAAa,EACb,KAAiB,EACjB,KAAe,EAAA;QAExB,KAAK,CAAC,KAAK,CAAC,CAAA;QAJH,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAS;QACb,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;QACjB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAU;KAGzB;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;QACd,IAAI,IAAI,CAAC,OAAO;YACd,OAAM;QACR,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;AAE5B,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QAEvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;KACnC;IAED,UAAU,GAAA;AACR,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,CAAA;QAE9B,IAAI,GAAG,IAAI,IAAI;YACb,OAAM;QACR,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAElC,QAAA,OAAO,GAAG,CAAA;KACX;IAED,WAAW,GAAA;AACT,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;QAE/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAElC,QAAA,OAAO,GAAG,CAAA;KACX;IAED,YAAY,GAAA;AACV,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAA;QAElC,IAAI,KAAK,IAAI,IAAI;YACf,OAAM;QACR,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAElC,QAAA,OAAO,KAAK,CAAA;KACb;IAED,aAAa,GAAA;AACX,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAA;QAEnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAElC,QAAA,OAAO,KAAK,CAAA;KACb;IAED,aAAa,GAAA;QACX,KAAK,CAAC,aAAa,EAAE,CAAA;QAErB,IAAI,CAAC,IAAI,CAAC,KAAK;YACb,OAAM;QAER,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;KACnC;AAEF,CAAA;MAMY,IAAI,CAAA;AAEN,IAAA,MAAM,GAAG,IAAIC,sBAAgB,EAAc,CAAA;AAEpD;;AAEG;AACM,IAAA,QAAQ,GAAG,IAAI,KAAK,EAAuB,CAAA;AAEpD;;AAEG;AACH,IAAA,WAAA,GAAA,GAAiB;IAEjB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAA;KAC9B;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;AACd,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;;;gBACjC,IAAI,KAAK,IAAI,IAAI;oBACf,SAAQ;gBACV,IAAI,KAAK,CAAC,KAAK,EAAE;oBACf,SAAQ;AACV,gBAAA,MAAM,CAAC,GAAGC,iCAAA,CAAA,KAAA,EAAA,KAAK,CAAC,GAAG,EAAE,QAAA,CAAA;;;;;;;;;AACtB,SAAA;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;KACzB;AAED,IAAA,OAAO,CAAC,KAAa,EAAA;;;YACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;YAExC,IAAI,QAAQ,IAAI,IAAI;gBAClB,OAAM;AAER,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAE3B,IAAI,QAAQ,CAAC,KAAK,EAAE;AAClB,gBAAA,OAAO,QAAQ,CAAA;AAEjB,YAAA,MAAM,CAAC,GAAGA,iCAAA,CAAA,KAAA,EAAA,QAAQ,CAAC,GAAG,EAAE,QAAA,CAAA;AAExB,YAAA,OAAO,QAAQ,CAAA;;;;;;;;;AAChB,KAAA;AAED;;;;;AAKG;IACH,IAAI,CAAC,KAAa,EAAEC,QAAkC,EAAA;AACpD,QAAA,IAAIA,QAAM,CAAC,IAAI,EAAE,EAAE;YACjB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAGA,QAAM,CAAC,GAAG,EAAE,CAAA;YAErC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YACzC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;AAC/C,YAAA,MAAM,KAAK,GAAG,IAAIC,SAAE,CAAC,IAAI,CAAC,CAAA;AAE1B,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAEnB,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;AAE5B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAEtD,YAAA,OAAO,KAAK,CAAA;SACb;aAAM;AACL,YAAA,MAAM,KAAK,GAAGD,QAAM,CAAC,MAAM,EAAE,CAAA;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAIE,UAAG,CAAC,KAAK,CAAC,CAAA;AAE5B,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAEnB,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;AAE5B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAEtD,YAAA,OAAO,KAAK,CAAA;SACb;KACF;AAED;;;;;AAKG;IACH,GAAG,CAAC,KAAa,EAAE,MAAkC,EAAA;AACnD,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;KACzB;AAED;;;;AAIG;AACH,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;KACpB;AAED,IAAA,MAAM,CAAC,KAAa,EAAA;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QAErC,IAAI,KAAK,IAAI,IAAI;YACf,OAAM;AAER,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;KACvD;AAED;;;;AAIG;AACH,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;KAC/B;AAED;;;;AAIG;AACH,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QAErC,IAAI,KAAK,IAAI,IAAI;YACf,MAAM,IAAI,cAAc,EAAE,CAAA;AAE5B,QAAA,OAAO,KAAK,CAAA;KACb;AAED;;;;AAIG;AACH,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QAErC,IAAI,KAAK,IAAI,IAAI;YACf,OAAM;QACR,IAAI,KAAK,CAAC,KAAK,EAAE;YACf,OAAM;AAER,QAAA,OAAO,KAAK,CAAC,GAAG,EAAE,CAAA;KACnB;AAED;;;;AAIG;AACH,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QAErC,IAAI,KAAK,IAAI,IAAI;YACf,MAAM,IAAI,cAAc,EAAE,CAAA;AAE5B,QAAA,OAAO,KAAK,CAAC,UAAU,EAAE,CAAA;KAC1B;AAED;;;AAGG;AACH,IAAA,eAAe,CAAI,MAA+C,EAAA;QAChE,OAAOC,aAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;KACvE;AAED;;;AAGG;AACH,IAAA,gBAAgB,CAAI,MAA+C,EAAA;QACjE,MAAM,KAAK,GAAGA,aAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;QAE7E,IAAI,KAAK,IAAI,IAAI;YACf,MAAM,IAAI,cAAc,EAAE,CAAA;AAE5B,QAAA,OAAO,KAAK,CAAA;KACb;AAED;;;AAGG;AACH,IAAA,qBAAqB,CAAI,MAA+C,EAAA;QACtE,OAAOA,aAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;KAC7E;AAED;;;AAGG;AACH,IAAA,sBAAsB,CAAI,MAA+C,EAAA;QACvE,MAAM,KAAK,GAAGA,aAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;QAEnF,IAAI,KAAK,IAAI,IAAI;YACf,MAAM,IAAI,cAAc,EAAE,CAAA;AAE5B,QAAA,OAAO,KAAK,CAAA;KACb;AAED,IAAA,MAAM,WAAW,CAAI,KAAa,EAAE,MAAyD,EAAE,MAAA,GAAsB,IAAI,eAAe,EAAE,CAAC,MAAM,EAAA;AAC/I,QAAA,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;AACrC,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAE3B,IAAI,KAAK,IAAI,IAAI;AACf,gBAAA,OAAO,KAAK,CAAA;AAEd,YAAA,MAAMC,WAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAe,EAAE,CAAC,KAAI;gBACpE,IAAI,CAAC,KAAK,KAAK;oBACb,OAAM;gBACR,CAAC,CAAC,OAAO,EAAE,CAAA;aACZ,EAAE,MAAM,CAAC,CAAA;SACX;QAED,MAAM,MAAM,CAAC,MAAM,CAAA;KACpB;IAED,MAAM,iBAAiB,CAAI,MAAyD,EAAE,SAAsB,IAAI,eAAe,EAAE,CAAC,MAAM,EAAA;AACtI,QAAA,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE;YACtB,MAAM,KAAK,GAAGD,aAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAC1C,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAE3B,IAAI,KAAK,IAAI,IAAI;AACf,gBAAA,OAAO,KAAK,CAAA;AAEd,YAAA,MAAMC,WAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAe,KAAI;gBACjE,CAAC,CAAC,OAAO,EAAE,CAAA;aACZ,EAAE,MAAM,CAAC,CAAA;SACX;QAED,MAAM,MAAM,CAAC,MAAM,CAAA;KACpB;IAED,MAAM,uBAAuB,CAAI,MAAyD,EAAE,SAAsB,IAAI,eAAe,EAAE,CAAC,MAAM,EAAA;AAC5I,QAAA,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE;YACtB,MAAM,KAAK,GAAGD,aAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAChD,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAE3B,IAAI,KAAK,IAAI,IAAI;AACf,gBAAA,OAAO,KAAK,CAAA;AAEd,YAAA,MAAMC,WAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAe,KAAI;gBACjE,CAAC,CAAC,OAAO,EAAE,CAAA;aACZ,EAAE,MAAM,CAAC,CAAA;SACX;QAED,MAAM,MAAM,CAAC,MAAM,CAAA;KACpB;AAEF,CAAA;AAOK,MAAO,SAAgC,SAAQ,IAAO,CAAA;AAE1D;;AAEG;AACM,IAAA,SAAS,GAAG,IAAI,KAAK,EAAmB,CAAA;AAEjD;;AAEG;AACH,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE,CAAA;KACR;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;AACd,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;AAEvB,QAAA,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS;YAClC,OAAO,EAAE,KAAK,EAAE,CAAA;AAElB,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;KAC1B;AAED,IAAA,MAAM,OAAO,CAAC,KAAa,EAAE,OAAuB,EAAE,MAAmB,EAAA;AACvE,QAAA,IAAI;;;gBACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;AAE7C,gBAAA,MAAM,KAAK,GAAGL,iCAAA,CAAA,KAAA,EAAA,IAAIM,SAAK,EAAE,QAAA,CAAA;AAEzB,gBAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;gBAE1B,IAAI,MAAM,CAAC,OAAO;oBAChB,OAAM;AACR,gBAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAE5B,gBAAA,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;gBAEtB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAIJ,SAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;;;;;;;;;AACnC,SAAA;QAAC,OAAO,CAAU,EAAE;YACnB,IAAI,MAAM,CAAC,OAAO;gBAChB,OAAM;AACR,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YAE5B,MAAM,KAAK,GAAGK,cAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAE7B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAIJ,UAAG,CAAC,KAAK,CAAC,CAAC,CAAA;SACjC;KACF;IAED,MAAM,CAAC,KAAa,EAAE,OAAuB,EAAA;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAElB,QAAA,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAA;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAA;AAC/B,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;QAE1B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;KACrC;AAED,IAAA,MAAM,CAAC,KAAa,EAAA;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QAExC,IAAI,OAAO,IAAI,IAAI;YACjB,OAAO,CAAC,KAAK,EAAE,CAAA;AAEjB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;KAC7B;AAED;;;;AAIG;IACH,KAAK,CAAC,KAAa,EAAE,OAAuB,EAAA;AAC1C,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;KAC5B;AAED;;;;AAIG;AACH,IAAA,KAAK,CAAC,KAAa,EAAA;AACjB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;KACnB;AAEF,CAAA;AAEK,MAAO,QAA+B,SAAQ,SAAY,CAAA;AAWnD,IAAA,OAAA,CAAA;AACA,IAAA,QAAA,CAAA;IAVX,MAAM,GAAG,SAAS,CAAA;AAElB;;;;;AAKG;IACH,WACW,CAAA,OAAuB,EACvB,QAAgB,EAAA;AAEzB,QAAA,KAAK,EAAE,CAAA;QAHE,IAAO,CAAA,OAAA,GAAP,OAAO,CAAgB;QACvB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAQ;QAIzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;AAC/B,YAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AAEhB,QAAA,OAAO,IAAI,CAAA;KACZ;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;AACd,QAAA,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;AACvB,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;KACxB;IAED,GAAG,CAAC,KAAa,EAAE,MAAkC,EAAA;AACnD,QAAA,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;KAC9B;IAED,KAAK,CAAC,KAAa,EAAE,OAAuB,EAAA;AAC1C,QAAA,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;KAC9B;AAED,IAAA,KAAK,CAAC,KAAa,EAAA;AACjB,QAAA,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;KAC9B;AAED,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ;YACxB,OAAM;AAER,QAAA,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAIA,UAAG,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,CAAA;AAE/C,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAC3B,OAAM;QAER,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;KACjC;AAEF;;;;;;;;;;"}